vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

AWS RDS の IAM 認証と RDS Proxy

いずれも提供されてからしばらく経ちますが、組み合わせてみるとややこしいことになったので整理してみます。

RDS Proxy の利用用途は Lambda を想定しているようで、Lambdaに機能として持っていますし、情報も多いです。(本稿でLambda部分は触れてません)

目次

認証パターン

  • (a) RDSへのパスワード認証(ネイティブ認証)
  • (b) RDSへのIAM認証
  • (c) RDS Proxy 経由でのパスワード認証(ネイティブ認証)
  • (d) RDS Proxy へのIAM認証

f:id:htnosm:20210823080957p:plain

設定パターン

RDSは パスワード認証のみパスワード認証とIAM認証の併用 が選択できます。
RDS Proxy は、 パスワード認証のみIAM認証のみ のいずれかです。また、 IAM認証利用には Transport Layer Security 必須 となります。

設定パターン [RDS Proxy]
Require Transport Layer Security
[RDS Proxy]
IAM authentication
[RDS]
IAM DB authentication
(a)password->RDS (b)IAM->RDS (c)password->Proxy->RDS (d)IAM->Proxy->RDS
Proxy未使用。RDSパスワード認証。 Not enabled o x
Proxy未使用。RDSパスワード・IAM 併用。 Enabled o o
Proxyパスワード認証。RDSパスワード認証。 Not enabled Not enabled Not enabled o x o x
Proxyパスワード認証。RDSパスワード・IAM 併用。 Not enabled Not enabled Enabled o o o x
Proxyパスワード認証、TLS必須。RDSパスワード認証。 Enabled Not enabled Not enabled o x o x
Proxyパスワード認証、TLS必須。RDSパスワード・IAM 併用。 Enabled Not enabled Enabled o o o x
(※1)Proxy利用不可。 RDSパスワード認証。 Not enabled Required Not enabled o  x  ー  ー 
(※1)Proxy利用不可。 RDSパスワード・IAM 併用。 Not enabled Required Enabled o  o  ー  ー 
Proxy IAM認証、TLS必須。RDSパスワード認証。 Enabled Required Not enabled o x x o
(※2)Proxy IAM認証、TLS必須。 RDSパスワード・IAM 併用。 Enabled Required Enabled o o x o

(※)設定について

(※1)

設定時にエラーにはならず設定自体はできてしまうのですが、繋がりません。

  • ProxyへIAM認証での接続にはTLSを利用する
    • Make sure that you use Transport Layer Security (TLS) / Secure Sockets Layer (SSL) when connecting to a proxy using IAM authentication.

(※2)

  • ProxyへIAM認証を使用する場合、RDS側でIAMを有効にしない
    • When you use IAM for the connection to a proxy, make sure that the underlying RDS DB instance or Aurora DB cluster doesn't have IAM enabled.

データベースユーザ単位で、RDSへのIAM認証かRDS ProxyへのIAM認証かを指定する形が取れます。

  • RDS Proxy からの接続にIAM認証を利用するデータベースユーザーは、RDS側で IAM 認証が設定されていない状態とする必要ある。
  • DB インスタンスの設定自体としては、IAM 認証を有効化していても問題ない。

ユーザ単位での併用パターン

1データベース単位で見ると併用可能なパターンは以下のようになるかと思います。
IAM認証の併用(RDS直とRDS Proxy両方にIAM認証)は不可です。
また、IAM認証の場合はCNAMEでの接続はサポートされていません。

RDS RDS Proxy データベースユーザ Secrets Manager
パスワード 使用しない パスワード設定 不要
パスワード パスワード パスワード設定 Proxy経由に必要
IAM 利用不可 認証プラグイン設定 不要
パスワード IAM パスワード設定 Proxy経由に必要

認証プラグイン設定

RDS へIAM認証で接続する場合に必要です。
MySQLの場合、DBユーザ作成時にプラグインを指定します。パスワード不要です。

CREATE USER jane_doe IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; 

接続するIAM UserまたはIAM Role に接続許可ポリシーを追加します。
(Administrator など、既に権限が設定されている場合は不要です。)
リソースを指定する場合のIDは Resource (ID リソース ID) です。 (DB Instance Identifier や Cluster Identifier ではありません)

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:us-east-2:1234567890:dbuser:cluster-ABCDEFGHIJKL01234/db_user"
         ]
      }
   ]
}

IAM認証でのRDS接続

署名付き認証トークンを取得し、パスワードに指定します。
後述CA証明書を事前にダウンロードしておく必要があります。

Secrets Manager 設定

RDS Proxy 経由で接続する場合に必要です。
データベースユーザは通常通り、パスワードを設定します。

マネジメントコンソールから作成するとテンプレートは以下の内容になります。
最低でも usernamepassword の設定が必要です。

{
  "dbInstanceIdentifier": "xxxxx",
  "engine": "aurora-mysql",
  "host": "xxxxx.cluster-zzzzz.us-east-2.rds.amazonaws.com",
  "port": 3306,
  "resourceId": "cluster-XXXXXXXXXXXXXXXXXXXXXXXXXX",
  "username": "example-user",
  "password": "example-password"
}

RDS Proxy の IAM Role へ Secret へのアクセス許可ポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetSecretValue",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": [
                "arn:aws:secretsmanager:us-east-2:account_id:secret:secret_name_1",
            ]
        },
...
    ]
}

ProxyでのIAM認証許可設定

RDS Proxy 経由で IAM認証 を使用する場合に必要です。

接続するIAM UserまたはIAM Role に接続許可ポリシーを追加します。
(Administrator など、既に権限が設定されている場合は不要です。)
リソースを指定する場合のIDはRDS Proxyの Resource (ID リソース ID) です。 (Proxy Identifier ではありません)
Proxy ARN の末尾( prx-xxxxx )になります。

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "Resource": "arn:aws:rds-db:us-east-2:1234567890:dbuser:prx-ABCDEFGHIJKL01234/db_user"
         ]
      }
   ]
}

制限など

利用を想定している環境がサポートされているか確認しましょう。 さらっと重要な事が書いてある気がします。

RDS Proxy

CNAMEでの接続はできません。

You can't use RDS Proxy with custom DNS.

Proxyへはデフォルトポートでの接続です。

Currently, all proxies listen on port 3306 for MySQL. Currently, all proxies listen on port 5432 for PostgreSQL.

IAM認証

現在とあるので今後利用できるようになりそうですが、CNAMEでの接続はできません。

Currently, IAM database authentication isn't supported for CNAMEs.

Aurora MySQL の場合、 t2/t3.small での利用ができません。

For Aurora MySQL, all supported DB instance classes support IAM database authentication, except for db.t2.small and db.t3.small.

CA証明書

IAM認証で利用するCA証明書は、RDSとRDS Proxyで異なります。

IAM 認証のオーバヘッド

下記はMySQLの制限事項とのことですが、 IAM認証のオーバヘッドが発生という点は、PostgresでもProxyでもありそうです。

If you exceed the limit of maximum new connections per second, then the extra overhead of IAM database authentication can cause connection throttling.


当初思っていたより複雑でした。 Auroraだとデータベースユーザ作成まで行なってくれるのかなと期待していたのですが、データベースユーザの管理は残ります。
これまで通りデータベース内でのアクセス制御無しでユーザを作り(MySQLの場合ホスト%)、 経路はSecurityGroupで制限、 認証は用途に合わせて選択という感じでしょうか。