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