银河麒麟 V10 安全加固脚本(含 sudo 管理员)

#!/bin/bash

# 银河麒麟 V10 安全加固脚本(含 sudo 管理员)

# 关键改进:先创建具有 sudo 权限的管理员,再禁用 root 远程登录

set -e

LOG_FILE="/var/log/kylin_hardening.log"

echo "[$(date)] 开始执行银河麒麟 V10 安全加固(含 sudo 管理员)..." | tee -a "$LOG_FILE"

# ==============================

# 步骤 0:创建具有 sudo 权限的管理员账户(关键!)

# ==============================

ADMIN_USER="dqydy"  # 可按需修改用户名

echo "[$(date)] [0/10] 创建具有 sudo 权限的管理员账户: $ADMIN_USER"

# 如果用户不存在,则创建

if ! id "$ADMIN_USER" &>/dev/null; then

    # 创建用户,设置家目录和 bash shell

    useradd -m -s /bin/bash "$ADMIN_USER"

    

    # 设置密码(此处使用固定密码便于演示,生产环境建议交互式输入或随机生成后通知)

    # 方式1:固定密码(不推荐生产)

    echo "$ADMIN_USER:ceshi1234sr" | chpasswd

    

    # 方式2:生成随机密码(推荐)

    #RANDOM_PASS=$(openssl rand -base64 16 | tr -d "=+/" | cut -c1-12)

    #echo "$ADMIN_USER:$RANDOM_PASS" | chpasswd

    

    # 配置 sudo 权限(无需密码,或按需改为需要密码)

    echo "$ADMIN_USER ALL=(ALL:ALL) NOPASSWD:ALL" > "/etc/sudoers.d/$ADMIN_USER"

    chmod 440 "/etc/sudoers.d/$ADMIN_USER"

    

    echo "✅ 用户 $ADMIN_USER 已创建"

    echo "   初始密码: $RANDOM_PASS (请妥善保管并通知用户首次登录修改)" | tee -a "$LOG_FILE"

else

    echo "⚠️ 用户 $ADMIN_USER 已存在,跳过创建" | tee -a "$LOG_FILE"

fi

# ==============================

# 步骤 1:禁止 root 远程 SSH 登录(现在安全了!)

# ==============================

echo "[$(date)] [1/10] 禁止 root 远程 SSH 登录..."

cp -f /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)

# 确保 PermitRootLogin 被设为 no

if grep -q "^PermitRootLogin" /etc/ssh/sshd_config; then

    sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config

else

    echo "PermitRootLogin no" >> /etc/ssh/sshd_config

fi

# 确保允许密码认证(否则可能无法登录)

sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config

systemctl reload sshd || systemctl restart sshd

echo "✅ 已禁用 root 远程登录,并重载 SSH 服务" | tee -a "$LOG_FILE"

# ==============================

# 步骤 2:创建三类职能管理员并分配最小权限

# ==============================

INIT_PWD="Banner.2025"  # 符合等保密码复杂度(大小写+数字+特殊字符)

ROLES=(

    "sysadmin:系统管理员:管理服务/用户/软件安装:/usr/bin/systemctl,/usr/bin/yum,/usr/sbin/user*"

    "secadmin:安全管理员:管理防火墙/安全策略/审计规则:/usr/sbin/firewall*,/usr/sbin/iptables,/usr/sbin/auditctl,/usr/sbin/semanage"

    "auditadmin:审计管理员:仅查看审计日志(无系统修改权):/usr/sbin/ausearch,/usr/sbin/aureport,/usr/bin/cat /var/log/audit/*"

)

echo "[INFO] 创建三员账户(初始密码: $INIT_PWD | 首次登录强制修改)"

for role_def in "${ROLES[@]}"; do

    IFS=':' read -r username desc perms cmd_path <<< "$role_def"

    

    # 1. 创建用户(若不存在)

    if id "$username" &>/dev/null; then

        echo "[SKIP] $username 已存在,跳过创建(保留现有配置)"

    else

        useradd -m -s /bin/bash -c "$desc" "$username"

        echo "$username:$INIT_PWD" | chpasswd

        chage -d 0 "$username"  # 强制首次登录修改密码

        echo "[OK] 创建用户: $username | 职责: $desc"

    fi

    

    # 2. auditadmin 特殊处理:加入 adm 组

    if [ "$username" = "auditadmin" ]; then

        usermod -aG adm "$username"

        echo "[OK] $username 已加入 adm 组(审计日志访问权限)"

    fi

    

    # 3. 配置 sudo 权限(最小权限原则)

    SUDO_FILE="/etc/sudoers.d/$username"

    if [ -f "$SUDO_FILE" ]; then

        cp "$SUDO_FILE" "${SUDO_FILE}.bak.$(date +%Y%m%d)"

        echo "[BACKUP] 备份原有 sudo 配置: ${SUDO_FILE}.bak.*"

    fi

    

    # 生成权限配置(按角色定制)

    case "$username" in

        sysadmin)

            cat > "$SUDO_FILE" <<EOF

# 系统管理员权限(等保要求:仅限系统维护)

$username ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/yum, /usr/bin/dnf, /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel, /usr/sbin/group*

EOF

            ;;

        secadmin)

            cat > "$SUDO_FILE" <<EOF

# 安全管理员权限(等保要求:仅限安全策略)

$username ALL=(ALL) NOPASSWD: /usr/sbin/firewall*, /usr/sbin/iptables, /usr/sbin/auditctl, /usr/sbin/semanage, /usr/bin/gpasswd

EOF

            ;;

        auditadmin)

            cat > "$SUDO_FILE" <<EOF

# 审计管理员权限(等保要求:仅读审计日志,无系统修改权)

$username ALL=(ALL) NOPASSWD: /usr/sbin/ausearch, /usr/sbin/aureport, /usr/bin/cat /var/log/audit/*

# 禁止任何写操作(强化审计独立性)

$username ALL=(ALL) !/usr/bin/vi, !/usr/bin/nano, !/usr/bin/rm, !/usr/bin/chmod

EOF

            ;;

    esac

    

    chmod 440 "$SUDO_FILE"

    visudo -c -f "$SUDO_FILE" &>/dev/null || {

        echo "[ERROR] sudo 配置语法错误!已恢复备份"

        [ -f "${SUDO_FILE}.bak.$(date +%Y%m%d)" ] && mv "${SUDO_FILE}.bak.$(date +%Y%m%d)" "$SUDO_FILE"

        exit 1

    }

    echo "[OK] 配置 sudo 权限: $username (权限范围: $perms)"

    

    # 4. 保护用户配置(防覆盖)

    if [ -f "/home/$username/.bashrc" ]; then

        chattr +i "/home/$username/.bashrc" 2>/dev/null && \

            echo "[SECURE] 锁定 $username 的 .bashrc(防篡改)" || \

            echo "[WARN] 无法锁定 .bashrc(需安装 e2fsprogs)"

    fi

done

# 5. 关键目录权限加固(确保 auditadmin 可访问)

if [ -d /var/log/audit ]; then

    chown root:adm /var/log/audit

    chmod 750 /var/log/audit

    chmod 640 /var/log/audit/audit.log* 2>/dev/null

    echo "[OK] 修复 /var/log/audit 目录权限(750)及日志文件权限(640)"

fi

# 6. 生成交付文档

cat > /root/THREE_ROLES_GUIDE.txt <<'EOF'

========================================

 银河麒麟 V10 三员账户使用指南

========================================

【系统管理员】sysadmin

- 职责:系统服务管理、用户/组管理、软件安装

- 首次登录:ssh sysadmin@主机IP → 强制修改密码

- 权限示例:sudo systemctl restart sshd

【安全管理员】secadmin

- 职责:防火墙策略、安全规则、审计策略配置

- 首次登录:ssh secadmin@主机IP → 强制修改密码

- 权限示例:sudo firewall-cmd --list-all

【审计管理员】auditadmin

- 职责:审计日志查询(无系统修改权限)

- 首次登录:ssh auditadmin@主机IP → 强制修改密码

- 权限示例:

    sudo ausearch -m USER_LOGIN --start today

    sudo cat /var/log/audit/audit.log | head -20

- ⚠️ 重要:无法执行 vi/rm/chmod 等写操作(符合等保审计独立性要求)

【安全提示】

1. 初始密码:Kylin@Sec2024!(首次登录强制修改)

2. 三员账户密码需符合复杂度策略(大小写+数字+特殊字符≥12位)

3. 禁止将三员账户加入 wheel/sudo 组

4. 审计日志目录权限:/var/log/audit (750, root:adm)

========================================

EOF

echo "=============================================="

echo "[SUCCESS] 三员账户创建完成!"

echo "----------------------------------------------"

echo "✅ 账户清单:"

echo "   • sysadmin  - 系统管理员"

echo "   • secadmin  - 安全管理员"

echo "   • auditadmin - 审计管理员(已加入 adm 组)"

echo "✅ 权限配置: /etc/sudoers.d/{sysadmin,secadmin,auditadmin}"

echo "✅ 使用指南: /root/THREE_ROLES_GUIDE.txt"

echo "✅ 详细日志: $LOG_FILE"

echo "----------------------------------------------"

echo "⚠️  请立即执行:"

echo "   1. 通知三位管理员首次登录(强制修改密码)"

echo "   2. 验证权限:su - sysadmin -c 'sudo systemctl status sshd'"

echo "   3. 审计员验证:su - auditadmin -c 'sudo ausearch -m SYSCALL --start today | head -5'"

echo "=============================================="

# ==============================

# 步骤 3~9:其余安全配置(同原脚本)

# ==============================

# 3. 启用 auditd

echo "[$(date)] [3/10] 启用 auditd 审计服务..."

systemctl enable --now auditd

echo "✅ auditd 已启用" | tee -a "$LOG_FILE"

# 4. 提示日志服务器(人工配置)

echo "[$(date)] [4/10] 请手动配置集中式日志服务器(如 rsyslog 远程转发)" | tee -a "$LOG_FILE"

# 5. logrotate 配置

echo "[$(date)] [5/10] 配置 logrotate 保留 28 周(≈6 个月)..."

cp -f /etc/logrotate.conf /etc/logrotate.conf.bak.$(date +%Y%m%d)

sed -i 's/^weekly.*/weekly/; s/^rotate .*/rotate 28/' /etc/logrotate.conf

grep -q "^weekly" /etc/logrotate.conf || echo "weekly" >> /etc/logrotate.conf

grep -q "^rotate" /etc/logrotate.conf || echo "rotate 28" >> /etc/logrotate.conf

echo "✅ logrotate 配置完成" | tee -a "$LOG_FILE"

# 6. 检查日志空间

echo "[$(date)] [6/10] 检查 /var/log 存储空间..."

SPACE_GB=$(df -BG /var/log | awk 'NR==2 {gsub(/G/, ""); print $4}')

echo "   可用空间: ${SPACE_GB}GB"

if [[ $SPACE_GB -lt 5 ]]; then

    echo "⚠️ /var/log 空间小于 5GB,建议扩容!" | tee -a "$LOG_FILE"

else

    echo "✅ /var/log 空间充足" | tee -a "$LOG_FILE"

fi

# 7. 设置日志权限 640

echo "[$(date)] [7/10] 设置日志文件权限为 640..."

chmod 640 /var/log/messages /var/log/secure 2>/dev/null || true

mkdir -p /var/log/audit

touch /var/log/audit/audit.log

chown root:adm -R /var/log/audit/

chmod 640 -R /var/log/audit/

echo "✅ 日志权限已加固" | tee -a "$LOG_FILE"

# 7.1 修复 audit 目录权限(关键!)

echo "[$(date)] [7.6/10] 配置 /var/log/audit 目录权限..."

chown root:adm /var/log/audit          # 确保组为 adm

chmod 750 /var/log/audit               # drwxr-x--- (组需 rx)

echo "✅ /var/log/audit 权限已设为 750 (root:adm)" | tee -a "$LOG_FILE"

# 7.2 同时修复所有 audit.log* 文件(含归档日志)

echo "[$(date)] [7.7/10] 修复审计日志文件组权限..."

chown root:adm /var/log/audit/audit.log*

chmod 640 /var/log/audit/audit.log*

echo "✅ 审计日志文件权限统一设为 640 (root:adm)" | tee -a "$LOG_FILE"

# 8. 清除当前历史

echo "[$(date)] [8/10] 清除当前 shell 历史..."

history -c

> ~/.bash_history

echo "✅ 当前会话历史已清除" | tee -a "$LOG_FILE"

# 9. 禁用全局历史记录(彻底修复版)

echo "[$(date)] [9/10] 禁用命令历史记录(HISTSIZE=0)..."

LOG_BACKUP="/var/log/hardening_backup_$(date +%Y%m%d).log"

# 备份关键配置

cp -f /etc/profile /etc/profile.bak.$(date +%Y%m%d) 2>/dev/null

cp -f /etc/bashrc /etc/bashrc.bak.$(date +%Y%m%d) 2>/dev/null

echo "备份: /etc/profile.bak.$(date +%Y%m%d), /etc/bashrc.bak.$(date +%Y%m%d)" | tee -a "$LOG_FILE"

# 清理 /etc/profile

sed -i '/^\s*\(export \)\?HIST\(SIZE\|FILESIZE\|FILE\)=/d' /etc/profile

cat >> /etc/profile <<'EOF'

# Security Hardening: Disable command history (added by kylin_hardening)

HISTSIZE=0

HISTFILESIZE=0

unset HISTFILE

EOF

# 清理 /etc/bashrc(银河麒麟关键!交互式 shell 从此加载)

if [ -f /etc/bashrc ]; then

    sed -i '/^\s*\(export \)\?HIST\(SIZE\|FILESIZE\|FILE\)=/d' /etc/bashrc

    cat >> /etc/bashrc <<'EOF'

# Security Hardening: Disable command history (added by kylin_hardening)

HISTSIZE=0

HISTFILESIZE=0

unset HISTFILE

EOF

fi

# 【关键】立即清空当前 shell 历史缓冲区(加固脚本执行环境)

history -c          # 清空内存中的历史命令

unset HISTFILE      # 确保无历史文件写入

> ~/.bash_history 2>/dev/null  # 清空当前用户历史文件(可选)

# 验证设置

CURRENT_HISTSIZE=$(echo $HISTSIZE)

CURRENT_HISTFILE=$(echo $HISTFILE)

echo "✅ 配置生效: HISTSIZE=$CURRENT_HISTSIZE, HISTFILE='$CURRENT_HISTFILE'" | tee -a "$LOG_FILE"

echo "⚠️  重要提示:" | tee -a "$LOG_FILE"

echo "   • 当前会话历史已清空(history 命令应无输出)" | tee -a "$LOG_FILE"

echo "   • 所有用户需重新登录使配置完全生效" | tee -a "$LOG_FILE"

echo "   • 若用户存在 ~/.bashrc 覆盖设置,需手动清理(等保要求:禁止用户级覆盖)" | tee -a "$LOG_FILE"

# 10. 最终提醒

echo "[$(date)] ✅ 银河麒麟 V10 安全加固完成!" | tee -a "$LOG_FILE"

echo "   🔑 管理员账户: dqydy (具有 sudo 权限)"

echo "   🔒 职能账户: sysadmin, secadmin, auditadmin (无 sudo)"

echo "   ⚠️ 请立即使用 dqydy 账户 SSH 登录测试!"

echo "   💡 初始密码已记录在 $LOG_FILE,请通知用户首次登录修改密码。"