返回文章列表

Linux容器安全沙箱技術應用實踐

本文探討 Linux 容器安全與沙箱技術,包含 Firejail、Snappy 和 Flatpak 的應用與實作,並解析 /proc 偽檔案系統、cgroups 和 namespaces 等核心機制,提供提升系統安全性的實務方法和操作步驟。

系統管理 資安

容器安全議題日益受到重視,尤其許可權控管不當可能導致主機系統風險。除了 Podman 之外,Firejail、Snappy 和 Flatpak 等沙箱技術也提供有效隔離機制,限制應用程式存取範圍,降低系統受攻擊風險。本文將探討這些技術的實務應用,並結合 Linux 核心功能,如 /proc 偽檔案系統、cgroups 和 namespaces,展示如何強化系統安全設定。透過調整核心引數、限制資源使用和隔離程式,可以有效提升系統防禦能力,降低潛在威脅。

容器安全與沙箱技術的應用

在前面的章節中,我們探討了 Docker 的安全問題,特別是當 Docker 容器的許可權過高時,可能會對主機系統造成安全威脅。為瞭解決這個問題,Red Hat 的開發人員建立了一個名為 Podman 的 Docker 替代品,它在安全性方面有顯著的改進。本章節將繼續探討其他容器和沙箱技術,特別是 Firejail,並展示如何使用它來提高應用程式的安全性。

使用 Firejail 進行沙箱化

Firejail 是一種沙箱技術,利用 Linux 核心的功能,如名稱空間(namespaces)、SECCOMP 和核心能力(kernel capabilities),來隔離不可信的應用程式,防止它們存取敏感資料或對系統造成損害。Firejail 可在大多數 Linux 發行版中使用,包括 Debian、Ubuntu 和 Red Hat 系列的發行版。

安裝 Firejail

要在 AlmaLinux 9 上安裝 Firejail,首先需要啟用 EPEL 倉函式庫,然後安裝 Firejail:

sudo dnf install epel-release
sudo dnf install firejail

安裝完成後,Firejail 會提供多個應用程式的設定檔,用於指定如何隔離這些應用程式。這些設定檔位於 /etc/firejail/ 目錄下。

使用 Firejail 執行應用程式

使用 Firejail 執行應用程式非常簡單,只需在執行應用程式時加上 firejail 字首即可。例如,執行 Firefox 瀏覽器:

firejail firefox

Firejail 會根據應用程式名稱自動載入對應的設定檔,如果沒有找到特定的設定檔,則會使用通用設定檔。

組態 Firejail 設定

Firejail 提供多種選項來控制應用程式的許可權,例如,可以使用 --caps.drop=all 選項來移除應用程式的所有核心能力:

firejail --caps.drop=all chromium-browser

這樣可以進一步限制應用程式的許可權,提高安全性。

與系統整合

為了方便使用,可以使用 firecfg 命令來建立符號連結,將 Firejail 與系統的應用程式啟動器整合:

sudo firecfg

這樣,使用者就可以直接從開始功能表啟動受 Firejail 保護的應用程式。

Firejail 的限制與注意事項

雖然 Firejail 提供了不錯的安全性,但它並非完美無缺。在某些情況下,某些應用程式可能無法在 Firejail 下正常運作。此外,Firejail 的檔案指出,它主要適用於單使用者桌面系統,不建議在多使用者環境中使用,因為 Firejail 的執行檔需要設定 SUID 位元,這可能帶來安全風險。

內容檢視:
  • Firejail 提供了一種簡單有效的方式來隔離不可信的應用程式。

  • 正確組態 Firejail 可以顯著提高系統的安全性。

  • 使用者需要注意 Firejail 的限制和潛在的安全風險。

  • 繼續探索其他容器和沙箱技術,以找出最適合特定需求的解決方案。

  • 研究如何將這些技術與現有的安全措施整合,以實作最佳的安全效果。

使用 Firejail 的實作實驗室

本實驗室將使用具備 Gnome 桌面環境的 AlmaLinux 9 虛擬機器。以下是操作步驟:

  1. 建立具備 Gnome 桌面選項的 AlmaLinux 虛擬機器。
  2. 安裝 EPEL 儲存函式庫並更新虛擬機器,執行以下命令:
    sudo dnf install epel-release
    sudo dnf upgrade
    
    然後,重啟虛擬機器。
  3. 安裝 Firejail、LibreOffice 和 Chromium:
    sudo dnf install firejail libreoffice-x11 chromium
    
  4. 在一個終端機視窗中,不具備任何核心許可權地啟動 Chromium:
    firejail --caps.drop=all chromium-browser
    
  5. 瀏覽不同的網站,確認一切運作正常。
  6. 在另一個終端機視窗中,同樣不具備任何許可權地啟動 LibreOffice:
    firejail --caps.drop=all libreoffice
    
  7. 建立不同型別的 LibreOffice 檔案,並測試各種 LibreOffice 功能,確認其運作正常。
  8. 關閉 Chromium 和 LibreOffice。
  9. 設定 Firejail,使其自動沙箱化您啟動的每個應用程式,即使是從正常「開始」功能表啟動的應用程式:
    sudo firecfg
    
  10. 檢視已建立的符號連結:
    ls -l /usr/local/bin
    
  11. 從正常功能表開啟 Firefox,並驗證其是否正常運作。然後,關閉 Firefox。
  12. 若要能夠不透過 Firejail 執行 Firefox,只需刪除其在 /usr/local/bin/ 目錄下的符號連結:
    sudo rm /usr/local/bin/firefox
    
  13. 再次嘗試執行 Firefox,您會看到它正常啟動。

內容解密:

上述步驟詳細展示瞭如何使用 Firejail 對應用程式進行沙箱化處理。首先,我們建立了一個 AlmaLinux 虛擬機器並安裝了必要的軟體。接著,我們使用 Firejail 分別啟動了 Chromium 和 LibreOffice,並測試了它們的功能。然後,我們組態了 Firejail 以自動沙箱化所有應用程式,並驗證了其效果。最後,我們學習瞭如何還原特定應用程式的原始啟動方式。

使用 Snappy 進行沙箱化

在 Windows 和 Mac 環境中,作業系統和應用程式是獨立銷售的。因此,您購買一台執行 Windows 或 macOS 的電腦,然後再單獨購買應用程式。在進行更新時,您需要更新作業系統和每個應用程式。

在 Linux 環境中,大多數所需的應用程式都位於 Linux 發行版的儲存函式庫中。要安裝應用程式,只需使用發行版的套件管理工具(如 aptyumdnf 等)即可。然而,這既是福也是禍。它確實使追蹤和管理應用程式變得更加容易,但除非您使用的是滾動發行版(如 Arch),否則在發行版的生命週期結束前,應用程式套件可能會變得過時。這是因為發行版維護者使用在發行版版本發布時當前的應用程式版本,並且在下一個版本發布之前不會升級到新的應用程式版本。

Snappy 系統介紹

Ubuntu 的 Snappy 系統允許開發者建立可在任何安裝了 Snappy 系統的系統上執行的 snap 套件。每個 snap 應用程式都在其自己的隔離沙箱中執行,有助於保護系統免受惡意程式的侵害。每個 snap 套件都是自包含的單元,這意味著您無需擔心安裝依賴項。

Snappy 的優缺點

Snappy 系統具有多項優點,但也存在一些爭議。首先,Ubuntu 開發者拒絕發布 Snappy 應用伺服器的原始碼,這限制了使用者檢視原始碼和建立自己的本地 Snappy 伺服器的能力。其次,雖然 snap 套件被沙箱化以保護系統,但仍可能發生其他異常情況。此外,使用者對 snap 更新的控制權有限,只能延遲更新最多 60 天,而無法完全關閉自動更新。最後,由於每個 snap 套件都是自包含的,並且儲存了前三個版本的套件,這增加了磁碟空間的使用量。

Snappy 系統架構圖示

圖表翻譯: 此圖示展示了 Snappy 系統的架構。Snappy 系統支援 Snap 套件,每個 Snap 套件都是自包含的單元,並在隔離沙箱中執行,以保護系統安全。此外,Snappy 系統具有自動更新功能,但允許使用者延遲更新最多 60 天。

在多種Linux發行版中使用Snappy與Flatpak進行應用程式管理

Snappy是Ubuntu的軟體套件管理系統,但它也可在其他Linux發行版中使用。對於Fedora使用者,可以直接從預設的軟體倉函式庫中取得Snappy。而對於Red Hat及其衍生版本(如CentOS、AlmaLinux等),則需要啟用EPEL(Extra Packages for Enterprise Linux)倉函式庫來安裝Snappy。

Snappy的實用性

對於忙碌的系統管理員來說,Snappy提供了一個快速佈署應用程式的解決方案。例如,若需要架設Nextcloud伺服器以提供員工一個集中儲存檔案的平台,可以直接安裝Nextcloud的snap套件,而無需逐一設定LAMP(Linux、Apache、MySQL、PHP)環境中的各個元件。

首先,使用snap search nextcloud指令來搜尋可用的Nextcloud套件:

donnie@ubuntu2204:~$ snap search nextcloud
Name                  Version           Publisher   Notes  Summary
nextcloud             16.0.5snap3       nextcloud✓         - Nextcloud Server - A safe home for all your data
spreedme              0.29.5snap1       nextcloud✓         - Spreed.ME audio/video calls and conferences feature for the Nextcloud
onlyoffice-desktopeditors 5.4.1         onlyoffice✓        - A comprehensive office suite for editing documents,
qownnotes             19.11.13          pbek               - Plain-text file markdown note taking with Nextcloud / ownCloud integration
nextcloud-port8080    1.01              arcticslyfox       - Nextcloud Server

接著,使用snap info nextcloud來檢視Nextcloud套件的詳細資訊,以確認是否為所需的套件:

donnie@ubuntu2204:~$ snap info nextcloud
name: nextcloud
summary: Nextcloud Server - A safe home for all your data
publisher: Nextcloud✓
contact: https://github.com/nextcloud/nextcloud-snap
license: AGPL-3.0+
description: |
  Where are your photos and documents? With Nextcloud you pick a server of your choice, at home, in
  a data center or at a provider. And that is where your files will be. Nextcloud runs on that
  server, protecting your data and giving you access from your desktop or mobile devices. Through
  Nextcloud you also access, sync and share your existing data on that FTP drive at school, a
  Dropbox or a NAS you have at home.

確認無誤後,使用snap install nextcloud來安裝Nextcloud:

donnie@ubuntu2204:~$ snap install nextcloud

安裝完成後,使用snap start nextcloud來啟動Nextcloud服務:

donnie@ubuntu2204:~$ sudo snap start nextcloud
Started.

內容解密:

  1. snap search nextcloud:此指令用於搜尋包含「nextcloud」關鍵字的可用snap套件,列出相關套件的名稱、版本、釋出者及簡要描述。
  2. snap info nextcloud:此指令用於顯示特定snap套件(此例中為Nextcloud)的詳細資訊,包括其摘要、釋出者、聯絡資訊、授權條款及詳細描述。
  3. snap install nextcloud:此指令用於安裝Nextcloud的snap套件。安裝過程中,系統會提示輸入密碼以驗證許可權。
  4. sudo snap start nextcloud:此指令用於啟動已安裝的Nextcloud服務。由於啟動服務需要管理員許可權,因此使用sudo來提升許可權。

Snappy與Snapcraft Store

Snapcraft Store是Canonical官方的snap套件倉函式庫,任何人都可以建立帳戶並上傳自己的snap套件。該倉函式庫包含了適用於桌面、工作站、伺服器及物聯網(IoT)裝置的多種應用程式,並且支援多種機器架構,如x86_64、ARM及PowerPC。

使用Flatpak進行沙箱化應用程式管理

Flatpak是另一種通用型套件管理系統,由Fedora Linux團隊開發。與Snappy類別似,Flatpak允許建立可在任何安裝了Flatpak的機器上執行的通用套件,並且每個應用程式都在其自己的安全沙箱中執行。

與Snappy不同的是,Flatpak使用分享的執行階段函式庫來減少磁碟空間的使用。Fedora團隊維護了一個名為Flathub的中央倉函式庫,但也開放了伺服器端程式碼,以便其他人能夠建立自己的Flatpak倉函式庫。

要在Debian/Ubuntu系統上安裝Flatpak,可以執行以下指令:

sudo apt update
sudo apt install flatpak

在RHEL、CentOS、AlmaLinux及Fedora系統上,Flatpak可能已經預先安裝。如果沒有,可以使用yumdnf指令進行安裝。

安裝完成後,需要設定Flatpak以使用所需的倉函式庫。可以存取Flatpak的快速設定頁面(https://flatpak.org/setup/)來取得相關指示。

設定完成並重新啟動機器後,就可以開始安裝應用程式了。可以瀏覽Flathub倉函式庫(https://flathub.org/home)來尋找所需的應用程式。例如,若要安裝Bookworm電子書閱讀器,可以在Flathub上找到相關頁面,並依照指示使用指令列進行安裝。

flatpak install flathub com.github.babluboy.bookworm

執行上述指令後,Flatpak會下載並安裝Bookworm應用程式。

內容解密:

  1. flatpak install flathub com.github.babluboy.bookworm:此指令用於從Flathub倉函式庫安裝Bookworm電子書閱讀器。其中,flathub指定了倉函式庫來源,而com.github.babluboy.bookworm則是Bookworm套件的唯一識別碼。
  2. Flatpak的沙箱機制:與Snappy類別似,Flatpak將每個應用程式隔離在其自己的沙箱環境中,以提高安全性。
  3. 分享執行階段函式庫:Flatpak使用分享的執行階段函式庫來減少重複檔案所佔用的磁碟空間,提高了儲存效率。

/proc 偽檔案系統與系統引數調校

/proc 偽檔案系統提供了對系統核心狀態的即時存取,允許管理員讀取和修改核心引數,以最佳化系統效能和安全性。例如,使用 sysctl 命令可以動態調整核心引數。

程式碼範例:使用 sysctl 調整核心引數

# 檢視目前的核心引數
sysctl -a

# 設定特定的核心引數
sudo sysctl -w net.ipv4.icmp_echo_ignore_all=1

內容解密:

  • sysctl -a 用於列出所有可用的核心引數及其當前值。
  • sysctl -w 用於動態修改核心引數,例如將 net.ipv4.icmp_echo_ignore_all 設定為 1 以忽略所有 ICMP echo 請求,增強系統安全性。

cgroups 與資源限制

cgroups(Control Groups)允許管理員對程式進行資源限制和優先順序控制,從而防止單一程式消耗過多系統資源。

程式碼範例:使用 cgroups 限制程式 CPU 使用率

# 建立一個新的 cgroup 並限制其 CPU 使用率
sudo cgcreate -g cpu:/limitcpu
sudo cgset -r cpu.shares=512 limitcpu

# 將特定程式加入該 cgroup
sudo cgexec -g cpu:limitcpu stress --cpu 4

內容解密:

  • cgcreate 用於建立新的 cgroup。
  • cgset 用於設定 cgroup 的資源限制,例如 CPU 使用率。
  • cgexec 用於在指定的 cgroup 中執行程式。

namespaces 與程式隔離

namespaces 提供了程式隔離的機制,使得每個 namespace 中的程式擁有獨立的視野,互不幹擾。

程式碼範例:使用 unshare 建立新的 namespace

# 建立新的 PID namespace
sudo unshare --pid --fork --mount-proc bash

# 在新的 namespace 中檢視 PID
ps aux

內容解密:

  • unshare 命令用於建立新的 namespace。
  • --pid 選項用於建立新的 PID namespace。
  • --fork--mount-proc 選項確保新的 namespace 具有獨立的 PID 空間和 /proc 檔案系統。

Snappy 和 Flatpak:通用包管理系統

Snappy 和 Flatpak 是兩種流行的通用包管理系統,它們允許開發者將應用程式封裝一次,即可在多種 Linux 發行版上執行。

Snappy 與 Flatpak 的比較

特性SnappyFlatpak
包管理方式自動更新(可手動控制)需要手動更新
安全性提供沙箱隔離提供沙箱隔離
執行環境需要安裝 Snappy 守護程式需要安裝 Flatpak 執行環境

Linux 系統安全技術概覽

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Linux容器安全沙箱技術應用實踐

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

圖表翻譯: 此圖示呈現了 Linux 系統安全的多個導向,包括 /proc 偽檔案系統、cgroups、namespaces、Kernel Capabilities、SECCOMP 以及 Snappy 和 Flatpak 等通用包管理系統。每項技術都針對特定的安全需求或功能進行了詳細介紹。