← 返回
SSH 基础加固
禁 root 直登、关密码登录、收紧重试与认证窗口。没有密钥就先拒绝执行,改完先 sshd -t 校验,不过就回滚。
需要 root
一键执行
curl -fsSL https://www.moiu.cn/scripts/ssh-harden.sh | bash脚本源码
#!/usr/bin/env bash
# SSH 基础加固
#
# 需要 root。只做四件事,改动写进 /etc/ssh/sshd_config.d/99-harden.conf,
# 原 sshd_config 一个字不动:
# 1. 禁止 root 直接登录
# 2. 关闭密码登录
# 3. 收紧重试次数与认证窗口
# 4. 关闭 X11 转发
#
# ❗ 两道保险:找不到任何非空的 authorized_keys 就拒绝执行(否则会把你锁在外面);
# 写完先用 sshd -t 校验,校验不过立刻回滚。
# ❗ 执行前请另开一个终端、用密钥登录验证过。
set -e
# 需要 root:下面的系统级改动都直接执行,不再逐条 sudo
if [ "$(id -u)" -ne 0 ]; then
echo '[!] 这个脚本需要 root 权限,请用 sudo 重新运行:'
echo ' curl -fsSL 脚本地址 | sudo bash'
echo ' 或已经下载到本地:sudo bash 本文件'
exit 1
fi
CONF=/etc/ssh/sshd_config.d/99-harden.conf
echo '====== SSH 加固 ======'
if [ ! -d /etc/ssh/sshd_config.d ]; then
echo '[!] 没有 /etc/ssh/sshd_config.d —— 这个发行版的 sshd 可能不支持 Include'
exit 1
fi
KEYS=$(find /root/.ssh /home -maxdepth 3 -name authorized_keys -size +0c 2>/dev/null | head -n 1)
if [ -z "$KEYS" ]; then
echo '[!] 没找到任何非空的 authorized_keys'
echo ' 现在关掉密码登录会把你锁在外面,请先配好密钥登录'
exit 1
fi
echo "[*] 找到密钥:$KEYS"
cat > "$CONF" <<'SSH_EOF'
# 由 XiaoMo 脚本写入 —— https://www.moiu.cn/scripts/ssh-harden.sh
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 20
X11Forwarding no
SSH_EOF
echo "[*] 已写入 $CONF"
if sshd -t 2>/dev/null; then
systemctl reload ssh 2>/dev/null || systemctl reload sshd 2>/dev/null || true
echo ' [√] 配置校验通过,已重载'
else
echo ' [!] sshd -t 校验失败,回滚'
rm -f "$CONF"
exit 1
fi
echo ''
echo '====== 当前生效值 ======'
sshd -T 2>/dev/null | grep -E '^(permitrootlogin|passwordauthentication|maxauthtries|logingracetime)' || true
echo ''
echo '❗ 别关掉当前这个终端,先另开一个用密钥登录验证一次。'
