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_TRUST 為 1。這樣,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
內容解密:
docker run -d -p 5000:5000 --name registry registry:2:啟動一個Docker登入檔容器,將主機的5000埠對映到容器的5000埠。docker tag hello-world localhost:5000/hello-me:latest:將hello-world映象標記為localhost:5000/hello-me:latest,以便將其推播到本地的私有登入檔。docker push localhost:5000/hello-me:latest:將標記的映象推播到本地的私有登入檔。docker pull localhost:5000/hello-me:latest:從本地的私有登入檔提取映象。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,從而可以在容器內建立新的容器。
內容解密:
docker run -it -v /var/run/docker.sock:/var/run/docker.sock debian /bin/bash:啟動一個根據Debian的容器,並將主機的Docker守護程式socket掛載到容器內。這樣可以在容器內執行Docker命令。- 在容器內安裝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 apt-get update和apt-get install:更新包列表並安裝必要的包,以便透過HTTPS安全地連線到倉函式庫。
安全最佳實踐
- 限制對Docker守護程式的存取:確保只有root使用者可以寫入
/var/run/docker.sock。 - 使用AppArmor和Seccomp組態檔案:這些工具可以限制容器的系統呼叫,提高安全性。
- 定期稽核Docker主機:使用工具如Docker Bench Security、Lynis和DockScan來檢查Docker環境的安全性。
問題與討論
-
哪個元件負責建立和管理容器? Docker守護程式(dockerd)負責建立和管理容器,包括建立檔案系統、分配IP地址、路由資料包、程式管理等。
-
什麼是與容器的根檔案系統分開的目錄,由Docker守護程式直接管理,並可以在容器之間分享? Volume(資料卷)是用於持久化和分享資料的目錄,由Docker守護程式管理。
-
哪些特殊的許可權位元用於允許非root使用者存取特定的目錄和檔案? Setuid、Setgid和Sticky Bit是特殊的許可權位元,用於控制檔案和目錄的存取許可權。
-
哪個環境變數用於驗證從Docker登入檔或Docker Hub下載的映象是否受信任和簽名?
DOCKER_CONTENT_TRUST環境變數用於啟用或停用內容信任,以驗證下載的映象是受信任的。 -
哪個工具允許我們管理程式對核心函式的存取許可權,並允許分隔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」,則表示已啟用;否則,表示未啟用。
docker_info=$(docker info):執行docker info命令並將輸出結果儲存至docker_info變數中。echo "$docker_info" | grep -q "AppArmor":使用grep命令在docker_info中搜尋「AppArmor」關鍵字。-q引數表示靜默模式,若找到關鍵字則傳回真。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 等安全模組來增強容器的安全性。最終,這些安全措施保護了容器內執行的應用程式。
- Docker Client 與 Docker Daemon 的互動:使用者端發出指令給守護程式。
- Docker Daemon 的管理功能:管理容器的執行。
- SELinux/AppArmor 的作用:提供額外的安全層,增強容器的隔離性。
- 應用程式的執行:容器內執行的應用程式受到安全層的保護。