本卡屬 FR-187(母卡 CM-3711),第 4 批 G:容器非 root 與 compose 設定(主系統 repo
compliance-manager-be,3 檔/約 1046 行)。只掃不修。工作坊會用.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描,小弟不必自己打指令。
用 Claude Code 官方 claude-security plugin 掃「容器非 root 與 compose 設定」這一塊,找出資安問題,寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題,修是另外開卡的事。
FR-180 把出貨的九顆容器全部改成不用最高權限執行,FR-179 讓它們改從記憶體讀設定檔。這一棒看出貨 compose 檔與 init 容器:每個服務的身分、權限、掛載、對外埠、拿到哪些設定。
compose 檔就是客戶機器上的防線清單。少一行 cap_drop、多掛一個目錄、多開一個埠,前面程式碼修得再好,攻擊者拿下一顆容器就能橫移到別顆、或碰到主機。
背景:這一輪掃的是 2026-11-01(FR-172 開案)到 11-09 之間主專案與 jedi-remote-agent 新寫或大改的程式(FR-171/172/178/179/180/181/182),這些程式都沒掃過。
docker/production/docker-compose.yml
docker/init/entrypoint.sh
docker/init/Dockerfile
檔數 3、約 1046 行。驗檔數:git -C <工作目錄> ls-files -- docker/production/docker-compose.yml docker/init/entrypoint.sh docker/init/Dockerfile | wc -l 應為 3。scope 外的檔不要讀,除非下面「重點看什麼」明寫「只追這幾行」;越界的發現首腦驗收時會挑掉。
首腦讀過程式碼後認為最容易出事的地方,是思考起點不是檢查清單,行號以 2026-11-09 的主線為準,對不上就以內容為準。工具不會照這份走,掃完後你要自己逐條對一遍:工具沒報的,開檔看一眼,寫「人工查過:成立/不成立/為什麼」。
user: 不是 0、cap_drop: [ALL]、security_opt 有 no-new-privileges;包含 bugsink、init、redis、db、fe。有沒有掛 docker.sock、主機的 /proc、/sys。/run/guidant(明碼設定所在)掛進了哪幾顆容器;env_file 讓哪些容器拿到整份設定(含資料庫密碼、JWT 金鑰)——bugsink、fe 不該拿到主系統的。ports::只有前門 fe 的 8080/8443 對外;db 5432、redis 6379、api 8000 不對外(:450 註解說排錯可臨時開 8000)。:206 註解):其他容器的使用者讀不讀得到。docker/init/Dockerfile:COPY 了哪些檔,有沒有把私鑰、.env、測試金鑰帶進 image(對照 Dockerfile.dockerignore 白名單,只追這份)。docker/init/entrypoint.sh:GUIDANT_INIT_MODE 各分支;MIGRATE_KEYS_DRY_RUN 這類環境變數能不能被拿來跳過檢查。FR-077(2026-09)掃過 jedi-remote-agent 與主系統接線的舊版,FR-086 掃過檔案上傳下載,FR-177(2026-11-05~07)掃過 Agent 本體;結論在主系統 repo docs/features/security-scan-consolidated/README.md,只是參照,沒有經過本棒的三人投票。