CIS - Red Hat Enterprise Linux 8 Benchmark v3.0.0 的 Linux 安全审计工具CIS - Red Hat Enterprise Linux 8 Benchmark v3.0.0 中的约 130 个项目进行审计(并非文档中的完整集合:)。项目:
1. 初始设置
1.6 配置系统范围的加密策略
1.6.1 确保系统范围的加密策略未设置为旧版
1.6.2 确保系统范围的加密策略禁用 sha1 哈希和签名支持
1.6.3 确保系统范围的加密策略禁用 ssh 的 cbc
1.6.4 确保系统范围的加密策略禁用小于 128 位的 macs
1.7 配置命令行警告横幅
1.7.1 确保正确配置了每日消息
1.7.2 确保正确配置了本地登录警告横幅
1.7.3 确保正确配置了远程登录警告横幅
1.7.4 确保 /etc/motd 的访问权限已配置
1.7.5 确保 /etc/issue 的访问权限已配置
1.7.6 确保 /etc/issue.net 的访问权限已配置
2. 服务
2.1 配置时间同步
2.1.1 确保时间同步正在使用
2.1.2 确保已配置 chrony
2.1.3 确保 chrony 不以 root 用户运行
2.2 配置特殊用途服务
2.2.1 确保 autofs 服务未在使用
2.2.2 确保 avahi 守护进程服务未在使用
2.2.3 确保 dhcp 服务器服务未在使用
2.2.4 确保 dns 服务器服务未在使用
2.2.5 确保 dnsmasq 服务未在使用
2.2.6 确保 samba 文件服务器服务未在使用
2.2.7 确保 ftp 服务器服务未在使用
2.2.8 确保消息访问服务器服务未在使用
2.2.9 确保网络文件系统服务未在使用
2.2.10 确保 nis 服务器服务未在使用
2.2.11 确保打印服务器服务未在使用
2.2.12 确保 rpcbind 服务未在使用
2.2.13 确保 rsync 服务未在使用
2.2.14 确保 snmp 服务未在使用
2.2.15 确保 telnet 服务器服务未在使用
2.2.16 确保 tftp 服务器服务未在使用
2.2.17 确保 Web 代理服务器服务未在使用
2.2.18 确保 Web 服务器服务未在使用
2.2.19 确保 xinetd 服务未在使用
2.2.20 确保 X Window 服务器服务未在使用
2.2.21 确保邮件传输代理配置为仅本地模式
2.2.22 确保只有批准的服务在网络接口上监听
4. 访问、认证与授权
4.1 配置任务调度器
4.1.1 配置 cron
4.1.1.1 确保 cron 守护进程已启用并处于活动状态
4.1.1.2 确保 /etc/crontab 的权限已配置
4.1.1.3 确保 /etc/cron.hourly 的权限已配置
4.1.1.4 确保 /etc/cron.daily 的权限已配置
4.1.1.5 确保 /etc/cron.weekly 的权限已配置
4.1.1.6 确保 /etc/cron.monthly 的权限已配置
4.1.1.7 确保 /etc/cron.d 的权限已配置
4.1.1.8 确保 crontab 仅限授权用户使用
4.1.2 配置 at
4.1.2.1 确保 at 仅限授权用户使用
4.2 配置 SSH 服务器
4.2.1 确保 /etc/ssh/sshd_config 的权限已配置
4.2.2 确保 SSH 私有主机密钥文件的权限已配置
4.2.3 确保 SSH 公有主机密钥文件的权限已配置
4.2.4 确保 sshd 访问已配置
4.2.5 确保 sshd 横幅已配置
4.2.6 确保 sshd 密码已配置
4.2.7 确保 sshd 的 ClientAliveInterval 和 ClientAliveCountMax 已配置
4.2.8 确保 sshd 的 DisableForwarding 已启用
4.2.9 确保 sshd 的 HostbasedAuthentication 已禁用
4.2.10 确保 sshd 的 IgnoreRhosts 已启用
4.2.11 确保 sshd 的 KexAlgorithms 已配置
4.2.12 确保 sshd 的 LoginGraceTime 已配置
4.2.13 确保 sshd 的 LogLevel 已配置
4.2.14 确保 sshd 的 MACs 已配置
4.2.15 确保 sshd 的 MaxAuthTries 已配置
4.2.16 确保 sshd 的 MaxSessions 已配置
4.2.17 确保 sshd 的 MaxStartups 已配置
4.2.18 确保 sshd 的 PermitEmptyPasswords 已禁用
4.2.19 确保 sshd 的 PermitRootLogin 已禁用
4.2.20 确保 sshd 的 PermitUserEnvironment 已禁用
4.2.21 确保 sshd 的 UsePAM 已启用
4.2.22 确保 sshd 的 crypto_policy 未设置
4.3 配置权限提升
4.3.1 确保已安装 sudo
4.3.2 确保 sudo 命令使用 pty
4.3.3 确保 sudo 日志文件存在
4.3.4 确保用户必须提供密码才能提升权限
4.3.5 确保未全局禁用权限提升的重新认证
4.3.6 确保 sudo 认证超时配置正确
4.3.7 确保限制对 su 命令的访问
4.4 配置可插拔认证模块
4.4.2 配置 authselect
4.4.2.1 确保活动的 authselect 配置文件包含 pam 模块
4.4.2.2 确保 pam_faillock 模块已启用
4.4.2.3 确保 pam_pwquality 模块已启用
4.4.2.4 确保 pam_pwhistory 模块已启用
4.4.2.5 确保 pam_unix 模块已启用
4.4.3 配置可插拔模块参数
4.4.3.1.1 确保密码失败尝试锁定已配置
4.4.3.1.2 确保密码解锁时间已配置
4.4.3.1.3 确保密码失败尝试锁定包含 root 帐户
4.4.3.2.1 确保密码更改字符数已配置
4.4.3.2.2 确保密码长度已配置
4.4.3.2.3 确保密码复杂性已配置(手动)
4.4.3.2.4 确保密码相同连续字符已配置
4.4.3.2.5 确保密码最大顺序字符已配置
4.4.3.2.6 确保密码字典检查已启用
4.4.3.2.7 确保为 root 用户强制执行密码质量
4.4.3.3.1 确保密码历史记录已配置
4.4.3.3.2 确保为 root 用户强制执行密码历史记录
4.4.3.3.3 确保 pam_pwhistory 包含 use_authtok
4.4.3.4.1 确保 pam_unix 不包含 nullok
4.4.3.4.2 确保 pam_unix 不包含 remember
4.4.3.4.3 确保 pam_unix 包含强密码哈希算法
4.4.3.4.4 确保 pam_unix 包含 use_authtok
4.5 用户帐户和环境
4.5.1 配置 shadow 密码套件参数
4.5.1.1 确保已配置强密码哈希算法
4.5.1.2 确保密码过期策略为 180 天或更少
4.5.1.3 确保密码过期警告天数为 7 天或更多
4.5.1.4 确保非活动密码锁定为 30 天或更少
4.5.1.5 确保所有用户的最后密码更改日期在过去
4.5.2 配置 root 和系统帐户及环境
4.5.2.1 确保 root 帐户的默认组为 GID 0
4.5.2.2 确保 root 用户的 umask 已配置
4.5.2.3 确保系统帐户已安全配置
4.5.2.4 确保已设置 root 密码
4.5.3 配置用户默认环境
4.5.3.1 确保 nologin 未列在 /etc/shells 中
4.5.3.2 确保默认用户 shell 超时已配置
4.5.3.3 确保默认用户 umask 已配置
5. 日志记录和审计
5.1 配置日志记录
5.1.1 配置 rsyslog
5.1.1.1 确保已安装 rsyslog
5.1.1.2 确保 rsyslog 服务已启用
5.1.1.4 确保 rsyslog 默认文件权限已配置
5.1.1.5 确保日志记录已配置
5.1.1.6 确保 rsyslog 已配置为将日志发送到远程日志主机
5.1.1.7 确保 rsyslog 未配置为从远程客户端接收日志
6. 系统维护
6.1 系统文件权限
6.1.1 确保 /etc/passwd 的权限已配置
6.1.2 确保 /etc/passwd- 的权限已配置
6.1.3 确保 /etc/opasswd 的权限已配置
6.1.4 确保 /etc/group 的权限已配置
6.1.5 确保 /etc/group- 的权限已配置
6.1.6 确保 /etc/shadow 的权限已配置
6.1.7 确保 /etc/shadow- 的权限已配置
6.1.8 确保 /etc/gshadow 的权限已配置
6.1.9 确保 /etc/gshadow- 的权限已配置
6.1.10 确保 /etc/shells 的权限已配置
6.1.11 确保全局可写的文件和目录已安全处理
6.1.12 确保不存在无属主或无属组的文件或目录
6.1.13 确保审查 SUID 和 SGID 文件
6.1.14 审计系统文件权限
6.2 本地用户和组设置
6.2.1 确保 /etc/passwd 中的帐户使用 shadow 密码
6.2.2 确保 /etc/shadow 密码字段不为空
6.2.3 确保 /etc/passwd 中的所有组都存在于 /etc/group 中
6.2.4 确保不存在重复的 UID
6.2.5 确保不存在重复的 GID
6.2.6 确保不存在重复的用户名
6.2.7 确保不存在重复的组名
6.2.8 确保 root 路径完整性
6.2.9 确保 root 是唯一的 UID 0 帐户
6.2.10 确保本地交互式用户主目录已配置
6.2.11 确保本地交互式用户点文件的访问权限已配置

$ date
2024年8月6日 星期二 04:00:37 UTC
$ python3 -V
Python 3.6.8
$ sudo python3 main.py
===========================================================
Linux 安全审计工具 1.0.1 (2024.08.06)
作者: password123456
===========================================================
[+][2024-08-06 04:01:14] 开始安全审计。
---------------------------------------------------------
主机名: buddy2
操作系统: Rocky Linux 8.8 (Green Obsidian)
IP 地址: [ens192] 172.16.13.51
MAC 地址: [ens192] 00:50:56:a6:76:b8
[+] 1.初始设置
---------------------------------------------------------
1.6.配置系统范围的加密策略
[通过] 1.6.1 : 确保系统范围的加密策略未设置为旧版
[故障] 1.6.2 : 确保系统范围的加密策略禁用 sha1 哈希和签名支持
[通过] 1.6.3 : 确保系统范围的加密策略禁用 ssh 的 cbc
[手动] 1.6.4 : 确保系统范围的加密策略禁用小于 128 位的 macs
1.7.配置命令行警告横幅
[通过] 1.7.1 : 确保正确配置了每日消息
[故障] 1.7.2 : 确保正确配置了本地登录警告横幅
[通过] 1.7.3 : 确保正确配置了远程登录警告横幅
[通过] 1.7.4 : 确保 /etc/motd 的访问权限已配置
[通过] 1.7.5 : 确保 /etc/issue 的访问权限已配置
[通过] 1.7.6 : 确保 /etc/issue.net 的访问权限已配置
...
[*] 结果
---------------------------------------------------------
输出文件=/home/buddy/1722884474_buddy2_audit.xml
---------------------------------------------------------
[+][2024-08-06 04:01:57] 结束安全审计。
$ cat 1722884474_buddy2_audit.xml
<?xml version="1.0" encoding="UTF-8"?>
<results>
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:14</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.8 (Green Obsidian)</os_name>
<os_version>8.8</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:76:b8</mac_address>
<item_no>1.6.1</item_no>
<item_title>确保系统范围的加密策略未设置为旧版</item_title>
<result>pass</result>
<result_code>0</result_code>
<raw_data>
<![CDATA[
[ok] 未找到: /etc/crypto-policies/config --> ^[ \t]*(\bLEGACY\b)
# cat /etc/crypto-policies/config
...
DEFAULT
]]>
</raw_data>
</items>
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:14</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.8 (Green Obsidian)</os_name>
<os_version>8.8</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:76:b8</mac_address>
<item_no>1.6.2</item_no>
<item_title>确保系统范围的加密策略禁用 sha1 哈希和签名支持</item_title>
<result>fault</result>
<result_code>1</result_code>
<raw_data>
<![CDATA[
[vul] 发现: /etc/crypto-policies/state/CURRENT.pol
- 发现: ^[ \t]*(hash|sign)[ \t]*=[ \t]*([^\n\r#]+)?-sha1\b --> `ECDSA-SHA1,RSA-PSS-SHA1,RSA-SHA1` 位于第13行附近
# cat /etc/crypto-policies/state/CURRENT.pol
...
11: mac = AEAD HMAC-SHA2-256 HMAC-SHA1 UMAC-128 HMAC-SHA2-384 HMAC-SHA2-512
12: protocol =
13: sign = ECDSA-SHA3-256 ECDSA-SHA2-256 ECDSA-SHA3-384 ECDSA-SHA2-384 ECDSA-SHA3-512 ECDSA-SHA2-512 EDDSA-ED25519 EDDSA-ED448 RSA-PSS-SHA2-
256 RSA-PSS-SHA2-384 RSA-PSS-SHA2-512 RSA-SHA3-256 RSA-SHA2-256 RSA-SHA3-384 RSA-SHA2-384 RSA-SHA3-512 RSA-SHA2-512 ECDSA-SHA2-224 RSA-PSS-S
HA2-224 RSA-SHA2-224 ECDSA-SHA1 RSA-PSS-SHA1 RSA-SHA1
14: arbitrary_dh_groups = 1
15: min_dh_size = 2048
[vul] 发现: /etc/crypto-policies/state/CURRENT.pol
- 发现: ^[ \t]*sha1_in_certs[ \t]*=[ \t]*(0|1)$ --> `1` 位于第18行附近
# cat /etc/crypto-policies/state/CURRENT.pol
...
16: min_dsa_size = 2048
17: min_rsa_size = 2048
18: sha1_in_certs = 1
19: ssh_certs = 1
20: ssh_etm = 1
]]>
</raw_data>
</items>
...
<items>
<status>ok</status>
<datetime>2024-08-06 04:01:38</datetime>
<auditor>password123456</auditor>
<target>buddy2</target>
<os_name>Rocky Linux 8.7 (Green Obsidian)</os_name>
<os_version>8.7</os_version>
<os_id>rocky</os_id>
<os_architecture>x86_64</os_architecture>
<ip_address>[ens192] 172.16.13.51</ip_address>
<mac_address>[ens192] 00:50:56:a6:4a:80</mac_address>
<item_no>6.1.10</item_no>
<item_title>确保 /etc/shells 的权限已配置</item_title>
<result>pass</result>
<result_code>0</result_code>
<raw_data>
<![CDATA[
[ok] -rw-r--r-- 1 root root 44 Sep 10 20:51 /etc/shells
- 权限: 644
- 所有者:组: root:root
]]>
</raw_data>
</items>
</results>
使命是使用几乎 100% 纯 Python 代码来实现此工具。然而,在某些特定情况下,使用 shell 命令是不可避免的。
不可避免的情况:
find 等命令搜索文件和目录比使用原生 Python 代码快得多时。该脚本尽可能避免了常见的 Python 代码 > subprocess 运行 shell 命令 > 解析输出 模式,并且由超过 90% 的纯 Python 代码构成。
pass、fault、manual、error)以及用于验证的原始系统数据。根据您的视角,日志中的原始审计数据可能显得杂乱。