安全上下文(Security Context)定义 Pod 或 Container 的的权限和访问控制。 安全上下文包括但不限于:

  • 自主访问控制(Discretionary Access Control):基于 用户 ID(UID)和组 ID(GID). 来判定对对象(例如文件)的访问权限。

  • 安全性增强的 Linux(SELinux: 为对象赋予安全性标签。

  • 以特权模式或者非特权模式运行。

  • Linux 权能: 为进程赋予 root 用户的部分特权而非全部特权。

  • AppArmor:使用程序框架来限制个别程序的权能。

  • Seccomp:过滤进程的系统调用。

  • AllowPrivilegeEscalation:控制进程是否可以获得超出其父进程的特权。 此布尔值直接控制是否为容器进程设置 no_new_privs标志。 当容器以特权模式运行或者具有 CAP_SYS_ADMIN 权能时,AllowPrivilegeEscalation 总是为 true。

  • readOnlyRootFilesystem:以只读方式加载容器的根文件系统。

以上条目不是安全上下文设置的完整列表 – 请参阅 SecurityContext 了解其完整列表。

为 Pod 设置安全性上下文

要为 Pod 设置安全性设置,可在 Pod 规约中包含 securityContext 字段。securityContext 字段值是一个 PodSecurityContext 对象。你为 Pod 所设置的安全性配置会应用到 Pod 中所有 Container 上。 下面是一个 Pod 的配置文件,该 Pod 定义了 securityContext 和一个 emptyDir 卷:

apiVersion: v1
kind: Pod
metadata:name: security-context-demo
spec:securityContext:runAsUser: 1000runAsGroup: 3000fsGroup: 2000volumes:- name: sec-ctx-volemptyDir: {}containers:- name: sec-ctx-demoimage: busyboxcommand: [ "sh", "-c", "sleep 1h" ]volumeMounts:- name: sec-ctx-volmountPath: /data/demosecurityContext:allowPrivilegeEscalation: false

在配置文件中,runAsUser 字段指定 Pod 中的所有容器内的进程都使用用户 ID 1000 来运行。runAsGroup 字段指定所有容器中的进程都以主组 ID 3000 来运行。 如果忽略此字段,则容器的主组 ID 将是 root(0)。 当 runAsGroup 被设置时,所有创建的文件也会划归用户 1000 和组 3000。 由于 fsGroup 被设置,容器中所有进程也会是附组 ID 2000 的一部分。 卷 /data/demo 及在该卷中创建的任何文件的属主都会是组 ID 2000。

创建该 Pod:

kubectl apply -f https://k8s.io/examples/pods/security/security-context.yaml

检查 Pod 的容器处于运行状态:

kubectl get pod security-context-demo

开启一个 Shell 进入到运行中的容器:

kubectl exec -it security-context-demo -- sh

在你的 Shell 中,列举运行中的进程:

ps

输出显示进程以用户 1000 运行,即 runAsUser 所设置的值:

PID   USER     TIME  COMMAND1 1000      0:00 sleep 1h6 1000      0:00 sh
...

在你的 Shell 中,进入 /data 目录列举其内容:

cd /data
ls -l

输出显示 /data/demo 目录的组 ID 为 2000,即 fsGroup 的设置值:

drwxrwsrwx 2 root 2000 4096 Jun  6 20:08 demo

在你的 Shell 中,进入到 /data/demo 目录下创建一个文件:

cd demo
echo hello > testfile

列举 /data/demo 目录下的文件:

ls -l

输出显示 testfile 的组 ID 为 2000,也就是 fsGroup 所设置的值:

-rw-r--r-- 1 1000 2000 6 Jun  6 20:08 testfile

运行下面的命令:

id

输出为:

uid=1000 gid=3000 groups=2000

你会看到 gid 值为 3000,也就是 runAsGroup 字段的值。 如果 runAsGroup 被忽略,则 gid 会取值 0(root),而进程就能够与 root 用户组所拥有以及要求 root 用户组访问权限的文件交互。

退出你的 Shell:

exit

为 Pod 配置卷访问权限和属主变更策略

FEATURE STATE: Kubernetes v1.20 [beta]

默认情况下,Kubernetes 在挂载一个卷时,会递归地更改每个卷中的内容的属主和访问权限,使之与 Pod 的 securityContext 中指定的 fsGroup 匹配。 对于较大的数据卷,检查和变更属主与访问权限可能会花费很长时间,降低 Pod 启动速度。 你可以在 securityContext 中使用 fsGroupChangePolicy 字段来控制 Kubernetes 检查和管理卷属主和访问权限的方式。

fsGroupChangePolicy - fsGroupChangePolicy 定义在卷被暴露给 Pod 内部之前对其 内容的属主和访问许可进行变更的行为。此字段仅适用于那些支持使用 fsGroup 来 控制属主与访问权限的卷类型。此字段的取值可以是:

  • OnRootMismatch:只有根目录的属主与访问权限与卷所期望的权限不一致时, 才改变其中内容的属主和访问权限。这一设置有助于缩短更改卷的属主与访问 权限所需要的时间。
  • Always:在挂载卷时总是更改卷中内容的属主和访问权限。

例如:

securityContext:runAsUser: 1000runAsGroup: 3000fsGroup: 2000fsGroupChangePolicy: "OnRootMismatch"

说明: 此字段对于secretconfigMapemptydir 这类临时性存储无效。

为 Container 设置安全性上下文

若要为 Container 设置安全性配置,可以在 Container 清单中包含 securityContext 字段。securityContext 字段的取值是一个 SecurityContext 对象。你为 Container 设置的安全性配置仅适用于该容器本身,并且所指定的设置 在与 Pod 层面设置的内容发生重叠时,会重载后者。Container 层面的设置不会影响 到 Pod 的卷。

下面是一个 Pod 的配置文件,其中包含一个 Container。Pod 和 Container 都有 securityContext 字段:

apiVersion: v1
kind: Pod
metadata:name: security-context-demo-2
spec:securityContext:runAsUser: 1000containers:- name: sec-ctx-demo-2image: gcr.io/google-samples/node-hello:1.0securityContext:runAsUser: 2000allowPrivilegeEscalation: false

创建该 Pod:

kubectl apply -f https://k8s.io/examples/pods/security/security-context-2.yaml

验证 Pod 中的容器处于运行状态:

kubectl get pod security-context-demo-2

启动一个 Shell 进入到运行中的容器内:

kubectl exec -it security-context-demo-2 -- sh

在你的 Shell 中,列举运行中的进程:

ps aux

输出显示进程以用户 2000 账号运行。该值是在 Container 的 runAsUser 中设置的。 该设置值重载了 Pod 层面所设置的值 1000。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
2000         1  0.0  0.0   4336   764 ?        Ss   20:36   0:00 /bin/sh -c node server.js
2000         8  0.1  0.5 772124 22604 ?        Sl   20:36   0:00 node server.js
...

退出你的 Shell:

exit

kubernetes资源对象之security context相关推荐

  1. kubernetes资源对象kind

    PetSet首次在K8S1.4版本中,在1.5更名为StatefulSet.除了改了名字之外,这一API对象并没有太大变化. 注意:以下内容的验证环境为CentOS7.K8S版本1.5.2,并部署Sk ...

  2. Kubernetes资源清单篇:如何创建资源?

    在Kubernetes中所有操作的内容,我们都称为"资源对象",是由API Server基于HTTP/HTTPS接收并响应客户端的操作请求,是一种Restful风格的接口,将各种组 ...

  3. kubernetes安全:RBAC,Security Context,PSP,准入控制器

    文章目录 RBAC 权限控制前言 API 对象 RBAC 只能访问某个 namespace 的普通用户 创建用户凭证 创建角色 创建角色权限绑定 测试 只能访问某个 namespace 的 Servi ...

  4. Kubernetes(十九)Security Context(一)

    一    官网文档 Pod 安全性标准 为 Pod 或容器配置安全性上下文 Pod的安全策略 二    Security Context (1)背景引入 说明:'privileged'(特权模式) ' ...

  5. kubernetes 五种核心资源对象简介

    Namespace Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离. 默认情况下,kubernetes集群中的所有的Po ...

  6. Kubernetes — 核心资源对象 — Namespace

    目录 文章目录 目录 Namespace 基于层级命名空间的多租户模型 使用示例 Namespace Namespace 提供了一种逻辑划分 Cluster Resources 的方法,K8s 具有以 ...

  7. client-go入门之3:解析 yaml 文件并创建 k8s 资源对象

    我们使用 k8s 提供的命令行工具 kubeclt 可以很方便地使用kubectl apply -f xx.yaml从 yaml 文件创建 k8s 的资源对象,但使用 client-go 的时候,通常 ...

  8. 源码解读:KubeVela 是如何将 appfile 转换为 K8s 特定资源对象的

    作者 | 樊大勇 KubeVela 是一个简单易用又高度可扩展的云原生应用管理引擎,是基于 Kubernetes 及阿里云与微软云共同发布的云原生应用开发模型 OAM 构建. KubeVela 基于 ...

  9. Kubernetes Service 对象的使用

    我们前面的课程中学习了Pod的基本用法,我们也了解到Pod的生命是有限的,死亡过后不会复活了.我们后面学习到的RC和Deployment可以用来动态的创建和销毁Pod.尽管每个Pod都有自己的IP地址 ...

最新文章

  1. Iptables 表和链之间的关系【未完成】
  2. js调用QQ进程的方法总结
  3. tensorflow函数总结
  4. 有关short与int的重载[jase基础]
  5. eslint检测node 内部模块报错解决方案
  6. 服务器物理内存只增不降,服务器内存不断增加
  7. Python生成带自定义信息和头像图片的二维码
  8. 监听 html dom 变化,js怎么监听元素属性变化
  9. 多线程的那点儿事(之多线程调试)
  10. python鼠标移动_python自动化之鼠标移动
  11. java tracert_超强的Tracert工具(WinMTR)
  12. 图扑软件2D与2.5D案例合集|智慧园区、数据中心、SMT 生产线...
  13. c语言32关键字详解pdf,C语言32个关键字.pdf
  14. 前端实现打印功能(纯前端实现)
  15. win10计算机禁用用户账户控制,Win10系统用户帐户控制提示怎么取消 关闭用户账户控制的3种方法...
  16. RE:Working outside of application context
  17. 小草与大树的一分钟演讲
  18. mybatis官方文档中文版
  19. JS学习之路,菜鸟总结的注意事项及错误更正
  20. SPI DMA发送接收数据

热门文章

  1. 第六届数学、计算机与生命科学交叉研究青年学者论坛 (大牛云集的生信会议,免注册费且提供午餐)...
  2. Python使用matplotlib可视化散点图、使用seaborn中的lmplot函数使用多子图可视化不同分组的散点图最优拟合线性回归曲线
  3. R语言ggplot2可视化散点图、移除可视化图像中的网格线(remove gridlines)
  4. pandas创建内容全是0的dataframe、pandas基于随机整数、随机浮点数创建dataframe(random numbers)
  5. R语言数据格式转换函数、数据类型判断函数(numeric、character、vector、matrix、data.frame、factor、logical)、R语言数据格式类型转换
  6. R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,使x轴和Y轴的标签文本都使用粗体字体)、注意是轴标签而非轴标题
  7. R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
  8. R语言parse函数、deparse函数、expression函数实现字符串和表达式的转换实战
  9. python使用正则表达式删除字符串中的其它字符只保留数字和字母
  10. 使用python函数计算3.5四舍五入的结果_python 数字的四舍五入-Go语言中文社区