20.2. 사용자 이름 맵

Ident 또는 GSSAPI 같은 외부 인증 시스템을 사용하는 경우, 연결을 시작하는 운영 체제 사용자의 이름은 연결해야 하는 데이터베이스 사용자 이름(롤 이름)과 다를 수 있다. 이런 경우 사용자 이름 맵을 사용하여 운영 체제 사용자 이름과 데이터베이스 사용자 이름을 매핑할 수 있다. 사용자 이름 매핑을 사용하려면 pg_hba.conf 옵션 필드에서 map=map-name을 지정해야 한다. 이 옵션은 외부 사용자 이름을 수신하는 모든 인증 방법에서 지원된다. 서로 다른 연결에 서로 다른 매핑이 필요할 수 있으므로 연결별로 사용할 맵을 지정하기 위해 사용할 맵의 이름은 pg_hba.confmap-name 매개 변수에서 지정된다.

사용자 이름 맵은 ident 맵 파일에서 정의되며, 기본적으로 이름은 pg_ident.conf이며 클러스터의 데이터 디렉터리에 저장된다. (맵 파일을 다른 곳에 배치할 수도 있다. ident_file 환경 설정 매개 변수를 참조 바란다.)

map-name system-username database-username

주석 및 공백은 pg_hba.conf에서와 동일하게 처리된다. map-namepg_hba.conf에서 이 매핑을 참고하기 위해 사용되는 임의의 이름이다. 나머지 2개의 필드는 운영 체제 사용자 이름 및 일치하는 데이터베이스 사용자 이름을 지정한다. 동일한 map-name을 여러 번 사용해서 단일 맵 내에서 복수의 사용자 매핑을 지정할 수 있다.

주어진 한 명의 운영 체제 사용자가 몇 명의 데이터베이스 사용자에 대응하는지에 대해서는 아무런 제한이 없다(그 반대로 마찬가지). 따라서, 맵의 항목은 사용자가 동일함을 의미한다기보다 이 운영 체제 사용자는 이 데이터베이스 사용자로서 연결이 허용된다로 생각되어야 한다. 사용자가 연결 요청을 한 데이터베이스 사용자 이름을 사용하여 외부 인증 시스템에서 획득한 사용자 이름과 쌍을 이루는 맵 항목이 있을 경우 연결이 허용된다.

system-username 필드가 슬래시(/)로 시작되는 경우 필드의 나머지는 정규식으로 처리된다. (PostgreSQL의 정규식 구문에 대한 내용은 9.7.3.1절을 참조 바란다.) 정규식은 단일 캡처 또는 괄호 표현식을 포함할 수 있으며, \1 (역슬래시 1개)로 database-username 필드에서 참조가 가능하다. 이것은 한 줄로 된 복수의 사용자 이름을 매핑할 수 있으며, 단순 구문 대체 시 특히 유용하다. 예를 들면,

mymap   /^(.*)@mydomain\.com$      \1
mymap   /^(.*)@otherdomain\.com$   guest

이 항목은 @mydomain.com로 끝나는 시스템 사용자 이름을 사용하여 사용자에 대한 도메인 부분을 삭제하고, 시스템 이름이 @otherdomain.com로 끝나는 모든 사용자가 guest로 로그인하는 것을 허용한다.

작은 정보

기본적으로 정규식은 string의 일부만 일치할 수 있다는 점에 유의해야 한다. 위의 예시처럼 전체 시스템 사용자 이름에 일치되도록 강제하려면 ^$를 사용하는 것이 현명하다.

pg_ident.conf 파일은 시작 시 및 메인 서버 프로세스가 SIGHUP 신호를 수신하면 읽어지게 된다. 활성 중인 시스템에서 파일을 편집하는 경우 파일을 다시 읽어오려면 postmaster에 신호를 전송해야 한다 (pg_ctl reload 또는 pg_reload_conf() SQL 함수 호출 또는 kill -HUP 사용).

예 20.1에서 pg_ident.conf 파일과 함께 사용할 수 있는 pg_hba.conf 파일이 예 20.2에 나와 있다. 이 예제에서 운영 체제 사용자 이름 bryanh 또는 ann, robert가 없는 192.168 네트워크에서 머신에 로그인한 사용자는 액세스 권한을 부여 받지 못한다. Unix 사용자 robertrobert 또는 다른 사람이 아니라 PostgreSQL 사용자인 bob으로 연결을 시도하는 경우에만 액세스가 허용된다. annann으로 연결할 때만 허용된다. 사용자 bryanhbryanh 또는 guest1일 때만 연결이 허용된다.

예 20.2. pg_ident.conf 파일 예시

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

omicron         bryanh                  bryanh
omicron         ann                     ann
# bob has user name robert on these machines
omicron         robert                  bob
# bryanh can also connect as guest1
omicron         bryanh                  guest1