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
设置白名单