翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ハードコードされたデータベース認証情報を AWS Secrets Manager に移行する
コード内に平文のデータベース認証情報がある場合は、認証情報を Secrets Manager に移動して、すぐにローテートすることをお勧めします。認証情報を Secrets Manager に移動することで、コードを見た人に認証情報が見えるという問題が解決されます。なぜなら、今後、あなたのコードは Secrets Manager から直接認証情報を取得するからです。シークレットを回転させると、パスワードが更新され、現在のハードコードされたパスワードが無効となるように取り消されます。
Amazon RDS、Amazon Redshift、および Amazon DocumentDB データベースの場合、このページの手順を使用してハードコードされた認証情報を Secrets Manager に移動させることができます。他のタイプの認証情報や他のシークレットについては、「ハードコードされたシークレットを に移動する AWS Secrets Manager」を参照してください。
開始する前に、シークレットへのアクセスが必要なユーザーを決める必要があります。シークレットへのアクセス権限を管理するために、2 つの IAM ロールを使用することをお勧めします。
-
組織のシークレットを管理するロール。詳細については、「Secrets Manager 管理者のアクセス許可」を参照してください。このロールを使用してシークレットを作成し、ローテーションします。
-
実行時に認証情報を使用できるロール、このチュートリアルでは
RoleToRetrieveSecretAtRuntime
です。コードは、このロールを担ってシークレットを取得します。
ステップ 1: シークレットを作成する
最初のステップは、既存のハードコードされた認証情報を、Secrets Manager でシークレットにコピーすることです。レイテンシーを最低限に抑えるために、シークレットをデータベースと同じリージョンに保存します。
シークレットを作成する
-
Secrets Manager のコンソール (https://console.aws.amazon.com/secretsmanager/
) を開きます。 -
[Store a new secret] (新しいシークレットを保存する) を選択します。
-
[Choose secret type] (シークレットタイプを選択する) ページで、次の操作を行います。
-
[Secret type] (シークレットタイプ) で、保存するデータベース認証情報のタイプを選択します。
-
Amazon RDS データベース
-
Amazon DocumentDB データベース
-
Amazon Redshift データウェアハウス。
-
その他のタイプのシークレットについては、「ハードコードされたシークレットを置き換える」を参照してください。
-
-
認証情報を使用する場合、データベースの既存のハードコードされた認証情報を入力します。
-
[Secrets Manager] (暗号化キー) で aws/secretsmanager を選択すると、Secrets Manager に AWS マネージドキー マネージドキーを使用します。このキーを使用してもコストは発生しません。独自のカスタマーマネージドキーを使用することもできます (例えば、別の AWS アカウント アカウントからシークレットにアクセスする場合など)。カスタマーマネージドキーの使用料金の詳細については、「料金」を参照してください。
-
[Database] (データベース) で、データベースを選択します。
-
[Next] を選択します。
-
-
[Configure secret] (シークレットを設定する) ページで、次の操作を行います。
-
わかりやすいシークレット名と説明を入力します。
-
[Resource permissions] (リソースのアクセス許可) で、[Edit permissions] (アクセス許可の編集) を選択します。
RoleToRetrieveSecretAtRuntime
がシークレットを取得できるように以下のポリシーを貼り付け、[保存]を選択します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountId
:role/
" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] }RoleToRetrieveSecretAtRuntime
-
ページの最下部にある [Next] (次へ) を選択します。
-
-
リポジトリの [Configure rotation] (ローテーションを設定する) ページでは、今のところローテーションはオフにしておきます。後でオンにします。[Next] (次へ) を選択します。
-
[Review] (レビュー) ページで、シークレットの詳細を確認し、[Store] (保存) を選択します。
ステップ 2: コードを更新する
コードは、シークレットを取得できるように、IAMロール RoleToRetrieveSecretAtRuntime
を想定している必要があります。詳細については、「Switching to an IAM role (AWS API)」(IAMロールへの切り替え ( API)) を参照してください。
次に、Secrets Manager が提供するサンプルコードを使用して、Secrets Manager からシークレットを取得するようにコードを更新します。
サンプルコードを見るには
Secrets Manager コンソール (https://console.aws.amazon.com/secretsmanager/
) を開きます。 -
[Secrets] (シークレット) ページで、自分のシークレットを選択します。
-
[サンプルコード] を下にスクロールします。言語を選択し、コードスニペットをコピーします。
アプリケーションで、ハードコードされた認証情報を削除し、コードスニペットを貼り付けます。コード言語によっては、スニペットの中に関数やメソッドの呼び出しを追加する必要があります。
ハードコードされた認証情報の代わりにシークレットを使用して、アプリケーションが期待通りに動作することをテストしてください。
ステップ 3: シークレットをローテーションする
最後のステップは、シークレットのローテーションによってハードコードされた認証情報を失効させることです。ローテーションとは、シークレットを定期的に更新するためのプロセスのことです。シークレットのローテーションを行うと、シークレットとデータベースの両方で認証情報が更新されます。Secrets Manager は、設定したスケジュールで自動的にシークレットをローテーションすることができます。
ローテーションの設定の一部として、Lambda ローテーション関数が Secrets Manager とデータベースの両方にアクセスできることを確認する必要があります。自動ローテーションをオンにすると、Secrets Manager は Lambda ローテーション機能をデータベースと同じ VPC に作成し、データベースへのネットワークアクセスができるようにします。Lambda ローテーション関数は、Secrets Manager を呼び出してシークレットを更新することも可能でなければなりません。Lambda から Secrets Manager への呼び出しが AWS インフラから出ないように、VPC 内に Secrets Manager のエンドポイントを作成することをお勧めします。手順については、エンドポイントの使用 AWS Secrets Manager VPC を参照してください。
ローテーションを有効にするには
Secrets Manager コンソール (https://console.aws.amazon.com/secretsmanager/
) を開きます。 -
[Secrets] (シークレット) ページで、自分のシークレットを選択します。
-
シークレットの詳細ページで、[Rotation configuration] (ローテーション設定) セクションの [Edit rotation] (ローテーションの編集) を選択します。
-
[Edit rotation configuration] (ローテーション設定の編集) ダイアログボックスで、次の操作を行います。
-
[Automatic rotation] (自動ローテーション) を有効化します。
-
[ローテーションのスケジュール]で、UTC タイムゾーンでスケジュールを入力します。
-
シークレットを保存したときにシークレットをローテーションするには、[Rotate immediately when the secret is stored] (シークレットが保存されたときにすぐにローテーションする) を選択します。
-
ローテーション関数で、[Create a new Lambda function] (新しい Lambda 関数の作成) を選択し、新しい関数の名前を入力します。Secrets Manager は、関数名の先頭に「SecretsManager」を追加します。
-
[ローテーション戦略] で、[単一ユーザー] を選択します。
-
[Save] を選択します。
-
シークレットがローテーションしたことを確認するには
Secrets Manager のコンソール (https://console.aws.amazon.com/secretsmanager/
) を開きます。 -
[Secrets] (シークレット) で、シークレットを選択します。
[Secret details] (シークレットの詳細) ページで、下へスクロールし、[Retrieve secret value] (シークレットの値を取得する) を選択します。
シークレットの値が変更された場合、ローテーションは成功したことになります。シークレットの値が変更されなかった場合、ローテーション関数の CloudWatch Logs を見て ローテーションのトラブルシューティング する必要があります。
ローテーションされたシークレットを使用して、アプリケーションが期待どおりに動作するかどうかテストします。
次のステップ
コードからハードコードされたシークレットを削除した後、次に検討すべきいくつかの項目を挙げます。
-
シークレットをキャッシュすることで、パフォーマンスを向上させ、コストを削減することができます。詳細については、「からシークレットを取得する AWS Secrets Manager」を参照してください。
-
別のローテーションスケジュールを選択できます。詳細については、「ローテーションスケジュール」を参照してください。
-
Java や Python のアプリケーションでハードコードされたシークレットを見つけるには、Amazon CodeGuru Reviewer をお勧めします。