ubuntu基线检查脚本

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

# 检查不活跃的密码锁定是否小于等于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
}

# 检查密码过期时间是否小于等于365天
check_password_expire() {
    expire_days=$(grep "^PASS_MAX_DAYS" /etc/login.defs | awk '{print $2}')
    if [ "$expire_days" -le 365 ]; then
        echo "密码过期时间小于等于365天: 通过"
    else
        echo "密码过期时间小于等于365天: 未通过"
    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
}

# 检查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
}

# 检查 /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
}

# 检查AIDE是否安装
check_aide_installed() {
    if dpkg -s aide &> /dev/null; then
        echo "AIDE已安装: 通过"
    else
        echo "AIDE未安装: 未通过"
    fi
}

# 检查是否不存在无约束的守护程序
check_unconfined_daemons() {
    unconfined_daemons=$(ps -eZ | grep unconfined_service_t)
    if [ -z "$unconfined_daemons" ]; then
        echo "不存在无约束的守护程序: 通过"
    else
        echo "存在无约束的守护程序: 未通过"
    fi
}

# 检查SELinux策略是否设置
check_selinux_policy() {
    if sestatus | grep -q "Loaded policy name: *"; then
        echo "SELinux策略已设置: 通过"
    else
        echo "SELinux策略未设置: 未通过"
    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
}

# 检查密码散列算法是否为SHA-512
check_password_hash_sha512() {
    if grep -q "ENCRYPT_METHOD SHA512" /etc/login.defs; then
        echo "密码散列算法为SHA-512: 通过"
    else
        echo "密码散列算法为SHA-512: 未通过"
    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
}

# 检查SELinux或AppArmor是否安装
check_selinux_or_apparmor_installed() {
    if dpkg -s selinux-basics &> /dev/null || dpkg -s apparmor &> /dev/null; then
        echo "SELinux或AppArmor已安装: 通过"
    else
        echo "SELinux或AppArmor未安装: 未通过"
    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访问是否受限制
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
}

# 检查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
}

# 检查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_inactive_lock
check_password_expire
check_root_gid
check_password_min_age
check_su_restricted
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_aide_installed
check_unconfined_daemons
check_selinux_policy
check_selinux_disabled_in_bootloader
check_selinux_enforcing
check_password_hash_sha512
check_password_reuse_restricted
check_failed_password_lock
check_password_creation_requirements
check_selinux_or_apparmor_installed
check_approved_mac_algorithms
check_ssh_access_restricted
check_ssh_max_auth_tries
check_ssh_permit_empty_passwords
check_ssh_root_login_disabled
check_ssh_hostbased_auth_disabled
check_ssh_idle_timeout


Powered By Z-BlogPHP 1.7.3

 Theme By 优美模版

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