SSH 是遠端伺服器管理的重要工具,但其安全性組態至關重要。本文根據 CIS 控制項建議,探討如何加強 SSH 安全性,包含多個重要組態,例如禁止 root 直接登入、停用不安全的認證方式、強化加密演算法與金鑰交換機制等,並提供檢查與修復的程式碼範例,以確保伺服器免受未授權存取和攻擊。除了基本的安全強化措施外,文章也涵蓋了進階的 SSH 組態技巧,例如設定閒置超時、登入寬限時間和存取控制等,以提供更全面的防護。透過這些設定,可以有效降低伺服器遭受暴力破解、中間人攻擊等風險,並提升整體系統安全性。
加強 SSH 安全性的設定與實踐
在現代的伺服器管理中,SSH(Secure Shell)是一個至關重要的工具,用於安全地存取和管理遠端伺服器。然而,若 SSH 的設定不當,可能會導致安全性問題。本文將根據 CIS(Center for Internet Security)控制項的建議,探討如何加強 SSH 的安全性。
1. 啟用 SSH IgnoreRhosts
設定說明
IgnoreRhosts 引數指定是否使用 .rhosts 和 .shosts 檔案進行 RhostsRSAAuthentication 或 HostbasedAuthentication。
為何重要
啟用此引數可強制使用者在透過 SSH 認證時輸入密碼,從而提高安全性。
如何檢查
執行以下命令並驗證輸出是否符合預期:
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep ignorerhosts
預期輸出:ignorerhosts yes
如何修復
編輯 /etc/ssh/sshd_config 檔案,將 IgnoreRhosts 設定為 yes:
IgnoreRhosts yes
2. 停用 SSH HostbasedAuthentication
設定說明
HostbasedAuthentication 引數指定是否允許透過受信任的主機進行身份驗證。
為何重要
即使 /etc/pam.conf 中已停用 .rhosts 檔案的支援,停用 SSH 中的 .rhosts 檔案使用仍可提供額外的保護層。
如何檢查
執行以下命令並驗證輸出是否符合預期:
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep hostbasedauthentication
預期輸出:hostbasedauthentication no
如何修復
編輯 /etc/ssh/sshd_config 檔案,將 HostbasedAuthentication 設定為 no:
HostbasedAuthentication no
3. 禁止 root 登入 SSH
設定說明
PermitRootLogin 引數指定是否允許 root 使用者透過 SSH 登入。
為何重要
禁止 root 登入可確保管理員使用個人帳戶登入後再透過 sudo 或 su 提升許可權,從而提高安全性和可稽核性。
如何檢查
執行以下命令並驗證輸出是否符合預期:
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep permitrootlogin
預期輸出:PermitRootLogin no
如何修復
編輯 /etc/ssh/sshd_config 檔案,將 PermitRootLogin 設定為 no:
PermitRootLogin no
4. 禁止空密碼登入 SSH
設定說明
PermitEmptyPasswords 引數指定是否允許密碼為空的帳戶登入 SSH。
為何重要
禁止空密碼登入可降低未授權存取系統的風險。
如何檢查
執行以下命令並驗證輸出是否符合預期:
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep permitemptypasswords
預期輸出:PermitEmptyPasswords no
如何修復
編輯 /etc/ssh/sshd_config 檔案,將 PermitEmptyPasswords 設定為 no:
PermitEmptyPasswords no
5. 停用 SSH PermitUserEnvironment
設定說明
PermitUserEnvironment 選項允許使用者向 SSH 守護程式提供環境選項。
為何重要
允許使用者設定環境變數可能會繞過安全控制,因此停用此選項可提高安全性。
如何檢查
執行以下命令並驗證輸出是否符合預期:
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep permituserenvironment
預期輸出:PermitUserEnvironment no
如何修復
編輯 /etc/ssh/sshd_config 檔案,將 PermitUserEnvironment 設定為 no:
PermitUserEnvironment no
6. 只使用強加密演算法
設定說明
此變數限制 SSH 在通訊期間使用的加密演算法。
為何重要
弱加密演算法可能會被利用,從而導致保密性或完整性受損。
如何檢查和修復
確保 /etc/ssh/sshd_config 中的加密演算法設定符合組織的安全政策。推薦使用以下強加密演算法:
- aes256-ctr
- aes192-ctr
- aes128-ctr
編輯 /etc/ssh/sshd_config 檔案,新增或修改 Ciphers 設定:
Ciphers aes256-ctr,aes192-ctr,aes128-ctr
內容解密:
此設定的目的是確保 SSH 連線使用安全的加密演算法。透過限制允許的加密演算法,可以防止使用已知存在漏洞的弱加密演算法,從而提高連線的安全性。選擇如 aes256-ctr、aes192-ctr 和 aes128-ctr 等演算法,因為它們目前被認為是安全的,並且符合 FIPS 140-2 的要求。應根據組織的安全政策和具體需求進行調整。
加強 SSH 連線安全性:弱加密演算法、MAC 演算法與金鑰交換演算法的最佳化組態
SSH(Secure Shell)是一種用於遠端登入伺服器的網路協定,提供了加密的通訊通道以保護資料傳輸的安全。然而,若未正確組態 SSH 伺服器,可能會使用弱加密演算法、訊息鑑別碼(MAC)演算法和金鑰交換演算法,從而使連線容易受到攻擊。本文將探討如何檢查和強化 SSH 組態,以確保使用強大的加密機制。
檢查與強化加密演算法
弱加密演算法的風險
某些加密演算法由於其設計上的缺陷或金鑰長度不足,已被證明是不安全的。例如,3des-cbc、aes128-cbc、aes192-cbc 和 aes256-cbc 等演算法因其使用 CBC 模式而容易受到降級攻擊和 Padding Oracle 攻擊。
檢查與修復
檢查目前的加密演算法:
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep ciphers驗證輸出是否包含弱加密演算法,如
3des-cbc、aes128-cbc等。編輯
/etc/ssh/sshd_config: 將Ciphers行修改為只包含強加密演算法,例如:Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
程式碼範例與解析
以下是一個檢查和設定強加密演算法的完整流程範例:
# 檢查目前的加密演算法
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep ciphers
# 編輯 /etc/ssh/sshd_config 檔案
sudo sed -i 's|^Ciphers.*|Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr|' /etc/ssh/sshd_config
# 重啟 SSH 服務以套用變更
sudo systemctl restart sshd
內容解密:
sshd -T:測試 SSH 組態並輸出完整組態。-C user=root -C host="$(hostname)" -C addr="...":模擬特定條件下的連線組態。grep ciphers:過濾出與加密演算法相關的組態。sed -i 's|^Ciphers.*|Ciphers ...|' /etc/ssh/sshd_config:使用sed命令直接修改/etc/ssh/sshd_config中的Ciphers行,以設定強加密演算法。systemctl restart sshd:重啟 SSH 服務,使新的組態生效。
加強訊息鑑別碼(MAC)演算法
弱 MAC 演算法的風險
某些 MAC 演算法,如 hmac-md5、hmac-sha1 等,因其設計上的缺陷或雜湊碰撞問題,容易被利用於攻擊。
檢查與修復
檢查目前的 MAC 演算法:
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep -i "MACs"驗證輸出是否包含弱 MAC 演算法,如
hmac-md5、hmac-sha1等。編輯
/etc/ssh/sshd_config: 將MACs行修改為只包含強 MAC 演算法,例如:MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256
程式碼範例與解析
以下是一個檢查和設定強 MAC 演算法的完整流程範例:
# 檢查目前的 MAC 演算法
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep -i "MACs"
# 編輯 /etc/ssh/sshd_config 檔案
sudo sed -i 's|^MACs.*|MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256|' /etc/ssh/sshd_config
# 重啟 SSH 服務以套用變更
sudo systemctl restart sshd
內容解密:
grep -i "MACs":以不區分大小寫的方式過濾出與 MAC 演算法相關的組態。sed -i 's|^MACs.*|MACs ...|' /etc/ssh/sshd_config:使用sed命令直接修改/etc/ssh/sshd_config中的MACs行,以設定強 MAC 演算法。
加強金鑰交換演算法
弱金鑰交換演算法的風險
某些金鑰交換演算法,如 diffie-hellman-group1-sha1、diffie-hellman-group14-sha1 等,因其金鑰長度不足或雜湊演算法較弱,容易被破解。
檢查與修復
檢查目前的金鑰交換演算法:
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep kexalgorithms驗證輸出是否包含弱金鑰交換演算法。
編輯
/etc/ssh/sshd_config: 將KexAlgorithms行修改為只包含強金鑰交換演算法,例如:KexAlgorithms curve25519-sha256,[email protected],diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
程式碼範例與解析
以下是一個檢查和設定強金鑰交換演算法的完整流程範例:
# 檢查目前的金鑰交換演算法
sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep kexalgorithms
# 編輯 /etc/ssh/sshd_config 檔案
sudo sed -i 's|^KexAlgorithms.*|KexAlgorithms curve25519-sha256,[email protected],diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256|' /etc/ssh/sshd_config
# 重啟 SSH 服務以套用變更
sudo systemctl restart sshd
內容解密:
grep kexalgorithms:過濾出金鑰交換演算法相關的組態。sed -i 's|^KexAlgorithms.*|KexAlgorithms ...|' /etc/ssh/sshd_config:使用sed命令直接修改/etc/ssh/sshd_config中的KexAlgorithms行,以設定強金鑰交換演算法。
加強 SSH 安全性的組態與實踐
SSH(Secure Shell)是一種用於遠端登入伺服器的安全協定,然而,若組態不當,可能會導致安全性問題。本文將介紹如何透過組態 SSH 引數來增強系統安全性,涵蓋閒置超時設定、登入寬限時間以及存取限制等重要議題。
設定 SSH 閒置超時
為了防止未經授權的使用者存取他人的 SSH 工作階段,設定閒置超時是至關重要的。SSH 提供了兩個引數來控制閒置超時的行為:ClientAliveInterval 和 ClientAliveCountMax。
ClientAliveInterval:設定伺服器向客戶端傳送保持連線訊息的時間間隔(秒)。預設值為 0,表示不傳送保持連線訊息。ClientAliveCountMax:設定伺服器在斷開連線之前,允許客戶端未回應的最大保持連線訊息數量。預設值為 3。
舉例來說,如果 ClientAliveInterval 設定為 300 秒(5 分鐘),而 ClientAliveCountMax 設定為 3,那麼在 15 分鐘的閒置時間後,SSH 工作階段將被終止。
設定方法
- 編輯
/etc/ssh/sshd_config檔案。 - 新增或修改以下引數:
ClientAliveInterval 300 ClientAliveCountMax 3
3. 重啟 SSH 服務以套用變更。
#### 驗證組態
執行以下命令以驗證 `ClientAliveInterval` 和 `ClientAliveCountMax` 的設定:
```bash
# sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep clientaliveinterval
clientaliveinterval 300
# sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep clientalivecountmax
clientalivecountmax 3
設定 SSH 登入寬限時間
LoginGraceTime 引數用於設定成功驗證到 SSH 伺服器所需的時間。較長的寬限時間可能會允許更多的未驗證連線,從而增加遭受暴力破解攻擊的風險。
設定方法
- 編輯
/etc/ssh/sshd_config檔案。 - 新增或修改以下引數:
LoginGraceTime 60
3. 重啟 SSH 服務以套用變更。
#### 驗證組態
執行以下命令以驗證 `LoginGraceTime` 的設定:
```bash
# sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep logingracetime
logingracetime 60
限制 SSH 存取
為了提高安全性,建議限制哪些使用者和群組可以透過 SSH 存取系統。SSH 組態檔案提供了多個選項來實作這一點,包括 AllowUsers、AllowGroups、DenyUsers 和 DenyGroups。
AllowUsers:允許特定的使用者透過 SSH 存取系統。AllowGroups:允許特定的群組透過 SSH 存取系統。DenyUsers:拒絕特定的使用者透過 SSH 存取系統。DenyGroups:拒絕特定的群組透過 SSH 存取系統。
設定方法
- 編輯
/etc/ssh/sshd_config檔案。 - 新增或修改以下引數(根據需要選擇其中一個或多個):
AllowUsers
3. 重啟 SSH 服務以套用變更。
#### 驗證組態
執行以下命令以驗證相關引數的設定:
```bash
# sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep allowusers
AllowUsers <userlist>
# sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep allowgroups
AllowGroups <grouplist>
# sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep denyusers
DenyUsers <userlist>
# sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep denygroups
DenyGroups <grouplist>