使用 Kubernetes 运行 non-root .NET 容器

news2025/1/12 22:53:10

翻译自 Richard Lander 的博客

Rootless 或 non-root Linux 容器一直是 .NET 容器团队最需要的功能。我们最近宣布了所有 .NET 8 容器镜像都可以通过一行代码配置为 non-root 用户。今天的文章将介绍如何使用 Kubernetes 处理 non-root 托管。

您可以尝试使用我们的 non-root Kubernetes 示例在集群上托管 non-root 容器。它是我们正在处理的一组更大的 Kubernetes 示例的一部分。

runAsNonRoot

我们将要讨论的大部分内容都与 Kubernetes 清单的 SecurityContext 部分有关。它包含 Kubernetes 应用的安全配置。

spec:      containers:      - name: aspnetapp        image: dotnetnonroot.azurecr.io/aspnetapp        securityContext:          runAsNonRoot: true

此 securityContext 对象验证容器将以 non-root 用户运行。

runAsNonRoot 测试用户(通过 UID)是 non-root 用户(> 0),否则 pod 创建将失败。Kubernetes 仅为该测试读取容器镜像元数据。它不会读取/etc/passwd,因为这需要启动容器(这违背了测试的目的)。这意味着 USER(在 Dockerfile 中)必须由 UID 设置。如果 USER 按名称设置,将会失败。

我们可以使用 docker inspect 模拟相同的测试。

% docker inspect dotnetnonroot.azurecr.io/aspnetapp -f "{{.Config.User}}"64198

我们的示例镜像通过 UID 设置用户。但是,whoami 仍会将用户报告为应用程序。

runAsUser 是一个相关的设置,尽管在上面的示例中没有使用。只有当容器镜像未设置 USER、通过名称而非 UID 进行设置,或者其他情况不需要时,才应该使用 runAsUser。我们已经让使用新应用程序用户作为 UID 变得非常容易,这样 .NET 应用程序应该会不再需要 runAsUser了。

USER 最佳实践

我们建议在 Dockerfile 中设置 USER 时使用以下模式。

USER $APP_UID

USER 指令通常放在 ENTRYPOINT 之前,尽管顺序无关紧要。此模式导致 USER 被设置为 UID,同时避免在 Dockerfile 中使用幻数。环境变量已经定义了 .NET 镜像声明的 UID 值。

您可以看到 .NET 镜像中设置的环境变量。​​​​​​​

% docker run mcr.microsoft.com/dotnet/runtime-deps:8.0-preview bash -c "export | grep UID"declare -x APP_UID="64198"

non-root 示例根据此模式通过 UID 设置用户。因此,它适用于 runAsNonRoot。

non-root 托管

让我们看看使用 non-root Kubernetes 示例进行 non-root 容器托管的体验。

我们正在为本地集群使用 minikube,但任何兼容 Kubernetes 的环境都应该能很好地与 kubectl 配合使用。​​​​​​​

$ kubectl apply -f https://raw.githubusercontent.com/dotnet/dotnet-docker/main/samples/kubernetes/non-root/non-root.yamldeployment.apps/dotnet-non-root createdservice/dotnet-non-root created$ kubectl get poNAME                           READY   STATUS    RESTARTS   AGEdotnet-non-root-68f4cd45c-687zp   1/1     Running   0          13s

该应用程序正在运行。让我们检查一下用户。​​​​​​​

$ kubectl exec dotnet-non-root-68f4cd45c-687zp -- whoamiapp

我们也可以在应用程序上调用一个端点。首先,我们需要创建一个代理来连接它。

% kubectl port-forward service/dotnet-non-root 8080

我们现在可以调用端点,它也将用户报告为 app。​​​​​​​

% curl http://localhost:8080/Environment{"runtimeVersion":".NET 8.0.0-preview.3.23174.8","osVersion":"Linux 5.15.49-linuxkit #1 SMP PREEMPT Tue Sep 13 07:51:32 UTC 2022","osArchitecture":"Arm64","user":"app","processorCount":4,"totalAvailableMemoryBytes":4124512256,"memoryLimit":0,"memoryUsage":35004416}

删除资源。​​​​​​​

$ kubectl delete -f https://raw.githubusercontent.com/dotnet/dotnet-docker/main/samples/kubernetes/non-root/non-root.yamldeployment.apps "dotnet-non-root" deletedservice "dotnet-non-root" deleted

在撰写本文时,官方示例尚未移动到使用 non-root 用户。当我们将示例移动到 .NET 8 时,可能 .NET 8 RC1,我们会这样做。可以使用 aspnetapp 镜像来演示当 runAsNonRoot 与使用 root 的镜像一起使用时会发生什么。它应该失败,对吧?稍微更改一下清单,让我们从没有 securityContext 部分开始。​​​​​​​

  spec:      containers:      - name: aspnetapp

检查一下用户。​​​​​​​

$ kubectl apply -f non-root.yamldeployment.apps/dotnet-non-root createdservice/dotnet-non-root created$ kubectl get poNAME                            READY   STATUS    RESTARTS   AGEdotnet-non-root-85768f6c55-pb5gh   1/1     Running   0          1s$ kubectl exec dotnet-non-root-85768f6c55-pb5gh -- whoamiroot

不出所料。现在,把 runAsNonRoot 加回来。​​​​​​​

spec:      containers:      - name: aspnetapp        image: mcr.microsoft.com/dotnet/samples:aspnetapp        securityContext:          allowPrivilegeEscalation: false          runAsNonRoot: true​​​​​​​
$ kubectl apply -f non-root.yamldeployment.apps/dotnet-non-root createdservice/dotnet-non-root created$ kubectl get poNAME                            READY   STATUS                       RESTARTS   AGEdotnet-non-root-6df9cb77d8-74t96   0/1     CreateContainerConfigError   0          5s

失败了,但就是我们想要的。我们可以更多地了解下原因。​​​​​​​

$ kubectl describe po | grep Error      Reason:       CreateContainerConfigError  Warning  Failed     7s (x2 over 8s)  kubelet            Error: container has runAsNonRoot and image will run as root (pod: "dotnet-non-root-6df9cb77d8-74t96_default(d4df0889-4a69-481a-adc4-56f41fb41c63)", container: aspnetapp)

我们可以尝试 kubectl exec 到 pod,但它会失败。这表明 Kubernetes 阻止了容器的创建(如错误状态所示)。​​​​​​​

$ kubectl exec dotnet-non-root-6df9cb77d8-74t96 -- whoamierror: unable to upgrade connection: container not found ("aspnetapp")

dotnet-monitor

dotnet-monitor 是一种诊断工具,用于从正在运行的应用程序中捕获诊断工件。我们为其提供了一个 dotnet/monitor 容器镜像。它适用于 non-root 主机。

hello-dotnet Kubernetes 示例演示了以 non-root 用户身份运行的 ASP.NET 和 dotnet-monitor。它还继续演示如何在云端和本地收集 Prometheus 指标数据。

您可以通过几个简单的配置更改在 Kubernetes 中切换到 non-root 托管。您的应用程序将更加安全,对攻击也更具弹性。这种方法还使应用程序符合 Kubernetes Pod 强化最佳实践。这是一项小变革,但对深度防御有着巨大影响。

希望我们的容器安全计划能够让整个 .NET 容器生态系统都转向 non-root 托管,我们致力于使云中的 .NET 应用程序高效且安全。

 点我前往原博客~

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

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

相关文章

gateway报 netty堆外内存溢出问题解决io.netty.util.internal.OutOfDirectMemoryError

昨天线上网关突然无法访问。打开日志看到错误信息“io.netty.util.internal.OutOfDirectMemoryError” 堆外内存溢出。。这也没碰到过啊,看来今天准点下班的愿望又落空了。老规矩面向百度编程。先看看网上有没有其他兄弟碰到这个问题。一顿搜索之后发现,…

已解决windows pycocotools安装失败问题 —— 超简单

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

分库分表与分布式主键生成策略详解--一个无数人踩过却一直被人忽视的深坑

文章目录 一、从分库分表的一个神坑说起二、分布式主键要考虑哪些问题?三、主要的主键生成策略1、数据库策略2、应用单独生成3、第三方服务统一生成4、与第三方结合的segment策略 四、定制雪花算法1、如影随形的时钟回拨问题2、用主键生成策略优化分配工作进程位3、…

萤石“小步快走”,跨进智能家居生态圈

文丨智能相对论 作者丨Kinki 近日,萤石网络(下称“萤石”)举办了2023春季新品发布会,这是公司上市以来的首个新品发布会,除了拳头产品智能家居摄像机之外,还有智能入户产品、TV Studio等十多款新品&#…

NC65 集团业务参数 GLS01参数值的默认值作用是什么?

NC65 集团业务参数 GLS01参数值的默认值作用是什么? 用在总账系统的所有账簿。如果设置的期间个数大于12,还得要求所查询的账表支持跨年查询,比如科目余额表,不支持跨年(注意:这里说的不支持跨年是指余额为…

4.2.1朴素模式匹配算法

什么是字符串的模式匹配: 从这段字符串里面搜索内容,被搜索的字符串我们称之为主串。 也可能匹配不到 主串长度为n,模式串长度为m。 朴素模式匹配算法:将主串中所有长度为m的字串依次与模式串对比,直到找到一个完全匹…

【JavaEE】File、InputStream和OutputStream的使用

1.File 在计算机中目录结构如下: 而File就表示一个目录或者一个普通文件。 File表示目录: File表示普通文件: 我们先来看File的构造方法: 构造器描述File(File parent, String child)根据父目录 孩子文件路径,创…

Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权

Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权 1. 前言1.1. 如何找编译好的EXP 2. 定时任务提权2.1. 查看定时任务2.2. 通配符注入提权2.2.1. 创建执行脚本2.2.2. 创建定时任务2.2.3. 查看效果2.2.4. 提权操作2.2.4.1. 切换普通用户2.2.4.2. 执行命令2.2.4.3…

优先、双端队列-我的基础算法刷题之路(八)

本篇博客旨在整理记录自已对优先队列、双端队列的一些总结,以及刷题的解题思路,同时希望可给小伙伴一些帮助。本人也是算法小白,水平有限,如果文章中有什么错误之处,希望小伙伴们可以在评论区指出来,共勉 &…

Netty 源码解析(下)

接上一篇博客 Netty 源码解析(上)继续分析 上一篇博客中已经分析了绝大部分 ChannelFuture cf bootstrap.bind(9000).sync(); 这一行代码,当这一行代码运行完时,Netty服务端就已经启动好了,接下来就是接收链接&#x…

Spring Security OAuth2.0(二)-----简化模式/密码模式/客户端模式/刷新 token

简化模式 代码示例 修改authorization_server授权服务模块 新增“implicit” 和修改回调地址为本次地址 修改第三方应用项目搭建新页面模拟 新建implicit.jsp <% page contentType"text/html;charsetUTF-8" language"java" isELIgnored"fals…

C++入门篇(二)

目录 一、引用1.1 什么是引用&#xff1f;1.2 引用的特性1.3 常引用1.4 引用的使用场景1.5 传值和传引用效率比较1.5.1 传值和传引用做参数的性能对比1.5.2 传值和传引用做返回值的性能对比 1.6 引用和指针之间的区别 二、内联函数2.1 什么是内联函数&#xff1f;2.2 内联函数的…

知识变现海哥|研究了100个项目,这个才是人生逆袭首选

&#xff08;本文源自公号跟海哥学知识变现&#xff0c;移步公号与100万知识变现/知识付费创业者&#xff0c;一起学知识变现知识付费干货&#xff0c;回‘领书’获取3本电子书&#xff1a;【知识付费秘籍】【知识创业者成长手册】【100个知识付费成功案例】) 经常有人问海哥&a…

什么是中断向量表?作用是什么?为什么需要偏移?

一、定义与特点 定义&#xff1a;中断向量表(interrupt vector table)包含中断服务程序地址的特定内存区域&#xff0c;这些服务程序是处理外部硬件中断请求的代码。 特点&#xff1a;这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的&#xff0c;当某个中断…

ESP32-C2开发板 Homekit烧录教程

准备 1.1硬件ESP32 C2开发板&#xff0c;如图1-1所示 图1-1 ESP32 C2开发板 1.2软件 CozyLife APP可以在各大应用市场搜索下载&#xff0c;也可以扫描二维码下载如图1-2所示 HomeKit flash download tool 烧录工具 esp32c2 homkit演示固件 烧录教程 打开flash_download_to…

以智求治,MapGIS打造公共安全治理新模式

随着我国城市人口和规模日益扩大&#xff0c;城市运行系统日趋复杂&#xff0c;各类风险隐患增多且呈现相互叠加、相互耦合态势&#xff0c;各类风险、事故灾害类事件造成的损失严重&#xff0c;公共安全防范压力不断增大。 党的二十大报告中指出&#xff1a;“建立大安全大应…

【容器化应用程序设计和开发】2.1 容器化基础知识和Docker容器

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 容器化应用程序设计和开发 2.1 容器化基础知识和Docker容器2.1.1 容器的创建2.1.2 容器的管理 容器化应用程序设计和开发是一种基于容器技术的应用程序设计和开发方法论。它将应用程序拆分为多个小型服务&#x…

Centos7安装MySQL-5.7.17详细教程

1、MySQL安装包可以在Oracle官网下载 下载链接:https://dev.mysql.com/downloads/mysql/5.7.html 也可以通过wget命令下载 wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz 下载完成之后解压tar包 命令&#xff1a;tar -zxvf…

Smith预估控制器

Smith预估器主要针对存在大滞后的系统,作用延迟和反馈延迟环节的控制,Smith预估器的另一篇文章,请参看下面的博客文章: 博途1200/1500PLC Smith预估器(补偿器)算法实现(FB)_RXXW_Dor的博客-CSDN博客在写这篇文章之前写过一篇"大林控制算法",大家可以参看下面这…

一款适合智慧档案馆一体化建设平台的多参数空气质量传感器

智慧档案馆一体化建设平台配件产品/空气质量传感器/空气质量云测仪/空气质量检测仪/空气质量探测器/环境集成传感器 主要检测参数&#xff1a;温度、湿度、粉尘PM2.5/PM10、二氧化碳CO2、甲醛、TVOC等六参数档案库房常用环境参数检测。 安装方式&#xff1a;吸顶式 信号输出&…