踏み台サーバーの種別でAuroraPostgreSQLへの接続ユーザーを制限する

AuroraPostgreSQLへの接続ユーザーをIAMポリシーを利用して制限、管理する方法の紹介です。
2019.05.31

皆さん、Auroraには、DB接続ユーザーとその権限をIAMで制御する方法があるのをご存知でしょうか?

Amazon Aurora with PostgreSQL Compatibility で IAM 認証のサポートを開始

これを利用することで、データベースのユーザーとパスワードを固定値で設定せずに、IAMポリシーで権限の制御が可能となります。DBユーザーのパスワードを管理するのがつらいシチュエーションでは、役に立つ機能かと思うので、そのあたりで悩みがある方には参考になるかと思います。

DBユーザーのIAM制御きたか…!!

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

今回の構成で実現したいこと

各踏み台サーバーにアクセスする人ごとに、データベースに接続可能なDBユーザーを制限します。各踏み台サーバーには、DBアクセス用のIAMロールをそれぞれ割り当てておき、事前にIAMポリシーによって、データベースに接続可能なユーザーを制限します。

IAMデータベース認証とは

公式マニュアルはこちら。

IAM データベース認証 - Amazon Aurora

AWS Identity and Access Management (IAM) データベース認証を使用して、DB クラスターに対して認証を実行できます。IAM データベース認証は MySQL および PostgreSQL と連携します。この認証方法では、DBインスタンスに接続するときにパスワードを使用する必要はありません。代わりに、認証トークンを使用します。
引用:IAM データベース認証 - Amazon Aurora

以下の特徴があります。

  • データベーストラフィックはSSLで暗号化される
  • IAMで接続管理するため、DBへのアクセスを一元的に管理可能
  • セキュリティを高めるため、EC2インスタンスに固有のプロファイル認証情報を使用して、パスワードの代わりにデータベースにアクセス可能

通常、RDSのDBユーザーとパスワードは、AWSの権限制御の仕組みIAMとは完全に独立していますが、それをIAMに寄せることで管理が簡単になる効果が期待できます。

Aurora PostgreSQLへのIAM接続を試してみる

今回は、AuroraのPostgreSQLバージョンを利用し、IAM接続を試してみます。

対応しているAurora PostgreSQLのバージョンの確認

IAM データベース認証は、以下のデータベースエンジンおよび DB インスタンスクラスで利用できます。
・Aurora と MySQL の互換性 バージョン 1.10 以降。すべてのインスタンスクラスは、db.t2.small を除いてサポートされます。
PostgreSQL との互換性がある Aurora PostgreSQL バージョン 9.6.9 および 10.4 以降。
引用:IAM データベース認証 - Amazon Aurora

また、以下の制限もあります。

IAM データベース認証の PostgreSQL の制限事項
PostgreSQL で IAM データベース認証を使用する場合、以下の制限に注意してください。
・データベースクラスターの 1 秒あたりの最大接続数は、クラスタータイプとワークロードに応じて制限される場合があります。
引用:IAM データベース認証 - Amazon Aurora

IAMデータベース認証の有効化

最初に、データベースのIAM認証を有効化します。設定は、Webコンソールから「IAM DB Authentication(IAM DB認証)」で、「IAM DB認証の有効化」を実施しておきます。

IAMデータベースアクセス用のIAMポリシーの作成

ポリシーの新規作成から、以下のポリシーを作成します。今回、Aurora側に作成するデータベースユーザーは、db_userxとします。

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

上記ポリシー中、Resource部分は独自の記法となるので注意が必要です。下記に、Resource部分の記入例を記します。

arn:aws:rds-db:region:account-id:dbuser:DbClusterResourceId/db-user-name
  • region:DBクラスターが存在するリージョンを指定。東京リージョンならap-northeast-1
  • account-id:AWSアカウントID
  • DbClusterResourceId:DBクラスターのリソースID。ARNではないので注意してください。RDSコンソールの設定から確認可能
  • db-user-name:IAM認証に関連付けるデータベースユーザー。今回はdb-userxと指定

自分の環境で指定した具体例はこちら。

"arn:aws:rds-db:ap-northeast-1:629895769338:dbuser:cluster-Y6ETYEJBHDHQ2DR22Y6E3VVPSQ/db_userx"

一点注意なのは、現状IAMコンソールで上記ポリシーを作成しようとすると、「このポリシーから付与されるアクセス権限はありません。」と表示されますが、このエラーは無視して大丈夫です。

IAMの名前は「aurora-connect-policy」としておきます。

踏み台EC2のIAMロールに上記ポリシーを付与

インターネットからアクセスできる適当な踏み台サーバーをEC2で作成しておきます。今回は、踏み台のEC2からIAM認証で接続するため、適当なEC2のIAMロールに、上記で作成した「aurora-connect-policy」を付与します。

IAM認証を利用するデータベースアカウントを作成

Aurora PostgreSQLにアクセスし、以下のテスト用ユーザーを作成します。以下のコマンドで、ユーザーにrds_iamロールを付与します。

CREATE USER db_userx WITH LOGIN; 
GRANT rds_iam TO db_userx;

IAM認証を利用してDBクラスターへ接続

ここまでで準備は完了。IAMロールを設定した踏み台EC2から接続を確認します。

IAM認証を利用して、DBクラスターへ接続します。認証トークンの取得には、generate-db-auth-tokenを利用し、PostgreSQLの接続用パスワードを取得します。

export RDSHOST="AuroraのインスタンスID"
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --username db_userx --region ap-northeast-1)"

ここで取得するトークンの有効期限は15分です。基本的に接続するたびにトークンを取得する必要があるのでご注意ください。
IAM 認証情報を使用して Amazon RDS への接続をユーザーに許可する
https://aws.amazon.com/jp/premiumsupport/knowledge-center/users-connect-rds-iam/

AWSで配布されている、パブリックキーを含むSSL証明書ファイルをダウンロードして、任意の場所に保存しておきます。

curl -O https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

これで、環境変数PGPASSWORDに、認証トークンがセットされていれば、PostgreSQLに接続して動作を確認します。以下の例では、上の手順で取得した証明書ファイルを/home/ec2-user/rds-combined-ca-bundle.pemに配置しています。

psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=/home/ec2-user/rds-combined-ca-bundle.pem dbname=testdb user=db_userx"
psql (9.6.8, サーバー 9.6.12)
SSL接続(プロトコル: TLSv1.2, 暗号化方式: ECDHE-RSA-AES256-GCM-SHA384, ビット長: 256, 圧縮: オフ)
"help" でヘルプを表示します.

testdb=> select version();
                                    version
-------------------------------------------------------------------------------
 PostgreSQL 9.6.12 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.9.3, 64-bit
(1 行)

お疲れ様でした!

DBアクセスの管理もIAMで一元管理しよう

従来、DBユーザーとパスワードの管理は、IAMとは異なる独自の管理が必要でした。ただ、AWSのリソース全般はIAMで管理するので、レイヤーが違うところで非常にセンシティブな情報であるデータベース接続ユーザーとパスワードを管理するのは、運用上の負担が大きかったとも言えます。今回紹介した、Aurora PostgreSQLのDB接続ユーザーへのIAM権限管理の仕組みを導入することで、よりセキュアで統一された権限管理を実現できる可能性があります。

この記事ではIAMロールを踏み台サーバに設定してアクセスさせていますが、例えばアプリケーションが動作するEC2サーバーや、ECS上のコンテナに割り当てたタスクロールで接続ユーザーと権限を管理することも理論上は可能です。

DBユーザーの管理で困っている方は、このあたり、一度導入を検討してみてはいかがでしょうか。

それでは、今日はこのへんで。濱田(@hamako9999)でした。

関連参考記事