服务器及mysql账号密码过期时间监控
一、需求引入
这事其实发生在昨天,开发说线上静态网的同步有问题。同步流程是:发新闻的人在在自己本机电脑登录内网服务器的新闻编辑后台,然后脚本会定时把编辑好的文章传到gitlab,线上服务器再定时,且只能单向拉取gitlab代码(实际上是内网后台编辑好的文章)
第一步肯定是去看看服务器情况啦。堡垒机登录到服务器,说账号密码过期,急需改密码。输入原密码,再输入要更改的新密码。然鹅,设置新密码一直给我报错:
BAD PASSWORD: is too simple。用密码生成器,固定某个长度16位(所用字符我全部都勾选了的),我看着网站生成的比较复杂的随机密码(就是都包含所用字符),就复制用来设置新密码了,还是too simple;然后开始调密码长度到20,再40。。。还是报错,直到。。。连账号都被锁了!!!策略是连续输错5次就锁定5分钟(对root也生效)。然后,蛮惨的,首先怕开发催,运营催(我明明写好文章,为什么没有给我同步到线上,赶紧给我看看。。……#¥%$%^#$....);然后当时手头还在搞别的事吧,真是体会到,运维忙的时候也是忙的分身乏术;闲的时候也是闲的心慌~~~
这堆机器因为之前要过等保二级,所以设置了很多坑运维的策略(公司只有我一个运维,所以就是自己坑自己呗。。)。例如服务器只能从堡垒机登录,端口范围开放,禁止root直接远程登录。以为从阿里云控制台的Workbench进行远程连接,是可以为所欲为的(说不定账号没有被锁的概念,或者设置的root禁止远程登陆是不生效的),事实证明我太天真了,登不上 = =。用内网能通的其他机器ssh跳过去(其实应该做个免秘钥或者本机普通账号sudo直接切超管的),也是不行,而且我还发现另外一台服务器也是账号过期的,悲惨的事果然是接二连三的。
总的来说,就是啥情况都遇到了:普通账号被锁,root账号禁止登服务器,无法登陆服务器。最后咋办呀,等呗,等自动解锁。小心翼翼试各种长度的密码,40位长度终于让我过了!!!(肯定设置的密码策略里面有些不符合)

账号过期是会导致该账号下的计划任务是执行不了的!!!

然后去看关于密码复杂度和过期策略的两个文件: /etc/pam.d/system-auth 和 /etc/login.defs。

为了当天能一劳永逸,先把账号密码设置个永不过期先: chage -M 99999 用户
然后把那个密码策略文件(/etc/pam.d/system-auth )的 ”。。。pam_cracklib.so 。。。ocredit=-1” 注释掉,新增复制一行,只留下minlen=8 这个字符为止,后面全部不要(如上图)。
我知道这样操作是非常可恨的,所以今天有空就把这监控过期的活做了,密码设为90天过期
二、问题解决
直接贴代码,相信有点shell基础的朋友都能看懂的啦,哈哈哈哈~~~(不懂可以留言找我,QQ号为:378876091,记得大学毕设的时候就是有个好心技术人留了QQ号,帮我顺利毕业的)
几个点,大家注意下:
利用:chage -l 去获取密码过期时间(命令行返回结果的最后一列),记得月份获取的时候要处理下英文转换为阿拉伯数字
数学运算接收变量前要加个let,let 命令是BASH 中用于计算的工具(我试过去掉,马上给我报错)
最后利用时间戳来比较当前时间和过期时间的差值,JUDGE_DAY是你自定义的:设置差xx天过期
判断账号是否过期要加个预判,never代表账号是永不过期
1 #!/bin/bash
2
3 PHONE="159xxxx0136"
4 DATE=`date +%F_%T`
5
6 #还差多少天提醒报警
7 JUDGE_DAY=380
8
9 #钉钉机器人token
10 TOKEN="https://oapi.dingtalk.com/robot/send?access_token=xxxxx"
11
12 user=(xx root)
13
14 for (( i=0; i<${#user[@]}; i++)) do
15 user_name=`echo ${user[i]}`
16
17 ## 一、密码过期
18 #1、年
19 pwd_end_year=`chage -l ${user_name} | head -2| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $2}'| awk '{print $1}'`
20
21 if [ "${pwd_end_year}" == "" ];then
22 exit 0
23 fi
24
25 #2、月(英文要处理成阿拉伯数字)
26 pwd_end_month=`chage -l ${user_name} | head -2| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $1}'`
27
28 case ${pwd_end_month} in
29 'Jan') pwd_end_month=1;;
30 'Feb') pwd_end_month=2;;
31 'Mar') pwd_end_month=3;;
32 'Apr') pwd_end_month=4;;
33 'May') pwd_end_month=5;;
34 'Jun') pwd_end_month=6;;
35 'Jul') pwd_end_month=7;;
36 'Aug') pwd_end_month=8;;
37 'Sep') pwd_end_month=9;;
38 'Oct') pwd_end_month=10;;
39 'Nov') pwd_end_month=11;;
40 'Dec') pwd_end_month=12;;
41 esac
42
43 #3、日
44 pwd_end_day=`chage -l ${user_name} | head -2| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $2}'`
45
46 pwd_end_date_s=`/bin/date -d "${pwd_end_year}"-"${pwd_end_month}"-"${pwd_end_day}" +%s`
47 check_date_s=`/bin/date +%s`
48 let pwd_diffday=(${pwd_end_date_s}-${check_date_s})/86400
49
50 echo "用户 $user_name 密码过期时间还剩: ${pwd_diffday} 天 !!!"
51 #echo ${pwd_diffday}
52
53 if [ ${pwd_diffday} -le ${JUDGE_DAY} ]; then
54 curl -H "Content-Type:application/json" -X POST --data '{"msgtype":"text","text":{"content":"当前时间:'$DATE' \n某某服务器: '${user_name}' 密码过期还剩'${pwd_diffday}'天,请及时修改密码 !!!"} , "at": {"atMobiles": ['${PHONE}'], "isAtAll": false}}' ${TOKEN} > /dev/null 2>&1
55 fi
56
57
58 ## 二、账号过期
59 #判断账号是否永不过期
60 judge=`chage -l ${user_name} | head -4| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $1}'`
61
62 if [ "$judge" = "never" ]; then
63 echo "$user_name 用户的账号永不过期,不用监控!!"
64 sleep 2
65 break;
66 fi
67
68 #1、年
69 account_end_year=`chage -l ${user_name} | head -4| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $2}'| awk '{print $1}'`
70
71 if [ "${account_end_year}" == "" ];then
72 exit 0
73 fi
74
75 #2、月(英文要处理)
76 end_month=`chage -l ${user_name} | head -4| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $1}'`
77
78 case ${end_month} in
79 'Jan') end_month=1;;
80 'Feb') end_month=2;;
81 'Mar') end_month=3;;
82 'Apr') end_month=4;;
83 'May') end_month=5;;
84 'Jun') end_month=6;;
85 'Jul') end_month=7;;
86 'Aug') end_month=8;;
87 'Sep') end_month=9;;
88 'Oct') end_month=10;;
89 'Nov') end_month=11;;
90 'Dec') end_month=12;;
91 esac
92
93 account_end_month=`echo ${end_month}`
94
95
96 #3、日
97 account_end_day=`chage -l ${user_name} | head -4| tail -1 | awk -F: '{print $2}'| awk -F',' '{print $1}'| awk '{print $2}'`
98
99 account_end_date_s=`/bin/date -d "${account_end_year}"-"${account_end_month}"-"${account_end_day}" +%s`
100 check_date_s=`/bin/date +%s`
101
102 #天
103 let account_diffday=(${account_end_date_s}-${check_date_s})/86400
104
105 echo "用户 $user_name 账号过期时间还剩: ${account_diffday} 天 !!!"
106 #echo ${account_diffday}
107
108 if [ ${account_diffday} -le ${JUDGE_DAY} ]; then
109 curl -H "Content-Type:application/json" -X POST --data '{"msgtype":"text","text":{"content":"当前时间:'$DATE' \n某某服务器: '${user_name}' 账号过期还剩'${account_diffday}'天,请及时修改密码 !!!"} , "at": {"atMobiles": ['${PHONE}'], "isAtAll": false}}' ${TOKEN} > /dev/null 2>&1
110 fi
111 done
运行结果:


这是mysql的密码过期监控(竟然找不到脚本放到哪个服务器上了 = =),需要登录进去用具体指定
参考这个文章写的:
1 for account in 检查的用户
2 do
3 account_plc=`mysql -h$ip -P$port -u$superuser -p$superuserpwd -e "select password_last_changed from mysql.user where user='${account}';" |grep -v password_last_changed`
4
5 cur_time=`mysql -h$ip -P$port -u$superuser -p$superuserpwd -e "select now();" |grep -v "now()"`
6
7 minus=`mysql -h$ip -P$port -u$superuser -p$superuserpwd -e "select datediff('${cur_time}', '${account_plc}');" |grep -v datediff`
8
9
10 let minus=90-$minus
13
14 echo "remain: $minus"
15
16 done
















