Ident 또는 GSSAPI 같은 외부 인증 시스템을 사용하는 경우, 연결을 시작하는 운영 체제 사용자의 이름은 연결해야 하는 데이터베이스 사용자 이름(롤 이름)과 다를 수 있다.
이런 경우 사용자 이름 맵을 사용하여 운영 체제 사용자 이름과 데이터베이스 사용자 이름을 매핑할 수 있다.
사용자 이름 매핑을 사용하려면 pg_hba.conf 옵션 필드에서 map
=map-name
을 지정해야 한다.
이 옵션은 외부 사용자 이름을 수신하는 모든 인증 방법에서 지원된다.
서로 다른 연결에 서로 다른 매핑이 필요할 수 있으므로 연결별로 사용할 맵을 지정하기 위해 사용할 맵의 이름은 pg_hba.conf
의 map-name
매개 변수에서 지정된다.
사용자 이름 맵은 ident 맵 파일에서 정의되며, 기본적으로 이름은 pg_ident.conf
이며 클러스터의 데이터 디렉터리에 저장된다.
(맵 파일을 다른 곳에 배치할 수도 있다. ident_file 환경 설정 매개 변수를 참조 바란다.)
map-name
system-username
database-username
주석 및 공백은 pg_hba.conf
에서와 동일하게 처리된다. map-name
은 pg_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 사용자 robert
는 robert
또는 다른 사람이 아니라 PostgreSQL 사용자인 bob
으로 연결을 시도하는 경우에만 액세스가 허용된다.
ann
은 ann
으로 연결할 때만 허용된다. 사용자 bryanh
은 bryanh
또는 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