

# PostgreSQL 역할 및 권한 이해
<a name="Appendix.PostgreSQL.CommonDBATasks.Roles"></a>

AWS Management Console을 사용하여 Aurora PostgreSQL DB 클러스터 를 만들면 관리자 계정이 동시에 생성됩니다. 기본적으로 해당 이름은 다음 스크린샷에 나와 있는 것처럼 `postgres`입니다.

![\[데이터베이스 생성(Create database) 페이지의 보안 인증에 대한 기본 로그인 ID는 postgres입니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/default-login-identity-apg-rpg.png)


기본값(`postgres`)을 그대로 사용하지 않고 다른 이름을 선택할 수 있습니다. 이 경우 선택한 이름은 문자로 시작해야 하며 영숫자 1\$116자 사이어야 합니다. 단순하게 하기 위해 이 안내서 전체에서 기본 사용자 계정을 기본값(`postgres`)으로 참조합니다.

 AWS Management Console 대신 `create-db-cluster` AWS CLI를 사용하는 경우 명령에서 `master-username` 파라미터로 사용자 이름을 전달하여 사용자 이름을 생성합니다. 자세한 내용은 [2단계: Aurora PostgreSQL DB 클러스터 생성](CHAP_GettingStartedAurora.AuroraPostgreSQL.FullConfig.md#CHAP_GettingStarted.AuroraPostgreSQL.CreateDBCluster) 단원을 참조하세요.

AWS Management Console, AWS CLI 또는 Amazon RDS API를 사용하든, 기본 `postgres` 이름을 사용하든, 다른 이름을 선택하든 관계없이 첫 번째 데이터베이스 사용자 계정은 `rds_superuser` 그룹의 멤버이며 `rds_superuser` 권한을 가집니다.

**Topics**
+ [rds\$1superuser 역할 이해](Appendix.PostgreSQL.CommonDBATasks.Roles.rds_superuser.md)
+ [PostgreSQL 데이터베이스에 대한 사용자 액세스 제어](Appendix.PostgreSQL.CommonDBATasks.Access.md)
+ [사용자 암호 관리 위임 및 제어](Appendix.PostgreSQL.CommonDBATasks.RestrictPasswordMgmt.md)
+ [SCRAM for PostgreSQL 암호 암호화 사용](PostgreSQL_Password_Encryption_configuration.md)

# rds\$1superuser 역할 이해
<a name="Appendix.PostgreSQL.CommonDBATasks.Roles.rds_superuser"></a>

PostgreSQL에서는 *역할*로 데이터베이스의 다양한 객체에 대해 그룹 또는 사용자에게 부여된 사용자, 그룹 또는 특정 권한 집합을 정의할 수 있습니다. `CREATE USER` 및 `CREATE GROUP`에 대한 PostgreSQL 명령은 데이터베이스 사용자를 구분하기 위한 특정 속성을 가진 보다 일반적인 `CREATE ROLE`로 대체되었습니다. 데이터베이스 사용자는 LOGIN 권한을 가진 역할로 간주할 수 있습니다.

**참고**  
`CREATE USER` 및 `CREATE GROUP` 명령을 계속 사용할 수 있습니다. 자세한 내용은 PostgreSQL 설명서에서 [데이터베이스 역할](https://www.postgresql.org/docs/current/user-manag.html)을 참조하세요.

`postgres` 사용자는 Aurora PostgreSQL DB 클러스터에서 가장 높은 권한을 지닌 데이터베이스 사용자입니다. 이는 다음 `CREATE ROLE` 문으로 정의되는 특성을 가지고 있습니다.

```
CREATE ROLE postgres WITH LOGIN NOSUPERUSER INHERIT CREATEDB CREATEROLE NOREPLICATION VALID UNTIL 'infinity'
```

속성 `NOSUPERUSER`, `NOREPLICATION`, `INHERIT` 및 `VALID UNTIL 'infinity'`는 별도로 지정하지 않는 한 CREATE ROLE의 기본 옵션입니다.

기본적으로 `postgres`에는 `rds_superuser` 역할에 부여된 권한과 역할 및 데이터베이스를 생성할 수 있는 권한이 있습니다. `rds_superuser` 역할이 있으면 `postgres` 사용자는 다음과 같은 작업을 할 수 있습니다.
+  Aurora PostgreSQL을 참조하세요. 자세한 내용은 [확장 및 외부 데이터 래퍼 작업](Appendix.PostgreSQL.CommonDBATasks.md) 단원을 참조하세요.
+ 사용자에 대한 역할을 생성하고 사용자에게 권한을 부여합니다. 자세한 내용은 PostgreSQL 설명서에서 [CREATE ROLE](https://www.postgresql.org/docs/current/sql-createrole.html) 및 [GRANT](https://www.postgresql.org/docs/14/sql-grant.html)를 참조하세요.
+ 데이터베이스를 생성합니다. 자세한 내용은 PostgreSQL 설명서에서 [CREATE DATABASE](https://www.postgresql.org/docs/14/sql-createdatabase.html)를 참조하세요.
+ 이러한 권한이 없는 사용자 역할에 `rds_superuser` 권한을 부여하고 필요에 따라 권한을 회수합니다. 이 역할은 수퍼유저 태스크를 수행하는 사용자에게만 부여하는 것이 좋습니다. 즉, 데이터베이스 관리자(DBA) 또는 시스템 관리자에게 이 역할을 부여할 수 있습니다.
+ `rds_superuser` 역할이 없는 데이터베이스 사용자에게 `rds_replication` 역할을 부여(회수)합니다.
+ `rds_superuser` 역할이 없는 데이터베이스 사용자에게 `rds_password` 역할을 부여(회수)합니다.
+ `pg_stat_activity` 보기를 사용하여 모든 데이터베이스 연결에 대한 상태 정보를 가져옵니다. 필요한 경우 `rds_superuser`는 `pg_terminate_backend` 또는 `pg_cancel_backend`를 사용하여 연결을 중지할 수 있습니다.

`CREATE ROLE postgres...` 문에서 `postgres` 사용자 역할이 특히 PostgreSQL `superuser` 권한을 허용하지 않음을 알 수 있습니다. Aurora PostgreSQL은 관리형 서비스이므로 호스트 OS에 액세스할 수 없으며, PostgreSQL `superuser` 계정을 사용하여 연결할 수 없습니다. 독립 실행형 PostgreSQL에 대한 `superuser` 액세스 권한이 필요한 대부분의 태스크는 Aurora에서 자동으로 관리됩니다.

권한 부여에 대한 자세한 내용은 PostgreSQL 설명서에서 [GRANT](http://www.postgresql.org/docs/current/sql-grant.html)를 참조하세요.

`rds_superuser` 역할은 Aurora PostgreSQL DB 클러스터에서 *미리 정의된* 여러 역할 중 하나입니다. 

**참고**  
PostgreSQL 13 및 이전 릴리스에서는 *미리 정의된* 역할을 *기본* 역할이라고 합니다.

다음 목록에서 새로운 Aurora PostgreSQL DB 클러스터에 대해 자동으로 생성되는 미리 정의된 다른 역할 중 일부를 확인할 수 있습니다. 미리 정의된 역할 및 권한은 변경할 수 없습니다. 미리 정의된 역할에 대한 권한은 삭제하거나 이름을 바꾸거나 수정할 수 없습니다. 이를 시도할 시에는 오류가 발생합니다.
+ **rds\$1password** - 데이터베이스 사용자를 대상으로 암호를 변경하고 암호 제약 조건을 설정할 수 있는 역할입니다. `rds_superuser` 역할에는 기본적으로 이 역할이 부여되며, 이 역할을 통해 데이터베이스 사용자에게 역할을 부여할 수 있습니다. 자세한 내용은 [PostgreSQL 데이터베이스에 대한 사용자 액세스 제어PostgreSQL에 대한 사용자 액세스 제어](Appendix.PostgreSQL.CommonDBATasks.Access.md) 섹션을 참조하세요.
  + 14 이전의 RDS for PostgreSQL 버전에서 `rds_password` 역할은 암호를 변경하고 데이터베이스 사용자와 `rds_superuser` 역할이 있는 사용자에 대해 암호 제한을 설정할 수 있습니다. 14 이후의 RDS for PostgreSQL 버전에서 `rds_password` 역할은 데이터베이스 사용자에 대해서만 암호를 변경하고 암호 제약 조건을 설정할 수 있습니다. `rds_superuser` 역할이 있는 사용자만 `rds_superuser` 역할을 가진 다른 사용자에게 이러한 작업을 수행할 수 있습니다.
+ **rdsadmin** - `superuser` 권한이 있는 관리자가 독립 실행형 PostgreSQL 데이터베이스에서 수행할 수 있는 많은 관리 태스크를 처리하기 위해 생성된 역할입니다. 이 역할은 Aurora PostgreSQL에서 다양한 관리 태스크에 내부적으로 사용됩니다.

# 역할 및 해당 권한 보기
<a name="Appendix.PostgreSQL.CommonDBATasks.Roles.View"></a>

PostgreSQL 버전에 따라 서로 다른 명령을 사용하여 RDS for PostgreSQL DB 인스턴스에서 사전 정의된 역할과 해당 권한을 볼 수 있습니다. 사전 정의된 모든 역할을 보려면 RDS for PostgreSQL DB 인스턴스에 연결하고 `psql`을 사용하여 다음 명령을 실행할 수 있습니다.

**`psql` 15 이하 버전의 경우**

RDS for PostgreSQL DB 인스턴스에 연결하고 psql에서 `\du` 명령을 사용합니다.

```
postgres=> \du
                                                               List of roles
    Role name    |                         Attributes                         |                          Member of
-----------------+------------------------------------------------------------+------------------------------------------------------
 postgres        | Create role, Create DB                                    +| {rds_superuser}
                 | Password valid until infinity                              |
 rds_ad          | Cannot login                                               | {}
 rds_iam         | Cannot login                                               | {}
 rds_password    | Cannot login                                               | {}
 rds_replication | Cannot login                                               | {}
 rds_superuser   | Cannot login                                               | {pg_monitor,pg_signal_backend,rds_password,rds_replication}
 rdsadmin        | Superuser, Create role, Create DB, Replication, Bypass RLS+| {}
                 | Password valid until infinity                              |
```

**`psql` 16 이상 버전의 경우**

```
postgres=> \drg+
                             List of role grants
   Role name   |          Member of          |       Options       | Grantor
---------------+-----------------------------+---------------------+----------
 postgres      | rds_superuser               | INHERIT, SET        | rdsadmin
 rds_superuser | pg_checkpoint               | ADMIN, INHERIT, SET | rdsadmin
 rds_superuser | pg_monitor                  | ADMIN, INHERIT, SET | rdsadmin
 rds_superuser | pg_signal_backend           | ADMIN, INHERIT, SET | rdsadmin
 rds_superuser | pg_use_reserved_connections | ADMIN, INHERIT, SET | rdsadmin
 rds_superuser | rds_password                | ADMIN, INHERIT, SET | rdsadmin
 rds_superuser | rds_replication             | ADMIN, INHERIT, SET | rdsadmin
```

버전 종속성 없이 역할 멤버십을 확인하려면 다음 SQL 쿼리를 사용할 수 있습니다.

```
SELECT m.rolname AS "Role name", r.rolname AS "Member of"
FROM pg_catalog.pg_roles m
JOIN pg_catalog.pg_auth_members pam ON (pam.member = m.oid)
LEFT JOIN pg_catalog.pg_roles r ON (pam.roleid = r.oid)
LEFT JOIN pg_catalog.pg_roles g ON (pam.grantor = g.oid)
WHERE m.rolname !~ '^pg_'
ORDER BY 1, 2;
```

출력에서 `rds_superuser`는 데이터베이스 사용자 역할은 아니지만(로그인할 수 없음), 다른 많은 역할의 권한을 가집니다. 데이터베이스 사용자 `postgres`가 `rds_superuser` 역할의 멤버임을 알 수도 있습니다. 앞서 언급한 바와 같이 `postgres`는 Amazon RDS 콘솔 **데이터베이스 생성(Create database)** 페이지의 기본값입니다. 다른 이름을 선택한 경우 해당 이름이 대신 역할 목록에 표시됩니다.

**참고**  
 Aurora PostgreSQL 버전 15.2 및 14.7에는 `rds_superuser` 역할의 제한적인 동작이 도입되었습니다. 사용자에게 `rds_superuser` 역할이 부여된 경우에도 연결하려면 Aurora PostgreSQL 사용자에게는 해당 데이터베이스에 대한 `CONNECT` 권한이 부여되어야 합니다. Aurora PostgreSQL 버전 14.7 및 15.2 이전에는 사용자에게 `rds_superuser` 역할이 부여되어 있어야 모든 데이터베이스 및 시스템 테이블에 연결할 수 있었습니다. 이러한 제한적인 동작을 통해 AWS 및 Amazon Aurora는 지속적으로 보안을 강화하고자 최선을 다하고 있습니다.  
위의 개선 사항으로 영향을 받는 경우 애플리케이션에서 관련 로직을 업데이트하세요.

# PostgreSQL 데이터베이스에 대한 사용자 액세스 제어
<a name="Appendix.PostgreSQL.CommonDBATasks.Access"></a>

PostgreSQL의 새 데이터베이스는 항상 모든 데이터베이스 사용자와 역할이 객체를 만들 수 있도록 허용하는 데이터베이스 `public` 스키마의 기본 권한 집합으로 생성됩니다. 이러한 권한을 통해 데이터베이스 사용자는 데이터베이스에 연결하고, 가령 연결된 동안 임시 테이블을 만들 수 있습니다.

 Aurora PostgreSQL DB 클러스터 프라이머리 노드에 생성한 데이터베이스 인스턴스에 액세스할 수 있는 사용자 권한을 보다 효과적으로 제어하려면 이러한 기본 `public` 권한을 회수하는 것이 좋습니다. 이렇게 하고 나서 다음 절차에 표시된 것처럼 데이터베이스 사용자에게 보다 세분화된 구체적인 권한을 부여하면 됩니다.

**새 데이터베이스 인스턴스에 대한 역할 및 권한을 설정하는 방법**

새로 생성한 Aurora PostgreSQL DB 클러스터에 데이터베이스를 설정하여 여러 연구자가 사용할 수 있도록 하고, 이들 모두 데이터베이스에 대한 읽기-쓰기 액세스 권한이 필요하다고 가정합니다.

1. 다음과 같이 `psql` 또는 pgAdmin을 사용하여 Aurora PostgreSQL DB 클러스터의 프라이머리 DB 인스턴스 에 연결합니다.

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

   메시지가 표시되면 암호를 입력합니다. `psql` 클라이언트는 기본 관리 연결 데이터베이스인 `postgres=>`를 연결하고 프롬프트로 표시합니다.

1. 데이터베이스 사용자가 `public` 스키마에서 객체를 생성하지 못하도록 하려면 다음을 수행합니다.

   ```
   postgres=> REVOKE CREATE ON SCHEMA public FROM PUBLIC;
   REVOKE
   ```

1. 다음으로 새 데이터베이스 인스턴스를 생성합니다.

   ```
   postgres=> CREATE DATABASE lab_db;
   CREATE DATABASE
   ```

1. 새 데이터베이스의 `PUBLIC` 스키마에서 모든 권한을 회수합니다.

   ```
   postgres=> REVOKE ALL ON DATABASE lab_db FROM public;
   REVOKE
   ```

1. 데이터베이스 사용자를 위한 역할을 생성합니다.

   ```
   postgres=> CREATE ROLE lab_tech;
   CREATE ROLE
   ```

1. 이 역할이 있는 데이터베이스 사용자에게 데이터베이스 연결 기능을 제공합니다.

   ```
   postgres=> GRANT CONNECT ON DATABASE lab_db TO lab_tech;
   GRANT
   ```

1. `lab_tech` 역할이 있는 모든 사용자에게 이 데이터베이스에 대한 모든 권한을 부여합니다.

   ```
   postgres=> GRANT ALL PRIVILEGES ON DATABASE lab_db TO lab_tech;
   GRANT
   ```

1. 다음과 같이 데이터베이스 사용자를 생성합니다.

   ```
   postgres=> CREATE ROLE lab_user1 LOGIN PASSWORD 'change_me';
   CREATE ROLE
   postgres=> CREATE ROLE lab_user2 LOGIN PASSWORD 'change_me';
   CREATE ROLE
   ```

1. 다음과 같이 두 사용자에게 lab\$1tech 역할과 관련된 권한을 부여합니다.

   ```
   postgres=> GRANT lab_tech TO lab_user1;
   GRANT ROLE
   postgres=> GRANT lab_tech TO lab_user2;
   GRANT ROLE
   ```

이 시점에서 `lab_user1`과 `lab_user2`는 `lab_db` 데이터베이스에 연결할 수 있습니다. 이 예제에서는 여러 데이터베이스 인스턴스와 다양한 스키마 생성, 제한된 권한 부여를 포함할 수 있는 엔터프라이즈 사용에 대한 모범 사례를 따르지 않습니다. 전체 정보 및 추가 시나리오를 알아보려면 [PostgreSQL 사용자 및 역할 관리](https://aws.amazon.com/blogs//database/managing-postgresql-users-and-roles/)를 참조하세요.

PostgreSQL 데이터베이스의 권한에 대한 자세한 내용은 PostgreSQL 설명서에서 [GRANT](https://www.postgresql.org/docs/current/static/sql-grant.html) 명령을 참조하세요.

# 사용자 암호 관리 위임 및 제어
<a name="Appendix.PostgreSQL.CommonDBATasks.RestrictPasswordMgmt"></a>

DBA로서 사용자 암호 관리를 위임할 수 있습니다. 또는 데이터베이스 사용자가 암호를 변경하거나 암호 사용 주기와 같은 암호 제약 조건을 재구성하지 못하도록 할 수 있습니다. 선택한 데이터베이스 사용자만 암호 설정을 변경할 수 있도록 하려면 제한된 암호 관리 기능을 켜면 됩니다. 이 기능을 활성화하면 `rds_password` 역할이 부여된 데이터베이스 사용자만 암호를 관리할 수 있습니다.

**참고**  
제한된 암호 관리를 사용하려면 Aurora PostgreSQL DB 클러스터가 Amazon Aurora PostgreSQL 10.6 이상을 실행해야 합니다.

기본적으로 이 기능은 다음과 같이 `off`입니다.

```
postgres=> SHOW rds.restrict_password_commands;
  rds.restrict_password_commands
--------------------------------
 off
(1 row)
```

이 기능을 켜려면 사용자 정의 파라미터 그룹을 사용하고 `rds.restrict_password_commands`에 대한 설정을 1로 변경합니다. Aurora PostgreSQL의 프라이머리 DB 인스턴스 를 재부팅해야 설정이 적용됩니다.

이 기능을 활성화하면 다음 SQL 명령에 대한 `rds_password` 권한이 필요합니다.

```
CREATE ROLE myrole WITH PASSWORD 'mypassword';
CREATE ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2023-01-01';
ALTER ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2023-01-01';
ALTER ROLE myrole WITH PASSWORD 'mypassword';
ALTER ROLE myrole VALID UNTIL '2023-01-01';
ALTER ROLE myrole RENAME TO myrole2;
```

암호에서 MD5 해시 알고리즘을 사용하는 경우에도 역할 이름 변경(`ALTER ROLE myrole RENAME TO newname`)이 제한됩니다.

이 기능이 활성화된 상태에서 `rds_password` 역할 권한 없이 이러한 SQL 명령을 시도하면 다음 오류가 발생합니다.

```
ERROR: must be a member of rds_password to alter passwords
```

암호 관리에만 사용하는 몇 가지 역할에만 `rds_password` 권한을 부여하는 것이 좋습니다. `rds_superuser` 권한이 없는 데이터베이스 사용자에게 `rds_password` 권한을 부여할 경우 `CREATEROLE` 속성도 부여해야 합니다.

만료 및 클라이언트 측에 필요한 복잡성 등의 암호 요구 사항을 확인해야 합니다. 암호 관련 변경 사항에 대해 자체 클라이언트 측 유틸리티를 사용하는 경우 유틸리티가 `rds_password`의 멤버여야 하며 `CREATE ROLE` 권한을 가져야 합니다.

# SCRAM for PostgreSQL 암호 암호화 사용
<a name="PostgreSQL_Password_Encryption_configuration"></a>

*Salted Challenge Response Authentication Mechanism(SCRAM)*은 암호를 암호화하는 데 사용하는 PostgreSQL의 기본 메시지 다이제스트(MD5) 알고리즘을 대체합니다. SCRAM 인증 메커니즘은 MD5보다 더 안전한 것으로 간주됩니다. 이러한 2가지 암호 보호 방법에 대한 자세한 내용은 PostgreSQL 설명서의 [암호 인증](https://www.postgresql.org/docs/14/auth-password.html)을 참조하세요.

MD5가 아닌 SCRAM을 Aurora PostgreSQL DB 클러스터의 암호 암호화 체계로 사용하는 것이 좋습니다. 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 이상 버전의 경우 Aurora PostgreSQL DB 클러스터가 scram-sha-256 알고리즘을 사용하는 암호만 수락하도록 요구할 수 있습니다.

**중요**  
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 버전을 확인하려면 [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) 섹션을 참조하세요.

암호에 사용되는 암호 암호화 유형은 하나의 파라미터 `password_encryption`으로 설정됩니다. Aurora PostgreSQL DB 클러스터 에서 허용하는 암호화는 다른 파라미터인 `rds.accepted_password_auth_method`로 설정됩니다. 이러한 값 중 하나를 기본값에서 변경하려면 사용자 지정 DB 클러스터 파라미터 그룹 을 생성하여 클러스터 에 적용해야 합니다.

AWS Management Console 또는 RDS API를 사용하여 사용자 지정 DB 클러스터 파라미터 그룹 을 생성할 수도 있습니다. 자세한 내용은 [Amazon Aurora에서 DB 클러스터 파라미터 그룹 생성](USER_WorkingWithParamGroups.CreatingCluster.md) 단원을 참조하세요.

DB 파라미터 그룹을 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`을 사용자 지정 파라미터 그룹의 소스로 사용할 수 있습니다.

   대상 LinuxmacOS, 또는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 클러스터에 적용합니다.

   대상 LinuxmacOS, 또는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
   ```

   사용자 지정 DB 클러스터 파라미터 그룹이 포함된 Aurora PostgreSQL DB 클러스터 를 다시 동기화하려면 클러스터의 프라이머리 및 기타 모든 인스턴스를 재부팅합니다.

### SCRAM을 사용하도록 암호 암호화 구성
<a name="PostgreSQL_Password_Encryption_configuration.configure-password-encryption"></a>

Aurora PostgreSQL DB 클러스터 에서 사용하는 암호 암호화 메커니즘은 DB 클러스터 파라미터 그룹 에 `password_encryption` 파라미터로 설정되어 있습니다. 허용되는 값은 설정하지 않거나 `md5` 또는 `scram-sha-256`입니다. 기본값은 다음과 같이 Aurora PostgreSQL 버전에 따라 달라집니다.
+ Aurora PostgreSQL 14 – 기본값은 `scram-sha-256`입니다.
+ Aurora PostgreSQL 13 – 기본값은 `md5`입니다.

사용자 지정 DB 클러스터 파라미터 그룹 이 Aurora PostgreSQL DB 클러스터 에 연결되어 있으면 암호 암호화 파라미터 값을 변경할 수 있습니다.

![\[RDS 콘솔에 Aurora PostgreSQL의 password_encryption 파라미터에 대한 기본값이 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/images/apg-pwd-encryption-md5-scram-1.png)


**암호의 암호화 설정을 scram-sha-256으로 변경하려면**
+ 다음과 같이 암호의 암호화 값을 scram-sha-256으로 변경합니다. 파라미터가 동적이기 때문에 변경 사항을 즉시 적용할 수 있으므로 변경 사항을 적용하려고 재시작하지 않아도 됩니다.

  대상 LinuxmacOS, 또는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 콘솔에서 rds.accepted_password_auth_method 파라미터에 대한 기본 값과 허용된 값을 표시합니다.\]](http://docs.aws.amazon.com/ko_kr/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으로 변경합니다.

   대상 LinuxmacOS, 또는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"
   ```