Docker默认设置可以保护主机容器内的进程访问资源,虽然Docker容器内的初始进程运行为root,但它具有的权限是非常有限的,这主要是通过使用以下几种主要的安全机制来实现的:
控制组(Cgroup)主要用来对资源进行限制、审计等,它主要提供以下功能:
通过docker run命令启动一个容器时,Docker通过linux相关的调用在后台为容器创建一个独立的策略组集合,该集合将用来限制容器内应用对资源的消耗
Cgroup对cpu资源控制的演示(--cpu-shares选项设置容器按比例共享CPU资源(弹性))
docker run -d --name='low_priority' --cpuset-cpus=0 --cpu-shares=10 alpine md5sum /dev/urandom
docker run -d --name='high_priority' --cpuset-cpus=0 --cpu-shares=50 alpine md5sum /dev/urandom
能力机制是Linux内核的一个强大特性,它提供程序运行时细粒度的访问控制,Linux内核中的Capabilities特性用于划分特权集,使进程可以只分配"执行特定功能"的特权:
Docker默认开启的Capability权限列表如下:
下面是一个Capability权限控制的演示,当我们启动一个容器并使用ping命令时,其实依赖的是CAP_NET_RAW能力,当我们移除容器的CAP_NET_RAW能力,再运行ping命令程序时会提示权限限制:
检查capabilities能力可以使用以下命令
#查看命令
capsh –print
#安装依赖
apt install libcap*
Docker继承了Linux Capabilities的能力,在运行容器的时候我们可以通过指定--privileded参数来开启容器的所有Capabilities,也可以通过--cap-add和--cap-drop两个参数来实现添加和移除某些特权:
我们可以通过查看进程状态来检查进程的特权集,并通过capsh来解码得到特定的特权集
使用Capsh可以翻译出每个BIT的含义,3=0011表示2个bit,f=1111表示4个bit,一共2+4+4+4+4+4+4+4+4+4=38bit,从后向前每个bit代表一种特权,一共38种特权集
使用–privileged参数运行的容器可以获得所有的特权集,当然我们也可以使用--cap-add=ALL获得所有的特权集:
如果使用--cap-drop=ALL --cap-add=cap_net_bind_service则容器只拥有cap_net_bind_service特权集,--cap-drop和--cap-add参数是在基础的14种特权集的基础上先减后加的
TIPS:检测当前环境是否以特权模式启动
cat /proc/self/status | grep CapEff
如果容器是以特权模式启动的话,则CapEff对应的掩码值应该为0000003fffffffff
如果容器不是以特权模式启动,则CapEff对应的掩码值如下:
Linux命名空间为容器提供隔离的运行环境,同时也是最基础和最直接的隔离,在容器运行时Docker将为该容器创建一组命名空间,然后把容器内的所有进程放到NameSpace中,在本地主机上无法看到容器内运行的进程,宿主机上各容器之间互相隔离互不影响。
Docker环境目前支持六种不同的Namespace,它们分别对系统资源的不同方面进行了隔离,包括主机名、用户权限、文件系统、网络、进程号、进程间通信
容器其实是作为宿主机上的一个进程而存在的,而命名空间是每个进程的属性,命令空间可以在/proc/<pid>/ns目录中查看
Docker当前默认只启用了Capability(能力机制)
A:SELinux SELinux(Security-Enhanced Linux)是Linux内核的强制访问控制实现,由美国国家安全局(NSA)发起,用以限制进程的资源访问,即进程仅能访问其任务所需的文件资源,因此可通过SELinux对Docker容器的资源访问进行控制
#命令示例
docker daemon --selinux-enabled = true
B:AppArmor
AppArmor(Application Armor,应用程序防护)是Linux的一种强制访问控制机制,作用是对可执行程序进行目录和文件读写、网络端口访问和读写等权限的控制
#命令示例
docker run --rm -ti --cap-add=all --security-opt apparmor:docker-default
C:Seccomp
Seccomp(Secure Computing Mode)是Linux内核提供的安全特性,可实现应用程序的沙盒机制构建,以白名单或黑名单的方式限制进程能够进行的系统调用范围
#命令示例
docker run --rm -it --security-opt seccomp:/path/to/seccomp/profile.json hello-world
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。