#!/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 '❗ 别关掉当前这个终端，先另开一个用密钥登录验证一次。'
