服务器账号过期处理
服务器账号过期处理
这个事故发生在昨天,也就是周日早上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)这件事给我唯一的好处是,真真正正做了一次应急演练 = =。死了入口和主应用,会投诉、要写故障报告的业务照样跑的好好的,中心那边神不知鬼不觉,天塌下来就我知,嘘。。。