文章目录
1.通过lxcfs增强docker容器的隔离性和资源可见性
docker run -it --name vm1 -m 256M ubuntu
创建一个容器并指定可用内存为256M
root@e53bceea7a86:/# free -m ##发现看到的并不是256M
yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm 安装lxcfs
lxcfs /var/lib/lxcfs &
运行,/var/lib/lxcfs是lxcfs默认数据目录
cd /var/lib/lxcfs
ls
cgroup是资源限制,proc是系统信息
cd proc
ls
docker run -it --name vm2 -m 256M \ ##创建容器,把相应的内容挂载到容器内
>-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo \
>-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats \
>-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo \
>-v /var/lib/lxcfs/proc/stat:/proc/stat \
>-v /var/lib/lxcfs/proc/swaps:/proc/swaps \
>-v /var/lib/lxcfs/proc/uptime:/proc/uptime \
>ubuntu
2.设置特权级运行的容器 --privileged=true
有时候我们需要容器具备更多权限,比如操作内核模块,控制swap分区,修改MAC地址等。
docker run --help | grep priv
#查看权限参数 --privileged,默认这个权限是被禁掉的
docker run -it --name vm3 --privileged=true ubuntu
成功添加
root@3e9320090d5f:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@3e9320090d5f:/# ip addr add 172.17.0.5/24 dev eth0
root@3e9320090d5f:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 172.17.0.5/24 scope global eth0
默认情况下这个权限比较大,基本上接近宿主机的权限,为了防止用户的权限滥用,需要增加安全机制,只提供给容器必要的权限
3.设置容器白名单:–cap-add
capability权限查询可参考link
docker run -it --name vm4 --cap-add=NET_ADMIN ubuntu
可以控制网络,但其他不行
root@4c24e856a67e:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
root@4c24e856a67e:/# ip addr add 172.17.0.6/24 dev eth0
root@4c24e856a67e:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 172.17.0.6/24 scope global eth0
docker inspect vm4 | grep Pri
特权关闭 “Privileged”:false,
docker inspect vm4 | grep Cap
看不全
docker inspect vm4 | less
docker inspect -f {{.HostConfig.Privileged}} vm4
查看指定字段的值,为false
docker inspect -f {{.HostConfig.CapAdd}} vm4
4.安全加固思路
4.1 保证镜像安全
使用安全的基础镜像;
删除镜像中的setuid和setgid权限(suid、sgid);
启用docker内容信任(证书认证);
最小安装原则;
对镜像进行安全漏洞扫描,镜像安全扫描 器(Clair);
容器使用非root运行
4.2 保证容器安全
对docker主机进行安全加固;
限制容器之间的网络流量(某个容器流量升高, 会对其他容器或主机有影响);
配置docker守护程序的TLS身份验证;
启用用户命名空间支持(userns-remap参数,在容器第一次启动前就要加上,写在/etc/docker/daemon.json文 件里,还需要对docker数据目录做权限配置 /var/lib/docker);
限制容器内存使用量;
适当设置容器CPU优先级,/sys/fs/cgroup/cpu/cpu.shares这个文件里设置
4.3 docker安全遗留问题
默认情况下只有6个namespace命名空间,很多主要的内核子系统是没有命名空间的,如SELinux, Cgroup,/sys下的文件系统,/proc/sys,/proc/sysrq-trigger等
docker inspect vm4 | grep Pid
cd /proc/Pid/ns
ls
设备没有命名空间:/dev/mem(进程和物理地址的映射),/dev/sd*文件系统设备,内核模块等