口令生存周期的配置文件為 /etc/login.defs
vim 打開該文件,命令模式下輸入 /PASS_MAX_DAYS 找到該配置信息的位置
我的Linux操作系統默認顯示的是99999,說明我當前用戶密碼的生存周期為99999天
默認配置如圖:
PASS_MAX_DAYS為密碼最長使用時間,多少天后會有提醒
PASS_MIN_DAYS為密碼最短使用時間,意思是多少天內不能修改密碼
PASS_WARN_AGE密碼過期后會提醒多少天,這些天內還沒有修改密碼的用戶,賬戶會被凍結
我們可以輸入 cat /etc/shadow 查看當前用戶的這些信息
0為PASS_MIN_DAYS, 99999為PASS_MAX_DAYS, 7為PASS_WARN_AGE
和配置的信息一樣。
現在我們的安全檢查要求用戶的Linux系統的口令生存周期時間應該小於等於標准值90,
請編寫一個腳本測試該Linux系統是否滿足該安全條件:
1 #!/usr/bin/env python3 2 3 import re 4 5 def piv(filename): 6 with open(filename, "r") as f: 7 text = f.read() 8 result = re.search("PASS_MAX_DAYS\s*(\d+)",text).group(1) 9 if int(result) <= 90: 10 return True 11 return False 12 13 if __name__ == "__main__": 14 filename = "/etc/login.defs" 15 print(piv(filename))
打開文件/etc/login.defs並對其內容進行讀取,在使用正則表達式匹配文中的PASS_MAX_DAYS 99999,
以此得到后面的數字,再對其進行判斷即可。只要它小於等於90,則滿足安全的條件。
這里的正則表達式為 "PASS_MAX_DAYS\s*(\d+)",
意思就是PASS_MAX_DAYS后跟0個或多個空白字符,再跟1個或多個數字。將數字子組話(加括號),方便提取。
同樣PASS_WARN_AGE的要求值>=30的檢測方法是相同的。
1 #!/usr/bin/env python3 2 3 import re 4 5 def pass_warn_age(filename): 6 with open(filename) as f: 7 text = f.read() 8 result = re.search("PASS_WARN_AGE\s*(\d+)",text).group(1) 9 if int(result) >= 30: 10 return True 11 return False 12 13 if __name__ == "__main__": 14 filename = "/etc/login.defs" 15 print(pass_warn_age(filename))
重新做了一遍(Python版)
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 import os 5 import re 6 7 filename = "/etc/login.defs" 8 9 #如果文件存在 10 if os.path.exists(filename): 11 with open(filename) as f: 12 text = f.read() 13 try: 14 ret = re.search("PASS_MAX_DAYS\s+(\d+)",text).group(1) 15 except AttributeError: 16 print("The file's PASS_MAX_DAYS configuration is wrong! Please check it") 17 else: 18 #如何PASS_MAX_DAYS的值大於0小於等於90,則合規 19 if 0< int(ret) <= 90: 20 print("PASS_MAX_DAYS ok") 21 else: 22 print("PASS_MAX_DAYS fail") 23 else: 24 print("The file '/etc/login.defs' is not found!!!")
bash
file="/etc/login.defs"; #如果文件存在,grep -v過濾掉有#的行,在grep PASS_MAX_DAYS, if [ -s ${file} ];then ret=`cat ${file} | grep -v "#" | grep PASS_MAX_DAYS | awk -F ' ' '{print $2}'`;fi if [ 0 -ne $ret -a 90 -ge $ret ];then echo "PASS_MAX_DAYS ok"; else echo "PASS_MAX_DAYS fail";fi