目录

题目:系统用户安全审计

测试集准备

创建自动化脚本

对文件增加执行权限

运行脚本:


题目:系统用户安全审计

编写脚本分析/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在同一目录,如果不在确保在脚本内程序能选中目标测试文件

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐