dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/PostgreSQL/Hata Kodları (Errors)/postgresql-password-authentication-failed
[Teşhis]PostgreSQL PG 14 - 17Intermediate
4 dk okuma

PostgreSQL password authentication failed Hatası: Neden ve Çözüm

psql "password authentication failed for user" — Şifre mi Yanlış, pg_hba.conf mu?

Yazar / Standart:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
FATAL: password authentication failed for user
İlk 60 Saniye Teşhis Protokolü:

Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.

▸Belirti

plaintext
psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: password authentication failed for user "postgres"

Bu mesaj son derece yanıltıcıdır: şifrenin yanlış olduğu anlamına gelmez. PostgreSQL, kimlik doğrulama katmanında neyin başarısız olduğunu kasten açıklamaz (kullanıcı numaralandırmasını engellemek için). Dört farklı neden aynı metni üretir.


▸Nedeni ayırt eden sorgu

Şifrenin nasıl saklandığına bakın — bu tek kontrol, vakaların yarısını çözer:

sql
SELECT rolname, left(rolpassword, 14) AS saklama_bicimi FROM pg_authid WHERE rolname IN ('postgres', 'uygulama_kullanici');
  • •SCRAM-SHA-256$... → SCRAM ile saklanmış
  • •md5... → eski MD5 formatı
  • •NULL → kullanıcının hiç şifresi yok (bu durumda md5/scram metodu her zaman başarısız olur)

Ardından hangi satırın eşleştiğini kontrol edin. pg_hba.conf'ta ilk eşleşen satır kazanır, sonrakiler okunmaz:

sql
SELECT type, database, user_name, address, auth_method FROM pg_hba_file_rules ORDER BY rule_number;

▸Adım adım çözüm

1. Şifrelenme yöntemini kontrol edin.

sql
SHOW password_encryption;

PostgreSQL 14'ten itibaren varsayılan scram-sha-256. Eğer pg_hba.conf scram-sha-256 istiyor ama kullanıcının şifresi md5 formatında saklanmışsa, doğrulama her zaman başarısız olur — şifre doğru olsa bile.

2. Şifreyi yeniden yazın (doğru yöntemle). Süper kullanıcı olarak:

sql
SET password_encryption = 'scram-sha-256'; ALTER USER postgres WITH PASSWORD 'yeni-guclu-sifre';

ALTER USER sonrası pg_reload_conf() gerekmez; şifre anında geçerlidir. pg_hba.conf değişikliği için gerekir:

sql
SELECT pg_reload_conf();

3. Bağlanan istemcinin gerçekten hangi sunucuya gittiğini doğrulayın. Vakaların küçümsenmeyecek bir kısmı şudur: makinede iki PostgreSQL kurulu (ör. 14 ve 16), psql birine, uygulama diğerine bağlanıyor. Kontrol:

bash
pg_isready -h 127.0.0.1 -p 5432 psql -h 127.0.0.1 -p 5432 -U postgres -c "SELECT version(), inet_server_port();"

4. İstemci tarafındaki kalıntıları temizleyin. ~/.pgpass, PGPASSWORD ortam değişkeni veya eski bir ~/.pg_service.conf girdisi, elinizle yazdığınız şifreyi sessizce eziyor olabilir. Test ederken bunları geçici olarak devre dışı bırakın:

bash
env -u PGPASSWORD psql -h 127.0.0.1 -U postgres -d postgres

5. Uzak bağlantıda `pg_hba.conf` satırını ekleyin. Varsayılan kurulumda yalnızca 127.0.0.1/32 ve ::1/128 için satır vardır. Uzak istemci için eklenmesi gereken satır:

plaintext
hostssl uygulama_db uygulama_kullanici 10.0.0.0/8 scram-sha-256
[!CAUTION] trust yazarak "sorunu çözmek", bu hatanın en tehlikeli yanlış cevabıdır: kimlik doğrulamayı tamamen kapatır ve genellikle üretimde unutulur.

▸Bunu bir daha yaşamamak için

pg_hba.conf'u bir yapılandırma yönetimi aracıyla (Ansible, Terraform) yönetin ve her değişiklikte pg_hba_file_rules görünümünü okuyup etkin kuralları doğrulayın. Dosyada doğru satırın olması, onun ilk eşleşen satır olduğu anlamına gelmez.


▸İlgili Mühendislik Rehberleri ve İç Linkler

PostgreSQL Diğer Üretim Rehberleri

Aynı veritabanı motoruna ait doğrulanmış diğer içerikler.

Tümünü Gör