https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html
上面這個是 owasp 所提供關於 docker 資安相關的 cheet sheet,接下來我們這篇文章一個一個慢慢來看。
這個規則主要是叫我們要『 保持 host 與 docker 』的更新,這個資安規則我們在前面應該都看過不少了。
不要將 docker daemon 的 /var/run/docker.sock
expose 出去,即使是 container 也一樣,因為這是所有 api 的入口點,這樣可能會發生兩件事 :
如果有個容器被攻擊了,那這時就代表 hacker 可以攻擊所有的 container。
expose 出去就代表有可能被連線到,就代表 hacker 可以控制 docker 大腦。
但如果你真的真的要這樣,那使用官方建議的流程 :
following Docker official documentation
當你要啟一個 docker container 時,建議設置非特權 ( unprivileged user ) 使用者。
在不設置的情況下,預設應該都是root
帳號 ( 可以用 whoami 指令來看 ),這樣就代表 hacker 一進到 container 中就是最高權限,然後設定使用者可以避免這件事 ( privilege escalation attacks ),雖然privilege escalation attacks
是指 hacker 嘗試升級權限,但這個地方應該和送頭沒兩樣。
它後這裡有三種方法 :
首先第一種是直接 docker run 執行時代入-u
然後下面範例的 4000 為使用者的 UID。
docker run -u 4000 alpine
第二種,就是改在 dockerfile 中。
FROM alpine
RUN groupadd -r myuser && useradd -r -g myuser myuser
<HERE DO WHAT YOU HAVE TO DO AS A ROOT USER LIKE INSTALLING PACKAGES ETC.>
USER myuser
第三種,是在 docker daemon 上開啟 user namespace support,其中 dockerd 就是指 docker daemon。
dockerd --userns-remap="testuser:testuser"
然後如果是在 k8s 裡可以設在security context 中
。
https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
kind: ...
apiVersion: ...
metadata:
name: ...
spec:
...
containers:
- name: ...
image: ....
securityContext:
...
runAsNonRoot: true
Linux Kernel Capabilities( Linux Kernel 權限 )是一種機制,它主要的功能就是將 root 權限分解較小的單位,以提高系統的安全性。
一些常見的 linux kernel 的權限如下 :
CAP_NET_ADMIN: 管理網絡設置的權限。
CAP_SYS_ADMIN: 擁有一般的系統管理權限。
CAP_DAC_OVERRIDE: 覆蓋文件權限檢查。
CAP_DAC_READ_SEARCH: 閱讀或搜索任何文件,無論權限如何。
CAP_SETUID 和 CAP_SETGID: 設置進程的使用者ID和組ID。
在 docker 中你可以使用—cap-add
與—cap-drop
來進行設定。
docker run --cap-drop all --cap-add CHOWN alpine
不要用 --privileged,它的權限高到幾乎什麼都可以做
每一次在 run docker image 時都代--security-opt=no-new-privileges
為了防止escalate privileges attack
。
當你在運行 docker container 時,它的 process 可能會嘗議升級權限級別 ( 就 hacker ),以獲取更高的權限,然後用這個選擇就可以防止這件事。
在預設的情況下,container 與 container 就算沒有設—network
它是可以透過docker 9 bridged network
來進行行溝通,這裡就是建議關掉這個,有需要溝通的再用network
來設定。
然後我們可以使用—icc=false
來關掉。
docker run --icc=false your_image