#!/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,请通知用户首次登录修改密码。"