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롤이름
[, ...] | SYSIDuid
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
속성이면 롤로 정의하고 있다.