shell编程实站-----系统用户安全审计
摘要: 本文介绍了一个系统用户安全审计脚本,用于分析/etc/passwd文件,找出具有登录权限但超过90天未登录的用户。脚本通过awk处理passwd.txt和lastlog.txt两个测试文件,其中passwd.txt存储用户信息,lastlog.txt记录登录记录。脚本实现了以下功能:1)识别可登录用户;2)计算用户最后登录时间;3)与参考日期(2026年1月25日)比较;4)输出超过90天
·
目录
题目:系统用户安全审计
编写脚本分析/etc/passwd 文件,找出所有具有登录权限但超过90天未登录的用户。
测试集准备
测试数据(保存为 passwd.txt):
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
lastlog用户数据(保存为 lastlog.txt):
Username Port From Latest
root pts/0 192.168.1.100 Fri Dec 1 10:30:15 +0800 2023
john pts/1 192.168.1.101 Wed Nov 15 09:15:22 +0800 2023
alice pts/2 192.168.1.102 Thu Nov 20 14:30:45 +0800 2023
bob pts/3 192.168.1.103 Mon Oct 10 16:45:12 +0800 2023
tom **Never logged in**
创建自动化脚本
自动化脚本内容(保存为testPasswd文件):
echo "=== 系统用户安全审计 ==="
echo "分析具有登录权限但超过90天未登录的用户"
echo "参考时间: 2026年1月25日"
echo
#方法:使用awk处理,修复字段匹配问题
awk -v ref_date="2026-1-25" -v threshold=90 '
BEGIN{
#月份映射,在后面需要将月份转化为数字进行计算。
month["Jan"]=1; month["Feb"]=2; month["Mar"]=3; month["Apr"]=4;
month["May"]=5; month["Jun"]=6; month["Jul"]=7; month["Aug"]=8;
month["Sep"]=9; month["Oct"]=10; month["Nov"]=11; month["Dec"]=12;
#解析参考日期,变量弱类型,+0转化为数字方便计算
split(ref_date,d,"-")
ref_year=d[1]+0
ref_month=d[2]+0
ref_day=d[3]+0
#参考日期的天数,简略计算
ref_total_days=ref_year*365+ref_month*30+ref_day
print "具有登录权限但超过" threshold "天未登录的用户"
print "----------------------------------------"
count=0
}
#处理passwd.txt -找出可登录用户。
FILENAME == "passwd.txt" {
split($0,fileds,":")
if(fileds[7]~/\/bin\/(bash|sh)$/){
login_users[fields[1]] = 1
}
next
}
#处理lastlog.txt的数据行
FILENAME == "lastlog.txt" && NR == 1 {
next
}
#处理lastlog.txt的数据
FILENAME == "lastlog.txt"{
# 使用$1作为用户名(awk默认以空格分隔,但连续空格视为一个分隔符)
username = $1
# 只处理在passwd中标记为可登录的用户
if(username on login_users){
## 检查是否包含"Never logged in"
if(index($0,"**Never logged in**")>0){
printf "%10s:从未登录\n",username
count++
}
} else{
# 对于正常登录的用户行,字段是:
# $1=用户名, $2=Port, $3=From, $4=星期, $5=月份, $6=日期, $7=时间, $8=时区,
$9=年份
# 检查是否有足够的字段
if(NF>=9){
mounth_name=$5
day=$6+0
year=$9+0
#获取月份数字
month_num=month[month_name]
if(month_num>0){
# 计算登录日期的天数(简化)
login_total_days = year * 365 + month_num * 30 + day
days_diff = ref_total_days - login_total_days
if (days_diff > threshold) {
# 构建日期字符串用于显示
login_date = $5 " " $6 " " $7 " " $8 " " $9
printf "%-10s : %s (%d天前)\n", username, login_date, days_diff
count++
}
}
}
}
}
END{
print "----------------------------------------"
printf "总计: %d 个用户\n", count
}
'
passwd.txt lastlog.txt
echo
echo "审计完成"
对文件增加执行权限
chmod u+x testPasswd
运行脚本:
./testPasswd
注:确保脚本文件和testPasswd在同一目录,如果不在确保在脚本内程序能选中目标测试文件
更多推荐
所有评论(0)