为何在Kubernetes容器中以root身份运行存在风险?

作者:马辛·瓦西奥内克(Marcin Wasiucionek)
在这里插入图片描述

引言

在Kubernetes安全领域,一个常见的建议是让容器以非root用户身份运行。但是,在容器中以root身份运行,实际会带来哪些安全隐患呢?在Docker镜像和Kubernetes配置中,这一最佳实践常常被重点强调。在Kubernetes清单文件中,可以通过以下代码实现:

securityContext:runAsNonRoot: true # 确保runAsUser指定的用户ID不是0。如果用户ID设置为0,Pod将无法运行。runAsUser: 1000 # 将容器中运行的进程的用户ID设置为1000。

你可以只设置runAsUser字段,而不包含runAsNonRoot。然而,如果你指定了runAsNonRoot,那么也必须定义runAsUser

容器以root身份运行为何危险⚠️

当容器以root身份运行时,会出现多种潜在的攻击途径。让我们通过实验来探究一下。

搭建实验环境🛠️

为了说明以root身份运行容器的风险,我们将使用两个相似的容器进行实际测试:

  1. 一个默认以root身份运行的alpine:3.20.2容器。
  2. 一个自定义的alpine:3.20.2容器,配置为以非root用户身份运行。

以下是用于创建非root容器的Dockerfile:

# 使用Alpine镜像作为基础镜像
FROM alpine:3.20.2# 添加一个名为'nonroot'的非root用户,用户ID为1000
RUN adduser -D -u 1000 nonroot# 将后续命令的用户设置为'nonroot'
USER nonroot
# 可选:设置默认命令
CMD ["sh"]

在本地环境中,我们使用Minikube 1.32.0和Kubernetes版本v1.28.3。通过以下命令构建镜像,并使其在Minikube集群中可用:

eval $(minikube docker-env)
docker build. -t nonroot:1.0.0

接下来,我们在Kubernetes中部署这些容器。在这个演示中,我使用hostPath卷来测试权限,不过强烈建议不要在家庭实验室之外使用hostPath(我会在另一篇文章中解释原因)!
root用户的Pod定义如下:

apiVersion: v1
kind: Pod
metadata:name: root
spec:containers:- name: alpineimage: alpine:3.20.2command: ["/bin/sh", "-c"]args: ["while true; do sleep 100; done"]volumeMounts:- mountPath: /hostname: hostvolumes:- name: hosthostPath:path: /etc/kubernetes/manifests # 挂载节点上的静态Pod目录type: Directory

非root用户的Pod定义如下:

apiVersion: v1
kind: Pod
metadata:name: nonroot
spec:containers:- name: alpineimage: nonroot:1.0.0command: ["/bin/sh", "-c"]args: ["while true; do sleep 100; done"]securityContext:runAsUser: 1000 # 确保容器以用户ID为1000的非root用户运行volumeMounts:- mountPath: /hostname: hostvolumes:- name: hosthostPath:path: /etc/kubernetes/manifests # 挂载节点上的静态Pod目录type: Directory
测试潜在攻击🧪
  1. 下载恶意软件🦠
    一种常见的攻击方式是下载并执行恶意软件包。我通过尝试从dev.to获取一些数据来测试这一点。
    在这里插入图片描述

由于容器中最初未安装curl,我尝试安装它:
在这里插入图片描述

在root容器中安装成功,但在非root容器中安装失败。让我们尝试获取数据。
在这里插入图片描述

在root容器中操作正常,但在非root容器中被阻止。这表明以非root用户身份运行可以有效地缓解这种攻击。其他措施,如使用只读文件系统,可以进一步增强安全性,我将在未来的文章中介绍。

  1. 访问主机资源🔒
    我将一个主机目录挂载到了Pod(再次强调 —— 请不要在家庭实验室之外这样做!)。通过这种访问权限,攻击者可以尝试访问包含静态Pod manifests 的目录,并尝试运行恶意Pod(尽管下载恶意镜像应该会被集群策略阻止)。这可以通过向静态清单目录(通常是Kubernetes节点上的/etc/kubernetes/manifests)添加新的清单文件来实现。有了这种访问权限,攻击者可以尝试:
    • 通过部署拦截集群内网络流量的Pod来执行中间人攻击,并捕获敏感信息。
    • 部署带有反向shell的后门Pod(你可以在https://www.revshells.com/ 找到示例),接受来自黑客机器的连接。
    • 运行一个Pod,将包含敏感数据的卷中的数据传输到外部实体。
    • 通过从ETCD存储中读取机密信息来扩大攻击范围,并进一步渗透基础设施。
    • 使用你的资源运行加密货币挖掘程序以获取经济利益。

让我们使用以下清单文件部署一个加密货币挖掘程序的模拟:

apiVersion: v1
kind: Pod
metadata:name: crypto - miner
spec:containers:- name: miner - containerimage: busyboxcommand: ["/bin/sh", "-c", "while true; do echo 'Mining in progress...'; sleep 5; done"]

并从两个Pod中添加静态Pod文件:
在这里插入图片描述

如你所见,非root用户的Pod上的命令被拒绝。它在root用户的Pod上成功运行,并将加密货币挖掘程序的清单文件添加到了静态Pod目录中。集群中创建了这个Pod吗?
在这里插入图片描述
是的,它在集群中运行,并且在出现故障或重启时将被重新调度。

攻击者通过访问节点上的hostPath还可以做的另一件事是读取主机上的/etc/passwd文件。该文件不包含明文密码,但它让攻击者了解系统中存在的用户。结合其他一些数据源和/etc/shadow,这些信息可能会让攻击者进一步利用系统。

  1. 权限提升🚫
    你难道不能将非root用户切换为root用户,然后做同样的事情吗?让我们试试。
    在这里插入图片描述

不,你不能。从非root用户切换到root用户的尝试失败了,这表明在没有sudo权限的情况下,权限提升是不可行的。因此,如果非root用户不在sudoers列表中,风险就会降低。

如何预防?🛡️

为了防止与以root身份运行容器相关的安全问题,请遵循以下最佳实践:

  1. 使用非root用户:始终在你的Docker容器中定义并使用非root用户。🧑‍💻
  2. 利用Kubernetes安全上下文:使用Kubernetes安全上下文(Security Context)指定容器执行的用户。🔐
结论✨

在Kubernetes中以非root用户身份运行容器,通过缓解常见的攻击途径,显著增强了安全性。希望本文能让你了解这一最佳实践的重要性。

参考文献
  1. Understanding the Docker USER instruction
  2. Kubernetes Security Context
  3. Alpine Docker images on Docker Hub
  4. Kubernetes Pod Security Standards
  5. https://medium.com/@marcin.wasiucionek/why-is-running-as-root-in-kubernetes-containers-dangerous-e5f1a116080e

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

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

相关文章

ConcurrentHashMap线程安全:分段锁 到 synchronized + CAS

专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 理解ConcurrentHashMap为什么线程安全;ConcurrentHashMap的具体细节还需要进一步研究 目录 ConcurrentHashMap介绍JDK7的分段锁实现JDK8的synchr…

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方,在空白处鼠标右键选择通过Code打开 打开Vscode,点击platformIO图标,选择PIO Home下的open,最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…

述评:如果抗拒特朗普的“普征关税”

题 记 美国总统特朗普宣布对美国三大贸易夥伴——中国、墨西哥和加拿大,分别征收10%、25%的关税。 他威胁说,如果这三个国家不解决他对非法移民和毒品走私的担忧,他就要征收进口税。 去年,中国、墨西哥和加拿大这三个国家&#…

九. Redis 持久化-AOF(详细讲解说明,一个配置一个说明分析,步步讲解到位 2)

九. Redis 持久化-AOF(详细讲解说明,一个配置一个说明分析,步步讲解到位 2) 文章目录 九. Redis 持久化-AOF(详细讲解说明,一个配置一个说明分析,步步讲解到位 2)1. Redis 持久化 AOF 概述2. AOF 持久化流程3. AOF 的配置4. AOF 启…

基于Springboot框架的学术期刊遴选服务-项目演示

项目介绍 本课程演示的是一款 基于Javaweb的水果超市管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附…

新版231普通阿里滑块 自动化和逆向实现 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 补环境逆向 部分补环境 …

java-(Oracle)-Oracle,plsqldev,Sql语法,Oracle函数

卸载好注册表,然后安装11g 每次在执行orderby的时候相当于是做了全排序,思考全排序的效率 会比较耗费系统的资源,因此选择在业务不太繁忙的时候进行 --给表添加注释 comment on table emp is 雇员表 --给列添加注释; comment on column emp.empno is 雇员工号;select empno,en…

泰山派Linux环境下自动烧录脚本(EMMC 2+16G)

脚本名字: download.sh 输入./download -h获取帮助信息 ,其中各个IMG/TXT烧录的地址和路径都在前几行修改即可 #!/bin/bash# # DownLoad.sh 多镜像烧录脚本 # 版本:1.1 # 作者:zhangqi # 功能:通过参数选择烧录指定镜…

正大杯攻略|分层抽样+不等概率三阶段抽样

首先,先进行分层抽样,确定主城区和郊区的比例 然后对主城区分别进行不等概率三阶段抽样 第一阶段,使用PPS抽样,确定行政区(根据分层抽样比例合理确定主城区和郊区行政区数量) 第二阶段,使用分…

开源智慧园区管理系统对比其他十种管理软件的优势与应用前景分析

内容概要 在当今数字化快速发展的时代,园区管理软件的选择显得尤为重要。而开源智慧园区管理系统凭借其独特的优势,逐渐成为用户的新宠。与传统管理软件相比,它不仅灵活性高,而且具有更强的可定制性,让各类园区&#…

计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)

应用层概述: 功能: 常见协议 应用层与其他层的关系 网络应用模型 C/S模型: 优点 缺点 P2P模型: 优点 缺点 DNS系统: 基本功能 系统架构 域名空间: DNS 服务器 根服务器: 顶级域…

人类心智逆向工程:AGI的认知科学基础

文章目录 引言:为何需要逆向工程人类心智?一、逆向工程的定义与目标1.1 什么是逆向工程?1.2 AGI逆向工程的核心目标二、认知科学的四大支柱与AGI2.1 神经科学:大脑的硬件解剖2.2 心理学:心智的行为建模2.3 语言学:符号与意义的桥梁2.4 哲学:意识与自我模型的争议三、逆向…

游戏引擎学习第86天

仓库: https://gitee.com/mrxiao_com/2d_game_2 回顾 继续之前的工作。 昨天已经让地形系统基本运行起来,但目前仍然需要进一步完善,使其能够生成更多的地块。目前的情况是,仅仅有一个地块位于中心区域,而真正需要的是让地块覆盖…

Python在线编辑器

from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…

力扣动态规划-20【算法学习day.114】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!! 习题 1.网格中的最小路径代价 题目链接…

从通讯工具到 AI 助理,AI手机如何发展?

随着AI进军各行各业,全面AI化时代已经到来。手机,作为现代人类的“数字器官”之一,更是首当其冲地融入了这一变革浪潮之中。 2024年年初,OPPO联合IDC发布了《AI手机白皮书》,公布OPPO已迈向AI手机这一全新阶段。到如今…

游戏引擎 Unity - Unity 打开项目、Unity Editor 添加简体中文语言包模块、Unity 项目设置为简体中文

Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…

Qt常用控件 多元素控件

文章目录 1. QListWidget1.1 常用属性和方法1.2 常用信号1.4 例子1,操作元素 2. QTableWidget2.1 常用属性和方法2.2 常用信号2.3 例子1,创建表格3.1 常用属性和方法3.2 常用信号3.3 例子1,创建树形结构 Qt中提供的多元素控件有: QListWidget…

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为:Word.docx:考生文件夹样式的复制样式的修改 样式的应用(没有相似/超级多的情况下)——替换 [ ]通配符&#x…

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外,还有一个小众的市场,那就是多媒体展厅场景,这个场景目前处于垄断地位的软件是HirenderS3,做的非常早而且非常全面,都是通用的需求&…