opensuse基线检查脚本

#!/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


Powered By Z-BlogPHP 1.7.3

 Theme By 优美模版

本博客为开源博客,本博客联系QQ:372097243