如何建立一個足夠安全的SSH連接?


1 概述

使用SSH連接服務器是一件很平常的事,但是,連接是否足夠安全是一個令人擔憂的問題。本文從如下幾個方面介紹了如何建立一個足夠安全的SSH連接:

  • 端口
  • 協議
  • 用戶
  • 密碼
  • 密鑰對
  • ssh-agent

2 端口

第一步就是修改默認端口22,修改/etc/ssh/sshd_config中的Port即可,比如這里修改為1234端口:

Port 1234

在這里插入圖片描述

Debian系的系統中直接修改端口就可以了,在RedHat中還需要使用semanage去開啟端口:

yum install policycoreutils-python #沒有安裝的話需要先安裝
semanage port -a -t ssh_port_t -p tcp 1234 # 添加端口
semanage port -l | grep ssh # 驗證是否添加成功

3 SSH協議

SSH2協議要比SSH1安全,因此建議使用,同樣修改配置文件:

Protocol 2 # 如果沒有就末尾添加

這樣客戶端連接的時候就不能使用Protocol 1協議連接:

ssh -1 username@ip

會提示

SSH protocol v.1 is no longer supported

4 超時斷開

修改為60s未操作自動斷開:

ClientAliveInterval 60 
# 以秒為單位,超過60s未操作自動斷開

ClientAliveCountMax 0 
# 如果客戶端沒有響應則判斷一次超時,該參數設置允許超時的次數

5 限制用戶

5.1 禁用root用戶登錄

PermitRootLogin no

當然禁用之前需要先創建好登錄的用戶,這里假設創建一個叫aa的用戶:

useradd aa
passwd aa
vim /etc/sudoers

復制一行root的權限並修改用戶名:

在這里插入圖片描述

然后輸入:wq!強制保存退出。

5.2 指定用戶登錄

AllowUsers testuser

這樣只能通過該用戶連接到該服務器,另外,如果出現拒絕登錄的問題:

kex_exchange_identification: read: Connection reset by peer

則需要去開啟對應允許的ip登錄,修改/etc/hosts.allow,添加:

sshd: ALL

5.3 禁用特定用戶登錄

DenyUser testuser

禁止通過testuser登錄。

類似的配置還有AllowGroupsDenyGroups

6 密碼

禁用(空)密碼登錄:

PermitEmptyPasswords no
PasswordAuthentication no

7 日志

LogLevel VERBOSE

默認為INFO,修改為VERBOSE可以得到更加詳細的信息。

8 密鑰對

8.1 生成密鑰對

上面已經設置了不能使用密碼登錄,那么,換句話說需要使用密鑰登錄,生成密鑰並不難:

ssh-keygen -t rsa 

只需要指定算法即可,默認為3072位,可選4096位。

但是,相比起傳統的RSA,在OpenSSH 6.5中引入了另一種叫Ed25519的更加安全的算法,使用橢圓曲線進行加密。Ed25519相比起RSA的優點有:

  • 體積更小:相比起RSA 3072544個字符,Ed25519只有68個字符
  • 更快:生成速度比RSA快,同時簽名速度也比RSA
  • 更安全:簽名過程不依賴隨機數生成器,不依賴哈希函數的防碰撞特性,沒有時間通道攻擊的問題

生成方式很簡單:

ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/ed25519

參數說明如下:

  • -a:指定KDFKey Derivation Function)的輪數
  • -t:指定算法,可選dsaecdsaecdsa-sked25519ed25519-skrsa
  • -f:指定位置

生成之后復制公鑰即可:

ssh-copy-id -i ~/.ssh/ed25519.pub user@ip

8.2 私鑰密碼

比如按上述方式生成密鑰對時,會提示輸入私鑰密碼:

在這里插入圖片描述

這里的密碼會在使用私鑰連接的時候提示:

在這里插入圖片描述

8.3 配合ssh-add

默認情況下每次使用私鑰登錄的時候都需要輸入私鑰的密碼,如果不想每次輸出,可以使用ssh-add

ssh-add ~/.ssh/test # ~/.ssh/test替換成對應的私鑰路徑

這樣只需要輸入一次私鑰密碼,下一次連接的時候就不需要輸入私鑰密碼連接了。

8.4 使用不同密鑰對

假設您有多台服務器:server1server2server3,則可以為不同服務器使用不同的密鑰對,而不是使用同一個密鑰對:

ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server1
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server2
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/server3

接着復制公鑰到對應的服務器上:

ssh-copy-id user@server1 -i ~/.ssh/server1.pub
ssh-copy-id user@server2 -i ~/.ssh/server2.pub
ssh-copy-id user@server3 -i ~/.ssh/server3.pub

9 ssh-agent

9.1 這是什么?

ssh-agent是一個程序,可以幫助管理私鑰。代理能提供如下用途:

  • 自動選擇密鑰:使用不同密鑰連接到不同主機時,需要手動指定密鑰(比如上面的使用不同密鑰對的例子中,連接到不同服務器時需要加上-i參數),ssh-agent可以自動選擇,不需要手動指定
  • 自動輸入私鑰密碼:如果私鑰設置了密鑰(比如上面的私鑰密碼例子),但是又需要頻繁地使用私鑰進行認證時,ssh-agent可以幫助自動輸入私鑰的密碼

9.2 使用

首先啟動:

eval `ssh-agent` # 注意是反引號

接着添加私鑰:

# 以上面“使用不同的密鑰對”為例
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1

這樣連接的時候就不需要手動指定-i參數了。

如果私鑰指定了密碼,會在ssh-add時進行提示輸入:

在這里插入圖片描述

這樣下次使用帶密鑰的私鑰連接時就不需要輸入密碼了。

10 2FA

Two-Factor Authentication,縮寫2FA,意為雙重認證雙因子認證等等,顧名思義就是進行兩步認證的操作,可選的應用有:

  • Google Authenticator
  • Authy
  • Yubico
  • Duo

比如Google Authenticator,安裝之后,連接服務器需要進行輸入驗證碼的操作。

具體的話就不演示了,因為筆者需要經常連接,因此這個選項對筆者來說不太實際,想要實現的話具體可以參考這里

11 其他選項

11.1 設置最大錯誤次數

MaxAuthTries 6

默認為最多允許3次密碼錯誤(需要除2),修改為2則表示如果密碼輸入錯誤一次即自動斷開。

11.2 主動斷開會話

LoginGraceTime 120

LoginGraceTime指定的時間內如果沒有連接成功,則自動斷開會話,默認單位為秒,可以指定以分鍾為單位,比如:

LoginGraceTime 2m

12 最后

修改完配置文件/etc/ssh/ssd_config后,對sshd服務進行重啟:

systemctl restart sshd

13 參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM