企業運維實戰--最全Docker學習筆記5.Docker安全、容器資源控制、安全加固
- 一、Docker安全
- 二、Docker容器資源控制
- 1.記憶體限制
- 2.cpu限制
- 3.Block IO限制
- 三、Docker安全加固
一、Docker安全
Docker容器的安全性,很大程度上依賴于Linux系統自身,評估Docker的安全性時,主要考慮以下幾個方面:
- Linux內核的命名空間機制提供的容器隔離安全
- Linux控制組機制對容器資源的控制能力安全,
- Linux內核的能力機制所帶來的操作權限安全
- Docker程式(特別是服務端)本身的抗攻擊性,
- 其他安全增強機制對容器安全性的影響,
命名空間隔離的安全:
當docker run啟動一個容器時,Docker將在后臺為容器創建一個獨立的命名空間,命名空間提供了最基礎也最直接的隔離,與虛擬機方式相比,通過Linux namespace來實作的隔離不是那么徹底,在 Linux 內核中,有很多資源和物件是不能被 Namespace 化的,比如:時間,
控制組資源控制的安全:
-
當docker run啟動一個容器時,Docker將在后臺為容器創建一個獨立的控制組策略集合,
-
Linux Cgroups提供了很多有用的特性,確保各容器可以公平地分享主機的記憶體、CPU、磁盤IO等資源,
-
確保當發生在容器內的資源壓力不會影響到本地主機系統和其他容器,它在防止拒絕服務攻擊(DDoS)方面必不可少,
內核能力機制:
- 能力機制(Capability)是Linux內核一個強大的特性,可以提供細粒度的權限訪問控制,
- 大部分情況下,容器并不需要“真正的”root權限,容器只需要少數的能力即可,
- 默認情況下,Docker采用“白名單”機制,禁用“必需功能”之外的其他權限,
Docker服務端防護:
- 使用Docker容器的核心是Docker服務端,確保只有可信的用戶才能訪問到Docker服務,
- 將容器的root用戶映射到本地主機上的非root用戶,減輕容器和主機之間因權限提升而引起的安全問題,
- 允許Docker 服務端在非root權限下運行,利用安全可靠的子行程來代理執行需要特權權限的操作,這些子行程只允許在特定范圍內進行操作,
其他安全特性:
-
在內核中啟用GRSEC和PAX,這將增加更多的編譯和運行時的安全檢查;并且通過地址隨機化機制來避免惡意探測等,啟用該特性不需要Docker進行任何配置,
-
使用一些有增強安全特性的容器模板,
-
用戶可以自定義更加嚴格的訪問控制機制來定制安全策略,
-
在檔案系統掛載到容器內部時,可以通過配置只讀模式來避免容器內的應用通過檔案系統破壞外部環境,特別是一些系統運行狀態相關的目錄,
二、Docker容器資源控制
Linux Cgroups,全稱 Linux Control Group,是限制一個行程組能夠使用的資源上限,包括 CPU、記憶體、磁盤、網路帶寬等等,
對行程進行優先級設定、審計,以及將行程掛起和恢復等操作,
Linux cgroups以檔案和目錄的方式組織在作業系統的 /sys/fs/cgroup 路徑下,在 /sys/fs/cgroup 下面有很多諸如 cpuset、cpu、 memory 這樣的子目錄,也叫子系統,
1.記憶體限制
進入容器限制目錄,查看記憶體限制,與本機一致,是繼承本機的限制
容器限制目錄
cd /sys/fs/cgroup/memory/docker/

進入子行程目錄
cd 3fb95a0d13764c5c521071f8d8fa20f2e728aebb5f7db9fc99810f4dcf937e19
查看記憶體最大限制
cat memory.limit_in_bytes

進入上一條目錄,查看主機記憶體最大限制
cd ..
cat memory.limit_in_bytes

查看docker run用于記憶體限制的用法
docker run --help |grep mem
限制記憶體大小為200M拉起容器
docker run -m 200M -d --name demo nginx

進入容器行程目錄,查看限制檔案
cd ac48768ec187807975648dc9b3b076d2128f801008c2482faa8ddad327f406d0
可以看到檔案修改為200M
cat memory.limit_in_bytes

/dev/shm/是一個在記憶體中的目錄,在此目錄/dev/shm/中創建檔案會占用記憶體
cd /dev/shm/
free -m
dd if=/dev/zero of=bigfile bs=1M count=100
free -m

完成測驗后記得洗掉測驗檔案,避免長期占用記憶體
rm -f bigfile
創建新的專案x1的限制目錄,會自動繼承主機的限制檔案
cd /sys/fs/cgroup/memory/
mkdir x1

限制x1記憶體最大為200M
echo 209715200 > memory.limit_in_bytes
cat memory.limit_in_bytes

進入記憶體中的目錄/dev/shm/,安裝cgroup操作命令模塊
cd /dev/shm/
yum search cgroup
yum install -y libcgroup-tools.x86_64

cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=100
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300

300也可以的原因是啟用了swap磁區
洗掉測驗檔案,關閉swap磁區
rm -f bigfile
swapoff -a
無法使用大于200的記憶體,限制成功
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300

swap磁區別的應用也會用,無法關閉,所以需要限制記憶體和swap磁區共同的大小
swapon -a
swapon -s
rm -f bigfile

echo 209715200 > memory.memsw.limit_in_bytes

再次進入/dev/shm目錄中
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300

2.cpu限制
進入cpu限制目錄
cd /sys/fs/cgroup/cpu

創建新的專案x2
mkdir x2
cd x2

查看行程優先級,重新給定優先級,需要將行程加入tasks才生效
cat cpu.shares
echo 100 > cpu.shares
cat cpu.shares

創建兩個行程
dd if=/dev/zero of=/dev/null &
dd if=/dev/zero of=/dev/null &
top

將行程號寫入tasks
echo 28049 > tasks

top查看行程,發現還是100%使用cpu
top

這是因為虛擬機有兩個cpu,目前還沒有發生資源爭搶,關閉cpu1(注意cpu0是無法關閉的),單個cpu再次查看top
cd /sys/devices/system/cpu/cpu1/
cat online
echo 0 > online #輸入0則關閉cpu
top


關閉一個cpu后,一個行程為另個行程cpu使用率的10%左右,
重啟cpu
echo 1 > online
cat online


恢復行程優先級
cd /sys/fs/cgroup/cpu/x2/
echo 1024 > cpu.shares
top

顯示行程分配cpu,默認-1表示任意
cat cpu.cfs_quota_us
顯示行程cpu總配額
cat cpu.cfs_period_us

給定1/5的配額
echo 20000 > cpu.cfs_quota_us
cat cpu.cfs_quota_us

查看top
top

可以看到 一個行程是另一行程的1/5
測驗結束關閉后臺行程
fg 打開后臺的行程,ctrl+c 結束行程

3.Block IO限制
--device-write-bps限制寫設備的bps

拉起容器,限制IO速率為30M
docker run -it --rm --device-write-bps /dev/vda:30MB rhel7 bash
direct IO 不使用檔案快取
dd if=/dev/zero of=bigfile bs=1M count=300 oflag=direct
dd if=/dev/zero of=bigfile bs=1M count=300

三、Docker安全加固
lxcfs增強容器隔離性和資源可見性
安裝并開啟服務,查看行程
yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
lxcfs /var/lib/lxcfs &
ps ax



利用lxcfs增強docker容器隔離性和資源可見性
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 ubuntu

沒有ubuntu鏡像可以直接拉取

容器內可以只管看到,記憶體被限制

有的時候我們需要容器具備更多的權限,比如操作內核模塊,控制swap交換磁區,掛載USB磁盤,修改MAC地址等,
設定特權級運行的容器:--privileged=true
不加特權什么都干不了
docker run -it --rm busybox

加了特權什么都能干
docker run -it --rm --privileged=true busybox


–privileged=true權限過大,所以需要設定容器白名單來限制權限
capabilities手冊地址:
http://man7.org/linux/man-pages/man7/capabilities.7.html
docker run -it --rm --cap-add=NET_ADMIN busybox
只允許進行網路操作,fdisk -l不可以



轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290010.html
標籤:其他
