PostgreSQL 접속 시 에러
OS 계정 명과 일치하지 않는 PostgreSQL 계정을 생성한 후 psql 명령어를 사용하여 접속하려고 하면
아래와 같은 에러메시지가 나옵니다.
psql: FATAL: Peer authentication failed for user "psqluser" |
DB 사용자계정을 생성한 후 DB 에 접속하려고 하는데 접속할 수 없다고 나오며
제가 왜 OS 계정과 일치하지 않는다는 표현을 했을까요.
1
2
3
|
postgres@VirtualBox:~/10/main$ psql -U psqluser -W
Password for user psqluser:
psql: FATAL: Peer authentication failed for user "psqluser"
|
cs |
PostgreSQL 에 접속하기 위한 사용자 개념
PostgreSQL 에서는 postgres 계정이 SUPERUSER 이며 peer 접속방식으로 설정되어 있습니다.
이 때 postgres OS 계정에서 postgres PostgreSQL 사용자 계정으로 접속은 특이사항 없으며
PostgreSQL 을 설치하면 pg_hba.conf 파일에 아래와 같은 내용이 기록됩니다.
( 갑자기 왠 pg_hba.conf 를 설명하는지는 아래를 읽어보시면 이해하실 수 있습니다. )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 md5
host replication all ::1/128 md5
|
cs |
DATABASE, USER, ADDRESS 에 대해서는 크게 어려움이 없으실 것 같아 TYPE 과 ADDRESS 에 대해서만 설명합니다.
TYPE
값 | 설명 |
local | Unix Domain Socket 을 사용하는 접속을 의미 로그인한 OS 사용자가 데이터베이스에 접속한 경우 |
host | TCP/IP 를 사용하는 연결방식 |
METHOD
값 | 설명 |
peer | 로그인을 위한 ident 를 Local 에서만 허용 |
md5 | 로그인 시 비밀번호를 입력 |
바로 안 와닿으실 수 있을 것 같아서 접속에 대한 예시를 들었습니다.
예시
PostgreSQL 에는 psqluser 사용자 계정만 있는 상태입니다. ( OS 계정명 X, PostgreSQL 데이터베이스명 X )
이 때 local + peer 방식으로 접속을 시도하려고 할 때와 host + md5 방식으로 접속을 할 때를 비교해 봅니다.
에러메시지가 다른 것을 확인하실 수 있죠?
local + peer 방식은 PostgreSQL 계정에 맞는 OS 계정이 있어야 합니다.
소켓을 생성할 수 있는 OS 계정이 필요하기 때문입니다.
반면 host + md5 방식에서는 OS 계정이 필요없기 때문에 다른 에러메시지가 나온 것을 확인할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
psqluser | Create DB | {}
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
osDB | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 |
postgres | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 |
psqldb | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 |
template0 | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
# OS 계정에서 psqluser 는 없는 상태이며
# PostgreSQL 에서 psqluser 데이터베이스도 없는 상태입니다.
# PostgreSQL 에 psqluser 계정만 생성되어 있는 상태입니다.
postgres@VirtualBox:~$ psql -U psqluser -d psqldb -W
Password for user psqluser:
psql: FATAL: Peer authentication failed for user "psqluser"
postgres@VirtualBox:~$ psql -h 127.0.0.1 -p 5432 -U psqluser -W
Password for user psqluser:
psql: FATAL: database "psqluser" does not exist
|
cs |
* 참고로 마지막 에러는 psqluser 계정과 매핑되는 DB 가 없기 때문이며, psqldb 의 소유자를 psqluser 로 변경해 주면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
postgres=# alter database psqldb owner to psqluser;
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
osDB | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 |
postgres | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 |
psqldb | psqluser | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 |
template0 | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
|
cs |
PostgreSQL 접속 시 에러를 해결하기 위해
3가지 방법이 있습니다.
다른 OS 계정과 PostgreSQL 의 계정을 매핑
1. pg_ident.conf 파일에 임의의 MAPNAME 을 입력후 OS 계정과 PostgreSQL 의 계정을 입력합니다.
2. pg_hba.conf 파일의 peer 로 된 부분 마지막에 임의로 입력한 MAPNAME 을 입력합니다. (구분자는 TAB 입니다.)
3. PostgreSQL 을 재시작 합니다.
4. PostgreSQL 계정인 psqluser 를 사용하여 접속합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
postgres@VirtualBox:/etc/postgresql/10/main$ cat pg_ident.conf
# MAPNAME SYSTEM-USERNAME PG-USERNAME
OS-DB-usertest postgres psqluser
postgres@VirtualBox:/etc/postgresql/10/main$ cat pg_hba.conf
# "local" is for Unix domain socket connections only
#local all all peer
local all all peer map=OS-DB-usertest
postgres@VirtualBox:/etc/postgresql/10/main$ /etc/init.d/postgresql restart
postgres@VirtualBox:/etc/postgresql/10/main$ psql -U psqluser -d psqldb -W
Password for user psqluser:
psql (10.16 (Ubuntu 10.16-0ubuntu0.18.04.1))
Type "help" for help.
psqldb=>
|
cs |
PostgreSQL 계정과 동일한 OS 계정을 생성
PostgreSQL 계정과 동일한 OS 계정을 생성한 후 로그인 합니다.
사용자 계정을 생성하면 OS 계정의 권한으로 된 파일을 만들 수 있으므로 접속이 가능합니다.
1
2
3
4
5
6
7
8
9
|
root@VirtualBox:~# useradd psqluser
root@VirtualBox:~# su - psqluser
psqluser $ psql -U psqluser -d psqldb -W
Password for user psqluser:
psql (10.16 (Ubuntu 10.16-0ubuntu0.18.04.1))
Type "help" for help.
psqldb=>
|
cs |
Host 방식의 접속을 사용
local 방식의 접속을 사용하지 않으면 OS 계정이 없거나 pg_ident 파일을 설정하지 않아도 접속할 수 있습니다.
1
2
3
4
5
6
7
|
postgres@VirtualBox:/etc/postgresql/10/main$ psql -h 127.0.0.1 -p 5432 -U psqluser -d psqldb -W
Password for user psqluser:
psql (10.16 (Ubuntu 10.16-0ubuntu0.18.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
psqldb=>
|
cs |
'Database > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] PostgreSQL 데이터베이스 데이터파일 경로 확인 방법 (0) | 2021.04.02 |
---|---|
[PostgreSQL] PostgreSQL SQL 덤프 방식의 백업과 복원 (0) | 2021.04.02 |
[PostgreSQL] PostgreSQL 사용자 계정 추가와 롤 부여하는 방법 (0) | 2021.03.14 |
[PostgreSQL] PostgreSQL 데이터베이스 생성 (0) | 2021.03.14 |
[PostgreSQL] PostgreSQL 다운로드 및 설치하기 (0) | 2021.03.14 |