前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器安全机制解读

容器安全机制解读

原创
作者头像
Al1ex
发布2023-12-22 17:43:36
4480
发布2023-12-22 17:43:36
举报
文章被收录于专栏:网络安全攻防

文章前言

Docker默认设置可以保护主机容器内的进程访问资源,虽然Docker容器内的初始进程运行为root,但它具有的权限是非常有限的,这主要是通过使用以下几种主要的安全机制来实现的: 

  • Cgroups:资源限制
  • Capabilities:权限限制
  • Namespace:资源隔离

安全机制

Cgroup

控制组(Cgroup)主要用来对资源进行限制、审计等,它主要提供以下功能:

  • 资源限制:可将组设置一定的内存限制,例如内存子系统可以为进程组设定一个内存上限,一旦进程组使用的内存达到限额,就会触发OOM告警
  • 优先级类:通过优先级让一些组优先得到更多的CPU、内存、或磁盘IO等资源
  • 资源审计:统计系统实际上把多少资源用到适合的目的上,可以使用cpuacct子系统记录某个进程组使用的cpu时间。
  • 任务控制:执行挂起、恢复和重启动等操作

通过docker run命令启动一个容器时,Docker通过linux相关的调用在后台为容器创建一个独立的策略组集合,该集合将用来限制容器内应用对资源的消耗

Cgroup对cpu资源控制的演示(--cpu-shares选项设置容器按比例共享CPU资源(弹性))

代码语言:c
复制
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

Capabilities

能力机制是Linux内核的一个强大特性,它提供程序运行时细粒度的访问控制,Linux内核中的Capabilities特性用于划分特权集,使进程可以只分配"执行特定功能"的特权:

  • 引入Capability特性前:只区分root和非root,如果普通用户要使用root用户程序,通常是sudo或者添加suid,设置suid标识后容器导致特权提升风险
  • 引入Capability特性后:可以只给程序它执行必须的特权集,如给ping应用添加CAP_NET_RAW特权集,使其具有使用网络的特权集,而不具备其他特权集

Docker默认开启的Capability权限列表如下:

下面是一个Capability权限控制的演示,当我们启动一个容器并使用ping命令时,其实依赖的是CAP_NET_RAW能力,当我们移除容器的CAP_NET_RAW能力,再运行ping命令程序时会提示权限限制:

检查capabilities能力可以使用以下命令

代码语言:c
复制
#查看命令
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:检测当前环境是否以特权模式启动

代码语言:c
复制
cat /proc/self/status | grep CapEff

如果容器是以特权模式启动的话,则CapEff对应的掩码值应该为0000003fffffffff

如果容器不是以特权模式启动,则CapEff对应的掩码值如下:

Namespace

Linux命名空间为容器提供隔离的运行环境,同时也是最基础和最直接的隔离,在容器运行时Docker将为该容器创建一组命名空间,然后把容器内的所有进程放到NameSpace中,在本地主机上无法看到容器内运行的进程,宿主机上各容器之间互相隔离互不影响。

Docker环境目前支持六种不同的Namespace,它们分别对系统资源的不同方面进行了隔离,包括主机名、用户权限、文件系统、网络、进程号、进程间通信

容器其实是作为宿主机上的一个进程而存在的,而命名空间是每个进程的属性,命令空间可以在/proc/<pid>/ns目录中查看

其他内核机制

Docker当前默认只启用了Capability(能力机制)

A:SELinux SELinux(Security-Enhanced Linux)是Linux内核的强制访问控制实现,由美国国家安全局(NSA)发起,用以限制进程的资源访问,即进程仅能访问其任务所需的文件资源,因此可通过SELinux对Docker容器的资源访问进行控制

代码语言:c
复制
#命令示例
docker daemon --selinux-enabled = true 

B:AppArmor 

AppArmor(Application Armor,应用程序防护)是Linux的一种强制访问控制机制,作用是对可执行程序进行目录和文件读写、网络端口访问和读写等权限的控制

代码语言:c
复制
#命令示例
docker run --rm -ti --cap-add=all --security-opt apparmor:docker-default

C:Seccomp

Seccomp(Secure Computing Mode)是Linux内核提供的安全特性,可实现应用程序的沙盒机制构建,以白名单或黑名单的方式限制进程能够进行的系统调用范围

代码语言:c
复制
#命令示例
docker run --rm -it --security-opt seccomp:/path/to/seccomp/profile.json hello-world

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章前言
  • 安全机制
    • Cgroup
      • Capabilities
      相关产品与服务
      容器镜像服务
      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档