2017-04-18 86 views
1

我在一個Docker容器中運行Nginx,爲了安全起見,我想盡可能多地釋放Linux能力。我可以在Docker Nginx容器中放置哪些功能?

然後我可以放棄哪些功能?

的圖像是類似於標準多克爾Nginx的高山圖像的位置:https://github.com/nginxinc/docker-nginx/blob/0c7611139f2ce7c5a6b1febbfd5b436c8c7d2d53/mainline/alpine/Dockerfile,其開始Nginx的作爲根,然後運行工作進程作爲用戶的nginx',看:

[email protected]:/opt/ed# docker-compose exec web bash 
bash-4.3# # Now we're inside the container. 
bash-4.3# ps aux 
PID USER  TIME COMMAND 
    1 root  0:00 /bin/sh -c /etc/nginx/run-envsubst.sh && nginx 
    10 root  0:00 nginx: master process nginx 
    11 nginx  0:00 nginx: worker process 
    12 nginx  0:00 nginx: cache manager process 
    14 root  0:00 bash 
    18 root  0:00 ps aux 

偵聽端口80和443,使用Docker-Compose的'volume:....'指令裝載一些目錄。

顯然,這些都是能力泊塢贈款默認容器:

s.Process.Capabilities = []string{ 
    "CAP_CHOWN", 
    "CAP_DAC_OVERRIDE", 
    "CAP_FSETID", 
    "CAP_FOWNER", 
    "CAP_MKNOD", 
    "CAP_NET_RAW", 
    "CAP_SETGID", 
    "CAP_SETUID", 
    "CAP_SETFCAP", 
    "CAP_SETPCAP", 
    "CAP_NET_BIND_SERVICE", 
    "CAP_SYS_CHROOT", 
    "CAP_KILL", 
    "CAP_AUDIT_WRITE", 
} 

從這裏:https://github.com/docker/docker/blob/master/oci/defaults_linux.go#L62-L77

,我發現這裏鏈接:https://docs.docker.com/engine/security/security/#linux-kernel-capabilities,該網頁說:「默認情況下, Docker會刪除除「」之外的所有功能,這可能意味着不需要刪除任何功能? ...

...但是有this Red Hat blog post關於丟失這些功能的丟失 - 所以似乎(一些)默認功能是不需要的。不知道該相信什麼,而且我想知道是否人們知道哪些功能可以(應該)被丟棄。我可能會測試自己,但即使我測試了一個功能,並且幾個小時或幾天似乎都可以正常工作 - 我可能仍然放棄了錯誤的功能?可能會出現問題,甚至更晚?喜歡更安全都問,這裏&測試自己,而不是隻測試自己)

(我很驚訝這還沒有已經回答了其他地方?難道沒有多少人在使用泊塢窗Nginx的,因而想要降低功能?)

+0

我覺得你回答了你自己的問題。您確定了所需的功能,現在只需指定允許這些功能就可以放棄其他功能。 –

+0

@MattSchuchard我不關注 - 我不認爲我確定了Nginx容器需要的功能?上面的列表是Docker默認授予任何容器的功能。其中一些是需要的,我會想,但也許不是全部。我想知道列表中的哪些功能不需要,可以放棄。 (我更新了這個問題,以澄清這個列表是Docker默認授予任何容器的功能。) – KajMagnus

+0

哦,我得到seccomp與功能混淆。好的,你可以做的是運行你的容器並使用'pscap'和'filecap'來查看你的容器需要什麼功能。使用'captest'來測試它們。然後,使用'--cap-drop ALL --cap-add foo'刪除所需的所有功能。點擊這裏查看更多信息https://github.com/docker/labs/tree/master/security/capabilities。讓我知道這是怎麼回事。 –

回答

1

我想知道同樣的事情,所以我做了一些研究。被警告這不是專家的答案。

簡短回答:如果您以用戶身份啓動nginx並使用非特權端口(> 1024),則可以放棄所有權限。這在Nginx in Docker without Root中有描述,其他一些信息可以在Running Nginx as non root user中找到。

ajhaydock/nginx nginx圖像特別推薦--cop-drop=ALL(雖然我不會推薦使用這個圖像,因爲它目前相當大:700MB)。

較長的答案:所需的特權可能會有所不同,具體取決於您的配置以及是否要以root身份啓動nginx。

讓我們從官方的docker鏡像及其默認配置開始吧。最小的功能如下:

docker pull nginx:alpine 
docker run -p 8080:80 --cap-drop=all \ 
    --cap-add=chown --cap-add=dac_override \ 
    --cap-add=setgid --cap-add=setuid \ 
    --cap-add=net_bind_service \ 
    nginx:alpine 

您可以檢查這些命令,你將在本地擁有歡迎頁面上的8080端口,如果你刪除任何的功能在啓動過程中崩潰。(請注意,根據Secure Your Containers with this One Weird Trick,需要dac_override意味着他們很可能做錯了..)

顯然,net_bind_service只需要如果特權端口上偵聽像80和443,由於我們是免費爲需要重定向,它可以通過簡單地傾聽更高的端口來降低:

docker cp nginx:/etc/nginx/conf.d/default.conf . 
sed -i 's/listen\s*80;/listen 8080;/' default.conf 
docker rm nginx 
docker run -p 8080:8080 --cap-drop=all \ 
    --cap-add=chown --cap-add=dac_override \ 
    --cap-add=setgid --cap-add=setuid \ 
    -v $(pwd)/default.conf:/etc/nginx/conf.d/default.conf \ 
    nginx:alpine 

仍然有效。

其他權限也可以通過以非root用戶身份運行nginx來刪除。在這種情況下,您不能使用user nginx;指令,而是在Dockerfile中使用USER nginx。這也會阻止您使用特權端口。

更多資源,可能是幫助他人:

相關問題