

# 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` 사용자는 RDS for 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` 사용자는 다음과 같은 작업을 할 수 있습니다.
+ Amazon RDS에서 사용할 수 있는 확장 기능을 추가합니다. 자세한 내용은 [Amazon RDS for PostgreSQL에서 지원되는 PostgreSQL 기능 작업](PostgreSQL.Concepts.General.FeatureSupport.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` 권한을 허용하지 않음을 알 수 있습니다. RDS for PostgreSQL은 관리형 서비스이므로 호스트 OS에 액세스할 수 없으며, PostgreSQL `superuser` 계정을 사용하여 연결할 수 없습니다. 독립 실행형 PostgreSQL에 대한 `superuser` 액세스 권한이 필요한 대부분의 태스크는 Amazon RDS에서 자동으로 관리됩니다.

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

`rds_superuser` 역할은 에서 *미리 정의된* 여러 역할 중 하나입니다. RDS for PostgreSQL DB 인스턴스 

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

다음 목록에서 새로운 에 대해 자동으로 생성되는 미리 정의된 다른 역할 중 일부를 확인할 수 있습니다. RDS for 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 데이터베이스에서 수행할 수 있는 많은 관리 태스크를 처리하기 위해 생성된 역할입니다. 이 역할은 RDS for PostgreSQL에서 다양한 관리 태스크에 내부적으로 사용됩니다.
+ **rdstopmgr** - 다중 AZ 배포를 지원하기 위해 Amazon RDS에서 내부적으로 사용하는 역할입니다.
+ **rds\$1reserved** – Amazon RDS에서 데이터베이스 연결을 예약하는 데 내부적으로 사용하는 역할입니다.

# 역할 및 해당 권한 보기
<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)** 페이지의 기본값입니다. 다른 이름을 선택한 경우 해당 이름이 대신 역할 목록에 표시됩니다.