Docker安全加固——利用LXCFS增强docker容器隔离性和资源可见性

前言

  • lxcfs是一个开源的FUSE(用户态文件系统)实现来支持LXC容器。
  • LXCFS通过用户态文件系统,在容器中提供下列 procfs 的文件:
    /proc/cpuinfo
    /proc/diskstats
    /proc/meminfo
    /proc/stat
    /proc/swaps
    /proc/uptime
  • 比如,把宿主机的 /var/lib/lxcfs/proc/memoinfo 文件挂载到Docker容器的/proc/meminfo位置后。容器中进程读取相应文件内容时,LXCFS的FUSE实现会从容器对应的Cgroup中 读取正确的内存限制。从而使得应用获得正确的资源约束设定

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

  • 在前面我们做过容器的资源控制,不过我们也要注意到当我们查看系统资源的时候发现出现的数据并不是我们设置的那样,这样明显是不合理的。
  • 1.安装LXCFS
[root@server2 ~]# ls
lxcfs-2.0.5-3.el7.centos.x86_64.rpm  nginx.tar  ubuntu.tar
[root@server2 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm -y
  • 2.启动lxcfs
[root@server2 ~]# cd /var/lib/lxcfs/
[root@server2 lxcfs]# ls
[root@server2 lxcfs]# lxcfs /var/lib/lxcfs/ &
[1] 2846
##启动lxcfs,但是注意按回车结束,不要使用ctrl+c,否则就直接结束lxcfs进程	
[root@server2 lxcfs]# hierarchies:
  0: fd:   5: cpuset
  1: fd:   6: cpuacct,cpu
  2: fd:   7: memory
  3: fd:   8: freezer
  4: fd:   9: perf_event
  5: fd:  10: devices
  6: fd:  11: pids
  7: fd:  12: hugetlb
  8: fd:  13: blkio
  9: fd:  14: net_prio,net_cls
 10: fd:  15: name=systemd

[root@server2 lxcfs]# ls
[root@server2 lxcfs]# cd
[root@server2 ~]# cd -
/var/lib/lxcfs
[root@server2 lxcfs]# ls
cgroup  proc

在这里插入图片描述

  • 使用ps ax 命令查看lxcfs进程
    在这里插入图片描述
  • 3.docker使用lxcfs的数据卷测试
[root@server2 lxcfs]# docker run -it --name vm1 -m 200m -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo -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@0f79f664edca:/# free -m

##可以看到我们的容器的内存大小是我们设置的那样

在这里插入图片描述

注意:

  • 不能直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下,因为容器内的/proc目录下本身是有内容的,是系统的进程信息等等,如果直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下,会覆盖容器内/proc目录下的内容,而/proc目录下记录的是容器的进程信息等等内容,是不能被覆盖的,所以不能直接把/var/lib/lxcfs/proc目录挂载到容器内的/proc目录下。

设置特权级运行的容器:- -privileged=true

  • 有的时候我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。
    我们建立容器后,进入容器的root帐号的权限是受限制的,不是真正的root用户。
    在这里插入图片描述
  • 加入–privileged=true参数,获得的是具有管理员权限的root用户。
[root@server2 lxcfs]# docker run -it --name vm2 --privileged=true ubuntu
root@db3ee4173dcb:/# id
uid=0(root) gid=0(root) groups=0(root)
root@db3ee4173dcb:/# ip link set down eth0
root@db3ee4173dcb:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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
8: eth0@if9: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

在这里插入图片描述

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

在这里插入图片描述

安全加固的思路

保证镜像的安全
  • 使用安全的基础镜像
  • 删除镜像中的setuid和setgid权限(强制位,粘制位)
  • 启用Docker的内容信任
  • 最小安装原则
  • 对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
  • 容器使用非root用户运行
保证容器的安全
  • 对docker宿主机进行安全加固
  • 限制容器之间的网络流量
  • 配置Docker守护程序的TLS身份验证
  • 启用用户命名空间支持(userns-remap)
  • 限制容器的内存使用量
  • 适当设置容器CPU优先级
docker安全的遗留问题
  • 主要的内核子系统都没有命名空间,如:
    SELinux
    cgroup
    在/sys下的文件系统
    /proc/sys, /proc/sysrq-trigger, /proc/irq, /proc/bus
  • 设备没有命名空间:
    /dev/mem
    /dev/sd*文件系统设备
    内核模块
    如果你能沟通或攻击的其中之一作为特权的过程中,你可以拥有自己的系统。

总结

本章节讲解了docker的安全现状,虽然还是有很多没有完善的地方,但不能否认docker依然是当前最安全的容器技术。

Docker安全的顶尖开源工具:
Docker Bench for Security	对照安全基准审计Docker容器的脚本
Clair		API驱动的静态容器安全分析工具,拥有庞大的CVE数据库
Cilium		内核层可感知API的网络和安全工具
Anchore		使用CVE数据和用户定义的策略检查容器安全的工具
OpenSCAP Workbench	用于为各种平台创建和维护安全策略的环境
Dagda	用于在Docker容器中扫描漏洞、特洛伊木马、病毒和恶意软件的工具
Notary	使用服务器加强容器安全的框架,用于以加密方式委派责任
Sysdig Falco	提供了行为活动监控,可深入了解容器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值