13.2. 簡介
前一頁 | 章 13. 安全性 | 下一頁

## 13.2. 簡介

保安是每個人的責任，任何系統中的弱點都可讓入侵者取得對關鍵資訊的存取權並導致整個網路的浩劫。資訊安全的其中一個核心原則便是 CIA 三字訣，代表著資訊系統的機密性 (Confidentiality)、完整性 (Integrity) 以及可用性 (Availability)。

CIA 三字訣是電腦安全的基石，就如同客戶與使用者期望他們的資料得到保護一樣重要。例如，一個客戶會期望他們的信用卡資訊被安全的保存 (機密性)、他們的訂單不會在私底下被竄改 (完整性) 以及他們隨時可以存取他們的訂單資訊 (可用性)。

要提供 CIA，安全專家會應用防禦深度的策略。防禦深度的概念是增加數個保全階層來避免單一階層失效便導致整個安全系統瓦解。例如，系統管理者不能直接打開防火牆與評估網路或系統的安全性，還要同時稽查帳號、檢查 Binary 的完整性與確保未被安裝惡意工具。要執行有效的保安策略，必須了解威脅以及如何抵禦威脅。

什麼威脅影響到電腦安全性? 威脅並不僅限於在遠端嘗試未經授權存取系統的遠端攻擊者，威脅也包含員工、惡意軟體、未經許可的網路裝置、天然災害、安全性漏洞甚至是公司競爭對手。

系統與網路可以被未經授權存取，有時是因為意外，或是因遠端攻擊者，或在某些案例中，是因商業間諜或者前員工。做為使用者，重要的是做好防範準備以及當有失誤造成安全漏洞能夠承認並回報可能的問題給安全團隊。做為管理者，重要的是了解威脅並準備在發生時能夠減緩威脅。

當要應用保安到系統上時，建議由基本帳號以及系統設定開始保全，接著確保網路層，使其遵守系統政策以及組織的安全程序。許多組織已經有涵蓋科技裝置設置的安全性政策，該政策應包含工作站、桌上型電腦、行動裝置、手機、上線伺服器、開發伺服器的安全設置。在大多數案例中，也都已經有標準操作程序 (SOP)，當有疑慮時，請向安全團隊諮詢。

簡介接下來的部份將說明如何在 FreeBSD 系統上執行這些基礎的安全設置。本章接下來的部份將介紹在 FreeBSD 系統執行安全性政策時會用到的特定工具。

### 13.2.1. 防止登入

要確保一個系統的安全最好的起點便是做好帳號的稽查，確保 `root` 使用了一個強而有力的密碼，並這個密碼未在其他地方使用過，然後關閉任何無須登入存取權的帳號。

要關閉帳號的存取權登入有兩種方法，第一種是鎖定帳號，以下範例會鎖定 `toor` 帳號：

    # pw lock toor

第二個關閉登入存取權的方式是更改 Shell 為 `/sbin/nologin`，只有超級使用者可以更改其他使用者的 Shell：

    # chsh -s /usr/sbin/nologin toor

`/usr/sbin/nologin` shell 可以避免系統分配 Shell 給嘗試登入的使用者。

### 13.2.2. 帳號升級授權

在有一些案例，需要與其他使用者共用系統管理權限，FreeBSD 有兩種方式可以處理這種情況。第一種，也是較不建議的方式，是與 `wheel` 群組的成員共用 root 的密碼，這種方式使用者可以在需要超級使用者的存取權時輸入 `su` 然後輸入 `wheel` 的密碼，在完成需要管理存取權的指令之後，使用應輸入 `exit` 離開。要加入使用者到這個群組，可編輯 `/etc/group` 然後加入該使用者到 `wheel` 項目的最後，使用者必須以逗號字元分隔並不可有空白。

第二種方式，也是較建議的方式，安裝 security/sudo 套件或 Port 來提升權限。這個軟體提供了額外的稽查、更細微的使用者控制，然後可以設定鎖定使用者只能執行特定需權限的指令。

在安裝之後，使用 `visudo` 來編輯 `/usr/local/etc/sudoers`。這個範例會建立新 `webadmin` 群組，並加入 `trhodes` 帳號到該群組，然後設定該群組可重新啟動 apache24 的存取權：

    # pw groupadd webadmin -M trhodes -g 6000
    # visudo
    %webadmin ALL=(ALL) /usr/sbin/service apache24 *

### 13.2.3. 密碼編碼方式

密碼是資訊科技的必要之惡，當必須使用密碼時，應要有複雜且強大的雜湊機制來加密儲存在密碼資料庫中的密碼。FreeBSD 支援 DES, MD5, SHA256, SHA512 以及 Blowfish 雜湊演算法於其 `crypt()` 程式庫。預設使用 SHA512，不建議改成更不安全的雜湊演算法，但可改成更安全的 Blowfish 演算法。

### 注意:

Blowfish 不是 AES 的一部份且不符合任何聯邦資訊處理標準 (Federal Information Processing Standards, FIPS)，在某些環境可能不會允許使用這種加密方式。

要知道目前用何種雜湊演算法來加密某位使用者密碼，超級使用者可以檢視在 FreeBSD 密碼資料庫中該使用者的雜湊，每個雜湊的一開始便會以符號標示其用來加密密碼所使用的雜湊機制。若使用 DES 則開始不會有任何符號，而 MD5 的符號則是 `$`，SHA256 及 SHA512 的符號是 `$6$`，Blowfish 的符號是 `$2a$`。在以下例子中 `dru` 的密碼使以預設的 SHA512 演算法加密，因為其雜湊的開始為 `$6$`。注意，該加密過的雜湊，不是原來的密碼，會儲存於密碼資料庫中：

    # grep dru /etc/master.passwd
    dru:$6$pzIjSvCAn.PBYQBA$PXpSeWPx3g5kscj3IMiM7tUEUSPmGexxta.8Lt9TGSi2lNQqYGKszsBPuGME0:1001:1001::0:0:dru:/usr/home/dru:/bin/csh

雜湊機制是設定在該使用者的登入類別 (Login class)，以此為例，該使用者屬於 `default` 登入類別，且雜湊演算法是以下行設定在 `/etc/login.conf`：

            :passwd_format=sha512:\

要更改演算法為 Blowfish，可修改該行如下：

            :passwd_format=blf:\

然後依 節 13.13.1, “設定登入類別” 中所描述的方式執行 `cap_mkdb /etc/login.conf`。注意，這個動作不會影響任何已存在的密碼雜湊，但這代表必須要求所有使用者執行 `passwd` 來更改其密碼才有辦法重新加密所有密碼。

針對遠端登入，應使用雙重認證 (Two-factor authentication)，舉例來說您同時要 “有某樣東西”，如：鑰匙，以及 “知道某個資訊”，如：密碼。自從 OpenSSH 是 FreeBSD 基礎系統的一部份，所有來算網路的登入應透過加密過的連線且使用以金鑰為基礎的認証來替代密碼。要了解更多資訊請參考 節 13.8, “OpenSSH”。Kerberos 的使用者可能會需要多做一些額外的更改才能在其網路上使用 OpenSSH，這些更改在 節 13.5, “Kerberos” 中會有說明。

### 13.2.4. 強制密碼政策

強制在本地帳號使用高強度密碼的政策是系統安全的基礎之一。在 FreeBSD 密碼長度、密碼強度以及密碼複雜性可使用內建的可插拔認証模組 (Pluggable Authentication Modules, PAM) 來執行。

本節將示範如何設定密碼長度下限與上限以及使用 `pam_passwdqc.so` 來強制使用混合字元的密碼，此模組可在使用者更改其密碼時強制要求。

要設定此模組，需要先成為超級使用者，然後取消註解在 `/etc/pam.d/passwd` 中含有 `pam_passwdqc.so` 的行。然後編輯該行來配合密碼政策：

    password        requisite       pam_passwdqc.so         min=disabled,disabled,disabled,12,10 similar=deny retry=3 enforce=users

這個例子會設定新密碼所需符合的需求。`min` 設定可以控制密碼長度下限，它有五個值因為這個模組根據密碼的複雜度定義了五種類型。而複雜度是由必須在密碼中存在的字元類型來定義，例如：文字、數字、符號以及大小寫，這些密碼類型在 pam_passwdqc(8) 有詳細的說明。在這個例子，密碼類型的前三項為關閉的，代表不會接受只滿足這些複雜度的密碼，不論長度為何。`12` 設定密碼政策可接受滿足三種字元類型複雜度且至少 12 個字元的密碼，`10` 設定密碼政策接受滿足四種字元類型複雜度且至少 10 個字元的密碼。

`similar` 設定則會拒絕以使用者前一次類似的密碼。`retry` 設定會提供使用者三次輸入新密碼的機會。

一這個檔案儲存之後，更改密碼的使用者將會看到如下的訊息：

    % passwd
    Changing local password for trhodes
    Old Password:

    You can now choose the new password.
    A valid password should be a mix of upper and lower case letters,
    digits and other characters.  You can use a 12 character long
    password with characters from at least 3 of these 4 classes, or
    a 10 character long password containing characters from all the
    classes.  Characters that form a common pattern are discarded by
    the check.
    Alternatively, if no one else can see your terminal now, you can
    pick this as your password: "trait-useful&knob".
    Enter new password:

若輸入了一個不符何密碼政策的密碼，則會被拒絕並顯示警告，然後使用者會有機會再重試，直到超過設定的允許重試次數。

大多數密碼政策會讓密碼在多日過後過期。要在 FreeBSD 設定密碼年齡日期，可在 `/etc/login.conf` 中該使用者的登入類別設定 `passwordtime`。在 `default` 登入類別已有設定範例：

    #       :passwordtime=90d:\

因此，要設定此登入類別的密碼在 90 天之後過期只需要移除註解符號 (`#`)，然後儲存編輯結果並執行 `cap_mkdb /etc/login.conf`。

要在個別使用者設定期限，可將有效日期或到期的天數與使用者名稱傳給 `pw`：

    # pw usermod -p 30-apr-2015 -n trhodes

如這個例子，有效日期的格式為天、月以及年。要取得更多資訊可參考 pw(8)。

### 13.2.5. 偵測 Root 工具 (Rootkit)

rootkit 指的是嘗試未經授權取得系統 `root` 存取權的軟體。一旦安裝之後，這個惡意軟體將可以光明正大的開啟給另一個給攻擊者進入的大門。現實上，一但系統已被 rootkit 滲透且執行了搜索動作之後，該系統就應該從頭重新安裝，因為即使非常謹真的資安或系統工程式也可能會遺漏攻擊者留下的動西。

rootkit 對管理者而言唯一有幫助的是：一但偵測到，便代表某處已經被滲透，但這類型的應用程式躲藏的非常好，本節將會示範一個可以用來偵測 rootkit 的工具，security/rkhunter。

安裝此套件或 Port 之後，系統便可使用以下指令檢查。該指令提供許多資訊且會需要手動按下 ENTER 確認：

    # rkhunter -c

該程序完成之後，目前狀態的訊息便會顯示在畫面上。這個訊息包含了已檢查過多少檔案、可疑的檔案、可能的 rootkit 以及其他更多資訊。在檢查的過程中，可能會產生一些有關隱藏檔案、OpenSSH 通訊協定選擇及已安裝軟體已知漏洞版本的通用的安全性警告、這些問題可以立即處理或在更詳細的分析之後再處理。

每位管理者應了解在系統上執行了那些程式以及這些程式的用途。第三方工具如 rkhunter 與 sysutils/lsof 以及原生指令如 `netstat` 與 `ps` 可以系統上大量的資訊，記錄下那一些是正常的，當有不適當的程式出現時提出疑問，然後找出答案。雖然理想要避免滲透，但也必須偵測是否已被滲透了。

### 13.2.6. Binary 檢驗

檢驗系統檔案與 Binary 是很重要的，因為它可以提供系統管理者與資安團隊有關系統變更的資訊，能夠監視系統變更的軟體應用程式稱為入侵偵測系統 (Intrusion Detection System, IDS)。

FreeBSD 原生提供了基礎的 IDS 系統，雖然每天晚上會有安全性的信件會通知管理者相關的變更，但這些資訊是儲存在本地的，這讓惡意的使用者有機會能夠修改這些資訊來隱藏其對系統的變更。也因此，會建議建立一個獨立的 Binary 簽名並將這些簽名儲存在唯度、root 擁有的目錄或在可移除的 USB 磁碟或遠端 rsync 伺服器更好。

內建 `mtree` 工具可以對一個目錄中的內容產生一個規格檔，產生規格檔會用到一個種子碼 (Seed) 或常數，然後在檢查規格是否有更改過時會也會需要使用這個種子碼或常數。這讓檢查一個檔案或 Binary 是否被修改變成可能的一件事。由於攻擊者並不知道種子碼，要仿冒或檢查檔案的校驗碼 (Checksum) 數值是幾乎不可能的。以下例子會產生一組 SHA256 雜湊，每一個在 `/bin` 的系統 Binary 都會有一個，並姐會將這些值以隱藏黨儲存在 `root` 的家目錄，`/root/.bin_chksum_mtree`：

    # mtree -s 3483151339707503 -c -K cksum,sha256digest -p /bin > /root/.bin_chksum_mtree
    # mtree: /bin checksum: 3427012225

`3483151339707503` 代表種子碼，這個值應要記錄下來且不可給其它人看。

檢視 `/root/.bin_cksum_mtree` 應會產生類似以下的輸出結果：

    #          user: root
    #       machine: dreadnaught
    #          tree: /bin
    #          date: Mon Feb  3 10:19:53 2014

    # .
    /set type=file uid=0 gid=0 mode=0555 nlink=1 flags=none
    .               type=dir mode=0755 nlink=2 size=1024 \
                    time=1380277977.000000000
        \133        nlink=2 size=11704 time=1380277977.000000000 \
                    cksum=484492447 \
                    sha256digest=6207490fbdb5ed1904441fbfa941279055c3e24d3a4049aeb45094596400662a
        cat         size=12096 time=1380277975.000000000 cksum=3909216944 \
                    sha256digest=65ea347b9418760b247ab10244f47a7ca2a569c9836d77f074e7a306900c1e69
        chflags     size=8168 time=1380277975.000000000 cksum=3949425175 \
                    sha256digest=c99eb6fc1c92cac335c08be004a0a5b4c24a0c0ef3712017b12c89a978b2dac3
        chio        size=18520 time=1380277975.000000000 cksum=2208263309 \
                    sha256digest=ddf7c8cb92a58750a675328345560d8cc7fe14fb3ccd3690c34954cbe69fc964
        chmod       size=8640 time=1380277975.000000000 cksum=2214429708 \
                    sha256digest=a435972263bf814ad8df082c0752aa2a7bdd8b74ff01431ccbd52ed1e490bbe7

機器的主機名稱、建立規格檔的日期與時間、以及建立此規格檔的使用者名稱皆會記錄在此報告當中，報告當中還會有在目錄中每個 Binary 的校驗碼、大小、時間以及 SHA256 編碼。

要檢驗 Binary 簽名是否有被變更過，可使用先前產生的規格檔比對目前目錄的內容，然後儲存結果到檔案。這個指令需要當初產生原規格檔所使用的種子碼：

    # mtree -s 3483151339707503 -p /bin < /root/.bin_chksum_mtree >> /root/.bin_chksum_output
    # mtree: /bin checksum: 3427012225

這個動作應會產生與上次建立 `/bin` 規格檔時產生的校驗碼相同，若在此目錄的 Binary 沒有被變更過，那麼 `/root/.bin_chksum_output` 這個輸出檔將會是空的。要模擬變更，可以使用 `touch` 更改 `/root/.bin_chksum_output` 的日期然後再執行檢驗指令一次：

    # touch /bin/cat
    # mtree -s 3483151339707503 -p /bin < /root/.bin_chksum_mtree >> /root/.bin_chksum_output
    # more /root/.bin_chksum_output
    cat changed
    	modification time expected Fri Sep 27 06:32:55 2013 found Mon Feb  3 10:28:43 2014

建議對含有 Binary 以及設定檔的目錄建立規格檔，對含有敏感資料的目錄也是。通常會為 `/bin`, `/sbin`, `/usr/bin`, `/usr/sbin`, `/usr/local/bin`, `/etc` 及 `/usr/local/etc` 建立規格檔。

也有更進階的 IDS 系統，例如 security/aide。大多數情況 `mtree` 已可提供管理者所需的功能。將種子碼與校驗碼結果保存在惡意使用者無法存取的地方是非常重要的一件事。更多有關 `mtree` 的資訊可在 mtree(8) 找到。

### 13.2.7. 系統安全性調校

在 FreeBSD，有許多系統功能可以使用 `sysctl` 調校，本節會涵蓋少數可以調校來避免阻斷服務 (Denial of Service, DoS) 攻擊的安全性功能。更多有關使用 `sysctl` 的資訊包含：如何暫時更改數值及如何在測試之後做永久更改可在 節 11.9, “使用 sysctl(8) 調校” 找到。

### 注意:

任何時間使用 節 11.9, “使用 sysctl(8) 調校” 做的設定變更都會讓造成不想要的傷害的可能性上升，影響到系統的可用性。因此應要對所有的變更做監視，若可能的話，先在測試系統上實驗，再到上線的系統上使用。

預設 FreeBSD 核心會使用安全性層級 `-1` 來開機，這又稱作“不安全模式”，因為不可變 (Immutable) 檔案旗標可以被關閉且可以讀取或寫入所有的裝置。除非有使用 `sysctl` 或在啟動 Script 設定修改該值，否則安全性層級將會在 `-1`。安全性層級可以在系統啟動時透過在 `/etc/rc.conf` 設定 `kern_securelevel_enable` 為 `YES` 以及 設定 `kern_securelevel` 的值為想要的安全層級來提升。請參考 security(7) 以及 init(8) 以取得更多與這些設定及可用的安全性層級相關的資訊。

### 警告:

提高 `securelevel` 會導致 Xorg 無法執行以及造成其他問題，請做好除錯的準備。

`net.inet.tcp.blackhole` 以及 `net.inet.udp.blackhole` 設定可以用來丟棄在已關閉連接埠 (Port) 收到的 SYN 封包且不會回傳 RST 回應，預設的動作是會回傳 RST 來表示該連接埠已被關閉，更改預設的動作可對連接埠掃描 (用在查看在系統上執行的應用程式) 提供一定程度的保護，要這麼做可設定 `net.inet.tcp.blackhole` 為 `2` 及 `net.inet.udp.blackhole` 為 `1`。請參考 blackhole(4) 以取得更多有關這些設定的資訊。

`net.inet.icmp.drop_redirect` 以及 `net.inet.ip.redirect` 設定可以幫助避免 重新導向攻擊 (Redirect attacks)，重新導向攻擊是 DoS 的一種，會傳送大量 ICMP 類型 5 的封包，由於這些封包並不是必要的，設定 `net.inet.icmp.drop_redirect` 為 `1` 以及設定 `net.inet.ip.redirect` 為 `0` 可丟棄這些封包。

來源路由 (Source routing) 是一種偵測與存取在內部網路中不可路由位址的方法，由於不可路由位址通常是固故讓它不可路由的，因此可以關閉這個功能。要關閉這個功能可設定 `net.inet.ip.sourceroute` 以及 `net.inet.ip.accept_sourceroute` 為 `0`。

當一台在網路上的機器需要傳送訊息給所有在子網路上的主機時，會發送 ICMP 回應請求訊息到廣播位址。然而，外部的主機是沒有理由可以執行這個動作的。要拒絕所有來自外部的廣播請求可設定 `net.inet.icmp.bmcastecho` 為 `0`。

還有一些額外的設定在 security(7) 有說明。

前一頁 | 上一層 | 下一頁
章 13. 安全性 | 起始頁 | 13.3. 一次性密碼

本文及其他文件，可由此下載： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。