AWS Secrets Manager でのデータベース認証情報の設定 - Amazon Relational Database Service

AWS Secrets Manager でのデータベース認証情報の設定

作成するプロキシごとに、まず Secrets Manager サービスを使用してユーザー名およびパスワード認証情報のセットを保存します。RDS DB インスタンスで、プロキシの接続先のデータベースユーザーアカウントごとに個別の Secrets Manager シークレットを作成します。

Secrets Manager コンソールでは、username および password フィールドの値を使用してこれらのシークレットを作成します。これにより、プロキシに関連付けた RDS DB インスタンスの対応するデータベースユーザーにプロキシから接続できます。これを行うには、[他のデータベース認証情報]、[RDS データベース認証情報]、[他の種類のシークレット] のいずれかの設定を使用します。[ユーザー名] フィールドと [パスワード] フィールドに適切な値を入力し、その他の必須フィールドに値を入力します。プロキシは、ホストポート などの他のフィールド (シークレット内に存在する場合) を無視します。これらの詳細は、プロキシによって自動的に提供されます。

[その他のタイプのシークレット] を選択することもできます。この場合、usernamepassword という名前のキーを使用してシークレットを作成します。

特定のデータベースユーザーとしてプロキシ経由で接続するには、シークレットに関連付けられているパスワードが、そのユーザーのデータベースパスワードと一致していることを確認してください。不一致がある場合は、Secrets Manager で該当するシークレットを更新できます。この場合でも、シークレットの認証情報とデータベースパスワードが一致する他のアカウントには接続できます。

注記

RDS for SQL Server の場合、RDS Proxy には、DB インスタンスの照合設定に関係なく、アプリケーションコードの大文字と小文字が区別されるシークレットが Secrets Manager に必要です。例えば、アプリケーションがユーザー名「Admin」と「admin」の両方を使用できる場合は、「Admin」と「admin」の両方のシークレットを使用してプロキシを設定します。RDS Proxy では、クライアントとプロキシ間の認証プロセスにおけるユーザー名の大文字と小文字を区別しない仕様に対応していません。

SQL Server の詳細については、Microsoft SQL Server のドキュメントを参照してください。

AWS CLI または RDS API を通じてプロキシを作成する場合、対応するシークレットの Amazon リソースネーム (ARN) を指定します。プロキシがアクセスできるすべての DB ユーザーアカウントに対し、同じように操作します。AWS Management Console では、シークレットをそのわかりやすい名前を使用して選択します。

Secrets Manager でシークレットを作成する手順については、Secrets Manager ドキュメントのシークレットの作成ページを参照してください。次のいずれかの方法を使用します。

  • コンソールで Secrets Manager を使用します。

  • CLI を使用して RDS Proxy 用の Secrets Manager シークレットを作成するには、次のようなコマンドを使用します。

    aws secretsmanager create-secret --name "secret_name" --description "secret_description" --region region_name --secret-string '{"username":"db_user","password":"db_user_password"}'
  • Secrets Manager シークレットを暗号化するカスタムキーを作成することもできます。次のコマンドはキーの例を作成します。

    PREFIX=my_identifier aws kms create-key --description "$PREFIX-test-key" --policy '{ "Id":"$PREFIX-kms-policy", "Version":"2012-10-17", "Statement": [ { "Sid":"Enable IAM User Permissions", "Effect":"Allow", "Principal":{"AWS":"arn:aws:iam::account_id:root"}, "Action":"kms:*","Resource":"*" }, { "Sid":"Allow access for Key Administrators", "Effect":"Allow", "Principal": { "AWS": ["$USER_ARN","arn:aws:iam:account_id::role/Admin"] }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource":"*" }, { "Sid":"Allow use of the key", "Effect":"Allow", "Principal":{"AWS":"$ROLE_ARN"}, "Action":["kms:Decrypt","kms:DescribeKey"], "Resource":"*" } ] }'

例えば、以下のコマンドは、2 つのデータベースユーザーの Secrets Manager シークレットを作成します。

aws secretsmanager create-secret \ --name secret_name_1 --description "db admin user" \ --secret-string '{"username":"admin","password":"choose_your_own_password"}' aws secretsmanager create-secret \ --name secret_name_2 --description "application user" \ --secret-string '{"username":"app-user","password":"choose_your_own_password"}'

カスタム AWS KMS キーで暗号化されたシークレットを作成するには、以下のコマンドを使用します。

aws secretsmanager create-secret \ --name secret_name_1 --description "db admin user" \ --secret-string '{"username":"admin","password":"choose_your_own_password"}' --kms-key-id arn:aws:kms:us-east-2:account_id:key/key_id aws secretsmanager create-secret \ --name secret_name_2 --description "application user" \ --secret-string '{"username":"app-user","password":"choose_your_own_password"}' --kms-key-id arn:aws:kms:us-east-2:account_id:key/key_id

AWS アカウントが所有する秘密を確認するには、次のようなコマンドを使用します。

aws secretsmanager list-secrets

CLI を使用してプロキシを作成する場合、1 つ以上のシークレットの Amazon リソースネーム (ARN) を --auth パラメータに渡します。次の Linux の例は、AWS アカウントが所有する各シークレットの名前と ARN のみを含むレポートを準備する方法を示しています。この例では、--output table バージョン 2 で使用可能な AWS CLI パラメータを使用します。AWS CLI バージョン 1 を使用している場合は、代わりに --output text を使用します。

aws secretsmanager list-secrets --query '*[].[Name,ARN]' --output table

シークレットに正しい資格情報を正しい形式で格納したことを確認するには、次のようなコマンドを使用します。your_secret_name は、短縮名またはシークレットの ARN に置き換えます。

aws secretsmanager get-secret-value --secret-id your_secret_name

出力には、次のような JSON でエンコードした値を表示する行を含める必要があります。

"SecretString": "{\"username\":\"your_username\",\"password\":\"your_password\"}",