云原生|kubernetes|pod或容器的安全上下文配置解析

news2024/11/18 12:45:07

前言:

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

  • 自主访问控制(Discretionary Access Control): 基于用户 ID(UID)和组 ID(GID) 来判定对对象(例如文件)的访问权限。
  • 安全性增强的 Linux(SELinux): 为对象赋予安全性标签。
  • 以特权模式或者非特权模式运行。
  • Linux 权能: 为进程赋予 root 用户的部分特权而非全部特权。
  • AppArmor:使用程序配置来限制个别程序的权能。

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

  • allowPrivilegeEscalation:控制进程是否可以获得超出其父进程的特权。 此布尔值直接控制是否为容器进程设置 no_new_privs标志。 当容器满足一下条件之一时,allowPrivilegeEscalation 总是为 true(一般是false的)

    • 以特权模式运行,或者
    • 具有 CAP_SYS_ADMIN 权能
  • readOnlyRootFilesystem:以只读方式加载容器的根文件系统(一般是true的,true时,exec进容器不能更改文件系统,例如,在容器内touch文件,删除文件,新建文件夹等等操作都会被禁止

一,

安全上下文的示例

没有配置安全上下文的pod:

[root@k8s-master ~]# cat nosecurity_pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
  name: busybox-nosecurity
spec:
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - image: busybox
    name: busybox-nosecurity
    command: [ "sh","-c","sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

配置了安全上下文的pod:

 cat security_pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
  name: busybox-security
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - image: busybox
    name: busybox-security
    command: [ "sh","-c","sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo2
    resources: {}
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

 若要为 Container 设置安全性配置,可以在 Container 清单中包含 securityContext 字段。securityContext 字段的取值是一个 SecurityContext 对象。你为 Container 设置的安全性配置仅适用于该容器本身,并且所指定的设置在与 Pod 层面设置的内容发生重叠时,会重写 Pod 层面的设置。Container 层面的设置不会影响到 Pod 的卷。说人话就是pod和容器两个层面都可以设置securitycontext,如果是多容器,比如,某个pod内有A和B两个容器,pod和容器B分别设置了securitycontext,那么,A容器使用pod的securitycontext,B容器使用它自己设置的securitycontext(这一段比较绕口,是需要仔细阅读理解的哦)

上面这个示例就仅仅设置了pod的securitycontext,但容器是继承了pod的securitycontext

进入没有配置安全上下文的pod:

可以看到是使用的root权限,可以任意做手脚

[root@k8s-master ~]# kubectl exec -it busybox-nosecurity -- /bin/sh
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
/ # 
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sleep 1h
   28 root      0:00 /bin/sh
   35 root      0:00 ps
/ # rm -rf 
.dockerenv  bin/        data/       dev/        etc/        proc/       root/       sys/        tmp/        usr/        var/
/ # rm -rf .dockerenv 
/ # 

进入配置了安全上下文的容器

可以看到无法使用root权限,安全性大大的提高了 

[root@k8s-master ~]# kubectl exec -it busybox-security -- /bin/sh
/ $ id
uid=1000 gid=3000 groups=2000
/ $ ps
PID   USER     TIME  COMMAND
    1 1000      0:00 sleep 1h
   25 1000      0:00 /bin/sh
   33 1000      0:00 ps
/ $ rm -rf home/
rm: can't remove 'home': Read-only file system
/ $ ls -al /data/demo2/
total 0
drwxrwsrwx    2 root     2000             6 Jan  8 20:00 .
drwxr-xr-x    3 root     root            19 Jan  8 20:00 ..
/ $ touch aaa
touch: aaa: Read-only file system

二,

精细化的安全上下文权限分配     capabilities

默认情况下 Docker 会删除必须的 capabilities 之外的所有 capabilities,因为在容器中我们经常会以 root 用户来运行,使用 capabilities 后,容器中的使用的 root 用户权限就比我们平时在宿主机上使用的 root 用户权限要少很多了,这样即使出现了安全漏洞,也很难破坏或者获取宿主机的 root 权限,所以 Docker 支持 Capabilities 对于容器的安全性来说是非常有必要的,当然,kubernetes的底层是docker,所以kubernetes也是支持capabilities的

在说到这个capabilities之前,需要说一下特权容器,一般的容器是无法获取宿主机的内核参数的,但某些情况下,有和宿主机的内核交互的需求,容器中有些应用程序可能需要访问宿主机设备、修改内核等需求,在默认情况下, 容器没这个有这个能力,这个时候,就需要特权容器了,但这个特权容器是非常不安全的:

containers:
- image: lizhenliang/flask-demo:root
  name: web
  securityContext:
    privileged: true

启用特权模式就意味着为容器提供了访问Linux内核的所有能力,这是很危险的,为了减少系统调用的供给,可以使用Capabilities为容器赋予仅所需的能力。 

这个capabilities不是特别常见,coredns的部署里可以看到:


        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            add:
            - NET_BIND_SERVICE
            drop:
            - all
          readOnlyRootFilesystem: true

具体的capabilities有哪些呢?capabilities(7) - Linux manual page  这个网站有比较详细的介绍,下图是一个简略的介绍:

 例如下面这个示例,容器虽然是root用户,但只给了一个无关紧要的kill 进程权限,因此,这个pod是无法ping其它的pod的

cat security_pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
  name: busybox-security
spec:
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - image: busybox
    name: busybox-security
    command: [ "sh","-c","sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo2
    resources: {}
    securityContext:
      capabilities:
        drop:
          - ALL
        add: ["KILL"]
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

进入容器后,虽然是root用户,但是是无法执行需要高网络权限的命令的(ping命令需要网络权限)

[root@k8s-master ~]# kubectl exec -it busybox-security -- /bin/sh
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
/ # ping 10.244.0.13
PING 10.244.0.13 (10.244.0.13): 56 data bytes
ping: permission denied (are you root?)

上述文件修改成如下:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
  name: busybox-security
spec:
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - image: busybox
    name: busybox-security
    command: [ "sh","-c","sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo2
    resources: {}
    securityContext:
      capabilities:
        drop:
          - ALL
        add: ["NET_ADMIN","NET_RAW"]
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

执行此文件后,就可以愉快的在容器内使用ping命令了:

[root@k8s-master ~]# kubectl exec -it busybox-security -- /bin/sh
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
/ # ping 10.244.0.13
PING 10.244.0.13 (10.244.0.13): 56 data bytes
64 bytes from 10.244.0.13: seq=0 ttl=62 time=1.142 ms
64 bytes from 10.244.0.13: seq=1 ttl=62 time=0.889 ms
^C
--- 10.244.0.13 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.889/1.015/1.142 ms

小结:

securitycontext是对于pod和容器的安全性提升有非常大帮助的一个选项,因此,如果没有测试的需求,最好还是启用securitycontext,并且禁用privileged特权容器,以免对宿主机造成破坏。

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

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

相关文章

【PAT甲级 - C++题解】1091 Acute Stroke

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:PAT题解集合 📝原题地址:题目详情 - 1091 Acute Stroke (pintia.cn) 🔑中文翻译:急性中风 📣专栏…

SAP灵活工作流Inbox收件箱数据展示

目录 任务说明展示流程内容 使用增强添加文本展示流程内容 自定义页面展示 任务说明展示流程内容 维护审批任务说明页签下的任务说明,支持多语种,支持使用变量; 变量只能使用容器中定义的变量,因此需要将要展示的数据绑定传输到…

【包装机】(队列+栈)

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品&#x…

C++动态链接库的使用

目录一 创建Windows动态链接库二 导出和查看DLL中的函数三 隐式链接方式加载DLL四 动态库和测试程序共用一份头文件五 从DLL中导出C类六 解决名称改编七 显式加载方式加载DLL一 创建Windows动态链接库 新建项目,选择Windows桌面向导,命名项目名称为Dll1…

GPDB中gp_vmem_protect_limit参数的意义

gp_vmem_protect_limit参数的意义1、gp_vmem_protect_limit参数说明1)在启用了基于资源队列的资源管理系统时,gp_vmem_protect_limit参数表示每个segment分配到的内存大小。预估值计算方式:所有GP数据库进程可用内存大小/发生故障时最大的primary segmen…

最优控制学习笔记2----泛函

文章目录泛函泛函定义泛函的变分自变量的变分泛函相近泛函距离泛函的连续性线性泛函泛函的变分泛函的极值泛函极值的定义泛函的极值泛函极值条件泛函 泛函定义 对于某一类函数集合{x(t)}\{x(t)\}{x(t)} 中的每一个函数 x(t)x(t)x(t), 在映射关系 JJJ 下均有一个确定的数与之对…

100天精通Python(数据分析篇)——第71天:Pandas文本数据处理方法之str/object类型转换、大小写转换、文本对齐、获取长度、出现次数、编码

文章目录每篇前言1. 文本数据类型介绍1)类型介绍2)类型转换3)类型区别区别1:统计字符串时区别2:检查字符串时2. Python字符串内置方法1) 大小写转换2) 文本对齐3)获取长度4)获取出现次数5&#…

js 右键弹出自定义菜单

演示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{margin…

Node.JS(2)--使用node执行js文件

目录 知识回顾 CommentJS规范 ECMAScript标准规范 模块化 CommonJS规范 模块化 知识回顾 I/O (Input/output) I/O操作指的是对磁盘的读写操作 Node Node是对ES标准一个实现&#xff0c;Node也是一个JS引擎通过Node可以使js代码在服务器端执行Node仅仅对ES标准进行了实…

“程序的编译+链接”,深入认识代码生成可执行程序的过程

目录 引入 编译 预编译 编译 汇编 链接 选项总结 记忆方法 运行环境 引入 博主认为学习本章内容&#xff0c;能够认识在代码跑的时候的过程。 首先&#xff0c;粗略笼统的认识程序运行过程的框架图。 编译 其次&#xff0c;再进行细化&#xff0c;细化编译的过程&…

人工智能轨道交通行业周刊-第29期(2023.1.2-1.8)

本期关键词&#xff1a;站台限界测量机器人、智慧云巴、钢轨伸缩调节器、国铁集团会议、4D毫米波雷达、车道线检测1 整理涉及公众号名单1.1 行业类RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道…

node.js+mysql博客全栈系统源码+数据库,含后台完整基础功能,小程序,web前台站点一键置灰,支持移动端适

一个 "开箱即用" 个人博客全栈系统项目&#xff01;下载地址&#xff1a;node.jsmysql博客全栈系统源码数据库 &#x1f96f; 预览 &#x1f440; 前台预览 &#x1f440; 管理端预览 &#x1f96f; v1.0.2 介绍 芒果’个人博客系统&#xff0c;包括前后台完整基…

Linux下buff/cache占用过大问题

当我们在命令行中执行free -h 查看内存时&#xff0c;发现buff/cache占用过大&#xff0c;导致其他软件没有内存可使用 从图上可以看出&#xff0c;buff/cache占用了1G多。 buff/cache是由于系统读写导致的文件缓存&#xff0c;没有及时释放。 解决方案&#xff1a;清理缓存 …

JWT JWT

JWT&#xff08;JSON WEB TOKEN&#xff09; JWT的组成 header&#xff08;头部&#xff09;&#xff1a;中主要存储了两个字段 alg&#xff0c;typ。 alg表示加密的算法默认&#xff08;HMAC SHA256&#xff09;&#xff0c;typ表示这个令牌的类型默认为JWT。 payload&#…

68、Learning Object-Compositional Neural Radi

简介 设计了一种新的双通路架构&#xff0c;其中场景分支编码场景几何和外观&#xff0c;而对象分支编码以可学习的对象激活码为条件的每个独立对象。为在严重杂乱的场景中生存训练&#xff0c;提出一种场景引导的训练策略&#xff0c;以解决遮挡区域的3D空间模糊性&#xff0c…

【ElasticSearch7.X】学习笔记(四)

【ElasticSearch7.X】学习笔记八、SpringData集成ElasticSearch8.1、框架8.1.1、SpringData8.1.2、Spring Data Elasticsearch8.2、搭建8.2.1、maven引入8.2.2、编写配置8.2.3、编写config8.2.4、Product类8.2.5、dao8.2.6、索引操作8.2.7、文档操作8.2.8、文档搜索八、SpringD…

基于 Tensorflow 2.x 从零训练 15 点人脸关键点检测模型

一、人脸关键点检测数据集 在计算机视觉人脸计算领域&#xff0c;人脸关键点检测是一个十分重要的区域&#xff0c;可以实现例如一些人脸矫正、表情分析、姿态分析、人脸识别、人脸美颜等方向。 人脸关键点数据集通常有 5点、15点、68点、96点、98点、106点、186点 等&#x…

ccc-sklearn-14-朴素贝叶斯(2)

文章目录sklearn中的其他贝叶斯算法一、MultinomialNB多项式贝叶斯sklearn中的MultinomialNB二、BernoulliNB伯努利朴素贝叶斯三、ComplementNB补集朴素贝叶斯案例&#xff1a;贝叶斯做文本分类sklearn中的其他贝叶斯算法 一、MultinomialNB多项式贝叶斯 基于原始的贝叶斯理论…

【openGauss实战2】客户端连接工具及配置

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61…

shell第七天练习

awk题目&#xff1a; 1、获取根分区剩余大小 2、获取当前机器ip地址 3、统计出apache的access.log中访问量最多的5个IP 4、打印/etc/passwd中UID大于500的用户名和uid 5、/etc/passwd 中匹配包含root或net或ucp的任意行 7、请打印出/etc/passwd 第一个域&#xff0c;并且在第一…