AppArmor 和 Seccomp 是 Linux 系統中重要的安全機制,能有效提升 Docker 容器的安全性。AppArmor 可限制程式許可權,Seccomp 則能控制系統呼叫,兩者結合能大幅降低容器受攻擊風險。本文除了介紹如何安裝、組態和使用 AppArmor 與 Seccomp 外,也示範如何使用 Docker Bench Security 和 Lynis 等工具進行安全稽核,並提供最佳實務建議,例如建立非 root 使用者執行容器,以及檢視 Docker daemon 設定檔許可權等,以確保容器環境的安全性和穩定性。
AppArmor 在 Docker 中的應用與實踐
AppArmor(Application Armor)是一種 Linux 核心安全模組,能夠限制程式的許可權,防止惡意程式對系統造成損害。在 Docker 中,AppArmor 可以用來加強容器的安全性。本文將介紹 AppArmor 在 Docker 中的應用,包括安裝、組態、以及如何使用 AppArmor 來限制容器的行為。
安裝 AppArmor
要使用 AppArmor,首先需要在 Linux 系統上安裝它。可以使用以下命令安裝 AppArmor:
$ sudo apt-get install apparmor-profiles
安裝完成後,可以在 /etc/apparmor/ 和 /etc/apparmor.d/ 目錄下找到 AppArmor 的組態檔案和規則集檔案。
AppArmor 組態檔案和工具
AppArmor 提供了一系列的工具和組態檔案,用於管理和組態 AppArmor。以下是一些常用的工具和組態檔案:
/etc/apparmor/:包含 AppArmor 的組態檔案。/etc/apparmor.d/:包含 AppArmor 的規則集檔案。/usr/sbin/aa-enforce:啟用 AppArmor 規則集。/usr/sbin/aa-logprof:用於註冊 AppArmor 規則集。/usr/sbin/aa-complain:啟用 AppArmor 規則集的投訴模式。/usr/sbin/aa-genprof:生成自定義的 AppArmor 規則集。/usr/sbin/aa-notify:傳回被拒絕存取的使用者和程式。/usr/sbin/aa-status:顯示 AppArmor 的狀態。
內容解密:
這些工具和組態檔案可以用來管理和組態 AppArmor。例如,/usr/sbin/aa-enforce 可以用來啟用 AppArmor 規則集,而 /usr/sbin/aa-logprof 可以用來註冊 AppArmor 規則集。
檢查 AppArmor 狀態
可以使用 apparmor_status 命令來檢查 AppArmor 的狀態:
$ apparmor_status
apparmor module is loaded.
10 profiles are loaded.
10 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/lxc-start
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/connman/scripts/dhclient-script
/usr/sbin/tcpdump
docker-default
lxc-container-default
lxc-container-default-with-mounting
lxc-container-default-with-nesting
0 profiles are in complain mode.
2 processes have profiles defined.
2 processes are in enforce mode.
/sbin/dhclient (610)
0 processes are in complain mode.
內容解密:
這個命令顯示了 AppArmor 的狀態,包括已載入的規則集數量、處於強制模式的規則集數量等。
在 Docker 中使用 AppArmor
Docker 預設使用 docker-default AppArmor 規則集,可以使用以下命令檢查 Docker 是否啟用了 AppArmor:
$ docker info | grep apparmor
Security Options: apparmorseccomp
也可以使用 docker inspect 命令來檢查容器的 AppArmor 組態:
$ docker ps -q | xargs docker inspect --format '{{ .Id }}: AppArmorProfile={{ .AppArmorProfile}}'
內容解密:
這些命令可以用來檢查 Docker 是否啟用了 AppArmor,以及容器的 AppArmor 組態。
執行容器時指定 AppArmor 規則集
可以在執行容器時指定 AppArmor 規則集,例如:
$ docker container run --rm -it --security-opt apparmor=docker-default ubuntu sh
也可以停用 AppArmor 規則集:
$ docker container run --rm -it --security-opt apparmor=unconfined ubuntu sh
內容解密:
這些命令可以用來執行容器時指定或停用 AppArmor 規則集。
使用 Seccomp 和 AppArmor 加強容器安全
Seccomp 和 AppArmor 可以一起使用來加強容器的安全性。例如,可以建立一個 Seccomp 組態檔案來限制系統呼叫:
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "mkdir",
"action": "SCMP_ACT_ERRNO"
},
{
"name": "chmod",
"action": "SCMP_ACT_ERRNO"
},
{
"name": "chown",
"action": "SCMP_ACT_ERRNO"
}
]
}
然後可以使用以下命令執行容器時啟用 Seccomp 和 AppArmor:
$ docker container run --rm -it --cap-add SYS_ADMIN --security-opt seccomp=policy.json --security-opt apparmor=docker-default ubuntu sh
內容解密:
這個命令可以用來執行容器時啟用 Seccomp 和 AppArmor,從而加強容器的安全性。
強化Docker容器安全性:Seccomp組態與Docker Bench Security實踐
在現代化的DevOps實踐中,容器技術的安全性日益受到重視。Docker作為最流行的容器化平台,其安全性組態與最佳實踐對於保護容器化應用至關重要。本文將探討如何透過Seccomp組態和Docker Bench Security工具來增強Docker容器的安全性。
使用Seccomp限制系統呼叫
Seccomp(Secure Computing Mode)是一種Linux核心安全機制,允許限制程式可以執行的系統呼叫,從而減少容器的攻擊面。透過組態Seccomp策略,可以有效地防止容器內執行危險的系統呼叫。
組態Seccomp策略
首先,我們需要建立一個policy.json檔案來定義Seccomp策略。以下是一個示例組態:
{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": [
"SCMP_ARCH_X86_64",
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"names": [
"mkdir",
"chmod",
"chown"
],
"action": "SCMP_ACT_ERRNO"
}
]
}
內容解密:
此JSON組態定義了一個Seccomp策略:
defaultAction設定為SCMP_ACT_ERRNO,表示預設情況下,所有未明確允許的系統呼叫都會傳回錯誤。architectures陣列指定了該策略適用的CPU架構。syscalls部分明確禁止了mkdir、chmod和chown這三個系統呼叫。
接下來,我們可以使用以下命令執行一個根據alpine映象的Docker容器,並載入上述Seccomp策略:
$ docker run --rm -it --security-opt seccomp:policy.json alpine sh
在容器內部嘗試執行被禁止的命令時,將會收到Operation not permitted錯誤:
$ mkdir newdir
$ chown root:root bin
$ chmod +x /etc/resolv.conf
圖示說明:
此圖示展示了在啟用了Seccomp策略的容器中執行上述命令的結果。
graph LR
A[啟動容器] --> B[載入Seccomp策略]
B --> C[執行mkdir/chown/chmod]
C --> D[傳回Operation not permitted錯誤]
圖表翻譯: 此圖表展示了在Docker容器中啟用Seccomp策略後,嘗試執行被禁止的系統呼叫的流程。從啟動容器到載入Seccomp策略,最終因許可權不足而傳回錯誤。
降低容器攻擊面
降低攻擊面是安全性的基本原則。除了主機安全外,容器的底層分享核心架構也需要關注。透過合理組態Seccomp策略和其他安全措施,可以顯著提高容器的安全性。
Docker Bench Security:容器安全稽核工具
Docker Bench Security是一個開源工具,用於檢查Docker容器的安全性組態。它根據Docker CIS(Center for Internet Security)基準測試,提供了全面的安全評估報告。
使用Docker Bench Security
可以透過以下命令執行Docker Bench Security:
$ docker run -it --net host --pid host --cap-add audit_control \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib/systemd:/usr/lib/systemd \
-v /etc:/etc --label dockerbenchsecurity \
docker/docker-bench-security
該工具會檢查多個維度的安全性,包括主機組態、Docker守護程式組態、容器執行時組態等,並提供詳細的檢查報告和改進建議。
檢查內容包括:
- 主機組態
- Docker守護程式組態
- Docker守護程式組態檔案
- 映象和容器編譯檔案
- 執行時容器組態
- Docker安全操作
示例警告資訊:
[WARN] 2.2 - Restrict network traffic between containers
預設情況下,執行在同一主機上的所有容器都可以相互存取網路流量。為避免此問題,可以在啟動Docker守護程式時新增--icc=false標誌。
Docker 安全檢查與設定最佳實踐
Docker 是一種流行的容器化技術,但其安全性設定卻經常被忽略。本文將介紹如何使用 Docker Bench Security 工具來檢查 Docker 主機的安全設定,以及如何根據檢查結果進行最佳化。
Docker Bench Security 工具介紹
Docker Bench Security 是一個開源的工具,用於檢查 Docker 主機的安全設定。它會對 Docker 主機進行一系列的檢查,包括 Docker daemon 的設定、容器映像檔的建立、容器的執行等。
使用 Docker Bench Security 檢查 Docker 主機安全設定
使用 Docker Bench Security 工具非常簡單,只需執行以下命令:
docker run -it --net=host --pid=host --userns=host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib/systemd:/usr/lib/systemd \
-v /etc:/etc \
docker/docker-bench-security
執行後,Docker Bench Security 會輸出檢查結果,包括警告和建議。
檢查結果分析
檢查結果中,警告訊息通常以 [WARN] 開頭,表示該設定可能存在安全風險。例如:
[WARN] 4.1 - Create a user for the container
[WARN] * Running as root:
At this point, it is recommended to create another user other than root to run your containers.
這裡建議為容器建立一個非 root 使用者,以避免使用 root 許可權執行容器。
程式碼範例:建立非 root 使用者
# 使用官方 Python 映像檔
FROM python:latest
# 建立一個新的使用者
RUN useradd -ms /bin/bash appuser
# 切換到新使用者
USER appuser
# 設定工作目錄
WORKDIR /app
# 複製應用程式碼
COPY . /app
# 安裝依賴套件
RUN pip install --no-cache-dir -r requirements.txt
# 執行應用程式
CMD ["python", "app.py"]
內容解密:
FROM python:latest:使用官方 Python 映像檔作為基礎映像檔。RUN useradd -ms /bin/bash appuser:建立一個新的使用者appuser。USER appuser:切換到appuser使用者。WORKDIR /app:設定工作目錄為/app。COPY . /app:複製應用程式碼到/app目錄。RUN pip install --no-cache-dir -r requirements.txt:安裝依賴套件。CMD ["python", "app.py"]:執行應用程式。
Docker Daemon 設定檔的安全檢查
Docker Daemon 設定檔的安全檢查是非常重要的。Docker Bench Security 會檢查 Docker Daemon 設定檔的許可權,確保只有 root 使用者可以存取。
Docker Daemon 設定檔的安全檢查流程
graph LR;
C[C]
A[開始檢查] --> B[檢查 Docker Daemon 設定檔許可權];
B --> C{是否只有 root 使用者可以存取?};
C -->|是| D[檢查透過];
C -->|否| E[發出警告];
E --> F[建議修改許可權];
圖表翻譯: 此圖示呈現了 Docker Daemon 設定檔的安全檢查流程。首先開始檢查,接著檢查 Docker Daemon 設定檔的許可權。如果只有 root 使用者可以存取,則檢查透過;否則,發出警告並建議修改許可權。
Lynis 和 Dockscan 工具介紹
Lynis 和 Dockscan 是兩款開源的安全稽核工具,用於評估 Linux 和 UNIX 系統的安全性。Lynis 可以直接在 Docker 主機上執行,對 Linux 核心進行存取。
使用 Lynis 進行安全稽核
使用 Lynis 進行安全稽核非常簡單,只需執行以下命令:
lynis audit system
Lynis 會輸出安全稽核報告,包括警告和建議。
程式碼範例:使用 Docker Bench Security 和 Lynis 進行安全檢查
# 使用 Docker Bench Security 進行安全檢查
docker run -it --net=host --pid=host --userns=host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib/systemd:/usr/lib/systemd \
-v /etc:/etc \
docker/docker-bench-security
# 使用 Lynis 進行安全稽核
lynis audit system
內容解密:
- 第一部分使用 Docker Bench Security 進行安全檢查,掛載必要的目錄並設定環境變數。
- 第二部分使用 Lynis 進行安全稽核,直接在 Docker 主機上執行。