PostgreSQL password authentication failed Hatası: Neden ve Çözüm
psql "password authentication failed for user" — Şifre mi Yanlış, pg_hba.conf mu?
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
PostgreSQL Diğer Üretim Rehberleri
Aynı veritabanı motoruna ait doğrulanmış diğer içerikler.
PostgreSQL Backup'ınızı Doğrulayın: İlk Restore Tatbikatı
Backup job'unun başarılı bitmesi verinin geri dönülebildiğini kanıtlamaz. Bu runbook, izole tatbikat ortamında uçtan uca restore ve veri doğrulama adımlarını yürütür.
PostgreSQL Replication Lag: Darboğazı Adım Adım Teşhis Etme
Replica geriden geldiğinde sorun WAL üretiminde mi, ağ aktarımında mı yoksa replay darboğazında mı? Salt okunur sorgularla darboğazı adım adım tespit edin.
psql CLI Hızlı Referans
Bağlantı parametreleri, meta komutlar (\d, \l, \du), .psqlrc şablonu, COPY streaming ve anlık kilit/aktivite teşhis sorguları.