Google Cloud Secret Manager
本教程介绍如何设置使用 GCP Secret Manager 作为持久密钥存储的 KES 服务器。
Google Cloud Secret Manager
The Google Cloud Secret Manager 是用于存储机密信息(如密码、访问令牌和加密密钥)的键值存储。
-
登录 GCP 控制台
-
创建一个新项目或选择一个现有项目
-
启用 Secret Manager 服务 (如果您的项目尚未启用)。
-
转到 GCP IAM 用于服务帐户 并为 KES 创建一个新的服务帐户。KES 使用此服务帐户来向 GCP 进行身份验证并访问 Secret Manager。
-
将一个或多个角色分配给新帐户
如果您想快速入门,请分配
Secret Manager Admin
角色。但是,这会授予 KES 比所需更多的权限。或者,为 KES 创建一个新角色 ,该角色具有所需的最小权限
secretmanager.secrets.create secretmanager.secrets.delete secretmanager.secrets.get
-
为服务帐户创建密钥 (通过
Actions
-Create Key
)。使用
JSON
密钥格式。GCP 允许您下载一个具有以下结构的 JSON 文件
{ "type": "service_account", "project_id": "<your-project-id>", "private_key_id": "<your-private-key-id>", "private_key": "-----BEGIN PRIVATE KEY-----\n ... -----END PRIVATE KEY-----\n", "client_email": "<your-service-account>@<your-project-id>.iam.gserviceaccount.com", "client_id": "<your-client-id>" }
使用此凭据文件配置 KES 以验证 Google Cloud Platform (GCP) 并访问 Secret Manager。
KES 服务器设置
KES 服务器需要 TLS 私钥和证书。
KES 服务器默认情况下是安全的,只能在 TLS 下运行。本教程使用自签名证书来简化操作。
-
为 KES 服务器生成 TLS 私钥和证书
以下命令生成一个新的 TLS 私钥
server.key
和一个自签名 X.509 证书server.cert
,该证书为 IP127.0.0.1
和 DNS 名称localhost
(作为 SAN)颁发。自定义命令以匹配您的设置。kes tool identity new --server --key server.key --cert server.cert --ip "127.0.0.1" --dns localhost
任何其他用于 X.509 证书生成的工具也能正常工作。例如,您可以使用
openssl
$ openssl ecparam -genkey -name prime256v1 | openssl ec -out server.key $ openssl req -new -x509 -days 30 -key server.key -out server.cert \ -subj "/C=/ST=/L=/O=/CN=localhost" -addext "subjectAltName = IP:127.0.0.1"
-
为应用程序创建私钥和证书
kes tool identity new --key=app.key --cert=app.cert app
您可以随时计算
app
标识。kes tool identity of app.cert
-
创建 配置文件
server-config.yml
address: 0.0.0.0:7373 root: disabled # We disable the root identity since we don't need it in this guide tls: key : server.key cert: server.cert policy: my-app: allow: - /v1/key/create/my-app* - /v1/key/generate/my-app* - /v1/key/decrypt/my-app* identities: - ${APP_IDENTITY} keystore: gcp: secretmanager: project_id: "<your-project-id>" # Use your GCP project ID credentials: client_email: "<your-client-email>" # Use the client email from your GCP credentials file client_id: "<your-client-id>" # Use the client ID from your GCP credentials file private_key_id: "<your-private-key-id" # Use the private key ID from your GCP credentials file private_key: "-----BEGIN PRIVATE KEY----- ..." # Use the private key from your GCP credentials file
-
在新窗口/标签页中启动 KES 服务器
Linux
export APP_IDENTITY=$(kes tool identity of app.cert) kes server --config=server-config.yml --auth=off
该命令使用--auth=off
,因为我们的root.cert
和app.cert
证书是自签名的。容器
以下说明使用 Podman 来管理容器。您也可以使用 Docker。
根据您的部署需要修改地址和文件路径。
sudo podman pod create \ -p 9000:9000 -p 9001:9001 -p 7373:7373 \ -v ~/minio-kes-gcp/certs:/certs \ -v ~/minio-kes-gcp/minio:/mnt/minio \ -v ~/minio-kes-gcp/config:/etc/default/ \ -n minio-kes-gcp sudo podman run -dt \ --cap-add IPC_LOCK \ --name kes-server \ --pod "minio-kes-gcp" \ -e KES_SERVER=https://127.0.0.1:7373 \ -e KES_CLIENT_KEY=/certs/kes-server.key \ -e KES_CLIENT_CERT=/certs/kes-server.cert \ quay.io/minio/kes:2024-01-11T13-09-29Z server \ --auth \ --config=/etc/default/kes-config.yaml \ sudo podman run -dt \ --name minio-server \ --pod "minio-kes-gcp" \ -e "MINIO_CONFIG_ENV_FILE=/etc/default/minio" \ quay.io/minio/minio:RELEASE.2024-01-31T20-20-33Z server \ --console-address ":9001"
您可以使用以下命令验证容器的状态。该命令应该显示三个 pod,一个用于 Pod,一个用于 KES,一个用于 MinIO。
sudo podman container list
-
在另一个窗口或标签页中,连接到服务器
export KES_CLIENT_CERT=app.cert export KES_CLIENT_KEY=app.key kes key create -k my-app-key
export APP_IDENTITY=$(kes tool identity of app.cert) kes server --config=server-config.yml --auth=off
该命令使用--auth=off
,因为我们的root.cert
和app.cert
证书是自签名的。现在,如果您 转到 GCP Secret Manager,您应该看到一个名为
my-app-key
的密钥。 -
从之前创建的
my-app-key
中导出和解密数据密钥kes key derive -k my-app-key { plaintext : ... ciphertext: ... }
kes key decrypt -k my-app-key <base64-ciphertext>
使用 KES 与 MinIO 服务器
MinIO 服务器需要 KES 才能启用服务器端数据加密。
有关将新 KES 服务器与 MinIO 服务器一起使用所需的其他步骤,请参阅 KES for MinIO 说明指南。
配置参考
以下部分介绍了密钥加密服务 (KES) 配置设置,以使用 Google Cloud Secret Manager 作为根 KMS 来存储外部密钥,例如用于 MinIO 服务器上的服务器端加密的密钥。