#!/bin/bash # 检查邮件传输代理是否配置为仅限本地模式 check_mta_local_only() { if grep -q "^inet_interfaces = localhost" /etc/postfix/main.cf; then echo "邮件传输代理配置为仅限本地模式: 通过" else echo "邮件传输代理配置为仅限本地模式: 未通过" fi } # 检查密码过期警告时间是否大于等于7天 check_password_warn_age() { warn_age=$(grep "^PASS_WARN_AGE" /etc/login.defs | awk '{print $2}') if [ "$warn_age" -ge 7 ]; then echo "密码过期警告时间大于等于7天: 通过" else echo "密码过期警告时间大于等于7天: 未通过" fi } # 检查su命令的访问是否受限制 check_su_restricted() { if grep -q "^auth required pam_wheel.so use_uid" /etc/pam.d/su; then echo "su命令的访问受限制: 通过" else echo "su命令的访问受限制: 未通过" fi } # 检查不活跃的密码锁定是否小于等于30天 check_inactive_lock() { inactive_lock=$(useradd -D | grep INACTIVE | awk -F'=' '{print $2}') if [ "$inactive_lock" -le 30 ]; then echo "不活跃的密码锁定小于等于30天: 通过" else echo "不活跃的密码锁定小于等于30天: 未通过" fi } # 检查密码过期时间是否小于等于90天 check_password_expire() { expire_days=$(grep "^PASS_MAX_DAYS" /etc/login.defs | awk '{print $2}') if [ "$expire_days" -le 90 ]; then echo "密码过期时间小于等于90天: 通过" else echo "密码过期时间小于等于90天: 未通过" fi } # 检查root用户默认组的GID是否为0 check_root_gid() { root_gid=$(id -g root) if [ "$root_gid" -eq 0 ]; then echo "root用户默认组的GID为0: 通过" else echo "root用户默认组的GID为0: 未通过" fi } # 检查修改密码的最小间隔时间是否大于等于7天 check_password_min_age() { min_age=$(grep "^PASS_MIN_DAYS" /etc/login.defs | awk '{print $2}') if [ "$min_age" -ge 7 ]; then echo "修改密码的最小间隔时间大于等于7天: 通过" else echo "修改密码的最小间隔时间大于等于7天: 未通过" fi } # 检查 /etc/passwd 中的所有组在 /etc/group 是否存在 check_groups_exist() { groups_exist=true for gid in $(cut -d: -f4 /etc/passwd); do if ! grep -q "^.*:.*:$gid:" /etc/group; then groups_exist=false break fi done if $groups_exist; then echo "/etc/passwd 中的所有组在 /etc/group 存在: 通过" else echo "/etc/passwd 中的所有组在 /etc/group 存在: 未通过" fi } # 检查重复 UID 是否不存在 check_duplicate_uids() { duplicate_uids=$(cut -d: -f3 /etc/passwd | sort | uniq -d) if [ -z "$duplicate_uids" ]; then echo "重复 UID 不存在: 通过" else echo "重复 UID 存在: 未通过" fi } # 检查重复用户名是否不存在 check_duplicate_usernames() { duplicate_usernames=$(cut -d: -f1 /etc/passwd | sort | uniq -d) if [ -z "$duplicate_usernames" ]; then echo "重复用户名不存在: 通过" else echo "重复用户名存在: 未通过" fi } # 检查root是否为唯一的UID为0用户 check_root_only_uid0() { uid0_count=$(awk -F: '$3 == 0' /etc/passwd | wc -l) if [ "$uid0_count" -eq 1 ]; then echo "root是唯一的UID为0用户: 通过" else echo "root是唯一的UID为0用户: 未通过" fi } # 检查/etc/passwd中没有遗留的"+"条目 check_passwd_no_legacy_plus() { if ! grep -q "^+:" /etc/passwd; then echo "/etc/passwd中没有遗留的\"+\"条目: 通过" else echo "/etc/passwd中没有遗留的\"+\"条目: 未通过" fi } # 检查/etc/shadow中没有遗留的"+"条目 check_shadow_no_legacy_plus() { if ! grep -q "^+:" /etc/shadow; then echo "/etc/shadow中没有遗留的\"+\"条目: 通过" else echo "/etc/shadow中没有遗留的\"+\"条目: 未通过" fi } # 检查重复用户组名是否不存在 check_duplicate_groupnames() { duplicate_groupnames=$(cut -d: -f1 /etc/group | sort | uniq -d) if [ -z "$duplicate_groupnames" ]; then echo "重复用户组名不存在: 通过" else echo "重复用户组名存在: 未通过" fi } # 检查密码字段是否不为空 check_password_not_empty() { empty_passwords=$(awk -F: '($2 == "" )' /etc/shadow) if [ -z "$empty_passwords" ]; then echo "密码字段不为空: 通过" else echo "密码字段不为空: 未通过" fi } # 检查重复 GID 是否不存在 check_duplicate_gids() { duplicate_gids=$(cut -d: -f3 /etc/group | sort | uniq -d) if [ -z "$duplicate_gids" ]; then echo "重复 GID 不存在: 通过" else echo "重复 GID 存在: 未通过" fi } # 检查/etc/group中没有遗留的"+"条目 check_group_no_legacy_plus() { if ! grep -q "^+:" /etc/group; then echo "/etc/group中没有遗留的\"+\"条目: 通过" else echo "/etc/group中没有遗留的\"+\"条目: 未通过" fi } # 检查GPG keys是否配置 check_gpg_keys_configured() { if [ -d /etc/apt/trusted.gpg.d ] && [ -n "$(ls -A /etc/apt/trusted.gpg.d)" ]; then echo "GPG keys已配置: 通过" else echo "GPG keys未配置: 未通过" fi } # 检查可疑数据包是否被记录 check_suspicious_packets_logged() { if grep -q "log_suspicious_packets=1" /etc/sysconfig/network; then echo "可疑数据包被记录: 通过" else echo "可疑数据包被记录: 未通过" fi } # 检查AIDE是否安装 check_aide_installed() { if rpm -q aide &> /dev/null; then echo "AIDE已安装: 通过" else echo "AIDE未安装: 未通过" fi } # 检查SELinux策略是否设置 check_selinux_policy() { if sestatus | grep -q "Loaded policy name: *"; then echo "SELinux策略已设置: 通过" else echo "SELinux策略未设置: 未通过" fi } # 检查MCS Translation是否未安装 check_mcs_translation_not_installed() { if ! rpm -q mcs-translation &> /dev/null; then echo "MCS Translation未安装: 通过" else echo "MCS Translation未安装: 未通过" fi } # 检查是否不存在无约束的守护程序 check_unconfined_daemons() { unconfined_daemons=$(ps -eZ | grep unconfined_service_t) if [ -z "$unconfined_daemons" ]; then echo "不存在无约束的守护程序: 通过" else echo "存在无约束的守护程序: 未通过" fi } # 检查bootloader配置中SELinux是否禁用 check_selinux_disabled_in_bootloader() { if grep -q "selinux=0" /proc/cmdline; then echo "bootloader配置中SELinux已禁用: 通过" else echo "bootloader配置中SELinux未禁用: 未通过" fi } # 检查SELinux状态是否为enforcing check_selinux_enforcing() { if sestatus | grep -q "Current mode: *enforcing"; then echo "SELinux状态为enforcing: 通过" else echo "SELinux状态为enforcing: 未通过" fi } # 检查SETroubleshoot是否未安装 check_setroubleshoot_not_installed() { if ! rpm -q setroubleshoot &> /dev/null; then echo "SETroubleshoot未安装: 通过" else echo "SETroubleshoot未安装: 未通过" fi } # 检查成功的文件系统挂载是否收集 check_successful_mounts_collected() { if grep -q "^-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=unset -k mounts" /etc/audit/rules.d/audit.rules; then echo "成功的文件系统挂载已收集: 通过" else echo "成功的文件系统挂载已收集: 未通过" fi } # 检查未成功的未授权的文件访问尝试是否收集 check_failed_file_access_collected() { if grep -q "^-a always,exit -F arch=b64 -S open,openat,open_by_handle_at -F exit=-EACCES -F auid>=1000 -F auid!=unset -k access" /etc/audit/rules.d/audit.rules; then echo "未成功的未授权的文件访问尝试已收集: 通过" else echo "未成功的未授权的文件访问尝试已收集: 未通过" fi } # 检查修改系统强制访问控制事件是否收集 check_modify_mac_events_collected() { if grep -q "^-w /etc/selinux/ -p wa -k MAC-policy" /etc/audit/rules.d/audit.rules; then echo "修改系统强制访问控制事件已收集: 通过" else echo "修改系统强制访问控制事件已收集: 未通过" fi } # 检查内核模块的加载和卸载是否收集 check_kernel_module_events_collected() { if grep -q "^-w /sbin/insmod -p x -k modules" /etc/audit/rules.d/audit.rules && grep -q "^-w /sbin/rmmod -p x -k modules" /etc/audit/rules.d/audit.rules && grep -q "^-w /sbin/modprobe -p x -k modules" /etc/audit/rules.d/audit.rules; then echo "内核模块的加载和卸载已收集: 通过" else echo "内核模块的加载和卸载已收集: 未通过" fi } # 检查auditd服务是否启用 check_auditd_enabled() { if systemctl is-enabled auditd &> /dev/null; then echo "auditd服务已启用: 通过" else echo "auditd服务已启用: 未通过" fi } # 检查系统管理范围(sudoers)更改是否收集 check_sudoers_changes_collected() { if grep -q "^-w /etc/sudoers -p wa -k scope" /etc/audit/rules.d/audit.rules; then echo "系统管理范围(sudoers)更改已收集: 通过" else echo "系统管理范围(sudoers)更改已收集: 未通过" fi } # 检查系统管理员操作(sudolog)是否收集 check_sudolog_collected() { if grep -q "^-w /var/log/sudo.log -p wa -k actions" /etc/audit/rules.d/audit.rules; then echo "系统管理员操作(sudolog)已收集: 通过" else echo "系统管理员操作(sudolog)已收集: 未通过" fi } # 检查audit日志是否不会自动删除 check_audit_logs_not_auto_deleted() { if grep -q "^max_log_file_action = keep_logs" /etc/audit/auditd.conf; then echo "audit日志不会自动删除: 通过" else echo "audit日志不会自动删除: 未通过" fi } # 检查修改日期和时间的事件是否收集 check_time_change_events_collected() { if grep -q "^-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time-change" /etc/audit/rules.d/audit.rules; then echo "修改日期和时间的事件已收集: 通过" else echo "修改日期和时间的事件已收集: 未通过" fi } # 检查修改用户/组信息的事件是否收集 check_user_group_change_events_collected() { if grep -q "^-w /etc/group -p wa -k identity" /etc/audit/rules.d/audit.rules && grep -q "^-w /etc/passwd -p wa -k identity" /etc/audit/rules.d/audit.rules; then echo "修改用户/组信息的事件已收集: 通过" else echo "修改用户/组信息的事件已收集: 未通过" fi } # 检查audit日志存储大小是否设置 check_audit_log_storage_size_set() { if grep -q "^max_log_file = [0-9]*" /etc/audit/auditd.conf; then echo "audit日志存储大小已设置: 通过" else echo "audit日志存储大小未设置: 未通过" fi } # 检查当audit日志已满时系统是否禁用 check_audit_log_full_system_disable() { if grep -q "^space_left_action = email" /etc/audit/auditd.conf && grep -q "^action_mail_acct = root" /etc/audit/auditd.conf && grep -q "^admin_space_left_action = halt" /etc/audit/auditd.conf; then echo "当audit日志已满时系统禁用: 通过" else echo "当audit日志已满时系统禁用: 未通过" fi } # 检查会话发起信息是否收集 check_session_init_info_collected() { if grep -q "^-w /var/run/utmp -p wa -k session" /etc/audit/rules.d/audit.rules; then echo "会话发起信息已收集: 通过" else echo "会话发起信息已收集: 未通过" fi } # 检查自主访问控制权限修改事件是否收集 check_dac_modify_events_collected() { if grep -q "^-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -F auid!=unset -k perm_mod" /etc/audit/rules.d/audit.rules; then echo "自主访问控制权限修改事件已收集: 通过" else echo "自主访问控制权限修改事件已收集: 未通过" fi } # 检查修改系统网络环境的事件是否收集 check_network_change_events_collected() { if grep -q "^-w /etc/sysconfig/network -p wa -k system-locale" /etc/audit/rules.d/audit.rules; then echo "修改系统网络环境的事件已收集: 通过" else echo "修改系统网络环境的事件已收集: 未通过" fi } # 检查登录和注销事件是否收集 check_login_logout_events_collected() { if grep -q "^-w /var/log/lastlog -p wa -k logins" /etc/audit/rules.d/audit.rules; then echo "登录和注销事件已收集: 通过" else echo "登录和注销事件已收集: 未通过" fi } # 检查audit配置是否为不可变的 check_audit_config_immutable() { if grep -q "^-e 2" /etc/audit/rules.d/audit.rules; then echo "audit配置为不可变: 通过" else echo "audit配置为不可变: 未通过" fi } # 检查用户的文件删除事件是否收集 check_user_file_delete_events_collected() { if grep -q "^-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F auid>=1000 -F auid!=unset -k delete" /etc/audit/rules.d/audit.rules; then echo "用户的文件删除事件已收集: 通过" else echo "用户的文件删除事件已收集: 未通过" fi } # 检查密码重用是否受限制 check_password_reuse_restricted() { if grep -q "password.*required.*pam_pwhistory.so" /etc/pam.d/common-password; then echo "密码重用受限制: 通过" else echo "密码重用受限制: 未通过" fi } # 检查失败密码尝试锁定是否配置 check_failed_password_lock() { if grep -q "auth required pam_tally2.so" /etc/pam.d/common-auth; then echo "失败密码尝试锁定已配置: 通过" else echo "失败密码尝试锁定未配置: 未通过" fi } # 检查密码创建要求是否配置 check_password_creation_requirements() { if grep -q "pam_cracklib.so" /etc/pam.d/common-password; then echo "密码创建要求已配置: 通过" else echo "密码创建要求未配置: 未通过" fi } # 检查密码散列算法是否为SHA-512 check_password_hash_sha512() { if grep -q "ENCRYPT_METHOD SHA512" /etc/login.defs; then echo "密码散列算法为SHA-512: 通过" else echo "密码散列算法为SHA-512: 未通过" fi } # 检查SELinux或AppArmor是否安装 check_selinux_or_apparmor_installed() { if rpm -q selinux-policy &> /dev/null || rpm -q apparmor &> /dev/null; then echo "SELinux或AppArmor已安装: 通过" else echo "SELinux或AppArmor未安装: 未通过" fi } # 检查SSH访问是否受限制 check_ssh_access_restricted() { if grep -q "AllowUsers\|AllowGroups" /etc/ssh/sshd_config; then echo "SSH访问受限制: 通过" else echo "SSH访问受限制: 未通过" fi } # 检查SSH的MaxAuthTries是否设置为小于等于4 check_ssh_max_auth_tries() { max_auth_tries=$(grep "^MaxAuthTries" /etc/ssh/sshd_config | awk '{print $2}') if [ "$max_auth_tries" -le 4 ]; then echo "SSH的MaxAuthTries设置为小于等于4: 通过" else echo "SSH的MaxAuthTries设置为小于等于4: 未通过" fi } # 检查SSH的PermitEmptyPasswords是否禁用 check_ssh_permit_empty_passwords() { if grep -q "^PermitEmptyPasswords no" /etc/ssh/sshd_config; then echo "SSH的PermitEmptyPasswords已禁用: 通过" else echo "SSH的PermitEmptyPasswords已禁用: 未通过" fi } # 检查是否仅使用已批准的MAC算法 check_approved_mac_algorithms() { if grep -q "MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com" /etc/ssh/sshd_config; then echo "仅使用已批准的MAC算法: 通过" else echo "仅使用已批准的MAC算法: 未通过" fi } # 检查SSH的root登录是否禁用 check_ssh_root_login_disabled() { if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config; then echo "SSH的root登录已禁用: 通过" else echo "SSH的root登录已禁用: 未通过" fi } # 检查是否只使用了已批准的密码 check_approved_passwords() { if grep -q "pam_cracklib.so" /etc/pam.d/common-password; then echo "只使用了已批准的密码: 通过" else echo "只使用了已批准的密码: 未通过" fi } # 检查SSH的HostbasedAuthentication是否禁用 check_ssh_hostbased_auth_disabled() { if grep -q "^HostbasedAuthentication no" /etc/ssh/sshd_config; then echo "SSH的HostbasedAuthentication已禁用: 通过" else echo "SSH的HostbasedAuthentication已禁用: 未通过" fi } # 检查SSH空闲超时间隔是否设置 check_ssh_idle_timeout() { if grep -q "^ClientAliveInterval" /etc/ssh/sshd_config; then echo "SSH空闲超时间隔已设置: 通过" else echo "SSH空闲超时间隔未设置: 未通过" fi } # 执行所有检查 check_mta_local_only check_password_warn_age check_su_restricted check_inactive_lock check_password_expire check_root_gid check_password_min_age check_groups_exist check_duplicate_uids check_duplicate_usernames check_root_only_uid0 check_passwd_no_legacy_plus check_shadow_no_legacy_plus check_duplicate_groupnames check_password_not_empty check_duplicate_gids check_group_no_legacy_plus check_gpg_keys_configured check_suspicious_packets_logged check_aide_installed check_selinux_policy check_mcs_translation_not_installed check_unconfined_daemons check_selinux_disabled_in_bootloader check_selinux_enforcing check_setroubleshoot_not_installed check_successful_mounts_collected check_failed_file_access_collected check_modify_mac_events_collected check_kernel_module_events_collected check_auditd_enabled check_sudoers_changes_collected check_sudolog_collected check_audit_logs_not_auto_deleted check_time_change_events_collected check_user_group_change_events_collected check_audit_log_storage_size_set check_audit_log_full_system_disable check_session_init_info_collected check_dac_modify_events_collected check_network_change_events_collected check_login_logout_events_collected check_audit_config_immutable check_user_file_delete_events_collected check_password_reuse_restricted check_failed_password_lock check_password_creation_requirements check_password_hash_sha512 check_selinux_or_apparmor_installed check_ssh_access_restricted check_ssh_max_auth_tries check_ssh_permit_empty_passwords check_approved_mac_algorithms check_ssh_root_login_disabled check_approved_passwords check_ssh_hostbased_auth_disabled check_ssh_idle_timeout