讓你的 SSH 服務器更安全的 10 個最佳實踐

不管是公司還是個人的 SSH 服務器,都應該做一些安全設置,以防止被破解登錄而變爲肉機,本文介紹的這些設置應該是你的 SSH 服務器標準配置。

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

1. 使用 SSH 公鑰登錄

使用用戶名密碼登錄 SSH 服務器是不推薦的,後面我們會介紹如何從服務器端禁止掉用戶名密碼登錄。我們推薦使用公鑰私鑰登錄。但是密鑰對的生成也要注意。

SSH 的 KEY 生成算法有幾種,但是到目前爲止,最安全的應該是 RSA 和 EdDSA (參考 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 的最佳實踐不止這些,還有很多內容可以配置,本文拋磚引玉,歡迎大家補充。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/gK6LoXdnaAmxnXztVEzpnQ