AWS Secrets Manager

AWS Secrets Manager 作為金鑰值儲存庫,用於儲存密碼、存取權杖和加密金鑰等機密資訊。AWS 使用 AWS 金鑰管理服務 (AWS-KMS) 加密這些機密資訊。

本教學說明如何設定 KES 伺服器,該伺服器使用 AWS Secrets Manager 作為由 AWS-KMS 保護的持久性金鑰儲存庫。

K E S C l i e n t K E S S e r v e r A W S S e c A r W e S t - s K - M M S a n a g e r

AWS Secrets Manager

先決條件
您需要一組具有足夠 IAM 政策權限的 AWS 存取金鑰和 AWS 秘密金鑰對,才能使用 AWS Secrets Manager 建立、擷取和刪除機密資訊。
  1. 建立 AWS 存取/秘密金鑰對

    • 前往 AWS 主控台

    • 建立新使用者

      如需新增 AWS 使用者的詳細資訊,請參閱 AWS 文件

    • 使用 程式設計存取 類型來建立新的存取金鑰/秘密金鑰對

  2. 附加 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": "*"
        }
      ]
    }
    
    此範例政策授予對所有 KMS 和 SecretsManager 資源的存取權。您可以指定 AWS ARN 作為 Resource,而不是 * 來限制存取權。
    AWS 預定義了政策 (SecretsManagerReadWriteAWSKeyManagementServicePowerUser)。然而,這些政策授與的權限超出實際所需。

KES 伺服器設定

  1. 產生 KES 伺服器私鑰與憑證

    首先,我們需要為我們的 KES 伺服器產生一個 TLS 私鑰和憑證。KES 伺服器是預設安全的,並且只能在 TLS 的情況下運行。為了簡單起見,這裡我們使用自簽憑證。

    以下命令會為 IP 位址 127.0.0.1 和 DNS 名稱 localhost 產生一個新的 TLS 私鑰/公鑰對和憑證

    $ kes identity new --ip "127.0.0.1" localhost
    
      Private key:  private.key
      Certificate:  public.crt
      Identity:     2e897f99a779cf5dd147e58de0fe55a494f546f4dcae8bc9e5426d2b5cd35680
    
    如果您已經有 TLS 私鑰和憑證,例如來自 WebPKI 或內部 CA,您可以使用它們來代替。請記得稍後調整 tls 設定區段。
  2. 產生客戶端憑證

    以下命令會產生一個新的 TLS 私鑰/公鑰對

    $ kes identity new --key=client.key --cert=client.crt MyApp
    
      Private key:  client.key
      Certificate:  client.crt
      Identity:     02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b
    

    Identityclient.crt 中公鑰的唯一指紋,您可以隨時重新計算。

    $ kes identity of client.crt
    
      Identity:  02ef5321ca409dbc7b10e7e8ee44d1c3b91e4bf6e2198befdebee6312745267b
    
  3. 設定 KES 伺服器

    建立 KES 伺服器設定檔config.yml。身分 (Identity) **必須**與 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
    
  4. 啟動 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 存取

  1. 設定 KES_SERVER 端點

    此環境變數會告訴 KES CLI 它應該與哪個伺服器通訊。

    $ export KES_SERVER=https://127.0.0.1:7373
    
  2. 使用客戶端憑證

    以下環境變數設定 KES CLI 用來與 KES 伺服器通訊的存取憑證。

    $ export KES_CLIENT_CERT=client.crt
    
    $ export KES_CLIENT_KEY=client.key
    
  3. 測試存取

    執行任何根據我們在上面指派的政策允許的 API 操作。

    例如,建立一個金鑰

    $ kes key create my-key-1
    

    使用金鑰產生新的資料加密金鑰

    $ kes key dek my-key-1
    {
      plaintext : UGgcVBgyQYwxKzve7UJNV5x8aTiPJFoR+s828reNjh0=
      ciphertext: eyJhZWFkIjoiQUVTLTI1Ni1HQ00tSE1BQy1TSEEtMjU2IiwiaWQiOiIxMTc1ZjJjNDMyMjNjNjNmNjY1MDk5ZDExNmU3Yzc4NCIsIml2IjoiVHBtbHpWTDh5a2t4VVREV1RSTU5Tdz09Iiwibm9uY2UiOiJkeGl0R3A3bFB6S21rTE5HIiwiYnl0ZXMiOiJaaWdobEZrTUFuVVBWSG0wZDhSYUNBY3pnRWRsQzJqWFhCK1YxaWl2MXdnYjhBRytuTWx0Y3BGK0RtV1VoNkZaIn0=
    }
    

將 KES 與 MinIO 伺服器搭配使用

MinIO 伺服器需要 KES 啟用伺服器端資料加密。

請參閱KES for MinIO 指示指南,了解將您的新 KES 伺服器與 MinIO 伺服器搭配使用所需的其他步驟。

設定參考

以下章節描述金鑰加密服務 (KES) 設定,以使用 AWS Secrets Manager 和 AWS Key Management System 作為根 KMS,來儲存外部金鑰,例如用於 MinIO 伺服器上的伺服器端加密的金鑰。

MinIO 伺服器需要擴展權限
MinIO Server RELEASE.2023-02-17T17-52-43Z 開始,MinIO 需要擴展的 KES 權限才能正常運作。本節中的範例設定包含所有必要的權限。