CREATE ROLE

CREATE ROLE — 새 데이터베이스 롤 정의

요약

CREATE ROLE 이름 [ [ WITH ] 옵션 [ ... ] ]

옵션 자리에는:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT 접속제한
    | [ ENCRYPTED ] PASSWORD '비밀번호'
    | VALID UNTIL '타임스탬프'
    | IN ROLE 롤이름 [, ...]
    | IN GROUP 롤이름 [, ...]
    | ROLE 롤이름 [, ...]
    | ADMIN 롤이름 [, ...]
    | USER 롤이름 [, ...]
    | SYSID uid

설명

CREATE ROLE 명령은 PostgreSQL 데이터베이스 클러스터에 새 롤을 추가한다. 하나의 롤은 데이터베이스 개체들을 소유할 수 있고, 데이터베이스 권한을 가질 수 있다. 롤은 그 사용 용도에 따라, 사용자도 되고, 그룹도 되고, 둘 다도 될 수 있다. 롤 관리는 21장에서, 롤 인증은 20장에서 자세히 다룬다. 이 명령을 실행하려면, 사용자가 CREATEROLE 권한이 있거나 슈퍼유저여야 한다.

롤은 데이터베이스 클러스터 전역 개체다. 그래서, 그 클러스터 내 모든 데이터베이스에서 사용할 수 있다.

롤을 역할로 옮길까 고민하다가 외래어 차용으로 결정했다. - 옮긴이

매개 변수

이름

새로 만들 롤 이름.

SUPERUSER
NOSUPERUSER

슈퍼유저로 지정할지 선택. 슈퍼유저란 해당 데이터베이스 내 모든 접근 제한을 무시 하고, 작업할 수 있는 사용자를 뜻한다. 슈퍼유저는 위험하다. 정말 해당 사용자가 슈퍼유저 권한이 있어야 하는 경우에 대해서만 그 권한을 부여해야 한다. 슈퍼유저 사용자를 만드려면, 먼저 이 명령을 실행하는 사용자가 슈퍼유저여야 한다. 기본 값은 NOSUPERUSER.

CREATEDB
NOCREATEDB

데이터베이스를 만들 역할을 부여할 것인지 선택. CREATEDB 옵션은 데이터베이스를 만들 수 있고, NOCREATEDB 옵션은 만들 수 없다. 기본값은 NOCREATEDB.

CREATEROLE
NOCREATEROLE

새로운 롤을 만들 역할을 부여할 것인지 선택. CREATEROLE 옵션을 사용하면, 새로 만들어진 사용자가 CREATE ROLE 명령을 사용할 수 있게 된다. 또한 특정 사용자를 지울 수도 있다. 기본값은 NOCREATEROLE.

INHERIT
NOINHERIT

새 롤의 구성원(소속원)들에게도 자신의 권한을 상속할 것인지를 지정한다. INHERIT 옵션을 지정해서 만든 롤은 그 롤의 구성원들이 특별히 권한 설정을 하지 않아도 상위 롤의 권한을 그대로 물려받는다. NOINHERIT 속성의 롤의 구성원들은 자신의 권한을 상위 롤로 권한으로 바꾸려면, SET ROLE 명령을 사용해야 한다. 기본값은 INHERIT.

LOGIN
NOLOGIN

해당 롤이 로그인 할 수 있는지를 결정한다. 클라이언트에서 이 이름으로 서버에 접속할 수 있게 하는 것이다. LOGIN 옵션을 사용하면, 일반적인 개념의 데이터베이스 사용자로 지정하는 것이다. NOLOGIN 옵션을 사용하는 롤은 데이터베이스 접근 권한을 관리하는데 유용하게 사용되는데, 단어 의미로 볼 때 이는 사용자가 아니다. 기본값은 NOLOGIN. CREATE ROLE 명령으로 롤을 만들 때는, LOGIN 옵션이 기본값이다. CREATE USER 명령 설명서 참고.

REPLICATION
NOREPLICATION

복제 역할을 하는 롤인지 결정한다. REPLICATION 옵션을 사용하는 롤은 복제(물리, 논리 복제 모두)를 위해 서버에 접속할 수 있고, 복제 슬롯을 만들거나 지울 수 있다. REPLICATION 옵션을 사용하는 롤은 꽤 높은 권한을 가진다. 이렇기 때문에, 복제 용도로만 사용하는 것이 안전한다. 기본값은 NOREPLICATION.

BYPASSRLS
NOBYPASSRLS

로우 단위 보안 정책을 통과하는 역할을 부여할지를 결정한다. 기본값은 NOBYPASSRLS. pg_dump 명령은 row_security 옵션값을 기본 OFF로 해서 작업한다. 왜냐하면, 테이블 덤프는 모든 자료를 대상으로 하기 때문이다. 만일 NOBYPASSRLS 롤(일반 사용자)이 로우 단위 보안 정책을 사용하고 있는 테이블을 덤프 하고자 한다면, 오류로 처리한다. 슈퍼유저와, BYPASSRLS 옵션을 사용하는 옵션은 이 문제를 피할 수 있다.

CONNECTION LIMIT 접속제한

해당 롤로 접속할 수 있는 최대 동시 접속 수. 기본값은 -1 (제한 없음). 이 제한값은 일반 사용자를 대상으로 한다. 미리 준비된 트랜잭션이나, 백그라운드 작업자 프로세스는 이 제한에서 제외된다.

[ ENCRYPTED ] PASSWORD password

해당 롤 비밀번호를 지정한다. 이 비밀번호는 로그인 인증에만 사용되기 때문에, LOGIN 옵션을 사용하지 롤에 대해서는 의미없다. (하지만 지정할 수는 있다.) 로그인 인증방법 중에 비밀번호 인증을 사용하지 않는다면, 여기서 비밀번호를 지정할 필요는 없다. 비밀번호 인증을 사용하는데, 이 값이 null이면, 항상 인증 실패로 간주한다. 명시적으로 비밀번호를 null로 지정할 때는 PASSWORD NULL 구문을 사용한다.

참고

PostgreSQL 10 버전 이전 버전까지는 빈 문자열 비밀번호와 null 비밀번호를 같이 인증 실패로 처리했지만, 10 버전 이후부터는 이를 구분한다. (10 버전부터는 빈 문자열로 지정하면, 그것에 대한 암호화를 한다. - 옮긴이) libpq 라이브러리를 이용한 인증 작업에서는 이 두 경우 모두 무조건 인증 실패로 처리한다. 이런 모호함을 피하기 위해서, 빈 문자열 비밀번호는 사용하지 않는 것이 좋다.

비밀번호는 항상 시스템 카탈로그에 암호화 해서 지정된다. ENCRYPTED 옵션은 단지 하위 호환성 때문에 지원하고 있을 뿐이다. 암호화 방법은 password_encryption 환경 설정 매개 변수 값으로 지정한다. 여기서 지정한 비밀번호 값이 이미, MD5-암호화, SCRAM-암호화 형식으로 암호화된 문자열이라면, (서버는 그것을 다시 암호화 전 비밀번호로 바꿔서, 서버에서 사용하는 비밀번호 암호화 방법으로 다시 암호화 할 수 없기 때문에) password_encryption 설정값에 상관 없이, 그대로 시스템 카탈로그에 저장된다. 이런 방식으로 덤프/복원 작업이 진행된다.

VALID UNTIL '타임스탬프'

VALID UNTIL 옵션으로 지정한 시간이 지나면 해당 비밀번호로는 더 이상 로그인 하지 못한다. 이 옵션을 사용하지 않으면 해당 비밀 번호 유효 기간 제한을 두지 않는다.

IN ROLE 롤이름

IN ROLE 옵션은 새로 만들어지는 롤이 여기서 지정한 롤의 구성으로 지정한다. (이 작업으로 새로 만드는 롤이 지정할 롤의 관리자 역할을 하는 작업을 함께 하지는 못한다. 관리자 권한 설정 작업으로 GRANT 명령을 이용해야 한다.)

IN GROUP 롤이름

IN ROLE 옵션과 같은 옛날 구문.

ROLE 롤이름

새로 만들 롤이 여기서 지정한 롤의 상위 그룹이 된다. 그룹 구성원을 함께 등록하면서 그룹 롤을 만들 때 사용한다.

ADMIN 롤이름

ROLE 옵션과 같으며, 다른 점은 이 옵션으로 사용하는 롤에 WITH ADMIN OPTION 옵션을 추가한다.

USER 롤이름

ROLE 옵션과 같은, 옛날 구문이다.

SYSID uid

SYSID 옵션은 무시된다. 하위 버전 호환성 때문에 있는 옵션이다.

참고

롤 속성을 바꿀 때는 ALTER ROLE 명령으로, 롤 삭제는 DROP ROLE 명령으로 한다. CREATE ROLE 명령으로 지정한 모든 속성은 ALTER ROLE 명령으로 나중에 변경할 수 있다.

롤 구성원 관리 (추가 , 삭제) 작업은 GRANT, REVOKE 명령으로 한다.

VALID UNTIL 옵션은 비밀번호를 지정할 때만 유효한 옵션이다. 비밀번호 기반 인증 방법을 사용하지 않는다면, 이 옵션에서 지정한 비밀번호 만료 기한은 의미 없다.

INHERIT 속성은 해당 롤에 부여야 데이터베이스 개체들의 접근 권한을 해당 롤의 소속원들 개별적으로 특별히 접근 권한을 지정하지 않아도 그대로 적용됨을 의미한다. 이것은 CREATE ROLE 명령, 또는 ALTER ROLE 명령으로 지정하는 해당 롤의 속성이 상속되는 것을 의미하지는 않는다. 예를 들어 CREATEDB 권한이 있는 롤에 새로운 구성원을 추가 한다고 해서, 그 새로운 구성원 롤에 자동으로 그 권한이 상속되어, 데이터베이스를 만들 수 있는 것은 아니다. 이런 롤 속성 권한을 획득하려면, 데이터베이스를 만들기 전에, SET ROLE 명령으로 롤을 바꿔야 한다.

INHERIT 속성이 기본값인 이유는 하위 호환성 때문이다. PostgreSQL는 어떤 구성원은 그 상위 그룹의 권한을 따르도록 해 왔다. 반면, 표준 SQL 시각에서 보면 이런 그룹과 그 소속원 간의 권한 상속은 NOINHERIT 옵션을 사용하는 것이 더 표준에 가깝다.

CREATEROLE 옵션은 주의해서 사용해야 한다. CREATEROLE 옵션은 자동 상속되지는 않지만, 이 권한이 있는 롤은 다른 권한을 가진 특정 롤을 만들 수 있기 때문에, 의도하지 않은 권한 남용이 발생할 수 있다. 예를 들어, CREATEROLE 권한이 있는 user가 새로운 롤을 만드면서 CREATEDB 권한을 부여했다면, 이 새로운 롤은 데이터베이스를 만들 수 있게 된다. 즉, CREATEROLE 옵션을 사용한다는 것은 거의 슈퍼유저에 가까운 권한을 부여하는 것과 같기 때문에 주의해야 한다.

PostgreSQL에서는 CREATE ROLE SQL 명령으로 할 수 있는 작업을 쉘 명령어로 할 수 있는 createuser 응용 프로그램을 제공한다. (내부적으로 이 SQL 명령이 사용된다.)

CONNECTION LIMIT 옵션에 지정한 접속 제한 수는 대략적으로 계산된다. 가령 남은 연결이 하나 남았는데, 동시에 두 세션이 접속을 시도하면, 둘 다 접속 제한으로 접속하지 못할 수도 있다. 또한 슈퍼 유저 접속은 이 접속 제한 계산에 포함되지 않는다.

이 명령어를 이용할 때, 암호화 되기전 평문 암호를 입력할 때는 주의를 해야한다. 서버에는 그 암호가 암호화 되어 저장되지만, 서버 로그나, 클라이언트 작업 내역 파일에는 그 평문 암호 그대로 노출 될 수 있기 때문이다. createuser 명령을 사용해서 입력하는 비밀번호의 흔적을 남기지 않던지 (이 명령은 서버로 비밀번호를 넘길 때 이미 암호화 한다.), psql 에서 \password 내장 명령어를 이용해서 비밀번호를 바꿔 평문 비밀번호가 기록되지 않도록 하는 것이 좋다.

예제

비밀번호 없는 로그인 가능한 롤:

CREATE ROLE jonathan LOGIN;

비밀번호 있는 로그인 가능한 롤:

CREATE USER davide WITH PASSWORD 'jw8s0F4';

(CREATE USER 명령은 CREATE ROLE 명령에 자동으로 LOGIN 옵션을 사용하는 것과 같다.)

비밀번호가 2005-01-01 00:00:00 까지만 유효한 로그인 가능한 롤:

CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';

데이터베이스 만들기 권한과 롤 관리 권한이 있는 롤:

CREATE ROLE admin WITH CREATEDB CREATEROLE;

호환성

CREATE ROLE 구문은 표준 SQL 구문이다. 하지만 표준 구문에서는 다음 구문만 정의한다.

CREATE ROLE 이름 [ WITH ADMIN 롤이름 ]

다중 초기 관리자와 여러 옵션들은 PostgreSQL 확장 기능이다.

SQL 표준에서는 사용자와 롤 개념을 다르게 정의하고 있으며, 사용자를 정의하는 모든 명령은 각 데이터베이스에서 알아서 구현하도록 맡기고 있다. PostgreSQL에서는 사용자와 롤을 같은 개체로 통합했다. 그래서, 롤 속성으로 표준보다 다양한 선택 옵션들이 있다.

SQL 표준에서는, NOINHERIT 속성이면 사용자, INHERIT 속성이면 롤로 정의하고 있다.

관련 항목

SET ROLE, ALTER ROLE, DROP ROLE, GRANT, REVOKE, createuser