適用於 Docker 的 Seccomp 安全設定檔

安全運算模式 (seccomp) 是一種 Linux 核心功能。您可以使用它來限制容器內可用的動作。 seccomp() 系統呼叫會對呼叫程序的 seccomp 狀態進行操作。您可以使用此功能來限制應用程式的存取權。

僅當 Docker 使用 seccomp 建置且核心已啟用 CONFIG_SECCOMP 設定時,此功能才可用。要檢查您的核心是否支援 seccomp

$ grep CONFIG_SECCOMP= /boot/config-$(uname -r)
CONFIG_SECCOMP=y

傳遞容器的設定檔

預設 seccomp 設定檔提供使用 seccomp 執行容器的合理預設值,並停用 300 多個系統呼叫中的大約 44 個。它具有適度的保護性,同時提供廣泛的應用程式相容性。可以在 這裡

預設設定檔封鎖的重要系統呼叫

Docker 的預設 seccomp 設定檔是一個允許清單,其中指定允許的呼叫。下表列出有效封鎖的重要(但並非所有)系統呼叫,因為它們不在允許清單中。表格中包含每個系統呼叫被封鎖而不是列入允許清單的原因。

系統呼叫說明
acct會計系統呼叫,可讓容器停用其自身的資源限制或程序會計。也由 CAP_SYS_PACCT 控制。
add_key防止容器使用核心金鑰環,該金鑰環沒有命名空間。
bpf拒絕將可能持續存在的 bpf 程式載入到核心,已由 CAP_SYS_ADMIN 控制。
clock_adjtime時間/日期沒有命名空間。也由 CAP_SYS_TIME 控制。
clock_settime時間/日期沒有命名空間。也由 CAP_SYS_TIME 控制。
clone拒絕複製新的命名空間。也由適用於 CLONE_* 旗標的 CAP_SYS_ADMIN 控制,但 CLONE_NEWUSER 除外。
create_module拒絕對核心模組進行操作和函數。已過時。也由 CAP_SYS_MODULE 控制。
delete_module拒絕對核心模組進行操作和函數。也由 CAP_SYS_MODULE 控制。
finit_module拒絕對核心模組進行操作和函數。也由 CAP_SYS_MODULE 控制。
get_kernel_syms拒絕擷取已匯出的核心和模組符號。已過時。
get_mempolicy修改核心記憶體和 NUMA 設定的系統呼叫。已由 CAP_SYS_NICE 控制。
init_module拒絕對核心模組進行操作和函數。也由 CAP_SYS_MODULE 控制。
ioperm防止容器修改核心 I/O 權限級別。已由 CAP_SYS_RAWIO 控制。
iopl防止容器修改核心 I/O 權限級別。已由 CAP_SYS_RAWIO 控制。
kcmp限制程序檢查功能,已 durch das Löschen von CAP_SYS_PTRACE 封鎖。
kexec_file_loadkexec_load 的姐妹系統呼叫,執行相同的操作,但引數略有不同。也由 CAP_SYS_BOOT 控制。
kexec_load拒絕載入新的核心以供稍後執行。也由 CAP_SYS_BOOT 控制。
keyctl防止容器使用核心金鑰環,該金鑰環沒有命名空間。
lookup_dcookie追蹤/分析系統呼叫,可能會洩漏主機上的大量資訊。也由 CAP_SYS_ADMIN 控制。
mbind修改核心記憶體和 NUMA 設定的系統呼叫。已由 CAP_SYS_NICE 控制。
mount拒絕掛載,已由 CAP_SYS_ADMIN 控制。
move_pages修改核心記憶體和 NUMA 設定的系統呼叫。
nfsservctl拒絕與核心 nfs 常駐程式互動。自 Linux 3.1 起已過時。
open_by_handle_at舊容器突破的原因。也由 CAP_DAC_READ_SEARCH 控制。
perf_event_open追蹤/分析系統呼叫,可能會洩漏主機上的大量資訊。
personality防止容器啟用 BSD 模擬。本身沒有危險,但測試不足,可能存在許多核心漏洞。
pivot_root拒絕 `pivot_root`,這應該是一個需要權限的操作。
process_vm_readv限制程序檢查功能,已 durch das Löschen von CAP_SYS_PTRACE 封鎖。
process_vm_writev限制程序檢查功能,已 durch das Löschen von CAP_SYS_PTRACE 封鎖。
ptrace追蹤/分析系統呼叫。在 4.8 之前的 Linux 核心版本中被封鎖,以避免 seccomp 繞過。透過捨棄 `CAP_SYS_PTRACE` 已經封鎖了對任意行程的追蹤/分析,因為它可能會洩漏主機上的大量資訊。
query_module拒絕核心模組的操作和函式。已過時。
quotactl配額系統呼叫,可能讓容器停用自身的資源限制或行程記帳。也由 `CAP_SYS_ADMIN` 控制。
reboot不要讓容器重新啟動主機。也由 `CAP_SYS_BOOT` 控制。
request_key防止容器使用核心金鑰環,該金鑰環沒有命名空間。
set_mempolicy修改核心記憶體和 NUMA 設定的系統呼叫。已由 CAP_SYS_NICE 控制。
setns拒絕將執行緒與命名空間關聯。也由 `CAP_SYS_ADMIN` 控制。
settimeofday時間/日期沒有命名空間。也由 CAP_SYS_TIME 控制。
stime時間/日期沒有命名空間。也由 CAP_SYS_TIME 控制。
swapon拒絕開始/停止對檔案/裝置的交換。也由 `CAP_SYS_ADMIN` 控制。
swapoff拒絕開始/停止對檔案/裝置的交換。也由 `CAP_SYS_ADMIN` 控制。
sysfs已過時的系統呼叫。
_sysctl已過時,由 /proc/sys 取代。
umount應該是一個需要權限的操作。也由 `CAP_SYS_ADMIN` 控制。
umount2應該是一個需要權限的操作。也由 `CAP_SYS_ADMIN` 控制。
unshare拒絕為行程複製新的命名空間。也由 `CAP_SYS_ADMIN` 控制,但 `unshare --user` 例外。
uselib與共享程式庫相關的較舊系統呼叫,長期未使用。
userfaultfd使用者空間頁面錯誤處理,主要用於行程遷移。
ustat已過時的系統呼叫。
vm86在核心 x86 實模式虛擬機器中。也由 `CAP_SYS_ADMIN` 控制。
vm86old在核心 x86 實模式虛擬機器中。也由 `CAP_SYS_ADMIN` 控制。

在沒有預設 seccomp 設定檔的情況下執行

您可以傳遞 `unconfined` 來執行沒有預設 seccomp 設定檔的容器。

$ docker run --rm -it --security-opt seccomp=unconfined debian:jessie \
    unshare --map-root-user --user sh -c whoami