CKS认证 | Day3 K8s容器运行环境安全加固

news2025/3/31 21:24:17

一、最小特权原则(POLP)

1)最小特权原则 (Principle of least privilege,POLP) :
是一种信息安全概念,即为用户提供执行其工作职责所需的最 小权限等级或许可。 最小特权原则被广泛认为是网络安全的最佳实践,也是保护高价值数据和资产的特权访问的基本方式。

2)最小特权原则 (POLP) 重要性:

  • 减少网络攻击面:当今,大多数高级攻击都依赖于利用特权凭证。通过限制超级用户和管理员权限,最小权限执行有 助于减少总体网络攻击面。
  • 阻止恶意软件的传播: 通过在服务器或者在应用系统上执行最小权限,恶意软件攻击(例如SQL注入攻击)将很难 提权来增加访问权限并横向移动破坏其他软件、设备。
  • 有助于简化合规性和审核:许多内部政策和法规要求都要求组织对特权帐户实施最小权限原则,以防止对关键业务系 统的恶意破坏。最小权限执行可以帮助组织证明对特权活动的完整审核跟踪的合规性。

3)在团队中实施最小特权原则 (POLP) :

  • 在所有服务器、业务系统中,审核整个环境以查找特权帐户(例如SSH账号、管理后台账号、跳板机账号);
  • 减少不必要的管理员权限,并确保所有用户和工具执行工作时所需的权限;
  • 定期更改管理员账号密码;
  • 监控管理员账号操作行为,告警通知异常活动。


二、AppArmor 限制容器对资源访问

AppArmor(Application Armor) 是一个 Linux 内核安全模块,可用于限制主机操作系统上运行的进程的功能。每个 进程都可以拥有自己的安全配置文件。安全配置文件用来允许或禁止特定功能,例如:网络访问、文件读/写/执行权限等。(类似SELinux)

AppArmor 对操作系统和应用程序所受到的威胁进行从内到外的保护,简单的说,AppArmor 是与 SELinux 类似的一个访问控制系统,通过它可以指定程序可以读、写或运行哪些文件,是否可以打开 网络端口等。作为对传统 Unix 的自主访问控制模块的补充,AppArmor 提供了强制访问控制机制,它 已经被整合到 2.6 版本的 Linux 内核中。目前 Ubuntu 自带了 Apparmor。

官网:AppArmor - Ubuntu Wiki

Linux发行版内置:Ubuntu、Debian

使用场景:AppArmor 可以配置为任何应用程序减少潜在的攻击面,并且提供更加深入的防御。 它通过调整配置文件进行配置,以允许特定程序或容器所需的访问, 如 Linux 权能字、网络访问、文件权限等。防止黑客在二进制目录下放如木马文件替换常用命令等。

2.1 Apparmor两种工作模式:

  1. Enforcement(强制模式) :在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条 件的程序会进行日志记录。(类似SELinux的enforcing)
  2. Complain(投诉模式):在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行 记录。一般用于调试。例如程序可以写一个在配置文件里注明只读的文件,但 Apparmor 不会对程序的行为进行限 制,只是进行记录。(类似SELinux的permissive)

常用命令:
参考:Ubuntu Manpage: apparmor_parser - loads AppArmor profiles into the kernel

  • apparmor_status:查看AppArmor配置文件的当前状态的
  • apparmor_parser:将AppArmor配置文件加载到内核中
    • apparmor_parser <profile>        # 加载到内核中
    • apparmor_parser -r <profile>     # 重新加载配置
    • apparmor_parser -R <profile>    # 删除配置
  • aa-complain:将AppArmor配置文件设置为投诉模式,需要安装apparmor-utils软件包
  • aa-enforce:将AppArmor配置文件设置为强制模式,需要安装apparmor-utils软件包

2.2 K8s使用AppArmor的先决条件:

K8s版本v1.4+,检查是否支持:kubectl describe node | grep AppArmor

  • Linux内核已启用AppArmor,查看cat /sys/module/apparmor/parameters/enabled
  • CRI 容器运行时 需要支持AppArmor,目前Docker已支持

官网:使用 AppArmor 限制容器对资源的访问 | Kubernetes

示例:AppArmor 目前处于测试阶段,因此在注解中指定AppArmor策略配置文件。

apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor
  annotations:
    container.apparmor.security.beta.kubernetes.io/<container_name>: localhost/<profile_ref>
...
  • <container_name>     # Pod中容器名称
  • <profile_ref>     # Pod所在宿主机上策略名,默认目录/etc/apparmor.d/

补充:AppArmor 基于Linux内核实现,需要在宿主机上执行加载操作,kubelet会读取加载的配置文件应用到容器中,执行相应的策略限制(包括容器文件、目录、网络等)

2.3 访问控制与资源限制

1)文件系统的访问控制
Apparmor 可以对某一个文件,或者某一个目录下的文件进行访问控制,包括以下几种访问模式:

字符

描述

r

w

a

追加

k

文件锁定

l

链接

x

可执行

匹配目录和文件:

通配符

描述

示例

*

在目录级别匹配 零个或多个字符

/dir/* 匹配目录中的任何文件

/dir/a* 匹配目录中以a开头的任意文件

/dir/*.png 匹配目录中以.png结尾的任意文 件

/dir/a*/ 匹配/dir里面以a开头的目录

/dir/*a/ 匹配/dir里面以a结尾的目录

**

在多个目录级别 匹配零个或多个 字符

/dir/** 匹配/dir目录或者/dir目录下任何文件 和目录

/dir/**/ 匹配/dir或者/dir下面任何目录

[]、[^]

字符串,匹配其 中任意字符

/dir/[^.]* 匹配/dir目录中以.之外的任何文件

/dir/**[^/] 匹配/dir目录或者/dir下面的任何 目录中的任何文件

在配置文件中的写法,如:/tmp r, (表示可对/tmp 目录下的文件进行读取)

注意:没在配置文件中列出的文件,程序是不能访问

2)资源限制
Apparmor 可以提供类似系统调用 setrlimit 一样的方式来限制程序可以使用的资源。要限制资源, 可在配置文件中这样写:
set rlimit [resource] <= [value],
其 resource 代表某一种资源,value 代表某一个值,要对程序可以使用的虚拟内存做限制时,可以 这样写:
set rlimit as<=1M, (可以使用的虚拟内存最大为 1M)

3)访问网络
Apparmor 可以程序是否可以访问网络进行限制,在配置文件里的语法是:
network [ [domain] [type] [protocol] ]
要让程序可以进行所有的网络操作,只需在配置文件中写:
network, 
要允许程序使用在 IPv4 下使用 TCP 协议,可以这样写:
network inet tcp,

使用Ubuntu搭建k8s环境下安装apparmor

apt-get install apparmor-utils apparmor-profiles apparmor-profiles-extra -y

注:Apparmor 的 profile 配置文件保存在目录/etc/apparmor.d,对应的日志3721
文件记录在 /var/log/messages


案例:限制容器对目录或者文件的访问

实施步骤:
1.将自定义策略配置文件保存到 /etc/apparmor.d/
2.加载配置文件到内核:apparmor_parser <profile>
3.创建Pod时,注解指定策略配置名

工作流程:


1)自定义策略配置文件

vi /etc/apparmor.d/k8s-deny-write
# include <tunables/global>    //导入依赖
profile k8s-deny-write flags=(attach_disconnected) {   //指定策略名
   # include <abstractions/base>
   file,              # 允许所有文件读写
   deny /bin/** w,    # 拒绝所有文件写
   deny /data/www/** w,
}
  • 第一行:导入依赖,遵循C语言约定
  • 第二行:指定策略名
  • 第三行:{} 策略块

2)加载配置文件到内核

# 查看加载的配置文件
apparmor_parser status

# 加载配置文件到内核
apparmor_parser k8s-deny-write

3)创建Pod并注解指定策略配置名YAML文件

apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor
  annotations:
    container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-deny-write
spec:
  nodeName: k8s-node1   # 由于策略是指定加载在宿主机,需要指定该宿主机节点
  containers:
  - name: hello
    image: busybox
    command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

注释:container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-deny-write

  • hello 指定的【spec】字段中创建的容器名字;表示对这个容器进行实在策略的应用。
  • localhost 表示指定本地的策略文件的策略名(注:是配置策略中的策略名,非文件名)


三、Seccomp 限制容器进程系统调用

对于 Linux 来说,用户层一切资源相关操作都需要通 过系统调用来完成;系统调用实现技术层次上解耦, 内核只关心系统调用API的实现,而不必关心谁调用的。

调用关系图:

Seccomp(Secure computing mode) 是一个 Linux 内核安全模块,可用于应用进程允许使用的系统调用。 容器实际上是宿主机上运行的一个进程,共享宿主机内核,如果所有容器都具有任何系统调用的能力,那么容器如果被 入侵,就很轻松绕过容器隔离更改宿主机系统权限或者进入宿主机。 使用Seccomp机制就可以限制容器系统调用,有效减少攻击面。

Linux发行版内置:CentOS、Ubuntu

K8s使用Seccomp的先决条件:

Seccomp在Kubernetes 1.3版本引入,在1.19版本成为GA版本,因此K8s中使用Seccomp可以通过以下两种方式:

  • <profile>   # Pod所在宿主机上策略文件名,默认目录:/var/lib/kubelet/seccomp

1)1.19版本之前

annotations:
  seccomp.security.alpha.kubernetes.io/pod: "localhost/<profile>"

2)1.19版本+

apiVersion: v1
kind: Pod
metadata:
  name: hello-seccomp
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: <profile>    # Pod所在宿主机上策略文件名,默认目录:/var/lib/kubelet/seccomp
  containers:
...


seccomp 基本配置文件包括三个元素:

  • defaultAction:在 syscalls部分未定义的任何 系统调用默认动作为允许
    • SCMP_ACT_ALLOW 允许
  • syscalls
    • names 系统调用名称,可以换行写多个
    • SCMP_ACT_ERRNO 阻止系统调用

示例:禁止容器使用chmod

1)自定义seccomp策略配置文件:

注意:Pod所在宿主机上配置策略文件,默认目录/var/lib/kubelet/seccomp(没有该目录则自己创建)

[root@k8s-node1-1-72 ~]# mkdir /var/lib/kubelet/seccomp
[root@k8s-node1-1-72 ~]# vi /var/lib/kubelet/seccomp/chmod.json
{
   "defaultAction": "SCMP_ACT_ALLOW",
   "syscalls": [
      {
        "names": [
           "chmod"
        ],
        "action": "SCMP_ACT_ERRNO"
      }
   ]
}

2)创建Pod并注解指定策略配置名YAML文件

[root@k8s-master-1-71 ~]# kubectl apply -f test-seccomp.yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello-seccomp
spec:
  nodeName: k8s-node1-1-72           # 由于策略是指定加载在宿主机,需要指定该宿主机节点
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: chmod.json     # 指定Pod所在宿主机上策略文件名
  containers:
  - image: busybox
    name: bs
    command:
    - sleep
    - 24h

测试:在Pod中授予 /etc/hosts 执行权限

[root@k8s-master-1-71 ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS        AGE
hello-seccomp               1/1     Running   0               5s
[root@k8s-master-1-71 ~]# kubectl exec -it hello-seccomp -- sh

/ # chmod +x /etc/hosts
chmod: /etc/hosts: Operation not permitted

示例:禁止容器使用mkdir

注意:编辑策略文件后,需要重启Pod才生效

vi /var/lib/kubelet/seccomp/chmod.json
{
   "defaultAction": "SCMP_ACT_ALLOW",
   "syscalls": [
      {
        "names": [
           "chmod",
           "mkdir"     # 注意:增加系统调用需要添加【,】
        ],
        "action": "SCMP_ACT_ERRNO"
      }
   ]
}

# 需要重启Pod,加载生效
[root@k8s-master-1-71 ~]# kubectl delete -f test-seccomp.yaml
[root@k8s-master-1-71 ~]# kubectl apply -f test-seccomp.yaml
[root@k8s-master-1-71 ~]# kubectl exec -it hello-seccomp -- sh
/ # mkdir /data
mkdir: can't create directory '/data': Operation not permitted

补充:大多数容器运行时都提供一组允许或不允许的默认系统调用。通过使用 runtime/default 注释 或将 Pod 或容器的安全上下文中的 seccomp 类型设置为 RuntimeDefault,可以轻松地在 Kubernetes 中应用默认值。

Docker默认配置说明:Seccomp security profiles for Docker | Docker Docs

课后作业

1、在工作节点上加载课堂上讲解的apparmor策略文件k8s-deny-write,并在 Pod中应用该策略
2、在工作节点上加载课堂上讲解的seccomp文件,禁止容器里使用chmod命令, 并在Pod中应用该策略
 

小结

本篇为 【Kubernetes CKS认证 DAY3】的开篇学习笔记,希望这篇笔记可以让您初步了解到 最小特权原则(POLP)、AppArmor 限制容器对资源访问,不妨跟着我的笔记步伐亲自实践一下吧!


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

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

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

相关文章

28_跨域

目录 promise promise的基本语法 async await try catch promise 静态方法 跨域 跨域的解决方案 1-cors ​编辑 2-jsonp方案 3-代理服务器 promise promise 是一个es6新增的语法 承诺的意思 作用:是专门用来解决回调地狱!!!! promise的基本语法 // 基本语法:// Pr…

Stable Diffusion太慢?国内Midjourney平替方案—商用合规部署

一、AI绘画商用核心痛点&#xff08;为什么需要替代Stable Diffusion/Midjourney&#xff1f;&#xff09; 1. 速度慢&#xff0c;高并发支持差 Stable Diffusion&#xff1a;单卡GPU生成1张图需3-10秒&#xff0c;并发超过10任务易崩溃Midjourney&#xff1a;排队制&#xf…

综述速读|086.04.24.Retrieval-Augmented Generation for AI-Generated Content A Survey

论文题目&#xff1a;Retrieval-Augmented Generation for AI-Generated Content: A Survey 论文地址&#xff1a;https://arxiv.org/abs/2402.19473 bib引用&#xff1a; misc{zhao2024retrievalaugmentedgenerationaigeneratedcontent,title{Retrieval-Augmented Generation…

JavaScript中的Math对象和随机数

目录 一、常用数学方法 1. 数值处理 2. 极值与运算 3. 三角函数&#xff08;参数为弧度&#xff09; 4. 对数与指数 5. 常量 二、随机数生成 Math.random() 1. 基础范围控制 2. 整数随机数 三、实际应用场景 1. 随机颜色生成 2. 数组随机排序 3. 概率控制 四、注…

lxd-dashboard 图形管理LXD/LXC

前言 LXD-WEBGUI是一个完全用AngularJS编写的Web应用程序,无需应用服务器、数据库或其他后端服务支持。只需要简单地托管静态HTML和JavaScript文件,就能立即投入使用。这个项目目前处于测试阶段,提供了直观的用户界面,帮助用户便捷地管理和控制LXD实例。 安装lxd-dashboa…

python纯终端实现图片查看器(全彩)(windows)

很多人作为命令行爱好者&#xff0c;无法在终端内直接查看图片是无法忍受的&#xff0c; 那就写一个&#xff01; 先直接上代码 import os import sys from PIL import Image import numpy as np import colorama import msvcrt # Windows专用# 初始化colorama colorama.ini…

【动态规划篇】- 路径问题

62. 不同路径 题目链接&#xff1a; 62. 不同路径 题目解析&#xff1a; 状态表示 dp[i][j]表示&#xff1a;以[i][j]为终点时&#xff0c;一共有多少种路径。 状态转移方程 以[i][j]最近的几步来分析问题&#xff0c;要么从[i-1][j]位置向下走一步到达[i][j],要么从[i][j-1…

《新凯来:半导体设备制造领域的“国家队”》

《新凯来&#xff1a;半导体设备制造领域的“国家队”》 一、SEMICON China 爆火出圈&#xff1a;31 款设备背后的 “深圳力量” 1.1 展会现象级热度 在 2025 年 SEMICON China 展会现场&#xff0c;新凯来展台成了整届展会当之无愧的 “顶流”&#xff0c;被来自全球各地的专…

AI大模型最新发布[update@202503]

OpenAI GPT-4o&#xff1a;多模态&#xff0c;“o”代表Omni&#xff0c;即全能的意思&#xff0c;凸显了其多功能的特性。 多模态交互&#xff0c;GPT-4o可以接受文本、音频和图像的任意组合作为输入&#xff0c;并生成文本、音频和图像的任意组合输出。实时推理能力&#x…

深入浅出 Embedding

1. 什么是 Embedding? Embedding(嵌入)是一种将高维数据映射到低维连续空间的技术,用于表达数据的语义关系。简单来说,它是一种向量化表示,将文本、图像、用户行为等信息转换为数值向量,使得相似的数据在向量空间中距离更近。 2. 如何理解 Embedding? 2.1 浅显易懂的…

java项目之基于ssm的乡镇自来水收费系统(源码+文档)

项目简介 乡镇自来水收费系统实现了以下功能&#xff1a; 乡镇自来水收费系统在Eclipse环境中&#xff0c;使用Java语言进行编码&#xff0c;使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务&#xff0c;其管理员管理水表&#xff0c;审核用户更换…

Spring AI MCP 架构详解

Spring AI MCP 架构详解 1.什么是MCP? MCP 是一种开放协议&#xff0c;它对应用程序向大语言模型&#xff08;LLMs&#xff09;提供上下文信息的方式进行了标准化。可以把 MCP 想象成人工智能应用程序的 USB-C 接口。就像 USB-C 为将设备连接到各种外围设备和配件提供了一种…

目标识别与双目测距(1)环境搭建:Ubuntu+yolov5+pcl库

环境情况 ubuntu 18.04 → 20.04&#xff08;最终&#xff09; 安装Ubuntu1804虚拟机系统 Anaconda&#xff1a;可参考我的另一篇文章 Python 3.6.13 → 3.8&#xff08;最终&#xff09;Anaconda3-2021.05 目标识别&#xff1a;YOLOv5相关 1、安装git sudo apt install gi…

OpenAI API - Agent

文章目录 代理概述模型工具知识与记忆防护栏编排入门 语音代理选择正确的架构语音到语音&#xff08;多模态&#xff09;架构链式架构 构建语音代理使用语音到语音架构进行实时处理将音频输入链接到文本处理 → 音频输出 代理 了解如何使用 OpenAI API 构建代理。 https://pl…

Strawberry perl的下载,查询版本号,配置Path环境变量,查找perl解释器的位置

Strawberry Perl 是一个适用于 Microsoft Windows 的 Perl 环境&#xff0c;包含运行和开发 Perl 应用程序所需的一切。它旨在尽可能接近 UNIX 系统上的 Perl 环境。 下载 官网: Strawberry Perl for Windows - Releases 各个版本: Strawberry Perl for Windows - Releases …

MySQL的基础语法2(函数-字符串函数、数值函数、日期函数和流程函数 )

目录 一、字符串函数 1.常见字符串函数 ​编辑 2.字符串函数的基本使用 3.字符串函数的数据库案例演示 二、数值函数 1.常见数值函数&#xff08;如下&#xff09;&#xff1a; 2.数值函数的基本使用 3.数值函数的数据库案例演示 三、日期函数 1.常见的日期函数 2.日…

5G_WiFi_CE_杂散测试

目录 一、规范要求 1、法规目录&#xff1a; 2、限值&#xff1a; &#xff08;1&#xff09;带外发射杂散 &#xff08;2&#xff09;带内发射杂散 &#xff08;3&#xff09;接收杂散 二、测试方法 1、带外发射杂散 &#xff08;1&#xff09;测试条件 &#xff08…

大数据Spark(五十五):Spark框架及特点

文章目录 Spark框架及特点 一、Spark框架介绍 二、Spark计算框架具备以下特点 Spark框架及特点 一、Spark框架介绍 Apache Spark 是一个专为大规模数据处理而设计的快速、通用的计算引擎。最初由加州大学伯克利分校的 AMP 实验室&#xff08;Algorithms, Machines, and Pe…

UI产品经理基础(六):如何解决用户的质疑?

在需求调查中遇到用户质疑“不专业”或“不了解需求”&#xff0c;本质上是用户对产品经理的信任缺失或沟通鸿沟导致的。要化解这种质疑&#xff0c;需从专业能力展示、沟通方式优化、用户参与感提升三个维度切入&#xff0c;结合具体场景采取针对性策略。以下是系统化的解决方…

【大数据技术】大数据技术概念及概述

1. 大数据概念 数据 是实时或观察的结果是对客观事务的逻辑归纳是用于表示客观事物的未经加工的原始素材 数据的产生 对客观事务的计量和记录尝试的数据 单位换算1 byte8 bit1 k1024 byte1 mb1024 k1 g1024 m1 t1024 g1 p1024 t1 e1024 p1 z1024 e1 y1024 z1 b1024 y1 n10…