現代伺服器安全仰賴穩固的 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
程式碼解密:
nmap --script=ssh2-enum-algos.nse 192.168.0.14 -oN ubuntuscan.txt:使用nmap的ssh2-enum-algos.nse指令碼掃描目標主機的 SSH 伺服器,列舉其支援的加密演算法,並將結果儲存到ubuntuscan.txt。Ciphers -aes128-ctr,aes192-ctr,[email protected]:在 SSH 組態檔案中,-符號用於停用列出的加密演算法。此行停用了指定的弱加密演算法。diff -y ubuntuscan.txt ubuntuscan_modified.txt:使用diff命令並排比較兩個掃描結果檔案,以視覺化展示修改前後的差異。
在 CentOS 7 上停用弱 SSH 加密演算法
CentOS 7 的預設 SSH 組態啟用了更多演算法,包括一些非常舊且不安全的演算法。此外,CentOS 不支援使用 - 符號來停用演算法;相反,需要明確列出要啟用的演算法。
操作步驟
- 掃描 CentOS 7 VM:
nmap -Pn --script=ssh2-enum-algos.nse 192.168.0.12 -oN centos7scan.txt - 修改
/etc/ssh/sshd_config:Ciphers [email protected],aes256-ctr,[email protected] KexAlgorithms ecdh-sha2-nistp384 MACs [email protected],hmac-sha2-256 - 重新載入 SSH 服務並再次掃描,然後比較結果。
程式碼解密:
nmap -Pn --script=ssh2-enum-algos.nse 192.168.0.12 -oN centos7scan.txt:對 CentOS 7 VM 進行掃描,由於防火牆設定,需新增-Pn引數。Ciphers [email protected],aes256-ctr,[email protected]:明確列出要啟用的加密演算法,以替換預設組態。
設定 RHEL 8/9 和 AlmaLinux 8/9 的系統範圍加密政策
RHEL 8/9 和 AlmaLinux 8/9 提供了一個方便的功能,允許管理員設定系統範圍的加密政策,從而影響多個服務。
操作步驟
檢視目前的加密政策:
cat /etc/crypto-policies/config通常預設為
DEFAULT。切換到
FUTURE或FIPS模式:update-crypto-policies --set FUTURE或
update-crypto-policies --set FIPS
程式碼解密:
update-crypto-policies --set FUTURE:將系統的加密政策切換到FUTURE模式,以啟用更嚴格的安全設定。
組態SSH以使用最現代、最安全的演算法
在開始之前,請先準備一台全新的 AlmaLinux 9 虛擬機器(VM)和之前使用的掃描器 VM。按照以下步驟進行操作:
驗證 AlmaLinux 9 的加密策略
- 在 AlmaLinux 9 VM 上,使用
update-crypto-policies工具驗證系統是否執行在 DEFAULT 模式:sudo update-crypto-policies --show
掃描 AlmaLinux 9 VM 的 DEFAULT 組態
- 掃描 AlmaLinux 9 VM 的 DEFAULT 組態,並將輸出儲存到檔案中:
nmap -Pn --script=ssh2-enum-algos.nse 192.168.0.17 -oN alma9_default.txt
切換到 FUTURE 模式
在 AlmaLinux 9 VM 上,將系統範圍的加密策略設定為 FUTURE:
sudo update-crypto-policies --set FUTURE在
/etc/ssh/目錄中,刪除目前的主機金鑰:sudo rm /etc/ssh/*key*重啟 VM:
sudo shutdown -r now
更新掃描器 VM 的 known_hosts
在掃描器 VM 上,開啟
~/.ssh/known_hosts檔案並刪除與 AlmaLinux VM 相關的條目。再次掃描 AlmaLinux VM,並將輸出儲存到不同的檔案中:
nmap -Pn --script=ssh2-enum-algos.nse 192.168.0.17 -oN alma9_future.txt
對比掃描結果
- 對比兩個輸出檔案,你會看到啟用的演算法數量減少了:
diff -y alma9_default.txt alma9_future.txt
檢視加密策略後端檔案
檢視
/etc/crypto-policies/back-ends/目錄中的檔案:ls -l /etc/crypto-policies/back-ends/你會看到符號連結指向 FUTURE 目錄中的檔案。
檢視主機金鑰
- 檢視
/etc/ssh/目錄中的主機金鑰,並與之前的組態進行比較:ls -l /etc/ssh/*key*
掃描 FIPS 模式下的 AlmaLinux 9 VM
- 掃描之前在第 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
通常,我們只關心 INFO 和 VERBOSE 這兩個級別。INFO 是預設級別,而 VERBOSE 是另一個在正常情況下會使用的級別。
Hands-on Lab:組態更詳細的 SSH 日誌記錄
開啟主要的日誌檔案,滾動到你登入時建立的日誌條目,並觀察其內容。
# 在 Ubuntu 上執行: sudo less /var/log/auth.log # 在 CentOS 或 AlmaLinux 上執行: sudo less /var/log/secure將 SSH 日誌記錄級別設定為
DEBUG3,以觀察其記錄的內容。編輯
/etc/ssh/sshd_config檔案,將LogLevel修改為DEBUG3,然後重新載入 SSH 服務。# 在 Ubuntu 上執行: sudo systemctl reload ssh # 在 CentOS 或 AlmaLinux 上執行: sudo systemctl reload sshd登出並重新登入 SSH,然後檢視系統日誌檔案中的新條目。
將
LogLevel修改回VERBOSE,重新載入 SSH 服務,並再次登出和登入,檢視日誌檔案中的條目。
內容解密:
透過將日誌記錄級別設定為 VERBOSE,可以記錄用於登入的金鑰指紋,這對於金鑰管理非常有幫助。
使用白名單和 TCP Wrappers 組態存取控制
除了要求客戶端透過金鑰交換進行身份驗證外,還可以設定存取控制機制,以允許特定的使用者、組或客戶機登入到 SSH 伺服器。這些機制包括:
- 在
sshd_config檔案中設定白名單 - 使用
/etc/hosts.allow和/etc/hosts.deny檔案進行 TCP Wrappers 控制
存取控制有兩種哲學:黑名單和白名單。白名單是首選方法,因為它明確允許特定的人或機器存取。
在 sshd_config 中組態白名單
首先,讓我們看看如何在 sshd_config 中建立白名單。
組態 SSH 連線的存取控制
在 sshd_config 檔案中,可以設定四個主要的存取控制指令,分別是:
DenyUsersAllowUsersDenyGroupsAllowGroups
每個指令都可以指定多個使用者名稱或群組名稱,名稱之間以空白間隔。
這些指令的處理順序非常重要,它們按照上述的順序進行處理。換句話說,如果使用者同時被列在 DenyUsers 和 AllowUsers 指令中,DenyUsers 將優先生效。如果使用者被列在 DenyUsers 中,並且是某個被列在 AllowGroups 中的群組成員,DenyUsers 仍然會優先生效。
實驗:組態 sshd_config 中的白名單
- 在虛擬機器中為 Frank、Charlie 和 Maggie 建立使用者帳戶。在 Ubuntu 上,使用以下指令:
sudo adduser frank
在 CentOS 或 AlmaLinux 上,使用以下指令:
```bash
sudo useradd frank
sudo passwd frank
- 建立
webadmins群組,並將 Frank 新增至該群組:
sudo groupadd webadmins sudo usermod -a -G webadmins frank
3. 從主機或其他虛擬機器,讓三位使用者登入,然後登出。
4. 在 `/etc/ssh/sshd_config` 檔案的底部新增一行 `AllowUsers`,並填入自己的使用者名稱,例如:
```
AllowUsers donnie
- 重新啟動或重新載入 SSH 服務,並確認服務已正確啟動。在 Ubuntu 上,使用以下指令:
sudo systemctl restart ssh sudo systemctl status ssh
在 CentOS 上,使用以下指令:
```bash
sudo systemctl restart sshd
sudo systemctl status sshd
- 重複步驟 3。這次,三位使用者應該無法登入。
- 在
/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 進行存取控制。