

# RDS Proxy のデータベース認証情報の設定
<a name="rds-proxy-secrets-arns"></a>

Amazon RDS の RDS Proxy は、AWS Secrets Manager を使用してデータベース認証情報を安全に保存および管理します。アプリケーションに認証情報を埋め込む代わりに、必要な認証の詳細を含む Secrets Manager シークレットにプロキシを関連付けます。RDS DB インスタンスで、プロキシの接続先のデータベースユーザーアカウントごとに個別の Secrets Manager シークレットを作成します。

または、エンドツーエンドの IAM 認証を使用するように RDS Proxy を設定することもできます。これにより、データベース認証情報を Secrets Manager に保存する必要がなくなります。RDS Proxy は、クライアントからプロキシへの接続とプロキシからデータベースへの接続の両方に IAM 認証を使用します。これにより、シークレットやパスワードの管理を必要としない、完全に統合された IAM ベースの認証ソリューションが提供されます。新しい IAM DB ユーザーを追加する方法の詳細については、「[IAM 認証を使用したデータベースアカウントの作成](UsingWithRDS.IAMDBAuth.DBAccounts.md)」を参照してください。

**Topics**
+ [RDS Proxy で使用するシークレットの作成](#rds-proxy-secrets-create)

## RDS Proxy で使用するシークレットの作成
<a name="rds-proxy-secrets-create"></a>

プロキシを作成する前に、まずデータベース認証情報を保存するシークレットを少なくとも 1 つ作成する必要があります。

### コンソール
<a name="rds-proxy-secrets-create-console"></a>

**シークレットを作成する**

1. Secrets Manager のコンソール ([https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)) を開きます。

1. **[Store a new secret]** (新しいシークレットを保存する) を選択します｡

1. **[Amazon RDS データベースの認証情報]** を選択します。

1. ユーザー名とパスワードを入力します。入力する認証情報は、関連付けられた RDS データベースに存在するデータベースユーザーの認証情報と一致する必要があります。RDS Proxy は、これらの認証情報を使用して、アプリケーションに代わってデータベースへの接続を認証および確立します。

   不一致がある場合は、データベースパスワードと一致するようにシークレットを更新できます。シークレットを更新するまで、そのシークレットを使用してプロキシ経由で接続しようとすると失敗しますが、他の有効なシークレットを使用した接続は引き続き機能します。
**注記**  
RDS for SQL Server の場合、RDS Proxy は DB インスタンスの照合設定に関係なく、Secrets Manager で大文字と小文字を区別するシークレットが必要です。アプリケーションで「Admin」や「admin」などの大文字と小文字が異なるユーザー名が許可されている場合は、それぞれに個別のシークレットを作成する必要があります。RDS Proxy は、クライアントとプロキシ間の大文字と小文字を区別しないユーザー名認証をサポートしていません。  
SQL Server Agent の詳細については、[Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16) のドキュメントを参照してください。

1. **[データベース]** で、シークレットがアクセスする Amazon RDS データベースを選択します。

1. シークレットの他の設定を入力し、**[保存]** を選択します。詳細な手順については、「*AWS Secrets Manager ユーザーガイド*」の「[Create an AWS Secrets Manager secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)」を参照してください。

### AWS CLI
<a name="rds-proxy-secrets-create-cli"></a>

AWS CLI を通じてプロキシを作成する場合、対応するシークレットの Amazon リソースネーム (ARN) を指定します。プロキシがアクセスできるすべての DB ユーザーアカウントに対し、同じように操作します。AWS マネジメントコンソール では、シークレットをそのわかりやすい名前を使用して選択します。
+ RDS Proxy で使用する Secrets Manager シークレットを作成するには、[create-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/create-secret.html) コマンドを使用します。

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

  ```
  aws kms create-key --description "{{test-key}}" --policy '{
    "Id":"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 アカウントが所有するシークレットを表示するには、[list-secrets](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/list-secrets.html) コマンドを使用します。

```
aws secretsmanager list-secrets
```

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

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

シークレットに適切な形式の正しい認証情報が含まれていることを確認するには、[get-secret-value](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html) コマンドを使用します。`{{your_secret_name}}` をシークレットの短縮名または ARN に置き換えます。

```
aws secretsmanager get-secret-value --secret-id {{your_secret_name}}
```

出力には、次のような JSON でエンコードした値を持つ行が含まれます。

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