HCP Vault Secretsを使って複数AWSアカウントのSecrets Managerを同期させてみる

2023.07.07

複数AWSアカウント間でSecrets ManagerのSecretを共有は、KMSのキーポリシーやIAMポリシーを設定すれば可能です。

アカウント間で Secrets Manager のシークレットを共有する | AWS re:Post

HCP Vault Secretsを使えばより簡単にSecretsを複数AWSアカウント間で共有できるかもと思い、試してみました。

HCP Vault Secretsとは

シークレット管理のサービスです。2023年6月にパブリックベータとして発表されました。

HCP Vault Secretで管理しているシークレットをAWS Secrets Manager等と同期することも可能です。

Valultのマネージドサービスとして、HCP Vaultが以前から存在していました。

以下の表を見ると違いが分かりやすいです。

What is HCP Vault Secrets | Vault | HashiCorp Developerより引用

HCP VaultはSecrets管理の他に暗号化や証明書の管理も可能です。

HCP Vaultはクラスターを作成する必要がありますが、HCP Vault Secretsは作成不要です。

HCP Vault Secretではクラスターサイズを気にすること無く、よりシンプルにSecrets管理ができます。

やってみる

HCP Vault SecretsはAWS Secrets ManagerとSecretsを同期したりできます。

今回は複数AWSアカウントで同じSecretsを利用したいケースを想定して、HCP Vault Secretsと2つのAWSアカウントのSecrets Managerを同期させてみます。

Applicationの作成

HCP ポータルにログインして、Vault Secretsを選択します。

Create new applicationでアプリケーションを作成します。

今回はTestApplicationという名前で作成します。

Secretsの作成

TestApplicationにリダイレクトされるため、Add new secretでSecretsを作成します。

Key ValutでSecretsを作成できます。今回は以下の値でSecretsを作成します。

  • Name: username
  • Valut: test-user

ちなみにActivity LogsからSecrets作成等のログを確認できます。

AWS Secrets Manager統合・同期

Secretsを用意できたので、Secrets Managerと同期させます。

IntegrationsからAWS Secrets Managerを選択します。

Add new sync destinationを選択して、同期先の情報を入力します。

今回はaccount-aaccount-bの2つの同期先を作成します。

上記のRole ARNには、HCP Vault SecretsがAWS Secrets Managerを操作するためのRoleを指定します。

RoleはTerraformで作成します。

公式ドキュメントの方でRole作成用のTerraformを用意してくれているので、それを使ってterraformを実行します。(terraform init -> terraform apply)

Integrate with AWS Secrets Manager | HashiCorp Cloud Platform | HashiCorp Developer

main.tf

provider "aws" {
  // See https://registry.terraform.io/providers/hashicorp/aws/latest/docs#authentication-and-configuration
  // for options on how to configure this provider. The following parameters or environment
  // variables are typically used.

  // Parameters:
  // access_key = ""
  // secret_key = ""
  // region     = ""

  // Environment variables:
  // AWS_ACCESS_KEY_ID
  // AWS_SECRET_ACCESS_KEY
  // AWS_REGION
}

variable "external_id" {
  type        = string
  description = "External ID to securely delegate access to HCP Vault Secrets"
  sensitive   = true
}

resource "aws_iam_role" "hashicorp_vault_secrets_role" {
  name = "HCPVaultSecrets"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          AWS = "arn:aws:iam::879554817125:role/HCPVaultSecrets_Sync"
        }
        Condition = {
          StringEquals = {
            "sts:ExternalId" = var.external_id
          }
        }
      }
    ]
  })

  inline_policy {
    name   = "HCPVaultSecrets"
    policy = data.aws_iam_policy_document.hashicorp_vault_secrets_policy.json
  }
}

data "aws_iam_policy_document" "hashicorp_vault_secrets_policy" {
  statement {
    effect = "Allow"
    actions = [
      "secretsmanager:DescribeSecret",
      "secretsmanager:GetSecretValue",
      "secretsmanager:CreateSecret",
      "secretsmanager:PutSecretValue",
      "secretsmanager:UpdateSecret",
      "secretsmanager:UpdateSecretVersionStage",
      "secretsmanager:DeleteSecret",
      "secretsmanager:RestoreSecret",
      "secretsmanager:TagResource",
      "secretsmanager:UntagResource"
    ]
    resources = ["*"]
  }
}

output "role_arn" {
  description = "Role ARN to configure the AWS Secrets Manager Integration"
  value       = aws_iam_role.hashicorp_vault_secrets_role.arn
}

terraform.tfvars

external_id="<HCP Vault Secretsの画面で表示されている、External ID>"

TerraformのOutputにRole ARNが表示されるため、Add new sync destinationRole ARNに貼り付けます。

任意のリージョンを選択します。(今回は、us-east-1を選択、2023/7時点では東京リージョンは対応していない)

Save and sync Secretsで同期設定を完了させます。

これで1アカウント分の設定が完了しました。

2つ目のアカウントでも同様の設定を行います。

External Idは同期先ごとに変わらないため、tfvarsの内容はそのままで問題ありません。

同期が完了すると、以下のようにStatusがSyncedになります。

実際に各アカウントでSecrets Managerが作成されて、Secretsが保存されているか見てましょう。

# アカウントAの認証情報をセット
$ aws secretsmanager get-secret-value --secret-id TestApplication/username --region us-east-1
{
    "ARN": "arn:aws:secretsmanager:us-east-1:<アカウントAのアカウントID>:secret:TestApplication/username-3LwKPy",
    "Name": "TestApplication/username",
    "VersionId": "0C324B40-A6ED-4CC9-93AC-4E71E5A10D0A",
    "SecretString": "test-user",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2023-07-05T18:30:25.413000+09:00"
}
# アカウントBの認証情報をセット
$ aws secretsmanager get-secret-value --secret-id TestApplication/username --region us-east-1
{
    "ARN": "arn:aws:secretsmanager:us-east-1:<アカウントBのアカウントID>:secret:TestApplication/username-NANMmZ",
    "Name": "TestApplication/username",
    "VersionId": "AA70D0E1-3299-4D29-8ACC-DC6D4BA12A19",
    "SecretString": "test-user",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2023-07-05T18:30:34.805000+09:00"
}

アカウントAとアカウントBでSecrets ManagerTestApplication/usernameが作成されていることが確認できました。

HCP Vault SecretsのSecrets値を更新してみる

HCP Vault Secrets側でSecretsを更新して、Secrets Managerに反映されるか確認してみます。(test-user -> test-user-2に変更)

Secrets Managerを確認すると、test-user-2に変更されていました。

アクティビティログとSecrets Managerのログを見た感じ、変更後即時に反映されていました。

$ aws secretsmanager get-secret-value --secret-id TestApplication/username --region us-east-1
{
    "ARN": "arn:aws:secretsmanager:us-east-1:<アカウントBのアカウントID>:secret:TestApplication/username-NANMmZ",
    "Name": "TestApplication/username",
    "VersionId": "49173D5C-4F9A-4F50-82B6-266250CB0DD3",
    "SecretString": "test-user-2",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": "2023-07-06T10:45:05.229000+09:00"
}

HCP Vault SecretsのSecretsを削除してみる

Secretsを削除して、Secrets Managerも削除されるか確認します。

再度コマンドでSecrets Managerを確認してみます。

以下のようにSecretsは削除対象としてマークされているため、値が表示できない旨を確認できました。

HCP Vault Secretsで削除時にSecrets Manager側も削除されるみたいですね。

$ aws secretsmanager get-secret-value --secret-id TestApplication/username --region us-east-1

An error occurred (InvalidRequestException) when calling the GetSecretValue operation: You can't perform this operation on the secret because it was marked for deletion.

おわりに

HCP Vault Secretsを使ってみました。簡単に複数AWSアカウントのSecrets同期ができました。

覚える必要がある概念が、ApplicationとSecretsだけでシンプルで使いやすいです。

現状(2023/7時点)統合先がAWS Secrets Managerのみですが、今後Google CloudやAzureのシークレット管理サービスと統合できるようになったら、マルチクラウドでのシークレット管理が捗りそうです。

ベータ版のためいくつか制約や問題点もありますので、使用の際は注意ください。

HCP Vault Secrets constraints and limitations | HashiCorp Cloud Platform | HashiCorp Developer

今後のアップデートに期待です。

以上、AWS事業本部の佐藤(@chari7311)でした。