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

一、最小特权原则(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-apparmorannotations: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-apparmorannotations:container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-deny-write
spec:nodeName: k8s-node1   # 由于策略是指定加载在宿主机,需要指定该宿主机节点containers:- name: helloimage: busyboxcommand: [ "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: LocalhostlocalhostProfile: <profile>    # Pod所在宿主机上策略文件名,默认目录:/var/lib/kubelet/seccompcontainers:
...


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: LocalhostlocalhostProfile: chmod.json     # 指定Pod所在宿主机上策略文件名containers:- image: busyboxname: bscommand:- 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.mzph.cn/diannao/76225.shtml

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

相关文章

Linux wifi 驱动移植适配流程详解

基础内容概要 将tplink wn725n 无线网卡驱动移植到ubuntu将tplink wn725n 无线网卡驱动移植到Linux开发板&#xff08;交叉编译&#xff09;将tplink wn725n 无线网卡驱动移植到Linux开发板&#xff0c;在开发板中编译 为什么还要包涵交叉编译&#xff1f; 目标设备是ARM架构…

Day14 动态规划(3)

一.746. 使用最小花费爬楼梯 FS记忆化搜索优化: const int N 1010;class Solution { public:int mem[N];int dfs(vector<int>& cost, int x){if(mem[x]) return mem[x];int sum 0;if(x 0 || x 1) return 0;else{sum min(dfs(cost, x - 1) cost[x - 1], dfs(c…

解锁AI潜能:模型上下文协议(MCP)的革新与应用

解锁AI潜能:模型上下文协议(MCP)的革新与应用 在人工智能发展的当下,大语言模型(LLM)正逐步渗透到各个领域。从智能客服快速响应客户咨询,到智能编程助手协助开发者高效编写代码,LLM展现出强大的能力。然而,随着应用的深入会面临一个问题:模型与数据之间的连接困境。…

windows与ubuntu双硬盘双系统安装及启动(全流程成功)

&#x1f451;主页&#xff1a;吾名招财 &#x1f453;简介&#xff1a;工科学硕&#xff0c;研究方向机器视觉&#xff0c;爱好较广泛… ​&#x1f4ab;签名&#xff1a;面朝大海&#xff0c;春暖花开&#xff01; windows与ubuntu双硬盘双系统安装及启动&#xff08;全流程成…

【学习笔记】计算机网络(六)

第6章应用层 文章目录 第6章应用层6.1 域名系统DNS6.1.1 域名系统概述6.1.2 互联网的域名结构6.1.3 域名服务器域名服务器的分区管理DNS 域名服务器的层次结构域名服务器的可靠性域名解析过程-两种查询方式DNS 高速缓存机制 6.2 文件传送协议6.2.1 FTP 概述6.2.2 FTP 的基本工作…

Python扩展知识详解:lambda函数

目录 前言 1 基本知识点 语法 特点 代码示例 2 常见使用场景 1. 与高阶函数配合使用 2. 作为排序键来使用 3. 立即调用函数 4. 在字典中使用 3 高级用法&#xff08;进阶版&#xff09; 1. 多参数lambda 2. 设置默认参数 3. 嵌套lambda 注意事项 何时…

Android: Fragment 的使用指南

Android 中 Fragment 的使用指南 Fragment 是 Android 应用开发中的重要组件&#xff0c;它代表 Activity 中的一部分 UI 或行为&#xff0c;可以组合多个 Fragment 在一个 Activity 中构建多窗格 UI&#xff0c;并在不同 Activity 中重复使用某个 Fragment。 基本概念 Frag…

Vue React

Vue 的源码主要分为以下几个部分&#xff1a; 主要涉及 响应式、虚拟 DOM、组件系统、编译器、运行时。 ├── packages/ │ ├── compiler-core/ # 编译器核心 │ ├── compiler-sfc/ # 处理 .vue 单文件组件 │ ├── compiler-dom/ # 处理 DOM 相关…

项目实战--权限列表

后端数据&#xff1a; 用表格实现权限列表 const dataSource [{key: 1,name: 胡彦斌,age: 32,address: 西湖区湖底公园1号,},{key: 2,name: 胡彦祖,age: 42,address: 西湖区湖底公园1号,}, ];const columns [{title: 姓名,dataIndex: name,key: name,},{title: 年龄,dataInd…

私有知识库 Coco AI 实战(一):Linux 平台部署

Coco AI 是一个完全开源、跨平台的统一搜索和生产力工具&#xff0c;能够连接各种数据源&#xff0c;包括应用程序、文件、Google Drive、Notion、Yuque、Hugo 等&#xff0c;帮助用户快速智能地访问他们的信息。通过集成 DeepSeek 等大型模型&#xff0c;Coco AI 实现了智能个…

【大模型】微调一个大模型需要多少 GPU 显存?

视频链接&#xff1a;微调一个模型需要多少GPU显存&#xff1f; up 主页&#xff1a;AI老兵tags&#xff1a; #GPU显存 #模型微调 #LoRA #QLoRA #参数计算 本集视频详细介绍了在模型微调过程中 GPU显存需求的计算方法&#xff0c;包括全量微调和高效微调&#xff08;如 LoRA&am…

Lambda 表达式是什么以及如何使用

目录 &#x1f4cc; Kotlin 的 Lambda 表达式详解 &#x1f3af; 什么是 Lambda 表达式&#xff1f; &#x1f525; 1. Lambda 表达式的基本语法 ✅ 示例 1&#xff1a;Lambda 基本写法 ✅ 示例 2&#xff1a;使用 it 关键字&#xff08;单参数简化&#xff09; ✅ 示例 3…

全文 MLIR TOY -- Chapter2: 发出基本的 MLIR——把AST变成SSA的 MLIR Dialect IR

现在我们已经熟悉 Toy 语言和它的AST表示&#xff0c;现在让我们看看 MLIR 是怎样帮助编译 Toy 源程序的。 简介&#xff1a;多层中间表示 其他的编译器&#xff0c;像 LLVM&#xff0c;是提供一个固定的预定义类型和指令&#xff08;通常是底层的像 RISC的指令&#xff09;。对…

一个判断A股交易状态的python脚本

最近在做股票数据相关的项目&#xff0c;需要用到判断某一天某个时刻A股的状态&#xff0c;比如休市&#xff0c;收盘&#xff0c;交易中等&#xff0c;发动脑筋想了一下&#xff0c;这个其实还是比较简单的&#xff0c;这里我把实现方法分享给大家。 思路 当天是否休市 对于某…

LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版

LLaMA Factory微调后的大模型Chat对话效果&#xff0c;与该模型使用vLLM推理架构中的对话效果&#xff0c;可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定&#xff1a;有一半是对的&#xff0c;有一半是无关的。 1、未…

004 健身房个性化训练计划——金丹期(体态改善)

个人笔记使用。 01 肱骨前移 1.放松肩前束 2.放松肩后束 2.5kg哑铃侧展 泡沫轴上下滚 招财猫 肱二头 02 溜肩 宽距的坐姿划船 上顶

【已开源】UniApp+vue3跨端应用从0到1开发指南、uniapp+vue3模板应用

在跨端开发日益成为主流的今天&#xff0c;如何高效构建规范、可维护的企业级应用&#xff1f;本文以UniAppVue3* *TypeScript**为核心技术栈&#xff0c;手把手带你从零搭建高标准的跨平台项目。 通过本文&#xff0c;你将系统掌握&#xff1a; ✅ 环境配置&#xff1a;Node…

线程池设计

线程池实际上也是一个生产者消费者模型&#xff0c;线程池可以让多个线程去任务队列中取任务&#xff0c;执行任务&#xff0c;适用于需要大量的线程来完成任务且完成任务的时间较短。 #include "log.hpp" #include <mutex> #include <condition_variable&…

黑盒测试的正交实验法

背景: 利用因果图法、判定表法可以帮助我们对于输入数据的组合情况进行用例设计&#xff0c;但当输入数据的组合数量巨大时&#xff0c;由于不太可能覆盖到每个输入组合的测试情况&#xff0c;因果图法或判定表法可能就不太适用了&#xff0c;可以采用正交实验法、来合理地减少…

Linux内核编程

linux 系 统 在 2 4 4 0 上 的 启 动 过 程 分 三个 阶 段 u-boot的启动 1.先分清寄存器的分类 RAM的分类 ROM的分类 Mini2440开发板的存 储器配置 Mini2440开发板板载: 1. 64MB sdram; 2. 256MB nand-flash; 3. 2MB nor-flash; 4. s3c2440内部还有4KB iram; Mini2440的启…