返回文章列表

Linux 系統安全加固實務

本文探討如何應用 CIS Benchmarks 加固 Linux 系統安全,涵蓋 SSH 設定、SELinux 與 AppArmor 的比較、DNS 服務的運作與安全強化等關鍵導向,提供實務操作與程式碼範例,協助管理員有效提升 Linux 系統的安全性。

資安 系統管理

在 Linux 環境中,系統安全加固是至關重要的任務。本文將以 CIS Benchmarks 為基礎,逐步講解如何強化 Linux 系統的安全性,包含 SSH 設定加固、安全模組 SELinux 與 AppArmor 的比較與應用,以及 DNS 服務的運作與安全強化。透過遵循 CIS Benchmarks 的建議,並結合實際案例與程式碼說明,系統管理員可以有效提升 Linux 系統的安全性,降低潛在風險。

加固Linux系統安全:以CIS Benchmarks為例

CIS(Center for Internet Security)Benchmarks是一種被廣泛使用的安全組態,用於加固各種平台和系統的安全性。這些Benchmarks不僅提供了詳細的安全建議,還包含了稽核和修復的,以確保系統組態符合安全最佳實踐。

為什麼使用CIS Benchmarks

CIS Benchmarks的設計目的是雙重的:一方面,它們幫助使用者構建更安全的平台;另一方面,它們為安全稽核提供了依據。每個建議都附帶了詳細的解釋,這樣管理員不僅能瞭解如何進行更改,還能明白為什麼需要這些更改。這一點非常重要,因為並非所有的建議都適用於每種情況,有時不同的建議之間甚至會產生衝突。

CIS Benchmarks的特點

  • 雙重基準:CIS Benchmarks通常包含兩套建議:一套適用於普通組織,另一套則針對高安全性環境。
  • 稽核工具:CIS提供了名為CIS-CAT的稽核工具,用於評估基礎設施是否符合Benchmarks的要求。此外,許多行業標準工具,如安全掃描器(Nessus)和自動化工具(Ansible、Puppet、Chef),也支援對照CIS Benchmarks進行評估。

應用CIS Benchmarks:加固Linux上的SSH

以Ubuntu 20.04為例,CIS Benchmarks提供了關於如何加固SSH服務的詳細。SSH是遠端連線和管理Linux主機的主要方法,因此確保SSH服務的安全至關重要。

步驟1:下載並參考CIS Benchmark

首先,從CIS官方網站下載適用於您Linux發行版的Benchmark檔案。對於Ubuntu 20.04,可以找到相關的SSH組態建議。

步驟2:更新系統並安裝OpenSSH服務

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install openssh-server

第一條命令更新了軟體包列表並升級了系統上的軟體包。第二條命令安裝了OpenSSH服務。

步驟3:根據CIS Benchmark加固SSH

在CIS Benchmark for Ubuntu 20.04的SSH部分,有22條關於組態設定的建議。以下是其中兩條建議的詳細說明:

停用root使用者直接登入(5.2.9)

此建議要求使用者使用個人賬戶登入,而不是直接使用root賬戶。這樣可以確保任何日誌記錄都與真實使用者相關聯,實作不可否認性

$ sudo sshd -T | grep permitrootlogin
permitrootlogin without-password

預設組態without-password表示允許使用非密碼驗證方法(如證書)登入root賬戶,這被視為不合規。需要將其更改為no以停用root登入。

程式碼解析:

# 檢查當前SSH組態中關於root登入的設定
$ sudo sshd -T | grep permitrootlogin

內容解密:

  1. sudo sshd -T:以超級使用者許可權執行sshd命令,並輸出組態引數。
  2. | grep permitrootlogin:透過管道將輸出結果過濾,只顯示包含permitrootlogin的行。
  3. 這條命令用於檢查當前SSH伺服器是否允許root使用者登入,以及允許的方式。

加強 Linux 系統安全:遵循 CIS 基準的實務

在維護 Linux 系統的安全時,遵循業界公認的安全標準至關重要。CIS(Center for Internet Security)基準為 Linux 系統提供了一套全面的安全設定。本文將探討如何根據 CIS 基準加強 Linux 系統的安全,特別是在 SSH 設定方面。

禁止 Root 使用者透過 SSH 登入

根據 CIS 基準的建議,禁止 Root 使用者透過 SSH 登入是一項重要的安全措施。這可以防止攻擊者直接對 Root 帳戶進行暴力破解攻擊。

設定步驟:

  1. 編輯 /etc/ssh/sshd_config 檔案。
  2. PermitRootLogin 設定為 no。如果該行被註解(以 # 開頭),則取消註解或在其下方新增 PermitRootLogin no
# 編輯 sshd_config 檔案
sudo nano /etc/ssh/sshd_config

# 新增或修改 PermitRootLogin 設定
PermitRootLogin no

驗證設定:

執行以下命令驗證設定是否生效:

sudo sshd -T | grep permitrootlogin

內容解密:

  • sudo sshd -T 命令會測試 SSH 伺服器的設定並輸出其設定值。
  • grep permitrootlogin 用於過濾出 PermitRootLogin 的設定值。

僅允許強加密演算法

CIS 基準建議僅允許強加密演算法用於 SSH 連線,以防止使用弱加密演算法導致的安全風險。

設定步驟:

  1. 編輯 /etc/ssh/sshd_config 檔案。
  2. 新增或修改 Ciphers 設定,僅包含強加密演算法,如 aes256-ctraes192-ctraes128-ctr
# 編輯 sshd_config 檔案
sudo nano /etc/ssh/sshd_config

# 新增或修改 Ciphers 設定
Ciphers aes256-ctr,aes192-ctr,aes128-ctr

驗證設定:

執行以下命令驗證設定是否生效:

sudo sshd -T | grep Ciphers

內容解密:

  • Ciphers 設定指定了 SSH 連線中允許使用的加密演算法。
  • 使用強加密演算法可以提高 SSH 連線的安全性。

使用 Nmap 驗證 SSH 設定

除了在伺服器上直接檢查設定外,還可以使用 Nmap 等工具從遠端驗證 SSH 設定。

操作步驟:

執行以下命令使用 Nmap 的 ssh2-enum-algos.nse 指令碼掃描目標主機的 SSH 設定:

sudo nmap -p22 -Pn --open 192.168.122.113 --script ssh2-enum-algos.nse

內容解密:

  • -p22 指定掃描的埠為 22(SSH 埠)。
  • --script ssh2-enum-algos.nse 指定使用 ssh2-enum-algos.nse 指令碼掃描 SSH 演算法支援情況。

其他重要設定

除了上述設定外,還有其他一些重要的 SSH 設定需要檢查:

  • SSH 日誌記錄級別:確保記錄足夠的資訊以追蹤登入活動。
  • 金鑰交換和 MAC 演算法:加強 SSH 協定本身的安全性。
  • 閒置逾時:設定閒置逾時以防止未關閉的 SSH 工作階段佔用資源。
  • 最大工作階段限制:限制最大工作階段數以防止資源耗盡攻擊。

Linux 安全模組:SELinux 與 AppArmor 深度解析

Linux 系統中存在兩種常見的 Linux Security Modules(LSMs),分別是 SELinux 和 AppArmor,它們為系統增加了額外的安全策略、控制措施,並改變了預設行為。在許多情況下,這些模組甚至會修改 Linux 核心本身。兩者大多數 Linux 發行版都支援,但實作上存在一定風險,因此在佈署前需進行充分準備,以評估潛在影響。一般不建議同時實作兩者,因為它們可能會產生衝突。

SELinux:複雜且完備的安全解決方案

SELinux 被認為是更為完備但也更複雜的安全模組。它由一系列核心修改和工具組成,新增至基礎安裝中。在高層次上,SELinux 將安全策略的組態與執行分離。其控制措施包括強制存取控制(Mandatory Access Control)、強制完整性控制(Mandatory Integrity Control)、根據角色的存取控制(Role-Based Access Control, RBAC)以及型別強制(Type Enforcement)。

SELinux 的主要特點

  • 將安全策略的定義與執行分離
  • 提供良好的策略介面(透過工具和 API)
  • 允許應用程式查詢策略定義或特定存取控制,例如允許 crond 在正確的上下文中執行排程任務
  • 支援修改預設策略或建立全新的自訂策略
  • 保護系統完整性(網域完整性)和資料機密性(多層安全)
  • 對行程初始化、執行和繼承進行控制
  • 對檔案系統、目錄、檔案和開啟的檔案描述符(例如管道或 Socket)實施額外的安全控制
  • 對 Socket、訊息和網路介面實施安全控制
  • 對「能力」(RBAC)進行控制
  • 預設拒絕未被策略允許的任何操作,這是 SELinux 設計的核心原則

AppArmor:根據路徑的安全控制

AppArmor 具備與 SELinux 相似的功能,但它透過檔案路徑而非檔案標籤來運作,同樣實作了強制存取控制。可以為任何應用程式指派安全設定檔,包括檔案系統存取、網路許可權和執行規則。AppArmor 也支援 RBAC。

AppArmor 的主要特點

  • 檔案存取控制
  • 控制程式函式庫載入
  • 控制行程執行
  • 對網路協定進行粗粒度的控制
  • 命名 Socket 控制
  • 對物件的所有者進行粗粒度檢查(需要 Linux 核心 2.6.31 或更新版本)

學習模式與狀態檢查

兩種 LSM 皆提供學習模式:

  • SELinux 的寬容模式(permissive mode)允許啟用策略但不強制執行,方便測試應用程式並檢查 SELinux 日誌,以評估策略強制執行後的影響。透過編輯 /etc/selinux/config 檔案並修改 selinux 行為 enforcingpermissivedisabled 來控制 SELinux 模式,變更後需重新啟動系統。

  • AppArmor 的學習模式稱為投訴模式(complain mode),透過 aa-complain 命令進入。啟動學習模式後,可使用 aa-logprof 命令檢查應用程式在 AppArmor 強制執行下的行為。

檢查兩種 LSM 的狀態可使用以下命令:

  • SELinux:getenforcesestatus(更詳細的輸出)
  • AppArmor:apparmor_statusaa-status
內容解密:

本段主要介紹了 SELinux 和 AppArmor 這兩種 Linux 安全模組的核心功能和特點,並比較了兩者的不同之處。文中指出,SELinux 將安全策略的定義與執行分離,提供更完備的安全控制,但也更為複雜;而 AppArmor 則透過檔案路徑來實施安全控制,使用上相對簡單。兩者都具備學習模式,方便管理員在不影響系統執行的情況下測試和調整安全策略。

為何選擇 SELinux 或 AppArmor?

選擇 SELinux 或 AppArmor 取決於組織的安全需求和技術能力。SELinux 提供更強大的安全控制和更細粒度的存取控制,但需要更多的學習和組態工作。AppArmor 則提供了一種更簡單、根據路徑的安全控制機制,更容易上手。

未來趨勢與實務應用評估

隨著 Linux 系統在企業環境中的廣泛應用,安全性的重要性日益增加。無論選擇 SELinux 還是 AppArmor,都需要持續關注安全更新和最佳實踐,以確保系統的安全性。

內容解密:

本段討論了選擇 SELinux 或 AppArmor 的考量因素,並對未來趨勢進行了評估。文中指出,無論選擇哪種安全模組,都需要持續關注安全性和更新,以保持系統的安全狀態。

DNS 服務於 Linux 系統上的應用

網域名稱系統(DNS)是當今資訊社會的重要根本。技術社群中有句俗諺以俳句形式表達如下:

It’s not DNS
There is no way it’s DNS
It was DNS

這段話描述了許多技術問題的根源,甚至是廣泛的網路或雲端服務中斷。它生動地說明瞭問題解決的過程,最終答案往往是:「根源總是 DNS」。這恰好說明瞭 DNS 服務對現代企業網路和公共網路的重要性。

本章重點

在本章中,我們將涵蓋 DNS 基礎知識,接著建立並排除 DNS 服務的故障。我們將探討以下幾個方面:

  • DNS 的基本概念
  • 兩種主要的 DNS 伺服器實作
  • 常見的 DNS 實作案例
  • DNS 故障排除與偵察

在介紹完 DNS 基礎知識後,我們將討論兩種新興的 DNS 實作,它們正被迅速採用:

  • 根據 HTTPS 的 DNS(DNS over HTTPS,簡稱 DoH)
  • 根據 TLS 的 DNS(DNS over TLS,簡稱 DoT)

我們還將討論 DNS 安全擴充套件(DNSSEC)的實作,它透過加密簽署 DNS 回應來驗證其真實性,防止篡改。

技術需求

您可以使用現有的 Linux 主機或虛擬機器(VM)繼續進行本章的範例操作,無需額外的硬體或軟體需求。

何謂 DNS?

DNS 基本上是在人們的需求和網路需求之間進行轉換。人們通常能夠理解主機和服務的文字名稱,例如 google.compaypal.com,但這些名稱對底層網路來說毫無意義。DNS 的作用是將這些「完整網域名稱」轉換為可用的 IP 地址,以便在 OSI 第 3 和第 4 層進行路由。

反向操作時,DNS 也能透過 PTR 請求(用於 DNS PTR 記錄)或「反向查詢」將 IP 地址轉換為完整網域名稱(FQDN)。這對技術人員來說非常重要,但普通使用者在日常使用瀏覽器和其他應用程式時較少接觸到這些請求。

DNS 解析範例程式碼

# 使用 dig 命令進行 DNS 解析
dig google.com

# 反向解析範例
dig -x 8.8.8.8

內容解密:

  1. dig google.com:使用 dig 命令查詢 google.com 的 DNS 記錄,顯示其對應的 IP 地址。
  2. dig -x 8.8.8.8:進行反向解析,查詢 IP 地址 8.8.8.8 對應的網域名稱。
  3. dig 命令是一種強大的 DNS 偵測工具,能夠提供詳細的 DNS 解析資訊。

兩種主要的 DNS 伺服器實作

DNS 在網際網路上擁有龐大而複雜的基礎設施,主要由 13 個根網域名稱伺服器(每個都是可靠的伺服器叢集)、一組常用的名稱伺服器(如 Google 或 Cloudflare 使用的伺服器),以及一系列註冊商組成。註冊商提供收費的 DNS 網域名稱註冊服務,例如為您的組織註冊網域名稱。

大多數管理員主要關注組織內部的需求,管理導向內部員工的內部 DNS 名稱伺服器,或導向網際網路的外部 DNS 名稱伺服器。本章將重點介紹這兩種使用場景,並透過範例展示 Google 或 Cloudflare 的 DNS 基礎設施,甚至是根 DNS 伺服器之間的相似之處。

組織內部的 DNS 伺服器概述

大多陣列織佈署的 DNS 服務是供內部員工使用的內部 DNS 伺服器。該伺服器通常擁有一個區域檔案,其中填充了用於內部 DNS 解析的記錄。這些記錄可以手動編輯區域檔案來填充,也可以透過客戶端自動註冊或從 DHCP 租約中自動填充。通常,這三種方法會結合使用。

基本的請求流程非常簡單:客戶端發出 DNS 請求。如果該請求針對的是組織內部的主機,且請求傳送到內部 DNS 伺服器,由於該記錄儲存在本地 DNS 伺服器上,因此會立即提供 DNS 回應。

自動註冊客戶端到 DNS 伺服器的範例組態

# 編輯 /etc/dhcp/dhclient.conf 檔案,新增以下內容以實作自動註冊
send host-name = gethostname();
ddns-update-style interim;
ignore client-updates;

內容解密:

  1. send host-name = gethostname();:客戶端向 DHCP 伺服器傳送主機名。
  2. ddns-update-style interim;:啟用動態 DNS 更新,使用 interim 模式。
  3. ignore client-updates;:忽略客戶端的更新請求,由 DHCP 伺服器統一管理。
  4. 這段組態使客戶端能夠透過 DHCP 自動註冊到 DNS 伺服器,確保 DNS 紀錄的動態更新。

DNS服務於Linux上的運作與實作

DNS(Domain Name System)是網路基礎設施中的關鍵元件,負責將人類可讀的網域名稱轉換為機器可理解的IP地址。在Linux系統上實作DNS服務涉及多個層面,包括遞迴查詢、快取、動態註冊和冗餘機制等。

DNS查詢流程解析

當使用者端請求存取www.example.com時,DNS查詢流程可能會經歷多個步驟。以下是最壞情況下的查詢流程:

  1. 內部DNS伺服器快取查詢:如果請求的DNS記錄已存在於內部DNS伺服器的快取中且TTL(Time To Live)未過期,則直接傳回結果給使用者端。
  2. 轉發請求:如果記錄不存在或TTL已過期,內部DNS伺服器將請求轉發給上游DNS伺服器(forwarders)。
  3. 根網域名稱伺服器查詢:如果上游DNS伺服器沒有快取該記錄,它將查詢根網域名稱伺服器以取得頂級網域名稱(TLD)伺服器的資訊。
  4. TLD伺服器查詢:根網域名稱伺服器傳回TLD伺服器的資訊,上游DNS伺服器接著查詢TLD伺服器以取得example.com的授權DNS伺服器資訊。
  5. 授權DNS伺服器查詢:TLD伺服器傳回example.com的授權DNS伺服器資訊,上游DNS伺服器接著查詢該授權DNS伺服器以取得www.example.com的記錄。
  6. 結果傳回:授權DNS伺服器傳回www.example.com的記錄,上游DNS伺服器快取該記錄並傳回給內部DNS伺服器,最終傳回給使用者端。

內部DNS伺服器的關鍵功能

為了使上述流程順暢運作,內部DNS伺服器需要啟用以下功能:

  • DNS遞迴:允許DNS伺服器代表使用者端進行遞迴查詢。
  • 轉發器設定:組態上游DNS伺服器的IP地址,以便在本地未快取記錄時進行轉發查詢。
  • 快取:透過增加記憶體來提高快取容量,從而提升效能。
  • 動態註冊:允許透過DHCP動態分配IP的裝置註冊到DNS中。
  • 主機冗餘:透過設定主從DNS伺服器來實作冗餘,確保服務的高用性。

DNS遞迴與轉發器設定的重要性


### 啟用DNS遞迴與設定轉發器範例(以BIND為例)

#### 設定檔範例(/etc/named.conf)
```bind
options {
    // 啟用遞迴
    recursion yes;
    // 設定轉發器
    forwarders {
        8.8.8.8;  // Google DNS
        8.8.4.4;  // Google DNS
    };
    // 其他設定...
};

內容解密:

  1. recursion yes;:啟用DNS遞迴功能,允許BIND代表使用者端進行遞迴查詢。
  2. forwarders { ... };:設定上游DNS伺服器的IP地址,當本地未快取所需的DNS記錄時,BIND將查詢請求轉發給這些伺服器。
  3. 使用Google的公開DNS(8.8.8.88.8.4.4)作為轉發器,因其穩定性和效能。

網際網路面對DNS伺服器的安全考量

對於面對網際網路的DNS伺服器(即授權DNS伺服器),主要關注的是安全性而非效能。需實施以下限制:

  • 限制遞迴查詢:關閉遞迴查詢功能,因為這類別伺服器不應向上遊查詢。
  • 快取重要性降低:由於主要服務於自身管理的區域,因此快取需求相對較低。

限制遞迴查詢範例(以BIND為例)

options {
    // 關閉遞迴
    recursion no;
    // 其他設定...
};

內容解密:

  1. recursion no;:關閉DNS遞迴功能,防止授權DNS伺服器進行不必要的遞迴查詢,提高安全性。