K8s: 运行Pod时的root用户和非root用户的安全相关配置

关于 root 用户


1 )概述

  • docker 容器运行起来,默认是 root 用户
  • 这样运行起来后,基本不会遇到权限相关问题
  • 带来的问题是: 权限过大,被攻击后会遇到严峻挑战
  • 基于这个问题,K8s提出了特权用户的概念
  • 在容器启动时,虽然启动的是 root 用户,但是不具备所有root功能
  • 只是一个映射的root用户,如果不开启 privilege 试图修改系统关键信息
  • 是会报错的,加上 --privilege 之后,就是一个特权用户,就可以进行修改

2 )正常场景

  • $ docker run -it busybox sh
  • $ whoami 这里显示 root
  • $ id -u 0
  • $ hostname db3437d25c87
  • $ sysctl kernel.hostname=wwwwwwww sysctl: error setting key ‘kernel.hostname’: Read-only file system

3 )启用 privileged

  • $ docker run -it --privileged busybox sh
  • $ sysctl kernel.hostname=wwwwwwww kernel.hostname = wwwwwwww
  • $ hostname wwwwwwww

4 )在 yaml 中配置 securityContext 和 privileged

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    securityContext:
      privileged: true

非 root 用户

  • 对容器越权访问控制,K8s 提供 securityContext 这一概念
  • 它提供一个非root用户运行容器的能力
  • 容器对root用户本身是有一定自我保护能力的
  • root权限太大,更安全方式是设定好用户和组来运行

1 )先不进行权限处理

  • 默认是root权限,但是root权限本身收到一定的限制
  • 但是root总是不太安全的
  • security.yaml
    apiVersion: v1  
    kind: Pod  
    metadata:
      name: security-context  
      labels:  
        name: security-context  
    spec:  
      volumes:  
        - name: security  
          emptyDir: {} # 这是一个 Pod 内部的临时目录  
      containers:  
        - name: busybox  
          image: busybox  
          command: ["sh", "-c", "sleep 1h"]  
          resources:  
            limits:  
              memory: "64Mi"  
              cpu: "500m"  
          volumeMounts:  
            - name: security # 注意,这个名字需要与卷定义中的 name 匹配  
              mountPath: /data/demo  
          securityContext:  
            privileged: false # 是否以特权模式运行容器  
            allowPrivilegeEscalation: false # 是否允许权限提升
    
  • $ kubectl apply -f security.yaml 创建 pod
    pod/security-context created
    
  • $ kubectl get pod -w | grep secu 查询 pod 状态
    security-context   1/1     Running            0                 21s
    
  • $ kubectl exec -it security-context -- sh 进入容器(pod内一个容器不用-c指定)
  • $ id 查看 id 信息
    uid=0(root) gid=0(root) groups=0(root),10(wheel)
    
  • $ ps 查看进程
    PID   USER     TIME  COMMAND
        1 root      0:00 sh -c sleep 1h
       12 root      0:00 sh
       19 root      0:00 ps
    
  • $ cd /data/demo && ls -la
    total 0
    drwxrwxrwx    2 root     root             6 Apr 19 04:25 .
    drwxr-xr-x    3 root     root            18 Apr 19 04:26 ..
    
  • 好,从上面可以看到都是 root 权限,现在我们进行修改

2 )添加 securityContext 配置

  • 要为 Pod 设置安全性设置,可在 Pod 规约中包含 securityContext 字段
  • 为 Pod 所设置的安全性配置会应用到 Pod 中所有 Container 上
  • 清理刚才的pod, 并对之前 yaml 文件进行编辑
  • 在 security.yaml 中添加 securityContext 更多的配置
  • 注意这个配置的位置,在 spec 下面第一个位置
    spec:
      securityContext:
        runAsUser: 1000
        runAsGroup: 3000
        fsGroup: 2000
    
    • 在配置文件中, runAsUser 字段指定 Pod 中的所有容器内的进程都使用用户 ID 1000 来运行
    • runAsGroup 字段指定所有容器中的进程都以主组 ID 3000 来运行
    • 如果忽略此字段,则容器的主组 ID 将是 root(0)
    • 当 runAsGroup 被设置时,所有创建的文件也会划归用户 1000 和组3000
    • 由于 fsGroup被设置,容器中所有进程也会是附组 ID 2000 的一部分
    • 卷 /data/demo 及在该卷中创建的任何文件的属主都会是组 ID 2000
  • 重新运行起来后,进入容器
  • $ kc exec -it security-context -- sh
  • $ id
    uid=1000 gid=3000 groups=2000,3000
    
    • 你会看到 gid 值为 3000,也就是 runAsGroup 字段的值
    • 如果 runAsGroup 被忽略,则 gid 会取值 0(root)
    • 而进程就能够与 root 用户组所拥有以及要求 root 用户组访问权限的文件交互
  • $ ps
    PID   USER     TIME  COMMAND
        1 1000      0:00 sh -c sleep 1h
        7 1000      0:00 sh
       15 1000      0:00 ps
    
  • $ cd /data/demo && ls -la
    total 0
    drwxrwsrwx    2 root     2000             6 Apr 19 04:42 .
    drwxr-xr-x    3 root     root            18 Apr 19 04:42 ..
    
  • 从上面可以看到用户权限变更了,这样在受到攻击的时候,会尽可能减少损失

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang 采集爬虫如何配置代理 IP

在 Golang 中配置代理 IP,可以通过设置 http.Transport 的 Proxy 属性来实现: 下述代码中的 代理IP 和 端口 替换为实际的代理服务器地址和端口,然后运行该程序即可通过代理服务器访问对应网站。 package mainimport ("fmt""…

超详细的Maven安装与使用还有内容讲解

文章目录 作用简介模型仓库 安装配置IDEA配置Maven坐标概念主要组成 IDEA创建Maven项目基本使用常用命令生命周期使用坐标导入jar包 注意事项清理maven仓库更新索引依赖 作用 Maven是专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化…

MATLAB实现禁忌搜索算法优化柔性车间调度fjsp

禁忌搜索算法的流程可以归纳为以下几个步骤: 初始化: 利用贪婪算法或其他局部搜索算法生成一个初始解。清空禁忌表。设置禁忌长度(即禁忌表中禁止操作的期限)。邻域搜索产生候选解: 通过特定的搜索算子(如…

AWS账号注册以及Claude 3 模型使用教程!

哈喽哈喽大家好呀,伙伴们!你听说了吗?最近AWS托管了大热模型:Claude 3 Opus!想要一探究竟吗?那就赶紧来注册AWS账号吧!别担心,现在注册还免费呢!而且在AWS上还有更多的大…

【北京迅为】《iTOP-3588开发板系统编程手册》-第10章 存储映射 I/O

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

Spark-Scala语言实战(17)

我带着大家一起来到Linux集群环境下,学习我们的spark。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言实战(16&#x…

基于Springboot的社区帮扶对象管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的社区帮扶对象管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…

微信小程序日期增加时间完成订单失效倒计时(有效果图)

效果图 .wxml <view class"TimeSeond">{{second}}</view>.js Page({data: {tiem_one:,second:,//倒计时deadline:,},onLoad(){this.countdown();},countdown(){let timestamp Date.parse(new Date()) / 1000;//当前时间戳let time this.addtime(2024…

数据结构- 顺序表-单链表-双链表 --【求个关注!】

文章目录 一 顺序表代码&#xff1a; 二 链表单链表双向链表 一 顺序表 顺序表是线性表的一种 所谓线性表指一串数据的组织存储在逻辑上是线性的&#xff0c;而在物理上不一定是线性的 顺序表的底层实现是数组&#xff0c;其由一群数据类型相同的元素组成&#xff0c;其在逻辑…

JVM知识点总结二

参考文章&#xff1a;【Java面试题汇总】JVM篇&#xff08;2023版&#xff09;_jvm面试题2023-CSDN博客 1、说说你了解的JVM内存模型&#xff1a; JVM由三部分组成&#xff1a;类加载子系统、运行时数据区、执行引擎 JVM内存模型&#xff1a; 内存模型里的运行时数据区&#…

STM32实现硬件I2C通讯,读取MPU6050的ID号

今天学习了使用硬件I2C的方式成功读取MPU6050的ID号&#xff0c;特此记录一下过程&#xff1a; 首先需要学习的是MPU6050的初始化&#xff1a; 第一步&#xff1a;打开GPIOB的时钟&#xff08;因为I2C2的引脚10,11在GPIOB上&#xff09; 第二步&#xff1a;打开I2C2的时钟 …

LLAMA 3的测试之旅:在GPT-4的阴影下前行

Meta终于发布了他们长期期待的LLAMA 3模型&#xff0c;这是一个开源模型&#xff0c;实际上提供了一系列新的功能&#xff0c;使得模型在回答问题时表现得更好。这对AI社区来说是一个真正的里程碑事件。 Meta正在发布新版本的Meta AI&#xff0c;这是一种可以在他们的应用程序和…

用Python在PDF文档中插入单图像水印和平铺图像水印

PDF文档因其跨平台兼容性和内容保真度成为信息交换的标准载体&#xff0c;为应对版权侵犯、内容篡改以及未经授权的传播等风险&#xff0c;向PDF中插入图片水印成为一种强化文档安全性、彰显所有权及实施访问控制的有效手段。图片水印不仅能以直观的方式标示文档来源、强化版权…

Git学习笔记(三)Git分支

Git分支是Git中非常重要的一个概念&#xff0c;无论是个人开发还是多人协作中&#xff0c;分支都起着至关重要的作用。几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能&#xff0c;以免影响…

Discuz! X3.4 升级至 Discuz! X3.5 详细教程

第一步&#xff1a;从其他以前的 Discuz! X 版本升级Discuz! X3.4 请先升级到Discuz! X3.4&#xff0c;升级教程网上比较普遍&#xff0c;在此不再论述。 第二步&#xff1a;Discuz! X3.4 升级至 Discuz! X3.5 &#xff08;Discuz 从 X3.5 以后&#xff0c;不在发布GBK版本&…

K8S基础概念

一、MASTER Kubernetes里的Master指的是集群控制节点&#xff0c;在每个Kubernetes集群里都需要有一个Master来负责整个集 群的管理和控制&#xff0c;基本上 Kubernetes的所有控制命令都发给它&#xff0c;它负责具体的执行过程&#xff0c;我们后 面执行的所有命 令基本都…

测试数据整理--chatgpt 构造sql语句导出数据库数据

在测试过程中&#xff0c;我们有时候需要准备一些测试数据&#xff0c;若从系统中直接导出Excel数据&#xff0c;数据往往庞大且需要整合&#xff0c;不好整理&#xff0c;于是我们直接去数据库中查询一些表&#xff0c;数据整合后直接导出结果会更方便。 我们今天就 用 chatg…

云原生Kubernetes: K8S 1.29版本 部署Jenkins

目录 一、实验 1.环境 2.K8S 1.29版本 部署Jenkins 服务 3.jenkins安装Kubernetes插件 二、问题 1.创建pod失败 2.journalctl如何查看日志信息 2.容器内如何查询jenkins初始密码 3.jenkins离线安装中文包报错 4.jenkins插件报错 一、实验 1.环境 &#xff08;1&…

npm最新淘宝镜像站已经更新registry(2024-04-19)

1、npm替换地址 旧的 https://registry.npm.taobao.org 已替换为 https://registry.npmmirror.com 淘宝镜像的淘宝官方提供的方法&#xff08;最新的源配置&#xff09; npm config set registry https://registry.npmmirror.com 镜像站网址&#xff1a; npmm…

ELK日志采集系统

1.什么是ELK ELK 是一套流行的数据搜索、分析和可视化解决方案&#xff0c;由三个开源项目组成&#xff0c;每个项目的首字母合起来形成了“ELK”这一术语&#xff1a; Elasticsearch (ES): Elasticsearch 是一个基于 Apache Lucene 构建的分布式、实时搜索与分析引擎。它能够…
最新文章