description: "使用 CAP 为容器提权"
date: 2021.11.07 10:34
categories:
- K8s
tags: [Linux, K8s]
keywords: Linux, CAP, capabilities
原文地址: https://www.jianshu.com/p/a7f6c4f420fa
发音
译为 能力 或 功能 ,一般缩写 CAP ,以下我们简称 Capabilities 为 CAP
从内核 2.2 开始, Linux 将传统上与超级用户 root 关联的特权划分为不同的单元,称为 CAP 。
CAP 作为线程( Linux 并不真正区分进程和线程)的属性存在,每个单元可以独立启用和禁用。
如此一来,权限检查的过程就变成了:
在执行特权 *** 作时,如果进程的有效身份不是 root ,就去检查是否具有该特权 *** 作所对应的 CAP ,并以此决定是否可以进行该特权 *** 作。
比如要向进程发送信号( kill() ),就得具有 CAP_KILL ;如果设置系统时间,就得具有 CAP_SYS_TIME 。
在 CAP 出现之前,系统进程分为两种:
特权进程可以做所有的事情: 进行管理级别的内核调用;而非特权进程被限制为标准用户的子集调用
某些可执行文件需要由标准用户运行,但也需要进行有特权的内核调用,它们需要设置 suid 位,从而有效地授予它们特权访问权限。(典型的例子是 ping ,它被授予进行 ICMP 调用的完全特权访问权。)
这些可执行文件是黑客关注的主要目标——如果他们可以利用其中的漏洞,他们就可以在系统上升级他们的特权级别。
由此内核开发人员提出了一个更微妙的解决方案: CAP 。
意图很简单: 将所有可能的特权内核调用划分为相关功能组,赋予进程所需要的功能子集。
因此,内核调用被划分为几十个不同的类别,在很大程度上是成功的。
回到 ping 的例子, CAP 的出现使得它仅被赋予一个 CAP_NET_RAW 功能,就能实现所需功能,这大大降低了安全风险。
注意: 比较老的 *** 作系统上,会通过为 ping 添加 SUID 权限的方式,实现普通用户可使用。
这存在很大的安全隐患,笔者所用 *** 作系统( CentOS7 )上 ping 指令已通过 CAP 方式实现
Set capabilities for a Container
基于 Linux capabilities ,您可以授予某个进程某些特权,而不授予 root 用户的所有特权。
要为容器添加或删除 Linux 功能,请在容器清单的 securityContext 部分中包含 capability 字段。
输出显示了容器的进程 id ( pid ):
输出显示了进程的能力位图:
解码
接下来,运行一个与前一个容器相同的容器,只是它有额外的功能集。
进程的能力位图:
进程的能力位图值解码
有关常 capability 数的定义,请参阅 capability.h 。
注意: Linux capability 常量的形式是 CAP_XXX 。
但是,当您在容器清单中列出功能时,必须忽略常量的 CAP_ 部分。
例如,要添加 CAP_SYS_TIME ,请在功能列表中包含 SYS_TIME 。
这里我们介绍进程状态中与 Capabilities 相关的几个值:
借用上述例子中未配置 CAP 的进程能力位图
对比发现,容器运行时内的 root 用户并非拥有全部权限,仅仅是默认拥有 14 条权限,其他权限如果使用需要额外开启。
显然当镜像指定 USER 为非特权用户运行时, CAP 配置并不生效
Linux Capabilities 简介
Linux Capabilities: Why They Exist and How They Work
在压缩文件cap.tar.gz中,有一个文件是update.cud,整条命令的意思是将cap.tar.gz压缩文件中的update.cud文件解压到/tmp目录下。 tar:tar命令 xzf:x是解压释放;z代表gz格式;f代表file -C:后跟目录,解压到这个目录下众所周知,在Windows下开发运行环境下,在调试网络环境时,可以可以很方便的借助wireshark等软件进行抓包分析;并且在linux或者Ubuntu等桌面版里也可以进行安装抓包工具进行抓包分析,但总有一些情况,无法直接运用工具(比如一些没有界面的linux环境系统中),则此时我们就需要使用到最简单的tcpdump命令进行网络抓包。
一般的,linux下抓包时,抓取特定的网络数据包到当前文件夹下的文件中,再把文件拷贝出来利用Windows下的wireshark软件进行分析。
tcpdump命令详解:(简单举例)
1、抓取到的文件为filename.cap,然后将此文件拷贝到Windows下,使用wireshar打开后,即可对此文件进行分析。
2、eth0 是主机的网络适配器名称,具体的参数值可以在linux命令行窗口中通过 ifconfig 指令查询。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)