九个SSH加固技巧防黑客(转)

对普通人来说,黑客攻击是一件很遥远的事,用六个六或八个八当密码又好记又吉祥。在开发和运维工程师看来,攻击无处不在。

我个人被黑惨过两次。一次是刚毕业不久第一次接手Linux服务器,系统总是莫名其妙地弹出消息,然后不可控制地重启。当时在Red Hat工作的一个朋友帮我设置了iptables和portsentry,终于也让黑客难堪了一下。还有一次是构建企业邮箱系统,员工邮箱被黑客用来发垃圾邮件。应对方法是加强密码审计,对可疑收发做限制,随之而来的是不得不面对繁重的邮箱支持工作。

如果这些算陈年旧事,那下图线上服务器运行日志,就发生在眼皮底下。

SSH作为远程系统管理服务,是黑客攻击的首要目标。如何把服务器从一个持续被攻击的目标,变成一座数字堡垒呢?

以下是九个行之有效的防黑绝招,立竿见影,让我们开始吧。

1 禁止root用户登录(SSH的首要安全法则)

警钟:98% 的自动化攻击都以 root 为目标。

残酷的事实是:如果允许通过 SSH 直接登录 root,就等于把你家的大门敞开,还挂着一个霓虹灯写着“欢迎黑客”。

为什么禁止root用户登录很重要?

直接使用 root 访问意味着攻击者只需攻破一个账户,就能掌控整个系统:没有审计记录,没有责任追踪,没有补救机会。

如何禁止root用户登录?

修改配置文件 /etc/ssh/sshd_config 如下

PermitRootLogin no

就这么简单,一行而已,却影响巨大。

如果普通用户需要root权限,可以使用sudo。这样做的好处是可以留下审计记录,同时也迫使攻击者必须突破两层防护,而不是一层。

如果自动化任务需要root,可改成下面的样子

PermitRootLogin prohibit-password

注意,在禁用root登录之前,一定要先确认sudo权限可用,否则会把自己关在门外。

有些同学可能不解,sudo权限不可用,不是还有su吗?问题是如果给普通用户root密码,从而可以su到root,会留下安全隐患。一方面root密码共享容易泄漏;另一方面su是切换用户而不是提权操作,一旦切换到另一个用户,就无法追溯原用户行为。所以生产环境root账户是锁定的,或只对有限的人开放,要root权限只能通过sudo。sudo有日志追溯,可以精细授权。

2 禁止密码登录(只允许使用SSH密钥,否则免谈)

仅仅做这一项改动,认证失败尝试会下降 99.7%。
为什么密码登录很糟糕?

密码容易受到以下攻击:

  • 暴力破解(Brute force attacks)
  • 字典攻击(Dictionary attacks)
  • 凭证填充攻击(Credential stuffing)
  • 人类记忆本身(人类总是容易选择糟糕的密码)

暴力破解和字典攻击容易理解,这里说明一下凭证填充攻击。我们会在很多网站注册用户名密码,通常都用同一个。如果网站A不慎泄漏了账号,黑客会把拿到的账号去网站B或者C登录,成功率往往很高。

SSH 密钥登录可以彻底消除密码被猜测的可能。

配置如下

PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes

每一个登录用户执行如下操作


# A 生成密钥(Key),ED25519类型的密钥又快又安全,是现代密钥标准。
ssh-keygen -t ed25519 -a 100 -C "your_email@example.com"

# B 拷贝密钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

# C 在另一个终端测试
ssh -i ~/.ssh/id_ed25519 user@server

在密钥起作用之前,不要禁用口令登录。

密匙使用策略:
工作服务器 → 受密码保护的密钥,就算别人拿到密匙文件也解不开,无法使用
个人服务器 → 单独密钥,和工作密匙分开,控制“爆炸半径”(blast radius),一个密匙出事不会崩盘
CI/CD → 受限密钥,不能登录系统,只能执行指定命令

3 不要让SSH监听22号端口(是的,这真的管用)

这属于“通过隐藏实现安全”的方法(security through obscurity),确实能大幅减少攻击。

以下是真实数据:

22 端口 → 每月 50,000+ 次攻击

自定义端口 → 每月 12 次攻击

下降幅度 → 99.98%

配置很简单

Port 2849

你可以改成其他端口,只要不是22就行。如果启用了防火墙,要同步修改防火墙规则,比如

sudo ufw allow 2849/tcp
sudo ufw delete allow 22/tcp
sudo ufw enable

再次重复,配置更改后要新开一个SSH测试登录。

4 速率限制:让攻击者慢到几乎爬行的程度

配置如下

MaxAuthTries 3
MaxSessions 2
LoginGraceTime 30
MaxStartups 10:30:60

配置说明:

  • 每次登录最多允许3次认证失败
  • 一个 SSH 连接最多开 2 个会话
  • 30 秒内必须完成登录认证
  • 小于等于10 个并发连接:正常处理;10到30个并发连接随机丢弃;最多丢弃60%个并发连接

几个小时就能完成的暴力破解,经过配置需要数月才能完成。

5 用白名单设置登录用户

只给那些需要SSH的用户开设登录权限,配置如下

AllowGroups sshusers admins

把允许的用户加入sshusers组,比如

sudo groupadd sshusers
sudo usermod -aG sshusers alice

可以这样控制用户访问:
用户组sshusers → 正常访问
用户组admins → 特权访问
配置项DenyUsers → 禁止被攻破的账户

6 把不用的功能关掉

配置如下

X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
GatewayPorts no
IgnoreRhosts yes
HostbasedAuthentication no

简单说明:

  • X11Forwarding 在远程服务器运行X11图形程序,把显示界面转发到本地
  • AllowTcpForwarding 把对本地端口的访问转发到远程服务器,或把对远程服务器端口的访问转发到本地
  • AllowAgentForwarding 如果你通过本地key登录到服务器A,不用在A存储本地key就可以访问服务器B
  • PermitTunnel 通过SSH创建虚拟网卡(tun/tap),建立VPN隧道
  • GatewayPorts 是否允许 AllowTcpForwarding 远程服务器端口绑定公网地址(而不是localhost),从而把远程服务器变成公网网关
  • IgnoreRhosts 忽略 .rhosts 信任机制
  • HostbasedAuthentication 如果这台机器可信 → 自动登录下一台

可以配置成按条件访问

Match User developer
  AllowTcpForwarding yes
  PermitOpen localhost:5432 localhost:3306

缺省锁死,只放行需要的功能。

7 使用现代加密算法

配置如下

Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512
PubkeyAcceptedAlgorithms ssh-ed25519,rsa-sha2-512

重新生成主机密匙

sudo rm /etc/ssh/ssh_host_dsa_key*
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

用户会看到一次警告,这是预料之中的。

8 日志记录:你的安防摄像头

配置如下

LogLevel VERBOSE

Ubuntu/Debian日志记录在 /var/log/auth.log ,RHEL/CentOS日志记录在 /var/log/secure 。

强烈建议安装fail2ban防止暴力破解,

sudo apt install fail2ban

配置fail2ban

[sshd]
enabled = true
port = 2849
maxretry = 3
bantime = 3600

fail2ban会监控sshd安全日志,一旦发现有暴力破解,通过更新防火墙规则阻止其进一步访问。除了用于SSH,fail2ban还支持Apache/Nginx之类的Web服务。

9 双因素认证(Two-Factor Authentication, 2FA):终极关卡

适用于:

  • 生产服务器
  • 面向互联网的主机
  • 堡垒机(Bastion servers,支持审计、记录、权限控制的中转机)

在配置里启用密钥 + 双因素认证

AuthenticationMethods publickey,keyboard-interactive

安装和启动

sudo apt install libpam-google-authenticator
google-authenticator

可以配置按条件启用

Match Group admins
  AuthenticationMethods publickey,keyboard-interactive

系统管理员支持2FA,服务账号不支持。

总结

以下是用于生产环境的 sshd_config

Port 2849
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
AllowGroups sshusers admins
MaxAuthTries 3
LogLevel VERBOSE
X11Forwarding no
AllowTcpForwarding no

天下没有破不了的防线,只有付不付得起代价的攻击。SSH加固方法不是万全之策,但会让黑客得不偿失。日积跬步,不断精进,最终你会一直安全。

参考
https://blog.stackademic.com/9-ssh-hardening-tricks-that-stopped-50-000-attack-attempts-on-my-server-6499b7b756bf
man sshd_config

posted @ 2026-04-22 10:06  汉学  阅读(3)  评论(0)    收藏  举报