

# PostgreSQL のパスワード暗号化に SCRAM を使用する
<a name="PostgreSQL_Password_Encryption_configuration"></a>

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

Aurora PostgreSQL DB クラスターに対しては、パスワード暗号化方式として MD5 ではなく SCRAM を使用することをお勧めします。SCRAM は、Aurora PostgreSQL バージョン 10 および以降のすべてのメジャーバージョンとマイナーバージョンでサポートされています。これは、パスワード認証と暗号化のために scram-sha-256 アルゴリズムを使用する暗号化チャレンジレスポンスのメカニズムです。

SCRAM をサポートするために、クライアントアプリケーションのライブラリを更新する必要があります。例えば、42.2.0 より前の JDBC バージョンで SCRAM はサポートされていません。詳細については、PostgreSQL JDBC ドライバーのドキュメントの「[PostgreSQL JDBC ドライバー](https://jdbc.postgresql.org/changelogs/2018-01-17-42.2.0-release/)」を参照してください。その他の PostgreSQL ドライバーおよび SCRAM サポートの一覧については、PostgreSQL のドキュメントの「[ドライバーの一覧](https://wiki.postgresql.org/wiki/List_of_drivers)」を参照してください。

Aurora PostgreSQL バージョン 14 以上では、新しい DB クラスターに対してデフォルトでパスワード暗号化に scram-sha-256 をサポートしています。これらのバージョンでは、デフォルトの DB クラスターパラメータグループ (`default.aurora-postgresql14`) が持っている `password_encryption` 値を scram-sha-256 に設定します。SCRAM は Aurora Serverless v1 ではサポートされていません。

## SCRAM を要求するために Aurora PostgreSQL DB クラスター を設定する
<a name="PostgreSQL_Password_Encryption_configuration.preliminary"></a>

Aurora PostgreSQL 14.3 以降のバージョンでは、scram-sha-256 アルゴリズムを使用するパスワードのみを受け入れるために、Aurora PostgreSQL DB クラスターに を要求できます。

**重要**  
PostgreSQL データベースを使用する既存の RDS プロキシでは、`SCRAM` のみを使用するようにデータベース認証を変更すると、プロキシは最大 60 秒間使用できなくなります。この問題を回避するには、以下のいずれかの方法で対応します。  
データベースが `SCRAM` と `MD5` 認証の両方を許可していることを確認します。
`SCRAM` 認証のみを使用するには、新しいプロキシを作成し、アプリケーショントラフィックを新しいプロキシに移行してから、以前にデータベースに関連付けられていたプロキシを削除します。

システムに変更を加える前に、次の完全なプロセスを理解していることを確認してください。
+ すべてのデータベースユーザーのすべてのロールとパスワードの暗号化に関する情報を取得します。
+ パスワードの暗号化を制御するパラメータを指定するために、Aurora PostgreSQL DB クラスター のパラメータ設定を再確認してください。
+ Aurora PostgreSQL DB クラスター でデフォルトのパラメータグループを使用する場合は、カスタムの DB クラスターのパラメータグループ を作成して、それを Aurora PostgreSQL DB クラスター に適用し、必要なときにパラメータを変更できるようにする必要があります。Aurora 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` で暗号化されたパスワードを持つすべてのユーザー (ロール) は接続できなくなります。

### Aurora PostgreSQL DB クラスター に SCRAM を要求する準備
<a name="PostgreSQL_Password_Encryption_configuration.getting-ready"></a>

お使いの Aurora PostgreSQL DB クラスター、に変更を加える前に、既存のデータベースユーザーアカウントをすべて確認します。また、パスワードに使用されている暗号化の種類を確認してください。確認するためには、`rds_tools` 拡張機能を使用します。`rds_tools` をサポートする PostgreSQL バージョンを確認するには、「[Extension versions for Amazon RDS for PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/PostgreSQLReleaseNotes/postgresql-extensions.html)」を参照してください。

**データベースユーザー (ロール) とパスワードの暗号化方法のリストを取得するには**

1. 次のように、`psql` を使用して Aurora PostgreSQL DB クラスターのプライマリ インスタンスを に接続します。

   ```
   psql --host=cluster-name-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. `rds_tools` 拡張機能をインストールします。

   ```
   postgres=> CREATE EXTENSION rds_tools;
   CREATE EXTENSION
   ```

1. ロールと暗号化のリストを取得します。

   ```
   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 クラスターのパラメータグループ の作成
<a name="PostgreSQL_Password_Encryption_configuration.custom-parameter-group"></a>

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

Aurora のパラメータグループの概要については、「[Amazon Aurora での DB クラスターパラメータグループの作成](USER_WorkingWithParamGroups.CreatingCluster.md)」を参照してください。

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

また、AWS マネジメントコンソール または RDS API を使用して、カスタムの DB クラスターのパラメータグループ を作成することもできます。詳細については、「[Amazon Aurora での DB クラスターパラメータグループの作成](USER_WorkingWithParamGroups.CreatingCluster.md)」を参照してください。

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

**カスタム DB クラスターのパラメータグループ を作成するには**

1. `[create-db-cluster-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster-parameter-group.html)` CLI コマンドを使用して、クラスターのカスタムパラメータグループを作成します。次の例では `aurora-postgresql13` をこのカスタムパラメータグループのソースとして使用します。

   Linux、macOS、Unix の場合:

   ```
   aws rds create-db-cluster-parameter-group --db-cluster-parameter-group-name 'docs-lab-scram-passwords' \
     --db-parameter-group-family aurora-postgresql13  --description 'Custom DB cluster parameter group for SCRAM'
   ```

   Windows の場合:

   ```
   aws rds create-db-cluster-parameter-group --db-cluster-parameter-group-name "docs-lab-scram-passwords" ^
     --db-parameter-group-family aurora-postgresql13  --description "Custom DB cluster parameter group for SCRAM"
   ```

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

1. `[modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html)` CLI コマンドを使用して、このカスタムパラメータグループを Aurora PostgreSQL DB クラスターに適用します。

   Linux、macOS、Unix の場合:

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

   Windows の場合:

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

   Aurora PostgreSQL DB クラスターとカスタム DB クラスターパラメータグループ、を再同期するには、プライマリインスタンスおよびクラスターの他のすべてのインスタンスを再起動します。

### SCRAM を使用するためのパスワード暗号化の設定
<a name="PostgreSQL_Password_Encryption_configuration.configure-password-encryption"></a>

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

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

![\[次では、RDS コンソールには、Aurora PostgreSQL の password_encryption パラメータのデフォルト値が表示されます。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/apg-pwd-encryption-md5-scram-1.png)


**パスワード暗号化の設定を scram-sha-256 に変更するには**
+ 次のように、パスワード暗号化の値を scram-sha-256 に設定します。パラメータが動的であるため、変更をすぐに適用できます。そのため、変更を有効にするために再起動は不要です。

  Linux、macOS、Unix の場合:

  ```
  aws rds modify-db-cluster-parameter-group --db-cluster-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 に移行する
<a name="PostgreSQL_Password_Encryption_configuration.migrating-users"></a>

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

**データベースユーザー (ロール) のパスワードを MD5 から SCRAM に移行するには**

1. 次のように、管理者ユーザーとしてログインします (デフォルトのユーザー名、`postgres`)。

   ```
   psql --host=cluster-name-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

1. 次のコマンドを使って、RDS for PostgreSQL DB インスタンスの `password_encryption` パラメータの設定を確認します。

   ```
   postgres=> SHOW password_encryption;
    password_encryption
   ---------------------
    md5
    (1 row)
   ```

1. このパラメータの値を scram-sha-256 に変更します。詳細については、「[SCRAM を使用するためのパスワード暗号化の設定](#PostgreSQL_Password_Encryption_configuration.configure-password-encryption)」を参照してください。

1.  値をもう一度チェックして、次のように `scram-sha-256` に設定されていることを確認します。

   ```
   postgres=> SHOW password_encryption;
    password_encryption
   ---------------------
    scram-sha-256
    (1 row)
   ```

1. パスワードの変更をすべてのデータベースユーザーに通知します。アカウント `postgres` (`rds_superuser` 権限を持つデータベースユーザー) のパスワードも必ず変更してください。

   ```
   labdb=> ALTER ROLE postgres WITH LOGIN PASSWORD 'change_me';
   ALTER ROLE
   ```

1. Aurora PostgreSQL DB クラスターのすべてのデータベースに対してこの処理を繰り返します。

### SCRAM を要求するようにパラメータを変更する
<a name="PostgreSQL_Password_Encryption_configuration.require-scram"></a>

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

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

![\[rds.accepted_password_auth_method パラメータに対してデフォルト値と許可された値が表示されている RDS コンソール。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/pwd-encryption-md5-scram-2.png)


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

**パスワードの SCRAM 認証を要求するようにパラメータ値を変更するには**

1. Aurora 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)
   ```

1. Aurora PostgreSQL DB クラスターのすべての DB インスタンスでクエリを繰り返します。

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

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

   Linux、macOS、Unix の場合:

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

   Windows の場合:

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