오류 가져 오기 : pgsql을 레일로 작업하려고 할 때 사용자 "postgres"에 대한 피어 인증에 실패했습니다.


737

오류가 발생했습니다.

FATAL: Peer authentication failed for user "postgres"

postgres를 Rails와 함께 사용하려고 할 때.

여기에 내 pg_hba.conf, 내 database.yml전체 추적 덤프가 있습니다 .

pg_hba에서 인증을 md5로 변경하고 다른 것을 시도했지만 아무것도 작동하지 않는 것 같습니다.

또한 Rails 3.2에 따라 새 사용자 및 데이터베이스를 만들려고 시도 했습니다. 치명적 : 사용자에 대한 피어 인증에 실패했습니다 (PG :: Error).

그러나 그들은 pgadmin 또는 심지어 내가 실행할 때 나타나지 않습니다 sudo -u postgres psql -l.

내가 잘못 가고있는 아이디어가 있습니까?


1
1) 당신이 "포스트 그레스"생성하고 데이터베이스를 마우스 오른쪽 가진라는 이름의 사용자가 있는지 확인 ) 2 : 확실히 그는 암호이 있는지 확인 3) : 확인 확실히 당신의 설정은 / database.yml을가 권리 자격 증명 (사용자 이름 + 비밀번호)를 포함를
MrYoshiji

2
필요에 Everyplace를 피어 및 들여 쓰기 설정 MD5에
Artem.Borysov

13
참조 이 대답을 - 연결에 실패 할 수 localhost있지만에 성공 127.0.0.1.
uvsmtid

9
내 경우 host: localhost에는 database.yml파일 을 추가해야 했습니다 .
Mihail Velikov

답변:


1027

문제는 여전히 pg_hba.conf파일입니다 ( /etc/postgresql/9.1/main/pg_hba.conf*).

이 줄 :

local   all             postgres                                peer

해야한다:

local   all             postgres                                md5

*이 파일을 찾을 수없는 경우 파일을 실행 locate pg_hba.conf하면 파일의 위치가 표시됩니다.

이 파일을 변경 한 후에는 PostgreSQL 서버를 다시 시작해야합니다. 리눅스를 사용한다면 sudo service postgresql restart.

이것은 인증 방법에 관한 공식 PostgreSQL 문서에 따른 두 옵션에 대한 간단한 설명입니다 .

피어 인증

피어 인증 방법은 커널에서 클라이언트의 운영 체제 사용자 이름을 가져 와서 허용되는 데이터베이스 사용자 이름으로 사용합니다 (선택적인 사용자 이름 매핑 사용). 이 방법은 로컬 연결에서만 지원됩니다.

비밀번호 인증

비밀번호 기반 인증 방법은 md5 및 비밀번호입니다. 이러한 방법은 암호가 연결을 통해 전송되는 방식, 즉 각각 MD5 해시 및 일반 텍스트를 제외하고 비슷하게 작동합니다.

비밀번호 "스니핑"공격에 관심이있는 경우 md5가 선호됩니다. 가능하면 일반 암호는 항상 피해야합니다. 그러나 md5는 db_user_namespace 기능과 함께 사용할 수 없습니다. 연결이 SSL 암호화로 보호되는 경우 비밀번호를 안전하게 사용할 수 있습니다 (SSL 사용에 의존하는 경우 SSL 인증서 인증이 더 나은 선택 일 수 있음).

의 샘플 위치 pg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
이 변경 한 후 PostgreSQL의 서비스를 다시로드해야합니다/etc/init.d/postgresql reload
funkotron

78
이 파일의 위치를 ​​항상 잊었 /etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron 적어도 ElementaryOS (Ubuntu) 설치 sudo service postgreql restart에서도 작동합니다.
Marnen Laibow-Koser

13
내 자신의 질문에 대답하기 위해 : '피어'인증은 postgres가 운영 체제에 로그인 이름을 요청하고이를 인증에 사용한다는 것을 의미하므로 OS 및 postgres의 사용자는 동일해야합니다. 'md5'는 암호화 된 비밀번호 인증을 사용합니다.
Dennis

9
나는 변화를 이해한다. 그러나 이것이 기본 행동이 아닌 이유는 무엇입니까? md5를 사용하는 데 단점이 있습니까?
Victor Marconi 2016 년

361

Postgresql을 설치 한 후 아래 단계를 수행했습니다.

  1. pg_hba.conf우분투 파일 을 열고 /etc/postgresql/9.x/main다음 줄을 변경하십시오.

    로컬 모든 postgres 피어

    현지 모든 postgres 신뢰
  2. 서버를 다시 시작하십시오

    $ sudo service postgresql restart
  3. psql에 로그인하고 비밀번호를 설정하십시오

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. 마지막으로 변경 pg_hba.conf에서을

    현지 모든 postgres 신뢰

    로컬 모든 postgres md5

postgresql 서버를 다시 시작한 후 자신의 암호로 액세스 할 수 있습니다

인증 방법 세부 사항 :

신뢰-서버에 연결할 수있는 사람은 데이터베이스에 액세스 할 수있는 권한이 있습니다

peer-클라이언트의 운영 체제 사용자 이름을 데이터베이스 사용자 이름으로 사용하여 액세스하십시오.

md5-비밀번호 기반 인증

자세한 참조 확인은 여기


17
방법을 "신뢰"로 변경하면 나를 위해 일했습니다. 인증 방법 세부 정보에 대한 설명은 +1입니다.
La-comadreja

4
OS X homebrew에서 기본값은 신뢰이며, Ubuntu에서는 기본값이 "peer"로 설정되어 내 설정과 동료의 설정이 일치하지 않습니다. 우리는 그를 도와주지 않은 MD5로 바 꾸었으므로 "신뢰"는 실제 대답입니다 (우리는 개발 테스트 만하고 있습니다). 더 많은 투표를해야합니다.
xji

2
당신은 또한 처음부터 모든 곳에서 md5를 설정할 수 있습니다
Artem.Borysov

2
이 방법은 md5 방법을 사용하여 처음에는 작동하지 않았습니다.
sianipard

동일한 비밀번호를 사용해야합니까? sudo passwd postgres
피터 크라우스

211

로컬 호스트 (127.0.0.1)를 통해 연결하면 특정 문제가 발생하지 않아야합니다. pg_hba.conf를 많이 사용하지는 않지만 연결 문자열을 조정합니다.

psql -U someuser -h 127.0.0.1 database

여기서 someuser는 연결하려는 사용자이고 database는 사용자가 연결할 권한이있는 데이터베이스입니다.

postgres를 설정하기 위해 데비안에서 수행하는 작업은 다음과 같습니다.

http://www.postgresql.org/download/linux/debian/  (Wheezy 7.x)

as root 

    root@www0:~# echo "deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main" >> /etc/apt/sources.list

    root@www0:~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

    root@www0:~# apt-get update

    root@www0:~# apt-get install postgresql-9.4        

    root@www0:~# su - postgres 

    postgres@www0:~$ createuser --interactive -P someuser
    Enter password for new role:
    Enter it again:
    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) n

    postgres@www0:~$ createdb -O someuser database

    postgres@www0:~$ psql -U someuser -h 127.0.0.1 database

즐겨!


16
다른 답변에서 권장하는 것처럼 전역 구성을 망칠 필요없이 실제로 로컬 문제를 해결하기 때문에 이것이 최선의 해결책이라고 생각합니다.
jeteon

1
host: 127.0.0.1config / database.yml에서 기본값을 localhost 로 변경 해야했습니다. 같은 컴퓨터에 있기 때문에 이유를 이해할 수 없습니다.
Anthony

Anthony, database.yml에서 localhost를 127.0.0.1로 조정할 때까지 연결이 실패했다고하십니까? 그렇다면 / etc / hosts 파일을 확인하는 것이 좋습니다. 그렇지 않으면, localhost 해결과 관련된 다른 이상한 점이있을 수 있습니다.
StylusEater

1
로컬 피어 인증 방법을 사용하는 것과 비교할 때 훨씬 더 우아합니다.
mdh

1
이것은 최고의 솔루션 IMO입니다
Salil Junior

45

이것은 나를 위해 일했다!

sudo -u postgres psql

현재 로그인 한 사용자가 sudoers 파일에있는 한 제대로 작동합니다.
Abubacker Siddik

16

문제가 있으면을 찾아야합니다 pg_hba.conf. 명령은 다음과 같습니다.

find / -name 'pg_hba.conf' 2>/dev/null

그 후 구성 파일을 변경하십시오.

PostgreSQL 9.3

PostgreSQL 9.3

PostgreSQL 9.4

PostgreSQL 9.3

다음 단계는 DB 인스턴스 재시작입니다.

service postgresql-9.3 restart

문제가 있으면 비밀번호를 다시 설정해야합니다.

ALTER USER db_user with password 'db_password';


16
  1. 이 이동 /etc/postgresql/9.x/main/ 열려 있는 pg_hba.conf의 파일

나의 경우에는:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. 피어md5로 교체

따라서 다음과 같이 변경됩니다.

Unix 도메인 소켓 로컬 모든 postgres 피어에 의한 데이터베이스 관리 로그인

# 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

이:

유닉스 도메인 소켓 로컬 모든 postgres MD5에 의한 데이터베이스 관리 로그인

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
  1. 그런 다음 pg 서버를 다시 시작하십시오.

    $> sudo 서비스 postgresql 재시작

다음은 postgres와 연결하는 데 사용되는 방법 목록입니다.

# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert".  Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.

참고 : 아직 postgres 사용자를 작성하지 않은 경우. 이를 생성하면 해당 사용자 자격 증명을 사용하여 postgres 서버에 액세스 할 수 있습니다.

힌트 : postgres를 다시 시작한 후에도 작동하지 않으면 터미널을 닫고 다시여십시오.


15
sudo psql --host=localhost --dbname=database-name --username=postgres

이것은 내 문제를 해결했다


3
나는 그것이 그렇게 간단하다고 생각하지는 않았지만, 이것은 데비안 9에서 나에게
효과적이었다

이것은 Ubuntu 19.10
Vithal Reddy

감사합니다. Ubuntu 19.10 및 psql 12.3
Happy Singh

10

나는 같은 문제가 있었다.

depa의 솔루션은 절대적으로 정확합니다.

PostgreSQL을 사용하도록 사용자를 구성했는지 확인하십시오.

파일을 확인하십시오.

$ ls /etc/postgresql/9.1/main/pg_hba.conf -l

이 파일의 권한은 psql을 등록한 사용자에게 제공되어야합니다.

더욱이. 지금까지는 좋다면 ..

@depa의 지침에 따라 업데이트하십시오.

$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf

그런 다음 변경하십시오.


나는 같은 문제에 직면하고있다. 그러나 어떤 권한이 필요한지 모르겠습니다. 도와주세요. 'ls'명령의 출력은 다음과 같습니다.-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Sun

8

기본 설정을 유지하고 하나의 특정 사용자 / DB 연결에 대해 소켓 연결을 사용하여 md5 인증을 원하면 "local all / all"행 전에 "local"행을 추가하십시오.

# TYPE  DATABASE     USER         ADDRESS             METHOD

# "local" is for Unix domain socket connections only
local   username     dbname                           md5  # <-- this line
local   all          all                              peer
# IPv4 local connections:
host    all          all          127.0.0.1/32        ident
# IPv6 local connections:
host    all          all          ::1/128             ident

이 답변의 "BEFORE"는 다른 답변에서 더 정교 해져야합니다. psql은 문서에 명시된대로 pg_hba.conf 파일의 레코드를 순차적으로 검사합니다. postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

# TYPE DATABASE USER ADDRESS METHOD 로컬 사용자 이름 dbname md5 # <-이 줄은 순서가 없습니다
Kiry Meas

7

복제 된 서버에서 데이터 디렉토리를 이동하고 postgres로 로그인하는 데 문제가있었습니다. 이와 같이 postgres 비밀번호를 재설정하면 나에게 도움이되었습니다.

root# su postgres
postgres$ psql -U postgres
psql (9.3.6) 
Type "help" for help. 
postgres=#\password 
Enter new password: 
Enter it again: 
postgres=#

6

위의 편집 내용은 postgres 서버를 만든 후 다시 시작해야한다는 것을 알았을 때 효과적이었습니다. 우분투의 경우 :

sudo /etc/init.d/postgresql restart

6

pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | line 85) 를 신뢰 하도록 METHOD 피어 를 변경 하면 문제가 해결됩니다. md5를 추가하면 비밀번호를 요청하므로 비밀번호 사용을 피해야하는 경우 md5 대신 trust 를 사용하십시오 .


6

host=localhost연결하여 사용하십시오 .

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);

5

아래 명령은 저에게 효과적입니다.

psql -d myDb -U username -W

남자 psql-W --password Force psql to prompt for a password before connecting to a database. This option is never essential, since psql will automatically prompt for a password if the server demands password authentication. However, psql will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.
Yaroslav Nikitenko

3

신뢰하도록 METHOD를 설정하면됩니다.

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

그리고 postgres 서버를 다시로드하십시오.

# service postgresql-9.5 reload

pg_hba.conf의 변경에는 postgres 서버를 다시 시작할 필요가 없습니다. 그냥 다시로드하십시오.


3

다른 많은 답변은 다양한 구성 파일의 설정과 관련이 있으며 그에 관련된 답변은 pg_hba.conf적용되며 100 % 정확합니다. 그러나 올바른 구성 파일을 수정하고 있는지 확인하십시오 .

다른 사람들이 언급했듯이 구성 파일 위치는 기본 구성 파일 내부의 다양한 설정으로 재정의 될 수 있으며 -D옵션 을 사용하여 명령 줄에서 기본 구성 파일의 경로를 제공 할 수 있습니다.

psql 세션에서 다음 명령을 사용하여 구성 파일을 읽는 위치를 표시 할 수 있습니다 (psql을 시작할 수 있다고 가정). 이것은 일부 사람들을 도울 수있는 문제 해결 단계 일뿐입니다.

select * from pg_settings where setting~'pgsql';  

또한 postgres 사용자의 홈 디렉토리가 원하는 위치에 있는지 확인해야합니다. 프롬프트가 ~홈 디렉토리의 실제 경로 대신 ' '를 표시 하여 그렇게 명확하지 않기 때문에 이것을 간과하기가 쉽기 때문에 이것을 말합니다 . 많은 설치에서 postgres 사용자 홈 디렉토리는 기본적으로로 설정됩니다 /var/lib/pgsql.

예상대로 설정되지 않은 경우 postgresql 서비스를 중지하고 루트로 로그인 한 상태에서 다음 명령을 사용하십시오. 또한 postgres 사용자가 다른 세션에 로그인하지 않았는지 확인하십시오.

usermod -d /path/pgsql postgres

마지막으로을 입력하여 PGDATA 변수가 올바르게 설정되어 있는지 확인하십시오 echo $PGDATA.

/path/pgsql/data

설정되어 있지 않거나 예상과 다른 것이 표시되면 .profile 또는 .bash.rc와 같은 시작 또는 RC 파일을 검사하십시오. 이는 OS와 셸에 따라 크게 다릅니다. 컴퓨터의 올바른 시작 스크립트를 결정하면 다음을 삽입 할 수 있습니다.

export PGDATA=/path/pgsql/data

내 시스템의 경우 /etc/profile.d/profile.local.sh모든 사용자가 액세스 할 수 있도록 이것을 배치했습니다 .

이제 평소와 같이 데이터베이스를 초기화 할 수 있으며 모든 psql 경로 설정이 정확해야합니다!


3

pg_config는 확장 정보 및 클라이언트 프로그램이 PostgreSQL을 컴파일하고 링크하는 데 도움이되는 칭찬 정보입니다. 머신의 활성 PostgreSQL 인스턴스에 대해서는 아무것도 모르지만 바이너리 만 알 수 있습니다.

pg_hba.conf는 Pg 설치 방법에 따라 다른 여러 곳에 나타날 수 있습니다. 표준 위치는 데이터베이스의 data_directory에있는 pg_hba.conf입니다 (/ home, / var / lib / pgsql, / var / lib / postgresql / [version] /, / opt / postgres / 등에있을 수 있음). 그러나 사용자와 패키지 관리자는 원하는 곳에 배치 할 수 있습니다. 운수 나쁘게.

pg_hba.conf를 찾는 유일한 유효한 방법은 pg_hba.conf가있는 실행중인 PostgreSQL 인스턴스를 요청하거나 sysadmin이 어디에 있는지 묻는 것입니다. ing 스크립트가 Pg를 시작할 때 -c hba_file = / some / other / path와 같은 매개 변수를 전달할 수 있기 때문에 datadir의 위치를 ​​묻고 postgresql.conf를 구문 분석하는 것에 의존 할 수도 없습니다.

당신이하고 싶은 것은 PostgreSQL에게 묻는 것입니다 :

SHOW hba_file;

이 명령은 수퍼 유저 세션에서 실행해야하므로 쉘 스크립팅의 경우 다음과 같이 작성할 수 있습니다.

psql -t -P format=unaligned -c 'show hba_file';

환경 변수 PGUSER, PGDATABASE 등을 설정하여 연결이 올바른지 확인하십시오.

그렇습니다. 이것은 사용자가 연결할 수 없다면 (예를 들어 pg_hba.conf 편집을 망친 후) pg_hba.conf를 찾을 수 없다는 점에서 다소 까다로운 문제입니다.

또 다른 옵션은 ps 명령의 출력을보고 포스트 마스터 데이터 디렉토리 인수 -D가 표시되는지 확인하는 것입니다. 예 :

ps aux  | grep 'postgres *-D'

pg_hba.conf는 데이터 디렉토리 안에 있기 때문에 (데비안 / 우분투 나 다른 파생물을 사용하지 않고 패키지를 사용하지 않는 한).

Debian / Ubuntu 패키지에서 PostgreSQL이 설치된 Ubuntu 시스템을 대상으로하는 경우 좀 더 쉬워집니다. 누군가가 initdb가 홈 디렉토리에 datadir을 입력했거나 EnterpriseDB Pg를 / opt 등에 설치 한 소스 컴파일 Pg를 처리 할 필요가 없습니다. pg_wrapper, Debian / Ubuntu multi를 요청할 수 있습니다 -version Pg manager. 여기서 PostgreSQL은 pg_wrapper의 pg_lsclusters 명령을 사용합니다.

연결할 수 없으면 (Pg이 실행 중이 아니거나 연결하기 위해 pg_hba.conf를 편집해야 함) 시스템에서 pg_hba.conf 파일을 검색해야합니다. Mac 및 Linux에서는 sudo find / -type f -name pg_hba.conf와 같은 작업이 수행됩니다. 그런 다음 동일한 디렉토리에서 PG_VERSION 파일을 확인하여 둘 이상의 PostgreSQL 버전인지 확인하십시오. (pg_hba.conf가 / etc /에 있으면 이것을 무시하고 대신 상위 디렉토리 이름입니다). 동일한 PostgreSQL 버전의 데이터 디렉토리가 둘 이상인 경우 데이터베이스 크기를 살펴 봐야합니다. ps에서 실행중인 postgres의 명령 행을 확인하여 데이터 디렉토리 -D 인수가 편집중인 위치와 일치하는지 확인하십시오. . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

내 문제는 서버를 입력하지 않았다는 것입니다. 자리 표시 자로 인해 이것이 기본값이라고 생각했지만 localhost를 입력하면 작동했습니다.


2

Cloud 9에서이 파일을 찾으려고하면

sudo vim /var/lib/pgsql9/data/pg_hba.conf

을 눌러 I편집 / 삽입하고을 ESC3 번 누르면 :wq파일이 저장되고 종료됩니다


2

레일과 관련하여이 문제에 직면하고 있고 올바른 권한과 함께 비밀번호를 사용하여 해당 사용자 이름을 이미 작성했다는 것을 알고 있다면 database.yml 파일의 끝에 다음을 입력하면됩니다.

host: localhost

전체 파일은 아래와 같습니다

development:
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: root
  password: admin
  host: localhost

당신은 전혀 pg_hba.conf파일 을 만질 필요가 없습니다 . 행복한 코딩


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