Kubernetes 1.31 新功能: 细粒度补充组控制

news2024/9/27 19:24:41

这篇文章讨论了 Kubernetes 1.31 中的一个新特性,用于改善 Pod 中容器的补充组(Fine-grained SupplementalGroups control)处理。

动机:在容器镜像中的 /etc/group 定义的隐式组成员身份

尽管这种行为可能并不受许多 Kubernetes 集群用户/管理员的欢迎,但 Kubernetes 默认情况下会将 Pod 中的组信息与容器镜像中 /etc/group 定义的信息进行合并。

让我们来看一个例子,下面的 Pod 在其安全上下文中指定了 runAsUser=1000runAsGroup=3000supplementalGroups=4000

apiVersion: v1
kind: Pod
metadata:
  name: implicit-groups
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    supplementalGroups: [4000]
  containers:
  - name: ctr
    image: registry.k8s.io/e2e-test-images/agnhost:2.45
    command: [ "sh", "-c", "sleep 1h" ]
    securityContext:
      allowPrivilegeEscalation: false

ctr 容器中执行 id 命令的结果是什么?

# 创建 Pod:
$ kubectl apply -f https://k8s.io/blog/2024-08-22-Fine-grained-SupplementalGroups-control/implicit-groups.yaml

# 验证 Pod 的容器正在运行:
$ kubectl get pod implicit-groups

# 检查 id 命令
$ kubectl exec implicit-groups -- id

然后,输出应该类似于这样:

uid=1000 gid=3000 groups=3000,4000,50000

即使在 Pod 的清单中根本没有定义 50000,补充组中的组 ID 50000 来自哪里?答案是容器镜像中的 /etc/group 文件。

检查容器镜像中的 /etc/group 的内容应该显示如下:

$ kubectl exec implicit-groups -- cat /etc/group
...
user-defined-in-image:x:1000:
group-defined-in-image:x:50000:user-defined-in-image

啊哈!容器的主用户 1000 在最后一个条目中属于组 50000

因此,容器镜像中为容器的主用户定义的组成员身份被隐式地合并到来自 Pod 的信息中。请注意,这是当前 CRI 实现从 Docker 继承的设计决策,社区直到现在才真正重新考虑它。

这有什么问题?

容器镜像中的 /etc/group 隐式合并的组信息可能会引起一些关注,特别是在访问卷时(详见 kubernetes/kubernetes#112879),因为文件权限由 Linux 中的 uid/gid 控制。更糟糕的是,来自 /etc/group 的隐式 gids 无法被任何策略引擎检测/验证,因为在清单中没有隐式组信息的线索。这也可能是 Kubernetes 安全方面的一个关注点。

为了解决上述问题,Kubernetes 1.31 引入了 Pod 的 .spec.securityContext 中的新字段 supplementalGroupsPolicy

此字段提供了一种控制如何计算 Pod 中容器进程的补充组的方法。可用的策略如下:

  • 合并:容器的主用户在 /etc/group 中定义的组成员身份将被合并。如果没有指定,将应用此策略(即向后兼容的当前行为)。

  • 严格:它只附加在 fsGroupsupplementalGroupsrunAsGroup 字段中指定的组 ID 作为容器进程的补充组。这意味着容器镜像中为主用户定义的任何组成员身份都不会被合并。

让我们看看 Strict 策略是如何工作的。

# 创建 Pod:
$ kubectl apply -f https://k8s.io/blog/2024-08-22-Fine-grained-SupplementalGroups-control/strict-supplementalgroups-policy.yaml

# 验证 Pod 的容器正在运行:
$ kubectl get pod strict-supplementalgroups-policy

# 检查进程身份:
kubectl exec -it strict-supplementalgroups-policy -- id

输出应该类似于这样:

uid=1000 gid=3000 groups=3000,4000

你可以看到 Strict 策略可以排除 groups 中的组 50000

因此,确保 supplementalGroupsPolicy: Strict(由某些策略机制强制执行)有助于防止 Pod 中的隐式补充组。

Pod 状态中的附加进程身份

此功能还通过 .status.containerStatuses[].user.linux 字段公开了附加到容器的第一个进程的进程身份。这将有助于查看是否附加了隐式组 ID。

...
status:
  containerStatuses:
  - name: ctr
    user:
      linux:
        gid: 3000
        supplementalGroups:
        - 3000
        - 4000
        uid: 1000
...

特性可用性

要启用 supplementalGroupsPolicy 字段,必须使用以下组件:

  • Kubernetes:v1.31 或更高版本,启用了 SupplementalGroupsPolicy 特性门控。截至 v1.31,该门控标记为 alpha。
  • CRI 运行时:
    • containerd:v2.0 或更高版本
    • CRI-O:v1.31 或更高版本

你可以在节点的 .status.features.supplementalGroupsPolicy 字段中查看特性是否受支持。

apiVersion: v1
kind: Node
...
status:
  features:
    supplementalGroupsPolicy: true

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2089290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis安装+常用命令合集大全+Redis Desktop Manager

文章目录 一:Redis 简介二:安装和配置Redis第一步:下载Redis第二步:解压Redis第三步:配置Redis第四步:启动Redis服务器第五步:验证Redis安装第六步:设置Redis为全局命令 三&#xff…

不同品类商标一样属于侵权吗!

商标分类有45类,有网友问普推知产商标老杨,不同品类商标一样属于侵权吗,这个要从多个角度来分析,不同品类商标是相同一样的,这样的基本不侵权的。 在注册申请商标是会经常遇到别人在某类别注册,但是有一些类…

[Meachines] [Insane] Bankrobber XSS-MDOG+SQLI+XSRF+Local-RCE+Bankv2转账模拟应用缓冲区溢出

信息收集 IP AddressOpening Ports10.10.10.154TCP:80,443,445,3306 $ nmap -p- 10.10.10.154 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http …

各个击破:NetXpert XG2帮您解决“布线安装与维护”难题

在传输大量数据时,光纤变得越来越重要,而铜缆在未来也将继续发挥重要作用,因此我们不仅要比较两种类型布线的优缺点,还要探究光纤传输中的错误来源。 测试光缆传输损耗的准确性对于故障排除至关重要,特别是在光纤情况下…

hadoop技术

历史版本 HA:高可用 技术框架

[线程]线程不安全问题 --- 死锁

文章目录 一. 引出死锁二. 可重用锁三. 死锁的三种典型场景四. 死锁产生的四个必要条件(面试题)1. 锁具有互斥特性2. 锁不可抢占(不可被剥夺)3. 请求和保持4. 循环等待 五. 避免死锁问题 一. 引出死锁 class Counter{private int count;public void add(){synchronized(this){…

深度学习语义分割篇——DeeplabV3原理详解+源码实战

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊专栏推荐:深度学习网络原理与实战 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍🏼、…

域内安全:委派攻击

目录 域委派 非約束性委派攻击: 主动访问: 被动访问(利用打印机漏洞) 约束性委派攻击: 域委派 域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动。 委派是域中…

机器学习——决策树模型

决策树原理 算法概述 从根节点开始一步步走到叶子节点(决策) 所有数据最终都会落到叶子节点,既可以做分类也可以做回归 例如上例,输入一个数据后,先判断他的年龄,然后再判断性别 在决策树中&#xff0c…

day45.动态规划

1035.不相交的线: 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: nums1[i] nums2[j] 且绘制的直线不与任何其他连线(非水…

基站定位系统的创新应用:企业管理的新利器

在现代企业的管理中,基站定位系统已经成为不可或缺的技术手段。通过这一系统,企业能够实时掌握物资、人员的位置和状态,提升管理效率和安全性。常达智能物联凭借深厚的技术积累和丰富的项目经验,为各类企业提供了创新的基站定位系…

如何使用ChatGPT,提示词篇之【编程代码】

一、 ChatGPT可以做什么? ChatGPT能做的事情非常多!它不仅仅是一个对话AI。以下是一些主要功能: 1. 回答问题:无论是学术问题、技术问题,还是生活琐事,ChatGPT都能提供帮助。 2. 写作助手:可以…

Angular17(3):Angular项目中引入iconfont

在Angular项目中引入Iconfont(图标字体)是一个常见的需求,用于在应用中添加丰富的图标资源。 Iconfont-阿里巴巴矢量图标库 1、点击进入官网,注册并登录 2、登陆成功后,首页的 资源管理 > 我的项目 点击进入 3、…

网络通信---四次挥手

文章目录 概述四次挥手第一次挥手:第二次挥手:第三次挥手:第四次挥手: 问题:为什么是四次,而不是三次?确保数据传输完成:防止数据丢失:避免旧连接干扰:防止死…

C#的继承

继承是面向对象程序设计中最重要的概念之一.继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易,同时,也有利用重用代码和节省开发时间. 当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数只需要设计一个新的类,继承了已有的类的成员即可…

斯坦福UE4 C++课学习补充23:AI自定义任务

文章目录 一、自定义任务节点二、优化1. 子弹发射冷却2. 攻击时面朝玩家 一、自定义任务节点 本节需要创建自定义任务节点BTTask,实现小兵进入角色范围后进射击的功能。对于BTTaskNode的子类,我们需要在代码中重写ExecuteTask函数即可。返回值为EBTNode…

博客自建(带避坑指南)4:hexo文章页设置和动画魔改设置

咕咕了好久,这次终于来更新一下 看完上一篇博客: 博客自建(带避坑指南)3:简单的hexo网页界面设置-CSDN博客 想必你已经完成了头像、图片等一些基础的设置,但是这些改动都是比较基础的,现在我们…

【Java】MyBatis Plus 自动生成代码相关配置 (图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 认识依赖4.1.2 模板依赖4.1.2 代码生成相关依赖 4.2 自动生成代码4.2.1 认识…

钉钉-即时通讯-工作通知

钉钉-即时通讯-工作通知 钉钉官方文档创建以及获取应用配置代码创建工作通知工具类创建钉钉消息实体类好了接下来就可以直接使用了 钉钉官方文档 https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages 创建以及获取应用配置 1.进入…

最大池化、非线性激活、线性层

一、最大池化原理 二、最大池化实例 import torch import torchvision from torch import nn from torch.nn import MaxPool2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterdataset torchvision.datasets.CIFAR10("../c…