AWS Secrets Manager
Secret ManagerはAWS環境でのパスワード管理を行うサービスです。
パスワードをSecretManagerが一元管理することにより、各プログラムでパスワードを保存する必要がなくなるので管理上は便利になりますが、仕様を理解しておかないと、パスワードの更新ができなくなったり認証に失敗してしまいます。
概要
SecretManagerは単体で動作するのではなく、AWSの他サービスと連携して動作します。
Secretmanagerはフロントエンドとして動作し、パスワードの変更はLabmdaが実行します。
また、パスワード等の情報はKMSに保存されます。
AWS Secrets Manager で AWS KMS を使用する方法
Secrets Manager は AWS Key Management Service (AWS KMS) と統合されて、AWS KMS カスタマーマスターキー (CMK) によって保護された一意のデータ暗号化キーを使用して、すべてのシークレットの全バージョンを暗号化します。 この統合により、AWS KMS を暗号化されないままにしない暗号化キーにより、シークレットが保護されます。
SecretManagerとKMS間の通信は技術的には特に意識する部分はありません。
ただし、Labmdaについては通信を意識する必要があります。
ネットワーク構成
LabmdaはSecretManagerと通信を行います。また、RDSなどパスワードを更新する対象リソースとの通信を行います。
LabmdaとRDSは同じVPCに所属する必要があります。
別VPC間での通信はサポートされていません。
LabmdaとRDSはグローバルIPでの通信もできますし、VPC内でのローカル通信も可能となります。
注意が必要なのはLabmdaとSecretManager間の通信です。
こちらは2つの方式があります。
1つ目はNatGatewayをVPCに設定しLabmdaがWAN経由でSecretManagerと通信する方法です。
2つ目はSecretManagerのエンドポイントをVPCに作成しローカル通信を行う方法です。
実際に作成する場合は、エンドポイントを使用するほうが良いかと思います。
WAN経由だと色々突っ込まれそうなので・・・
プライベート VPC で AWS Secrets Manager シークレットをローテーションする方法を教えて下さい
SecretManagerの管理内容
SecretManagerは「シークレット」という単位で管理を行います。
シークレットはユーザーアカウントと同じと考えてください。
ユーザーアカウントのパスワード、ローテーションタイミング等を管理する単位が「シークレット」となります。
AWS Secrets Manager の主な用語と概念
まずは、RDSへの設定を試してみると分かりやすいと思います。
チュートリアル: AWS データベースのシークレットのローテーション
設計方針
AWS Secrets Manager のベストプラクティス
ポイントとなる点としては
・都度問い合わせをするとアプリのパフォーマンスが下がるので、ある程度はキャッシュして問い合わせ回数を減らす。
・問い合わせ可能なサービス等はIAMで制御しておく。
・できるだけローカル通信で行う。
パスワード更新時の影響
更新対象については特に影響を受けません。
どちらかというと、アプリケーション側の実装がメインになります。
パスワード更新はLabmdaが実施するのでSecretMangerでシークレットを作成した際に自動生成されるLabmdaプログラムを見るのが一番手っ取り早いです。
例えば、Auroraを対象とする場合、Labmdaの内容を見ると普通にAuroraにMySQLクライアントで接続しパスワード変更コマンドを実行しています。
そのため、影響範囲としては通常のMySQLパスワード変更と同じです。
既存セッションが切れるわけでもないので影響無しです。
むしろ、新規セッションを張る際に「新しいパスワード」を使用する必要があるので更新と共に適切にパスワードを取得する処理を実装することが必要です。
毎回問い合わせを行うとパフォーマンスの問題が出てくるのでキチンと検討しましょう。
パスワード更新タイミング
SecretMangerでは「何日間隔で更新するか」という指定のみで時間までは指定できません。
こちらは仕様となっています。
ローテーションが開始される時を予測できません
前のローテーションが完了すると、Secrets Manager は次のローテーションをスケジュールします。 Secrets Manager は、最後のローテーションの実際の日付にローテーションの間隔 (日数) を追加して、日付をスケジュールします。 サービスは、その 24 時間の日付の枠内で時間をランダムに選択します。 分も若干ランダムに選択されますが、正時に向かって重み付けされ、負荷を分散させるのに役立つさまざまな要素に影響されます。
ということで、時間指定を行いたい場合はLabmdaかAWS SDKを使用してパスワード更新を行う必要があります。
コメント