PostgreSQL のパスワード暗号化に SCRAM を使用する - Amazon Relational Database Service

PostgreSQL のパスワード暗号化に SCRAM を使用する

SCRAM (Salted Challenge Response Authentication Mechanism) は、パスワードを暗号化するための PostgreSQL のデフォルトのメッセージダイジェスト (MD5) アルゴリズムの代替手段です。SCRAM 認証メカニズムは MD5 よりも安全であると見なされます。これら 2 つの異なるパスワードを保護する方法の詳細については、PostgreSQL のドキュメントの「パスワード認証」を参照してください。

に対しては、パスワード暗号化方式として MD5 ではなく SCRAM を使用することをお勧めします。RDS for PostgreSQL DB インスタンス。これは、パスワード認証と暗号化のために scram-sha-256 アルゴリズムを使用する暗号化チャレンジレスポンスのメカニズムです。

SCRAM をサポートするために、クライアントアプリケーションのライブラリを更新する必要があります。例えば、42.2.0 より前の JDBC バージョンで SCRAM はサポートされていません。詳細については、PostgreSQL JDBC ドライバーのドキュメントの「PostgreSQL JDBC ドライバー」を参照してください。その他の PostgreSQL ドライバーおよび SCRAM サポートの一覧については、PostgreSQL のドキュメントの「ドライバーの一覧」を参照してください。

注記

RDS for PostgreSQL 13.1 以降のバージョンは scram-sha-256 をサポートします。これらのバージョンでは、次の手順で説明するように、DB インスタンスに SCRAM を要求するように設定することもできます。

SCRAM を要求するために RDS for PostgreSQL DB インスタンスを設定する

では、scram-sha-256 アルゴリズムを使用するパスワードのみを受け入れるために、に RDS for PostgreSQL DB インスタンスを要求できます。

重要

PostgreSQL データベースを使用する既存の RDS プロキシでは、SCRAM のみを使用するようにデータベース認証を変更すると、プロキシは最大 60 秒間使用できなくなります。この問題を回避するには、以下のいずれかの方法で対応します。

  • データベースが SCRAMMD5 認証の両方を許可していることを確認します。

  • SCRAM 認証のみを使用するには、新しいプロキシを作成し、アプリケーショントラフィックを新しいプロキシに移行してから、以前にデータベースに関連付けられていたプロキシを削除します。

システムに変更を加える前に、次の完全なプロセスを理解していることを確認してください。

  • すべてのデータベースユーザーのすべてのロールとパスワードの暗号化に関する情報を取得します。

  • パスワードの暗号化を制御するパラメータを指定するために、 RDS for PostgreSQL DB インスタンスのパラメータ設定を再確認してください。

  • RDS for PostgreSQL DB インスタンスでデフォルトのパラメータグループを使用する場合は、カスタムの DB パラメータグループを作成して、それを RDS for PostgreSQL DB インスタンスに適用し、必要なときにパラメータを変更できるようにする必要があります。 RDS for PostgreSQL DB インスタンスがカスタムパラメータグループを使用している場合、必要に応じて、プロセスの後で必要なパラメータを変更できます。

  • password_encryption パラメータを scram-sha-256 に変更します。

  • パスワードを更新する必要があることをすべてのデータベースユーザーに通知します。postgres アカウントに同じ操作を行います。新しいパスワードは暗号化され、scram-sha-256 アルゴリズムを使用して保存されます。

  • 暗号化の種類を使用して、すべてのパスワードが暗号化されていることを確認します。

  • すべてのパスワードで scram-sha-256 が使用されている場合、rds.accepted_password_auth_method パラメータを md5+scram から scram-sha-256 に変更できます。

警告

rds.accepted_password_auth_method を scram-sha-256 のみに変更した後、md5 で暗号化されたパスワードを持つすべてのユーザー (ロール) は接続できなくなります。

RDS for PostgreSQL DB インスタンスに SCRAM を要求する準備

お使いの 、RDS for PostgreSQL DB インスタンスに変更を加える前に、既存のデータベースユーザーアカウントをすべて確認します。また、パスワードに使用されている暗号化の種類を確認してください。確認するためには、rds_tools 拡張機能を使用します。この拡張機能は、 RDS for PostgreSQL 13.1 以上のリリースでサポートされています。

データベースユーザー (ロール) とパスワードの暗号化方法のリストを取得するには
  1. 次のように、psql を使用して を RDS for PostgreSQL DB インスタンスに接続します。

    psql --host=db-name.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  2. rds_tools 拡張機能をインストールします。

    postgres=> CREATE EXTENSION rds_tools; CREATE EXTENSION
  3. ロールと暗号化のリストを取得します。

    postgres=> SELECT * FROM rds_tools.role_password_encryption_type();

    以下のような出力結果が表示されます。

    rolname | encryption_type ----------------------+----------------- pg_monitor | pg_read_all_settings | pg_read_all_stats | pg_stat_scan_tables | pg_signal_backend | lab_tester | md5 user_465 | md5 postgres | md5 (8 rows)

カスタム DB パラメータグループの作成

注記

RDS for PostgreSQL DB インスタンスで既にカスタムパラメータグループを使用している場合、新しいパラメータグループを作成する必要はありません。

Amazon RDS のパラメータグループの概要については、「RDS for PostgreSQL DB インスタンスでのパラメータの使用」を参照してください。

パスワードに使用されるパスワード暗号化タイプは、1 つのパラメータ password_encryption で設定します。 RDS for PostgreSQL DB インスタンスで許可される暗号化は、別のパラメータ rds.accepted_password_auth_method で設定されます。これらのいずれかをデフォルト値から変更するには、カスタム DB パラメータグループを作成して、 インスタンスに適用する必要があります。

また、AWS Management Console または RDS API を使用して、カスタムの DB パラメータグループを作成することもできます。詳細については、「」を参照してください。

これで、カスタムパラメータグループを DB インスタンスに関連付けることができます。

カスタム DB パラメータグループを作成するには
  1. create-db-parameter-group CLI コマンドを使用して、カスタムの DB パラメータグループを作成します。この例では postgres13 をこのカスタムパラメータグループのソースとして使用します。

    Linux、macOS、Unix の場合:

    aws rds create-db-parameter-group --db-parameter-group-name 'docs-lab-scram-passwords' \ --db-parameter-group-family postgres13 --description 'Custom parameter group for SCRAM'

    Windows の場合:

    aws rds create-db-parameter-group --db-parameter-group-name "docs-lab-scram-passwords" ^ --db-parameter-group-family postgres13 --description "Custom DB parameter group for SCRAM"
  2. modify-db-instance CLI コマンドを使用して、このカスタムパラメータグループを RDS for PostgreSQL DB クラスターに適用します。

    Linux、macOS、Unix の場合:

    aws rds modify-db-instance --db-instance-identifier 'your-instance-name' \ --db-parameter-group-name "docs-lab-scram-passwords

    Windows の場合:

    aws rds modify-db-instance --db-instance-identifier "your-instance-name" ^ --db-parameter-group-name "docs-lab-scram-passwords

    PostgreSQL DB インスタンスとカスタム DB クラスターパラメータグループと再同期するには、プライマリインスタンスとクラスターの他のすべてのインスタンスを再起動する必要があります。ユーザーへの影響を最小限に抑えるため、定期的なメンテナンス期間中に実施するように計画してください。

SCRAM を使用するためのパスワード暗号化の設定

RDS for PostgreSQL DB インスタンスで使用されるパスワード暗号化メカニズムは、password_encryption パラメータの DB パラメータグループに設定されています。指定できる値は、未設定、md5 または scram-sha-256 です。デフォルト値は、次のように RDS for PostgreSQL のバージョンによって異なります。

  • RDS for PostgreSQL 14 以上 – デフォルトは scram-sha-256

  • RDS for PostgreSQL 13 – デフォルトは md5

RDS for PostgreSQL DB インスタンスにアタッチされているカスタム DB パラメータグループでは、パスワード暗号化パラメータの値を変更できます。

次では、RDS コンソールには、RDS for PostgreSQL の password_encryption パラメータのデフォルト値が表示されます。
パスワード暗号化の設定を scram-sha-256 に変更するには
  • 次のように、パスワード暗号化の値を scram-sha-256 に設定します。パラメータが動的であるため、変更をすぐに適用できます。そのため、変更を有効にするために再起動は不要です。

    Linux、macOS、Unix の場合:

    aws rds modify-db-parameter-group --db-parameter-group-name \ 'docs-lab-scram-passwords' --parameters 'ParameterName=password_encryption,ParameterValue=scram-sha-256,ApplyMethod=immediate'

    Windows の場合:

    aws rds modify-db-parameter-group --db-parameter-group-name ^ "docs-lab-scram-passwords" --parameters "ParameterName=password_encryption,ParameterValue=scram-sha-256,ApplyMethod=immediate"

ユーザーロールのパスワードを SCRAM に移行する

以下に説明するように、ユーザーロールのパスワードを SCRAM に移行できます。

データベースユーザー (ロール) のパスワードを MD5 から SCRAM に移行するには
  1. 次のように、管理者ユーザーとしてログインします (デフォルトのユーザー名、postgres)。

    psql --host=db-name.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  2. 次のコマンドを使って、RDS for PostgreSQL DB インスタンスの password_encryption パラメータの設定を確認します。

    postgres=> SHOW password_encryption; password_encryption --------------------- md5 (1 row)
  3. このパラメータの値を scram-sha-256 に変更します。これは動的パラメータであるため、この変更を行った後でインスタンスを再起動する必要はありません。値をもう一度チェックして、次のように scram-sha-256 に設定されていることを確認します。

    postgres=> SHOW password_encryption; password_encryption --------------------- scram-sha-256 (1 row)
  4. パスワードの変更をすべてのデータベースユーザーに通知します。アカウント postgres (rds_superuser 権限を持つデータベースユーザー) のパスワードも必ず変更してください。

    labdb=> ALTER ROLE postgres WITH LOGIN PASSWORD 'change_me'; ALTER ROLE
  5. のすべてのデータベースに対してこの処理を繰り返します。RDS for PostgreSQL DB インスタンス。

SCRAM を要求するようにパラメータを変更する

これがプロセスの最後のステップです。次の手順で変更した後、パスワードに引き続き md5 暗号化を使用するユーザーアカウント (ロール) は にログインできません。RDS for PostgreSQL DB インスタンス。

rds.accepted_password_auth_method は、ログインプロセス中に RDS for PostgreSQL DB インスタンスがユーザーパスワードに対して受け入れる暗号化方式を指定します。デフォルト値は md5+scram です。つまり、どちらの方法も受け入れられます。次の画像では、このパラメータのデフォルト設定が表示されています。

rds.accepted_password_auth_method パラメータに対してデフォルト値と許可された値が表示されている RDS コンソール。

このパラメータに指定できる値は、md5+scram または scram のみです。このパラメータの値を scram に変更すると、これが要件となります。

パスワードの SCRAM 認証を要求するようにパラメータ値を変更するには
  1. RDS for PostgreSQL DB インスタンスの上のすべてのデータベースに対するすべてのデータベースユーザーパスワードが、パスワード暗号化に scram-sha-256 を使用していることを確認します。そのためには、rds_tools にロール (ユーザー) と暗号化タイプについて、次のようにクエリします。

    postgres=> SELECT * FROM rds_tools.role_password_encryption_type(); rolname | encryption_type ----------------------+----------------- pg_monitor | pg_read_all_settings | pg_read_all_stats | pg_stat_scan_tables | pg_signal_backend | lab_tester | scram-sha-256 user_465 | scram-sha-256 postgres | scram-sha-256 ( rows)
  2. のすべての DB インスタンスでクエリを繰り返します。RDS for PostgreSQL DB インスタンス。

    すべてのパスワードで scram-sha-256 が使用されている場合は続行できます。

  3. 次のように、受け入れたパスワード認証の値を scram-sha-256 に設定します。

    Linux、macOS、Unix の場合:

    aws rds modify-db-parameter-group --db-parameter-group-name 'docs-lab-scram-passwords' \ --parameters 'ParameterName=rds.accepted_password_auth_method,ParameterValue=scram,ApplyMethod=immediate'

    Windows の場合:

    aws rds modify-db-parameter-group --db-parameter-group-name "docs-lab-scram-passwords" ^ --parameters "ParameterName=rds.accepted_password_auth_method,ParameterValue=scram,ApplyMethod=immediate"