跟著 Linux 基金會,學好如何強化主機的資訊安全

by 9月 05, 2015 0 意見        

讀完了 Linux 基金會 在 Github 上發佈的 Linux workstation security checklist 之後,覺得很有收獲,就花了些時間翻成繁體中文版。

不過,我的英文很窮 (My English is very pool .... XDD),如果有翻譯錯誤或不適當的部份,敬請打臉。


Linux 主機的安全性檢核清單

翻譯自 2015/09/03 的版本

目標對象


這份文件是針對這些使用 Linux 主機來存取或管理專案 IT 基礎架構的系統管理員團隊所寫的

如果你們的系統管理員是遠距工作者,你或許會想要透過這份指導方針來確認,他們的主機符合清單上的這些核心安全性需求,以期降低他們的主機風險,避免成為對基礎架構其他部份的攻擊媒介。

就算你們的系統管理員不是個遠距工作者,還是有機會從辦公室裡的筆記型電腦來執行大量的工作,或是在下班後、緊急狀況下,從家裡的電腦連線回公司的內部網路裡。不管是什麼狀況,你都可以調整這份建議資料來符合你的工作環境。

限制


這並不是一份強化主機的完全攻略,只是提供一些最基本的建議資料,用來避免大多數非常明顯的安全性錯誤,而且不會帶來太多的困擾。

你在看過這份文件之後,可能會覺得這一切都太偏執了,但其他人可能認為這些內容只是提到一些很表面的部份。安全就像我們在高速公路上開車, 比你開得慢的人像白痴一樣,而比你開得快的人卻像個瘋子。這些指導方針只是一些很基本的核心安全規則,而且不夠完整,也無法取代實際的管理經驗與常識。

我們依照 以開源方式貢獻 IT 政策文件帶來的好處 的方式分享這份文件,我們希望你可以透過撰寫你自己的分支版本,然後分享你改善的內容。

文件架構


每個段落都分為兩個部份:
  • 檢核清單 - 可以依照你自己的需求來調整
  • 注意事項 - 用任何形式條列出來,解釋因為哪些關鍵而決定這樣子做

優先順序


每個檢核清單的項目都包含了優先順序,我們希望有助於引導你做決定。
  • (絕對必要) 肯定是最先被考量的項目。如果不實作它的話,將會讓主機的安全性帶來極大的風險。
  • (儘量做到) 有助於提高整體的安全性,但是多少會影響到你與工作環境的互動方式,可能要放棄慣用的老方法,改學新的操作習慣。
  • (你是偏執狂) 是個我們認為這可以顯著提升主機安全性的保留項目,不過必須先進行大幅度的變更你與作業系統間的互動方式。

別忘了,這不是唯一的指導方針。如果你認為這些優先順序的等級,無法反映在專案中對安全性的承諾,你應該把把它修改成真正適合你的內容。


選擇對的硬體


我們不會強制要求管理員一定要找特定廠商或是特定型號,所以在這個段落定位在選擇有效設備的核心注意事項。

檢核清單

  • 支援 SecureBoot (絕對必要)
  • 沒有 Firewire、Thunderbolt 或 ExpressCard 等介面 (儘量做到)
  • 內建 TPM 晶片 (儘量做到)

注意事項


SecureBoot


儘量有相當的爭議性,但 SecureBoot 的確可以提供了對抗許多針對主機攻擊的防範能力 (Rootkits 惡意程式、Evil Maid 邪惡女僕),而不會造成過多額外的困擾。它無法阻止那種完全針對性的攻擊,而且有很高的可能性會被國家級的資安組織給攻破,但是有 SecureBoot 保護總比什麼都沒有要好的多。

或者,你可以安裝 Anti Evil Maid 反邪惡女僕程式,它提供了應該由 SecureBoot 來防禦的攻擊保護機制,不過它必須靠你自己努力的鑽研,來設定和維護這支程式的運作。

Firewire、Thunderbolt 及 ExpressCard 介面


Firewire 是個介面標準,被設計成允許連線中的設備完全可以直接存取系統記憶體 (參閱維基百科) 。Thunderbolt 與 ExpressCard 也有同樣的弱點,僅管後來 Thunderbolt 進行了一些修改,來試著限制記憶體存取的範圍。

如果在硬體設備上,原本就沒有這些介面當然最好,不過這並不算嚴重,因為這些介面通常可以透過 UEFI 來關閉,或是從 Linux 核心中停用它。

TPM 晶片


信任平台模組 (TPM) 是一塊加密晶片,從 CPU 被分離出來,被內建在主機板上,用在附加平台的安全性 (如:儲存完整磁碟加密的金鑰),但是通常不會被用在日常主機的運作上。

除非你的主機安全上有特殊需求,否則TPM晶片充其量只能被歸類到「盡量做到」的項目。


開機前的環境


這些是當你快要開始在主機上安裝作業系統前的建議資料。

檢核清單

  • 使用 UEFI 開機模式,別用傳統 BIOS 模式 (絕對必要)
  • 進入 UEFI 設定畫面時,一定要輸入密碼 (絕對必要)
  • 啟用 SecureBoot 功能 (絕對必要)
  • 開機時一定要輸入在 UEFI 裡設定的密碼 (儘量做到)

建議事項


UEFI 和 SecureBoot


UEFI 提供許多傳統 BIOS 沒有的好東西,像是 SecureBoot。許多的新系統都已經把 UEFI 模式設成預設值了。

要確認在進入 UEFI 設定畫面時,一定要輸入一組高強度的密碼。注意,許多製造商會悄悄的限制你被允許使用的密碼長度,所以你可能需要選擇一組 高度不可逆 (high-entropy) 的短密碼,與長過關密語 (接下來會有通關密語的詳細說明)。

依據你所選用的發行版不同,為了匯入這個發行版用來開機的 SecureBoot 金鑰來,你可能可以也或許不行,跳過一些額外的限制條件。不少發行版已經和 Microsoft 合作,用一把已經被大多系統製造商認可的金鑰,來簽署它們釋出的核心,因此避免了你在匯入金鑰時的一些困擾。

額外考量到有些人被允許存取開機分割區,並試著做一些惡意的動作之前,讓他們非得先輸入密碼才行。為了防止有人從旁偷窺,這組密碼應該要與 UEFI 設定畫面的密碼不同。如果你早就在用了,你可以選擇別理這個步驟,就像你早就輸入一組 LUKS (Linux Unified Key Setup) 過關密語一樣,這會讓你少敲一些按鈕。


選擇發行版的注意事項


你很有可能會堅持使用某一套很多人在用的發行版,如 Fedora、Ubuntu、Arch、Debian 或是它們的衍生發行版。不論是什麼情況,在選擇使用某一個發行版的時候,你都應該多考慮考慮。

檢核清單


注意事項


SELinuxAppArmorGrSecuroity / PaX


委任式存取控制 (以下簡稱 MAC) 或基於角色的存取控制 (以下簡稱 RBAC) 是被傳統 POSIX 系統裡,用在使用者 / 群組這種基本安全機制的一種延伸功能。

大多數的發行版不是已經內建了這種 MAC / RBAC 的實作,如:Fedora、Ubuntu,否則就是提供一種在系統安裝完成之後,可以自行加入的機制,如:Gentoo、Arch、Debian。顯然,我們強烈建議你選擇一套預設就已經在事先設定好 MAC / RBAC 功能的發行版,但是你可能會強烈的認為,這一套發行版預設並沒有這樣做,那麼在系統安裝完成之後,好好安排一下設定的工作吧。

對於某些沒有提供任何 MAC / RBAC 機制的發行版,應該儘可能避免去使用它,比方傳統 POSIX 標準的使用者 / 群組安全機制,在現今的狀況下已經不敷使用了。如果你想要有一台擁有 MAC / RBAC 功能的主機,AppArmor 與 GrSecurity / PaX 會比 SELinux 更容易上手。

此外,幾乎沒有或完全沒有額外的監聽服務的主機上面,以使用者身份執行的應用程式會面對極高風險,GrSecurity / PaX 會比只有使用 SELinux,能提供你更多的安全性優勢。

發行版的安全性公告


大多數常用的發行版都有傳送安全性公告給使用者的機制,不過要是你偏好更深奧的部份,可以檢查一下開發者是否提供給使用者,關於這些資安漏洞、更新檔案等說明文件的機制。

要是缺乏這個機制的話,會是個很大的警訊,代表不足以認可這個發行版可以被用在主要的管理主機身上。

即時且可靠的安全性更新


大多數常用的發行版會提供定期的安全性更新,但為了確保套件的重大更新會被及時的提供,還是要再確認一下。基於這個理由,避免去使用衍生或社群重新打包的版本,因為必須要等上游發行版先釋出才行,往往會導致延遲釋出安全性更新。

你可能很難找到沒有在套件及更新描述資料上,不使用數位簽章的發行版。話雖如此,在我們介紹這個基本的安全機制之前,大多數常見的發行版早就已經做很多年了 (Arch,我就是在看你),所以這真的值得一試。

支援 UEFI 與 SecureBoot 的發行版


檢查一下這個發行版對 UEFI 與 SecureBoot 的支援狀況。了解是否需要匯入額外的金鑰,或是用一把已經被系統製造商信任的金鑰簽署它的開機核心 (例如通過 Microsoft 的授權)。某些發行版並不支援 UEFI 跟 SecureBoot,但是有提供其他替代方案,以確保開機環境的防篡改或防竊。

如果這個發行版不支援 SecureBoot,也沒有任何機制可以防止開機層級的攻擊,最好再看看別套吧。

完整磁碟加密


完整磁碟加密是確認其他資料安全性的必要條件,而且大多數發行版都有支援。
作為替代方案,使用具有硬碟自我加密功能的系統也不錯 (通常都是用主機板內建的 TPM 晶片來實作),提供既安全又快的運作,能達到相當的水準之上,不過也得花上更多的成本。


安裝作業系統時的指導方針


所有的發行版都不同,但是這裡有些基本的指導方針

核檢清單

  • 採用完整磁碟加密 (LUKS) 搭配強而有力的過關密語 (絕對必要)
  • 確定 Swap 分割區也被加密 (絕對必要)
  • 要先輸入密碼才可以編輯 boot loader (密碼可以和 LUKS 相同) (絕對必要)
  • 為 root 帳號設定一組強而有力的密碼 (密碼可以和 LUKS 相同) (絕對必要)
  • 使用管理員群組裡的無特權帳號 (絕對必要)
  • 為這個管理帳號設定一組強而有力的密碼,要與 root 帳號的密碼不同 (絕對必要)

注意事項


完整磁碟加密


除非你用的是自我加密型的硬碟,否則在設定安裝程式的選項時,用來儲存個人資料與系統檔案的硬碟,把它們全部加密是很重要的。

透過自動掛載 cryptfs loop 檔,無法輕易的將使用者目錄加密。(我就是在看你,舊版的 Ubuntu),沒有辦法保護系統裡的執行檔或 Swap 分割區,那些多半包含敏感資料的部份。建議的加密策略是將 LVM 格式的設備加密,那麼在開機過程中只需要一組過關密語即可。

/boot 分割區通常會保留在不加密的狀態,在引用 LUKS / dm-crypt 之前,開機載入程式必須可以啟用核心本身。某些發行版支援將 /boot 分割區妥善的加密 (例如:Arch),在其他的發行版上也可以,但是可能在系統更新時會搞得很複雜。

如果你選的發行版沒有原生支援 /boot 加密的話,並不是太嚴重,只要核心映像檔本身沒有洩漏私人資料,並且已經利用 SecureBoot 檢查數位簽章,保護它不被篡改。

選擇一組好的通關密語


現今的 Linux 系統對密碼 / 通關密語的長度已經沒有限制,真正的限制是你自己的偏執程度與堅持。

如果你常常重新開機,你可能要輸入至少兩組不同的密碼:一組用來把 LUKS 解鎖,另一組用來登入,這樣的話,長的過關密語可能會讓你老的很快。挑選由長度是兩到三個字元,容易輸入,最好來自混雜的詞彙所組成的通關密語。
這是好的通關密語範例 (沒錯,你可以用空格):
  • nature abhors roombas
    自然討厭倫巴
  • 12 in-flight Jebediahs
    12 個飛行中的 Jebediahs (一個澳州的樂團)
  • perdon, tengo flatulence
    對不起,我有脹氣 (perdon & tengo 是西班牙文)

差的通關密語是由被發表的作品中,或是任何真實生活裡常看到的字所組成,就像:
  • Mary had a little lamb
    瑪麗有一個小燈泡
  • you're a wizard, Harry
    你是一個巫師,哈利
  • to infinity and beyond
    無極限而且超越一切

如果你比較喜歡用一組 10 到 12 個字元長,非日常詞彙的通關密語,的確也可以堅持這麼做。除非你顧慮到實體安全上的問題,否則最好把你的通關密語寫下來,然後藏在一個遠離你辦公桌的地方。

Root 帳號,使用者帳號與管理員群組


我們建議你把 root 帳號和 LUKS 加密用的通關密語設定成同一組 (除非你把電腦和其他信得過的人共用,讓他可以將電腦解除鎖定,不過不應該允許他切換成 root)。如果你是這台電腦唯一的使用者,那麼把 root 帳號和 LUKS 的密碼設定成不一樣,就安全性的優勢來說沒什麼意義。

通常,你可以把同樣的通關密語用在 UEFI 的管理介面、磁碟加密,與 root 帳號上,不管被攻擊者知道任何一組,都可以完全控制你的系統;因此在單一使用者的主機上,把它們全部設定成不同的密碼,只有非常不起眼的好處。

你真正需要的是一組完全不同,但同樣可靠的密碼,用在你執行日常工作用的普通使用者帳號上面。這個普通使用者應該是管理員群組的一員 (例如:wheel 或類似的群組,取決於你用的發行版),讓你可以執行 sudo 指令來提升權限。

換句話說,如果你是這個主機上的唯一用戶,你應該記住兩組不同,強而有力,一樣可靠的通關密語。

管理層,用在這些地方:
  • UEFI 的管理
  • 開機載入程式 (GRUB)
  • 磁碟加密 (LUKS)
  • 主機的管理工作 (root 帳號)

使用層,用在這些地方:
  • 使用者帳號和 sudo 指令
  • 密碼管理程式的主要密碼

如果還有更令人信服的原因,上面這些建議顯然都可以變更。


安裝後的強化


在安裝後的安全性強化,大部份取決於你選擇的發行版,所以提供類似這種詳細操作說明的文件,實在沒有什麼作用。就算如此,這邊還是有幾個你應該採取的步驟:

檢核清單

  • 全面停用 Firewire 和 Thunderbolt 模組 (絕對必要)
  • 檢查防火牆,確認所有的連入通訊埠都已經被過濾 (絕對必要)
  • 確認 root 帳號的信件都會轉寄到你的信箱 (絕對必要)
  • 設定系統自動更新的排程,或是更新提示 (絕對必要)
  • 確認 sshd 服務的預設值是被停用的 (儘量做到)
  • 設定在一段時間不使用電腦之後,螢幕保護程式會自動鎖定 (儘量做到)
  • 設定 log 日誌檢視器 (儘量做到)
  • 安裝並使用 rkhunter (儘量做到)
  • 安裝入侵偵測系統 (儘量做到)

注意事項


模組的黑名單


把 Firewire 跟 Thunderbolt 模組加入黑名單,把下面這幾行加到 /etc/modprobe.d/blacklist-dma.conf 檔案裡:
blacklist firewire-core
blacklist thunderbolt

重新開機後,這些模組就會被列入黑名單。對系統不會有任何傷害,就算你沒有這些介面 (它本來也就不會生效)。

Root 帳號的信件


預設的情況下,root 帳號的信件就只是被存在系統裡,而且往往從來沒有被讀取過。

確認你在 /etc/aliases 檔案裡設定了root 帳號的信件會轉寄到你真的會去看的信箱,否則你可能會錯過重要的系統通知和報告。
# 可以收到 root 帳號信件的人
root:        my_account@my_domain.com.tw

在編輯信件轉寄設定後,執行 newaliases 指令,來確認信件真的已經被寄送出去,因為有些信箱提供者會拒絕來自不存在的域名或域名無法被路由處理的信件。如果真的遇到了,你就只能多試幾次,直到你的轉寄設定真的生效為止。

防火牆,SSH 服務與監聽中的服務


預設的防火牆設定值取決於你用的發行版,不過大多人都會允許連入 sshd 通訊埠。除非你有一個令人信服的正當理由允許 ssh 連線進來,否則你應該過濾掉並停用 sshd 服務。
systemctl disable sshd.service
systemctl stop sshd.service

在有需要的時候,再暫時啟用它。

通常你的系統不應該有任何監聽中的通訊埠,除了回覆 ping 指令之外。這有助於保護你對抗網路層的 Zero Day 漏洞。

自動更新或通知


建議打開自動更新,除非你有很好的理由不這麼做,例如:擔心自動更新之後會把系統搞死 (這不是無的放矢,因為真的發生過)。最起碼,你應該啟用有可用更新時的自動通知。大部份的發行版都已經幫你自動執行好這個服務了,所以你可能沒機會做這件事。請參閱你用的發行版文件,以了解更多相關資訊。

你應該儘快套用所有重要的勘誤,即使沒有特別被標註成「安全性更新」或出現一個相關的 CVE 代碼。所有的 Bug 都有成為資安漏洞和新版錯誤的可能性,未知的 Bug 通常比堅持用舊的、已知的要來得安全一些。

留意 log 記錄


你應該很有興趣了解你的系統上發生過什麼事。基於這個理由,你應該安裝 logwatch 並設定它寄送系統裡所有事件的每日活動報告。它無法阻擋專門的攻擊者,不過它是個應該要準備好的安全網功能。

請注意,許多使用 systemd 的發行版不再自動安裝 logwatch 所需的系統日誌伺服器 (因為 systemd 有自己的的日誌),所以在 logwatch 被使用之前,你得先安裝並啟用 rsyslog 來確保 /var/log 目錄不是空的。

Rkhunter 與入侵偵測系統


安裝 rkhunter 與入侵偵測系統 (IDS,intrusion detection system) 如:aide tripwire,並不是那麼有用,除非你真的了解它們怎麼運作,而且用必要的步驟來正確的設定起來 (例如:將資料庫保存在外部媒體,從可信任的環境中進行檢查,在執行完系統更新和設定值調整之後,更新 hash 資料庫 ... 等)。如果你不願意進行這些步驟,並調整你在自己主機上做的事,那麼這些工具只會為你帶來困擾,而不會有明確的安全性好處。

我們建議安裝 rkhunter 並每晚執行它。它很易學也易用,雖然它無法阻止一個老手的攻擊,至少它可以幫助你抓到自己的錯誤。


個人主機的備份


主機的備份往往被忽視、或想到才用不安全的方式來進行。


檢核清單

  • 把加密過的主機備份存到外接的儲存設備去 (絕對必要)
  • 用懶人備份工具傳到異地或雲端 (儘量做到)

注意事項


所有加密過的備份資料存到外接的儲存設備


用一個外接硬碟用來儲存所有備份資料,而不用擔心頻寬跟上傳速度的問題,是件蠻不錯的事 (現在這個時代,大多數的 ISP 還在提供上下傳不對稱的網路頻寬)。不用多說,這顆硬碟一定要有自我加密的功能 (又來了,透過 LUKS),或是你應該用一套備份工具來建立加密過的備份資料,像是 Duplicity 或是它的圖形介面程式 Déjà Dup。如果用備份工具的話,我建議要用一組優良、隨機產生的通關密語,儲存安全的離線位置。如果你要帶著筆記型電腦外出,把這顆硬碟留在家裡,如果電腦不幸遺失或被偷的話,還有機會可以把資料還原。

除了你的家目錄之外,你還應該為了各種法律用途,把 /etc/var/log 目錄備份起來。

尤其是,避免把你的家目錄複製到任何未加密的儲存設備,就算那是個在系統間搬移檔案的快速管道,因為一旦你做完這件事之後,肯定會忘了砍掉它。如果當你把這個儲存設備跟電腦放在同一個包包裡,私人資料或是其他的高度敏感的安全性資料將會暴露在有意窺探的人手上。

選擇懶人異地備份


異地備份也是非常重要的一環,如果你的主管提供了儲存空間來備份或雲端硬碟,也可以順便幫他完成。你可以設定一個單獨的 Duplicity / Déjà Dup 設定檔,只包含了最重要的檔案,避免傳輸了大量你真的不認為該做異地備份的資料 (網路快取檔案、音樂、下載的檔案 ... 等)。

另外,你也可以使用懶人備份工具,像是 SpiderOak,它提供了一個完美的 Linux 圖形介面工具,而且還有許多實用的功能,像是在多系統或多平台之間同步內容。


最佳作法


接下來這些是我們認為你應該要採取的最佳作法執行清單。它肯定無法面面俱到,只能試著去提供一些實用的建議,在安全性與整體可用性之間,找出一個可行的平衡點。

上網瀏覽


毫無疑問,瀏覽器一定是系統裡目標最大而且最容易被攻擊的軟體。它是個專門用來下載與執行那些不可靠、常常有惡意代碼的工具。它試圖採用多種機制,像是沙箱和程式碼清理等技術,在危險中保護你的安全,但是這些方式已經在多種場合中被攻破。你必須要了解上網瀏覽網站是每天的行程裡最不安全的活動。

有幾種方法可以降低瀏覽器被攻破的狀況,但是真正有效的方法是當你在主機工作的時候,必須做出一些明顯的改善。

1:用兩套不同的瀏覽器 (絕對必要)


這很簡單,不過只會增加一點點的安全性。不是所有的瀏覽器都會讓攻擊者如入無人之境般的進到你的系統,有時他們被限制只能讀取瀏覽器在本機的儲存空間、竊取從其他頁籤被使用的 Session、截取輸入到瀏覽器的資料 ... 等等。使用兩套不同的瀏覽器,一套用在公務用途或連線到高安全性的網站,做其他事情就用另一套,這樣子可以用來稍微減少攻擊者將所有的 cookies 全都拿走的機會。而最大的不便是,同時使用兩套瀏覽器會消耗掉大量的記憶體空間。

我們有些建議:

Firefox 用在公務用途及高安全性的網站


用 Firefox 去連線跟公務相關的網站,針對那些要特別注意 cookies、sessions、登入資訊、鍵盤輸入 ... 等,完全不應該落入攻擊者手上的那些資料。你不應該用 Firefox 連到跟這些事情無關的網站,除了極少數狀況。

你也應該要安裝這些 Firefox 的附加元件:
  • NoScript (絕對必要)
    NoScript 用來避免載入非白名單裡的網頁內容。在預設瀏覽器裡用它會是個大麻煩 (雖然它可以帶來很多安全性上的優點),所以我們建議只在存取跟公務相關的網站時才啟用它。

  • Privacy Badger (絕對必要)
    EFF 的 Privacy Badger 可以防止大多數外來的追蹤程式,還有被載入的廣告平台,用來避免瀏覽器向這些追蹤網站妥協。(追蹤程式和廣告網站是攻擊者常見的目標,因為可以很快的傳播到全世界數以千計的網站)。

  • HTTPS Everywhere (絕對必要)
    這套 EFF 開發的附加元件可以確保大部份的網站都透過 HTTPS 安全連線來存取,就算你是用 HTTP 方式連線 (避免相當數量的 SSL-stip 之類的攻擊)。

  • Certificate Patrol (儘量做到)
    這個工具會在網站突然變更他們的 TLS 憑證的時候通知我們,特別是憑證還沒到期,或是他們改用不同的憑證管理中心。它會在有人試著用中間人攻擊的時候警告你,不過可能會跳出一大堆假警報就是了。

你應該在打開網站連結的時候,保留 Firefox 做為預設使用的瀏覽器,像是 NoScript 會在載入或執行時,阻止大多數的主動內容。

其他的事情就交給 Chrome / Chromium


Chromium 的開發者們比 Firefox 更早加入很多很棒的安全性功能 (至少在 Linux 上是),像是 seccomp 沙箱、核心的使用者命名空間 ... 等,在你的系統跟連線的網站之間,增加了一個隔離層。Chromium 是一個上游的開源專案,Google 基於它產生了自己的專屬版本: Chrome (加入了一些讓偏執狂為了一些不想讓 Google 知道而不使用它的東西)。

建議應該在 Chrome 安裝 Privacy BadgerHTTPS Everywhere 擴充功能,還有幫 Firefox 換一套很不一般的佈景主題,代表這是「不被信任網站」連線用的瀏覽器。

2:用兩套不一樣的瀏覽器,其中一套裝在專屬的虛擬機器裡 (儘量做到)


這是個類似上一項的建議,除了得增加一個額外的步驟,把用在其他用途的瀏覽器裝到專屬的虛擬機器裡,利用一些快速的協定,讓你可以共用剪貼簿和轉送音效事件 (例如:SpiceRDP)。這會在不受信任的瀏覽器與你的工作環境間,多了一個完美的隔離層,確保已經取得瀏覽器完整權限的攻擊者,為了取得系統裡其他的部份,接著還得開始破壞虛擬機器隔離層才行。

這是個太驚人的有效架構,不過一樣需要用到大量的記憶體,以及夠快的 CPU,才撐得住這些追加的資源需求。它還需要管理員大幅調整處理公務的作法。

3:用虛擬化的技術將工作環境與休閒環境完全隔開 (你是偏執狂)


參閱 Qubes-OS 專案,他們力求提供一個高安全性的主機環境,透過在一個完全隔離的虛擬機器裡,將你的應用程式區隔開來。


密碼管理程式


檢核清單

  • 使用一套密碼管理程式 (絕對必要)
  • 在不相關的網站,用不同的密碼 (絕對必要)
  • 使用支援團隊分享的密碼管理程式 (儘量做到)
  • 再裝一套密碼管理程式,用在非瀏覽網站的用途 (儘量做到)

注意事項


每個團隊成員都應該要嚴格的要求他們使用優良且獨特的密碼。隨時都可能發生憑證被偷的狀況,不論是電腦被感染、資料庫傾印檔遭竊、遠端網站漏洞,或是任何類似的手段。不應該有任何一張憑證被重覆用在各網站之間,特別是關鍵的應用程式。

瀏覽器裡的密碼管理程式


每個瀏覽器都有相當安全的密碼保存機制,在保存用私人通關密語加密過的資料時,還可以跟雲端空間同步。

然而,這個機制有個重大缺點在:
  1. 沒有辦法跨瀏覽器使用。
  2. 沒有任何方法將憑證分享給團隊成員。

這邊有幾套支援性不錯、免費或便宜的密碼管理程式,可以與多種瀏覽器整合、在多種平台上運作,還有群組分享的功能 (通常是付費功能)。你可以輕易的用搜尋引擎找到。

獨立的密碼管理程式


所有密碼管理程式的主要缺點之一,就是將瀏覽器功能整合在一起,這是最有可能被入侵者攻擊的一部份。或許這讓你覺得不太舒服 (而且一定會),你得選擇兩套不同的密碼管理程式,一套整合到瀏覽器用來上網,另一套則是獨立的應用程式。後者可以用來儲存高風險的憑證,比如說: root 帳號的密碼、資料庫的密碼、其他 shell 帳號的憑證 ...等等。

使用這樣的工具非常有幫助,尤其是在和團隊裡的其他成員分享最高權限使用者的憑證時 (伺服器 root 帳號的密碼、ILO 的密碼)、資料庫管理員的密碼、開機載入程式的密碼 ... 等等)。

這些工具可以幫助你:
  • KeePassX,在第二版改善了團隊分享的功能。
  • Pass,使用了純文字檔案、PGP 金鑰,並且用 git 來整合
  • Django-Pstore,使用 GPG 功能在管理員之間分享憑證
  • Hiera-Eyaml,如果你已經在基礎架構中使用了 Puppet,你可以輕易的追蹤伺服器 / 服務的憑證,成為 Hiera 加密資料庫的一部份。

保護好 SSH 和 PGP 私鑰


個人的加密金鑰,包括 SSH 跟 PGP 私鑰,都是主機裡最最最珍貴的東西,部份攻擊者非常有興趣拿到它,因為這可以讓他們有能力攻擊你的基礎架構,或是冒充成其他管理員身份。你應該採取一些額外的步驟來確保你的私鑰被妥善保護好,不致遭竊。

檢核清單

  • 用一組夠強的過關密語來保護私鑰 (絕對必要)
  • 將PGP 主要金鑰儲存在可移除的儲存設備裡 (儘量做到)
  • 將認證、簽章及子金鑰儲存在智慧卡裝置 (儘量做到)
  • 將 SSH 設定成使用 PGP 認證金鑰做為私鑰 (儘量做到)

注意事項


避免私鑰被偷最好的方法是使用智慧卡來儲存你的加密私鑰,而且別把它複製到主機裡。
這邊有幾家提供 OpenPGP 功能的設備製造商:
  • Kernel Concepts,你可以同時買到相容於 OpenPGP 的智慧卡跟 USB 讀卡機,相信你一定用的到。
  • Yubikey NEO,它提供 OpenPGP 智慧卡的功能,還有附加了不少超酷的功能 (U2F、PIV、HOTP 等等)。

同樣重要的還有,確認 PGP 主金鑰沒有被存在主要的主機裡,而且只用到子金鑰。主金鑰只會用在簽署其他人的金鑰,或是產生一個新的子金鑰,這種狀況不太常發生。你可以依照 the Debian's subkeys 的說明,學著如何將主金鑰移到外接儲存設備上,還有怎麼建立子金鑰。

接著,你應該要設定 GnuPG agent 做為 SSH agent,並使用基於智慧卡的 PGP 認證金鑰,當作你的 SSH 私鑰。我們發佈了一篇 詳細的操作指南,說明如果用智慧卡讀卡器或是 Yubikey NEO 來實作。

如果你沒辦法跑那麼遠,至少你應該要確認 PGP 私鑰和 SSH 私鑰,是用一組強大的通關密語來保護,這會讓攻擊者更難以去竊取或使用它。


休眠或關機,別用暫停


當系統暫停的時候,記憶體的內容會被保留在記憶體晶片裡,而且可以被攻擊者讀取 (被稱為 冷開機攻擊)。如果你要離開你的系統一段不算短的時間,比如說要下班了,最好的方法是在離開之前,用關機或休眠來取代暫停這個功能。



主機上的 SELinux 功能


如果你是用內建 SELinux 功能的發行版 (如 Fedora),這邊有些建議,針對如何善用它來儘可能的提供主機的安全性。

檢核清單

  • 確認在主機上啟用 SELinux 的強制模式。 (絕對必要)
  • 別盲目的執行 audit2allow -M 指令,一定要先檢查過 (絕對必要)
  • 千萬別執行 setenforce 0 執令 (儘量做到)
  • 把你的帳號切換成 SELinux 的使用者 staff_u (儘量做到)

注意事項


SELinux 是核心 POSIX 權限功能的委任式存取控制模組。發展已經很成熟了,也強而有力,而且已經推出很久很久了。儘管許多系統管理者每天掛在嘴邊的都是「把它關了」。

話雖如此,SELinux 依然對主機而言,還是有些安全性的好處,比方說,你以使用者身份執行的大多數應用程式都是不受限的。它確實提供了充份的好處,因為它可以協助預防利用脆弱的背景服務來不斷提升權限的攻擊者,獲得 root 等級存取權限的能力。

我們的建議是留著它而且是用強制模式。 

絕對別執行 setenfore 0


執行 setenforce 0 指令讓 SELinux 暫時切換到許可 (permissive) 模式,但是你應該避免這麼做。當你真的打算針對特定程式或背景服務進行異常排除的時候,這樣子做絕對會關閉整個 SELinux 系統。

你應該用 semanage permissive -a [某個domain_t] 指令,單獨將某個 domain 放進許可模式中,以取代 setenforce 0 指令。

首先,執行 ausearch 指令找出究竟是哪個 domain 造成的問題。
ausearch -ts recent -m avc

然後找到 scontext = (SELinux 來源內容) 那一行,像是:
scontext=staff_u:staff_r:gpg_pinentry_t:s0-s0:c0.c1023

這表示,被拒絕的 domain 是 gpg_pinentry_t,如果你打算處理這支程式的異常狀況,應該把它加到 domain 許可清單裡。
semange permissive -a gpg_pinentry_t

這樣子就會允許你使用這支程式,而且繼續收集其餘的 AVC,然後你就可以用 audit2allow 指令把它合併到本機政策設定值裡。這些動作都完成之後,就不會有新的 AVC 錯誤訊息,你就可以執行下面這行指令,從許可模式中移除這個 domain。semanage permissive -d gpg_pinentry_t

讓你的主機成為 SELinux 的 staff_r 角色


SELinux 是一種依據使用者帳號所對應的角色,判斷要禁止或授權某些特權的原生實作。身為系統管理員,你應該使用 staff_r 角色,這將會限制許多設定檔及有安全顧慮的檔案,除非你在指令前面先加上 sudo

預設的情況下,一般帳號會被建立成 unconfined_r 角色,你能執行的大多數程式都是不受限的,不會有任何 (或極少) SELinux 的限制。要切換你的帳號到 staff_r 角色,可以執行這行指令:usermod -Z staff_u 你的帳號

先登出再重新登入之後,就會啟用新的角色,當你執行 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

特別注意:在你進行這個切換動作之前,應該先正確的使用 ausearchaudit2allow 指令,因為會在你以 staff_r 角色執行的時候,某些程式可能將會無法運作。
在寫這篇文章的時候,這些受歡迎的程式如果不先調整規則的話,很確定它們沒辦法在 staff_r 角色下運作。
  • Chrome / Chromium
  • Skype
  • VirtualBox

要切換回 unconfined_r,可以執行這行指令:
usermod -Z unconfined_u 你的帳號

然後登出再重新登入一次,就可以時光倒流,回到什麼事都沒做的時候。


延伸閱讀


在資安的世界,水比你想像中的還深。如果你想要更深入了解,或是發掘到關於現有發行版的資安特性的話,可以參閱這些網站:

授權

本文依  姓名標示-相同方式分享 4.0 國際 (CC BY-SA 4.0) 方式發佈。


繁體中文版翻譯


heracles.jam@gmail.com,全文刊登於 IT 技術家

至於為什麼不放回 Github, 因為我還沒搞懂怎麼做 ... XDD
有沒有神人大大能來救救我,指導一下怎麼操作啊,該 branch 還是 fork 啊?!


圖片來源

  • https://pixabay.com/

更新紀錄

  • 2015/09/05 撰文。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言