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
-
為該群組建立一個新使用者
這會列印出一個 JSON 物件,其中包含後續步驟所需的user_id
。如果您已經有想要指派給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>
搭配 MinIO 伺服器使用 KES
MinIO 伺服器需要 KES 來啟用伺服器端資料加密。
請參閱KES for MinIO 指導指南,以了解搭配 MinIO 伺服器使用新 KES 伺服器所需的其他步驟。
設定參考
以下章節說明金鑰加密服務 (KES) 設定,以使用 Thales CipherTrust Manager(先前稱為 Gemalto KeySecure)作為根 KMS,以儲存外部金鑰,例如在 MinIO 伺服器上用於伺服器端加密的金鑰。