AWS Secrets Manager
AWS Secrets Manager 充当密码、访问令牌和加密密钥等密钥的键值存储。AWS 使用 AWS Key Management Service (AWS-KMS) 对这些密钥进行加密。
本教程介绍如何设置使用 AWS Secrets Manager 作为持久密钥存储的 KES 服务器,该存储由 AWS-KMS 保护。
AWS Secrets Manager
-
创建 AWS 访问/秘密密钥对
-
附加 AWS 策略
将策略或策略附加到新用户,以授予对 AWS Secrets Manager 和 AWS-KMS 的访问权限。
您的 AWS IAM 用户需要具有以下权限
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1578498399136", "Action": [ "secretsmanager:CreateSecret", "secretsmanager:DeleteSecret", "secretsmanager:GetSecretValue", "secretsmanager:ListSecrets" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "Stmt1578498562539", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt" ], "Effect": "Allow", "Resource": "*" } ] }
AWS 提供了预定义的策略(SecretsManagerReadWrite
和AWSKeyManagementServicePowerUser
)。但是,这些策略授予的权限超出了实际需求。
KES 服务器设置
-
生成 KES 服务器私钥和证书
首先,我们需要为 KES 服务器生成一个 TLS 私钥和证书。KES 服务器默认情况下是安全的,只能在 TLS 环境下运行。为了简便起见,这里使用自签名证书。
以下命令将生成一个新的 TLS 私钥/公钥对,以及一个用于 IP 地址
127.0.0.1
的证书,其 DNS 名称是localhost
。$ kes identity new --ip "127.0.0.1" localhost Private key: private.key Certificate: public.crt Identity: 2e897f99a779cf5dd147e58de0fe55a494f546f4dcae8bc9e5426d2b5cd35680
如果您已经拥有 TLS 私钥和证书,例如来自 WebPKI 或内部 CA,您可以使用它们代替。请记住稍后调整tls
配置部分。 -
生成客户端凭据
以下命令将生成一个新的 TLS 私钥/公钥对
$ kes identity new --key=client.key --cert=client.crt MyApp Private key: client.key Certificate: client.crt Identity: 02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b
Identity
是client.crt
中公钥的唯一指纹,您可以随时重新计算它。$ kes identity of client.crt Identity: 02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b
-
配置 KES 服务器
创建 KES 服务器的 配置文件:
config.yml
。身份信息**必须**与client.crt
身份的策略部分中的身份信息相匹配。address: 0.0.0.0:7373 # Listen on all network interfaces on port 7373 admin: identity: disabled # We disable the admin identity since we don't need it in this guide tls: key: private.key # The KES server TLS private key cert: public.crt # The KES server TLS certificate policy: my-app: allow: - /v1/key/create/my-key* - /v1/key/generate/my-key* - /v1/key/decrypt/my-key* identities: - 02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b # Use the identity of your client.crt keystore: aws: secretsmanager: endpoint: secretsmanager.us-east-2.amazonaws.com # Use the SecretsManager in your region. region: us-east-2 # Use your region kmskey: "" # Your AWS-KMS master key (CMK) - optional. credentials: accesskey: "" # Your AWS Access Key secretkey: "" # Your AWS Secret Key
-
启动 KES 服务器
$ kes server --config config.yml --auth off
Linux 交换保护在 Linux 环境中,KES 可以使用
mlock
系统调用来阻止操作系统将内存中的数据写入磁盘(交换)。这可以防止敏感数据泄露。使用以下命令允许 KES 使用
mlock
系统调用,而无需以root
权限运行sudo setcap cap_ipc_lock=+ep $(readlink -f $(which kes))
启动具有内存保护的 KES 服务器实例
kes server --config config.yml --auth off --mlock
KES CLI 访问
-
设置
KES_SERVER
端点此环境变量告诉 KES CLI 应该连接到哪个服务器。
$ export KES_SERVER=https://127.0.0.1:7373
-
使用客户端凭据
以下环境变量设置 KES CLI 用于与 KES 服务器通信的访问凭据。
$ export KES_CLIENT_CERT=client.crt
$ export KES_CLIENT_KEY=client.key
-
测试访问
执行任何基于我们分配的策略允许的 API 操作。
例如,要创建密钥
$ kes key create my-key-1
使用密钥生成一个新的数据加密密钥
$ kes key dek my-key-1 { plaintext : UGgcVBgyQYwxKzve7UJNV5x8aTiPJFoR+s828reNjh0= ciphertext: eyJhZWFkIjoiQUVTLTI1Ni1HQ00tSE1BQy1TSEEtMjU2IiwiaWQiOiIxMTc1ZjJjNDMyMjNjNjNmNjY1MDk5ZDExNmU3Yzc4NCIsIml2IjoiVHBtbHpWTDh5a2t4VVREV1RSTU5Tdz09Iiwibm9uY2UiOiJkeGl0R3A3bFB6S21rTE5HIiwiYnl0ZXMiOiJaaWdobEZrTUFuVVBWSG0wZDhSYUNBY3pnRWRsQzJqWFhCK1YxaWl2MXdnYjhBRytuTWx0Y3BGK0RtV1VoNkZaIn0= }
将 KES 与 MinIO 服务器一起使用
MinIO 服务器需要 KES 来启用服务器端数据加密。
请参阅 用于 MinIO 的 KES 指导手册,了解将新 KES 服务器与 MinIO 服务器一起使用所需的额外步骤。
配置参考
以下部分介绍了用于将 AWS Secrets Manager 和 AWS Key Management System 作为根 KMS 来存储外部密钥(例如用于 MinIO 服务器上的服务器端加密的密钥)的 Key Encryption Service (KES) 配置设置。