Thales CipherTrust Manager(前身为 Gemalto KeySecure)
本教程演示如何设置 KES 服务器,该服务器使用 Thales CipherTrust Manager 实例(以前称为 Gemalto KeySecure)作为持久且安全的密钥存储。
本指南假定您已有一个正在运行的 CipherTrust Manager 实例。它已在 CipherTrust Manager k170v
版本 2.0.0
和 Gemalto KeySecure k170v
版本 1.9.1
和 1.10.0
上进行了测试。
CipherTrust Manager 设置
要通过 ksctl
CLI 连接到您的 CipherTrust Manager 实例,您需要一个类似于以下内容的 config.yaml
文件
KSCTL_URL: <your-keysecure-endpoint>
KSCTL_USERNAME: <your-user/admin-name>
KSCTL_PASSWORD: <your-user/admin-password>
KSCTL_VERBOSITY: false
KSCTL_RESP: json
KSCTL_NOSSLVERIFY: true
KSCTL_TIMEOUT: 30
KSCTL_URL
、KSCTL_USERNAME
和 KSCTL_PASSWORD
的正确值。如果您的 CipherTrust Manager 实例已使用您的机器信任的 TLS 证书进行配置,那么您也可以设置 KSCTL_NOSSLVERIFY: false
。-
为 KES 创建一个新组
ksctl groups create --name KES-Service
-
为该组创建一个新用户
这将打印一个包含user_id
的 JSON 对象,该对象在后面的步骤中需要。如果您已经有要分配给KES-Service
组的现有用户,请跳过此步骤,继续进行步骤 3。ksctl users create --name <username> --pword '<password>'
-
将用户分配给步骤 1 中创建的
KES-Service
组ksctl groups adduser --name KES-Service --userid "<user-ID>"
创建用户时会打印用户 ID。否则,使用
ksctl users list
命令获取 ID。用户 ID 类似于:
local|8791ce13-2766-4948-a828-71bac67131c9
。 -
为
KES-Service
组创建一个策略创建一个名为
kes-policy.json
的文本文件,该文件授予KES-Service
组成员 创建、读取和 删除 权限。该文件的内容应类似于以下内容{ "allow": true, "name": "kes-policy", "actions":[ "CreateKey", "ExportKey", "ReadKey", "DeleteKey" ], "resources": [ "kylo:kylo:vault:secrets:*" ] }
此策略允许 KES 创建、获取和删除主密钥。如果您想阻止 KES 删除主密钥(例如),请省略 DeleteKey 操作。
同样,您可以通过
resources
定义来限制 KES 可以访问的主密钥。使用以下命令,使用上面创建的文件创建策略。
ksctl policy create --jsonfile kes-policy.json
-
将策略附加到
KES-Service
组创建一个名为
kes-attachment.json
的文件,其中包含策略附加规范{ "cust": { "groups": ["KES-Service"] } }
使用以下命令将
kes-policy
附加到KES-Service
组ksctl polattach create -p kes-policy -g kes-attachment.json
-
为 KES 服务器创建一个刷新令牌,用于获取短期身份验证令牌。
以下命令将返回一个新的刷新令牌
ksctl tokens create --user <username> --password '<password>' --issue-rt | jq -r .refresh_token
将
<username>
和<password>
替换为KES-Service
组成员用户的凭据。该命令输出类似于以下的刷新令牌
CEvk5cdHLG7si05LReIeDbXE3PKD082YdUFAnxX75md3jzV0BnyHyAmPPJiA0
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: gemalto: keysecure: endpoint: "" # The REST API endpoint of your KeySecure instance - e.g. https://127.0.0.1 credentials: token: "" # Your refresh token domain: "" # Your domain. If empty, defaults to root domain. retry: 15s tls: ca: "" # Optionally, specify the certificate of the CA that issued the KeySecure TLS certificate.
使用您的刷新令牌。
-
在新窗口/标签页中启动 KES 服务器
export APP_IDENTITY=$(kes tool identity of app.cert) kes server --config=server-config.yml --auth=off
该命令使用--auth=off
,因为我们的root.cert
和app.cert
证书是自签名的。如果启动服务器失败并出现类似以下的错误消息
x509: certificate is not valid for any names, but wanted to match <your-endpoint>
那么您的 CipherTrust Manager 实例提供的 TLS 证书既没有通用名(主体)也没有主体备用名称(SAN)。这样的证书是无效的。更新您的 CipherTrust Manager 实例的 TLS 证书。
您可以使用以下命令分析证书:
openssl x509 -text -noout <certificate>
-
在另一个窗口或标签页中,连接到服务器
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
证书是自签名的。 -
从之前创建的
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 服务器一起使用所需的额外步骤,请参阅用于 MinIO 的 KES 指令指南。
配置参考
以下部分描述了使用 Thales CipherTrust Manager(前身为 Gemalto KeySecure)作为根 KMS 来存储外部密钥(例如用于 MinIO 服务器上的服务器端加密的密钥)的密钥加密服务 (KES) 配置设置。