Linux Capabilities
Linux Capabilities是一种细粒度的权限管理机制,用于将root用户的特权划分为具体的功能集。它允许将部分root特权授予非root进程。
可以在shell中运行:
man capabilities
将显示capability man page,其中包含有关Linux功能的详细信息。
文章目录
- 什么是Capabilities
- Linux Cap 分类
- File Capabilities
- Cap管理工具
- libcap2-bin
- libcap-ng-utils
- Capabilities在容器中的应用
- Docker
- 进程权限集
- 获取与解析
- 运行具有某些权限的容器
- kubernetes
什么是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
获取和设置功能的两个基本命令是setcap和getcap。getcap获取功能列表,而setcap用于为可执行文件设置特定功能。
请注意,要使用
setcap, 必须传递原始文件,而不是符号链接文件。Linux中的符号链接是指向另一个文件的特殊文件。
设置功能:
$ sudo setcap cap_net_bind_service+ep /path/to/the/file
获取功能:
$ sudo getcap /path/to/the/file
libcap2-bin附带了其他工具,包括capsh和getpcaps。
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,它带有netcap、filecap和pscap工具。这些工具在处理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_ADMIN和NET_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_ADMIN和NET_ADMIN。在上述清单中,我们放弃了所有其他权限。
这比运行privileged: true的Pod要好得多,后者将添加所有Linux权限,约37个。
SYS_ADMIN几乎相当于授予容器root级访问权限,如果不需要,应避免使用。如果查看权限的手册页,则SYS_ADMIN也称为新的root。与SYS_ADMIN类似,NET_ADMIN允许您在系统上执行所有特权网络操作。
在Kubernetes中使用权限时,应该在前缀中放弃CAP这个词。
即使使用多容器Pod,也可以在每个容器中设置SecurityContext。您也可以使用工具(如tracee、inspektor-gadget和其他eBPF工具)来跟踪容器的权限。如果您不确定应用程序所需的权限,这将很有用。
相关文章:
Linux Capabilities
Linux Capabilities是一种细粒度的权限管理机制,用于将root用户的特权划分为具体的功能集。它允许将部分root特权授予非root进程。 可以在shell中运行: man capabilities将显示capability man page,其中包含有关Linux功能的详细信息。 文章目录 什么是CapabilitiesLinux Cap …...
【自制C++深度学习框架】前言
KuiperCourse 介绍 此GitHub项目是一个初学者的深度学习框架,使用C编写,旨在为用户提供一种简单、易于理解的深度学习实现方式。以下是本项目的主要特点和功能: 计算图:使用计算图来描述深度学习模型的计算过程,利用计…...
【高危】泛微 e-cology9 存在任意用户登录漏洞
漏洞描述 泛微协同管理应用平台(e-cology)是一套企业大型协同管理平台。 泛微e-cology9部分版本中存在前台任意用户登录漏洞,由于系统默认配置固定密钥进行用户身份验证。 当存在/mobile/plugin/1/ofsLogin.jsp文件时(可能通过插件方式安装࿰…...
1TB文本的实时全文检索系统搭建
1个T的文本是多大呢?1TB 1000GB,1GB是10亿,1TB就是1万亿字节。如果是英文字符,1TB文本就是1万亿个英文字符,如果是中文字符而且都是UTF8格式,1个中文字符占3个字节,1TB文本是3333亿中文字符&am…...
RHCA---DO477---变量实验
实验目的如下: 1. 环境准备: 使用命令lab inventory-variables start初始化环境 2. 进入/home/student/git-repos目录克隆下载http://git.lab.example.com:8081/git/inventory-variables.git 3. 将目录下yaml文件内容以group_vars形式修改 4. 部署并将修改后ansible-playbook代…...
毕业生高频常用材料线上签,高校毕业季契约锁电子签章一站式助力
据人社部消息,2023年全国高校毕业生总规模将达1158万人!毕业季开启,全国各地高校普遍面临三方协议、成绩单、证书、证明等毕业生高频常用材料签署量激增的现状。学生、教职工、学校常常疲于应对机械化的材料盖章工作。 #毕业季高频常用材料清…...
.ini配置文件介绍与解析库使用
【前言】 ini 文件是英文"Initialization"的缩写,即初始化文件。它用来配置特定应用软件以实现对程序初始化或进行参数设置。.ini文件由节(section)、键(key)、值(value)三种模块构成。在windows系统/嵌入式软件中有很多XXX.ini文件,例如Syste…...
牛客网Linux错题七
1.如何在命令行查看一台linux机器的CPU、SWAP分区信息、硬盘信息?(ACD) A. cat /proc/cpuinfo B. du C. cat /proc/swaps D. df -Ih 解: cat /proc/cpuinfo查看Linux设备的CPU信息,cat /proc/swaps查看Linux设备的交换分区信息…...
牛课刷题Day5(编程题)
1.合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组 正确答案: function concat(arr1, arr2) {let carr1.concat(arr2)return c } 解析: js的Array对象提供了一个叫concat()方法,连接两个或更多的数组&#x…...
javascript基础二十五:说说你对函数式编程的理解?优缺点?
一、是什么 函数式编程是一种"编程范式"(programming paradigm),一种编写程序的方法论 主要的编程范式有三种:命令式编程,声明式编程和函数式编程 相比命令式编程,函数式编程更加强调程序执行…...
常见JavaScript加密算法、JS加密算法
常见JavaScript加密算法、JS加密算法 一、SHA-256加密算法二、Base64编码算法三、RSA加密算法四、AES加密算法五、HMAC-SHA256算法六、PKCS7填充 一、SHA-256加密算法 SHA-256是一种密码散列函数,可以将任意长度的消息压缩成256位的摘要值。以下是使用JavaScript实现…...
题解2023.6.5
D - Factorial Divisibility 对于a[i]>x的数一定可以整除,考虑a[i]<x的数,因为(x1)*x! (x1)! 统计ai出现的次数, 把他转换为大的阶乘, 如果, 最终1到x - 1, ai的出现次数均为0则说明可以被x!整除 #pragma GCC optimize(2) #pragma GCC optimiz…...
与声音计算研究相关的挑战赛——DCASE和L3DAS
前言:在本专栏的系列博文中,我将包含声学场景识别、声音事件检测、声源位置估计等利用机器学习或深度学习技术进行研究的、基于声音信号的相关工作成为“声音计算”。 本篇博文主要介绍与声音计算相关的两个近些年持续跟进的挑战赛:DCASE和L…...
实训总结-----Scrapy爬虫
1.安装指令 pip install scrapy 2.创建 scrapy 项目 任意终端 进入到目录(用于存储我们的项目) scrapy startproject 项目名 会在目录下面 创建一个以 项目名 命名的文件夹 终端也会有提示 cd 项目名 scrapy genspider example example.com 3.运行爬虫指令 scrapy craw…...
前端开发职业规划指南:如何做好职业规划与发展
引言 前端开发是目前互联网行业中最火热的职业之一,也是非常具有发展前景的职业之一。随着互联网技术的不断更新和发展,前端开发的职业规划也在不断地发生变化。本文将从几个方面来探讨前端开发的职业规划。 一、职业发展路径 1.前端初级工程师 前端初…...
创业第一步:如何写好商业计划书
即使你的项目不需要融资,你也把标准商业计划书作为一个工具模板来应用,帮助更全面的盘点你要做的事情。 撰写一份性感的商业计划书如同造房子:第一步是科学设计,打好结构(有清晰的撰写逻辑);第…...
【Linux驱动】字符设备驱动相关宏 / 函数介绍(module_init、register_chrdev)
驱动运行有两种方式: 方式一:直接编译到内核,Linux内核启动时自动运行驱动程序方式二:编译成模块,使用 insmod 命令加载驱动模块 我们在调试的时候,采用第二种方式是最合适的,每次修改驱动只需…...
axios解决跨域问题
Vue3中使用axios访问聚合的天气API,出现跨域问题,需要在前端进行一些配置: 首先是修改vue.config.js: const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServe…...
R语言作图——热图聚类及其聚类结果输出
代码 不多说了,做个记录,代码如下。 library(pheatmap) library(RColorBrewer) # args commandArgs(TRUE) betafile "twist_common_panel_434.csv" infofile "twist_common_panel_434.txt" title "twist_common_panel&qu…...
Tomcat优化
Tomcat优化 Tomcat默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tom…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
