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.rhkb.cn/news/43415.html

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

相关文章

项目-苍穹外卖(十七) Apache POI+导出数据

一、介绍 二、入门案例 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.io.FileNotFoundException; import jav…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…

Cannot find a valid baseurl for repo: centos-sclo-sclo/x86_64

​ rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-latest-5.0.el7.noarch.rpmyum clean allyum macache fast​ 编辑配置文件 /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository. [zabbix-frontend]...enabled1... 下载相关…

【STM32】WDG看门狗(学习笔记)

学习来源----->江协科技STM32 WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长…

Nginx RTMP 服务器开发设计与实现

引言 Nginx 是一个高性能的 Web 服务器和反向代理服务器&#xff0c;广泛应用于大规模网站的高并发访问中。RTMP&#xff08;Real-Time Messaging Protocol&#xff09;是由 Adobe 提出的一个用于流媒体传输的协议&#xff0c;广泛应用于视频直播领域。通过 Nginx 的 RTMP 模块…

plantsimulation编辑图标怎么把图标旋转90°

1、打开要旋转的图标&#xff0c;点击“导出” 2、随意设置个文件名&#xff0c;点击保存。 3、用画图打开&#xff0c;点击旋转后保存。 4、新建一个图标&#xff0c;点击导入&#xff0c;选择刚刚保存的文件即可。

Jmeter性能测试

Jmeter性能测试 一、性能测试介绍 1、什么叫做性能测试&#xff1f; &#xff08;1&#xff09;通过某些工具或手段来检测软件的某些指标是否达到了要求&#xff0c;这就是性能测试 &#xff08;2&#xff09;指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系…

OpenCV基础——梯度计算、边缘检测、图像金字塔

接上期&#xff1a; OpenCV基础——图像滤波和形态学操作-CSDN博客 一.梯度计算 上贴已经讲过&#xff0c;梯度可以浅显地理解为图像中发生颜色变化的局部区域&#xff0c;也即边界点。本质上是通过构造与卷积核相同的矩阵&#xff0c;计算边缘区域像素点的差异值——也即梯度…

英语学习笔记1

目录 第一部分 例句解析 句子一 原文&#xff1a;Learning English is never easy but always rewarding!翻译&#xff1a;学习英语从来都不容易但总是有回报的&#xff01; 句子二 原文&#xff1a;Sometimes the detailed work of understanding grammar and building v…

测试测试 测试

**非常详细的视频和文字教程&#xff0c;讲解常见的openmv教程包括 巡线、物体识别、圆环识别、阈值自动获取等。非常适合学习openmv、K210、K230等项目 视频合集链接在 openmv教程合集 openmv入门到项目开发 openmv和STM32通信 openmv和opencv区别 openmv巡线 openmv数字识别教…

CSS rem、vw/vh、less

目录 分辨率、视口与二倍图 一、分辨率与像素基础 1. 物理像素&#xff08;Physical Pixels&#xff09; 2. 逻辑像素&#xff08;CSS 像素&#xff09; 二、视口&#xff08;Viewport&#xff09;控制 1. 视口类型 2. 设置理想视口 三、二倍图&#xff08;Retina/HiD…

【数电】半导体存储电路

组合逻辑电路输入和输出之间是确定关系&#xff0c;与之前的历史记录没有任何关系。时序逻辑电路则有相应的存储元件&#xff0c;要把之前的状态保存起来。 要构成时序逻辑电路&#xff0c;必须要有相应的存储元件&#xff0c;第五章讲述相应的存储元件 一、半导体存储电路概…

OPPO手机如何实时翻译会议视频?视频翻译轻松应对多语言场景

在全球化日益深入的今天&#xff0c;跨语言沟通已成为职场和生活中的常见需求。无论是参加国际会议、观看外语视频&#xff0c;还是与海外客户交流&#xff0c;语言障碍都可能成为效率的绊脚石。幸运的是&#xff0c;OPPO手机凭借其强大的功能和智能化设计&#xff0c;为用户提…

28_跨域

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

LeetCode Hot100 刷题笔记(4)—— 二叉树、图论

目录 一、二叉树 1. 二叉树的深度遍历&#xff08;DFS&#xff1a;前序、中序、后序遍历&#xff09; 2. 二叉树的最大深度 3. 翻转二叉树 4. 对称二叉树 5. 二叉树的直径 6. 二叉树的层序遍历 7. 将有序数组转换为二叉搜索树 8. 验证二叉搜索树 9. 二叉搜索树中第 K 小的元素 …

【漏洞复现】Apache Tomcat partial PUT文件上传反序列化漏洞复现(CVE-2025-24813)

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 0x00 免责声明 本文所述漏洞复现方法仅供安全研究及授权测试使用&#xff1b;任何个人/组织须在合法合规…

BurpSuit抓包失败-基础配置

问题描述&#xff1a;当开启拦截抓包的时候&#xff0c;burpsuite没有反应&#xff0c;好不容易经过一通配置&#xff0c;浏览器出现无法访问的情况。 解决办法&#xff1a; 下载浏览器插件 首先下载一个代理转换插件&#xff1a;Omega&#xff0c;这样比较方便&#xff0c;…

求解AX=XB 方法

一、简介 一文浅谈旋转变换&#xff1a;旋转矩阵、旋转向量、欧拉角、四元数-CSDN博客 在机器人学、计算机视觉和几何学中&#xff0c;经常会遇到求解矩阵方程 AXXB 的问题。这种方程通常出现在坐标系变换、手眼标定&#xff08;Hand-Eye Calibration&#xff09;等场景中。理…

AnimateCC基础教学:随机抽取获奖名单及奖品-V1.0原型版

舞台界面设计: 主轴第一帧代码&#xff1a; this.btnObj.addEventListener("click", updateStage.bind(this)); createjs.Ticker.addEventListener("tick", updateRandom.bind(this)) var _this this; var bPlaying false; var nameList ["张三…

深入了解Linux内核:task_struct结构详解

Linux 操作系统的广袤世界里&#xff0c;进程管理宛如一座大厦的基石&#xff0c;支撑着整个系统的稳定运行与高效运转 。而task_struct结构体&#xff0c;无疑是进程管理这座大厦的核心支柱&#xff0c;它承载着进程的关键信息&#xff0c;贯穿于进程从诞生到消亡的整个生命周…