zoukankan      html  css  js  c++  java
  • 服务器和mysql账号密码过期时间监控

    服务器及mysql账号密码过期时间监控

    一、需求引入

      这事其实发生在昨天,开发说线上静态网的同步有问题。同步流程是:发新闻的人在在自己本机电脑登录内网服务器的新闻编辑后台,然后脚本会定时把编辑好的文章传到gitlab,线上服务器再定时,且只能单向拉取gitlab代码(实际上是内网后台编辑好的文章)

      第一步肯定是去看看服务器情况啦。堡垒机登录到服务器,说账号密码过期,急需改密码。输入原密码,再输入要更改的新密码。然鹅,设置新密码一直给我报错:

    BAD PASSWORD: is too simple。用密码生成器(https://suijimimashengcheng.bmcx.com/),固定某个长度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'  
    某某服务器: '${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'  
    某某服务器: '${user_name}' 账号过期还剩'${account_diffday}'天,请及时修改密码 !!!"} , "at": {"atMobiles": ['${PHONE}'], "isAtAll": false}}' ${TOKEN} > /dev/null 2>&1
    110 fi
    111 done

    运行结果:

     

     

      这是mysql的密码过期监控(竟然找不到脚本放到哪个服务器上了 = =),需要登录进去用具体指定

      参考这个文章写的:https://blog.csdn.net/weixin_30409849/article/details/97180165

     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
  • 相关阅读:
    包 (package)
    Object类
    异常
    接口
    抽象类
    多态(经典案例)
    三大特性:(经典代码)
    对象创建的过程(重点理解)
    final关键字
    cocos2dx工程中接入支付宝sdk
  • 原文地址:https://www.cnblogs.com/windysai/p/14334173.html
Copyright © 2011-2022 走看看