いずれも提供されてからしばらく経ちますが、組み合わせてみるとややこしいことになったので整理してみます。
- IAM 認証を使用した Amazon RDS および Aurora PostgreSQL データベースアクセスの保護 | Amazon Web Services ブログ
- Amazon RDS Proxy を使用したアプリケーションの可用性の向上 | Amazon Web Services ブログ
RDS Proxy の利用用途は Lambda を想定しているようで、Lambdaに機能として持っていますし、情報も多いです。(本稿でLambda部分は触れてません)
目次
認証パターン
- (a) RDSへのパスワード認証(ネイティブ認証)
- (b) RDSへのIAM認証
- (c) RDS Proxy 経由でのパスワード認証(ネイティブ認証)
- (d) RDS Proxy へのIAM認証
設定パターン
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を利用する
(※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 経由で接続する場合に必要です。
データベースユーザは通常通り、パスワードを設定します。
マネジメントコンソールから作成するとテンプレートは以下の内容になります。
最低でも username
と password
の設定が必要です。
{ "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
- RDSプロキシの計画と設定
- Managing connections with Amazon RDS Proxy - Amazon Relational Database Service
- Planning for and setting up RDS Proxy (RDSプロキシの計画と設定)
- Managing connections with Amazon RDS Proxy - Amazon Relational Database Service
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認証
- 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で異なります。
- RDS
- Using SSL/TLS to encrypt a connection to a DB cluster - Amazon Aurora
- 全リージョンを含む物と、各リージョン用の二種
To get a certificate bundle that contains both the intermediate and root certificates for all AWS Regions,
- RDS Proxy
- Managing connections with Amazon RDS Proxy - Amazon Relational Database Service
download the Amazon root CA 1 trust store from Amazon Trust Services.
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で制限、
認証は用途に合わせて選択という感じでしょうか。