Docker安全
一、理解Docker安全
Docker容器的安全性,很大程度上依賴于Linux系統(tǒng)自身,評(píng)估Docker的安全性時(shí),主要考慮以下幾個(gè)方面:
- Linux內(nèi)核的命名空間機(jī)制提供的容器隔離安全
- Linux控制組機(jī)制對(duì)容器資源的控制能力安全。
- Linux內(nèi)核的能力機(jī)制所帶來的操作權(quán)限安全
- Docker程序(特別是服務(wù)端)本身的抗攻擊性。
- 其他安全增強(qiáng)機(jī)制對(duì)容器安全性的影響。
1.命名空間隔離的安全
- 當(dāng)docker run啟動(dòng)一個(gè)容器時(shí),Docker將在后臺(tái)為容器創(chuàng)建一個(gè)獨(dú)立的命名空間。命名空間提供了最基礎(chǔ)也最直接的隔離。
- 與虛擬機(jī)方式相比,通過Linux namespace來實(shí)現(xiàn)的隔離不是那么徹底。
- 容器只是運(yùn)行在宿主機(jī)上的一種特殊的進(jìn)程,那么多個(gè)容器之間使用的就還是同一個(gè)宿主機(jī)的操作系統(tǒng)內(nèi)核。
- 在 Linux 內(nèi)核中,有很多資源和對(duì)象是不能被 Namespace 化的,比如:時(shí)間。
2.控制組資源控制的安全
- 當(dāng)docker run啟動(dòng)一個(gè)容器時(shí),Docker將在后臺(tái)為容器創(chuàng)建一個(gè)獨(dú)立的控制組策略集合。
- Linux Cgroups提供了很多有用的特性,確保各容器可以公平地分享主機(jī)的內(nèi)存、CPU、磁盤IO等資源。
- 確保當(dāng)發(fā)生在容器內(nèi)的資源壓力不會(huì)影響到本地主機(jī)系統(tǒng)和其他容器,它在防止拒絕服務(wù)攻擊(DDoS)方面必不可少。
3.內(nèi)核能力機(jī)制
- 能力機(jī)制(Capability)是Linux內(nèi)核一個(gè)強(qiáng)大的特性,可以提供細(xì)粒度的權(quán)限訪問控制。
- 大部分情況下,容器并不需要“真正的”root權(quán)限,容器只需要少數(shù)的能力即可。
- 默認(rèn)情況下,Docker采用“白名單”機(jī)制,禁用“必需功能”之外的其他權(quán)限。
4.Docker服務(wù)端防護(hù)
- 使用Docker容器的核心是Docker服務(wù)端,確保只有可信的用戶才能訪問到Docker服務(wù)。
- 將容器的root用戶映射到本地主機(jī)上的非root用戶,減輕容器和主機(jī)之間因權(quán)限提升而引起的安全問題。
- 允許Docker 服務(wù)端在非root權(quán)限下運(yùn)行,利用安全可靠的子進(jìn)程來代理執(zhí)行需要特權(quán)權(quán)限的操作。這些子進(jìn)程只允許在特定范圍內(nèi)進(jìn)行操作。
5.其他安全特性
- 在內(nèi)核中啟用GRSEC和PAX,這將增加更多的編譯和運(yùn)行時(shí)的安全檢查;并且通過地址隨機(jī)化機(jī)制來避免惡意探測(cè)等。啟用該特性不需要Docker進(jìn)行任何配置。
- 使用一些有增強(qiáng)安全特性的容器模板。
- 用戶可以自定義更加嚴(yán)格的訪問控制機(jī)制來定制安全策略。
- 在文件系統(tǒng)掛載到容器內(nèi)部時(shí),可以通過配置只讀模式來避免容器內(nèi)的應(yīng)用通過文件系統(tǒng)破壞外部環(huán)境,特別是一些系統(tǒng)運(yùn)行狀態(tài)相關(guān)的目錄。
二、容器資源控制
Linux Cgroups 的全稱是 Linux Control Group。
是限制一個(gè)進(jìn)程組能夠使用的資源上限,包括 CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)帶寬等等。
對(duì)進(jìn)程進(jìn)行優(yōu)先級(jí)設(shè)置、審計(jì),以及將進(jìn)程掛起和恢復(fù)等操作。
Linux Cgroups 給用戶暴露出來的操作接口是文件系統(tǒng)。
它以文件和目錄的方式組織在操作系統(tǒng)的 /sys/fs/cgroup 路徑下。
執(zhí)行此命令查看:mount -t cgroup
在 /sys/fs/cgroup 下面有很多諸如 cpuset、cpu、 memory 這樣的子目錄,也叫子系統(tǒng)。
在每個(gè)子系統(tǒng)下面,為每個(gè)容器創(chuàng)建一個(gè)控制組(即創(chuàng)建一個(gè)新目錄)。
控制組下面的資源文件里填上什么值,就靠用戶執(zhí)行 docker run 時(shí)的參數(shù)指定。
1.CPU限額
cpu_period 和 cpu_quota 這兩個(gè)參數(shù)需要組合使用,用來限制進(jìn)程在長度為 cpu_period 的一段時(shí)間內(nèi),只能被分配到總量為 cpu_quota 的 CPU 時(shí)間,以下設(shè)置表示20%的cpu時(shí)間。
[root@server2 ~]# docker run -it --rm --cpu-quota 20000 ubuntu root@b42d93b2364b:/# dd if=/dev/zero of=/dev/null &我們可以再重新開一個(gè)終端,使用top查看一下cpu占用率是不是百分之二十
測(cè)試兩個(gè)cpu的爭(zhēng)搶問題,如果你是兩個(gè)cpu的話首先先關(guān)掉一個(gè)cpu
echo 0 > /sys/devices/system/cpu/cpu1/online
我們看到兩個(gè)dd進(jìn)程cpu占用個(gè)百分之五十
退出剛才第二次啟用的交互,下面我們可以加一個(gè)限制cpu的參數(shù),重新進(jìn)去,再次查看top中cpu占用情況
2.內(nèi)存限制
容器可用內(nèi)存包括兩個(gè)部分:物理內(nèi)存和swap交換分區(qū)。
docker run -it --memory 200M --memory-swap=200M ubuntu
–memory設(shè)置內(nèi)存使用限額
–memory-swap設(shè)置swap交換分區(qū)限額
3.Block IO限制
docker run -it --device-write-bps /dev/sda:30MB ubuntu
–device-write-bps限制寫設(shè)備的bps
目前的block IO限制只對(duì)direct IO有效。(不使用文件緩存)
三、docker安全加固
1.利用LXCFS增強(qiáng)docker容器隔離性和資源可見性
鏈接:LXCFS包提取碼: thc4
[root@server2 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y [root@server2 ~]# lxcfs /var/lib/lxcfs & ##運(yùn)行 [root@server2 lxcfs]# docker run -it -m 256m \ > -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \ > -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \ > -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \ > -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \ > -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \ > -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \ > ubuntu2.設(shè)置特權(quán)級(jí)運(yùn)行的容器
–privileged=true
有的時(shí)候我們需要容器具備更多的權(quán)限,比如操作內(nèi)核模塊,控制swap交換分區(qū),掛載USB磁盤,修改MAC地址等。
我們知道添加ip是超戶才能執(zhí)行的。
3.設(shè)置容器白名單
–cap-add
–privileged=true 的權(quán)限非常大,接近于宿主機(jī)的權(quán)限,為了防止用戶的濫用,需要增加限制,只提供給容器必須的權(quán)限。此時(shí)Docker 提供了權(quán)限白名單的機(jī)制,使用–cap-add添加必要的權(quán)限。
capabilities手冊(cè)地址:
http://man7.org/linux/man-pages/man7/capabilities.7.html
4.安全加固的思路
-
保證鏡像的安全
- 使用安全的基礎(chǔ)鏡像
- 刪除鏡像中的setuid和setgid權(quán)限
- 啟用Docker的內(nèi)容信任
- 最小安裝原則
- 對(duì)鏡像進(jìn)行安全漏洞掃描,鏡像安全掃描器:Clair
- 容器使用非root用戶運(yùn)行
-
保證容器的安全
- 對(duì)docker宿主機(jī)進(jìn)行安全加固
- 限制容器之間的網(wǎng)絡(luò)流量
- 配置Docker守護(hù)程序的TLS身份驗(yàn)證
- 啟用用戶命名空間支持(userns-remap)
- 限制容器的內(nèi)存使用量
- 適當(dāng)設(shè)置容器CPU優(yōu)先級(jí)
5.docker安全的遺留問題
主要的內(nèi)核子系統(tǒng)都沒有命名空間,如:
- SELinux
- cgroup
- 在/sys下的文件系統(tǒng)
- /proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
設(shè)備沒有命名空間:
- /dev/mem
- /dev/sd*文件系統(tǒng)設(shè)備
- 內(nèi)核模塊
如果你能溝通或攻擊的其中之一作為特權(quán)的過程中,你可以擁有自己的系統(tǒng)。
6.總結(jié)
本章節(jié)講解了docker的安全現(xiàn)狀,雖然還是有很多沒有完善的地方,但不能否認(rèn)docker依然是當(dāng)前最安全的容器技術(shù)。
Docker安全的頂尖開源工具:
- Docker Bench for Security 對(duì)照安全基準(zhǔn)審計(jì)Docker容器的腳本
- Clair API驅(qū)動(dòng)的靜態(tài)容器安全分析工具,擁有龐大的CVE數(shù)據(jù)庫
- Cilium 內(nèi)核層可感知API的網(wǎng)絡(luò)和安全工具
- Anchore 使用CVE數(shù)據(jù)和用戶定義的策略檢查容器安全的工具
- OpenSCAP Workbench 用于為各種平臺(tái)創(chuàng)建和維護(hù)安全策略的環(huán)境
- Dagda 用于在Docker容器中掃描漏洞、特洛伊木馬、病毒和惡意軟件的工具
- Notary 使用服務(wù)器加強(qiáng)容器安全的框架,用于以加密方式委派責(zé)任
- Sysdig Falco 提供了行為活動(dòng)監(jiān)控,可深入了解容器
總結(jié)
- 上一篇: Docker仓库搭建
- 下一篇: Docker 三剑客