1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon Aurora PostgreSQLのデータベース認証について試してみた

1
Posted at

背景・目的

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 データベース認証について試してみます。

下記の環境を作り、それぞれ試してみます。

  1. パスワード認証
  2. IAMデータベース認証

image.png

事前準備

  1. NWやEC2など事前に準備します
  2. Auroraを構築します

ユーザの作成

  1. EC2にセッションマネージャーから接続します

  2. 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=> 
    
  3. 最初に2つのユーザを作成します

パスワード認証用ユーザ

  1. ユーザを作成します
    postgres=> CREATE USER password_user WITH PASSWORD 'xxxxx';
    CREATE ROLE
    postgres=> 
    
  2. Connect権限を付与します
    postgres=> GRANT CONNECT ON DATABASE xxxxx TO password_user;
    GRANT
    postgres=>
    

IAMデータベース認証用ユーザ

  1. ユーザを作成します
    postgres=> CREATE USER iam_user;
    CREATE ROLE
    postgres=>
    
  2. iam_user に rds_iam ロールを付与します
    postgres=> GRANT rds_iam TO iam_user;
    GRANT ROLE
    postgres=>
    
  3. Connect権限を付与します
    postgres=> GRANT CONNECT ON DATABASE xxxxx TO iam_user;
    GRANT
    postgres=>
    

1.パスワード認証

Auroraの確認

  1. RDSのナビゲーションペインでデータベースをクリックします
  2. 対象のクラスタをクリックします
  3. 設定をクリックします
  4. 認証セクションでIAM DB認証が「有効でない」になっています
    image.png

認証

  1. 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=>
    
  2. 現在のユーザも確認します

    postgres=> SELECT current_user;
     current_user
    ---------------
     password_user
    (1 row)
    
    postgres=>
    

2. IAMデータベース認証

設定の変更

  1. CloudFormation のEnableIAMDatabaseAuthenticationをtrueにします

    EnableIAMDatabaseAuthentication: true
    
  2. IAM DB認証が「有効」に変わりました
    image.png

  3. EC2のIAMロールに下記を追加します

    • Actionにrds-db:connect
    • Resourceに!Sub 'arn:aws:rds-db:${AWS::Region}:${AWS::AccountId}:dbuser:*/iam_user'

認証

  1. 認証トークンを生成します
    $ 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)
    $
    
  2. 取得できたか、念の為に確認します
    $ echo $TOKEN
    
  3. トークンを使って接続します。できました。(一時的な環境変数に格納し、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=>
    
  4. 現在のユーザを確認します
    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関数など短命な接続
    • 監査が必要な管理者アクセス
    • 調査などの一時的なアクセス

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?