K8s容器运行环境安全加固

news2024/12/25 1:22:58

K8s容器运行环境安全加固

image-20230528102956392

目录

文章目录

    • K8s容器运行环境安全加固
    • 目录
    • 1、最小特权原则(POLP)
    • 2、AppArmor限制容器对资源访问
    • 3、Seccomp 限制容器进程系统调用
    • 关于我
    • 最后

1、最小特权原则(POLP)

**最小特权原则 (Principle of least privilege,POLP) :**是一种信息安全概念,即为用户提供执行其工作职责所需的最小权限等级或许可。

最小特权原则被广泛认为是网络安全的最佳实践,也是保护高价值数据和资产的特权访问的基本方式。

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

• **减少网络攻击面:**当今,大多数高级攻击都依赖于利用特权凭证。通过限制超级用户和管理员权限,最小权限执行有助于减少总体网络攻击面。

阻止恶意软件的传播: 通过在服务器或者在应用系统上执行最小权限,恶意软件攻击(例如SQL注入攻击)将很难提权来增加访问权限并横向移动破坏其他软件、设备。

有助于简化合规性和审核:许多内部政策和法规要求都要求组织对特权帐户实施最小权限原则,以防止对关键业务系统的恶意破坏。最小权限执行可以帮助组织证明对特权活动的完整审核跟踪的合规性。

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

• 在所有服务器、业务系统中,审核整个环境以查找特权帐户(例如SSH账号、管理后台账号、跳板机账号);

• 减少不必要的管理员权限,并确保所有用户和工具执行工作时所需的权限;

• 定期更改管理员账号密码;

• 监控管理员账号操作行为,告警通知异常活动。

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

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

Linux发行版内置:Ubuntu、Debian centos里默认没有内置AppArmor。与其同功能的程序centos里是selinux(但是selinux使用起来相对比较复杂,因此工作环境里一般都是关闭状态的)

Apparmor两种工作模式:

• Enforcement(强制模式) :在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条件的程序会进行日志记录。

• Complain(投诉模式):在这种模式下,配置文件里的限制条件不会得到执行,Apparmor只是对程序的行为进行记录。一般用于调试。

常用命令:

• 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软件包

K8s使用AppArmor的先决条件:

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

• Linux内核已启用AppArmor,查看 cat /sys/module/apparmor/parameters/enabled

• 容器运行时需要支持AppArmor,目前Docker已支持

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4OJZ9tr-1685312843674)(https://bucket-hg.oss-cn-shanghai.aliyuncs.com/img/image-20230527074341706.png)]

image-20230527074412195

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

image-20230527074834938

💘 案例:容器文件系统访问限制-2023.5.28(测试成功)

步骤:

1、将自定义策略配置文件保存到/etc/apparmor.d/

2、加载配置文件到内核:apparmor_parser

3、Pod注解指定策略配置名

本次测试为ubuntu k8s环境,这里只做文档记录。

image-20230527075100044

  • 创建pod

image-20230527075228892

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ym0xBr9f-1685312843676)(https://bucket-hg.oss-cn-shanghai.aliyuncs.com/img/image-20230527075255959.png)]

  • 默认情况,在容器里是可以随意创建文件的

image-20230527075342825

  • 限制容器某个目录/文件的目的

黑客攻击场景,限制容器进程对其它特定目录/文件的写入

  • 创建策略文件

image-20230527080041960

image-20230527080200129

相当于一个黑名单,黑名单之外的都可以。

usr/bin等目录。

  • 将策略文件加载到内核中(注意:这里在是node1上配置的

image-20230527080705657

image-20230527080734017

  • Pod注解指定策略配置名

image-20230527080822987

image-20230527080852401

image-20230527080914366

是宿主机的能力,宿主机对容器上的进程做访问控制,因为容器是宿主机上的一个进程。

  • 部署

image-20230527081149521

  • 验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmOoLUsj-1685312843679)(https://bucket-hg.oss-cn-shanghai.aliyuncs.com/img/image-20230527081218351.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M3dRLnXK-1685312843679)(https://bucket-hg.oss-cn-shanghai.aliyuncs.com/img/image-20230527081335639.png)]

image-20230527081356813

image-20230527081424997

符合预期。

生产用的并不多,有一定复杂性,不用过多去研究它。

image-20230527081553317

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

image-20230527082024539

Seccomp(Secure computing mode) 是一个 Linux 内核安全模块,可用于应用进程允许使用的系统调用。

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

Linux发行版内置:CentOS、Ubuntu

💘 案例:Seccomp 限制容器进程系统调用-2023.5.28(测试成功)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HplzR0DM-1685312843680)(https://bucket-hg.oss-cn-shanghai.aliyuncs.com/img/image-20230527082841422.png)]

GA:毕业

image-20230527083157011

  • 实战步骤
实战步骤
1.随意查看一个容器
2.宿主机上创建配置文件
3.创建pod
4.测试
  • 实验环境
实验环境:
1、win10,vmwrokstation虚机;
2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
   k8s version:v1.20.0
   docker://20.10.7
  • 实验软件
链接:https://pan.baidu.com/s/12Gq4QoK3_iSbBOZslhhZJg?pwd=0820 
提取码:0820 
2023.5.28-seccomp-code

image-20230528104110266

1.随意查看一个容器

[root@k8s-master1 ~]#kubectl get po
NAME       READY   STATUS    RESTARTS   AGE
busybox    1/1     Running   10         6d10h
……
[root@k8s-master1 ~]#kubectl exec -it busybox -- sh
/ #
/ # chmod 777 /etc/hosts

默认,在容器里是可以执行chmod命令的。

接下来,我们将使用Seccomp 限制容器进程系统调用,阻止chmod命令的运行。

image-20230528072043935

有些命令对应的系统调用方法和命令名同名,但有些是不同的,这些需要注意下。

2.宿主机上创建配置文件

本次,我们在k8s-node2节点上配置策略文件。

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

3.创建pod

[root@k8s-master1 ~]#mkdir seccomp
[root@k8s-master1 ~]#cd seccomp/
apiVersion: v1
kind: Pod
metadata:
  name: hello-seccomp
spec:
  nodeName: "k8s-node2"
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: chmod.json
  containers:
  - image: nginx
    name: web
    
#部署:
[root@k8s-master1 seccomp]#kubectl apply -f pod.yaml 
pod/hello-seccomp created

4.测试

[root@k8s-master1 seccomp]#kubectl get po
NAME            READY   STATUS    RESTARTS   AGE
busybox         1/1     Running   10         6d10h
busybox2        1/1     Running   10         6d10h
hello-seccomp   1/1     Running   0          23s
py-k8s          1/1     Running   2          4d
web520          1/1     Running   0          2d23h
[root@k8s-master1 seccomp]#kubectl exec -it hello-seccomp -- bash
root@hello-seccomp:/# chmod 777 /etc/hosts 
root@hello-seccomp:/# 

哎,好奇怪,这个chmod命令依然还可以在这个容器里运行。

我们再换个busybox镜像再测试下:

[root@k8s-master1 seccomp]#cp  pod.yaml pod2.yaml
[root@k8s-master1 seccomp]#vim pod2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: hello-seccomp2
spec:
  nodeName: "k8s-node2"
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: chmod.json
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - 24h
      
#部署:
[root@k8s-master1 seccomp]#kubectl apply -f pod2.yaml
pod/hello-seccomp2 created

#测试:
[root@k8s-master1 seccomp]#kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
hello-seccomp    1/1     Running   0          4m26s
hello-seccomp2   1/1     Running   0          4s
[root@k8s-master1 seccomp]#kubectl exec -it hello-seccomp2 -- sh
/ #
/ # chmod 777 /etc/hosts
chmod: /etc/hosts: Operation not permitted
/ #

哇哦,这里使用busybox镜像测试,就符合预期效果了,但是前面的那个nginx镜像对chmod系统调用没有效果。

这里我们再增加下一条系统调用规则(阻止mkdir命令的使用)

#修改sccomp策略文件:
[root@k8s-node2 ~]#vi /var/lib/kubelet/seccomp/chmod.json
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
    {
        "names": [
            "chmod",
            "mkdir"
        ],
        "action": "SCMP_ACT_ERRNO"
    }
    ]
}

#创建新的测试pod
#这个需要重新创建pod才能生效:
#而AppArmor是修改就能生效,是加载到内核里的。
[root@k8s-master1 seccomp]#cp pod.yaml pod3.yaml
[root@k8s-master1 seccomp]#cp pod2.yaml pod4.yaml
[root@k8s-master1 seccomp]#vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello-seccomp3
spec:
  nodeName: "k8s-node2"
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: chmod.json
  containers:
  - image: nginx
    name: web
 
[root@k8s-master1 seccomp]#vim pod4.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: hello-seccomp4 
spec:
  nodeName: "k8s-node2"
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: chmod.json
  containers:
  - image: busybox
    name: busybox
    command:
      - sleep
      - 24h  
      
#部署:
[root@k8s-master1 seccomp]#kubectl apply -f pod3.yaml 
pod/hello-seccomp3 created
[root@k8s-master1 seccomp]#kubectl apply -f pod4.yaml
pod/hello-seccomp4 created

#测试:
[root@k8s-master1 seccomp]#kubectl get po
NAME             READY   STATUS    RESTARTS   AGE
……
hello-seccomp3   0/1     Error     2          25s
hello-seccomp4   1/1     Running   0          22s
[root@k8s-master1 seccomp]#kubectl logs hello-seccomp3 
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/05/27 23:40:25 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (1: Operation not permitted)
nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (1: Operation not permitted)

[root@k8s-master1 seccomp]#kubectl exec -it hello-seccomp4 -- sh
/ # chmod 777 /etc/hosts
chmod: /etc/hosts: Operation not permitted
/ # mkdir a
mkdir: can't create directory 'a': Operation not permitted
/ #

可以看到,nginx镜像的pod无法启动,报nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (1: Operation not permitted)错误。

说明禁用mkdir命令成功了,同样busybox镜像也是可以禁用成功的。

至于,chmod命令nginx镜像没能实现效果,可能和镜像有关吧(或者系统调用的名称不同)。

[root@k8s-master1 seccomp]#kubectl exec -it hello-seccomp -- bash  #(nginx镜像)
root@hello-seccomp:/# cat /etc/issue
Debian GNU/Linux 11 \n \l

测试结束。😘

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号
《云原生架构师实战》

image-20230107215126971

🍀 语雀

https://www.yuque.com/xyy-onlyone

image-20230515221819681

🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎
https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

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

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

相关文章

graalvm把java编译为c/c++能够使用的动态库(dll/so)

graalvm把java编译为c/c能够使用的动态库(dll/so) 1.安装graalvm oracle官方企业版 github的openjdk版本 1.1 下载对应系统版本&#xff0c;配置环境变量 本人环境 1. win10 openjdk 17.0.5 2022-10-18 OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 17.0.58-jv…

chatgpt赋能python:Python中的None值如何去掉?

Python中的None值如何去掉&#xff1f; Python是一种具有高度灵活性和可读性的编程语言&#xff0c;它有许多强大的功能&#xff0c;令许多开发人员喜欢使用它。然而&#xff0c;可能会遇到延迟或者None值的情况&#xff0c;这时需要我们找到正确的方法去除它们。 None值是什…

C#,码海拾贝(27)——求解“对称方程组”的“分解法”之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

happens-before规则

happens-before背景由来 happens-before的概念最初由Leslie Lamport在其一篇影响深远的论文&#xff08;《Time&#xff0c;Clocks and the Ordering of Events in a Distributed System》&#xff09;中提出。Leslie Lamport使用 happens-before 来定义分布式系统中事件之间…

【利用AI让知识体系化】7种结构型模式

文章目录 结构型模式简介适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式 结构型模式 简介 在设计模式中&#xff0c;结构型模式用于描述如何将对象和类组装成较大的结构&#xff0c;并灵活地处理对象之间的关系。 结构型模式包括以下几种&#xff1a; 适配器…

驱动开发——嵌入式(驱动)软开基础(十)

1. 64位的计算机有哪些优点&#xff1f; &#xff08;1&#xff09;可以进行更大范围的整数计算。 &#xff08;2&#xff09;可以支持更大的内存&#xff0c;虚拟内存空间大小一般为2^48&#xff08;256TB&#xff09;。64位的Linux一般使用48位表示虚拟内存空间地址&#x…

esp8266 OTA远程无线升级

第一步、编译生成.bin升级固件 本教程需要用到 arduino IDE的esp8266开发环境,关于arduino IDE 的ESP8266环境配置可参考:环境配置: 点击跳转 如果已安装好esp8266 开发环境,继续: 使用arduino IDE软件,打开随便一个需要升级的程序,点击「项目」-「导出已编译的二进制…

【Bug 全解决】 Java、Spring boot 后端项目 Bug 总结

Bug 收集与总结 本文记录的是 SpringBoot 后端项目使用和运行代码时所遇到的各种问题&#xff0c;全部都已解决&#xff0c;欢迎在评论区补充你遇到的 Bug 哦&#xff01;仅以本文记录学习社区项目时&#xff0c;所遇到的奇奇怪怪的 bug&#xff0c;以及一些很愚蠢的错误&…

Golang每日一练(leetDay0080) 矩形面积、翻转二叉树

目录 223. 矩形面积 Rectangle Area &#x1f31f;&#x1f31f; 226. 翻转二叉树 Invert Binary Tree &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

RPC原理与实现

rpc叫做远程过程调用&#xff0c;是指一台机器上的服务通过通信协议调用网络中另一台机器上的程序&#xff0c;并拿到结果。 1、基本流程 基本流程为&#xff1a; 客户端程序通过Client Stub调度rpc函数Client Stub将调用方法、参数按照通信协议序列化成网络二进制数据&#…

koa2中HTTP错误处理

HTTP错误 访问 Web 服务器或应用程序时&#xff0c;服务器收到的每个 HTTP 请求都会以 HTTP 状态代码进行响应。 HTTP 状态代码是三位数代码&#xff0c;分为五个不同的类别。 状态代码的类别可以通过它的第一个数字快速识别&#xff1a; 1xx&#xff1a;信息2xx&#xff1a…

“大娘,你听说过ChatGPT吗?”,“你说的那个什么鸡皮蹄,我这饼里加不了!”

最近看到一个有意思的段子&#xff0c;大概意思是&#xff1a; 年轻人去买煎饼&#xff0c;问摊煎饼的大娘知不知道什么是ChatGPT。 大娘摇了摇头&#xff1a;“你说的那个什么鸡皮蹄&#xff0c;我这饼里加不了”。 年轻人尝试跟大娘解释ChatGPT是什么东西&#xff0c;大娘…

快速上手kettle(二)小试牛刀

快速上手kettle二 小试牛刀 一 、前言二 、两个小目标三、 kettle核心概念介绍3.1 转换3.1.1 步骤(Step)3.1.2 跳&#xff08;Hop&#xff09;3.1.3 元素据3.1.4 数据类型3.1.5 并发执行 3.2 作业 四、实践操作4.1 案例1 将csv文件转换成excel文件4.1.1 在kettle中新建一个转换…

在Node.js中接受来自命令行的输入

目录 1、简介 2、readlineSync 3、列表选择一个项目&#xff1a; 4、类似滑块范围的UI: 1、简介 如何制作一个Node.js CLI程序使用内置的readline Node.js模块进行交互 如何制作一个节点js CLI程序交互&#xff1f; Node.js 从版本7起开始提供了readline模块来执行以下操…

styleFlow数学推导

如果 w 和 z 的变换是线性的&#xff0c;即 w az b&#xff0c;那么 dw a dz&#xff0c; 所以 p(w) dw p(z) dz 等价于 p(w) a p(z) 即 w 的概率密度函数是 z 的概率密度函数乘以一个常数因子。 如果 w 和 z 是通过一个可逆的函数 ϕ 相互转换的&#xff0c;即 w ϕ(…

5.29今日黄金最新行情走势分析及多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;上周五(5月26日)美市尾盘&#xff0c;现货黄金收报1946.01美元/盎司&#xff0c;上升4.76美元或0.25%&#xff0c;日内最高触及1957.31美元/盎司&#xff0c;最低触…

1.3 eBPF的工作原理初探 --- 更新中

写在前面 上一节提到过,eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。 我们用一张原理图来看下eBPF程序的编译,加载,验证,钩子,映射等结点。 如上是…

Java学习路线(16)——异常

一、异常 1、概念&#xff1a; 程序在“编译”或“执行”时可能出现的问题。&#xff08;语法错误不算异常&#xff09; 2、常见的异常 数组索引越界空指针日期格式化… 3、作用&#xff1a; 触发异常后&#xff0c;如果没有提前处理&#xff0c;JVM将终止&#xff0c;提高…

chatgpt赋能python:Python中None的使用详解

Python中None的使用详解 在Python语言中&#xff0c;None是一个非常常见的值&#xff0c;它在代码中用来表示空值或未定义的值。本文将介绍Python中None的使用方式&#xff0c;包括创建和比较None对象&#xff0c;以及在函数和类中使用None的方法。 创建和比较None对象 在Py…

chatgpt赋能python:Python中Key的作用及使用方法

Python中Key的作用及使用方法 在Python中&#xff0c;key是一个十分重要的概念。它在数据结构中经常被使用&#xff0c;例如list、dict、set、tuple等等。本文将重点介绍Python中key的作用和使用方法&#xff0c;帮助读者更好地理解和应用它。 什么是Key 首先&#xff0c;我…