如何让SElinux和Docker并存

作为Redhat/Centos/Fedora 系的Linux特性之一,SElinux是一个相对简单易用安全管理工具。具体的细节我们这边就先不展开,简单的举个例子就是,假设现在某个网站的漏洞允许用户上传一个页面文件(比如php文件)到任意目录,如果有了SELinux的保护,不同的MAC权限保证了上传的文件依然无法被执行。

如果说这些年来我见识过的最不受人待见的安全特性,SELinux如果说自己是第二,没人敢说是第一。从早些年编译安装LAMP到最近的k8s啥的,能看到的所有网上文档提及到SELinux几乎都是一句冷冰冰的“通过setenforce 0关闭SELinux!”不知道SElinux的贡献者,知名缩写CIA的所有人究竟作何感想?

回到正题,Docker(或者说container技术)在系统安装部署上带来的革新可谓是天翻地覆的。volume作为Docker的一个功能项,它可以允许用户将一个宿主的路径挂装到container内部,极大的方便了数据的共享和维护。
不过很明显的,这种共享的方式本身就是一个存在安全隐患的设定,被SElinux block掉也是情理之中的。

[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# mkdir selinux_test
[root@localhost ~]# docker run -v /root/selinux_test/:/results –rm -it specjbb2015:quick bash
root@c5b3f22ffc4e:/# touch results/1
touch: cannot touch ‘results/1’: Permission denied

在开启SELinux的时候如果不做处理,挂装目录时container内部将无法对该目录进行操作。

检查/var/log/audit/audit.log,你会找到类似的一条异常。

type=ANOM_PROMISCUOUS msg=audit(1537458103.005:261166): dev=veth4c321de prom=256 old_prom=0 auid=4294967295 uid=0 gid=0 ses=4294967295
type=VIRT_CONTROL msg=audit(1537458103.262:261167): pid=1892 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:container_runtime_t:s0 msg=’reason=api op=resize user=root exe=bash hostname=c5b3f22ffc4e vm=specjbb2015:quick vm-pid=4736 auid=0 ctr_id_short=c5b3f22ffc4e exe=”/usr/bin/dockerd-current” hostname=? addr=? terminal=? res=success’

通过ls -Z命令可以得知共享的目录MAC权限是unconfined_u:object_r:admin_home_t:s0 ,而docker所需的MAC权限是system_u:object_r:container_file_t:s0。

这个时候你可以通过chcon 命令来修改MAC权限,方法和chmod命令如出一辙。

chcon -R system_u:object_r:container_file_t:s0 ~/selinux_test/
[root@localhost ~]# docker run -v /root/selinux_test/:/results –rm -it specjbb2015:quick bash
root@ed95ace8683b:/# touch results/12

搞定,其实docker官方还有一个更为简单的方式就是通过在volume的配置最后加:z,docker会在挂装之前完成目录的SELinux权限设定。

[root@localhost ~]# docker run -v /root/selinux_test/:/results:z –rm -it

吐槽下Centos下的docker版本混乱的情况:yum安装,docker官方源安装的CE, EE搞得及其复杂,而且依赖管辖,系统配置都是格格不入的,想要换个版本倒要搞半天!

推荐阅读:
自打从硬件方向研究性能优化起,
之前我们通过几个概念简单的介绍
这一段时间,凡是提及容器技术的

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据