這是一套 Linux 基金會為其系統管理員提供的推薦規范。
這個文檔用於幫助那些使用 Linux 工作站來訪問和管理項目的 IT 設施的系統管理員團隊。
如果你的系統管理員是遠程員工,你也許可以使用這套指導方針確保系統管理員的系統可以通過核心安全需求,降低你的IT 平台成為攻擊目標的風險。
即使你的系統管理員不是遠程員工,很多人也會在工作環境中通過便攜筆記本完成工作,或者在家中設置系統以便在業余時間或緊急時刻訪問工作平台。不論發生何種情況,你都能調整這個推薦規范來適應你的環境。
但是,這並不是一個詳細的“工作站加固”文檔,可以說這是一個努力避免大多數明顯安全錯誤而不會導致太多不便的一組推薦基線(baseline)。你也許閱讀這個文檔後會認為它的方法太偏執,而另一些人也許會認為這僅僅是一些膚淺的研究。安全就像在高速公路上開車 -- 任何比你開的慢的都是一個傻瓜,然而任何比你開的快的人都是瘋子。這個指南僅僅是一些列核心安全規則,既不詳細又不能替代經驗、警惕和常識。
我們分享這篇文檔是為了將開源協作的優勢帶到 IT 策略文獻資料中。如果你發現它有用,我們希望你可以將它用到你自己團體中,並分享你的改進,對它的完善做出你的貢獻。
每一節都分為兩個部分:
在清單的每一個項目都包括嚴重級別,我們希望這些能幫助指導你的決定:
記住,這些只是參考。如果你覺得這些嚴重級別不能反映你的工程對安全的承諾,你應該調整它們為你所合適的。
我們並不會要求管理員使用一個特殊供應商或者一個特殊的型號,所以這一節提供的是選擇工作系統時的核心注意事項。
盡管它還有爭議,但是安全引導能夠預防很多針對工作站的攻擊(Rootkits、“Evil Maid”,等等),而沒有太多額外的麻煩。它並不能阻止真正專門的攻擊者,加上在很大程度上,國家安全機構有辦法應對它(可能是通過設計),但是有安全引導總比什麼都沒有強。
作為選擇,你也許可以部署 Anti Evil Maid 提供更多健全的保護,以對抗安全引導所需要阻止的攻擊類型,但是它需要更多部署和維護的工作。
火線是一個標准,其設計上允許任何連接的設備能夠完全地直接訪問你的系統內存(參見維基百科)。雷電接口和擴展卡同樣有問題,雖然一些後來部署的雷電接口試圖限制內存訪問的范圍。如果你沒有這些系統端口,那是最好的,但是它並不嚴重,它們通常可以通過 UEFI 關閉或內核本身禁用。
可信平台模塊(Trusted Platform Module ,TPM)是主板上的一個與核心處理器單獨分開的加密芯片,它可以用來增加平台的安全性(比如存儲全盤加密的密鑰),不過通常不會用於日常的平台操作。充其量,這個是一個有則更好的東西,除非你有特殊需求,需要使用 TPM 增加你的工作站安全性。
這是你開始安裝操作系統前的一系列推薦規范。
UEFI 盡管有缺點,還是提供了很多傳統 BIOS 沒有的好功能,比如安全引導。大多數現代的系統都默認使用 UEFI 模式。
確保進入 UEFI 配置模式要使用高強度密碼。注意,很多廠商默默地限制了你使用密碼長度,所以相比長口令你也許應該選擇高熵值的短密碼(關於密碼短語請參考下面內容)。
基於你選擇的 Linux 發行版,你也許需要、也許不需要按照 UEFI 的要求,來導入你的發行版的安全引導密鑰,從而允許你啟動該發行版。很多發行版已經與微軟合作,用大多數廠商所支持的密鑰給它們已發布的內核簽名,因此避免了你必須處理密鑰導入的麻煩。
作為一個額外的措施,在允許某人訪問引導分區然後嘗試做一些不好的事之前,讓他們輸入密碼。為了防止肩窺(shoulder-surfing),這個密碼應該跟你的 UEFI 管理密碼不同。如果你經常關閉和啟動,你也許不想這麼麻煩,因為你已經必須輸入 LUKS 密碼了(LUKS 參見下面內容),這樣會讓你您減少一些額外的鍵盤輸入。
很有可能你會堅持一個廣泛使用的發行版如 Fedora,Ubuntu,Arch,Debian,或它們的一個類似發行版。無論如何,以下是你選擇使用發行版應該考慮的。
強制訪問控制(Mandatory Access Controls,MAC)或者基於角色的訪問控制(Role-Based Access Controls,RBAC)是一個用在老式 POSIX 系統的基於用戶或組的安全機制擴展。現在大多數發行版已經捆綁了 MAC/RBAC 系統(Fedora,Ubuntu),或通過提供一種機制一個可選的安裝後步驟來添加它(Gentoo,Arch,Debian)。顯然,強烈建議您選擇一個預裝 MAC/RBAC 系統的發行版,但是如果你對某個沒有默認啟用它的發行版情有獨鐘,裝完系統後應計劃配置安裝它。
應該堅決避免使用不帶任何 MAC/RBAC 機制的發行版,像傳統的 POSIX 基於用戶和組的安全在當今時代應該算是考慮不足。如果你想建立一個 MAC/RBAC 工作站,通常認為 AppArmor 和 PaX 比 SELinux 更容易掌握。此外,在工作站上,很少有或者根本沒有對外監聽的守護進程,而針對用戶運行的應用造成的最高風險,GrSecurity/PaX 可能 會比SELinux 提供更多的安全便利。
大多數廣泛使用的發行版都有一個給它們的用戶發送安全公告的機制,但是如果你對一些機密感興趣,去看看開發人員是否有見於文檔的提醒用戶安全漏洞和補丁的機制。缺乏這樣的機制是一個重要的警告信號,說明這個發行版不夠成熟,不能被用作主要管理員的工作站。
多數常用的發行版提供定期安全更新,但應該經常檢查以確保及時提供關鍵包更新。因此應避免使用附屬發行版(spin-off)和“社區重構”,因為它們必須等待上游發行版先發布,它們經常延遲發布安全更新。
現在,很難找到一個不使用加密簽名、更新元數據或二者都不使用的發行版。如此說來,常用的發行版在引入這個基本安全機制就已經知道這些很多年了(Arch,說你呢),所以這也是值得檢查的。
檢查發行版是否支持 UEFI 和安全引導。查明它是否需要導入額外的密鑰或是否要求啟動內核有一個已經被系統廠商信任的密鑰簽名(例如跟微軟達成合作)。一些發行版不支持 UEFI 或安全啟動,但是提供了替代品來確保防篡改(tamper-proof)或防破壞(tamper-evident)引導環境(Qubes-OS 使用 Anti Evil Maid,前面提到的)。如果一個發行版不支持安全引導,也沒有防止引導級別攻擊的機制,還是看看別的吧。
全磁盤加密是保護靜止數據的要求,大多數發行版都支持。作為一個選擇方案,帶有自加密硬盤的系統也可以用(通常通過主板 TPM 芯片實現),並提供了類似安全級別而且操作更快,但是花費也更高。
所有發行版都是不同的,但是也有一些一般原則:
除非你正在使用自加密硬盤,配置你的安裝程序完整地加密所有存儲你的數據與系統文件的磁盤很重要。簡單地通過自動掛載的 cryptfs 環(loop)文件加密用戶目錄還不夠(說你呢,舊版 Ubuntu),這並沒有給系統二進制文件或交換分區提供保護,它可能包含大量的敏感數據。推薦的加密策略是加密 LVM 設備,以便在啟動過程中只需要一個密碼。
/boot
分區將一直保持非加密,因為引導程序需要在調用 LUKS/dm-crypt 前能引導內核自身。一些發行版支持加密的/boot
分區,比如 Arch,可能別的發行版也支持,但是似乎這樣增加了系統更新的復雜度。如果你的發行版並沒有原生支持加密/boot
也不用太在意,內核鏡像本身並沒有什麼隱私數據,它會通過安全引導的加密簽名檢查來防止被篡改。
現代的 Linux 系統沒有限制密碼口令長度,所以唯一的限制是你的偏執和倔強。如果你要啟動你的系統,你將大概至少要輸入兩個不同的密碼:一個解鎖 LUKS ,另一個登錄,所以長密碼將會使你老的更快。最好從豐富或混合的詞匯中選擇2-3個單詞長度,容易輸入的密碼。
優秀密碼例子(是的,你可以使用空格):
如果你喜歡輸入可以在公開場合和你生活中能見到的句子,比如:
如果你願意的話,你也應該帶上最少要 10-12個字符長度的非詞匯的密碼。
除非你擔心物理安全,你可以寫下你的密碼,並保存在一個遠離你辦公桌的安全的地方。
我們建議,你的 root 密碼和你的 LUKS 加密使用同樣的密碼(除非你共享你的筆記本給信任的人,讓他應該能解鎖設備,但是不應該能成為 root 用戶)。如果你是筆記本電腦的唯一用戶,那麼你的 root 密碼與你的 LUKS 密碼不同是沒有安全優勢上的意義的。通常,你可以使用同樣的密碼在你的 UEFI 管理,磁盤加密,和 root 登錄中 -- 知道這些任意一個都會讓攻擊者完全控制您的系統,在單用戶工作站上使這些密碼不同,沒有任何安全益處。
你應該有一個不同的,但同樣強健的常規用戶帳戶密碼用來日常工作。這個用戶應該是管理組用戶(例如wheel
或者類似,根據發行版不同),允許你執行sudo
來提升權限。
換句話說,如果在你的工作站只有你一個用戶,你應該有兩個獨特的、強健(robust)而強壯(strong)的密碼需要記住:
管理級別,用在以下方面:
用戶級別,用在以下:
很明顯,如果有一個令人信服的理由的話,它們全都可以不同。
安裝後的安全加固在很大程度上取決於你選擇的發行版,所以在一個像這樣的通用文檔中提供詳細說明是徒勞的。然而,這裡有一些你應該采取的步驟:
將火線和雷電模塊列入黑名單,增加一行到/etc/modprobe.d/blacklist-dma.conf
文件:
blacklist firewire-core
blacklist thunderbolt
重啟後的這些模塊將被列入黑名單。這樣做是無害的,即使你沒有這些端口(但也不做任何事)。
默認的 root 郵件只是存儲在系統基本上沒人讀過。確保你設置了你的/etc/aliases
來轉發 root 郵件到你確實能讀取的郵箱,否則你也許錯過了重要的系統通知和報告:
#Personwho should get root's mail
root: [email protected]
編輯後這些後運行newaliases
,然後測試它確保能投遞到,像一些郵件供應商將拒絕來自不存在的域名或者不可達的域名的郵件。如果是這個原因,你需要配置郵件轉發直到確實可用。
默認的防火牆設置將取決於您的發行版,但是大多數都允許sshd
端口連入。除非你有一個令人信服的合理理由允許連入 ssh,你應該過濾掉它,並禁用 sshd 守護進程。
systemctl disable sshd.service
systemctl stop sshd.service
如果你需要使用它,你也可以臨時啟動它。
通常,你的系統不應該有任何偵聽端口,除了響應 ping 之外。這將有助於你對抗網絡級的零日漏洞利用。
建議打開自動更新,除非你有一個非常好的理由不這麼做,如果擔心自動更新將使您的系統無法使用(以前發生過,所以這種擔心並非杞人憂天)。至少,你應該啟用自動通知可用的更新。大多數發行版已經有這個服務自動運行,所以你不需要做任何事。查閱你的發行版文檔了解更多。
你應該盡快應用所有明顯的勘誤,即使這些不是特別貼上“安全更新”或有關聯的 CVE 編號。所有的問題都有潛在的安全漏洞和新的錯誤,比起停留在舊的、已知的問題上,未知問題通常是更安全的策略。
你應該會對你的系統上發生了什麼很感興趣。出於這個原因,你應該安裝logwatch
然後配置它每夜發送在你的系統上發生的任何事情的活動報告。這不會預防一個專業的攻擊者,但是一個不錯的安全網絡功能。
注意,許多 systemd 發行版將不再自動安裝一個“logwatch”所需的 syslog 服務(因為 systemd 會放到它自己的日志中),所以你需要安裝和啟用“rsyslog”來確保在使用 logwatch 之前你的 /var/log 不是空的。
安裝rkhunter
和一個類似aide
或者tripwire
入侵檢測系統(IDS)並不是那麼有用,除非你確實理解它們如何工作,並采取必要的步驟來設置正確(例如,保證數據庫在外部介質,從可信的環境運行檢測,記住執行系統更新和配置更改後要刷新散列數據庫,等等)。如果你不願在你的工作站執行這些步驟,並調整你如何工作的方式,這些工具只能帶來麻煩而沒有任何實在的安全益處。
我們建議你安裝rkhunter
並每晚運行它。它相當易於學習和使用,雖然它不會阻止一個復雜的攻擊者,它也能幫助你捕獲你自己的錯誤。
工作站備份往往被忽視,或偶爾才做一次,這常常是不安全的方式。
把全部備份放到一個移動磁盤中比較方便,不用擔心帶寬和上行網速(在這個時代,大多數供應商仍然提供顯著的不對稱的上傳/下載速度)。不用說,這個移動硬盤本身需要加密(再說一次,通過 LUKS),或者你應該使用一個備份工具建立加密備份,例如duplicity
或者它的 GUI 版本 deja-dup
。我建議使用後者並使用隨機生成的密碼,保存到離線的安全地方。如果你帶上筆記本去旅行,把這個磁盤留在家,以防你的筆記本丟失或被竊時可以找回備份。
除了你的家目錄外,你還應該備份/etc
目錄和出於取證目的的/var/log
目錄。
尤其重要的是,避免拷貝你的家目錄到任何非加密存儲上,即使是需要快速的在兩個系統上移動文件時,一旦完成你肯定會忘了清除它,從而暴露個人隱私或者安全信息到監聽者手中 -- 尤其是把這個存儲介質跟你的筆記本放到同一個包裡。
站外備份(Off-site backup)也是相當重要的,是否可以做到要麼需要你的老板提供空間,要麼找一家雲服務商。你可以建一個單獨的 duplicity/deja-dup 配置,只包括重要的文件,以免傳輸大量你不想備份的數據(網絡緩存、音樂、下載等等)。
作為選擇,你可以使用零認知(zero-knowledge)備份工具,例如 SpiderOak,它提供一個卓越的 Linux GUI工具還有更多的實用特性,例如在多個系統或平台間同步內容。
下面是我們認為你應該采用的最佳實踐列表。它當然不是非常詳細的,而是試圖提供實用的建議,來做到可行的整體安全性和可用性之間的平衡。
毫無疑問, web 浏覽器將是你的系統上最大、最容易暴露的面臨攻擊的軟件。它是專門下載和執行不可信、甚至是惡意代碼的一個工具。它試圖采用沙箱和代碼清潔(code sanitization)等多種機制保護你免受這種危險,但是在之前它們都被擊敗了多次。你應該知道,在任何時候浏覽網站都是你做的最不安全的活動。
有幾種方法可以減少浏覽器的影響,但這些真實有效的方法需要你明顯改變操作您的工作站的方式。
這很容易做到,但是只有很少的安全效益。並不是所有浏覽器都可以讓攻擊者完全自由訪問您的系統 -- 有時它們只能允許某人讀取本地浏覽器存儲,竊取其它標簽的活動會話,捕獲浏覽器的輸入等。使用兩個不同的浏覽器,一個用在工作/高安全站點,另一個用在其它方面,有助於防止攻擊者請求整個 cookie 存儲的小問題。主要的不便是兩個不同的浏覽器會消耗大量內存。
我們建議:
使用火狐登錄工作有關的站點,應該額外關心的是確保數據如 cookies,會話,登錄信息,擊鍵等等,明顯不應該落入攻擊者手中。除了少數的幾個網站,你不應該用這個浏覽器訪問其它網站。
你應該安裝下面的火狐擴展:
[ ] NoScript (關鍵)
[ ] Privacy Badger (關鍵)
[ ] HTTPS Everywhere (關鍵)
[ ] Certificate Patrol (中等)
你應該讓火狐成為你打開連接時的默認浏覽器,因為 NoScript 將在加載或者執行時阻止大多數活動內容。
Chromium 開發者在增加很多很好的安全特性方面走在了火狐前面(至少在 Linux 上),例如 seccomp 沙箱,內核用戶空間等等,這會成為一個你訪問的網站與你其它系統之間的額外隔離層。Chromium 是上游開源項目,Chrome 是 Google 基於它構建的專有二進制包(加一句偏執的提醒,如果你有任何不想讓谷歌知道的事情都不要使用它)。
推薦你在 Chrome 上也安裝Privacy Badger 和 HTTPS Everywhere 擴展,然後給它一個與火狐不同的主題,以讓它告訴你這是你的“不可信站點”浏覽器。
這有點像上面建議的做法,除了您將添加一個通過快速訪問協議運行在專用虛擬機內部 Chrome 的額外步驟,它允許你共享剪貼板和轉發聲音事件(如,Spice 或 RDP)。這將在不可信浏覽器和你其它的工作環境之間添加一個優秀的隔離層,確保攻擊者完全危害你的浏覽器將必須另外打破 VM 隔離層,才能達到系統的其余部分。
這是一個鮮為人知的可行方式,但是需要大量的 RAM 和高速的處理器來處理多增加的負載。這要求作為管理員的你需要相應地調整自己的工作實踐而付出辛苦。
了解下 Qubes-OS 項目,它致力於通過劃分你的應用到完全隔離的 VM 中來提供高度安全的工作環境。
使用好的、唯一的密碼對你的團隊成員來說應該是非常關鍵的需求。憑證(credential)盜取一直在發生 — 通過被攻破的計算機、盜取數據庫備份、遠程站點利用、以及任何其它的方式。憑證絕不應該跨站點重用,尤其是關鍵的應用。
每個浏覽器有一個比較安全的保存密碼機制,可以同步到供應商維護的,並使用用戶的密碼保證數據加密。然而,這個機制有嚴重的劣勢:
也有一些支持良好、免費或便宜的密碼管理器,可以很好的融合到多個浏覽器,跨平台工作,提供小組共享(通常是付費服務)。可以很容易地通過搜索引擎找到解決方案。
任何與浏覽器結合的密碼管理器都有一個主要的缺點,它實際上是應用的一部分,這樣最有可能被入侵者攻擊。如果這讓你不放心(應該這樣),你應該選擇兩個不同的密碼管理器 -- 一個集成在浏覽器中用來保存網站密碼,一個作為獨立運行的應用。後者可用於存儲高風險憑證如 root 密碼、數據庫密碼、其它 shell 賬戶憑證等。
這樣的工具在團隊成員間共享超級用戶的憑據方面特別有用(服務器 root 密碼、ILO密碼、數據庫管理密碼、引導程序密碼等等)。
這幾個工具可以幫助你:
個人加密密鑰,包括 SSH 和 PGP 私鑰,都是你工作站中最重要的物品 -- 這是攻擊者最想得到的東西,這可以讓他們進一步攻擊你的平台或在其它管理員面前冒充你。你應該采取額外的步驟,確保你的私鑰免遭盜竊。
防止私鑰被偷的最好方式是使用一個智能卡存儲你的加密私鑰,絕不要拷貝到工作站上。有幾個廠商提供支持 OpenPGP 的設備:
確保 PGP 主密碼沒有存儲在工作站也很重要,僅使用子密碼。主密鑰只有在簽名其它的密鑰和創建新的子密鑰時使用 — 不經常發生這種操作。你可以照著 Debian 的子密鑰向導來學習如何將你的主密鑰移動到移動存儲並創建子密鑰。
你應該配置你的 gnupg 代理作為 ssh 代理,然後使用基於智能卡 PGP 認證密鑰作為你的 ssh 私鑰。我們發布了一個詳盡的指導如何使用智能卡讀取器或 Yubikey NEO。
如果你不想那麼麻煩,最少要確保你的 PGP 私鑰和你的 SSH 私鑰有個強健的密碼,這將讓攻擊者很難盜取使用它們。
當系統掛起時,內存中的內容仍然保留在內存芯片中,可以會攻擊者讀取到(這叫做冷啟動攻擊(Cold Boot Attack))。如果你離開你的系統的時間較長,比如每天下班結束,最好關機或者休眠,而不是掛起它或者就那麼開著。
如果你使用捆綁了 SELinux 的發行版(如 Fedora),這有些如何使用它的建議,讓你的工作站達到最大限度的安全。
audit2allow -M
,應該經常檢查 (關鍵)setenforce 0
(中等)staff_u
(中等)
SELinux 是強制訪問控制(Mandatory Access Controls,MAC),是 POSIX許可核心功能的擴展。它是成熟、強健,自從它推出以來已經有很長的路了。不管怎樣,許多系統管理員現在仍舊重復過時的口頭禅“關掉它就行”。
話雖如此,在工作站上 SELinux 會帶來一些有限的安全效益,因為大多數你想運行的應用都是可以自由運行的。開啟它有益於給網絡提供足夠的保護,也有可能有助於防止攻擊者通過脆弱的後台服務提升到 root 級別的權限用戶。
我們的建議是開啟它並強制使用(enforcing)。
setenforce 0
使用setenforce 0
臨時把 SELinux 設置為許可(permissive)模式很有誘惑力,但是你應該避免這樣做。當你想查找一個特定應用或者程序的問題時,實際上這樣做是把整個系統的 SELinux 給關閉了。
你應該使用semanage permissive -a [somedomain_t]
替換setenforce 0
,只把這個程序放入許可模式。首先運行ausearch
查看哪個程序發生問題:
ausearch -ts recent -m avc
然後看下scontext=
(源自 SELinux 的上下文)行,像這樣:
scontext=staff_u:staff_r:gpg_pinentry_t:s0-s0:c0.c1023
^^^^^^^^^^^^^^
這告訴你程序gpg_pinentry_t
被拒絕了,所以你想排查應用的故障,應該增加它到許可域:
semange permissive -a gpg_pinentry_t
這將允許你使用應用然後收集 AVC 的其它數據,你可以結合audit2allow
來寫一個本地策略。一旦完成你就不會看到新的 AVC 的拒絕消息,你就可以通過運行以下命令從許可中刪除程序:
semanage permissive -d gpg_pinentry_t
SELinux 帶有角色(role)的原生實現,基於用戶帳戶相關角色來禁止或授予某些特權。作為一個管理員,你應該使用staff_r
角色,這可以限制訪問很多配置和其它安全敏感文件,除非你先執行sudo
。
默認情況下,用戶以unconfined_r
創建,你可以自由運行大多數應用,沒有任何(或只有一點)SELinux 約束。轉換你的用戶到staff_r
角色,運行下面的命令:
usermod-Z staff_u [username]
你應該退出然後登錄新的角色,屆時如果你運行id -Z
,你將會看到:
staff_u:staff_r:staff_t:s0-s0:c0.c1023
在執行sudo
時,你應該記住增加一個額外標志告訴 SELinux 轉換到“sysadmin”角色。你需要用的命令是:
sudo-i -r sysadm_r
然後id -Z
將會顯示:
staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023
警告:在進行這個切換前你應該能很順暢的使用ausearch
和audit2allow
,當你以staff_r
角色運行時你的應用有可能不再工作了。在寫作本文時,已知以下流行的應用在staff_r
下沒有做策略調整就不會工作:
切換回unconfined_r
,運行下面的命令:
usermod-Z unconfined_u [username]
然後注銷再重新回到舒適區。
IT 安全的世界是一個沒有底的兔子洞。如果你想深入,或者找到你的具體發行版更多的安全特性,請查看下面這些鏈接:
這項工作在創作共用授權4.0國際許可證許可下。
via: https://github.com/lfit/itpol/blob/bbc17d8c69cb8eee07ec41f8fbf8ba32fdb4301b/linux-workstation-security.md
作者:mricon 譯者:wyangsun 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出