AWS Secrets Manager のマネージド外部シークレットで Datadog の認証情報を自動ローテーションしてみた
はじめに
こんにちは。しいなです。
AWS Secrets Manager のマネージド外部シークレットは、サードパーティサービスと統合し、AWS が管理するローテーションの仕組みで外部サービスの認証情報を自動ローテーションできる機能です。
先日、Datadog 統合に対応したため、Datadog 認証情報を自動ローテーションできるようになりました。
実際に試してみましたので、ローテーションの仕組みを整理しつつ、シークレットの登録手順をまとめてみました。
マネージド外部シークレット
AWS Secrets Manager のシークレットタイプの一つです。
サードパーティサービスと統合し、シークレットの自動ローテーションを行うことができます。
Datadog の統合に対応したため、Datadog 認証情報(API キーやアプリケーションキー)を自動ローテーションすることができます。
従来、自動ローテーションを実現するためには、AWS Lambda 関数を作成および管理する必要がありましたが、マネージドサービスとして利用できます。
Datadog のマネージド外部シークレット
登録できる Datadog のシークレットタイプは以下の3種類です。
- Datadog API キー(DatadogApiKey)
- Datadog アプリケーションキー(DatadogApplicationKey)
- Datadog 管理者キー(DatadogAdminKey)
制約
ローテーション可能な Datadog アプリケーションキーは Datadog 管理者アプリケーションキーと同一のサービスアカウントが所有している必要があります。
ローテーションの動作
Datadog 管理者キーを利用して、他の APIキー、アプリケーションキーのローテーションを行います。
そのため、Datadog 管理者キー(Datadog API キーとアプリケーションキーのペア)をシークレットに登録する必要があります。
Datadog 管理者キー自体は自己ローテーション可能です。

Secrets Manager は Datadog 管理者キーを用いて次のようにローテーションを行います。
-
- 現在のキーの所有権を検証
-
- Datadog サービスアカウント API を通じて新しいアプリケーションキーを作成
-
- その後、新しいキーを検証し、AWSCURRENT に昇格させたうえで、古いキーを削除(※Datadog API キーは2世代前のキーを削除)
Datadog のサービスアカウント
Datadog のアプリケーションキーをチーム全体で共有するための特別なアカウントです。
通常のアプリケーションキーは Datadog の個人アカウントが所有するため、アカウントを無効化すると、アプリケーションキーも同時に失効する注意点がありました。
サービスアカウントを利用すると、サービスアカウントが Datadog アプリケーションキーを所有するため、個人アカウントの無効化による失効を回避できます。
Datadog 管理者アプリケーションキーに必要な権限
管理者アプリケーションキーに必要な権限スコープは次の通りです。
| スコープ | 説明 |
|---|---|
api_keys_delete |
組織の API キーを削除する |
api_keys_write |
組織の API キーを作成・名前変更する |
org_app_keys_read |
組織内全ユーザーが所有するアプリケーションキーを閲覧する |
org_app_keys_write |
組織内全ユーザーが所有するアプリケーションキーを管理する |
service_account_write |
組織のサービスアカウントを作成・無効化・使用する |
Datadog 管理者アプリケーションキーは他の API キーやアプリケーションキーをローテーションする目的のため、最小限の権限を割り当てるのが良いでしょう。
Datadog のセットアップ
1. サービスアカウント登録
-
メニューの「Organization-settings > Service-accounts」を選択します。

-
「New Service Account」を選択します。
-
以下を入力して「Create Service Account」を選択します。
- Name:任意 (例:SRE Team Service Account)
- Email:メールアドレス
- Assign Roles:Datadog Admin Role

-
一覧より作成したアカウントを選択します。

-
後述の設定で必要となる DatadogサービスアカウントID(UUID)を URL クエリパラメータから取得します。
URL形式
https://app.datadoghq.com/organization-settings/service-accounts?service_account_id=xxxxxxxxxxx-xxxxx-xxxx-xxxxxxxx
パラメータ名 service_account_id= の値が Datadog サービスアカウントID(UUID)です。
2. 管理者アプリケーションキー発行
-
「New Key」を選択します。

-
任意の Name (例:Datadog Admin Application Key)を指定して 「Create Key」を選択します。
-
キー値と KeyID(UUID) を控えます。
- Scopes「Edit」を選択します。
- 最小限の権限である、以下のスコープにチェックを入れて「Save」を選択します。
- api_keys_delete
- api_keys_write
- org_app_keys_read
- org_app_keys_write
- service_account_write

- 「Finish」を選択します。

3. アプリケーションキー発行
続けて、自動ローテーションさせる アプリケーションキーを発行します。
- 「New Key」を選択します。
- 任意の Name (例:SRE Team Datadog Application Key)を指定して 「Create Key」を選択します。
- キー値と KeyID(UUID) を控えます。
- 「Finish」を選択します。
スコープの設定は任意です。
設定する場合は、アプリケーションキーを利用してリクエストする API に応じたスコープを選択してください。
4. 管理者 API キー発行
-
メニューの「Organization-settings > API Keys」を選択します。

-
「New key」を選択します。
-
任意の Name (例:Datadog Admin Api Key)を指定して 「Create Key」を選択します。
-
キー値と keyID(UUID) を控え、「Finish」を選択します。

5. API キー発行
続けて、自動ローテーションさせる APIキー を発行します。
- 「New key」を選択します。
- 任意の Name (例:SRE Team Datadog Api Key)を指定して 「Create Key」を選択します。
- キー値と keyID(UUID) を控え、「Finish」を選択します。
AWS Secrets Manager のセットアップ
1. IAM ロール作成
マネージド外部シークレットのローテーションに必要なポリシーを与えたロールを作成します。
ロールは API キー、アプリケーションキー、Datadog管理者キーそれぞれのシークレットに対して、共有利用します。
ローテーションには Datadog 管理者キーを利用するため、Datadog 管理者キーを登録したシークレットに対してもGetSecretValue権限を与える必要があります。
今回は次のロールポリシーを利用しました。
ロール名
任意(例:Datadog-Managed-External-Secrets-Role)
許可ポリシー(インラインポリシー)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret",
"secretsmanager:PutSecretValue",
"secretsmanager:UpdateSecretVersionStage"
],
"Resource": "arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "secretsmanager:GetRandomPassword",
"Resource": "*"
}
]
}

信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SecretsManagerPrincipalAccess",
"Effect": "Allow",
"Principal": {
"Service": "secretsmanager.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "XXXXXXXXXXXX"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:*"
}
}
}
]
}

2. シークレット登録(Datadog 管理者キー)
はじめに、Datadog 管理者キーをシークレットに登録します。
- AWS マネジメントコンソールから、「AWS Secrets Manager」サービスのナビゲーションメニュー「シークレット」を選択します。
- 「新しいシークレットを保存する」を選択します。
- 以下を指定します。
- シークレットタイプ:マネージド外部シークレット
- AWS Secrets Manager 統合サードパーティベンダー:Datadog Admin Key
- Admin API Key:管理者 API キーの値
- Admin API Key ID:管理者 API キーの KeyID(UUID)
- Admin Application Key:管理者アプリケーションキーの値
- Admin Application Key ID:管理者アプリケーションキーの KeyID(UUID)
- Service Account ID: Datadog サービスアカウント ID(UUID)
- Datadog Site:サイト名(例:datadoghq.com)

-
任意のシークレット名(例:Datadog-Admin-Managed-Secrets)を指定します

-
ローテーションスケジュールと作成したロールを指定し、シークレットを登録します。

-
シークレットが登録されたことを確認します。

3. シークレット登録(Datadog アプリケーションキー)
続けて、Datadog アプリケーションキーをシークレットに登録します。
- 「新しいシークレットを保存する」を選択します。
- 以下を指定します。
- シークレットタイプ:マネージド外部シークレット
- AWS Secrets Manager 統合サードパーティベンダー:Datadog Application Key
- Application Key:アプリケーションキーの値
- Application Key ID:アプリケーションキーの KeyID(UUID)
- Service Account ID:Datadog サービスアカウント ID(UUID)

-
任意のシークレット名(例:Datadog-ApplicationKey-Managed-Secrets)を指定します

-
Admin Secret ARN では Datadog 管理者キーのシークレット名を選択します。
-
ローテーションスケジュールと作成したロールを指定し、シークレットを登録します。

-
シークレットが登録されたことを確認します。

4. シークレット登録(Datadog API キー)
続けて、Datadog API キーをシークレットに登録します。
- 「新しいシークレットを保存する」を選択します。
- 以下を指定します。
- シークレットタイプ:マネージド外部シークレット
- AWS Secrets Manager 統合サードパーティベンダー:Datadog API Key
- API Key:API キーの値
- API Key ID:API キーの KeyID(UUID)

-
任意のシークレット名(例:Datadog-ApiKey-Managed-Secrets)を指定します

-
Admin Secret ARN では Datadog 管理者キーのシークレット名を選択します。
-
ローテーションスケジュールと作成したロールを指定し、シークレットを登録します。

-
シークレットが登録されたことを確認します。

ローテーションしてみた
手動でアプリケーションキーのローテーションを行い、AWS Secret Manager、Datadog 側の動作をそれぞれ確認してみます。
アプリケーションキーのローテーション
-
AWS マネジメントコンソールから、「AWS Secrets Manager」サービスのナビゲーションメニュー「シークレット」を選択します。
-
一覧よりローテーションするシークレットを選択します。
-
ローテーションタブを選択します。
-
「すぐにシークレットをローテーションさせる」を選択し、ローテーションを実行させます。

しばらくしてから、シークレットがローテーションされているか確認します。 -
「バージョン」タブを選択します。
-
ローテーションに成功すると、2つのバージョンのシークレットが登録されていることが確認できます。
- ステージングラベル:AWSCURRENT、AWSPENDING
- ステージングラベル:AWSPREVIOUS

CloudTrail イベント
ローテーションを行うと次の CloudTrail イベントが記録されます。
RotateSecretRotationStartedPutSecretValueRotationSucceededUpdateSecretVersionStage

ローテーションに失敗した場合は RotationFailed が記録されます。
原因は errorCode レコードから特定することができます。
Datadog のアプリケーションキー
ローテーションにより作成された新しいアプリケーションキーの状態を見てみます。
ローテーション前のキーは無効化され、新しいキーが作成されていることが確認できます。
新しいキーの名前は次の命名規則となっていました。
aws-sm-app-key-Datadog-ApplicationKey-Managed-Secrets-YYYYMMDD-XXXXXX

Datadog AuditTrail イベント
Datadog の AuditTrail イベントを見てみます。
アクターはサービスアカウントを絞り込みます。
- フィルタクエリ例:
@evt.actor.type:SERVICE_ACCOUNT
キー作成、無効化のリクエストが行われていることが確認できます。

ハマったところ
うまくローテーションができなかったケースがあったので原因をまとめてみます。
サービスアカウントが異なる
RotationFailed エラーコード
Admin key's serviceAccountId (XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX) must match the Application key's serviceAccountId (XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX).
ローテーション対象のアプリケーションキーは管理者アプリケーションキーと同じ Datadog サービスアカウントである必要があります。
権限昇格の観点からサービスアカウントが異なる場合のローテーションはサポートされていません。
管理者キーシークレットに対する権限不足
RotationFailed エラーコード
User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/SecretsManager-ap-northeast-1-DatadogApiKey-1e70ebac-e96e-45/SecretsManager is not authorized to perform: secretsmanager:GetSecretValue on resource: arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:Datadog-Admin-Managed-Secrets-RwZLT3 because no identity-based policy allows the secretsmanager:GetSecretValue action (Service: SecretsManager, Status Code: 400, Request ID: XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX) (SDK Attempt Count: 1)"
シークレットに設定した IAM ロールに対して、管理者キーシークレットに対するGetSecretValue権限の不足が原因でした。
シークレット登録時にデフォルトロールを作成できますが、作成されるポリシーは Condition 条件によりGetSecretValue可能なシークレットタイプを制限しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowRotationAccess",
"Action": [
"secretsmanager:DescribeSecret",
"secretsmanager:GetSecretValue",
"secretsmanager:PutSecretValue",
"secretsmanager:UpdateSecretVersionStage"
],
"Resource": "arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXX:secret:*",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"secretsmanager:resource/Type": "DatadogApiKey"
}
}
},
{
"Sid": "AllowPasswordGenerationAccess",
"Action": [
"secretsmanager:GetRandomPassword"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
まとめ
Secrets Manager のマネージド外部シークレットによる Datadog 認証情報の自動ローテーションを試してみました。
個別に Lambda の実装や管理が不要になり、マネージドにローテーションできるのは運用面で嬉しいポイントです。
サービスアカウントによるキー所有や、管理者キーを起点としたローテーションの仕組みを理解しておくとスムーズに導入できると思います。
Datadog の認証情報を定期的にローテーションしたい方は、ぜひマネージド外部シークレットを活用してみてください。
本記事が参考になれば幸いです。
参考






