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
登錄。
類似的配置還有AllowGroups
與DenyGroups
。
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 3072
的544
個字符,Ed25519
只有68
個字符 - 更快:生成速度比
RSA
快,同時簽名速度也比RSA
快 - 更安全:簽名過程不依賴隨機數生成器,不依賴哈希函數的防碰撞特性,沒有時間通道攻擊的問題
生成方式很簡單:
ssh-keygen -a 1024 -t ed25519 -f ~/.ssh/ed25519
參數說明如下:
-a
:指定KDF
(Key Derivation Function
)的輪數-t
:指定算法,可選dsa
、ecdsa
、ecdsa-sk
、ed25519
、ed25519-sk
、rsa
-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 使用不同密鑰對
假設您有多台服務器:server1
,server2
,server3
,則可以為不同服務器使用不同的密鑰對,而不是使用同一個密鑰對:
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