背景・目的
Auroraのセキュリティについて理解を深めます。またデータベース認証のうち、パスワード認証とIAM データベース認証について試してみます。
まとめ
下記に特徴を整理します。
| 特徴 | 説明 |
|---|---|
| Auroraセキュリティ | レイヤごとに分かれた複数の仕組みを組み合わせる ・IAMポリシー ・セキュリティグループ ・SSL/TLS ・リソースの暗号化 ・DBエンジンのセキュリティ機能 |
| データベース認証 | 下記をサポートしている ・パスワード認証 ・IAM認証 ・Kerberos認証 |
概要
下記を基に整理します。
- IAMポリシー
- ユーザがリソースに対してのアクセス許可を制御する
- セキュリティグループ
- DBクラスタ上のDBに接続できるか制御する
- SSL/TLS
- PostgreSQL、MySQLで接続を制御する
- リソースの暗号化
- DBクラスタ、保管時のスナップショットのセキュリティを制御する
- DBエンジンのセキュリティ機能
- DBにログインできるユーザを制御する
Amazon Aurora でのデータベース認証
- Auroraは、データベースユーザーを認証するいくつかの方法をサポートしている
- パスワード認証
- IAM データベース認証
- Kerberos 認証
- 特定のユーザーは、1 つの認証方法のみを使用してデータベースにログイン可能
- PostgreSQLの場合、
- IAMデータベース認証を使用するには、rds_iamロールをユーザに割り当て
- Kerberos認証を使用するには、rds_adロールをユーザに割り当て
- パスワード認証を使用するには、rds_iam、rds_adロールをユーザに割り当てない
パスワード認証
- データベースがユーザーアカウントのすべての管理を行う
- データベースがユーザーアカウントを制御および認証する
- AWS Secrets Manager との統合によってセキュリティが強化される
IAM データベース認証
- IAMデータベース認証により、DBクラスターを認証
- IAMの認証結果を基にトークンを使用する
Kerberos 認証
- Kerberos と Microsoft Active Directory を使用した、データベースユーザーの外部認証をサポート
- Kerberos は、ネットワーク経由でパスワードを送信する必要をなくすためにチケットと対称キー暗号化を使用するネットワーク認証プロトコル
- Kerberos は Active Directory に組み込まれており、データベースなどのネットワークリソースに対するユーザー認証を行えるように設計されている
- データベースユーザーのシングルサインオンおよび一元化された認証が可能
実践
パスワード認証とIAM データベース認証について試してみます。
下記の環境を作り、それぞれ試してみます。
- パスワード認証
- IAMデータベース認証
事前準備
- NWやEC2など事前に準備します
- Auroraを構築します
ユーザの作成
-
EC2にセッションマネージャーから接続します
-
psqlで接続します
$ psql -h xxxxx.cluster-xxxxx.ap-northeast-1.rds.amazonaws.com -p xxxx -U xxxxx -d xxxxx Password for user xxxxxx: psql (15.15) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off) Type "help" for help. postgres=> -
最初に2つのユーザを作成します
パスワード認証用ユーザ
- ユーザを作成します
postgres=> CREATE USER password_user WITH PASSWORD 'xxxxx'; CREATE ROLE postgres=> - Connect権限を付与します
postgres=> GRANT CONNECT ON DATABASE xxxxx TO password_user; GRANT postgres=>
IAMデータベース認証用ユーザ
- ユーザを作成します
postgres=> CREATE USER iam_user; CREATE ROLE postgres=> - iam_user に rds_iam ロールを付与します
postgres=> GRANT rds_iam TO iam_user; GRANT ROLE postgres=> - Connect権限を付与します
postgres=> GRANT CONNECT ON DATABASE xxxxx TO iam_user; GRANT postgres=>
1.パスワード認証
Auroraの確認
認証
-
EC2からパスワード認証します。ログインできました
$ psql -h xxxxx.cluster-xxxxx.ap-northeast-1.rds.amazonaws.com -p xxxx -U password_user -d xxxx Password for user password_user: psql (15.15) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off) Type "help" for help. postgres=> -
現在のユーザも確認します
postgres=> SELECT current_user; current_user --------------- password_user (1 row) postgres=>
2. IAMデータベース認証
設定の変更
-
CloudFormation の
EnableIAMDatabaseAuthenticationをtrueにしますEnableIAMDatabaseAuthentication: true -
EC2のIAMロールに下記を追加します
- Actionに
rds-db:connect - Resourceに
!Sub 'arn:aws:rds-db:${AWS::Region}:${AWS::AccountId}:dbuser:*/iam_user'
- Actionに
認証
- 認証トークンを生成します
$ TOKEN=$(aws rds generate-db-auth-token \ --hostname xxxxx.cluster-xxxxx.ap-northeast-1.rds.amazonaws.com \ --port xxxx \ --region ap-northeast-1 \ --username iam_user) $ - 取得できたか、念の為に確認します
$ echo $TOKEN - トークンを使って接続します。できました。(一時的な環境変数に格納し、psqlを実行)
$ PGPASSWORD=$TOKEN psql \ -h xxxxx.cluster-xxxxx.ap-northeast-1.rds.amazonaws.com \ -p xxxx \ -U iam_user \ -d xxxx psql (15.15) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off) Type "help" for help. postgres=> - 現在のユーザを確認します
postgres=> SELECT current_user; current_user -------------- iam_user (1 row) postgres=>
考察
今回、データベース認証の種類と、実際にパスワード認証とIAMデータベース認証を使い分けて試してみました。
パスワード認証とIAMデータベース認証の特徴について、下記のように理解しました。
| 項目 | パスワード認証 | IAMデータベース認証 |
|---|---|---|
| 認証情報の管理 | パスワードを保管・管理が必要 | トークンは15分で自動失効 |
| 認証情報の漏洩リスク | パスワードが漏洩すると変更が必要 | トークンは短命なので影響が限定的 |
| アクセス制御 | データベース側で管理 | IAMポリシーで一元管理 |
| 監査 | データベースログのみ | CloudTrailでIAM操作も記録 |
| 適用シーン | シンプルな環境、レガシーアプリ | AWS環境、セキュリティ要件が高い場合 |
-
Webシステムでは、下記の理由からパスワード認証が多いようです
- コネクションプーリングの実装
- Webアプリは接続を使い回す
- IAM認証はトークンが15分で失効するため、再生成の処理が複雑
- フレームワーク対応
- ほとんどのORMやDBライブラリはパスワード認証前提
- IAM認証は追加実装が必要
- コネクションプーリングの実装
-
一方、IAMデータベース認証が向いているケースは下記の通りのようです
- バッチ処理やLambda関数など短命な接続
- 監査が必要な管理者アクセス
- 調査などの一時的なアクセス
参考


