https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html
security model 是指在通常是一組 config,用來限制系統或 application 的權限和行為,以增加安全系。
然後它文章中提到幾個常見的seccomp
、AppArmor
都是個適合設定的標配。
然後這個可以在 k8s security context 中設定如下,例如我們要設 seccomp,就很簡單如下 :
...
securityContext:
seccompProfile:
type: RuntimeDefault
至於 seccomp 的詳細內容可以參考以下的官方資料。
https://docs.docker.com/engine/security/seccomp/
最好的避免 dos ( denial of service 單一來源攻擊 ) ,就是限制資源,例如 memory、cpu、file descriptors。
建議將檔案系統和卷(volumes)設定為唯讀。具體的實現方法是在執行容器時使用 --read-only
選項,這樣容器的檔案系統會以唯讀模式運行。
docker run --read-only alpine sh -c 'echo "whatever" > /tmp
為什麼呢 ? 因為它限制了 container 裡的 application 對 filesystem 的寫入權限,這樣可以防止惡意程式修改檔案。
但如果有時需要暫存個檔案怎麼辦法呢 ? 那就是用—tmpfs
如下 :
docker run --read-only --tmpfs /tmp alpine sh -c 'echo "whatever" > /tmp/file'
然後在 k8s security context 中也可以設定 :
kind: ...
apiVersion: ...
metadata:
name: ...
spec:
...
containers:
- name: ...
image: ....
securityContext:
...
readOnlyRootFilesystem: true
...
就是用 static analysis 來看看你的 container 有沒有弱點,然後這東東我自已是認為也很適合放到 CI 中 ?
文章提供的工具就在連結裡面,自已去試和看 ~
除非一定需要,否則絕對不要開啟 docker daemon 的 debug log,如果要,也只能 debug 完馬上關掉,不然裡面有很多的敏感資料。
我們平常開發時,會用 eslint 來檢查程式碼,然後這裡就是建議也要用 security linter 來在 CI 時檢查 dockerfile,然後一些值得的點如下 :
確保用某個 user 來執行 docker run ,不要用 root 執行,這個好像,就是 rule #2 的建議。
確保 base image 版本被固定,不是用 latest 之類的,因為這樣較穩定,但還是要固定的升級。
確保 os 套件版本被固定,原因同上。
避免使用 add,優先使用 copy。這兩個指令都是將檔地檔案 copy 到 image 中,但 copy 在簡單性、透明性、安全性考慮下,是較好的選擇。
避免在 run 指令中使用 curl bash,因為有可能會受到中間人攻擊,而且依賴外部網路,這裡建議替代方法是用 apt-get。
這裡補充一下說明 docker 中的copy
與add
的上面提到的簡單性、透明性、安全性的差異。
主要的差別在於 copy 只是一個單純將 local 檔案或目錄複製到 image 中,但 add 除了複製,它還支援解壓縮與 url 複製等功能。
所以這裡代表 add 因為可以使用 url 複製功能,也代表可以支援下載,就可能會發生中間人攻擊的風險。