返回文章列表

強化 SSH 伺服器安全設定

本文探討如何強化 SSH 伺服器安全性,涵蓋停用弱加密演算法、設定系統範圍加密政策以及使用白名單和 TCP Wrappers 等存取控制機制。文章以 Ubuntu 22.04 和 CentOS 7 為例,逐步講解如何修改 SSH 組態檔案以停用弱加密演算法,並說明如何使用 nmap

資安 系統管理

現代伺服器安全仰賴穩固的 SSH 設定。預設 SSH 設定常包含過時或安全性不足的加密演算法,本文將引導讀者在 Ubuntu 和 CentOS 系統中停用這些弱點,並介紹在 RHEL/AlmaLinux 系統中設定更嚴格的加密策略。同時,我們也將探討如何利用 sshd_config 和 TCP Wrappers 建立白名單機制,有效限制 SSH 存取,提升系統整體安全性。這些步驟能有效降低伺服器遭受攻擊的風險,確保系統運作的安全性。

強化 SSH 伺服器安全性:停用弱加密演算法

在現代網路安全中,SSH(Secure Shell)伺服器的組態至關重要。預設情況下,許多 Linux 發行版啟用了多種加密演算法,其中一些已經過時且存在安全風險。本文將指導如何在 Ubuntu 22.04 和 CentOS 7 上停用弱 SSH 加密演算法,並介紹 RHEL 8/9 和 AlmaLinux 8/9 的系統範圍加密政策設定。

為何停用弱加密演算法?

SSH 伺服器支援多種加密演算法,包括一些已知的弱演算法。這些弱演算法可能被惡意攻擊者利用,從而危及伺服器的安全性。根據 NIST(美國國家標準與技術研究院)的建議,應當停用已知弱或過時的加密演算法,以確保 SSH 連線的安全性。

在 Ubuntu 22.04 上停用弱 SSH 加密演算法

步驟 1:掃描 SSH 伺服器

首先,使用 nmap 工具掃描 Ubuntu 22.04 VM 的 SSH 伺服器,並將結果儲存到檔案中:

nmap --script=ssh2-enum-algos.nse 192.168.0.14 -oN ubuntuscan.txt

計算檔案中的行數,以瞭解當前啟用的演算法數量:

wc -l ubuntuscan.txt

步驟 2:修改 SSH 組態檔案

編輯 /etc/ssh/sshd_config 檔案,在 # Ciphers and keying 下方新增以下三行:

Ciphers -aes128-ctr,aes192-ctr,[email protected]
KexAlgorithms ecdh-sha2-nistp384
MACs [email protected],hmac-sha1,[email protected],[email protected],[email protected]

儲存檔案並重新啟動 SSH 服務:

sudo systemctl restart ssh
sudo systemctl status ssh

步驟 3:再次掃描並比較結果

再次掃描 SSH 伺服器並將結果儲存到新檔案中:

nmap --script=ssh2-enum-algos.nse 192.168.0.14 -oN ubuntuscan_modified.txt

比較原始掃描結果與修改後的結果:

diff -y ubuntuscan.txt ubuntuscan_modified.txt

程式碼解密:

  1. nmap --script=ssh2-enum-algos.nse 192.168.0.14 -oN ubuntuscan.txt:使用 nmapssh2-enum-algos.nse 指令碼掃描目標主機的 SSH 伺服器,列舉其支援的加密演算法,並將結果儲存到 ubuntuscan.txt
  2. Ciphers -aes128-ctr,aes192-ctr,[email protected]:在 SSH 組態檔案中,- 符號用於停用列出的加密演算法。此行停用了指定的弱加密演算法。
  3. diff -y ubuntuscan.txt ubuntuscan_modified.txt:使用 diff 命令並排比較兩個掃描結果檔案,以視覺化展示修改前後的差異。

在 CentOS 7 上停用弱 SSH 加密演算法

CentOS 7 的預設 SSH 組態啟用了更多演算法,包括一些非常舊且不安全的演算法。此外,CentOS 不支援使用 - 符號來停用演算法;相反,需要明確列出要啟用的演算法。

操作步驟

  1. 掃描 CentOS 7 VM
    nmap -Pn --script=ssh2-enum-algos.nse 192.168.0.12 -oN centos7scan.txt
    
  2. 修改 /etc/ssh/sshd_config
    Ciphers [email protected],aes256-ctr,[email protected]
    KexAlgorithms ecdh-sha2-nistp384
    MACs [email protected],hmac-sha2-256
    
  3. 重新載入 SSH 服務並再次掃描,然後比較結果。

程式碼解密:

  1. nmap -Pn --script=ssh2-enum-algos.nse 192.168.0.12 -oN centos7scan.txt:對 CentOS 7 VM 進行掃描,由於防火牆設定,需新增 -Pn 引數。
  2. Ciphers [email protected],aes256-ctr,[email protected]:明確列出要啟用的加密演算法,以替換預設組態。

設定 RHEL 8/9 和 AlmaLinux 8/9 的系統範圍加密政策

RHEL 8/9 和 AlmaLinux 8/9 提供了一個方便的功能,允許管理員設定系統範圍的加密政策,從而影響多個服務。

操作步驟

  1. 檢視目前的加密政策

    cat /etc/crypto-policies/config
    

    通常預設為 DEFAULT

  2. 切換到 FUTUREFIPS 模式

    update-crypto-policies --set FUTURE
    

    update-crypto-policies --set FIPS
    

程式碼解密:

  1. update-crypto-policies --set FUTURE:將系統的加密政策切換到 FUTURE 模式,以啟用更嚴格的安全設定。

組態SSH以使用最現代、最安全的演算法

在開始之前,請先準備一台全新的 AlmaLinux 9 虛擬機器(VM)和之前使用的掃描器 VM。按照以下步驟進行操作:

驗證 AlmaLinux 9 的加密策略

  1. 在 AlmaLinux 9 VM 上,使用 update-crypto-policies 工具驗證系統是否執行在 DEFAULT 模式:
    sudo update-crypto-policies --show
    

掃描 AlmaLinux 9 VM 的 DEFAULT 組態

  1. 掃描 AlmaLinux 9 VM 的 DEFAULT 組態,並將輸出儲存到檔案中:
    nmap -Pn --script=ssh2-enum-algos.nse 192.168.0.17 -oN alma9_default.txt
    

切換到 FUTURE 模式

  1. 在 AlmaLinux 9 VM 上,將系統範圍的加密策略設定為 FUTURE:

    sudo update-crypto-policies --set FUTURE
    
  2. /etc/ssh/ 目錄中,刪除目前的主機金鑰:

    sudo rm /etc/ssh/*key*
    
  3. 重啟 VM:

    sudo shutdown -r now
    

更新掃描器 VM 的 known_hosts

  1. 在掃描器 VM 上,開啟 ~/.ssh/known_hosts 檔案並刪除與 AlmaLinux VM 相關的條目。

  2. 再次掃描 AlmaLinux VM,並將輸出儲存到不同的檔案中:

    nmap -Pn --script=ssh2-enum-algos.nse 192.168.0.17 -oN alma9_future.txt
    

對比掃描結果

  1. 對比兩個輸出檔案,你會看到啟用的演算法數量減少了:
    diff -y alma9_default.txt alma9_future.txt
    

檢視加密策略後端檔案

  1. 檢視 /etc/crypto-policies/back-ends/ 目錄中的檔案:

    ls -l /etc/crypto-policies/back-ends/
    

    你會看到符號連結指向 FUTURE 目錄中的檔案。

檢視主機金鑰

  1. 檢視 /etc/ssh/ 目錄中的主機金鑰,並與之前的組態進行比較:
    ls -l /etc/ssh/*key*
    

掃描 FIPS 模式下的 AlmaLinux 9 VM

  1. 掃描之前在第 6 章中設定為 FIPS 模式的 AlmaLinux 9 VM,並將結果與 DEFAULT 和 FUTURE 模式的掃描結果進行比較。

內容解密:

此步驟展示瞭如何組態 AlmaLinux 9 VM 使用更安全的加密演算法。透過將加密策略從 DEFAULT 切換到 FUTURE,可以停用一些較不安全的演算法,從而提高安全性。

組態更詳細的 SSH 日誌記錄

在預設組態下,SSH 已經會在有人透過 SSH、SCP 或 SFTP 登入時建立日誌條目。在 Debian/Ubuntu 系統上,日誌條目被寫入 /var/log/auth.log 檔案;在 Red Hat/CentOS/AlmaLinux 系統上,日誌條目被寫入 /var/log/secure 檔案。

修改 SSH 日誌記錄級別

透過修改 sshd_config 檔案中的 LogLevel 引數,可以調整 SSH 日誌記錄的詳細程度。可用的級別包括:

  • QUIET
  • FATAL
  • ERROR
  • INFO
  • VERBOSE
  • DEBUG 或 DEBUG1
  • DEBUG2
  • DEBUG3

通常,我們只關心 INFOVERBOSE 這兩個級別。INFO 是預設級別,而 VERBOSE 是另一個在正常情況下會使用的級別。

Hands-on Lab:組態更詳細的 SSH 日誌記錄

  1. 開啟主要的日誌檔案,滾動到你登入時建立的日誌條目,並觀察其內容。

    # 在 Ubuntu 上執行:
    sudo less /var/log/auth.log
    
    # 在 CentOS 或 AlmaLinux 上執行:
    sudo less /var/log/secure
    
  2. 將 SSH 日誌記錄級別設定為 DEBUG3,以觀察其記錄的內容。

  3. 編輯 /etc/ssh/sshd_config 檔案,將 LogLevel 修改為 DEBUG3,然後重新載入 SSH 服務。

    # 在 Ubuntu 上執行:
    sudo systemctl reload ssh
    
    # 在 CentOS 或 AlmaLinux 上執行:
    sudo systemctl reload sshd
    
  4. 登出並重新登入 SSH,然後檢視系統日誌檔案中的新條目。

  5. LogLevel 修改回 VERBOSE,重新載入 SSH 服務,並再次登出和登入,檢視日誌檔案中的條目。

內容解密:

透過將日誌記錄級別設定為 VERBOSE,可以記錄用於登入的金鑰指紋,這對於金鑰管理非常有幫助。

使用白名單和 TCP Wrappers 組態存取控制

除了要求客戶端透過金鑰交換進行身份驗證外,還可以設定存取控制機制,以允許特定的使用者、組或客戶機登入到 SSH 伺服器。這些機制包括:

  • sshd_config 檔案中設定白名單
  • 使用 /etc/hosts.allow/etc/hosts.deny 檔案進行 TCP Wrappers 控制

存取控制有兩種哲學:黑名單和白名單。白名單是首選方法,因為它明確允許特定的人或機器存取。

在 sshd_config 中組態白名單

首先,讓我們看看如何在 sshd_config 中建立白名單。

組態 SSH 連線的存取控制

sshd_config 檔案中,可以設定四個主要的存取控制指令,分別是:

  • DenyUsers
  • AllowUsers
  • DenyGroups
  • AllowGroups

每個指令都可以指定多個使用者名稱或群組名稱,名稱之間以空白間隔。

這些指令的處理順序非常重要,它們按照上述的順序進行處理。換句話說,如果使用者同時被列在 DenyUsersAllowUsers 指令中,DenyUsers 將優先生效。如果使用者被列在 DenyUsers 中,並且是某個被列在 AllowGroups 中的群組成員,DenyUsers 仍然會優先生效。

實驗:組態 sshd_config 中的白名單

  1. 在虛擬機器中為 Frank、Charlie 和 Maggie 建立使用者帳戶。在 Ubuntu 上,使用以下指令:

sudo adduser frank

    在 CentOS 或 AlmaLinux 上,使用以下指令:
    ```bash
sudo useradd frank
sudo passwd frank
  1. 建立 webadmins 群組,並將 Frank 新增至該群組:

sudo groupadd webadmins sudo usermod -a -G webadmins frank

3.  從主機或其他虛擬機器,讓三位使用者登入,然後登出。
4.  在 `/etc/ssh/sshd_config` 檔案的底部新增一行 `AllowUsers`,並填入自己的使用者名稱,例如:
    ```
AllowUsers donnie
  1. 重新啟動或重新載入 SSH 服務,並確認服務已正確啟動。在 Ubuntu 上,使用以下指令:

sudo systemctl restart ssh sudo systemctl status ssh

    在 CentOS 上,使用以下指令:
    ```bash
sudo systemctl restart sshd
sudo systemctl status sshd
  1. 重複步驟 3。這次,三位使用者應該無法登入。
  2. /etc/ssh/sshd_config 檔案中新增一行 AllowGroups,並指定 webadmins 群組,例如:

AllowGroups webadmins

8.  重新啟動 SSH 服務,並確認服務已正確啟動。
9.  從主機或其他虛擬機器,讓 Frank 登入。由於 `AllowUsers` 指令優先於 `AllowGroups`,因此 Frank 將被拒絕登入。
10. 開啟 `sshd_config` 檔案並移除之前新增的 `AllowUsers` 行。重新啟動 SSH 服務,並確認服務已正確啟動。
11. 試著登入自己的帳戶和其他使用者的帳戶。只有 Frank 能夠成功登入。
12. 從虛擬機器的本機控制檯登入自己的帳戶。刪除 `sshd_config` 中的 `AllowGroups` 行,並重新啟動 SSH 服務。

#### 使用 TCP Wrappers 組態白名單

TCP Wrappers 是一種簡單的概念,但名稱特殊。它監聽傳入的網路連線,並允許或拒絕連線請求。白名單和黑名單組態於 `/etc/hosts.allow` 和 `/etc/hosts.deny` 檔案中。這兩個檔案共同作用,先查詢 `hosts.allow`,如果找到相應的白名單專案,則跳過查詢 `hosts.deny`。如果連線請求的來源未在白名單中,TCP Wrappers 將查詢 `hosts.deny`。如果 `hosts.deny` 中沒有相應的拒絕規則,則連線請求仍將透過。

需要注意的是,Red Hat 已從 RHEL 8/9 及其衍生版本中移除 TCP Wrappers。因此,如果要練習相關技術,請使用 Ubuntu 或 CentOS 7 虛擬機器。

### 組態 TCP Wrappers 的注意事項

*   總是先組態 `hosts.allow`,再組態 `hosts.deny`。因為儲存任一檔案後,新組態會立即生效。如果先組態 `hosts.deny` 而你正在遠端登入,則 SSH 連線將會斷開。
*   若要將單一 IP 位址加入白名單,請在 `/etc/hosts.allow` 中新增一行,例如:
    ```
SSHD: 192.168.0.225
然後,在 `/etc/hosts.deny` 中新增一行,例如:
```

SSHD: ALL


#### 圖表說明:TCP Wrappers 處理流程
```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 強化 SSH 伺服器安全設定

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

圖表翻譯: 此圖示展示了 TCP Wrappers 的處理流程。當有連線請求時,首先檢查 hosts.allow。如果請求被允許,則直接允許連線。如果未被允許,則進一步檢查 hosts.deny。如果在 hosts.deny 中被拒絕,則拒絕連線。如果兩者都未指定,則預設允許連線。

TCP Wrappers 的優點與限制

TCP Wrappers 提供了一種簡單有效的方式來控制網路連線。然而,由於 Red Hat 已從其最新版本中移除該功能,因此在使用最新版本的 RHEL 或其衍生版本時,需要考慮其他替代方案,如使用 firewalld 進行存取控制。