Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)

一.安全加固

  • 安全加固的思路
    保证镜像的安全
    1.使用安全的基础镜像
    2.删除镜像中的setuid和setgid权限
    3.启用Docker的内容信任
    4.最小安装原则
    5.对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
    6.容器使用非root用户运行
  • 保证容器的安全
    1.对docker宿主机进行安全加固
    2.限制容器之间的网络流量
    3.配置Docker守护程序的TLS身份验证
    4.启用用户命名空间支持
    5.限制容器的内存使用量
    6.适当设置容器CPU优先级
  • Docker安全遗留问题
  • 主要的内核子系统都没有命名空间,如:SELinux,cgroup,在/sys下的文件系统,/proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
    设备没有命名空间:/dev/mem,/dev/sd*文件系统设备,内核模块

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

  • Linux利用Cgroup实现了对容器的资源限制,但在容器内部依然缺省挂载了宿主机上的procfs的/proc目录,其包含如:meminfo, cpuinfo,stat, uptime等资源信息。一些监控工具如free/top或遗留应用还依赖上述文件内容获取资源配置和使用情况。当它们在容器中运行时,就会把宿主机的资源状态读取出来,引起错误和不便。社区中常见的做法是利用 lxcfs来提供容器中的资源可见性。lxcfs 是一个开源的FUSE(用户态文件系统)实现来支持LXC容器,它也可以支持Docker容器。
  • 如果默认建立容器,那么容器中看到的内存信息是主机的,这是不合理的,但是在主机中,我们又控制了资源,可是却无法显示,本实验要做的是在容器中资源也将被限制,显示被限制后的资源
  • LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件。
    /proc/cpuinfo
    /proc/diskstats
    /proc/meminfo
    /proc/stat
    /proc/swaps
    /proc/

(一)容器中的内存信息和主机中的内存信息

运行一个容器并查看其内存信息,查看后退出,再次查看本机的内存信息,发现两者一样

[root@server1 ~]# docker run -it --name vm2 ubuntu
root@9496b43f76d2:/# free -m
root@9496b43f76d2:/# [root@server1 ~]# 
[root@server1 ~]# free -m

Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)_第1张图片
(二)启动lxcfs

1.安装lxcfs 的RPM包

[root@server1 ~]# ls
[root@server1 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y

Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)_第2张图片
2.启动lxcfs,注意在启动后按回车结束,千万不要用Crtl+c,因为Ctrl+c会将该进程杀死

[root@server1 ~]# cd /var/lib/lxcfs/
[root@server1 lxcfs]# ls
#按回车结束,千万不要用Crtl+c,因为Ctrl+c会将该进程杀死。
[root@server1 lxcfs]# lxcfs /var/lib/lxcfs/ &

Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)_第3张图片
3.启动lxcfs之后,会在/var/lib/lxcfs目录下生成两个目录

[root@server1 lxcfs]# cd /var/lib/lxcfs/
[root@server1 lxcfs]# ls

在这里插入图片描述
注意:
如果在/var/lib/lxcfs目录下启动的lxcfs,之后需要重新进入才可以看到新生成的目录

4.查看lvxfs的进程

[root@server1 lxcfs]# ps ax | grep lxcfs

在这里插入图片描述
(三)测试
我们将创建docker容器并限制内存,之后查看时发现总共的内存为256M,说明配置已经生效

[root@server1 ~]# docker run -it -m 300m \
> -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
root@fa32d61190d4:/# free -m

Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)_第4张图片

总结:
1.相当于把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到Docker容器的/proc/meminfo位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中读取正确的内存限制。从而使得应用获得正确的资源约束设定。
2.不能直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下,因为容器内的/proc目录下本身是有内容的,是系统的进程信息等等,如果直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下,会覆盖容器内/proc目录下的内容,而/proc目录下记录的是容器的进程信息等等内容,是不能被覆盖的,所以不能直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下。

三.设置特权级运行的容器

通常情况下,我们运行的容器都是以普通身份运行的,而且此时我们无法操作内核模块,控制swap分区,挂载usb磁盘,修改mac地址等,虽然在容器中显示的是超级用户,可是并不是真正的超级用户
(一)设置容器

1.运行一个容器,并尝试将eth0关闭

[root@server1 ~]# docker run -it --name vm1 ubuntu
#查看其ip以及网卡eth0的状态
root@385fb1c825c6:/# ip addr
#查看id,发现此时显示的是超级用户
root@385fb1c825c6:/# id
#down掉eth0,发现没有权限
root@385fb1c825c6:/# ip link set down eth0

Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)_第5张图片
2.再次运行一个容器,给予此容器特权

[root@server1 ~]# docker run -it --name vm2 --privileged=true ubuntu

在这里插入图片描述
(二)测试

1.查看其容器的ip并将其网卡down掉,然后查看,发现此时网卡被down掉

root@d75b0de586d4:/# ip addr
root@d75b0de586d4:/# ip link set down eth0
root@d75b0de586d4:/# ip addr

Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)_第6张图片
2.再次将网卡提起,发现可以成功提起来

root@d75b0de586d4:/# ip link set up eth0
root@d75b0de586d4:/# ip addr

Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)_第7张图片
3.添加ip到网卡eth0中,发现可以成功添加

root@d75b0de586d4:/# ip addr add 172.25.0.3/24 dev eth0
root@d75b0de586d4:/# ip addr

Docker实验(十)Docker容器的安全加固(LXCFS,特权级运行容器)_第8张图片

补充:
设置容器白名单:–cap-add

  • –privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker 提供了权限白名单的机制,使用–cap-add添加必要的权限。
    #docker run -it --cap-add=NET_ADMIN --name vm1 ubuntu bash
    #docker inspect -f {{.HostConfig.Privileged}} vm1 false
    #docker inspect -f {{.HostConfig.CapAdd}} vm1 {[NET_ADMIN]}

你可能感兴趣的:(项目)