FATAL: password authentication failed for a user
FATAL: Connection to database failed: connection to server at “localhost” (::1), port 5432 failed: fe_sendauth: no password supplied
報這些錯誤的原因是,PostgreSQL修改了默認的密碼加密算法,在新版本中改成了SCRAM驗證方式。
SCRAM其實並不是PostgreSQL中的新東西,在版本10中就有了,只是在之前的版本中只是可選的設置,而不是默認設置。PostgreSQL社區多年來一直不願將其作為主要方法,因為許多客戶端/應用程序庫還沒有准備好進行 SCRAM身份驗證。
但在PostgreSQL 14中正在發生變化。隨着PostgreSQL 9.6不再支持,情況正在發生變化。現在希望所有舊的客戶端庫都得到升級,SCRAM 身份驗證正在成為主要的密碼身份驗證方法。但是,那些完全不知道的人總有一天會收到驚喜。 這篇文章的目的是讓那些尚未了解的人快速了解並解決一些常見問題。
SCRAM身份驗證
身份驗證只是安全通信的一部分。身份驗證后,中間的惡意服務器可能會接管並欺騙客戶端連接。PostgreSQL 11 引入了支持通道綁定的 SCRAM-SHA-256-PLUS。這是為了確保沒有惡意服務器充當真實服務器或進行中間人攻擊。
從PostgreSQL 13開始,客戶端可以通過通道綁定(channel binding)發起請求。
psql -U postgres -h c76pri channel_binding=prefer
or
psql -U postgres -h c76pri channel_binding=require
通道綁定(channel binding)必須要開啟SSL/TLS配置。
設置密碼加密
md5是PostgreSQL 10之前唯一可用的密碼加密選項,默認為md5。
–Upto PG 13
postgres=# set password_encryption TO ON;
SET
on也可以替換成:true、1、yes。
該語句的作用和下面的等效:
postgres=# set password_encryption TO MD5;
SET
現在我們有了多種密碼加密算法,從PostgreSQL14開始,就要指定加密算法了:
postgres=# set password_encryption TO 'scram-sha-256';
SET
postgres=# set password_encryption TO 'md5';
SET
如果再嘗試使用:on、true、yes。就會報錯了:
–-From PG 14
postgres=# set password_encryption TO 'on';
ERROR: invalid value for parameter "password_encryption": "on"
HINT: Available values: md5, scram-sha-256.
常被提出的問題
1.邏輯備份和還原是否受影響
PostgreSQL的邏輯備份和恢復不會影響SCRAM身份驗證,恢復后相同的密碼可以工作。
如果我們重命名USER,舊的MD5密碼將不再起作用,因為PostgreSQL生成MD5 的方式也使用到用戶名。
postgres=# ALTER USER jobin1 RENAME TO jobin;
NOTICE: MD5 password cleared because of role rename
ALTER ROLE
可以看到,pg_authid中的密碼哈希值會被清空,因為老的不再有效。
但是,SCRAM驗證就不會出現上面的問題:
postgres=# ALTER USER jobin RENAME TO jobin1;
ALTER ROLE