文章目錄
- Docker服務安全加強
-
- 1、使用強制通路控制政策
- 2、配置嚴格的網絡通路控制政策
- 3、不要使用root使用者運作docker應用程式
- 4、禁止使用特權
- 5、控制Docker容器資源配額
- 6、控制CPU核心
- 7、混合使用CPU配額控制參數
- 8、控制記憶體配額
- 9、不要運作不可信的Docker鏡像
- 10、開啟日志記錄功能
- 11、定期安全掃描和更新更新檔
Docker服務安全加強
1、使用強制通路控制政策
啟用強制通路控制(Mandatory Access Control (MAC)),根據業務場景的具體分析,對Docker中使用的各種資源設定通路控制。
啟用AppAamor功能:
docker run --interactive --tty --security-opt="apparmor:PROFILENAME" centos
/bin/bash
啟用SElinux功能:
docker daemon --selinux-enabled
2、配置嚴格的網絡通路控制政策
根據實際應用,對需要外網通路的端口(例如管理界面、API 2375端口等重要端口)、需要與外網互動的網絡位址、端口、協定等進行梳理,使用iptables或ECS安全組政策對網絡的出入設定嚴格的通路控制。
3、不要使用root使用者運作docker應用程式
在軟體使用中,有一些必須由root使用者才能夠進行的操作。但從安全角度,您需要将這一部分操作與僅使用普通使用者權限即可執行的操作分離解耦。
在編寫dockerfile時,您可以使用類似如下的指令建立一個普通權限使用者,并設定建立的UID為以後運作程式的使用者:
RUN useradd noroot -u 1000 -s /bin/bash --no-create-home
USER noroot
RUN Application_name
4、禁止使用特權
預設情況下,Docker容器是沒有特權的,一個容器不允許通路任何裝置;但當使用–privileged選項時,則該容器将能通路所有裝置。
例如,當打開--privileged選項後,您就可以對Host中/dev/下的所有裝置進行操作。但如果不是必須對host上的所有裝置進行通路的話,您可以使用--device僅添加需要操作的裝置。
5、控制Docker容器資源配額
控制CPU份額
1、Docker提供–cpu-shares參數,用于在建立容器時指定容器所使用的CPU份額值。
使用示例: 當使用指令`docker run -tid –cpu-shares 100 ubuntu:stress`建立容器時,則最終生成的cgroup的CPU份額配置可以下面的檔案中找到。
[email protected]:~# cat /sys/fs/cgroup/cpu/docker/<容器的完整長ID>/cpu.shares
100
cpu-shares的值不能保證可以獲得1個vcpu或者多少GHz的CPU資源,僅僅隻是一個彈性的權重值。
2、Docker提供了–cpu-period、–cpu-quota兩個參數,用來控制容器可以配置設定到的CPU時鐘周期。
–cpu-period用來指定容器對CPU的使用要在多長時間内做一次重新配置設定,而–cpu-quota是用來指定在這個周期内,最多可以有多少時間用來運作這個容器。與–cpu-shares不同的是,這種配置是指定一個絕對值,而且沒有彈性在裡面,容器對CPU資源的使用絕對不會超過配置的值。
cpu-period和cpu-quota的機關為微秒(μs)。cpu-period的最小值為1000微秒,最大值為1秒(10^6 μs),預設值為0.1秒(100000 μs)。cpu-quota的值預設為-1,表示不做控制。
舉例說明,如果容器程序需要每1秒使用單個CPU的0.2秒時間,可以将cpu-period設定為1000000(即1秒),cpu-quota設定為200000(0.2秒)。當然,在多核情況下,如果允許容器程序需要完全占用兩個CPU,則可以将cpu-period設定為100000(即0.1秒),cpu-quota設定為200000(0.2秒)。
使用示例:使用如下指令來建立容器docker run -tid –cpu-period 100000 –cpu-quota 200000 ubuntu。
6、控制CPU核心
對于多核CPU的伺服器,使用
–cpuset-cpus和–cpuset-mems
參數,可以限定容器運作使用哪些CPU核心和記憶體節點。
該功能可以對需要高性能計算的容器進行性能最優的配置,對具有NUMA拓撲(具有多CPU、多記憶體節點)的伺服器尤其有用。而如果伺服器隻有一個記憶體節點,則–cpuset-mems的配置基本上不會有明顯效果。
使用示例:使用指令docker run -tid –name cpu1 –cpuset-cpus 0-2 ubuntu,表示建立的容器隻能用0、1、2這三個核心。
7、混合使用CPU配額控制參數
在上述參數中,cpu-shares控制隻用在容器競争同一個核心的時間片時。如果通過cpuset-cpus指定容器A使用核心0,容器B隻使用核心1,則在主機上隻有這兩個容器使用對應核心的情況,它們各自占用全部的核心資源,cpu-shares沒有明顯效果。
cpu-period
、
cpu-quota
這兩個參數一般聯合使用。在單核或者通過cpuset-cpus強制容器使用一個CPU核心的情況下,即使
cpu-quota
超過
cpu-period
,也不會使容器使用更多的CPU資源。
cpuset-cpus
、
cpuset-mems
隻對多核、多記憶體節點上的伺服器有效,并且必須與實際的實體配置比對,否則也無法達到資源控制的目的。
8、控制記憶體配額
和CPU控制一樣,Docker也提供了若幹參數來控制容器的記憶體使用配額,可以控制容器的swap大小、可用記憶體大小等。主要有以下參數:
①memory-swappiness:控制程序将實體記憶體交換到swap分區的傾向,預設系數為60。系數越小,就越傾向于使用實體記憶體。取值範圍為0-100。當值為100時,表示盡量使用swap分區;當值為0時,表示禁用容器swap功能。這點不同于主控端,主控端swappiness設定為0時,也不會禁用swap。
②–kernel-memory:核心記憶體,不會被交換到swap上。一般情況下,不建議修改,可以直接參考Docker的官方文檔。
③–memory:設定容器使用的最大記憶體上限。預設機關為byte,可以使用K、G、M等帶機關的字元串。
④–memory-reservation:啟用彈性的記憶體共享。當主控端資源充足時,允許容器盡量多地使用記憶體,當檢測到記憶體競争或者低記憶體時,強制将容器的記憶體降低到memory-reservation所指定的記憶體大小。不設定此選項時,有可能出現某些容器長時間占用大量記憶體,帶來性能上的損失。
⑤–memory-swap:等于記憶體和swap分區大小的總和。設定為-1時,表示swap分區的大小是無限的。預設機關為byte,可以使用K、G、M等帶機關的字元串。如果–memory-swap的設定值小于–memory的值,則使用預設值,為–memory-swap值的兩倍。
9、不要運作不可信的Docker鏡像
不要運作不可信的Docker鏡像作為網際網路伺服器,避免運作不完全了解的Docker鏡像作為網際網路伺服器。
10、開啟日志記錄功能
Docker的日志可以分成兩類,一類是stdout标準輸出,另一類是檔案日志。Dockerd支援的日志級别有debug、info、warn、error、fatal,預設的日志級别為info。
必要的情況下,您需要設定日志級别,這可以通過配置檔案,或者啟動參數-l或–log-level來完成。
方法一:修改配置檔案/etc/docker/daemon.json。
{
"log-level": "debug"
}
方法二:使用docker run的時候指定
--log-driver=syslog --log-opt syslog-facility=daemon
。
11、定期安全掃描和更新更新檔
在生産環境中使用漏洞掃描工具可以檢測鏡像中的已知漏洞。
容器通常都不是從頭開始建構的,是以一定要進行安全掃描,以便及時發現基礎鏡像中任何可能存在的漏洞,并及時更新更新檔。
在應用程式傳遞生命周期中加入漏洞掃描的安全品質控制,防止部署易受攻擊的容器。
通過采用以上積極的防範措施,即在整個容器的生命周期中建立和實施安全政策,可以有效地保證一個內建容器環境的安全性。
參考連結:
https://help.aliyun.com/knowledge_detail/60789.html?spm=a2c4g.11186623.2.2.1a201bebrSaPE8