Linux小项目/Shell编程实例-统计root用户密码的过期时间

需求:通过zabbix监控所有服务器root用户的密码过期时间(还有多少天过期)

技术背景:默认情况下,root用户的密码过期时间可以通过chage -l root ,但这条命令只能root用户自己去执行!

由于公司服务器有很强的安全策略和各种限制,因此需要统计root用户的密码过期时间,总结了如下两种最可能的方案

方案一:让root用户,通过crontab服务,每天执行一次chage -l root,将结果写到/tmp/root_pwd_ExpirDays.txt

              然后让zabbix用户去读取那个文件,取即将过期的天数(推荐,只需root用户加一个定时任务就可以了)

方案二:通过sudo的方式,通过配置sudo服务,让zabbix用户可以通过sudo免密去执行chage -l root,然后作数据处理

           (推荐,可以严格限制只能临时提权执行chage -l root这一条命令)

最终取了第一种方案,这里附上笔者写的Shell脚本(root_Password_Expires_check_1.0.sh):

#/bin/bash
#
#############################################################
#Author:QQ,5201351                                          #
#Blog:https://www.cnblogs.com/5201351                       #
#Date:2020-09-10                                            # 
#Script Version:1.0                                         #
#Supported OS: Cenots/rhel 6.x/7.x                          #
#Description:As follows                                     #
#1.This script can be executed in any directory             # 
#2.But it must be executed by the root user, nothing more   # 
#############################################################
#

today=$(date +%s)
expires_str=$(chage -l root|awk "NR==2"| cut -d ":" -f 2)

if [ "$expires_str" == " never" ];then
    expiration_days=99999
else
    expiration=$(date -d "$expires_str" +%s)
    expiration_days=$[(expiration-today)/86400]
fi
    
echo $expiration_days > /tmp/root_pwd_ExpirDays.txt

优化篇1>>>>>>>>:   

后来又思考了一下,这样也还有有缺陷的,如某天root的周期定时任务没有执行,或者任务被人误删除了

那么/tmp/root_pwd_ExpirDays.txt中的数据就一直会是一个固定的!文件名也是固定的,对zabbix来言,不容易确定是那天的数据

于是得优先实现方式(root_password_expires_check_2.0.sh):修改脚本,将1.0中的最后一行,修改如下:

rm -f /tmp/root_pwd_ExpirDays_$(date -d "-1 days" +%F).txt
echo $expiration_days |tee /tmp/root_pwd_ExpirDays_$(date +%F).txt

这样zabbix端,取system.run[cat /tmp/root_pwd_ExpirDays_$(date +%F).txt] 即可获取天数,如果当天的文件不存在,则会产生异常!

优化篇2>>>>>>>>:   

再次对脚本加固,如下,主要是对权限这一块的加固,最新版本,root_password_expires_check_3.0.sh:

sleep 1 ; today=$(date +%s)
expires_str=$(chage -l root|awk "NR==2"| cut -d ":" -f 2)

if [ "$expires_str" == " never" ];then
    expiration_days=99999
else
    expiration=$(date -d "$expires_str" +%s)
    expiration_days=$[(expiration-today)/86400]
fi

rm -f /tmp/root_pwd_ExpirDays_$(date -d "-1 days" +%F).txt

result_file=/tmp/root_pwd_ExpirDays_$(date +%F).txt    
echo $expiration_days |tee $result_file
chown root:root $result_file && chmod o=r $result_file

另外:在公司服务器中,对于极个别的服务器,安全加固极高,使用上面的方法生成的文件,zabbix用户一样还是不能读取到

最后分析出原因,是那台服务器的selinux安全加固都高于其他服务器,对于特殊个例,笔者增加chcon -t etc_t $result_file进行解析

尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/13645273.html

原文地址:https://www.cnblogs.com/5201351/p/13645273.html