LWN:CAP_PERFMON,有一个新增的capability!

K8s+Docker集群安装部署常见问题处理总结 阅读详情

关注了就能看到更多这么棒的文章哦~

CAP_PERFMON — and new capabilities in general

By Jonathan Corbet
February 21, 2020


原文来自:https://lwn.net/Articles/812719/

perf_event_open()这个系统调用非常复杂,需要使用者仔细研究一下才能掌握。这个系统调用还有一些安全特性需要掌握:它可以拿到当前正在运行的系统中的许多信息,并且因为它的内部实现非常复杂,所以经常会出现一些让人烦恼的bug。目前的kernel中,对perf_event_open()的安全管控其实非常简单:如果有CAP_SYS_ADMIN权限,就可以使用perf_event_open()(尽管系统管理员可以把它配置成不需要任何权限就能用)。目前有人试着在增加一个新的capability来专用于perf events subsystem,看起来很有道理的样子,反而引起人们的一个疑问“为何不经常加一些新的capability”。

capabiilty,一直一来人们希望用它来把传统Unix里面的超级用户的权限拆得更加细粒度一些,这样可以让系统管理员给相应的人一些特定的权限,而不用让他变成超级用户。目前Linux kernel里面定义了37种capability,可以用来对许多任务配置许可权限,包括配置terminal device,设置系统的resource limit,安装kernel module,调整系统时间等。在这么多种capability中,CAP_SYS_ADMIN是用来进行系统管理工作的。CAP_SYS_ADMIN也就变成了在其他各种capability都不合适的时候会缺省申请的capabiilty。它涵盖的权限非常多,所以人们称之为“the new root”。

快速搜一下就知道,在5.6-rc kernel里面有大概500多处地方都是在检查CAP_SYS_ADMIN。在5.6的合并窗口期,还新增了一些依据CAP_SYS_ADMIN来放行的地方,包括发送一些硬件特有的命令给这种设备、配置time namespace、加载BPF program来替换kernel operation structure、开放对x86 MTRR寄存器的访问。perf event subsystem也一直依赖CAP_SYS_ADMIN来避免被普通用户调用。所以,要想让某个用户来调用perf_event_open(),就需要系统管理员给他开放CAP_SYS_ADMIN,从而也就对他开放了诸如mount filesystem,访问PCI configuration space,调整memory-management policy,加载BPF program等等权限。通常来说不应该不应该给仅仅要做perf tuning的application授予这么多权限。

Alexey Bundankov的patch set就是为了解决这个问题,他创建了一个新的名为CAP_PERFMON的capability,用来管控这些performance-monitoring task。如果使用了这个patch,用户(或者他调用的程序)就可以只被赋予CAP_PERFMON,而不需要CAP_SYS_ADMIN。这样就可以既能获得performance数据,也不会让别人担心它滥用其他权限。当然,CAP_SYS_ADMIN也能够调用perf_event_open(),否则的话很可能会导致现在能正常工作的软件出错了。不过,只要用户已经有了CAP_PERFMON了,那么就不需要再授予它CAP_SYS_ADMIN了。

乍一看,这个改动看起来很显而易见。像这种从一个非常强大的capabiilty里面分出一个相对无害的功能的做法,大多数人都能接受。不过,这样一来我们就有一点想不通了,为什么之前很少有人这么做。上一次新增一个capability还是2014年的时候,当时增加了CAP_AUDIT_READ。而上一次从CAP_SYS_ADMIN中剥离出一个capability还是2010年的时候创建的CAP_SYSLOG。通常来说,某个功能加到了CAP_SYS_ADMIN里面的话,就没有再分出来了。为什么会有这种现象?

其中一个原因,就是之前提到的兼容性问题:如果CAP_SYS_ADMIN允许了某个动作,那么此后永远都要能允许它,否则有可能让现在能正常工作的软件变得不可用了。Serge Hallyn增加了CAP_SYSLOG的时候,他就用代码确保了拥有CAP_SYS_ADMIN的进程也有SYSLOG权限。不过,当时的kernel代码会报出一个warning信息,提示用户今后不可以再用CAP_SYS_ADMIN来控制此功能。在10年之后,这部分兼容代码以及warning信息仍然在kernel里面。如果CAP_SYS_ADMIN本身的权限没有减少,那么从中分出一些新的capability就没有多少好处了。

增加新的capability也有自身的一些风险,毕竟已有的代码完全不知道这个新的capability,以及它控制了什么东西。如果某个应用程序清掉了一个capabiilty mask中的多数bit,那么也会自认清除掉新增的这个bit,不过可能这个bit反而是应该打开的。经验告诉我们,如果在某个拥有特权的进程运行时仔细选择并去除掉一些capabiilty的话,有可能会出现一些出人意料的安全性问题。每个新增的capability都有类似的情况。所以新增capability的时候需要非常小心。这也是为什么SELinux编译的时候会专门检查是否有新增的capability但是没有在SELinux里面做过相应的改动,有的话就直接报错。

这样一来,许多人都认为Linux里面的capability是一个不成功的试验品。没人成功实现一个基于capability的实用系统,并且其中许多现存的capability都很容易被提升到root权限。kernel之上的Linux系统里面很少利用这些capability。如果最终实现的系统跟它原本定义的大不相同,那么很少有人有动力去继续做这件事情了,也很少有人会认真使用这个系统。

举个例子来说,为了减少用户的特权,很常见的一个需求就是从现有的工具软件中移除掉setuid bit,而仅仅给它增加响应的capability。kernel早在2008年的2.6.24就已经支持了file-baseed capability。作者本人的系统上正在运行的是Fedora 31,就总共包含了9个可执行程序是带有capability的:

    # getcap -r /
    /usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep
    /usr/bin/clockdiff = cap_net_raw+p
    /usr/bin/arping = cap_net_raw+p
    /usr/bin/newuidmap = cap_setuid+ep
    /usr/bin/newgidmap = cap_setgid+ep
    /usr/bin/ping = cap_net_admin,cap_net_raw+p
    /usr/bin/gnome-shell = cap_sys_nice+ep
    /usr/sbin/mtr-packet = cap_net_raw+ep
    /usr/sbin/suexec = cap_setgid,cap_setuid+ep

我很高兴看到gnome-shell没有通过setuid root来执行,这样至少说明capability还是用起来了。不过对应的其实还存在31个setuid root的程序。看起来这个发行版距离完全利用capability来控制权限的目标还离得很远。

据说关于capability这一领域会有一些转变。人们总是永无休止地在加固我们的系统,预防攻击。这让开发者们开始再次审视起Linux capability功能了,希望能更好地利用它们。比如Android系统就已经用上了capability。systemd可以让管理员更细致地控制各种程序的capability。也许,Linux capability在多年被冷落之后,终于要找到更多系统开始部署了。

如果这种说法是真的,那么后续我们可能会看到更多人对改进capability的权限控制粒度的兴趣。包括从CAP_SYS_ADMIN中分出更多的权限,不过这些都需要非常非常小心地处理。CAP_SYS_ADMIN很可能今后可以摆脱它的"new root"的不光彩外号了,不过还是可以利用它来作为极少数program用来确保能正常工作的保底capabilty。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

Capabilities位提权 linux2.2之后,产生了Capabilities用于分隔root权限,以便于用户更好,更安全,更精细的管理机器的功能和权限。 具体的相关与capabilities的使用方面知识可以去参考这篇文章Linux Capabilities 简介 - sparkdev - 博客园 (cnblogs.com) 这里仅讨论对提权有帮助的CAP_SETUID标志 操作 首先需要探查有CAP_SETUID标志的进程 /usr/sbin/getcap -r / 2>/dev/null 这样来找到进程 阅读详情

相关推荐

LINUX SECCOMP模块介绍

Seccomp是 "secure computing" 的 缩写。Linux内核2.6.12版本(2005年3月8日)引入。是linux一个安全模块,用于限制程序系统调用;我们来看下例子。

SHELLCODE_8BIT的博客 3395

LWN:BPF与安全!

关注了就能看到更多这么棒的文章哦~BPF and securityBy Jake EdgeOctober 4, 2023LSSEUChatGPT translationhttps://lwn.net/Articles/946389/eBPF内核虚拟机即将迎来其加入Linux十周年,它已经发展成为生态系统中多种用途的工具。eBPF的创始人,也是其早期开发的主要负责人Alexei Starovoito...

Linux News搬运工 1077

0xMM0X.github.io:我的博客

0xMM0X.github.io:我的博客

LWN:若干新增的capability!

关注了就能看到更多这么棒的文章哦~A crop of new capabilitiesByJonathan CorbetJune 8, 2020原文来自:https://lwn.net...

Linux News搬运工 1112

4G LTE 与 5G 无线网络规划对比:从 BBU/RRU 到 CU/DU/AAU 的架构演进解析

本文深度解析4G LTE与5G无线网络架构的演进差异,从BBU/RRU分立式架构到CU/DU/AAU三级重构,揭示移动通信代际跃迁的技术本质。重点对比了网络规划中的覆盖能力、容量规划、传输网络等九大维度,为通信工程师提供实用的技术对照手册,助力5G网络高效部署。

weixin_32821533的博客 287

Streamlit安装避坑指南:从零到一键启动你的第一个数据可视化应用

本文提供了一份详尽的Streamlit安装避坑指南,帮助用户从零开始快速启动第一个数据可视化应用。文章深入剖析了安装过程中常见的网络超时、依赖冲突、环境变量缺失等核心问题,并给出了使用虚拟环境、配置国内镜像源、利用.whl文件离线安装等多种经过验证的解决方案,确保安装过程顺畅无阻。

weixin_29065015的博客 614

如何平滑升级SLIM:从旧版本到最新版的完整指南

SLIM(Slim)是一款开源的Kubernetes应用程序优化和压缩工具,专注于减小容器镜像大小,提升部署速度并增强安全性。本指南将帮助您从旧版本无缝升级到最新版,充分利用其强大功能。 ## 为什么升级SLIM? 随着容器技术的快速发展,SLIM团队持续迭代优化,每个版本都带来显著改进: - **镜像压缩效率提升**:最新版1.40.11通过新的`--include-dir-bins`和`

gitblog_00486的博客 387

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2976

Docker 容器常见故障排查及处理

Docker 容器常见故障排查及处理 本文来源于公司论坛发表的帖子 Docker是一种相对使用较简单的容器,我们可以通过以下几种方式获取信息: 1、通过docker run执行命令,或许返回信息 2、通过docker logs 去获取日志,做有针对性的筛选 3、通过systemctl status docker查看docker服务状态 4、通过journalctl -u docker.service 查看日志 以下是整理的docker容器类问题故障,分为9个类 一、启动类故障 1、docker:

Ice-winters 2万+

Reeds-Shepp曲线公式推导及代码实现-第三部分(共三部分)

根据原始起点的坐标和航向,将上一小节计算出来的局部进行整体的平移和旋转(与归一化的步骤刚好相反),最终得到全局路径的轨迹。根据计算出来的路径,选择路径最短的轨迹(也可根据我们实际的需要定制选优规则),作为最终的轨迹输出。Reeds-Shepp曲线公式推导及代码实现-第一部分(共三部分)Reeds-Shepp曲线公式推导及代码实现-第二部分(共三部分)的值进行等步长插值,得到每段轨迹对应的生成一系列插值距离列表。根据上一步生成的插值距离列表的值,计算其对应的局部位姿值。后,我们需要根据字段类型(

jianmo的博客 1087

C#中使用OpenCV的常用函数

c# opencv 常见操作

大黄鸭在发光的专栏 1079

docker-compose启动报错:starting container process caused: exec: “bin/start.sh“:permissiondenied:unknown

命令 chmod +x 文件夹或者文件 (+x表示最高权限)原因是启动得.sh文件没有执行权限。只需要将文件或者文件夹赋值权限即可。

weixin_54651894的博客 3542

RTAB-map:实时高效的SLAM库

Real‐time appearance‐based mapping (RTAB‐Map)是一种基于外观的闭环检测方法,具有良好的内存管理,以满足处理大场景和在线长周期管理要求。RTAB‐Map集成了视觉和激光雷达SLAM方案,并支持目前绝大多数的传感器 是一个强大的、开源的Simultaneous Localization and Mapping(SLAM)库,专为机器人和无人驾驶领域设计。它提供了一套完整的解决方案,用于构建三维地图,并在未知环境中进行实时定位与导航。 github项目地址 RTAB-

weixin_45761399的博客 1万+

Docker&Kubernetes ❀ Docker Capabilities 容器进程能力权限与执行文件能力权限设置

文章目录1、权限设置1.1 进程能力集1.2 执行文件能力集2、实现机制3、案例演示4、Compose使用案例 1、权限设置 Docker Capabilities 容器权限:主要在于分割root用户的特权,即将root的特权分割成不同的能力,每种能力代表一定的特权操作; 例如:CAP_SYS_MODULE 表示用户能够加载(或卸载)内核模块的特权操作,而CAP_SETUID表示用户能够修改进程用户身份的特权操作,在Capbilities中系统将根据进程拥有的能力来进行特权操作的访问控制; 在容器权限中,

无糖可乐没有灵魂 3244

2026年数学建模国赛论文排版规范:Word与LaTeX终极对比及模板

提前演练:不要等到比赛开始才第一次使用排版工具。至少在赛前一个月完成1-2篇模拟论文的全流程排版练习。建立检查清单:基于国赛规范制定排版检查清单,在提交前逐项核对——公式编号连续?图表引用准确?参考文献完整?页数不超限?善用模板但不止于模板:模板提供的是起点而非终点。根据自身需求调整宏包配置和样式参数,理解每一行配置的含义。关注评审体验:从评委的视角审视论文——重点内容是否突出?逻辑结构是否清晰?视觉层次是否合理?备份与容错:无论使用何种工具,建立多级备份机制。本地、云端、U盘各存一份,且定期保存历史版本。

YOLO 210

Windows 11 安装 Miniconda + Mamba,配置国内源

本文详细介绍了在 Windows 11 系统下安装 Miniconda 并配置 Mamba 的完整流程,包括选择精简版 Miniconda 的理由、安装过程中的关键选项设置、配置清华大学镜像源以加速包下载,以及在 base 环境中设置 pip 国内源。同时说明了 Mamba 相较 Conda 的性能优势,并指导用户完成 Mamba 安装与 Shell 集成,最终通过命令验证环境管理功能,帮助用户构建高效、轻量的 Python 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3344

docker启动报错:container init caused \“write /proc/self/attr/keycreate: permission denied\““: unknown.

docker安装之后,镜像load,服务都是好的。

qq_45212655的博客 1449

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Docker 启动容器权限报错

Docker 安装完成,启动容器时报错,启动失败: ** docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused “process_linux.go:430: container init caused “write /proc/self/attr/keycreate: permission denied””: unkno

qq_1323002760的博客 8373

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

一文搞懂containerd

在学习 Containerd 之前我们有必要对 Docker 的发展历史做一个简单的回顾,因为这里面牵涉到的组件实战是有点多,有很多我们会经常听到,但是不清楚这些组件到底是干什么用的,比如runccontainerdCRIOCI等等。

weixin_46532941的博客 9219

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

麒麟系统启动docker报错starting container process caused “permission denied“: unknown.

starting container process caused "permission denied": unknown

ONLYYD的博客 2721

【麒麟ARM64位架构docker】starting container process caused “permission denied“: unknown,docker run运行容器报错

摘要:在麒麟操作系统ARM64架构上运行Docker容器时出现权限问题,报错"permission denied"导致容器启动失败。解决方案是为容器添加SYS_ADMIN权限参数,该参数赋予容器最高权限,使其能够读写和挂载系统底层文件,从而解决Redis等容器无法正常运行的问题。(99字)

欢迎你们到来,希望能帮到大家 543

Docker容器启动错误对应

现象:docker run出现错误,详细信息如下所示 [root@liumiao ~]# docker run -p 38818:8888 --name nginxtest -d nginx af28ef608d84764961a477d567662c133844ab09a38c1d601e9948b7705fae09 /usr/bin/docker-current: Error respon...

知行合一 止于至善 1699

CentOS 7中建lxc-sshd容器, 报告2260 unknown capability sys_module问题的解决

环境 宿主机: CentOS 7, x86-64 bits LXC: LXC-2.1.1,make && make install 创建lxc-sshd容器 lxc-create -t sshd -n sshd-1 -- --auth-key ./lxc.pub 运行容器 lxc-start -n sshd-1 报告如下错误 lxc-start: sshd-1: con...

暧暧远人村,依依墟里烟 ... 727

Linux系统安全加固指南(万字长文)

本指南旨在说明如何尽可能地加强Linux的安全性和隐私性,并且不限于任何特定的指南。免责声明:如果您不确定自己在做什么,请不要尝试在本文中使用任何内容。本指南仅关注安全性和隐私性,而不关注...

架构文摘 1340

Linux Capabilities 入门教程(包含自己的理解)

10分钟 理解 Linux Capabilities (内涵自己的见解)后续会加实战篇

Jack_chao_的博客 3280
上一篇: watch_mount(), watch_sb(), and fsinfo() (again)
下一篇: LWN大作:Android display pipeline本身以及进程调度!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值