psql : 치명적 : 사용자“dev”에 대한 피어 인증에 실패했습니다


198

새 사용자를 만들 때 데이터베이스에 로그인 할 수 없습니다.
나는 이렇게 이렇게 :

postgres@Aspire:/home/XXX$ createuser dev
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

그런 다음 데이터베이스를 작성하십시오.

postgres@Aspire:/home/XXX$ createdb -O dev test_development

그 후 psql -U dev -W test_development로그인을 시도 하지만 오류가 발생합니다.

psql: FATAL:  Peer authentication failed for user "dev"

문제를 해결하려고했지만 실패했습니다.



위의 질문에 대한 답변을 요청 --interactive하려면 다음 명령 을 추가 해야합니다.createuser --interactive joe
user3791372

답변:


310

시험:

psql -U user_name  -h 127.0.0.1 -d db_name

어디

  • -U 데이터베이스 사용자 이름입니다
  • -h 로컬 서버의 호스트 이름 / IP이므로 Unix 도메인 소켓을 피하십시오
  • -d 연결할 데이터베이스 이름입니다.

그런 다음 Unix 도메인 소켓 연결이 아닌 Postgresql에 의한 "네트워크"연결로 평가되므로 다음과 같이 "로컬"연결로 평가되지 않습니다 pg_hba.conf.

local   all             all                                     peer

15
나는 필요했다 (ver 9.4) : psql -U user-name -h 127.0.0.1 -d db-name
Gregor

9
얼마나 훌륭한 도구입니까? 매뉴얼은 말한다 psql [option...] [dbname [username]], 그래서 당신 psql dbname username은 그냥 작동 한다고 생각 합니다 ..
djeikyb

2
나를 위해 일했습니다. 또한 이것이 구성 파일을 변경하는 것보다 훨씬 더 바람직한 방법이라고 생각합니다. 특히 수행중인 작업에 대한 단서가없고 문제를 해결하기 위해 SO 답변을 따르는 경우 특히 그렇습니다.
borisano

1
이것이 왜 올바른 해결책인지에 대한 연구를하고 있지만 이것은 많은 도움이되었습니다. 그럼에도 불구하고 다른 컴퓨터의 구성에서는 psql -U username -d database로 로그인합니다. 그래서 나는 수용 된 해결책이 사건에 달려 있다고 생각합니다.
나사로 상승

2
좋은 대답입니다. postgres \c glossary john FATAL: Peer authentication failed for user "john"로 로그인 한 후 데이터베이스 내부에서 가져 \c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".와서 작동했습니다.
보기

215

기본적으로 인증을 psql사용하여 UNIX 소켓을 통해 연결 하므로 peer현재 UNIX 사용자와 사용자 이름이 같아야합니다 psql. 당신은 UNIX 사용자를 만들어야합니다 그래서 dev다음과 같이 로그인 dev또는 사용 sudo -u dev psql test_development하여 데이터베이스에 액세스하기위한 (그리고 psql해야 하지 암호를 요청).

임시 쿼리 를 위해 데이터베이스에 연결하려는 경우와 같이 UNIX 사용자를 만들 수 없거나 원하지 않는 경우 psql --host=localhost --dbname=test_development --username=dev(@meyerson answer에서 지적한대로) 소켓 연결을 사용 하면 즉각적인 문제가 해결됩니다.

그러나 피어 메소드 대신 Unix 소켓을 통해 비밀번호 인증을 강제하려면 다음 pg_hba.conf* 행을 변경하십시오 .

...에서

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peerUNIX 사용자의 신원 (신뢰성)을 신뢰한다는 의미입니다. 암호를 요구하지 않습니다.

  • md5는 항상 비밀번호를 요청하고로 해시 한 후 비밀번호를 확인 함을 의미합니다 MD5.

물론 특정 데이터베이스 나 사용자에 대해 더 구체적인 규칙을 만들 수도 있습니다. 일부 사용자에게는 peer암호가 필요합니다.

pg_hba.confPostgreSQL이 실행중인 경우 변경 한 후 다시로드 ( pg_ctl reload) 또는 다시 시작 ( sudo service postgresql restart) 하여 구성을 다시 읽어야합니다 .

* 파일 pg_hba.conf은 대부분/etc/postgresql/9.x/main/pg_hba.conf

편집 : @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_의 의견 답변에 포함 된 의견.


5
peer AND 는 어떻게 허용 md5합니까? 을 설정하면 md5더 이상 postgres사용자로 로그인 할 수 없습니다 ! 여러 줄을 추가하고 메서드를 쉼표로 분리하려고 시도했지만 작동하지 않았습니다. 좋아, 나는 mgoldwasser대답을 찾았고 효과가 있었다. 방금 postgres방법으로 사용자 를 위해 다른 줄을 추가했습니다 peer!
클로이

3
걱정하지 마십시오. 특정 사용자 (예 : 사용자 이름 또는 postgres)에 대해 피어 인증을 설정할 수 있습니다. 특정 규칙이 일반 규칙보다 우선하는 것 같습니다
JavierIEH

1
일부 배포판에서는 파일을 여기에서도 찾을 수 있습니다./var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher

2
postgresql을 다시 시작하지 않고이 작업을 수행 할 수 없습니까? pg_user 테이블에 인증 방법을 지정할 수 없습니까?
fccoelho

2
다시 시작하지 않고 다시로드 할 수 있습니다. pg_hba 테이블이 다시로드됩니다. 나를 위해 일했다.
Joanis

29

피어 인증은 postgres가 운영 체제에 로그인 이름을 요청하고이를 인증에 사용함을 의미합니다. postgres에서 피어 인증을 사용하여 "dev"사용자로 로그인하려면 운영 체제의 "dev"사용자 여야합니다.

인증 방법에 대한 자세한 내용은 Postgresql 설명서를 참조하십시오 .

힌트 : 더 이상 인증 방법이 작동하지 않으면 서버를 네트워크에서 분리하고 "localhost"에 "trust"방법을 사용하십시오 ( "trust"방법이 활성화 된 상태에서 네트워크를 통해 서버에 연결할 수 없는지 다시 확인하십시오).


1
귀하의 답변에 감사드립니다. 그러나 dev시스템 사용자로 변경해도 여전히 작동하지 않습니다XXX
hsming

2
스테판의 대답은 맞습니다. 방금 편집 내용을 검토 할 때 표시 될 링크를 각 인증 방법이 설명 된 설명서에 추가했습니다.
dsh

25

지정할 때 :

psql -U user

peer별도로 지정하지 않는 한 기본적으로 인증을 사용하는 UNIX 소켓을 통해 연결됩니다 pg_hba.conf.

다음을 지정할 수 있습니다.

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

지정된 database및의 루프백 인터페이스 (IPv4 및 IPv6 모두)에서 TCP / IP 연결을 가져옵니다 user.

변경 후 postgres를 다시 시작하거나 구성을 다시로드해야합니다. 최신 RHEL / Debian 기반 배포판에서 작동하는 재시작 :

service postgresql restart

새로 고침은 다음과 같은 방식으로 작동합니다 :

pg_ctl reload

그러나 명령은 PATH 구성에 따라 다를 수 있습니다-postgres가 설치된 방식에 따라 절대 경로를 지정해야 할 수도 있습니다.

그런 다음 다음을 사용할 수 있습니다.

psql -h localhost -U user -d database

TCP / IP를 통해 user지정된 로그인하십시오 database. md5은 암호화 된 비밀번호를 나타내며, password인증하는 동안 일반 텍스트 비밀번호를 지정할 수도 있습니다 . 데이터베이스 서버에 로컬로만 액세스 할 수 있고 네트워크에 액세스 할 수 없다면이 두 가지 옵션은 중요하지 않습니다.

중요 사항 :pg_hba.conf 문제의 정의 순서 -규칙은 iptables와 같이 위에서 아래로 읽히므로 규칙 위에 제안 된 규칙을 추가 할 수 있습니다.

host    all             all             127.0.0.1/32            ident

중요 참고 사항 :-순서가 중요합니다 +1
hawkeye

23

@flaviodesousa의 답변은 효과가 있지만 모든 사용자 (다른 사람)가 암호를 입력해야합니다.

때때로 다른 사람의 피어 인증을 유지하는 것이 합리적이지만 서비스 사용자에게는 예외가됩니다. 이 경우 pg_hba.conf에 다음과 같은 행을 추가하려고합니다.

local   all             some_batch_user                         md5

주석 처리 된 헤더 행 바로 아래에이 행을 추가하는 것이 좋습니다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

다음을 사용하여 PostgreSQL을 다시 시작해야합니다.

sudo service postgresql restart

9.3을 사용하는 경우 pg_hba.conf는 다음과 같습니다.

/etc/postgresql/9.3/main/pg_hba.conf


12

내가 그것을 실행할 때 이것은 나를 위해 작동합니다 :

sudo -u username psql

시스템과 postgres에서 완전히 새로운 사용자를 생성하는 경우에만 작동합니다. hsming은 새로 작성된 postgres 사용자와 함께 postgres에 연결하려고합니다 dev.
케네스

8

가장 쉬운 해결책 :

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;

6

나는 단순히 추가했다 -h localhost


내 문제는 라즈베리에서 postgres를 사용하는 것이 었습니다. ^^^ 나를 위해 일했다!! 감사합니다!
tidydee

2

제 경우에는 다른 포트를 사용하고있었습니다. 기본값은 5432입니다. 5433을 사용하고있었습니다.

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433

postgres가 여러 개 설치되어있을 때 자동으로 발생할 수 있습니다.
Galigator

1

이보고 미래의 사람들을 위해, postgres/usr/lib/postgresql/10/bin내 우분투 서버에.

.bashrc 파일의 PATH에 추가하고 마지막 에이 줄을 추가했습니다.

PATH=$PATH:/usr/lib/postgresql/10/bin

그런 다음 명령 행에서

$> source ./.bashrc

나는 bash 환경을 새로 고쳤다. 이제 postgres -D /wherever모든 디렉토리에서 사용할 수 있습니다


1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb


이 질문에 어떤 대답이 있습니까? 왜 중요한가 -U postgres? 어쨌든 모든 대시 문자 는 무엇입니까 ?
greybeard

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.