由 Vault 支持的 KES 的 MinIO Operator

为了提供安全锁定和擦除的合规性功能,MinIO 使用服务器端加密 (SSE) 在存储层加密对象,以保护对象作为写入操作的一部分。MinIO 以极高的效率做到这一点——基准测试表明 MinIO 能够以接近线速进行加密/解密。

MinIO 使用的秘诀是单指令多数据 (SIMD)。通常,一次只能发送一条 CPU 指令,等待响应后再发送下一条指令。这是非常低效的,尤其是在每秒执行数千条(如果不是数百万条)加密和解密指令时。MinIO 利用 SIMD,因此它可以在单个请求中发送多条指令,由 CPU 处理。我们在 GoLang 中编写了汇编内容,因此我们尽可能靠近硬件层,以充分利用通常未充分利用的 CPU 能力来大规模执行加密操作。

在上一篇文章中,我们向您展示了如何使用 KES 在裸机环境中开始使用 MinIO 和 Vault。在这篇文章中,我们将向您展示如何在 Kubernetes 中以云原生方式使用 KES(密钥加密系统)和 Vault 配置 MinIO Operator。这将使你能够在扩展并使用 Kubernetes 资源来配置它们时自动执行该过程。

先决条件

在开始之前,请确保满足以下先决条件:

  • Kubernetes 集群(在本教程中,我们将使用 kind 创建本地集群)

  • 本地计算机上安装的 kubectl 命令行工具

  • git 用于克隆必要的存储库

步骤 1:使用 kind 部署 Kubernetes 集群

首先,我们将使用 kind 创建一个 Kubernetes 集群。这将为我们提供一个本地环境来部署和测试我们的 MinIO 设置。

首先,创建一个使用以下命令命名 kind-config.yaml 的 kind 配置文件:

$ cat > kind-config.yaml <<EOFkind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes:- role: control-plane- role: worker- role: worker- role: worker- role: workerEOF$ kind create cluster --config kind-config.yml

步骤 2:部署 MinIO Operator

随着 Kubernetes 集群的启动和运行,我们现在可以使用该 kustomization 插件部署 MinIO Operator。MinIO Operator 简化了 Kubernetes 环境中 MinIO 实例的部署和管理。

执行以下命令,在集群中kind部署 MinIO Operator:

$ kubectl apply -k github.com/minio/operator

等待所有 Pod 在 minio-operator 命名空间中联机,然后再继续下一步。

第 3 步:设置 HashiCorp Vault

HashiCorp Vault 是一个强大的机密管理工具,我们将使用它来安全地存储和管理我们的加密密钥。要在我们的 Kubernetes 集群中设置 Vault,我们将使用 kubernetes-vault 存储库。

通过运行以下命令克隆存储库:

$ git clone https://github.com/scriptcamp/kubernetes-vault.git$ cd kubernetes-vault/vault-manifests

接下来,设置必要的 RBAC(基于角色的访问控制)规则,创建 Vault 配置映射,部署 Vault 服务,并设置有状态集:

$ kubectl apply -f rbac.yml

创建 Vault 配置映射

$ kubectl apply -f configmap.yaml

部署 Vault 服务

$ kubectl apply -f services.yaml

由于 Vault 是有状态服务,因此我们需要为其设置一个有状态集。为此执行以下命令

$ kubectl apply -f statefulset.yaml

Vault 设置完成后,解封并初始化 Vault。

$ kubectl exec vault-0 -- vault operator init -key-shares=1 -key-threshold=1 -format=json > keys.json$ VAULT_UNSEAL_KEY=$(cat keys.json | jq -r ".unseal_keys_b64[]")$ echo $VAULT_UNSEAL_KEY$ VAULT_ROOT_KEY=$(cat keys.json | jq -r ".root_token")$ echo $VAULT_ROOT_KEY$ kubectl exec vault-0 -- vault operator unseal $VAULT_UNSEAL_KEY

现在,输入 vault-0 POS 以执行其他配置:

$ kubectl exec -it vault-0 -- /bin/sh

在容器内,启用 K/V 后端,创建策略,启用 AppRole 身份验证,创建 KES 角色,并生成应用角色 ID 和密钥:

$ vault secrets enable -version=1 kv

创建策略

$ cat > kes-policy.hcl <<EOFpath "kv/*" {capabilities = [ "create", "read", "delete" ]}$ vault policy write kes-policy kes-policy.hcl

启用 AppRole 身份验证

$ vault auth enable approle

创建 KES 角色并向其附加策略

$ vault write auth/approle/role/kes-server token_num_uses=0  secret_id_num_uses=0  period=5m$ vault write auth/approle/role/kes-server policies=kes-policy

生成应用角色 ID 和机密,并记下值

$ vault read auth/approle/role/kes-server/role-idKey    	Value---    	-----role_id	b484633b-8965-08dd-0e24-d6973e6be2d2$ vault write -f auth/approle/role/kes-server/secret-idKey               	Value---               	-----secret_id         	7fd44d44-a3f1-a013-1f40-e1952496c416secret_id_accessor	b5ee0c97-5ffc-b9a7-fe0b-763757fe1033secret_id_ttl     	0s

记下生成的应用角色 ID 和机密,因为我们将在下一步中用到它们。

第 4 步:使用 kustomization 插件部署 KES

要使用 kustomization 插件部署 KES(密钥加密服务),我们首先需要克隆 MinIO 存储库:

$ git clone https://github.com/minio/operator.git$ cd operator

使用适当的 KES 值更新 examples/kustomization/tenant-kes-encryption/kes-configuration-secret.yaml 文件,包括 Vault 端点、命名空间、前缀以及生成的应用角色 ID 和密钥。

keystore:## KES configured with fs (File System mode) doesnt work in Kubernetes environments and it's not recommended## use a real KMS# fs:#   path: "./keys" # Path to directory. Keys will be stored as files. Not Recommended for Production.vault:endpoint: "http://vault.default.svc.cluster.local:8200" # The Vault endpointnamespace: "default" # An optional Vault namespace. See: https://www.vaultproject.io/docs/enterprise/namespaces/index.htmlprefix: "my-minio"	# An optional K/V prefix. The server will store keys under this prefix.approle:	# AppRole credentials. See: https://www.vaultproject.io/docs/auth/approle.htmlid: "b484633b-8965-08dd-0e24-d6973e6be2d2"  	# Your AppRole Role IDsecret: "7fd44d44-a3f1-a013-1f40-e1952496c416"  # Your AppRole Secret IDretry: 15s  # Duration until the server tries to re-authenticate after connection loss.tls:    	# The Vault client TLS configuration for mTLS authentication and certificate verificationkey: "" 	# Path to the TLS client private key for mTLS authentication to Vaultcert: ""	# Path to the TLS client certificate for mTLS authentication to Vaultca: ""  	# Path to one or multiple PEM root CA certificatesstatus: 	# Vault status configuration. The server will periodically reach out to Vault to check its status.ping: 10s   # Duration until the server checks Vault's status again.

现在,将 KES 服务与 MinIO 租户一起部署:

$ kubectl apply -k operator/examples/kustomization/tenant-kes-encryption

这将部署 KES 和 MinIO pod,如下所示

$ kubectl get pods -n tenant-kms-encryptedNAME           	READY   STATUS	RESTARTS   	AGEmyminio-kes-0  	1/1 	Running   0          	104mmyminio-kes-1  	1/1 	Running   0          	104mmyminio-pool-0-0   2/2 	Running   0          	101mmyminio-pool-0-1   2/2 	Running   0          	102mmyminio-pool-0-2   2/2 	Running   3 (102m ago)   103mmyminio-pool-0-3   2/2 	Running   4 (102m ago)   104m

使用 KES 的 MinIO 部署现已启动并运行。

步骤 5:验证部署

为了确保我们的部署顺利运行,让我们检查一下 MinIO 租户 pod、KES pod 和操作员 pod 的状态:

$ kubectl get pods -n minio-operator                                                                                                                        	NAME                          	READY   STATUS	RESTARTS   AGEconsole-6459d44b76-fgwbt      	1/1 	Running   0      	5h29mminio-operator-5668d46f98-9p2wm   1/1 	Running   0      	5h29mminio-operator-5668d46f98-pm98s   1/1 	Running   0      	5h29m$ kubectl get pods -n tenant-kms-encryptedNAME           	READY   STATUS	RESTARTS   	AGEmyminio-kes-0  	1/1 	Running   0          	116mmyminio-kes-1  	1/1 	Running   0          	116mmyminio-pool-0-0   2/2 	Running   0          	113mmyminio-pool-0-1   2/2 	Running   0          	114mmyminio-pool-0-2   2/2 	Running   3 (114m ago)   115mmyminio-pool-0-3   2/2 	Running   4 (114m ago)   116m$ k get pods -n defaultNAME     	READY   STATUS	RESTARTS   AGEvault-0  	1/1 	Running   0      	4h39m

验证 KES Pod 日志以确保没有错误,并且 Pod 按预期运行,如下所示:

$ kubectl logs myminio-kes-0 -n tenant-kms-encrypted                                                                                                        	Copyright   MinIO, Inc.       	https://min.ioLicense 	GNU AGPLv3        	https://www.gnu.org/licenses/agpl-3.0.htmlVersion 	2023-04-18T19-36-09Z  linux/amd64KMS     	Hashicorp Vault: http://vault.default.svc.cluster.local:8200Endpoints   https://127.0.0.1:7373https://10.244.3.55:7373Admin   	_                 	[ disabled ]Mem Lock	off               	Failed to lock RAM pages. Consider granting CAP_IPC_LOCK{"time":"2024-03-08T07:51:31.333681336Z","request":{"ip":"10.244.1.47","path":"/v1/key/create/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":400,"time":2871000}}{"time":"2024-03-08T07:51:32.191375099Z","request":{"ip":"10.244.3.54","path":"/v1/identity/self/describe","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":18000}}{"time":"2024-03-08T07:51:32.191784146Z","request":{"ip":"10.244.3.54","path":"/v1/key/create/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":400,"time":1739000}}{"time":"2024-03-08T07:52:01.890935905Z","request":{"ip":"10.244.3.54","path":"/v1/key/generate/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":1888000}}{"time":"2024-03-08T07:52:02.145905494Z","request":{"ip":"10.244.1.47","path":"/v1/key/generate/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":62000}}{"time":"2024-03-08T07:52:02.162627602Z","request":{"ip":"10.244.1.47","path":"/v1/key/generate/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":62000}}{"time":"2024-03-08T07:52:04.850766874Z","request":{"ip":"10.244.3.54","path":"/v1/key/decrypt/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":68000}}{"time":"2024-03-08T07:52:04.857285115Z","request":{"ip":"10.244.3.54","path":"/v1/key/decrypt/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":53000}}{"time":"2024-03-08T07:52:07.753077729Z","request":{"ip":"10.244.2.35","path":"/v1/identity/self/describe","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":7000}}

步骤 6:测试部署

为了测试我们的部署,我们将创建一个示例存储桶,并从安装了 mc(MinIO 客户端)的调试 Pod 中加载/检索对象。

首先,启动一个新终端并运行以下命令以执行到调试 pod 中:

kubectl exec -it pod/ubuntu-pod -n default -- bash

在调试 Pod 中,执行以下命令创建存储桶、创建加密密钥、上传文件并验证加密,如下所示:

mc alias ls myminio
mc ls myminio
mc mb myminio/encryptedbucket
mc admin kms key create myminio encrypted-bucket-keyecho "Hello" >> file1.txt
mc cp file1.txt myminio/encryptedbucket
mc ls myminio/encryptedbucket
mc cat myminio/encryptedbucket/file1.txt
mc admin kms key status myminio encrypted-bucket-key
mc stat myminio/encryptedbucket/file1.txt

如果所有设置都正确,您应该会看到上传的文件已加密,并且加密密钥状态有效。

下面演示了此过程,如预期的那样:

$ kubectl exec -it pod/ubuntu-pod -n default -- bash                                                                                              	 root@ubuntu-pod:/# mc alias ls myminiomyminioURL   	: https://myminio-pool-0-0.myminio-hl.tenant-kms-encrypted.svc.cluster.local:9000AccessKey : minioSecretKey : minio123API   	: s3v4Path  	: autoroot@ubuntu-pod:/# mc ls myminioroot@ubuntu-pod:/# mc mb myminio/encryptedbucketBucket created successfully `myminio/encryptedbucket`.root@ubuntu-pod:/# mc admin kms key create myminio encrypted-bucket-keyCreated master key `encrypted-bucket-key` successfullyroot@ubuntu-pod:/# echo "Hello" >> file1.txtroot@ubuntu-pod:/# mc cp file1.txt myminio/encryptedbucket/file1.txt:                        	6 B / 6 B ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 344 B/s 0sroot@ubuntu-pod:/# mc ls myminio/encryptedbucket[2024-03-08 10:25:01 UTC] 	6B STANDARD file1.txtroot@ubuntu-pod:/# mc cat myminio/encryptedbucket/file1.txtHelloroot@ubuntu-pod:/# mc admin kms key status myminio encrypted-bucket-keyKey: encrypted-bucket-key- Encryption ✔- Decryption ✔root@ubuntu-pod:/# mc stat myminio/encryptedbucket/file1.txtName  	: file1.txtDate  	: 2024-03-08 10:25:01 UTCSize  	: 6 B    ETag  	: 27e775e1a5d22463e4cd39f12ce14ea0Type  	: fileMetadata  :Content-Type: text/plainEncrypted :X-Amz-Server-Side-Encryption           	: aws:kmsX-Amz-Server-Side-Encryption-Aws-Kms-Key-Id: arn:aws:kms:encrypted-bucket-key

如果所有设置都正确,您应该会看到上传的文件已加密,并且加密密钥状态为有效,确认对象已加密。

最后的思考

在这篇博文中,我们探讨了如何在 Kubernetes 环境中部署具有 Vault 支持的 KES 的 MinIO Operator,重点关注服务器端加密 (SSE)。通过利用 Kubernetes 和 kustomization 插件的强大功能,我们可以自动化部署过程,并根据需要轻松扩展我们的 MinIO 设置。

我们采用“左移”方法,强调从开发和规划的最初阶段就嵌入安全和数据保护实践的重要性。其意图很明确:将安全性从单纯的考虑提升为基础架构的基本要素。通过强调 SSE 的简单性和可访问性,我们的目标是鼓励将其作为所有 MinIO 部署的标准采用。实现强大安全性的道路既简单又可实现,为更安全、更可靠的数字环境铺平了道路。

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

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

相关文章

小米红米全机型TWRP下载刷入教程-获取root权限--支持小米14/红米K7Pro/红米Turbo3等机型

刷机注意&#xff1a; 本教程为小米红米全机型专用TWRP_Recovery合集&#xff0c;ROM乐园独家首发整理。请确保你的电脑能正确连接你的手机&#xff0c;小米红米手机需要解锁BL&#xff0c;请参照下面教程 小米MIUI澎湃OS解锁BL教程&#xff1a;小米手机官方解锁BootLoader图文…

R语言——R语言基础

1、用repeat、for、while计算从1-10的所有整数的平方和 2、编写一个函数&#xff0c;给出两个正整数&#xff0c;计算他们的最小公倍数 3、编写一个函数&#xff0c;让用户输入姓名、年龄&#xff0c;得出他明年的年龄。用paste打印出来。例如&#xff1a;"Hi xiaoming …

2024 Testing Expo China – Automotive I 风丘与您相约上海世博馆

2024汽车测试及质量监控博览会&#xff08;中国&#xff09;——&#xff08;Testing Expo China – Automotive&#xff09;是面向整车、零部件和系统开发的各种技术和服务的盛会&#xff0c;展示了汽车测试、开发和验证技术的各个方面&#xff0c;每年在上海举行&#xff0c;…

美国ARC与延锋安全合作,推动汽车安全气囊技术新突破

在汽车安全领域&#xff0c;安全气囊作为关键被动安全配置&#xff0c;对于保障乘客生命安全至关重要。随着汽车工业的快速发展和科技创新的持续推进&#xff0c;安全气囊技术的升级与革新显得尤为重要。2022年10月25日&#xff0c;美国ARC公司与延锋安全携手合作&#xff0c;共…

定义多个类对象,分别输入和输出各对象中的时间(时:分:秒)

在前面的文章中&#xff0c;类中只有公用数据而无成员函数&#xff0c;而且只有1个对象。可以直接在主函数中进行输入和输出。若有多个对象&#xff0c;需要分别引用多个对象中的数据成员&#xff0c;可以写出如下程序&#xff1a; &#xff08;1&#xff09;编写程序&#xff…

Apache Arrow 和数据的未来:开放标准推动人工智能发展

Apache Arrow 是一种开源列式内存格式&#xff0c;适用于平面数据和分层数据。在现代数据湖中&#xff0c;开放数据格式&#xff08;如 Apache Arrow&#xff09;位于现代对象存储的存储层中。这些格式成为对象存储中的对象。 在最新版本中&#xff0c;Apache Arrow 宣布计划从…

STM32F4 STD标准库串口接收中断+空闲中断例程

STM32F4 STD标准库串口接收中断空闲中断例程 &#x1f516;工程基于STM32F446 ✨用惯了STM32CubeMX傻瓜式配置&#xff0c;突然改用标准库写代码&#xff0c;初始化外设内容&#xff0c;总是丢三落四的。 &#x1f4d7;串口初始化配置 void uart_init(uint32_t bound) {//GPIO…

使用Naive UI的级联选择器 Cascader进行省市区选择

序言&#xff1a; 在进行PC版的功能开发时&#xff0c;进行客户管理时老板要让客户便捷的选择自己的省市区等信息&#xff0c;而不是让他们一个个去填写&#xff0c;这时就需要使用级联选择器来进行省市区的选择。 注&#xff1a;element ui/plus的级联选择器也是可以的。 步骤…

2024年全国青少信息素养大赛python编程复赛集训第九天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…

【AWS SMB】关于AWS 中小型企业 (SMB) 能力介绍及注意事项

文章目录 前言一、什么是 SMB&#xff1f;&#x1f4e2;二、如何识别中小企业的需求三、中小企业营销活动的类型四、AWS 合作伙伴可获得的其他 AWS 机会4.1 AWS IQ4.2 APN 客户参与 (ACE) 计划 前言 AWS 中小型企业 &#xff08;SMB&#xff09; 能力合作伙伴专注于帮助中小型…

监控 Prometheus源码安装实战和动态更新 Centos7

安装go环境 下载go安装包 #创建文件夹 mkdir /usr/local/software #进入文件夹 cd /usr/local/software #下载安装包 wget https://dl.google.com/go/go1.17.6.linux-amd64.tar.gz配置go环境变量 #解压 tar -zxvf go1.17.6.linux-amd64.tar.gz#配置环境变量 echo "exp…

C++拷贝构造函数、运算符重载函数、赋值运算符重载函数、前置++和后置++重载等的介绍

文章目录 前言一、拷贝构造函数1. 概念2. 特征3. 编译器生成默认拷贝构造函数4. 拷贝构造函数典型使用场景 二、运算符重载函数三、赋值运算符重载函数1. 赋值运算符重载格式2. 赋值运算符只能重载成类的成员函数不能重载成全局函数3.编译器生成一个默认赋值运算符重载4. 运算符…

Android记录9--实现转盘效果

自定义View /2013.10.16_TurnPlate_Demo/src/com/wwj/turnplate/TurnPlateView.java package com.wwj.turnplate; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; im…

深入了解RTMP推流技术:视频汇聚EasyCVR低延迟与高稳定性分析

RTMP&#xff08;Real Time Messaging Protocol&#xff09;视频推流技术&#xff0c;作为音视频传输领域的关键技术之一&#xff0c;已经在直播、视频会议、在线教育等多个场景中得到了广泛应用。RTMP以其独特的优势&#xff0c;为实时音视频传输提供了高效、稳定的解决方案。…

ffmpeg音视频开发从入门到精通——ffmpeg实现音频抽取

文章目录 FFmpeg 实现音频流抽取1. 包含FFmpeg头文件与命名空间声明2. 主函数与参数处理3. 打开输入文件4. 获取文件信息5. 查找音频流6. 分配输出文件上下文7. 猜测输出文件格式8. 创建新的音频流9. 打开输出文件10. 写入文件头信息11. 读取并写入音频数据12. 写入文件尾部信息…

重磅!2024年最新影响因子(生态学/林学/土壤学/遥感/微生物/环境科学/植物科学) 收藏版!

2024年最新影响因子正式揭晓&#xff01;2024年6月20日&#xff0c;Clarivate Analytics&#xff08;科睿唯安&#xff09;发布了各大SCI期刊的2023年影响因子。从最新结果看&#xff0c;今年的影响因子继续“普跌”&#xff0c;其中顶刊Nature和Science均有下降&#xff0c;分…

ubuntu永久换镜像源详细方法

1.查看ubuntu的版本&#xff0c;不同的版本对应的不同的镜像源&#xff08;下面会讲到&#xff0c;先按步骤操作即可&#xff09; cat /etc/issue 2.先备份一个&#xff0c;防止更改错误 cp /etc/apt/sources.list /etc/apt/sources.list.backup 3.备份好之后删除原有的sour…

Android图片圆角转换 RoundedImageView开源项目 小记(1)

android:background“#7f000000” android:paddingLeft“8dp” android:paddingRight“8dp” android:textAppearance“?android:attr/textAppearanceMediumInverse” /> <TextView android:id“id/textView1” android:layout_width“wrap_content” android:la…

【Gradio】从 BigQuery 数据创建实时仪表板

Google BigQuery 是一个基于云的服务&#xff0c;用于处理非常大的数据集。它是一个无服务器且高度可扩展的数据仓库解决方案&#xff0c;使用户能够使用类 SQL 查询分析数据。 在本教程中&#xff0c;我们将向您展示如何在 Python 中查询 BigQuery 数据集&#xff0c;并使用 g…

SpringBoot 快速入门(保姆级详细教程)

目录 一、Springboot简介 二、SpringBoot 优点&#xff1a; 三、快速入门 1、新建工程 方式2&#xff1a;使用Spring Initializr创建项目 写在前面&#xff1a; SpringBoot 是 Spring家族中的一个全新框架&#xff0c;用来简化spring程序的创建和开发过程。SpringBoot化繁…