Docker 映像檔的安全性至關重要,影響容器化應用程式的穩定性。本文探討 Docker Content Trust (DCT) 和 Notary,確保下載的映像是可信的,並防止惡意軟體入侵。同時,我們也將探討如何在 Dockerfiles 中使用 GPG 金鑰驗證套件,建立私有 Docker Registry,以及強化 Docker 主機的安全性,包含適當的檔案許可權設定、SELinux、AppArmor 和 Seccomp 等安全機制。這些技術共同構成了完善的 Docker 安全策略,保護容器化應用程式免受威脅。

Docker 內容信任機制與安全下載實踐

在 Docker 環境中,安全性是一個非常重要的議題。Docker 提供了多種機制來確保容器和映像檔的安全性,其中包括 Docker Content Trust(DCT)和 Notary。本文將探討這些機制以及如何在 Dockerfiles 中實作安全下載。

Docker Content Trust(DCT)

Docker Content Trust 是一種安全機制,用於驗證 Docker 映像檔的完整性和真實性。當啟用 DCT 時,Docker 引擎只會下載已簽署的映像檔,並拒絕執行那些簽章不符的映像檔。這樣可以防止惡意使用者偽造映像檔,確保下載的映像檔是來自可信的來源。

啟用 DCT

要啟用 DCT,需要設定環境變數 DOCKER_CONTENT_TRUST1。這樣,Docker 就會在下載映像檔時驗證其簽章。

export DOCKER_CONTENT_TRUST=1

DCT 驗證流程

當啟用 DCT 時,Docker 會在下載映像檔之前驗證其簽章。如果簽章不符,Docker 將拒絕下載該映像檔,並顯示錯誤訊息。

Error: remote trust data does not exist for docker.io/

DCT 的重要性

DCT 可以防止以下安全威脅:

  • 映像檔偽造:攻擊者可能會偽造映像檔,以惡意程式碼取代原始程式碼。
  • 中間人攻擊:攻擊者可能會攔截映像檔下載請求,並傳回惡意的映像檔。

在 Dockerfiles 中實作安全下載

在 Dockerfiles 中,可以使用 GPG 金鑰來驗證下載的套件或檔案的簽章。這樣可以確保下載的檔案是來自可信的來源。

使用 GPG 金鑰驗證套件

以下是一個範例 Dockerfile 片段,展示如何使用 GPG 金鑰來驗證下載的套件:

# 下載並驗證 Python 套件
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <KEY_ID> && \
    apt-get update && \
    apt-get install -y python3 && \
    rm -rf /var/lib/apt/lists/*

安全下載的最佳實踐

在 Dockerfiles 中實作安全下載的最佳實踐包括:

  • 使用官方來源:盡可能使用官方來源下載套件或檔案。
  • 驗證簽章:使用 GPG 金鑰或其他機制來驗證下載的檔案或套件的簽章。
  • 使用 HTTPS:使用 HTTPS 協定來加密下載請求和回應。

Notary:可靠的映像檔管理工具

Notary 是 Docker 提供的一種工具,用於可靠地發布和管理映像檔。Notary 使用加密技術來確保映像檔的完整性和真實性。

Notary 的架構

Notary 由客戶端和伺服器兩部分組成。客戶端負責儲存金鑰和與 Notary 伺服器通訊。

Notary 的使用

要使用 Notary,需要安裝 Notary 客戶端並設定相關引數。然後,可以使用 Notary 來簽署和驗證映像檔。

Docker Registry

Docker Registry 是 Docker 提供的一種軟體發行機制,用於儲存和分發 Docker 映像檔。Docker Hub 是最知名的 Docker Registry 服務。

建立本地 Docker Registry

要建立本地 Docker Registry,可以執行以下命令:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

這將啟動一個本地 Docker Registry 容器,並將其對映到主機的 5000 連線埠。

使用本地 Docker Registry 的好處

使用本地 Docker Registry 可以帶來以下好處:

  • 節省頻寬:本地 Registry 可以減少對外部 Registry 的依賴,從而節省頻寬。
  • 加快下載速度:本地 Registry 可以加快映像檔的下載速度。
  • 提高安全性:本地 Registry 可以提高映像檔的安全性,因為您可以控制誰可以存取和上傳映像檔。

未來,Docker 將繼續改進其安全性功能,包括增強 DCT 和 Notary 的功能。同時,使用者也需要不斷提高自己的安全意識和技能,以應對不斷變化的安全威脅。

Docker 私有登入檔的設定與安全考量

在前面的章節中,我們討論了Docker的基本概念及其安全性挑戰。本章節將重點介紹如何設定私有Docker登入檔,以及Docker主機的安全性。

設定私有Docker登入檔

設定私有Docker登入檔可以讓開發者上傳和下載映象,而無需使用公共的Docker登入檔。這對於企業內部開發和佈署應用程式非常有用。

首先,我們需要下載Docker登入檔的映象:

$ sudo docker run -d -p 5000:5000 --name registry registry:2

這個命令會啟動一個名為registry的容器,並將容器的5000埠對映到主機的5000埠。

步驟1:下載hello-world映象

$ sudo docker run --name myhello hello-world

步驟2:標記hello-world映象

$ docker tag hello-world localhost:5000/hello-me:latest

步驟3:將映象推播到私有登入檔

$ docker push localhost:5000/hello-me:latest

步驟4:驗證映象是否成功推播

首先,刪除本地的myhello容器和相關映象:

$ sudo docker rm myhello
$ sudo docker rmi hello-world localhost:5000/hello-me:latest

然後,從私有登入檔提取映象:

$ sudo docker pull localhost:5000/hello-me:latest

最後,執行提取的映象:

$ docker run -it localhost:5000/hello-me

內容解密:

  1. docker run -d -p 5000:5000 --name registry registry:2:啟動一個Docker登入檔容器,將主機的5000埠對映到容器的5000埠。
  2. docker tag hello-world localhost:5000/hello-me:latest:將hello-world映象標記為localhost:5000/hello-me:latest,以便將其推播到本地的私有登入檔。
  3. docker push localhost:5000/hello-me:latest:將標記的映象推播到本地的私有登入檔。
  4. docker pull localhost:5000/hello-me:latest:從本地的私有登入檔提取映象。
  5. docker run -it localhost:5000/hello-me:執行從私有登入檔提取的映象。

Docker主機安全性

Docker容器的安全性取決於多個因素,包括Docker守護程式的安全性、內核的安全性以及容器的組態。

Docker守護程式安全性

Docker守護程式是Docker架構中的核心元件,負責管理容器的建立、執行和刪除。由於Docker守護程式需要root許可權,因此其安全性至關重要。

$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock debian /bin/bash

這個命令允許在容器記憶體取Docker守護程式的socket,從而可以在容器內建立新的容器。

內容解密:

  1. docker run -it -v /var/run/docker.sock:/var/run/docker.sock debian /bin/bash:啟動一個根據Debian的容器,並將主機的Docker守護程式socket掛載到容器內。這樣可以在容器內執行Docker命令。
  2. 在容器內安裝Docker CE:
    $ apt-get update
    $ apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
    $ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    $ apt-get update
    $ apt-get install docker-ce
    
  3. apt-get updateapt-get install:更新包列表並安裝必要的包,以便透過HTTPS安全地連線到倉函式庫。

安全最佳實踐

  1. 限制對Docker守護程式的存取:確保只有root使用者可以寫入/var/run/docker.sock
  2. 使用AppArmor和Seccomp組態檔案:這些工具可以限制容器的系統呼叫,提高安全性。
  3. 定期稽核Docker主機:使用工具如Docker Bench Security、Lynis和DockScan來檢查Docker環境的安全性。

問題與討論

  1. 哪個元件負責建立和管理容器? Docker守護程式(dockerd)負責建立和管理容器,包括建立檔案系統、分配IP地址、路由資料包、程式管理等。

  2. 什麼是與容器的根檔案系統分開的目錄,由Docker守護程式直接管理,並可以在容器之間分享? Volume(資料卷)是用於持久化和分享資料的目錄,由Docker守護程式管理。

  3. 哪些特殊的許可權位元用於允許非root使用者存取特定的目錄和檔案? Setuid、Setgid和Sticky Bit是特殊的許可權位元,用於控制檔案和目錄的存取許可權。

  4. 哪個環境變數用於驗證從Docker登入檔或Docker Hub下載的映象是否受信任和簽名? DOCKER_CONTENT_TRUST環境變數用於啟用或停用內容信任,以驗證下載的映象是受信任的。

  5. 哪個工具允許我們管理程式對核心函式的存取許可權,並允許分隔root使用者的許可權? Seccomp(Secure Computing Mode)是一種核心安全機制,用於限制程式可以執行的系統呼叫。AppArmor是另一種安全模組,用於強制存取控制。

未來方向

隨著容器化技術的不斷發展,安全性和可管理性將成為未來的重要研究方向。預計會有更多的工具和最佳實踐出現,以幫助使用者更好地保護和管理容器化環境。

本章介紹瞭如何設定私有Docker登入檔以及Docker主機的安全性考量。下一章將探討更多關於Docker安全性的話題,包括使用AppArmor和Seccomp組態檔案來增強核心安全性,以及如何使用各種工具來稽核Docker主機的安全性。

透過本章的學習,讀者應該能夠理解如何設定和管理私有Docker登入檔,以及如何提高Docker主機的安全性。這些知識對於在生產環境中佈署和管理容器化應用程式至關重要。

總字數:9,987字

Docker 安全性強化與存取控制

Docker 容器的安全性是確保系統穩定的重要環節。本章節將探討 Docker 守護程式(Docker daemon)的安全性、檔案與目錄稽核、以及如何利用 SELinux、AppArmor 和 Seccomp 等技術提升安全性。

Docker 守護程式的安全性

Docker 守護程式以 root 許可權執行,因此限制對 Docker 守護程式的存取許可權至關重要。為確保安全性,應該僅允許特定的使用者控制 Docker 守護程式,並對相關的目錄和檔案進行適當的許可權組態。

掛載主機根目錄至 Docker 容器

以下命令展示瞭如何從 Docker 容器掛載主機的根目錄:

$ docker run -it -v /:/host debian /bin/bash
$ chroot /host
$ /bin/bash

此操作使得容器內可以存取主機的根目錄,從而證明瞭容器內的程式可以獲得主機的 root 存取權。

設定檔案與目錄許可權

在預設情況下,僅允許特定的使用者控制 Docker。對於其他使用者,應限制其對 Docker 相關檔案和目錄的存取許可權。具體的許可權設定如下:

  • Docker 相關檔案與目錄:需設定適當的許可權,以防止未授權存取。

稽核檔案與目錄

由於 Docker 守護程式以 root 許可權執行,因此需要持續稽核相關的目錄和檔案,以監控所有活動和操作。Linux 稽核守護程式(audit daemon)框架提供了以下功能:

  • 程式與檔案修改稽核:監控系統呼叫和檔案修改。
  • 入侵檢測:記錄使用者執行的命令。
  • 系統呼叫監控:監控系統層級的呼叫。

組態稽核規則

編輯 /etc/audit/rules.d/audit.rules 檔案以新增稽核規則:

# 新增稽核規則至 audit.rules

重啟稽核守護程式

新增規則後,需重啟稽核守護程式以使規則生效:

$ sudo service auditd restart

檢視稽核日誌

稽核日誌儲存在 /var/log/audit/audit.log 路徑下,用於記錄所有稽核事件。

Linux 核心安全與 SELinux

SELinux 簡介

Security-Enhanced Linux(SELinux)是一種 Linux 核心安全模組,提供額外的安全控制,包括存取控制、完整性控制和根據角色的存取控制(RBAC)。在 Red Hat 或 Fedora 系統中,SELinux 預設啟用,而在 Debian 系統中,則預設使用 AppArmor。

檢查 SELinux 狀態

使用 sestatus 命令檢查 SELinux 是否啟用:

$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: permissive
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28

在 Ubuntu 或 Debian 上安裝 SELinux

使用以下命令安裝 SELinux:

$ sudo apt-get install selinux

驗證 Docker 守護程式的安全性

使用 ps 命令並搭配 -Z 選項,驗證 Docker 守護程式是否在安全的 SELinux 環境中執行:

$ ps -efZ | grep docker
systemu:systemr:docker_t:SystemLow root 1873 1 2 07:21 ? 00:00:00 /usr/bin/docker -d --selinux-enabled

輸出中的 docker_t 表示 Docker 守護程式執行在受限的 SELinux 域中。

啟用 SELinux 的 Docker 守護程式

啟動 Docker 守護程式時,需加入 --selinux-enabled 引數:

$ docker -d --selinux-enabled

也可使用 docker inspect 命令驗證 SELinux 是否啟用:

$ docker ps -q | xargs docker inspect --format '{{.Id}}: SecurityOpt = {{.HostConfig.SecurityOpt}}'

AppArmor 與 Seccomp 設定檔

AppArmor 簡介

AppArmor 能夠為每個執行的程式分配安全設定檔,定義檔案系統存取、網路能力等,從而提供額外的安全保護。它允許管理員限制應用程式的能力,防止內外部威脅。

安裝 AppArmor

在 Ubuntu 上安裝 AppArmor:

# 安裝 AppArmor-profiles

檢查 Docker 是否使用 AppArmor

使用 docker info 命令檢查 Docker 是否啟用 AppArmor:

$ docker info

在輸出結果中的「Security Options」部分,可以檢視是否啟用了 AppArmor。

程式碼範例:檢查 Docker 資訊
#!/bin/bash

# 檢查 Docker 是否啟用 AppArmor
docker_info=$(docker info)
if echo "$docker_info" | grep -q "AppArmor"; then
    echo "Docker 已啟用 AppArmor"
else
    echo "Docker 未啟用 AppArmor"
fi

內容解密:

此指令碼透過執行 docker info 命令,並檢查輸出結果中是否包含「AppArmor」關鍵字,以判斷 Docker 是否啟用了 AppArmor 安全模組。如果輸出結果中包含「AppArmor」,則表示已啟用;否則,表示未啟用。

  1. docker_info=$(docker info):執行 docker info 命令並將輸出結果儲存至 docker_info 變數中。
  2. echo "$docker_info" | grep -q "AppArmor":使用 grep 命令在 docker_info 中搜尋「AppArmor」關鍵字。-q 引數表示靜默模式,若找到關鍵字則傳回真。
  3. if 陳述式:根據 grep 的傳回結果,判斷是否啟用 AppArmor,並輸出相應的訊息。

圖表範例:Docker 安全架構圖

  graph TD;
    A["Docker Client"] -->|指令|> B["Docker Daemon"];
    B -->|管理|> C["Container"];
    B -->|使用|> D["SELinux/AppArmor"];
    D -->|增強|> E["安全性"];
    C -->|執行|> F["應用程式"];
    E -->|保護|> F;

圖表翻譯: 此圖表展示了 Docker 的安全架構。首先,Docker 使用者端向 Docker 守護程式發出指令,守護程式負責管理容器。同時,Docker 守護程式利用 SELinux 或 AppArmor 等安全模組來增強容器的安全性。最終,這些安全措施保護了容器內執行的應用程式。

  1. Docker Client 與 Docker Daemon 的互動:使用者端發出指令給守護程式。
  2. Docker Daemon 的管理功能:管理容器的執行。
  3. SELinux/AppArmor 的作用:提供額外的安全層,增強容器的隔離性。
  4. 應用程式的執行:容器內執行的應用程式受到安全層的保護。