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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM