服务器账号过期处理

服务器账号过期处理

  这个事故发生在昨天,也就是周日早上10点多,公司开发钉我说服务器登陆不上,说挂在上面的定时抓取任务没跑(今天给我说,他以为停电,这脑洞有点大哈,停机应该是所有那批服务器都登不上)。当时以为很快能解决,咋知道搞到下午1点半,害我打不了球 = =

  登陆服务器,报错这样(无论是普通用户su过去、云控制台直接连、同网段机器ssh跳过去,都一样的报错),然后不止一台,是两台机器都这样:

    后来再查cron日志,原来早上8点账号就开始过期。独属于我的钉钉监控群也特多报警,说监控脚本没跑

 

    记得我写过一篇:服务器和mysql账号密码过期时间监控【https://www.cnblogs.com/windysai/p/14334173.html】

  粗心了,发现脚本只部署了做过等保的一个服务器上,另外一个,忘记了。

  查了下,说唯一解决办法,重启进入单用户模式改过来,意味着关机。非常重要的两台机器:入口服务器+主应用服务器。幸好我完善过架构,不仅入口做了主备,应用也做了一主两备。

  因为入口在WAF防护下,域名解析做了CNAME记录指向WAF,现在要停入口服务器,意味着需要把解析切回到源站ip, 本来是这台入口服务器ip的,现在需要切到备用的入口服务器。

所以第一件事,去掉WAF防护,域名CNAME解析到WAF的记录去掉,添加A记录指向备用入口服务器(有公网ip)。

确认了解析生效后,(ping 域名应该返回的是备用入口服务器公网ip)

第二件事,备用入口服务器开nginx,转发到应用服务器的备机上。

  上面两件事做完后,联系云控制台技术,叫帮忙重启到单用户模式。查过,确实服务器账号全部过期。想想就是2019年做的等保,有一项检查说账号不能设置永不过期,当时随意设置了个时间,没想到就是双十二,就是周日,额。。。。

   直接给账号重新设置过期时间就解决了,不过确实坑惨我了(自己坑自己)

usermod -e 99999 root

  今天上班给领导说清楚这故障的来龙去脉之后,要我做监控。当时给他说,脚本要部署到要监控的所有机器上,因为要运行命令chage -l 用户去查过期时间。

  他说叫我整理所有服务器的账号和过期时间,写到一个文本上,然后脚本去读,就不需要部署到要监控的所有服务器上了。其实挺好的,只要不多手,去改这个文本的过期时间。

  于是有了下面的脚本

1、整理的账号过期列表(文件:list)如下:

服务器1 服务器1的hostname 服务器1的ip
账号1 2243-10-16
root 2243-10-16
账号2 never
账号3 never

服务器2 服务器2的hostname 服务器2的ip
账号1 never
账号2 never
root never
。。。。

2、监控脚本如下:

#!/bin/bash

#测试
TOKEN="xxxx"
PHONE="我的手机号"
DATE=`date +%F_%T`

## 少于5天报警
JUDGE_DAY=5

cat list |while read line
do
        data=$(echo $line | grep "服务器")
        
        # 无关键字"服务器"的行:获取账号过期时间
        if [ "$data" == "" ]; then
           t_acc=`echo $line | awk '{print $1}'`
           
           # 跳过空行
           if [ "$t_acc" != "" ]; then  
              #1、获取账号
              user_name=`echo $t_acc`
              echo $user_name
              
              #2、账号过期日期
              Expireddate=`echo $line | awk '{print $2}'`

              # 如果是"never" 永不过期,不处理
              if [ "$Expireddate" != "never" ]; then
                  # 获取年月日
                  account_end_year=`echo $Expireddate | awk -F '-' '{print $1}'`
                  account_end_month=`echo $Expireddate | awk -F '-' '{print $2}'`
                  account_end_day=`echo $Expireddate | awk -F '-' '{print $3}'`
                  account_end_date_s=`/bin/date -d "${account_end_year}"-"${account_end_month}"-"${account_end_day}" +%s`

                  echo ${account_end_year} ${account_end_month} ${account_end_day}
                  #sleep 2  
                  check_date_s=`/bin/date +%s`
                  #天
                  let account_diffday=(${account_end_date_s}-${check_date_s})/86400
                  let account_diffday++
                  echo "用户 $user_name 账号过期时间还剩:  ${account_diffday} 天 !!!"
                          
                  ## 过期少于5天,则报警
                  if [ ${account_diffday} -le ${JUDGE_DAY} ]; then
                      curl -H "Content-Type:application/json" -X POST --data '{"msgtype":"text","text":{"content":"当前时间:'$DATE'  \n'${server}''${serverip}'\n账号:'${user_name}'  过期还剩 '${account_diffday}' 天\n过期时间:'${Expireddate}'"} , "at": {"atMobiles": ['${PHONE}'], "isAtAll": false}}' ${TOKEN} > /dev/null 2>&1
                  fi
               fi
            fi 
             # 有关键字:服务器,获取服务器和ip
         else 
           
                server=`echo $line | awk '{print $2}'`
                serverip=`echo $line | awk '{print $3}'`

          fi
done 

3、效果图:

总结

  最近老是挖坑给自己,罪过罪过,顺带聊聊感受。

  (1)入口和应用服务器各自切换到备用服务器的时候(原入口在WAF防护下,备用入口不是),因为要去掉WAF解析,云控制台去掉不一定生效,很大可能要联系WAF技术帮忙切换。

  (2)切换完之后,联系云厂商技术帮进入单用户模式,整个沟通过程是耗时最长的,各种打客服电话转技术。(事后他们说我也能进去单用户模式,还写了操作文档给我,有机会试试)

  (3)切换完之后,网络很不稳定,不定时说网站响应时间慢。话说入口和备用入口用同一条共享100M,未知原因。

   (4)当源站从WAF切换到备用入口机器ip时,WAF帮做的强制域名转发没了。

  就是,假设我们访问域名:ljy.com,未切回源站前,WAF会帮我们强制转发到:www.ljy.com。证书安全,切换走之后,就不安全了。(这个有点坑,在nginx配置强制跳转不起效的)

   (5)这件事给我唯一的好处是,真真正正做了一次应急演练 = =。死了入口和主应用,会投诉、要写故障报告的业务照样跑的好好的,中心那边神不知鬼不觉,天塌下来就我知,嘘。。。

原文地址:https://www.cnblogs.com/windysai/p/15685420.html