--- tags: notes --- # Docker Security 筆記 ## Docker Security 參考來源:https://www.prplbx.com/resources/blog/docker-part1/ 儘管 Docker 很受歡迎,仍有許多軟體開發人員避免使用它,因為他們認為 docker 安全性很弱。 Docker 容器包括執行檔、設定檔、相關依賴項、主機環境和網路配置。其中每一個都是淺在的弱點。例如舊函式庫中的漏洞會對整個 docker 容器構成威脅。由於 Docker 容器中有許多不同的技術,安全管理也會變得很複雜。以下為 Docker 的安全實踐: ### 1. 避免用 root 執行 58% 的 docker 鏡像是使用 root 權限運行,攻擊者可以透過 root 訪問所有資訊並可以直接控制硬體,因此 docker 中的 process 最好以最小權限創建的使用者執行。例如以下範例: ```dockerfile FROM ubuntu:20.04 RUN apt-get update -y && \ apt-get install -y python3-pip python3-dev USER test CMD test test.py ``` ### 2. 使用信任來源的 Base Image、為自己打包的映像檔簽名 您應該只從受信任的存儲庫中提取基本 Docker 映像檔,或是檢查 checksums 和數位簽名以驗證鏡像的真實性和完整性。 ### 3. 更新 Docker 映像檔的作業系統、軟體 我們每天都會遇到數百個與作業系統和函式庫相關的 CVE,維持 Docker 鏡像為最新並創建自動化的更新機制很重要。 ### 4. 關閉未使用的連接埠 為測試而開放的連接埠(如 SSH)或尚未確定使用目的的連接埠應在生產環境中關閉。 ### 5. 不要用明文儲存機敏資訊 寫死的(API 密鑰、AWS 憑據等)為攻擊者敞開大門。您的 Docker 映像檔不應包含與任何環境(開發、測試、生產等)相關的任何 hardcoded 的機敏資訊。您應該通過環境變數(使用 -e 選項)或使用秘碼管理器獲取憑據。 ### 6. 定期掃描 Docker 映像檔 有很多簡單易用的 Docker 容器的開源工具掃描工具,它們透過 [Common Vulnerabilities and Exposures](http://cve.mitre.org/cve/) (CVE)、[Center for Internet Security](https://www.cisecurity.org/) (CIS) 數據庫來檢測。 ## Docker 掃描工具 參考來源:https://www.prplbx.com/resources/blog/docker-part2/ ### 1. Docker Bench for Security Git: https://github.com/docker/docker-bench-security 由 Docker 官方維護的專案,透過 shell script 或是 container 執行掃描,掃瞄範圍涵蓋 Containerd、Docker Daemon、所有他找的到的 Dockerfile、Image、Container。也可以只選擇掃描 image 和 container 就好。 ```bash git clone https://github.com/docker/docker-bench-security.git cd docker-bench-security sudo sh docker-bench-security.sh # 方法 1 docker-compose run --rm docker-bench-security # 方法 2 ``` ![](https://i.imgur.com/CEe3n6L.png) 檢測項目包含: 1. **Host Configuration:** - 透過 auditd 來稽核 /etc、/run、/var、/usr/bin 中的 Docker 設定檔與執行檔,確保所有 docker 操作可以被收集、儲存與查閱 (audit 可能會大量產生 log file,須注意清除 log 的機制或考慮將主要系統與 log 掛載在不同硬碟分區) - 檢查 Docker 是否為最新版本。 2. **Docker daemon configuration:** - user namespace - 開啟 docker cli 驗證 - 啟用 live restore - 禁止要求新的權限 - ... 3. **Docker daemon configuration files:** 檢查 socket、cert、config 權限。 4. **Container Images and Build File:** - 檢查 Dockerfile 中是否透過 root 身分進行操作 - Dockerfile 中必須包含 [HEALTHCHECK](https://docs.docker.com/engine/reference/builder/#healthcheck) 關鍵字。 5. **Container Runtime:** - 不要共享 network namespace (它允許容器訪問 host os 上的網路服務如 D-bus,因此,容器可能會做一些意想不到的事情,比如關閉 Docker) - 限制容器記憶體大小 (防止 denial of service) - 設定容器的 CPU Priority - 容器的 root filesystem 必須為 readonly、新增獨立的 volume 來寫入程式的資料 (防止容器被竄改) - 不要讓容器可以透過 0.0.0.0 連到 host os (無顯著危險,但建議這樣做) - 確認 MaximumRetryCount 為 5 (防止 denial of service on the host) - 設定容器的 PIDs cgroup limit (防止 fork bomb) - ... 6. **Docker Security Operations:** Ensure image sprawl is avoided 7. **Docker Docker Swarm Configuration:** 有使用 Docker Swarm 叢集才需要注意 各個細項都對應一個 CIS Docker 的編號,解決方法可以參考 Tenable 的 [CIS Docker](https://tenable.com/audits/items/search?q=CIS+Docker&sort=&page=1)。 如果上述檢查太繁瑣,可以透過以下方法挑選特定想要檢查的規則: ```bash # Only check 2.2 sh docker-bench-security.sh -c check_2_2 # Check all except 2.2 sh docker-bench-security.sh -e check_2_2 # Only check rules of Docker Enterprise license sh docker-bench-security.sh -c docker_enterprise_configuration # Only check 4.x and 5.x sh docker-bench-security.sh -c container_images,container_runtime # Only check 4.x and 5.x except 4.5 sh docker-bench-security.sh -c container_images,container_runtime -e check_4_5 ``` 另外也可以選擇特定的 image 來掃描: ```bash # Only include specific image sh docker-bench-security.sh -i <image name> ``` 也可以在產生掃描報告後,印出各個弱點的解決方法的摘要: ```bash sh docker-bench-security.sh -p ``` ### 2. InSpec InSpec 是 Docker 映像檔的開源測試框架,由 [Chef](https://www.chef.io/) 維護。您可以根據各種標準的 baseline 檢測 Docker 容器的狀態,他們提供的 baseline 有 Linux baseline、CIS docker benchmark、nginx-baseline、ssh-baseline 等,詳細列表可以在[這裡](https://github.com/dev-sec)找到。 ```bash sudo dpkg -i /path/to/inspec.deb git clone https://github.com/dev-sec/linux-baseline cd linux-baseline # 檢測容器的 os inspec exec https://github.com/dev-sec/linux-baseline -t docker://<container hash> # 檢測 host os inspec exec https://github.com/dev-sec/linux-baseline ``` ![](https://i.imgur.com/YUVPnsD.png) linux baseline 執行後產生的報表主要著重在各個 /etc 目錄中的設定檔的權限,以及建議 Kernel Parameter 的設定值。 另外也可以用以下指令執行 cis docker benchmark,他檢查的規則跟先前使用的 docker-bench-security.sh 一樣,但是輸出訊息量多、比較雜亂。 ``` git clone https://github.com/dev-sec/cis-docker-benchmark.git cd cis-docker-benchmark inspec exec https://github.com/dev-sec/cis-docker-benchmark.git -t docker://<container hash> ``` ![](https://i.imgur.com/bAvAuCk.png) ### 3. Trivy Trivy 是 Aqua Security 開源專案,用於掃描 docker 映像檔的漏洞,Trivy 還可以掃描目錄和 git repo,它可以在幾分鐘內檢測到 CVE 漏洞。 ```bash sudo apt install wget apt-transport-https gnupg lsb-release wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list sudo apt update sudo apt install trivy # 方法一 trivy image --clear-cache trivy image <registry>/<image name>:<tag> # 方法二 docker run aquasec/trivy ``` ![](https://i.imgur.com/ToLAxVo.png) 由上圖可以得知掃描報告列出:linux 系統套件 (apt、bash、libc 等)、程式相依套件(dotnet library、package.json、Pipfile 等) 的漏洞並指出該把函式庫更新到哪個版本才修復該漏洞。其餘 trivy 主要用法: - 掃描當前目錄和子目錄: ```bash trivy fs . ``` - 掃描 git repo: ```bash trivy repo https://github.com/knqyf263/trivy-ci-test ``` - 只掃描特定漏洞(漏洞種類有 `vuln,config,secret,license`,預設值為 vuln,secret)、(漏洞等級有 `UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL`,預設為全部): ```bash trivy image <image name> --security-checks vuln,confi trivy image <image name> --severity HIGH,CRITICAL ``` - 掃描檔案系統根目錄: ```bash # 方法一 trivy rootfs /path/to/rootfs # 方法二:Standalone mode: 在容器裡執行 trivy rootfs docker run --rm -it alpine:3.11 / # curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin / # trivy rootfs / # 方法三:Client/Server mode: 從 host os 觸發容器內的 agent 進行掃描 trivy server trivy rootfs --server http://localhost:4954 --severity CRITICAL /tmp/rootfs ``` - Custom [Policies](https://aquasecurity.github.io/trivy/v0.35/docs/misconfiguration/custom/): 可以搭配 terrafrom、Docker、RBAC 等,透過 yml、tf、Dockerfile 等格式自訂規則,如果不符合某些安全條件,就會中止佈署程序。 ```go package user.terraform.ID007 __rego_metadata__ := { "id": "ID007", "title": "ASG desires too much capacity", "severity": "MEDIUM", "type": "Terraform Plan Check", } __rego_input__ := {"selector": [{"type": "json"}]} deny[msg] { resource := input.planned_values.root_module.resources[_] resource.type == "aws_autoscaling_group" resource.values.desired_capacity > 10 msg = sprintf("ASG '%s' desires too much capacity", [resource.name]) } ``` ### 4. Snyk https://snyk.io/learn/docker-security-scanning/ Snyk 是開發者資安平台,提供 IDE、GitHub、Docker、ACR 等的整合工具,在 Docker 中,Snyk 被整合在 `docker scan` 中。ACR 整合的文件在[這邊](https://docs.snyk.io/products/snyk-container/image-scanning-library/acr-image-scanning),他可以從 snyk 提供的 web 界面查看存放在 ACR 的映像檔的漏洞。 ```bash # Snyk requires DockerHub account or Snyk account docker scan --login docker scan <image name> --file=<docker file> ``` ![](https://i.imgur.com/sxedQam.png) 他掃描的弱點大部分來自 CVE。 除了用整合的 `docker scan` 以外,也可以用 snyk cli 來掃描,掃描結果是一樣的。 ```bash snyk container test <image name> ``` Pricing: DockerHub 帳號每個月 10 次免費、Snyk 免費帳號每個月 100 次免費 ### 5. Microsoft Defender for Containers Powerd by Qualys。 Pricing:https://azure.microsoft.com/zh-tw/pricing/details/defender-for-cloud/ 詳見官網:https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-vulnerability-assessment-azure 啟用方式: - https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-containers-vulnerability-assessment-azure - https://learn.microsoft.com/en-us/azure/defender-for-cloud/kubernetes-workload-protections - https://www.youtube.com/watch?v=IHNdJnDttoU 首先啟用訂用帳戶的 Microsoft Defender for Cloud,然後進入 Microsoft Defender for Cloud,進到 Environment settings -> (Azure > Tenant Root Group > subscription name) -> (Containers 右側 Partial Settings) 啟用 Defender DaemonSet ![](https://i.imgur.com/uX0Mxns.png) 然後推送任意映像檔到 ACR,等一段時間後即可從 [Container registry images should have vulnerability findings resolved](https://portal.azure.com/#blade/Microsoft_Azure_Security/RecommendationsBlade/assessmentKey/dbd0cb49-b563-45e7-9724-889e799fa648) 看到掃描報告。 ![](https://i.imgur.com/HNGC05A.png) ### 6. OSV-Scanner Google 維護的掃描工具,可以掃描 Docker image、依賴套件的 Lock File、sbom ([Software Bill of Materials](https://en.wikipedia.org/wiki/Software_supply_chain))。 ```bash # install golang sudo apt install golang-go export GOPATH="$HOME/go" PATH="$GOPATH/bin:$PATH" # install osv-scanner go install github.com/google/osv-scanner/cmd/osv-scanner@v1 # scan an image osv-scanner --docker <image name>:<tag> ``` ![](https://i.imgur.com/MGdi072.png) 他的預設報告格式是 table 如上圖,另外也可以用 `--json` 格式。 ## 掃描工具比較 | | Docker Bench for Security | InSpec | Trivy | Snyk | Microsoft Defender for Containers | OSV-Scanner | | ------------------- |:--------------------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | --------------------------------- | ------------------------------ | | 掃瞄範圍 | host 稽核、host 設定值、Docker 設定檔、container runtime 設定值 | host 設定值、container runtime 設定值 | 系統函式庫、dotnet lib | 系統函式庫 | 系統函式庫 | 系統函式庫 | | 主要弱點資料庫 | CIS | CIS | CVE、DLA | CVE、CWE | CVE | CVE | | 報告格式 | text | text | table、json、sarif、cyclonedx、spdx、spdx-json、github、cosign-vuln | text、json | Azure Portal | table、json | | 報告內容 | Kernel Parameter、檔案權限等 | Kernel Parameter、檔案權限等 | 弱點版本、修復版本 | 弱點版本、修復版本、有些會在網頁顯示 no fix in debian 8 ... | 弱點版本、修復版本 | 弱點版本、在網頁中顯示修復版本 | | 費用 | 免費 | 免費 | 免費 | 5 人 Team 方案 $125/month | $6.8693/vCore/month | 免費 | | 依賴 | git | 官網下載 deb 檔、git | 官網的 PPA | 已經內建在 `docker scan`,但第一次執行時需要同意他的 license,並且需要透過網址或 token 登入 Snyk | 無 | golang |