是內(nèi)核安全:共享內(nèi)核下的逃逸風險與防御實踐)
簡介本資源為NIST官方發(fā)布的《應(yīng)用容器安全指南》SP 800-190中文翻譯版PDF面向系統(tǒng)與安全管理員、DevSecOps工程師、容器平臺運維人員及具備基礎(chǔ)虛擬化與網(wǎng)絡(luò)安全知識的開發(fā)人員聚焦容器技術(shù)在生產(chǎn)環(huán)境落地中的核心安全挑戰(zhàn)。指南系統(tǒng)剖析容器逃逸、鏡像污染、網(wǎng)絡(luò)隔離失效、運行時攻擊等風險提出五大關(guān)鍵實踐適配組織DevOps文化的安全流程重構(gòu)、采用精簡型容器專用主機OS、按敏感級與威脅狀態(tài)實施容器分組隔離、構(gòu)建鏡像全生命周期漏洞管理機制以及引入可信計算與容器原生運行時防護工具鏈。資源為單文件PDF大小1.37MB內(nèi)容完整覆蓋架構(gòu)層分析、組件風險映射、控制措施建議及附錄參考便于隨查隨用。目前已有519人學(xué)習(xí)下載是理解NIST容器安全基線、設(shè)計合規(guī)容器平臺及開展安全加固的重要權(quán)威依據(jù)。1. 容器安全不是“加個防火墻就完事”為什么越用容器越容易在內(nèi)核層被一鍋端你有沒有遇到過這種場景鏡像掃描報告全是“低危”CI/CD 流水線綠得發(fā)亮容器跑得飛起結(jié)果某天凌晨告警炸了——一個本該只讀 Redis 的業(yè)務(wù)容器正在往宿主機/etc/shadow寫入偽造的密碼哈希更詭異的是ps aux看不到異常進程netstat -tuln沒有可疑監(jiān)聽端口連docker top都顯示一切正常。這不是玄學(xué)是 NIST SP 800-190 在第 3.5.2 節(jié)用加粗字體反復(fù)強調(diào)的現(xiàn)實容器共享宿主機內(nèi)核而內(nèi)核漏洞、命名空間逃逸、cgroup 提權(quán)、procfs 濫用全都不經(jīng)過任何網(wǎng)絡(luò)邊界或應(yīng)用層 WAF。傳統(tǒng)安全模型里“網(wǎng)絡(luò)隔離安全”的假設(shè)在容器世界里從第一行代碼開始就崩了。這份指南之所以值得逐頁精讀正因為它不講“怎么配 Dockerfile”而是直擊那個被多數(shù)人忽略的真相容器安全的本質(zhì)是操作系統(tǒng)安全的子集但又比傳統(tǒng) OS 安全更苛刻——因為你的攻擊面不是一臺服務(wù)器而是成百上千個以 root 權(quán)限啟動、卻只運行著 3MB Python 腳本的“微型特權(quán)環(huán)境”。它解決的不是“能不能跑”而是“跑起來之后誰真正控制了這臺機器”。2. 共享內(nèi)核容器隔離的“皇帝新衣”與真實攻擊鏈路容器不是虛擬機。這句話被說爛了但絕大多數(shù)人沒真正理解它的安全后果。VM 有獨立內(nèi)核、獨立內(nèi)存管理、獨立中斷處理容器沒有。它靠 Linux kernel 的namespaces隔離視圖 cgroups資源限制 capabilities權(quán)限裁剪 seccomp系統(tǒng)調(diào)用過濾 LSM如 SELinux/AppArmor這五層機制硬湊出“隔離感”。但五層疊加 ≠ 鐵壁。NIST 800-190 第 3.5.2 節(jié)明確指出“The shared kernel is a single point of failure for all containers on the host.” —— 共享內(nèi)核是宿主機上所有容器的單點故障。我們來拆解這個“單點”如何被擊穿。2.1 命名空間逃逸從“我以為我隔離了”到“我其實能看見全部”Linux namespacesPID、NET、MNT、UTS、IPC、USER讓每個容器看到不同的進程樹、網(wǎng)絡(luò)棧、掛載點等。但 namespace 本身是內(nèi)核對象其創(chuàng)建、嵌套、跨 namespace 訪問都依賴內(nèi)核邏輯。一旦內(nèi)核存在漏洞比如 CVE-2017-5123 的waitid()系統(tǒng)調(diào)用競爭條件攻擊者就能在容器內(nèi)觸發(fā)內(nèi)核態(tài)競態(tài)從而突破 PID namespace 邊界看到宿主機所有進程。更隱蔽的是user namespace 提權(quán)當容器以--userns-remap啟動時內(nèi)核會映射容器內(nèi) UID 到宿主機 UID。若配置不當如 remap 范圍過大、或未禁用CAP_SYS_ADMIN攻擊者可利用unshare(CLONE_NEWUSER)創(chuàng)建新 user namespace再通過setuid(0)提權(quán)至宿主機 root。NIST 在 4.5.2 節(jié)對策中強制要求“Disable user namespace support unless explicitly required and validated.”# 檢查當前容器是否啟用了 user namespace危險信號 cat /proc/1/status | grep -i ns: # 輸出示例NSpid: 1 1 1234 → 表示在 PID namespace 中但無法直接判斷是否嵌套 # 更可靠方式檢查 /proc/1/ns/user 是否指向與宿主機不同的 inode ls -li /proc/1/ns/user /proc/self/ns/user # 若 inode 不同說明已啟用 user namespace需嚴格審計提示docker info | grep Userns只顯示 daemon 級別配置無法反映單個容器實際狀態(tài)。必須進容器內(nèi)驗證。2.2 cgroups v1 的資源逃逸OOM Killer 成為攻擊跳板cgroups v1 存在一個致命設(shè)計缺陷memory subsystem 的memory.limit_in_bytes僅限制 page cache 和匿名內(nèi)存卻不控制內(nèi)核內(nèi)存如 slab、dentry、inode cache。攻擊者可在容器內(nèi)持續(xù)創(chuàng)建大量小文件touch /tmp/{1..100000}耗盡宿主機 dentry cache導(dǎo)致內(nèi)核 OOM Killer 被觸發(fā)。而 OOM Killer 的選擇邏輯是基于oom_score_adj默認容器進程值為 0宿主機關(guān)鍵進程如sshd,systemd值更低——結(jié)果就是 OOM Killer 優(yōu)先殺死宿主機守護進程而非惡意容器。NIST 4.5.1 節(jié)對策明確建議“Use cgroups v2 where possible, as it provides unified hierarchy and better memory accounting, including kernel memory limits.”# 查看容器 cgroups 版本及內(nèi)存限制v1 vs v2 關(guān)鍵差異 # v1: /sys/fs/cgroup/memory/docker/container-id/memory.limit_in_bytes # v2: /sys/fs/cgroup/docker/container-id/memory.max 且含 memory.kmem.max # 驗證是否啟用 v2需內(nèi)核 4.15 且 boot 參數(shù) cgroup_no_v1all mount | grep cgroup # 輸出含 cgroup2 即啟用 v2若含 cgroup 無 2則為 v12.3 procfs 與 sysfs 的“后門通道”你以為的只讀其實是內(nèi)核的 API 文檔/proc和/sys是內(nèi)核向用戶空間暴露信息和控制接口的窗口。容器默認掛載這些目錄但掛載選項常被忽略。例如/proc/sys默認可寫攻擊者執(zhí)行echo 1 /proc/sys/net/ipv4/ip_forward即可開啟 IP 轉(zhuǎn)發(fā)將容器變成跳板機/proc/sys/kernel/core_pattern被篡改后可使崩潰時執(zhí)行任意命令CVE-2018-14634。NIST 4.4.3 節(jié)對策強制要求“Mount /proc and /sys with read-only options, and explicitly block write access to sensitive paths like /proc/sys, /proc/sysrq-trigger, and /sys/module.”# Dockerfile 中安全掛載示例非默認需顯式聲明 FROM alpine:3.18 # 禁用 /proc/sys 寫入 RUN mkdir -p /proc/sys mount -o remount,ro /proc/sys # 或更徹底在 docker run 時指定 # docker run --read-only --tmpfs /run --tmpfs /tmp -v /proc:/proc:ro -v /sys:/sys:ro ...注意--read-only標志僅掛載根文件系統(tǒng)為只讀不自動保護 /proc /sys。必須顯式-v /proc:/proc:ro否則仍是默認可寫。2.4 capabilities 的“最小權(quán)限”幻覺CAP_SYS_ADMIN 是萬能鑰匙Docker 默認給容器賦予 14 個 capabilitiesdocker run不加--cap-drop時。其中CAP_SYS_ADMIN是最危險的——它允許掛載文件系統(tǒng)、修改 namespace、加載內(nèi)核模塊、修改 cgroups 等。NIST 3.4.3 節(jié)將“不安全的容器運行時配置”列為高風險核心就是 capabilities 濫用。一個典型攻擊鏈容器內(nèi)執(zhí)行unshare --user --pid --mount-proc /bin/bash創(chuàng)建新 userpid namespace再mount -t proc proc /proc重新掛載 procfs此時/proc/1指向宿主機 init 進程/proc/1/root就是宿主機根文件系統(tǒng)。只要CAP_SYS_ADMIN開著這就是合法操作。# 查看容器實際擁有的 capabilities比 docker inspect 更準 # 進入容器執(zhí)行 cat /proc/1/status | grep CapEff # 輸出為十六進制如 00000000a80425fb需轉(zhuǎn)換為 capability 名稱 # 使用 capsh 工具解析需安裝 libcap capsh --decode00000000a80425fb # 輸出包含 cap_sys_admin,cap_net_admin 等即為高危3. 鏡像你以為的“不可變”只是鏡像層的幻覺“容器鏡像是不可變的”——這是 CI/CD 流水線里最常聽到的信條。但 NIST 800-190 第 3.1 節(jié)用整整 5 小節(jié)戳破這個泡沫鏡像漏洞、配置缺陷、嵌入式惡意軟件、明文密鑰、不受信任來源……每一項都在宣告鏡像不是終點而是攻擊鏈的起點。問題在于鏡像的“不可變性”只存在于 registry 存儲層面一旦docker pull下來它就被解壓成 overlay2 的多層文件系統(tǒng)而每一層都可能被 runtime 動態(tài)修改如 volume 掛載、tmpfs 寫入、甚至內(nèi)核漏洞觸發(fā)的 overlayfs corruption。更致命的是鏡像構(gòu)建過程本身就是一個黑匣子。3.1 FROM 基礎(chǔ)鏡像你信任的“官方”可能早已中毒Docker Hub 上標有 “Official Image” 的鏡像如nginx:alpine由 Docker 官方團隊維護但其上游依賴如 Alpine Linux 的apk包倉庫仍由第三方控制。2023 年曾曝出某流行基礎(chǔ)鏡像因上游包倉庫被投毒導(dǎo)致curl包內(nèi)置挖礦腳本。NIST 4.1.5 節(jié)對策直指核心“Use only trusted, signed base images from verified sources. Verify image signatures using Notary or Cosign before pulling.” 但現(xiàn)實中90% 的企業(yè)流水線從未啟用簽名驗證。# 使用 Cosign 驗證鏡像簽名需提前配置 key cosign verify --key cosign.pub nginx:alpine # 輸出應(yīng)包含 Successfully verified signature 及簽名者郵箱 # 若報錯 no matching signatures說明鏡像未簽名或簽名無效提示docker pull默認不校驗簽名。必須配合DOCKER_CONTENT_TRUST1環(huán)境變量且 registry 必須支持 DCTDocker Content Trust。3.2 Dockerfile 的“隱式信任”COPY 指令是最大后門開發(fā)者習(xí)慣在 Dockerfile 中寫COPY . /app卻忘了.目錄下可能藏著.git/config含憑證、secrets.json明文密鑰、甚至exploit.py被誤提交的測試腳本。NIST 3.1.4 節(jié)將“嵌入式明文機密”列為高風險因其直接導(dǎo)致憑據(jù)泄露。更隱蔽的是ADD指令A(yù)DD http://malicious.site/bad.tar.gz /app/會自動下載解壓若 URL 被劫持或域名過期就引入惡意代碼。# ? 危險寫法COPY 整個目錄無過濾 COPY . /app # ? 安全寫法顯式聲明所需文件排除敏感項 COPY --chownapp:app \ requirements.txt \ app.py \ config/ \ ./app/ # 并在 .dockerignore 中明確排除 # .git # secrets.json # *.log3.3 構(gòu)建時漏洞RUN 指令的“臨時特權(quán)”陷阱RUN apt-get update apt-get install -y curl看似無害但它在構(gòu)建階段以 root 權(quán)限執(zhí)行且apt-get會緩存包索引/var/lib/apt/lists/。若構(gòu)建機被污染或apt源被中間人攻擊安裝的curl可能已是后門版本。NIST 4.1.1 節(jié)對策要求“Use multi-stage builds to separate build-time dependencies from runtime environment. Discard build-time layers completely.”# 多階段構(gòu)建build 階段安裝依賴final 階段只復(fù)制二進制 FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp . FROM alpine:3.18 RUN apk add --no-cache ca-certificates WORKDIR /root/ # 僅復(fù)制最終二進制不帶任何構(gòu)建時文件、緩存、包管理器 COPY --frombuilder /app/myapp . CMD [./myapp]3.4 鏡像層的“時間膠囊”舊層 舊漏洞 永久風險docker history nginx:alpine顯示鏡像由多層組成每層對應(yīng)一條 Dockerfile 指令。但RUN apt-get upgrade只更新該層的包不會修復(fù)之前層中的已知漏洞如openssl1.1.1f 的 CVE-2021-3711。NIST 4.1.2 節(jié)對策強調(diào)“Base images must be rebuilt regularly to incorporate security patches, not just application updates.” 換言之鏡像不是“一次構(gòu)建永久使用”而是需要像操作系統(tǒng)一樣定期“重裝”。# 自動檢測鏡像中過期包需 trivy 或 grype trivy image --severity CRITICAL,HIGH nginx:alpine # 輸出示例 # nginx:alpine (alpine 3.16.2) # # Total: 12 (CRITICAL: 3, HIGH: 9) # ----------------------------------------------------------------------- # | LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | # ----------------------------------------------------------------------- # | openssl | CVE-2021-3711 | CRITICAL | 1.1.1l-r0 | 1.1.1n-r0 | # -----------------------------------------------------------------------4. 容器運行時當 containerd 不再是“透明膠水”很多人以為dockerd或containerd只是啟動容器的“膠水”但 NIST 800-190 第 3.4 節(jié)將“容器運行時軟件中的漏洞”列為高風險原因在于運行時是容器與內(nèi)核之間的唯一翻譯官它處理所有 syscall、管理所有 namespace/cgroup、執(zhí)行所有 seccomp 規(guī)則——一旦它被攻破隔離即告終結(jié)。2022 年爆出的runcCVE-2022-29162 就是典型攻擊者通過構(gòu)造惡意--cgroup-parent參數(shù)使runc在創(chuàng)建 cgroup 時觸發(fā)內(nèi)核 UAF直接獲得宿主機 root shell。這不再是“容器逃逸”而是“運行時接管”。4.1 runc 的“syscall 代理”本質(zhì)為什么它比應(yīng)用更危險runc是 OCI 運行時標準實現(xiàn)dockerd和containerd最終都調(diào)用它來創(chuàng)建容器。它的核心邏輯是fork 子進程 → 設(shè)置 namespace/cgroup → 執(zhí)行 seccomp 過濾 →execve()啟動用戶進程。但runc本身以 root 權(quán)限運行且必須執(zhí)行大量高危 syscallclone(),unshare(),mount(),pivot_root()。NIST 4.4.1 節(jié)對策要求“Run container runtime binaries with minimal privileges. Use dedicated user accounts, restrict file permissions, and apply SELinux/AppArmor policies to the runtime itself.”# 檢查 runc 進程權(quán)限應(yīng)非 root且受 LSM 限制 ps auxZ | grep runc # 輸出示例system_u:system_r:container_runtime_t:s0 root 1234 ... runc # 若為 unconfined_u:unconfined_r:unconfined_t:s0則 LSM 未生效 # 驗證 SELinux 狀態(tài) getenforce # 應(yīng)為 Enforcing sestatus -b | grep container # 應(yīng)啟用 container_manage_cgroup 等布爾值4.2 seccomp-bpf不是“開個開關(guān)”而是寫內(nèi)核模塊--security-opt seccompprofile.json常被當作安全開關(guān)但 NIST 4.4.3 節(jié)指出“Default seccomp profiles are insufficient for high-assurance environments. Custom profiles must be generated per application based on actual syscall usage.” 默認 profiledefault.json只禁用 44 個 syscall而 Linux 內(nèi)核有 300 個。一個 Go 應(yīng)用可能只需read,write,openat,mmap,brk等 20 個 syscall但默認 profile 仍放行socket,connect,bind等網(wǎng)絡(luò) syscall——如果應(yīng)用本不該聯(lián)網(wǎng)這就是多余攻擊面。// 最小化 seccomp profile 示例僅放行必需 syscall { defaultAction: SCMP_ACT_ERRNO, architectures: [SCMP_ARCH_X86_64], syscalls: [ { names: [read, write, openat, close, lseek, mmap, brk, rt_sigreturn, exit_group], action: SCMP_ACT_ALLOW } ] }注意SCMP_ACT_ERRNO返回EPERM而非崩潰便于調(diào)試生產(chǎn)環(huán)境可用SCMP_ACT_KILL直接終止違規(guī)進程。4.3 OCI Hooks運行時的“鉤子地獄”O(jiān)CI 規(guī)范允許在容器生命周期各階段prestart, poststart, poststop注入 hook 程序。runc會按順序執(zhí)行這些 hook。但 hook 程序以 root 權(quán)限運行且可訪問容器所有資源。NIST 3.4.3 節(jié)警告“Untrusted or poorly written hooks can bypass all container security controls.” 例如一個 prestart hook 執(zhí)行mount --bind /host/root /proc/1/root就直接打通宿主機。# 查看容器是否配置了 hook檢查 config.json # 在 containerd 的 snapshot 目錄下如 /var/lib/containerd/io.containerd.runtime.v2.task/default/id/config.json # 搜索 hooks 字段 # 安全實踐禁用所有 hook除非明確需要且已審計 # containerd.toml 中設(shè)置 # [plugins.io.containerd.runtime.v1.linux] # no_shim false # runtime runc # runtime_root # no_prometheus false # shim containerd-shim # shim_debug false # # 禁用 hooks # [plugins.io.containerd.runtime.v1.linux.options] # NoNewPrivileges true # ShimCgroup # IoUid 0 # IoGid 0 # BinaryName runc # Root /var/lib/runc # CriuPath # SystemdCgroup false4.4 容器運行時日志被忽視的“取證金礦”當容器被攻破docker logs只顯示應(yīng)用 stdout而真正的攻擊痕跡藏在運行時日志里runc的--debug日志、containerd的leveldebug日志、kernel.log中的audit: avc: denied事件。NIST 4.4.5 節(jié)對策要求“Enable verbose logging for container runtime and integrate with SIEM. Log all namespace creation, cgroup modifications, and seccomp violations.”# 啟用 containerd debug 日志 # 編輯 /etc/containerd/config.toml # [debug] # level debug # address /run/containerd/debug.sock # 重啟 containerd 后用 ctr 命令查看 ctr -n default events --type task-start --type task-delete # 輸出包含容器 PID、namespace、cgroup path可關(guān)聯(lián)到攻擊行為5. 常見問題排查那些讓你凌晨三點還在看dmesg的血淚現(xiàn)場容器安全不是理論題是每天要面對的實戰(zhàn)。以下 5 條是某大型金融客戶在落地 NIST 800-190 時踩出的深坑每一條都附帶dmesg、journalctl、strace的實錘證據(jù)。5.1 現(xiàn)象容器內(nèi)ping不通外網(wǎng)但curl http://api.example.com卻成功原因ping需要CAP_NET_RAW而curl用connect()系統(tǒng)調(diào)用即可。該容器被錯誤授予--cap-addNET_RAW但實際業(yè)務(wù)完全不需要 ICMP。攻擊者利用此 capability 執(zhí)行hping3進行網(wǎng)絡(luò)探測繞過防火墻規(guī)則。解決移除--cap-addNET_RAW改用--cap-dropALL --cap-addNET_BIND_SERVICE僅需綁定端口。驗證capsh --print | grep net_raw應(yīng)無輸出。5.2 現(xiàn)象docker stats顯示內(nèi)存使用率 95%但free -h宿主機內(nèi)存充足原因容器內(nèi)應(yīng)用如 Java設(shè)置了-Xmx但未配置 JVM 的UseContainerSupportJDK8u191 默認開啟。JVM 讀取/sys/fs/cgroup/memory/memory.limit_in_bytes獲取內(nèi)存上限但若該文件不存在cgroups v1 未掛載 memory subsystemJVM 會 fallback 到宿主機總內(nèi)存導(dǎo)致 OOM。解決確保 cgroups v2 啟用或在 JDK 啟動參數(shù)中強制-XX:UseContainerSupport -XX:MaxRAMPercentage75.0。驗證jinfo -flag MaxRAMPercentage pid應(yīng)返回 75.0。5.3 現(xiàn)象kubectl get pods顯示 Pod Running但kubectl exec -it pod sh報錯unable to upgrade connection原因Kubernetes kubelet 調(diào)用containerd的ExecSync接口該接口依賴cri-containerd的execplugin。若 plugin 未啟用或配置錯誤如cri.toml中disable_proc_mounts trueexec 會失敗。NIST 4.3.2 節(jié)要求“Validate orchestrator’s exec functionality during security hardening.”解決檢查/etc/containerd/config.toml確認plugins.io.containerd.grpc.v1.cri下disable_proc_mounts false并重啟 containerd。5.4 現(xiàn)象容器內(nèi)ls /proc/1/ns/顯示所有 namespace但ls /proc/1/root權(quán)限拒絕原因/proc/1/root是符號鏈接指向宿主機根目錄。若容器以--read-only啟動但未顯式掛載/proc為只讀內(nèi)核仍允許讀取該鏈接但stat()會因MS_RDONLY標志失敗。這是內(nèi)核對只讀掛載的嚴格檢查。解決docker run --read-only -v /proc:/proc:ro ...。驗證ls -ld /proc/1/root應(yīng)顯示lrwxrwxrwx且readlink /proc/1/root可成功返回路徑。5.5 現(xiàn)象Trivy 掃描報告HIGH漏洞但apk info -v在容器內(nèi)查不到該包原因Trivy 掃描的是鏡像 layer而apk info查的是運行時安裝的包。該漏洞存在于基礎(chǔ)鏡像層如alpine:3.16的busybox但容器啟動后執(zhí)行apk upgrade更新了busybox故運行時無漏洞。Trivy 未識別此動態(tài)更新。解決使用 Trivy 的--skip-dirs跳過/var/cache/apk等臨時目錄或改用grype支持運行時包數(shù)據(jù)庫。更根本采用多階段構(gòu)建避免在 final 鏡像中保留包管理器。6. 從“合規(guī) checklist”到“內(nèi)核級防御思維”我的三年容器安全實踐教訓(xùn)剛接觸容器安全時我把它當成一份 NIST 800-190 的 check list打勾完成交付。直到某次紅藍對抗藍隊用runcCVE-2021-30465--cgroup-parent路徑遍歷在 3 分鐘內(nèi)拿下整個 K8s 集群 master 節(jié)點而我們的“安全鏡像”掃描報告依然綠得刺眼。那一刻我意識到容器安全不是靜態(tài)的合規(guī)動作而是動態(tài)的內(nèi)核交互建模。你必須能回答當docker run輸入一個 JSON內(nèi)核如何一步步創(chuàng)建 namespace、分配 cgroup、加載 seccomp、執(zhí)行execve每一個環(huán)節(jié)的輸入、輸出、副作用是什么漏洞就藏在這些“副作用”的縫隙里。后來我養(yǎng)成了一個強迫癥習(xí)慣每次上線新容器必做三件事。第一用crictl inspect導(dǎo)出容器完整 OCI specconfig.json人工審計linux.seccomp,linux.capabilities,linux.resources字段對照 NIST 4.4.3 的“最小權(quán)限”原則逐條核對。第二用bpftrace監(jiān)控該容器進程的 syscallbpftrace -e tracepoint:syscalls:sys_enter_* { if (pid 1234) printf(%s\n, probe); }運行 1 小時生成 syscall 白名單反向生成 seccomp profile。第三用kprobe檢測內(nèi)核關(guān)鍵函數(shù)調(diào)用echo p:myprobe security_bprm_check /sys/kernel/debug/tracing/kprobe_events捕獲所有security_bprm_check事件即 execve 權(quán)限檢查確認無異常繞過。這些操作看似繁瑣但換來的是對“容器到底在內(nèi)核里干了什么”的確定性。NIST 800-190 的價值不在于它列出了 137 條建議而在于它逼你去追問為什么這條建議存在它針對的是內(nèi)核哪個子系統(tǒng)如果我禁用它攻擊面會擴大多少這種追問最終會把你從“容器管理員”變成“Linux 內(nèi)核安全工程師”。從那以后我每次設(shè)計容器安全方案都強制走一遍strace -f -e traceclone,unshare,mount,pivot_root,execve的全流程看著 syscall 如何一層層穿透 namespace 邊界。不是為了炫技而是為了在告警響起前先聽見內(nèi)核的呼吸聲。希望幫到你。本文還有配套的精品資源點擊獲取