59、Linux系统审计脚本:保障系统安全的实用工具

Linux系统审计脚本:保障系统安全的实用工具

在Linux系统管理中,保障系统安全是至关重要的。而审计脚本则是监控系统、及时发现潜在安全问题的有效手段。本文将详细介绍如何创建和使用一个审计脚本,对系统账户的默认shell和潜在危险的文件权限进行审计。

1. 系统账户默认shell审计

系统账户通常需要在 /etc/passwd 文件中有账户记录,但为了安全起见,一般会阻止其登录系统。常见的做法是将其默认shell设置为 /bin/false /usr/sbin/nologin 或类似的选项。然而,如果系统账户的默认shell被更改为 /bin/bash ,即使没有设置密码,也可能是安全漏洞的一个迹象,因此需要对这些账户设置进行审计。

1.1 获取默认shell信息

首先,我们使用 cut 命令从 /etc/passwd 文件中提取每个账户的默认shell信息。该文件的字段分隔符是冒号 : ,默认shell位于每行的第七个字段。

$ cut -d: -f7 /etc/passwd
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
[…]
/bin/false
/bin/bash
1.2 过滤结果

我们只对 false nologin 类型的默认shell感兴趣,因此使用 grep 命令结合扩展正则表达式(ERE)进行过滤。注意,为了避免Bash shell对括号和管道符号的特殊解释,需要使用shell引号。

$ cut -d: -f7 /etc/passwd |
> grep -E "(false|nologin)"
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
[…]
/bin/false
/bin/false
/usr/sbin/nologin
/usr/sbin/nologin
1.3 统计账户数量

使用 wc -l 命令统计过滤结果的行数,即具有特殊默认shell的账户数量。

$ cut -d: -f7 /etc/passwd |
> grep -E "(false|nologin)" | wc -l
44
1.4 生成报告文件

为了方便后续比较和查看,我们将统计结果保存到报告文件中,并使用 tee 命令同时显示给脚本用户。为了使报告文件名具有唯一性,我们使用 date 命令获取当前日期和时间信息。

reportDir="/home/christine/scripts/AuditReports"
reportDate="$(date +%F%s)"
accountReport=$reportDir/AccountAudit$reportDate.rpt
cat /etc/passwd | cut -d: -f7 |
grep -E "(nologin|false)" | wc -l |
tee $accountReport
1.5 保护报告文件

为了防止报告文件被意外修改或删除,我们使用 chattr +i 命令为文件设置不可变属性。只有具有超级用户权限的用户才能设置和移除该属性。

$ sudo chattr +i mydefaultshell.rpt
$ rm -i mydefaultshell.rpt
rm: cannot remove 'mydefaultshell.rpt': Operation not permitted
1.6 比较报告

为了及时发现默认shell设置的变化,我们需要将当前报告与上一次的报告进行比较。使用 ls -1t 命令按时间顺序列出报告文件,并使用 sed -n '2p' 提取上一次报告的文件名。如果上一次报告不存在,脚本会给出相应提示。

prevReport="$(ls -1t $reportDir/AccountAudit*.rpt |
sed -n '2p')"
if [ -z $prevReport ]
then
    echo
    echo "No previous false/nologin report exists to compare."
else
    echo
    echo "Previous report's false/nologin shells: "
    cat $prevReport
fi
2. 潜在危险文件权限审计

在Linux系统中,设置用户ID(SUID)和设置组ID(SGID)权限可以让程序以特定用户或组的权限运行。然而,如果这些权限被意外或恶意设置在某些程序上,可能会导致安全问题。因此,对这些潜在“危险”的权限进行审计是必要的。

2.1 查找具有特定权限的文件和目录

使用 find 命令从系统的根目录 / 开始搜索具有SUID和SGID权限的文件和目录。 -perm /6000 选项表示搜索同时具有SUID和SGID权限的文件,忽略其他权限设置。为了避免显示错误信息,将错误输出重定向到 /dev/null

$ sudo find / -perm /6000 2>/dev/null
[sudo] password for christine:
/var/local
/var/crash
/var/metrics
/var/log/journal
[…]
/usr/bin/umount
/usr/bin/sudo
/usr/bin/chsh
[…]
/run/log/journal
2.2 生成权限审计报告

将搜索结果保存到报告文件中,同样使用 date 命令生成唯一的文件名。

reportDir="/home/christine/scripts/AuditReports"
reportDate="$(date +%F%s)"
permReport=$reportDir/PermissionAudit$reportDate.rpt
sudo find / -perm /6000 >$permReport 2>/dev/null
2.3 比较权限审计报告

使用 diff 命令比较当前报告和上一次报告的差异。为了避免因软件安装等原因导致的大量差异显示,可以使用 -q --brief 选项只显示是否存在差异。

prevReport="$(ls -1t $reportDir/PermissionAudit*.rpt |
sed -n '2p')"
if [ -z $prevReport ]
then
    echo
    echo "No previous permission report exists to compare."
else
    echo
    echo "Differences between this report and the last: "
    differences=$(diff $permReport $prevReport)
    if [ -z "$differences" ]
    then
        echo "No differences exist."
    else
        echo $differences
    fi
fi
3. 创建审计脚本

将上述功能整合到一个Bash脚本中,使用 getopts 命令处理用户输入的选项。用户可以选择只运行账户审计( -A )、只运行权限审计( -p )或同时运行两者( -Ap )。如果不提供任何选项,脚本将默认同时运行两个审计。

#!/bin/bash
#
# Audit_System.sh - Audit system files and accounts
####################################################
#
### Initialize variables #######################
#
runAccountAudit="false"
runPermAudit="false"
#
reportDir="/home/christine/scripts/AuditReports"
#
### Get options (if provided) #################
#
while getopts :Ap opt
do
     case "$opt" in
          A) runAccountAudit="true" ;;
          p) runPermAudit="true" ;;
          *) echo "Not a valid option."
             echo "Valid options are: -A, -p, or -Ap"
             exit
          ;;
     esac
done
#
### Determine if no options ##################
#
if [ $OPTIND -eq 1 ]
then
     # No options were provided; set all to "true"
     runAccountAudit="true"
     runPermAudit="true"
fi
#
### Run selected audits #######################
#
## Account Audit ##################
#
if [ $runAccountAudit = "true" ]
then
    echo
    echo "****** Account Audit *****"
    echo
    #
    # Determine current false/nologin shell count
    #
    echo "Number of current false/nologin shells: "
    #
    reportDate="$(date +%F%s)"
    accountReport=$reportDir/AccountAudit$reportDate.rpt
    #
    # Create current report
    cat /etc/passwd | cut -d: -f7 |
    grep -E "(nologin|false)" | wc -l |
    tee $accountReport
    #
    # Change report's attributes:
    sudo chattr +i  $accountReport
    #
    # Show past false/nologin shell count
    #
    prevReport="$(ls -1t $reportDir/AccountAudit*.rpt |
    sed -n '2p')"
    if [ -z $prevReport ]
    then
         echo
         echo "No previous false/nologin report exists to compare."
    else
         echo
         echo "Previous report's false/nologin shells: "
         cat $prevReport
    fi
fi
#
## Permissions Audit ##############
#
if [ $runPermAudit = "true" ]
then
    echo
    echo "****** SUID/SGID Audit *****"
    echo
    reportDate="$(date +%F%s)"
    permReport=$reportDir/PermissionAudit$reportDate.rpt
    #
    # Create current report
    echo "Creating report. This may take a while..."
    sudo find / -perm /6000 >$permReport 2>/dev/null
    #
    # Change report's attributes:
    sudo chattr +i  $permReport
    #
    # Compare to last permission report
    #
    #
    prevReport="$(ls -1t $reportDir/PermissionAudit*.rpt |
    sed -n '2p')"
    #
    if [ -z $prevReport ]
    then
         echo
         echo "No previous permission report exists to compare."
    else
         echo
         echo "Differences between this report and the last: "
         #
         differences=$(diff $permReport $prevReport)
         #
         if [ -z "$differences" ]
         then
             echo "No differences exist."
         else
             echo $differences
         fi
    fi
fi
#
exit
4. 运行脚本

在运行脚本之前,需要创建用于存储审计报告的目录。

$ mkdir AuditReports
$ ls AuditReports/

然后可以根据需要选择不同的选项运行脚本:
- 只运行账户审计:

$ ./Audit_System.sh -A
****** Account Audit *****
Number of current false/nologin shells:
44
No previous false/nologin report exists to compare.
  • 只运行权限审计:
$ ./Audit_System.sh -p
****** SUID/SGID Audit *****
Creating report. This may take a while...
No previous permission report exists to compare.
  • 同时运行两个审计:
$ touch sneakyFile.exe
$ chmod u+xs sneakyFile.exe
$ ./Audit_System.sh -Ap
****** Account Audit *****
Number of current false/nologin shells:
44
5. 总结

通过使用上述审计脚本,我们可以定期对Linux系统的账户默认shell和潜在危险的文件权限进行审计,及时发现并处理可能的安全问题。同时,脚本的灵活性允许我们根据实际需求选择只运行特定的审计或同时运行两者。在实际使用中,建议将脚本添加到定时任务(如 cron anacron )中,实现自动化审计。

以下是整个审计过程的流程图:

graph TD;
    A[开始] --> B[创建审计报告目录];
    B --> C{选择审计选项};
    C -- -A --> D[账户审计];
    C -- -p --> E[权限审计];
    C -- -Ap --> F[同时进行账户和权限审计];
    D --> D1[获取当前false/nologin shell数量];
    D1 --> D2[生成账户审计报告];
    D2 --> D3[保护报告文件];
    D3 --> D4[比较当前报告和上一次报告];
    E --> E1[查找具有SUID和SGID权限的文件和目录];
    E1 --> E2[生成权限审计报告];
    E2 --> E3[保护报告文件];
    E3 --> E4[比较当前报告和上一次报告];
    F --> D;
    F --> E;
    D4 --> G[结束];
    E4 --> G;

通过这个流程图,我们可以更清晰地看到整个审计过程的步骤和逻辑。同时,表格可以帮助我们更直观地对比不同审计选项的功能和操作:
| 审计选项 | 功能 | 操作步骤 |
| ---- | ---- | ---- |
| -A | 只进行账户审计 | 1. 获取当前false/nologin shell数量;2. 生成账户审计报告;3. 保护报告文件;4. 比较当前报告和上一次报告 |
| -p | 只进行权限审计 | 1. 查找具有SUID和SGID权限的文件和目录;2. 生成权限审计报告;3. 保护报告文件;4. 比较当前报告和上一次报告 |
| -Ap | 同时进行账户和权限审计 | 依次执行账户审计和权限审计的操作步骤 |

通过这种方式,我们可以更好地理解和使用这个审计脚本,保障Linux系统的安全。

Linux系统审计脚本:保障系统安全的实用工具

6. 脚本使用注意事项

在使用上述审计脚本时,有一些细节需要注意,以确保脚本的正常运行和审计结果的准确性。

6.1 sudo权限问题

脚本中多次使用了 sudo 命令,这是因为部分操作(如设置文件的不可变属性、查找系统所有文件和目录)需要超级用户权限。如果在运行脚本前一段时间内没有使用过 sudo 命令,系统会提示输入密码。如果不想在脚本运行时多次输入密码,可以将脚本中的 sudo 命令移除,然后以超级用户权限运行脚本,例如:

sudo ./Audit_System.sh -A
6.2 报告文件管理

审计报告文件存储在指定的目录中,随着时间的推移,该目录可能会积累大量的报告文件。为了避免磁盘空间被过度占用,可以定期清理旧的报告文件。可以编写一个简单的脚本,结合 find rm 命令来实现这一功能,例如:

find /home/christine/scripts/AuditReports -type f -mtime +30 -exec rm {} \;

上述命令会删除 /home/christine/scripts/AuditReports 目录下30天前的所有文件。

6.3 正则表达式和权限设置

在使用 grep 命令进行过滤时,使用了扩展正则表达式 (false|nologin) 。需要注意的是,正则表达式的使用要根据实际情况进行调整,如果系统中还有其他需要关注的默认shell类型,可以相应地修改正则表达式。

在使用 find 命令查找具有特定权限的文件时,使用了 -perm /6000 选项。如果使用的是较旧版本的Linux系统,可能需要将 / 替换为 + ,即 -perm +6000

7. 脚本的扩展和优化

虽然上述脚本已经实现了基本的审计功能,但在实际应用中,我们可以根据具体需求对脚本进行扩展和优化。

7.1 增加日志记录

为了更好地跟踪脚本的运行情况,可以在脚本中增加日志记录功能。例如,在每次生成报告或进行比较时,将相关信息记录到日志文件中。可以使用 echo 命令将信息输出到日志文件,例如:

logFile="/home/christine/scripts/AuditLogs/audit.log"
echo "$(date): Account audit completed. Current false/nologin shells: $(cat $accountReport)" >> $logFile
7.2 邮件通知

如果发现审计报告之间存在差异,可以通过邮件通知系统管理员。可以使用 mail 命令实现邮件发送功能,例如:

if [ -n "$differences" ]
then
    echo "$differences" | mail -s "Audit report differences" admin@example.com
fi
7.3 自动化调度

为了实现定期审计,可以将脚本添加到定时任务中。使用 crontab 命令编辑定时任务,例如:

crontab -e

在打开的文件中添加以下内容,表示每天凌晨2点运行脚本:

0 2 * * * /home/christine/scripts/Audit_System.sh -Ap
8. 与入侵检测系统(IDS)的区别

需要注意的是,这个审计脚本虽然可以帮助我们发现系统中的一些潜在安全问题,但它并不是入侵检测系统(IDS)。IDS应用程序会监控网络和/或系统上运行的应用程序,寻找可疑行为,并提供各种功能,如阻止攻击和报告任何潜在的恶意行为。

如果担心有恶意行为威胁系统安全,建议使用专门的IDS应用程序,如Snort、DenyHosts和Fail2ban等。这些应用程序可以提供更全面的安全防护。

9. 总结和展望

通过本文介绍的审计脚本,我们可以方便地对Linux系统的账户默认shell和潜在危险的文件权限进行审计。脚本的灵活性允许我们根据实际需求选择不同的审计选项,并且可以通过扩展和优化来满足更多的安全需求。

在未来的系统管理中,我们可以进一步完善脚本,结合更多的安全工具和技术,构建更加全面的安全防护体系。同时,定期对脚本进行维护和更新,以适应不断变化的安全环境。

以下是脚本扩展和优化的步骤列表:
1. 增加日志记录 :在脚本中添加日志记录功能,将关键信息输出到日志文件。
2. 邮件通知 :当审计报告存在差异时,通过邮件通知系统管理员。
3. 自动化调度 :使用 crontab 将脚本添加到定时任务中,实现定期审计。

另外,我们可以用表格来对比审计脚本和IDS的区别:
| 类型 | 功能 | 特点 |
| ---- | ---- | ---- |
| 审计脚本 | 定期检查系统账户默认shell和文件权限,生成报告并比较差异 | 简单易用,可定制性强,适合日常系统审计 |
| IDS | 实时监控网络和应用程序,检测可疑行为,提供防护和报告功能 | 功能强大,能实时响应安全威胁,需要专业配置和维护 |

通过这些表格和列表,我们可以更清晰地了解脚本的使用方法、扩展优化方向以及与其他安全工具的区别,从而更好地保障Linux系统的安全。

graph TD;
    A[现有审计脚本] --> B[增加日志记录];
    A --> C[邮件通知];
    A --> D[自动化调度];
    B --> E[完善脚本功能];
    C --> E;
    D --> E;
    E --> F[构建全面安全防护体系];
    F --> G[适应变化的安全环境];

这个流程图展示了脚本从现有状态到扩展优化,最终构建全面安全防护体系以适应安全环境变化的过程。通过这些可视化工具和详细的说明,我们可以更深入地理解和应用这个审计脚本,为Linux系统的安全保驾护航。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值