Kubernetes CSR 颁发的 MinIO Operator 证书

发布于:2024-06-22 ⋅ 阅读:(37) ⋅ 点赞:(0)

在当前的 Kubernetes 环境中,创建、管理和自动化 TLS 证书的标准方法是使用 kind: CertificateSigningRequest (CSR)资源。此原生 Kubernetes 资源提供了一种强大而高效的方式来处理集群中证书的整个生命周期。

通过利用 CSR 资源,您可以简化和自动化证书管理的各个方面,包括:

1 . **创建证书:**CSR 允许您轻松地为服务生成新证书,从而确保集群中组件之间的安全通信。

2 . **续订证书:**借助 CSR,您可以在证书过期之前自动续订证书,从而消除手动干预并降低服务中断的风险。

3 . **吊销证书:**如果由于安全问题或其他原因需要吊销证书,CSR 提供了一种简单的机制来使证书失效并防止其进一步使用。

我们将重点利用 Kubernetes CSR 资源专门用于创建可供 MinIO 使用的证书。在本指南结束时,您将清楚地了解如何使用 CSR 生成证书、将其安全地存储在 Kubernetes Secret 中,以及配置 MinIO 以访问和使用生成的证书。

生成的私钥和公有证书将安全地存储在名为 operator-tls 的 Kubernetes Secret 中。操作员可以访问此密钥,允许他们利用证书进行安全通信。

教程

首先,我们将使用带有 P-256 曲线的椭圆曲线数字签名算法 (ECDSA) 生成一个自签名私钥。ECDSA 是一种广泛使用且安全的算法,用于生成密钥对。

步骤 1:生成自签名私钥

首先,我们将使用带有 P-256 曲线的“椭圆曲线数字签名算法”(ECDSA) 生成一个自签名私钥。ECDSA 是一种广泛使用且安全的算法,用于生成密钥对。

openssl ecparam -name prime256v1 -genkey -noout -out private.key

或者,您可以使用其他算法,即使用 RSA。

openssl genrsa -out private.key 2048

步骤 2:生成证书签名请求 (CSR)

生成私钥后,我们现在可以创建证书签名请求 (CSR)。CSR 包含有关请求证书的实体的信息,并使用私钥进行签名。

openssl req -new -key private.key -out curve.csr \

-subj "/O=system:nodes/CN=system:node:operator.minio-operator.svc" \

-addext "subjectAltName = DNS:operator,DNS:operator.minio-operator.svc,DNS:operator.minio-operator.svc.cluster.local"

第 3 步:以 Base64 对 CSR 进行编码

要将 CSR 包含在 Kubernetes 资源中,我们需要将其转换为 base64 编码的字符串。

base64 curve.csr

步骤 4:创建 Kubernetes CertificateSigningRequest

创建一个包含以下内容的文件 csr-manual.yaml ,并替换 <copy base64 encoded curve.csr here> 为上一步中的 base64 编码的 CSR。

apiVersion: certificates.k8s.io/v1

kind: CertificateSigningRequest

metadata:

  name: operator-minio-operator-csr

spec:

  request: <copy base64 encoded curve.csr here>

  signerName: kubernetes.io/kubelet-serving

  expirationSeconds: 604800 #extend here for 1 year long

  groups:

  - system:serviceaccounts

  - system:serviceaccounts:minio-operator

  - system:authenticated

  - system:nodes

  usages:

	- "digital signature"

	- "key encipherment"

	- "server auth"

  username: system:serviceaccount:minio-operator:minio-operator

注意:关于 EKS 1.21 和 1.22:在 EKS 1.22+ 上不允许使用 signerName kubernetes.io/legacy-unknown ,您应该像上面的示例一样设置 signerName,或者beta.eks.amazonaws.com/app-serving有关 EKS 上 CSR 签名的更多详细信息,请参阅证书签名文档。在早期版本的 EKS(1.21 及更低版本)上,您可以使用证书 CSR API v1beta1 并发送 signerName kubernetes.io/legacy-unknown

注意:在 Kubernetes 1.21 及更低版本上:该字段 expirationSeconds 是在 Kubernetes 1.22 中引入的,在此之前,该字段被静默删除且不被执行

使用在上一步中创建 csr-manual.yaml 的文件,创建 Kubernetes CSR 资源。

kubectl apply -f csr-manual.yaml

第 6 步:批准 CSR

手动批准 CSR。这是一次性步骤。

kubectl certificate approve operator-minio-operator-csr

步骤 7:检索签名证书

.status.certificate Kubernetes csr 资源中的密钥获取公共证书。

kubectl get csr operator-minio-operator-csr -o jsonpath="{.status.certificate}" | base64 --decode > public.crt

步骤 8:验证证书

让我们验证我们上面获取的证书。

从 CSR 资源中提取证书,它将位于 base64 中。解码 base64 并使用 OpenSSL 读取它,如下所示。

kubectl get csr operator-minio-operator-csr -ojsonpath="{.status.certificate}" | base64 --decode | openssl x509 -noout -text

将出现与此类似的证书说明:

Certificate:

	Data:

    	Version: 3 (0x2)

    	Serial Number:

        	19:35:68:7b:bc:16:51:b1:95:14:15:45:13:27:e2:b7

	Signature Algorithm: sha256WithRSAEncryption

    	Issuer: CN=kubernetes

    	Validity

        	Not Before: Mar 15 22:25:10 2023 GMT

        	Not After : Mar 14 22:25:10 2024 GMT

    	Subject: O=system:nodes, CN=system:node:operator.minio-operator.svc

    	Subject Public Key Info:

        	Public Key Algorithm: id-ecPublicKey

            	Public-Key: (256 bit)

            	pub:

                	04:5b:53:08:98:54:8f:45:c9:e9:15:49:73:cc:50:

                	fe:32:ec:33:de:f8:79:6e:87:a9:7d:01:3e:c3:b0:

                	20:21:69:46:33:a5:44:92:18:90:79:4f:b4:e5:d9:

                	a7:94:5f:b1:4b:73:57:e3:3a:cc:d8:be:24:94:3f:

                	32:2d:d3:f4:38

            	ASN1 OID: prime256v1

            	NIST CURVE: P-256

    	X509v3 extensions:

        	X509v3 Key Usage: critical

            	Digital Signature, Key Encipherment

        	X509v3 Extended Key Usage:

            	TLS Web Server Authentication

        	X509v3 Basic Constraints: critical

            	CA:FALSE

        	X509v3 Authority Key Identifier:

            	keyid:73:58:4C:D0:20:80:2A:C4:7A:5E:EE:26:C0:28:50:CA:F2:05:48:73


        	X509v3 Subject Alternative Name:

            	DNS:operator, DNS:operator.minio-operator.svc, DNS:operator.minio-operator.svc.cluster.local

	Signature Algorithm: sha256WithRSAEncryption

     	64:1c:de:99:cd:54:e8:eb:08:fd:89:c5:6a:94:a5:29:dd:a9:

...

输出将显示证书详细信息,包括使用者、颁发者、有效期和扩展名。

步骤 9:创建 Kubernetes 密钥

最后,这是橡胶与道路相遇的地方。我们将创建一个 Kubernetes secret 供 Operator 使用

kubectl create secret generic --from-file=./private.key --from-file=./public.crt operator-tls -n minio-operator

下次操作员启动时,它不会尝试创建证书或机密,而是使用我们存储在密钥 minio-operator 中的证书或机密。

使用 MinIO 和 Kubernetes 简化证书管理

我们不可能用另一个对象存储来编写这个简短的教程。其他类似的对象存储设置起来非常复杂且耗时,但我们只是将 MinIO 运算符设置为使用来自密钥的证书,只需使用内置的 Kubernetes 资源即可获得太多提升。

虽然其他对象存储解决方案通常需要复杂的配置和耗时的设置过程,但 MinIO 的设计和与 Kubernetes 的紧密集成使开发人员和管理员能够专注于他们的核心业务逻辑,因为他们知道他们的对象存储是安全的并且经过了适当的身份验证。MinIO 证书管理流程的简单性和效率使其在竞争中脱颖而出,使其成为寻求强大而可靠的对象存储解决方案的企业的首选。