让你的SSH服务器更安全的10个最佳实践

让你的SSH服务器更安全的10个最佳实践

让你的SSH服务器更安全的10个最佳实践

不管是公司还是个人的SSH服务器,都应该做一些安全设置,以防止被破解登录而变为肉机,本文介绍的这些设置应该是你的SSH服务器标准配置。

在介绍之前,有一些SSH默认配置你需要了解

1. 使用SSH公钥登录

使用用户名密码登录SSH服务器是不推荐的,后面我们会介绍如何从服务器端禁止掉用户名密码登录。我们推荐使用公钥私钥登录。但是密钥对的生成也要注意。

SSH的KEY生成算法有几种,但是到目前为止,最安全的应该是 RSAEdDSA
(参考https://goteleport.com/blog/comparing-ssh-keys/)

其中RSA因为其后向兼容性更好,所以使用的更加广泛,目前大多数的SSH客户端sshkey都会默认用RSA生成3072位key,因为这是最低安全标准,业界的共识一般是推荐使用4096位。

比如下面的命令(注意,不同的服务器尽量使用不同的密钥对,这样不至于一锅端)

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_aws_$(date +%Y-%m-%d) -C "AWS key for personal server"
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/gns3/.ssh/id_rsa_aws_2021-11-25
Your public key has been saved in /home/gns3/.ssh/id_rsa_aws_2021-11-25.pub
The key fingerprint is:
SHA256:BQOCH967/5hWvNfe0SbJOS3a2jU74DplBBesJ6Mkiw4 AWS key for personal server
The key's randomart image is:
+---[RSA 4096]----+
|   .. ..o   ...  |
|  . ..   o . o   |
|   o o    . +    |
|    o .. o + o   |
|      ..S.. =    |
|   E ... .o  = +.|
|    o  . . .+.Oo=|
|     .. .o...=.O+|
|       o+..o=o+.o|
+----[SHA256]-----+

有了密钥对以后,可以通过下面的命令把你的公钥安装到服务器上。其实就把公钥放到服务器的.ssh/authorized_keys文件里

ssh-copy-id -i /path/to/public-key-file user@host

然后就可以免密码登录了。

ssh -i .xxxx.pub user@host

当然,如果不想每次这样麻烦,可以使用 .ssh/config文件配置host,这个本文就不做展开了。

另外注意,在进行下面第二步之前,需要配置一下,最好让当前的SSH key登录用户具有sudo权限。

2.禁止用户名密码登录

修改 /etc/ssh/sshd_config来禁止掉用户名密码登录,打开公钥登录

PermitRootLogin no    # 禁止root直接SSH登录
ChallengeResponseAuthentication no  # 这个和UsePAM一起用的,至于PAM是什么,这里不展开介绍了,推荐都no掉
PasswordAuthentication no
UsePAM no
AuthenticationMethods publickey
PubkeyAuthentication yes
PermitEmptyPasswords no   # 禁止掉空密码

修改后需要重启sshd服务,然后如果尝试密码登录,会有失败信息如下

 ssh user@host_ip
root@host_ip: Permission denied (publickey).

3.不要允许所有用户拥有SSH权限

很多时候我们的系统里有一些系统用户,他们是不需要SSH登录的权限的。比如你创建了一个ftp的用户,它不需要有SSH登录的权限,这时候我们可以使用白名单或者黑名单的形式来允许或者拒绝特定的用户可以或者不可以SSH登录到系统

比如把下面的配置添加到sshd_config里, 只允许jack和tom通过SSH登录系统。(或者通过DenyUsers 去禁掉特定用户,允许其它用户)

AllowUsers jack tom

4.网络安全

建议通过防火墙来打开TCP端口22的同时,要明确写明到底哪些IP地址端可以来SSH登录。比如对于Ubuntu的系统

sudo ufw allow from 192.168.1.0/24 to any port 22

只允许来自 192.168.1.0/24的连接请求。

对于iptables也是类似。

更高级一点的,也可以通过防火墙来限制SSH入方向的流量大小。

5.明确SSH的地址绑定

很多时候系统有多个IP地址,这时候最好能确定一下地址绑定,而不是默认绑定到机器的所有地址,当然绑定的端口号也是可以改的(默认22)。

比如把下面的配置添加到 sshd_config里

Port 2222
ListenAddress 192.168.1.5
ListenAddress 10.1.0.8

相当于打开了本地这两个IP的端口2222, 来提供SSH服务。

6. 限制尝试登录次数

这个主要是防止暴力尝试登录的,比如你可能见过一些log /var/log/secure , 提示有人尝试登录你的设备,但是验证失败。

可以通过防火墙进行设置,这里就不展开了,有机会可以单独出一篇教程。

7. 设置超时登出

加入你登入一台设备,然后超过一段时间没有任何操作,那么应该需要自动断开连接,这个可以在sshd_config里配置

ClientAliveInterval 300
ClientAliveCountMax 0

比如超过300秒没有任何操作,就会把用户踢出去,连接断开。

8.经常给你的OpenSSH打补丁

如果有任何公开漏洞,都要即使给系统或者OpenSSH打补丁。

9.禁掉弱的cipher, key exchange算法,MAC等

# Supported HostKey algorithms by order of preference.
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
 
# Specifies the available KEX (Key Exchange) algorithms.
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
 
# Specifies the ciphers allowed
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
 
#Specifies the available MAC (message authentication code) algorithms
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com

把上面的内容加到 sshd_config 里。

限制了可使用的 hostkey, key exchange, cipher, MAC等,把一些弱的算法踢掉,比如SHA1相关的不安全算法。

可以通过下面的命令去查看你的SSH服务器支持哪些

$ ssh -Q cipher
$ ssh -Q cipher-auth
$ ssh -Q mac
$ ssh -Q kex
$ ssh -Q key

10. SSH Audit

有很多可以用的SSH Audit工具可以帮你检查你的服务器安全性,比如https://github.com/jtesta/ssh-audit, 这样的类似的工具有很多。

最后

当然,SSH的最佳实践不止这些,还有很多内容可以配置,本文抛砖引玉,欢迎大家补充。

Discussion