返回文章列表

強化 SSH 安全性組態與實踐

本文探討如何強化 SSH 安全性組態,涵蓋啟用 IgnoreRhosts、停用 HostbasedAuthentication、禁止 root 登入、禁止空密碼登入、停用 PermitUserEnvironment、使用強加密演算法、設定閒置超時、

資安 系統管理

SSH 是遠端伺服器管理的重要工具,但其安全性組態至關重要。本文根據 CIS 控制項建議,探討如何加強 SSH 安全性,包含多個重要組態,例如禁止 root 直接登入、停用不安全的認證方式、強化加密演算法與金鑰交換機制等,並提供檢查與修復的程式碼範例,以確保伺服器免受未授權存取和攻擊。除了基本的安全強化措施外,文章也涵蓋了進階的 SSH 組態技巧,例如設定閒置超時、登入寬限時間和存取控制等,以提供更全面的防護。透過這些設定,可以有效降低伺服器遭受暴力破解、中間人攻擊等風險,並提升整體系統安全性。

加強 SSH 安全性的設定與實踐

在現代的伺服器管理中,SSH(Secure Shell)是一個至關重要的工具,用於安全地存取和管理遠端伺服器。然而,若 SSH 的設定不當,可能會導致安全性問題。本文將根據 CIS(Center for Internet Security)控制項的建議,探討如何加強 SSH 的安全性。

1. 啟用 SSH IgnoreRhosts

設定說明

IgnoreRhosts 引數指定是否使用 .rhosts.shosts 檔案進行 RhostsRSAAuthenticationHostbasedAuthentication

為何重要

啟用此引數可強制使用者在透過 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 登入可確保管理員使用個人帳戶登入後再透過 sudosu 提升許可權,從而提高安全性和可稽核性。

如何檢查

執行以下命令並驗證輸出是否符合預期:

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-ctraes192-ctraes128-ctr 等演算法,因為它們目前被認為是安全的,並且符合 FIPS 140-2 的要求。應根據組織的安全政策和具體需求進行調整。

加強 SSH 連線安全性:弱加密演算法、MAC 演算法與金鑰交換演算法的最佳化組態

SSH(Secure Shell)是一種用於遠端登入伺服器的網路協定,提供了加密的通訊通道以保護資料傳輸的安全。然而,若未正確組態 SSH 伺服器,可能會使用弱加密演算法、訊息鑑別碼(MAC)演算法和金鑰交換演算法,從而使連線容易受到攻擊。本文將探討如何檢查和強化 SSH 組態,以確保使用強大的加密機制。

檢查與強化加密演算法

弱加密演算法的風險

某些加密演算法由於其設計上的缺陷或金鑰長度不足,已被證明是不安全的。例如,3des-cbcaes128-cbcaes192-cbcaes256-cbc 等演算法因其使用 CBC 模式而容易受到降級攻擊和 Padding Oracle 攻擊。

檢查與修復

  1. 檢查目前的加密演算法

    sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep ciphers
    

    驗證輸出是否包含弱加密演算法,如 3des-cbcaes128-cbc 等。

  2. 編輯 /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

內容解密:

  1. sshd -T:測試 SSH 組態並輸出完整組態。
  2. -C user=root -C host="$(hostname)" -C addr="...":模擬特定條件下的連線組態。
  3. grep ciphers:過濾出與加密演算法相關的組態。
  4. sed -i 's|^Ciphers.*|Ciphers ...|' /etc/ssh/sshd_config:使用 sed 命令直接修改 /etc/ssh/sshd_config 中的 Ciphers 行,以設定強加密演算法。
  5. systemctl restart sshd:重啟 SSH 服務,使新的組態生效。

加強訊息鑑別碼(MAC)演算法

弱 MAC 演算法的風險

某些 MAC 演算法,如 hmac-md5hmac-sha1 等,因其設計上的缺陷或雜湊碰撞問題,容易被利用於攻擊。

檢查與修復

  1. 檢查目前的 MAC 演算法

    sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep -i "MACs"
    

    驗證輸出是否包含弱 MAC 演算法,如 hmac-md5hmac-sha1 等。

  2. 編輯 /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

內容解密:

  1. grep -i "MACs":以不區分大小寫的方式過濾出與 MAC 演算法相關的組態。
  2. sed -i 's|^MACs.*|MACs ...|' /etc/ssh/sshd_config:使用 sed 命令直接修改 /etc/ssh/sshd_config 中的 MACs 行,以設定強 MAC 演算法。

加強金鑰交換演算法

弱金鑰交換演算法的風險

某些金鑰交換演算法,如 diffie-hellman-group1-sha1diffie-hellman-group14-sha1 等,因其金鑰長度不足或雜湊演算法較弱,容易被破解。

檢查與修復

  1. 檢查目前的金鑰交換演算法

    sshd -T -C user=root -C host="$(hostname)" -C addr="$(grep $(hostname) /etc/hosts | awk '{print $1}')" | grep kexalgorithms
    

    驗證輸出是否包含弱金鑰交換演算法。

  2. 編輯 /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

內容解密:

  1. grep kexalgorithms:過濾出金鑰交換演算法相關的組態。
  2. sed -i 's|^KexAlgorithms.*|KexAlgorithms ...|' /etc/ssh/sshd_config:使用 sed 命令直接修改 /etc/ssh/sshd_config 中的 KexAlgorithms 行,以設定強金鑰交換演算法。

加強 SSH 安全性的組態與實踐

SSH(Secure Shell)是一種用於遠端登入伺服器的安全協定,然而,若組態不當,可能會導致安全性問題。本文將介紹如何透過組態 SSH 引數來增強系統安全性,涵蓋閒置超時設定、登入寬限時間以及存取限制等重要議題。

設定 SSH 閒置超時

為了防止未經授權的使用者存取他人的 SSH 工作階段,設定閒置超時是至關重要的。SSH 提供了兩個引數來控制閒置超時的行為:ClientAliveIntervalClientAliveCountMax

  • ClientAliveInterval:設定伺服器向客戶端傳送保持連線訊息的時間間隔(秒)。預設值為 0,表示不傳送保持連線訊息。
  • ClientAliveCountMax:設定伺服器在斷開連線之前,允許客戶端未回應的最大保持連線訊息數量。預設值為 3。

舉例來說,如果 ClientAliveInterval 設定為 300 秒(5 分鐘),而 ClientAliveCountMax 設定為 3,那麼在 15 分鐘的閒置時間後,SSH 工作階段將被終止。

設定方法

  1. 編輯 /etc/ssh/sshd_config 檔案。
  2. 新增或修改以下引數:

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 伺服器所需的時間。較長的寬限時間可能會允許更多的未驗證連線,從而增加遭受暴力破解攻擊的風險。

設定方法

  1. 編輯 /etc/ssh/sshd_config 檔案。
  2. 新增或修改以下引數:

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 組態檔案提供了多個選項來實作這一點,包括 AllowUsersAllowGroupsDenyUsersDenyGroups

  • AllowUsers:允許特定的使用者透過 SSH 存取系統。
  • AllowGroups:允許特定的群組透過 SSH 存取系統。
  • DenyUsers:拒絕特定的使用者透過 SSH 存取系統。
  • DenyGroups:拒絕特定的群組透過 SSH 存取系統。

設定方法

  1. 編輯 /etc/ssh/sshd_config 檔案。
  2. 新增或修改以下引數(根據需要選擇其中一個或多個):

AllowUsers AllowGroups DenyUsers DenyGroups

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>