psql "password authentication failed for user" — Şifre mi Yanlış, pg_hba.conf mu?
psql password authentication failed hatasının dört nedeni: yanlış şifre, md5/SCRAM uyuşmazlığı, pg_hba.conf sırası ve yanlış cluster. Adım adım teşhis.
Operasyonel Doğrulama & Güvenilirlik Standardı
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
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:
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 durumdamd5/scrammetodu 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:
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.
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:
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:
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:
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:
env -u PGPASSWORD psql -h 127.0.0.1 -U postgres -d postgres5. 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:
hostssl uygulama_db uygulama_kullanici 10.0.0.0/8 scram-sha-256trust 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 Güvenlik Hardening CheatSheet
- •PostgreSQL Connection Refused Teşhisi
- •Test edilen sürümler: PostgreSQL 14 / 15 / 16 / 17
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
PostgreSQL too many clients already Hatası: 6 Adımda Çözüm
FATAL: sorry, too many clients already hatasının üç nedeni, nedeni ayırt eden tek sorgu ve max_connections ile PgBouncer üzerinden kalıcı çözümü.
PostgreSQL connection refused: 8 Adımda Kesin Teşhis
Connection refused, timeout ve "no pg_hba.conf entry" arasındaki fark; listen_addresses, port, firewall ve Docker port yayınlama kontrolleri.
PostgreSQL duplicate key Hatası: Sequence Kayması Düzeltme
Restore veya toplu içe aktarma sonrası "duplicate key value violates unique constraint" hatasının nedeni, tek komutla düzeltme ve tüm sequence'ları tarayan DO bloğu.