gpt4 book ai didi

c# - 当根文件系统为只读时,如何将证书添加到 POD/Container 的证书存储中

转载 作者:行者123 更新时间:2023-12-03 08:17:39 27 4
gpt4 key购买 nike

我有一个 .net core 应用程序,该应用程序已进行 Docker 化并在 Kubernetes 集群 (AKS) 中运行。

我想应用 securityContext readOnlyRootFilesystem = true 来满足容器应强制执行不可变(只读)根文件系统的要求

securityContext:privileged: falsereadOnlyRootFilesystem: true

对于 .net core 应用程序,我想读取 TLS 证书,并希望添加到 POD/Container 的证书存储中,并在启动时执行此操作,我有以下代码,

var cert = new X509Certificate2(Convert.FromBase64String(File.ReadAllText(Environment.GetEnvironmentVariable("cert_path"))));
AddCertificate(cert, StoreName.Root);

问题是当我设置readOnlyRootFilesystem = true时,我从应用程序中收到以下错误,

EXCEPTION: System.Security.Cryptography.CryptographicException: The X509 certificate could not be added to the store.---> System.IO.IOException: Read-only file systemat System.IO.FileSystem.CreateDirectory(String fullPath)

它说对于只读文件系统我无法添加证书。有办法解决这个问题吗?

更新

如果我设置 emptyDir: {},我会收到以下错误吗?我可以在哪里添加它?

spec.template.spec.volumes[0].csi:禁止:不得指定超过 1 个卷类型

          volumeMounts:
- name: secrets-store
mountPath: /app/certs
securityContext:
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 1000
volumes:
- name: secrets-store
emptyDir: {}
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: azure-kvname

最佳答案

在您定义为证书存储路径的位置,附加一个非只读卷。如果您只希望数据在 Pod 存在期间持续存在,则 emptyDir输入音量就很符合要求。

例如,如果您要使用如下部署创建 Pod:

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ct
name: ct
spec:
replicas: 1
selector:
matchLabels:
app: ct
template:
metadata:
labels:
app: ct
spec:
containers:
- image: myapp
name: myapp
env:
- name: cert_path
value: /etc/certstore
securityContext:
readOnlyRootFilesystem: true

您可以按如下方式设置emptyDir:

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: ct
name: ct
spec:
replicas: 1
selector:
matchLabels:
app: ct
template:
metadata:
labels:
app: ct
spec:
containers:
- image: myapp
name: myapp
env:
- name: cert_path
value: /etc/certstore
securityContext:
readOnlyRootFilesystem: true
volumeMounts:
- mountPath: /etc/certstore
name: certstore
volumes:
- name: certstore
emptyDir: {}

其他类型的卷也可以工作。如果您想在 pod 循环时保留这些证书,则可以使用 permanentVolumeClaim 为您获取持久卷。

emptyDir 不会是只读的,但容器根文件系统的其余部分将是只读的,这应该满足您的安全要求。

关于c# - 当根文件系统为只读时,如何将证书添加到 POD/Container 的证书存储中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68862974/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com