九个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

浙公网安备 33010602011771号