Linux Capabilities

2023-11-09

Linux Capabilities是一种细粒度的权限管理机制,用于将root用户的特权划分为具体的功能集。它允许将部分root特权授予非root进程。

可以在shell中运行:

man capabilities

将显示capability man page,其中包含有关Linux功能的详细信息。

什么是Capabilities

对于执行权限检查, 传统的UNIX实现区分两类进程: 特权进程(其有效用户ID为0,也称为超级用户或root)和非特权进程(其有效用户ID非零)。

特权进程绕过内核的所有权限检查,而非特权进程根据进程的凭证(通常为:有效用户ID、有效组ID和补充组列表)进行完整的权限检查。

从内核2.2开始,Linux将传统上与超级用户相关联的特权分成独立的单元,称为Capability,可以独立启用和禁用。

需要注意的是,功能是线程属性。

Linux Cap 分类

Linux capabilities可以分为以下几类:

文件系统相关:

  • CAP_CHOWN - 改变文件所有权
  • CAP_DAC_OVERRIDE - 忽略DAC权限
  • CAP_DAC_READ_SEARCH - 忽略文件读/搜寻权限
  • CAP_FOWNER - 忽略文件的所有权
  • CAP_FSETID - 忽略setuid/setgid位

设备相关:

  • CAP_MKNOD - 创建设备文件
  • CAP_NET_ADMIN - 管理网络子系统
  • CAP_NET_RAW - 使用RAW和底层网络协议
  • CAP_SYS_MODULE - 插入和删除内核模块
  • CAP_SYS_RAWIO - 执行raw I/O端口操作

进程相关:

  • CAP_SETPCAP - 转移其他进程的capabilities
  • CAP_SETUID - 设置UID
  • CAP_SETGID - 设置GID
  • CAP_SYS_ADMIN - 执行许多系统管理操作
  • CAP_SYS_PTRACE - 跟踪其他进程
  • CAP_SYS_CHROOT - 使用chroot限制根目录
  • CAP_KILL - 向其他进程发送信号
  • CAP_AUDIT_WRITE - 编写审计日志条目

系统管理:

  • CAP_SYS_BOOT - 重新引导系统
  • CAP_SYS_NICE - 修改进程优先级
  • CAP_SYS_RESOURCE - 修改资源限制
  • CAP_SYS_TIME - 修改系统时间

这只是capabilities的广义分类,某些capabilities可能属于多个类别。

基于最小特权原则,一个可执行文件可按需选择其中某些能力,而不是获取全部。

File Capabilities

自内核2.6.24起,内核支持使用setcap(8)将功能集与可执行文件相关联。文件功能集存储在名为security.capability的扩展属性中(请参阅setxattr(2))。写入此扩展属性需要CAP_SETFCAP功能。文件功能集与线程的功能集一起确定execve(2)后线程的功能。

文件功能比传统的setuid和setgid机制更加精细和灵活。

在引入文件功能(File Capabilities)之前,setuid为0的程序会授予执行它的进程全部特权。

Cap管理工具

libcap2-bin

功能很重要,因为允许决定进程所需的功能,而不是给予它完全访问权限 - 即使它并不需要。

功能特性于1999年在2.2内核中引入,但当时仅限于进程。2008年,功能也引入到文件中。

需要安装libcap2-bin

获取和设置功能的两个基本命令是setcapgetcapgetcap获取功能列表,而setcap用于为可执行文件设置特定功能。

请注意,要使用setcap, 必须传递原始文件,而不是符号链接文件。Linux中的符号链接是指向另一个文件的特殊文件。

设置功能:

$ sudo setcap cap_net_bind_service+ep /path/to/the/file  

获取功能:

$ sudo getcap /path/to/the/file

libcap2-bin附带了其他工具,包括capshgetpcaps

  • capsh也用于获取功能,帮助解码功能集。
  • getpcaps在检查Linux进程的功能时很有用。

举例说明,以ping为例。它需要打开原始套接字。只有root用户可以打开原始套接字或小于1024的端口。

我们如何为特定进程提供必要的功能? 答案是使用setcap来为可执行文件设置特定的Linux功能。

为ping设置特定的net_raw功能:

$ sudo setcap cap_net_raw=ep ping  

总而言之,功能涉及将root特权分成不同的级别,并帮助您为每个进程提供特定的功能。
例如:

  • CAP_CHOWN 更改文件的所有权。它允许root随意更改文件UID和GID。
  • CAP_KILL 杀死系统中正在运行的任何进程。
  • CAP_NET_BIND_SERVICE 允许您打开小于1024的端口,即使进程不是以root用户运行。

libcap-ng-utils

在处理功能时,另一个非常有用的软件包名为libcap-ng-utils,它带有netcapfilecappscap工具。这些工具在处理Linux中的功能时非常有用。

  • filecap查看可执行文件的所有功能。
  • netcap为通过TCP、UDP等在网络上通信的进程提供功能报告。
  • pscap查看正在运行的进程的功能

要安装libcap-ng-utils, 以CentOS 7为例:

yum -y install libcap-ng-utils

Capabilities在容器中的应用

Docker

默认情况下,容器在启动时会获得容器运行环境提供的某些默认功能。像Docker这样的工具为您提供了根据需求添加和删除功能的灵活性。要理解这一点,您需要知道您的容器为正常工作所需的功能,否则将无法达到预期效果。

例如,让我们运行一个busybox容器并检查运行该进程所具有的功能。

busybox容器基于busybox镜像,是一个轻量级容器,内置许多常用的UNIX实用工具,如awk、grep和tar。

docker run --rm -it busybox sleep 1h &

要获取正在运行的容器的PID,您可以使用docker inspect <container-id>。PID代表进程ID。它是在Linux系统上运行的每个进程的唯一数字ID。

$ docker inspect 7666636cd08c | grep -i PID
Output      "Pid": 23764,
            "PidMode": "",
            "PidsLimit": null,

进程权限集

有五种不同类型的进程权限集。让我们理解每个权限所代表的含义:

  • CapInh(Inherited capabilities)是从运行的父进程传递到其子进程的权限。
  • CapPrm(Permitted capabilities)是进程允许拥有的权限。
  • CapEff(Effective capabilities)集是当前进程执行的所有权限。
  • CapBnd(Bounding capabilities)集是进程允许拥有的最大权限集。
  • CapAmb(Ambient capabilities)集包括当前生效的权限。它可以在以后应用于当前进程或其子进程。

在本文中,将重点关注有效权限集。大部分时候,会使用有效权限。

获取与解析

要获取容器的进程权限集, 运行以下命令:

$ grep Cap /proc/<container-pid>/status
CapInh: 00000000a80425fb
CapPrm: 00000000a80425fb
CapEff: 00000000a80425fb
CapBnd: 00000000a80425fb
CapAmb: 0000000000000000

这个输出不可读,所以要读取这个输出,需要使用来自libcap2-bin软件包的二进制文件capsh

此时,确保已安装libcap2-bin软件包。要解码有效权限,获取CapEff:之后写入的文本,并使用以下命令,应该会看到如下输出:

$ capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,
cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,
cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,
cap_audit_write,cap_setfcap

输出显示进程具有不同的权限。例如, cap_chown权限使程序有权更改文件的所有者或目录的所有者。chown命令使用此权限。
类似地,如果要进程打开/监听小于1024的端口,可以使用cap_net_bind_service,它允许进程绑定到小于1024的端口。

如果有进程的PID,也可以使用getpcaps获取进程的权限:

getpcaps 23808

运行具有某些权限的容器

现在,让我们尝试理解如何运行具有某些权限的容器。如果使用docker,可以使用--cap-add添加权限和--cap-drop放弃权限。例如,如果要运行有sys_admin权限的容器并放弃其他所有权限,可以如下:

$ docker run --rm --cap-drop=all --cap-add=sys_admin \   
-it busybox sleep 1h &

请注意,如果要添加或删除多个权限,必须再次添加相同的标志。

例如,如果要运行一个容器,放弃所有权限, 只使用SYS_ADMINNET_ADMIN权限,需要使用--cap-add标志两次。

$ docker run --rm --cap-drop=all --cap-add=sys_admin \  
--cap-add=net_admin -it busybox sleep 1h &  

kubernetes

如何在Pod中设置正确的权限?

通过在Kubernetes清单中使用SecurityContext,可以在容器中设置权限。让我用一个示例清单说明:

apiVersion: v1  
kind: Pod  
metadata:  
 name: pod  
spec:  
 containers:  
 - command:  
   - sleep  
   - "100000"  
   image: ubuntu  
   name: ubuntu-pod   
   securityContext:  
     privileged: false   
     capabilities:  
       drop:  
         - ALL  
       add:   
         - SYS_ADMIN  
         - NET_ADMIN

上述Kubernetes清单将创建一个具有Ubuntu镜像的Pod,并且只有两个权限:SYS_ADMINNET_ADMIN。在上述清单中,我们放弃了所有其他权限。

这比运行privileged: true的Pod要好得多,后者将添加所有Linux权限,约37个。

SYS_ADMIN几乎相当于授予容器root级访问权限,如果不需要,应避免使用。如果查看权限的手册页,则SYS_ADMIN也称为新的root。与SYS_ADMIN类似,NET_ADMIN允许您在系统上执行所有特权网络操作。

在Kubernetes中使用权限时,应该在前缀中放弃CAP这个词。

即使使用多容器Pod,也可以在每个容器中设置SecurityContext。您也可以使用工具(如tracee、inspektor-gadget和其他eBPF工具)来跟踪容器的权限。如果您不确定应用程序所需的权限,这将很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Capabilities 的相关文章

  • 我们如何在使用循环时调用 ansible playbook 中的变量

    我有两个文件 其中这些文件包含server names and server IP s 我想更改 替换一些特定的server names and IP addressees根据要求在两个文件中 这与这篇文章 因为它被要求开设一个新职位 ht
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include

随机推荐

  • JVM常见面试题

    一 了解JVM的发展史 1 Sun Classic VM 早在1996年Java1 0版本的时候 Sun公司发不了一款名为Sun Classic vm的java虚拟机 它同时也是世 界上第一款商业java虚拟机 jdk1 4 时完全被淘汰
  • Qt 实现点击按钮窗体某个部分出来,再点击回去,循环反复

    ui gt widget 3 gt setVisible false ui gt widget 4 gt setVisible false this gt resize 473 229 connect ui gt pushButton 2
  • java合并数组的方法

    在 Java中 数组是一种重要的数据结构 在 Java中数组的操作方式有两种 一种是直接使用数组来操作 另一种是通过引用计数或者双指针对数组进行操作 对于直接使用数组来操作的方式 我们可以通过两个方法来实现 一种是将数组作为参数传递给方法
  • 贪心算法之田忌赛马(超详细)

    简述 手把手教会贪心算法之田忌赛马 超详细 题目 田忌赛马 田忌和齐王赛马 两人各出n匹马 赢一场比赛得200两银子 输了赔200银子 平局不赔不赚 已知两人每匹马的速度 问田忌最多能赢多少银子 多组测试数据 每组数据的第一行是一个整数n
  • 第一次使用leaflet

    1 下载leaflet https leafletjs com download html 2 下载插件leaflet draw http leaflet github io Leaflet draw docs leaflet draw l
  • WFQ-加权公平排队

    WFQ是一个复杂的排队过程 可以保证相同优先级业务间公平 不同优先级业务间加权 队列的数目可预先配置 范围是 16 4096 WFQ 在保证公平 带宽 延迟 的基础上体现权值 权值大小依赖于JP报文头中携带的IP优先级 Precedence
  • java的面向对象的基础

    面向对象基础 一 类和对象 1 1 什么是对象 1 2 面向对象 1 3 类 1 3 1 什么是类 1 3 2 类的特点 1 3 3 类的组成 1 3 4 类的定义 1 4 对象的属性 1 5 对象的行为 1 6 类和对象的关系 1 7 对
  • 编程陷阱_变量被莫名修改

    编程陷阱 变量被莫名修改 源代码 错误点 通道号更新 导致情况 原工程作用 QT中查询10个通道的数据 定义个数组记录每个通道的时间戳 轮询每个通道 源代码 错误点 CHANNEM NUM MAX 定义为 10 通道号更新 目标是轮询通道号
  • 系统架构设计专业技能 · 软件工程之系统分析与设计

    系列文章目录 系统架构设计专业技能 软件工程 一 系统架构设计师 系统架构设计高级技能 软件架构概念 架构风格 ABSD 架构复用 DSSA 一 系统架构设计师 系统架构设计高级技能 系统质量属性与架构评估 二 系统架构设计师 系统架构设计
  • 若依项目整合百度(Ueditor)富文本编辑器

    若依项目整合百度 Ueditor 富文本编辑器 最近项中有用到富文本编辑器 若依自带的功能太过简单 闲来无事整合了百度的富文本编辑器 一路踩坑终是成功了 呜呼 UEditor文档 http fex baidu com ueditor 点击演
  • Golang两款编辑器:Goland 2020 和国产的LiteIDE

    Goland 2020 http www opdown com soft 220835 html 国产的LiteIDE http liteide org cn
  • MERN技术栈实现CRUD的小项目(万字长文;使用React、Express、Mongodb、node实现前后端结合的增删查改)

    预期效果 使用React Express Mongodb node 可以前后端交互 实现增删查改 成品 实施过程 1 创建项目 前端部分的创建 前端依然使用 react create app 来创建 这次用到的依赖有如下的 classnam
  • VBA基础 - 分支和循环

    概要 编程语言的基础除了数据类型 就是控制结构了 所谓控制结构 主要就是分支和循环 分支 废话不说 直接示例代码 单条件判断 1 Sub Test 2 If 2 gt 1 Then 3 Debug Print xxxx 4 End If 5
  • 未完成---VBA的键盘事件相关

    试了几个地方 有的有些 有的问题很多 1 workbook open时调用 不好用 Private Sub Workbook Open Load UserForm6 UserForm6 Show Application OnKey a wb
  • WordPress(4)关于网站的背景图片更换

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 更改的位置 1 红色区域是要更换的随机的图片 二 替换图片位置 三 开启随机数量 四 结束 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智
  • Java 访问权限控制

    使用访问权限控制的原因 使用户不要触碰到那些不该触碰的部分 类库设计者可以更改类的内部工作模式 而不必担心整体程序造成影响 访问权限修饰词 Java具有三种访问权限修饰词 public private protected 划分出了四种访问权
  • 使用Django完成一个系统(上)

    文章目录 可重用注册登录系统 1 思考 2 搭建项目环境 3 设计数据库模型 4 路由 视图函数及模板的框架搭建 5 前端界面设计与优化 6 完善登录的视图函数 7 session会话与登录的视图函数 可重用注册登录系统 1 思考 需求分析
  • UE 4.19 安卓平台配置和测试

    以前使用UE4打包一个很简单的场景都要几百兆 最近据说这几个版本UE4对移动平台的大小进行了较大的优化 测试一下 附按照环境打包 解压后直接在项目中指定即可 链接 https pan baidu com s 1tAfMjY s56ehjud
  • c语言中两种常见代码编写错误,“写入位置 0x00000000 时发生访问冲突”和“语法错误 : 缺少“;”(在“{”的前面)”

    编程工作者在编程的时候 由于编程不够细心经常出现这样或那样的错误 今天 我在这里说下我所遇到的错误 如下面这个代码就出现了文章标题中的俩个错误 define CRT SECURE NO DEPRECATE include
  • Linux Capabilities

    Linux Capabilities是一种细粒度的权限管理机制 用于将root用户的特权划分为具体的功能集 它允许将部分root特权授予非root进程 可以在shell中运行 man capabilities 将显示capability m