permitrootlogin no 是必须的,因直接允许 root 登录会将最高权限暴露于 ssh 入口,易遭暴力破解;须先用普通用户登录再 sudo 提权,并确保该用户已在 sudo 组。

PermitRootLogin no 为什么必须设成 no
直接允许 root 登录等于把系统最高权限暴露在 SSH 入口上,所有暴力扫描工具默认就试 root + 常见密码。一旦密码弱或被撞库,整个系统立刻失守。PermitRootLogin no 强制用户先用普通账户登录,再通过 sudo 提权——这多了一层身份隔离和操作审计机会。
- 改之前务必确认至少一个普通用户已加入
sudo组,且能正常执行sudo -i - 不要直接编辑
/etc/ssh/sshd_config主文件,推荐新建/etc/ssh/sshd_config.d/99-hardening.conf,避免升级时被覆盖 - 修改后必须运行
sudo systemctl restart sshd,否则配置不生效;建议开两个终端,一个留着备用连接
PasswordAuthentication no 和 PubkeyAuthentication yes 要配对使用
单独禁用密码登录但没启用公钥认证,会导致所有 SSH 连接直接失败。这两项是绑定动作:PasswordAuthentication no 关掉旧通道,PubkeyAuthentication yes 打开新通道。
- 密钥必须用现代算法,优先选
ed25519(ssh-keygen -t ed25519),比 rsa2048 更快更安全 - 公钥要正确写入目标用户的
~/.ssh/authorized_keys,权限必须是600,目录~/.ssh必须是700,否则 sshd 会拒载 -
sshd默认只读取/etc/ssh/sshd_config及其.d/下的文件,确保你的配置文件名以.conf结尾且无特殊字符
UFW 默认策略必须设为 deny incoming
sudo ufw default deny incoming 是防火墙生效的前提。很多用户装完 UFW 就加几条 allow 规则,却忘了默认是允许所有入站流量——这等于没开防火墙。
- 执行顺序很重要:先设默认策略,再加具体规则,否则中间窗口期可能被利用
- 开放 SSH 端口时必须指定端口号,比如改过端口就写
sudo ufw allow 22222/tcp,不能只写sudo ufw allow ssh(它只认 22) -
sudo ufw enable后会提示是否继续,输入yes;若失败,用sudo ufw status verbose查当前状态和规则链顺序
sysctl.conf 里 kernel.randomize_va_space=2 别漏掉
地址空间布局随机化(ASLR)是内核级内存保护的核心机制。kernel.randomize_va_space=2 表示完全启用(0=关闭,1=部分启用,2=全启用)。很多加固文档只提 SELinux 或 AppArmor,却忽略这个基础开关。
- 写入
/etc/sysctl.d/99-security.conf,而不是直接改/etc/sysctl.conf,便于管理与回滚 - 加载后验证:运行
sudo sysctl kernel.randomize_va_space,输出必须是kernel.randomize_va_space = 2 - 某些容器环境或低资源 VPS 可能因 ASLR 导致小概率启动失败,但生产服务器必须开;如真遇到问题,先查
dmesg | grep -i aslr再判断











