在當今網路環境中,伺服器安全至關重要。本文將引導您如何在 RHEL 9 和 AlmaLinux 9 系統上強化 Apache SSL/TLS 設定。透過系統內建的加密政策工具,您可以輕鬆切換到更安全的加密設定,例如 FUTURE 模式,以停用過時且不安全的加密演算法。文章也會逐步說明如何在 FUTURE 模式下正確安裝和設定 Apache 與 mod_ssl,並使用 sslscan 工具驗證設定的安全性。此外,我們也將探討如何在安裝過程中啟用 FIPS 模式,以符合更嚴格的美國聯邦資訊處理標準。對於仍在使用 RHEL 7/CentOS 7 的使用者,文章也提供對應的強化組態方法,以確保伺服器安全。

加強 Apache SSL/TLS 在 RHEL 9/AlmaLinux 9 上的安全性

在現代網路環境中,確保伺服器與客戶端之間的通訊安全是至關重要的。Red Hat Enterprise Linux 9(RHEL 9)及其衍生版本 AlmaLinux 9 提供了一種簡便的方法來加強 SSL/TLS 的組態,從而提高伺服器的安全性。本文將介紹如何使用加密政策(Crypto Policies)來增強 Apache 伺服器在 RHEL 9/AlmaLinux 9 上的 SSL/TLS 組態。

使用加密政策

RHEL 9/AlmaLinux 9 引入了加密政策,這是一種簡化 SSL/TLS 組態的方法。透過使用 update-crypto-policies 命令,可以輕鬆地在不同的加密政策之間切換。

設定 DEFAULT 模式

預設情況下,系統使用 DEFAULT 加密政策。這個模式提供了 TLSv1.2 和 TLSv1.3 的支援。

sudo update-crypto-policies --show

設定 FUTURE 模式

FUTURE 模式是一種更為嚴格的加密政策,它停用了一些舊的、不安全的加密演算法。要啟用 FUTURE 模式,請執行:

sudo update-crypto-policies --set FUTURE

啟用 FUTURE 模式後,需要重新啟動相關服務,以使變更生效。


#### 內容解密:
此命令用於設定系統的加密政策為 FUTURE 模式。FUTURE 模式會停用一些不安全的加密演算法,從而提高系統的安全性。

在 FUTURE 模式下安裝 Apache

在設定 FUTURE 模式後,需要安裝 Apache 和 mod_ssl。

sudo dnf install httpd mod_ssl
sudo systemctl enable --now httpd

內容解密:

此步驟安裝了 Apache 和 mod_ssl,並啟用了 Apache 服務。確保在 FUTURE 模式下安裝 Apache,以避免使用不安全的加密演算法。

掃描 Apache 伺服器

使用 sslscan 工具掃描 Apache 伺服器,以檢查其 SSL/TLS 組態。

sslscan <your_server_ip>

內容解密:

此命令用於掃描 Apache 伺服器的 SSL/TLS 組態,檢查其支援的加密演算法和協定版本。

設定 FIPS 模式

FIPS(Federal Information Processing Standards)是一種美國政府制定的安全標準。要在 RHEL 9/AlmaLinux 9 上啟用 FIPS 模式,需要在安裝作業系統時進行設定。

  1. 在安裝 AlmaLinux 時,按下 Tab 鍵編輯核心選項。
  2. 在核心選項行末尾新增 fips=1

#### 圖表翻譯:
此圖示展示瞭如何在 AlmaLinux 安裝過程中啟用 FIPS 模式。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title RHEL AlmaLinux Apache SSL TLS 安全性強化

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

圖表翻譯:

此圖示呈現了在 AlmaLinux 安裝過程中啟用 FIPS 模式的步驟,包括按下 Tab 鍵、編輯核心選項、新增 fips=1 以及繼續安裝。

在 RHEL 7/CentOS 7 上加強 Apache SSL/TLS

在 RHEL 7/CentOS 7 上,可以透過編輯 /etc/httpd/conf.d/ssl.conf 檔案來加強 Apache 的 SSL/TLS 組態。

SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!3DES:!aNULL:!MD5:!SEED:!IDEA:!SHA

#### 內容解密:
此組態停用了不安全的 SSL/TLS 協定和加密演算法,從而提高了 Apache 伺服器的安全性。

量子抗性加密演算法介紹

你可能已經聽說過量子電腦,它們與過去電視上的《Quantum Leap》節目無關。這種新型電腦仍處於實驗階段,可能在一段時間內仍將保持如此。儘管如此,關於它們在最終投入生產使用時將會如何的炒作仍然很多。據稱,它們將會比目前一代的電腦強大得多,並且能夠輕易破解目前最強的加密演算法。確實,這是一個相當嚇人的預測。(或許此刻我在萬聖節這天輸入這些文字是合適的,這是一年中最嚇人的日子。)

儘管有人對這一預測是否會成真,或是生產級別的量子電腦是否會問世表示懷疑,美國聯邦政府卻非常重視這件事。以下是美國國家標準與技術研究所(NIST)目前推薦的量子抗性演算法清單:

  • CRYSTALS-Kyber:用於通用加密。Cloudflare、Amazon和IBM已經在使用它。
  • CRYSTALS-Dilithium:用於加密數位簽章。NIST推薦它作為主要的簽章演算法。
  • FALCON:也是一種簽章演算法。NIST建議在需要比CRYSTALS-Dilithium提供的簽章更小的情況下使用它。
  • SPHINCS+:第三種簽章演算法,比前兩種更慢且更大。它使用了與前兩種不同的方式,這就是為什麼NIST將其作為備份,以防前兩種被破解。

那麼,我們如何知道某個特定的加密演算法能夠抵抗量子電腦破解,如果可行的量子電腦尚不存在?好吧,我希望我能告訴你,但我不能。無論如何,你可能暫時不必太過擔心這件事,但瞭解它仍然是值得的。

好了,讓我們結束這部分,進入下一章。

問題

  1. 以下哪一項不是GPG的優勢?

    • A. 它使用強大、難以破解的演算法。
    • B. 它非常適合與你不認識的人分享秘密。
    • C. 其公鑰/私鑰方案消除了分享密碼的需要。
    • D. 你可以用它來加密你不打算分享的檔案,供自己個人使用。
  2. 你需要向Frank傳送一條加密訊息。在使用GPG加密他的訊息之前,你必須做什麼,以避免分享密碼?

    • A. 什麼都不做。只需用你自己的私鑰加密訊息。
    • B. 將Frank的私鑰匯入你的鑰匙圈,並將你的私鑰傳送給Frank。
    • C. 將Frank的公鑰匯入你的鑰匙圈,並將你的公鑰傳送給Frank。
    • D. 只需將Frank的公鑰匯入你的鑰匙圈。
    • E. 只需將Frank的私鑰匯入你的鑰匙圈。
  3. 以下哪一項是用於Linux系統上全磁碟加密的正確選擇?

    • A. Bitlocker
    • B. VeraCrypt
    • C. eCryptfs
    • D. LUKS
  4. 如果你使用eCryptfs來加密使用者的家目錄,而你沒有使用全磁碟加密,那麼為了防止敏感資料洩露,你還必須採取什麼其他行動?

    • A. 無需任何行動。
    • B. 確保使用者使用強大的私鑰。
    • C. 加密交換分割區。
    • D. 你必須以全磁碟模式使用eCryptfs。
  5. 在以下哪種情況下,你會使用VeraCrypt?

    • A. 當你想要實作全磁碟加密時。
    • B. 當你只想加密使用者的家目錄時。
    • C. 當你更喜歡使用專有的、閉源的加密系統時。
    • D. 當你需要建立可以與Windows、macOS和BSD使用者分享的加密容器時。
  6. 你需要確保你的網頁瀏覽器信任來自Dogtag CA的憑證。你該怎麼做?

    • A. 你使用pki-server匯出CA憑證和金鑰,然後使用openssl pkcs12提取憑證。然後,將憑證匯入你的瀏覽器。
    • B. 你將ca_admin.cert憑證匯入你的瀏覽器。
    • C. 你將ca_admin_cert.p12憑證匯入你的瀏覽器。
    • D. 你將snakeoil.pem憑證匯入你的瀏覽器。

進一步閱讀

關於TLS和OpenSSL的解釋:

  • OpenSSL教學:SSL憑證、私鑰和CSR如何工作?:https://phoenixnap.com/kb/openssl-tutorial-ssl-certificates-private-keys-csrs
  • Red Hat 8中的Transport Layer Security版本1.3:https://www.redhat.com/en/blog/transport-layer-security-version-13-red-hat-enterprise-linux-8
  • OpenSSL官網:https://www.openssl.org/
  • Feisty Duck Publishing,提供關於OpenSSL的書籍、培訓和通訊:https://www.feistyduck.com/

關於EV憑證的問題:

  • Chrome瀏覽器將EV UI移至頁面資訊:https://chromium.googlesource.com/chromium/src/+/HEAD/docs/security/ev-to-page-info.md
  • 擴充套件驗證被破壞:https://www.cyberscoop.com/easy-fake-extended-validation-certificates-research-shows/
  • 使用「預設城市」作為地點頒發的EV憑證:https://groups.google.com/forum/#!topic/mozilla.dev.security.policy/1oReSOPCNy0
  • 包含錯誤資訊的EV憑證:https://twitter.com/Scott_Helme/status/1163546360328740864

關於免費Let’s Encrypt憑證的問題:

加強 SSH 的安全性

SSH 強化技術概述

Secure Shell(SSH)是 Linux 系統管理員必備的工具之一。它允許管理員從遠端安全地存取 Linux 伺服器,無需親自進入伺服器機房。SSH 的安全性建立在對所有傳輸的資料進行加密的基礎上,這樣可以防止駭客透過網路嗅探器竊取敏感資訊。

本章重點

本章將介紹如何強化 SSH 的預設設定,包括:

  • 停用 SSH 協定版本 1
  • 建立和管理無密碼登入的金鑰
  • 停用 root 使用者登入
  • 停用使用者名稱/密碼登入
  • 啟用雙因素驗證
  • 組態強加密演算法
  • 在 RHEL 8/9 系統上設定系統範圍的加密策略
  • 在 RHEL 8/9 系統上啟用 FIPS 模式
  • 組態更詳細的日誌記錄
  • 使用白名單和 TCP Wrappers 進行存取控制
  • 組態自動登出和安全橫幅
  • 其他雜項安全設定
  • 為不同主機設定不同的 SSH 組態
  • 為不同使用者和群組設定不同的 SSH 組態
  • 掃描 SSH 伺服器漏洞
  • 為 SFTP 使用者設定 chroot 環境
  • 使用 SSHFS 設定共用目錄
  • 從 Windows 桌面遠端連線

確保 SSH 協定版本 1 已停用

在過去的版本中,SSH 協定版本 1 存在嚴重的安全漏洞,因此需要確保在 /etc/ssh/sshd_config 檔案中停用它。不過,目前 SSH 協定版本 1 已經被完全淘汰,因此不再需要擔心這個問題。

建立和管理無密碼登入的金鑰

使用 SSH 金鑰對進行無密碼登入是一種比使用使用者名稱和密碼更安全的方式。駭客可以利用自動化工具對 SSH 伺服器進行暴力密碼破解攻擊,尤其是當允許 root 使用者透過 SSH 登入時。

建立使用者的 SSH 金鑰對

每位使用者都可以在其客戶端機器上建立自己的私鑰和公鑰。建立金鑰對的過程在不同作業系統(包括 Linux、macOS 和 Windows 上的 Cygwin 或 Bash Shell)中都相同。

目前有幾種不同型別的金鑰可供選擇,預設是 3072 位元的 RSA 金鑰。美國國家標準與技術研究所(NIST)建議使用至少 3072 位元的 RSA 金鑰或至少 384 位元的橢圓曲線數位簽章演算法(ECDSA)金鑰,以應對未來量子運算的威脅。

# 建立 3072 位元的 RSA 金鑰對
ssh-keygen -t rsa -b 3072

# 檢視產生的公鑰和私鑰檔案
ls ~/.ssh/id_rsa*

金鑰生成過程解密:

  1. ssh-keygen 是用於生成 SSH 金鑰對的命令。
  2. -t rsa 指定金鑰型別為 RSA。
  3. -b 3072 指定金鑰長度為 3072 位元。
  4. 生成的公鑰儲存在 ~/.ssh/id_rsa.pub,私鑰儲存在 ~/.ssh/id_rsa

使用公鑰進行 SSH 登入

將公鑰傳輸到遠端伺服器,並將其新增到 ~/.ssh/authorized_keys 檔案中,即可實作無密碼登入。

# 將公鑰複製到遠端伺服器
ssh-copy-id donnie@192.168.0.8

# 登入遠端伺服器,無需輸入密碼
ssh donnie@192.168.0.8

公鑰複製過程解密:

  1. ssh-copy-id 命令將本地主機上的公鑰複製到遠端主機的 ~/.ssh/authorized_keys 檔案中。
  2. 成功複製後,即可無密碼登入遠端主機。

安全的 SSH 金鑰生成與管理

在現代的資訊安全領域中,SSH 金鑰的安全管理至關重要。本文將介紹如何生成與管理 SSH 金鑰,並探討不同型別的金鑰及其優缺點。

生成 SSH 金鑰

首先,我們需要在 Ubuntu 22.04 使用者端上生成 SSH 金鑰。預設情況下,ssh-keygen 命令會生成一對 3072 位元的 RSA 金鑰。

donnie@ubuntu2204-packt:~$ ssh-keygen

執行此命令後,系統會提示您輸入金鑰的儲存位置和名稱。直接按下 Enter 鍵即可接受預設值。

內容解密:

  • ssh-keygen 是用於生成 SSH 金鑰的命令。
  • 預設生成 3072 位元的 RSA 金鑰對。
  • 系統會提示輸入金鑰的儲存位置和名稱,預設儲存在 ~/.ssh 目錄下。

您可以在 .ssh 目錄下看到新生成的金鑰:

donnie@ubuntu2204-packt:~$ ls -l .ssh
total 16
-rw
---
---
- 1 donnie donnie 0 Oct 6 22:09 authorized_keys
-rw
---
---
- 1 donnie donnie 2655 Nov 1 19:49 id_rsa
-rw-r--r-- 1 donnie donnie 577 Nov 1 19:49 id_rsa.pub
-rw
---
---
- 1 donnie donnie 978 Oct 26 20:41 known_hosts
-rw-r--r-- 1 donnie donnie 142 Oct 26 20:41 known_hosts.old
donnie@ubuntu2204-packt:~$

內容解密:

  • id_rsa 是私鑰,只有使用者本人可讀寫。
  • id_rsa.pub 是公鑰,需要被共用給遠端伺服器。

不同型別的 SSH 金鑰

除了 RSA 金鑰外,我們還可以生成 ECDSA 和 Ed25519 金鑰。

生成 ECDSA 金鑰

donnie@ubuntu2204-packt:~$ ssh-keygen -t ecdsa -b 384

內容解密:

  • -t ecdsa 指定生成 ECDSA 金鑰。
  • -b 384 指定金鑰長度為 384 位元。

ECDSA 金鑰的優點是其短金鑰長度具有與 RSA 長金鑰相當的安全性,且所需的運算資源較少。

生成 Ed25519 金鑰

donnie@ubuntu2204-packt:~$ ssh-keygen -t ed25519

內容解密:

  • -t ed25519 指定生成 Ed25519 金鑰。
  • Ed25519 金鑰具有抗側通道攻擊的能力,且不受隨機數生成器的影響。

Ed25519 金鑰的缺點是其不被 NIST 推薦,且某些舊版 SSH 使用者端不支援。

將公鑰傳輸到遠端伺服器

在生成金鑰後,我們需要將公鑰傳輸到遠端伺服器。首先,需要將私鑰新增到 SSH agent 中:

donnie@ubuntu2204-packt:~$ exec /usr/bin/ssh-agent $SHELL
donnie@ubuntu2204-packt:~$ ssh-add
Enter passphrase for /home/donnie/.ssh/id_rsa:
Identity added: /home/donnie/.ssh/id_rsa (donnie@ubuntu2204-packt)
Identity added: /home/donnie/.ssh/id_ecdsa (donnie@ubuntu2204-packt)
Identity added: /home/donnie/.ssh/id_ed25519 (donnie@ubuntu2204-packt)
donnie@ubuntu2204-packt:~$

內容解密:

  • ssh-agent 是用於管理 SSH 私鑰的代理程式。
  • ssh-add 將私鑰新增到 ssh-agent 中。

使用 SSH 金鑰進行安全登入

在前面的章節中,我們已經瞭解瞭如何使用 SSH 進行遠端登入。然而,使用密碼進行身份驗證存在一定的安全風險。為了提高安全性,我們可以使用 SSH 金鑰對來進行身份驗證。

建立 SSH 金鑰對

首先,我們需要在客戶端機器上建立一對 SSH 金鑰。可以使用 ssh-keygen 命令來建立金鑰對:

ssh-keygen -t ecdsa -b 384

這將建立一對 384 位元的橢圓曲線金鑰。

內容解密:

  • -t ecdsa 指定了金鑰的型別為 ECDSA。
  • -b 384 指定了金鑰的位元數為 384。

將公鑰傳輸到伺服器

建立金鑰對後,我們需要將公鑰傳輸到伺服器上。可以使用 ssh-copy-id 命令來實作:

ssh-copy-id donnie@192.168.0.17

這將把公鑰傳輸到 192.168.0.17 伺服器上的 donnie 使用者帳戶。

內容解密:

  • ssh-copy-id 命令將公鑰傳輸到遠端伺服器。
  • 需要輸入遠端伺服器上的使用者密碼。

使用 SSH 金鑰進行登入

傳輸公鑰後,我們可以使用 SSH 金鑰進行登入:

ssh donnie@192.168.0.17

如果一切正常,我們將可以直接登入伺服器而無需輸入密碼。

內容解密:

  • 使用 SSH 金鑰進行身份驗證。
  • 如果私鑰沒有被加入到 session keyring 中,則需要輸入私鑰的密碼。

管理 SSH 金鑰

為了提高安全性,我們可以為不同的伺服器使用不同的 SSH 金鑰對。可以使用 -i 選項來指定特定的私鑰檔案:

ssh -i ~/.ssh/id_ed25519 donnie@192.168.0.17

這將使用 ~/.ssh/id_ed25519 私鑰檔案進行身份驗證。

內容解密:

  • -i 選項用於指定私鑰檔案。
  • 可以為不同的伺服器使用不同的私鑰檔案。

實驗:建立和傳輸 SSH 金鑰

在本實驗中,我們將使用一台虛擬機器作為客戶端,另一台虛擬機器作為伺服器。

  1. 在客戶端機器上建立一對 384 位元的橢圓曲線金鑰:
    ssh-keygen -t ecdsa -b 384
    
  2. 將公鑰傳輸到伺服器上:
    ssh-copy-id donnie@192.168.0.7
    
  3. 使用 SSH 金鑰進行登入:
    ssh donnie@192.168.0.7
    

停用 root 使用者登入

為了提高安全性,我們可以停用 root 使用者登入。這可以防止攻擊者使用暴力破解攻擊來取得 root 許可權。