docker安全特性(使用cgroup机制实现对容器资源的管理)

 

docker和虚拟机相比较而言,安全性上还是差一节,因为docker是依赖于宿主机内核的,无法真正的实现隔离,只能通过各种方式实现尽可能的安全隔离,docker利用Namespace实现了部分隔离,还有一些东西是无法隔离的,例如:/proc,/sys,/dev/sd*等目录未完全隔离,SElinux,time,syslog等所有namespace之外的信息都未隔离,

 

1、dcoker的安全评估要点

1、Linux内核的命名空间机制提供的容器隔离安全:
    namespace只能提供基础的简单隔离,而容器本身只是运行在宿主机上的一个特殊的进程,很多资源,对象是不能被私有占用的,只能共享。
2、Linux控制组机制对容器资源的控制能力安全:
    当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器
3、Linux内核的能力机制所带来的操作权限安全
    能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。
4、Docker程序(特别是服务端)本身的抗攻击性。
    能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。
5、其他安全增强机制对容器安全性的影响。
    在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置
6、使用一些有增强安全特性的容器模板
    用户可以自定义更加严格的访问控制机制来定制安全策略。在文件系统挂载到容器内部时,可以通过配置只读模式来避免容器内的应用通过文件系统破坏外部环境,特别是一些系统运行状态相关的目录。

2、容器的资源控制(使用linux提供的cgroups机制)

cgroups:Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制,Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段。

作用:

限制进程组可以使用的资源数量(Resource limiting )
进程组的优先级控制(Prioritization )
记录进程组使用的资源数量(Accounting )
进程组隔离(Isolation)
进程组控制(Control)
cd /sys/fs/cgroup	资源控制集和
mount -t cgroup
    	cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
	cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
	cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
	cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
	cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
	cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
	cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
	cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
	cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
	cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
	cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)

1)、cpu控制

    cd /sys/fs/cgroup/cpu 	不能直接对父级文件进行操作,会报错
    cat cpu.cfs_quota_us	查看cpu使用配额,-1代表不限制配额
    mkdir x1
    cd x1	x1下边会有内容,复制父级内容
	echo 20000 > cpu.cfs_quota_us	修改配额
	dd if=/dev/zero of=/dev/null &	会得到一个pid
	echo pid > tasks
	top		查看cpu使用情况
    容器cpu配额控制
	docker run --help | grep cpu
	docker run -it --name vm1 --cpu-quota 20000 ubuntu
	dd if=/dev/zero of=/dev/null &	
	top	查看容器cpu使用情况

2)、内存控制

 cd /sys/fs/cgroup/memory
    free -m	查看内存
    df
	Filesystem 1K-blocks    Used Available Use% Mounted on
	   tmpfs    508264       0    508264    0%  /dev/shm    
    mkdir x2
	cat memory.limit_in_bytes	内存上限9223372036854771712,内存不够,可以使用swap
	cat memory.memsw.limit_in_bytes 内存和swap交换分区共同大小
        echo 209715200 > memory.limit_in_bytes            限制内存大小为200M
        echo 209715200 > memory.memsw.limit_in_bytes      限制内存大小和swap交换分区总共200
测试:
    yum install libcgroup-tools.x86_64 -y
    cd /dev/shm
    cgexec -g memory:snow dd if=/dev/zero of=bigfile bs=1M count=100
        100+0 records in
        100+0 records out
        104857600 bytes (105 MB) copied, 0.030733 s, 3.4 GB/s
    free -m       内存少了100M
        total        used        free      shared  buff/cache                   available
        Mem:           1839         125        1299         116         414        1443
        Swap:           819           0         819		
    cgexec -g memory:snow dd if=/dev/zero of=bigfile bs=1M count=300 直接写入内存的数据大于200M时,进程会被强制杀死
        killed
 
容器内存控制:
    docker run -it --name vm1 --memory 209715200 --memory-swap 209715200 ubuntu
    docker ps         查看当前容的id,再查看内存配额的时候会用到
    使用ctrl + p + q   进入后台,不退出
    cd /sys/fs/cgroup/memory/docker        进入新的容器中查看配额
    cd b1d8a47cd00354c4ee86ef2e80f12444d15569d3fa83fdff368c1633b783f32b/
    b1d8a47cd00354c4ee86ef2e80f12444d15569d3fa83fdff368c1633b783f32b]#
        cat memory.limit_in_bytes
        cat memory.memsw.limit_in_bytes

3)、block io读写控制

磁盘读写控制:
    bps		吞吐量/s
    iops	io操作/s
    blkio.throttle.read_bps_device      
    blkio.throttle.read_iops_device
    blkio.throttle.write_bps_device
    blkio.throttle.write_iops_device
容器磁盘读写控制参数
    --device-read-bps
    --device-read-iops
    --device-write-bps
    --device-write-iops
    限制容器的写入磁盘速度
    	docker run -it --name vm1 --device-read-bps /dev/vda:30M ubuntu	直
    	dd if=/dev/zero of=file bs=1M count=100 oflag=direct	直接写入磁盘

4)、容器状态控制

容器暂停
    /sys/fs/cgroup/freezer/docker 	容器状态
    cat freezer.state		容器状态
	THAWED		启用状态
	FROZEN		冻结状态
    docker run -it --name vm1 ubuntu	运行一个容器
    ctrl + p + q	后台运行
    docker ps -a
	CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
	d912f6b9af6a        ubuntu              "/bin/bash"         4 minutes ago       Up 4 minutes                           vm1
    ls		新生成的容器
	d912f6b9af6ade3191f247753e9f76662906592de0cb072bb08b9f93994f7e79
    cd d912f6b9af6ade3191f247753e9f76662906592de0cb072bb08b9f93994f7e79
    ls
	cgroup.clone_children  freezer.parent_freezing  notify_on_release
	cgroup.event_control   freezer.self_freezing    tasks
	cgroup.procs           freezer.state
	[root@westos d912f6b9af6ade3191f247753e9f76662906592de0cb072bb08b9f939    
	cat freezer.state	查看当前容器的状态
    docker container pause vm1	暂停容器
    docker ps -a
	CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
	d912f6b9af6a        ubuntu              "/bin/bash"         4 minutes ago       Up 4 minutes (Paused)                       vm1
容器启用
    docker container unpause vm1	解冻容器
    也可以直接修改freezer.state,但是容器不识别,进程解冻,容器还是冻结状态
    docker ps -a
	CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
	d912f6b9af6a        ubuntu              "/bin/bash"         9 minutes ago       Up 9 minutes                            vm1
    cat freezer.state
	THAWED

3、容器安全加固

利用LXCFS增强docker容器的隔离性和资源可见性

    yum install -y lxcfs 
    lxcfs /var/lib/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\
	ubuntu

设置容器运行特级权限

docker run -it --name vm1 --privileged=true ubuntu bash

    ip link eth0 address MAC地址,如果没有特别权限,执行不了这样的操作
    ip addr show

设置白名单

docker安全特性(使用cgroup机制实现对容器资源的管理)_第1张图片

docker安全特性(使用cgroup机制实现对容器资源的管理)_第2张图片

 

docker安全特性(使用cgroup机制实现对容器资源的管理)_第3张图片

docker安全特性(使用cgroup机制实现对容器资源的管理)_第4张图片

docker安全特性(使用cgroup机制实现对容器资源的管理)_第5张图片

 

你可能感兴趣的:(web)