簡體   English   中英

psql:致命:用戶“postgres”的身份驗證失敗

[英]psql: FATAL: Ident authentication failed for user "postgres"

我已經在我的 Ubuntu Karmic 機器上安裝了 PostgreSQL 和 pgAdminIII。

我能夠成功使用 pgAdminIII(即連接/登錄),但是當我嘗試在命令行上使用相同的用戶名/密碼(使用 psql)登錄到服務器時,出現錯誤:

psql: FATAL:  Ident authentication failed for user "postgres"

現在有人如何解決這個問題?

以下步驟適用於在 Ubuntu 12.04 上全新安裝 postgres 9.1。 (也適用於 Ubuntu 14.04 上的 postgres 9.3.9。)

默認情況下,postgres 創建一個名為“postgres”的用戶。 我們以她的身份登錄,並給她一個密碼。

$ sudo -u postgres psql
\password
Enter password: ...
...

通過鍵入\\qctrl+d注銷psql 然后我們連接為“postgres”。 -h localhost部分很重要:它告訴psql客戶端我們希望使用 TCP 連接(配置為使用密碼驗證)而不是通過 PEER 連接(不關心密碼)進行連接。

$ psql -U postgres -h localhost

您是否在 pg_hba.conf 中設置了正確的設置?

請參閱https://ubuntu.com/server/docs/databases-postgresql如何做。

編輯文件/etc/postgresql/8.4/main/pg_hba.conf並將identpeer替換為md5trust ,具體取決於您是否希望它在您自己的計算機上詢問密碼。 然后重新加載配置文件:

/etc/init.d/postgresql reload

您收到此錯誤是因為您未通過客戶端身份驗證。 根據錯誤消息,您可能有默認的 postgres 配置,它將所有 PostgreSQL 連接的客戶端身份驗證方法設置為“IDENT”。

您絕對應該閱讀PostgreSQL 手冊中的第19.1客戶端身份驗證以更好地了解可用的身份驗證設置(對於pg_hba.conf 中的每條記錄),但這里有相關的代碼段可以幫助您解決遇到的問題(來自9.5 版手冊):

相信

無條件允許連接。 這種方法允許任何可以連接到 PostgreSQL 數據庫服務器的人以他們希望的任何 PostgreSQL 用戶身份登錄,而無需密碼或任何其他身份驗證。 有關詳細信息,請參閱第 19.3.1 節。

拒絕

無條件拒絕連接。 這對於從組中“過濾掉”某些主機很有用,例如拒絕行可以阻止特定主機連接,而后面的行允許特定網絡中的其余主機連接。

MD5

要求客戶端提供雙重 MD5 哈希密碼進行身份驗證。 有關詳細信息,請參閱第 19.3.2 節。

密碼

要求客戶端提供未加密的密碼進行身份驗證。 由於密碼是通過網絡以明文形式發送的,因此不應在不受信任的網絡上使用。 有關詳細信息,請參閱第 19.3.2 節。

總站

使用 GSSAPI 對用戶進行身份驗證。 這僅適用於 TCP/IP 連接。 有關詳細信息,請參閱第 19.3.3 節。

sspi

使用 SSPI 對用戶進行身份驗證。 這僅在 Windows 上可用。 有關詳細信息,請參閱第 19.3.4 節。

身份

通過聯系客戶端上的身份服務器獲取客戶端的操作系統用戶名,並檢查它是否與請求的數據庫用戶名匹配。 身份驗證只能用於 TCP/IP 連接。 當為本地連接指定時,將使用對等身份驗證。 有關詳細信息,請參閱第 19.3.5 節。

同行

從操作系統獲取客戶端的操作系統用戶名,並檢查是否與請求的數據庫用戶名匹配。 這僅適用於本地連接。 有關詳細信息,請參閱第 19.3.6 節。

LDAP

使用 LDAP 服務器進行身份驗證。 有關詳細信息,請參閱第 19.3.7 節。

半徑

使用 RADIUS 服務器進行身份驗證。 有關詳細信息,請參閱第 19.3.8 節。

證書

使用 SSL 客戶端證書進行身份驗證。 有關詳細信息,請參閱第 19.3.9 節。

帕姆

使用操作系統提供的可插入身份驗證模塊 (PAM) 服務進行身份驗證。 有關詳細信息,請參閱第 19.3.10 節。

所以......要解決您遇到的問題,您可以執行以下操作之一:

  1. pg_hba.conf文件中定義的身份驗證方法更改為trustmd5password (取決於您的安全性和簡單性需求),用於您在其中定義的本地連接記錄。

  2. 更新pg_ident.conf以將您的操作系統用戶映射到 PostgreSQL 用戶,並根據您的需要授予他們相應的訪問權限。

  3. 保留 IDENT 設置並在您的數據庫中為您要授予訪問權限的每個操作系統用戶創建用戶。 如果用戶已經通過操作系統的身份驗證並登錄,PostgreSQL 將不需要進一步的身份驗證,並且將根據數據庫中分配給該用戶的任何權限(角色)授予對該用戶的訪問權限。 這是默認配置。

注意: pg_hba.confpg_ident.conf的位置取決於操作系統。

只需添加-h localhost位即可工作

如果以上都不適合您:

我已經安裝了很多 Postgres,但今天在 RedHat 6.5 系統(安裝 Postgres 9.3)上感到困惑。 Aron 上面顯示的我的典型 hba.conf 配置不起作用。 原來我的系統使用的是 IPV6,而忽略了 IPV4 配置。 添加行:

host    all             all             ::1/128                 password

讓我登錄成功。

您可以設置環境變量PGHOST=localhost

$ psql -U db_user db_name
psql: FATAL:  Peer authentication failed for user "db_user"

$ export PGHOST=localhost
$ psql -U db_user db_name

Password for user mfonline:

在上面的所有答案中,沒有什么對我有用。 我不得不手動更改數據庫中的用戶密碼,它突然起作用了。

psql -U postgres -d postgres -c "alter user produser with password 'produser';"

我使用了以下設置:

pg_hba.conf

local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            password  
# IPv6 local connections:
host    all             all             ::1/128                 password

最后通過以下命令連接成功:

psql -U produser -d dbname -h localhost -W 

就我而言,這里的解決方案:(對於相關人員)登錄到 postgres:

sudo -i -u postgres
psql
ALTER USER postgres WITH PASSWORD 'postgres'; # type your password here

問候

嗯...

如果您可以使用 pgAdminIII 中的用戶名和密碼連接,但無法使用psql連接,那么這兩個程序可能以不同的方式連接到數據庫。

[如果您要連接到不同的數據庫,請先嘗試連接到同一個數據庫。 見下文。]

來自PostgreSQL:文檔:9.3:psql

如果省略主機名,psql 將通過 Unix 域套接字連接到本地主機上的服務器,或通過 TCP/IP 連接到沒有 Unix 域套接字的機器上的 localhost。

如果您沒有運行類似psql ... -h host_name ...東西,並且您運行的是 Ubuntu,則psql應該通過 Unix 域套接字進行連接,因此 PostgreSQL 可能未配置為允許使用密碼之一postgres用戶的身份驗證方法。

您可以通過運行來測試:

sudo -u postgres psql

如果上述方法有效,則您的服務器可能配置為postgres用戶的本地連接使用對等身份驗證,即向操作系統詢問您的用戶名以確認您是postgres

所以它可能是你的pg_hba.conf文件

文件的完整路徑類似於/etc/postgresql/9.3/main/pg_hba.conf 您可以通過例如sudo cat /etc/postgresql/9.3/main/pg_hba.conf | more查看它sudo cat /etc/postgresql/9.3/main/pg_hba.conf | more sudo cat /etc/postgresql/9.3/main/pg_hba.conf | more

如果您在psql命令中省略了主機名,那么如果您將以下條目添加到pg_hba.conf文件中,您應該能夠連接:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  md5

[ pg_hba.conf文件中的注釋行以#開頭。]

如果您在psql命令包含主機名,請改為添加以下條目:

# Connection type   Database   User       IP addresses   Method
host                all        postgres   127.0.0.1/32   md5

您需要在通過psql為您的連接匹配任何其他條目之前放置該條目。 如果不確定將它放在哪里,只需將它放在第一個未注釋的行之前。

更多關於pg_hba.conf

來自PostgreSQL:文檔:9.3:pg_hba.conf 文件[粗體強調我的]:

具有匹配連接類型客戶端地址請求的數據庫用戶名的第一條記錄用於執行身份驗證。 沒有“失敗”或“備份”:如果選擇了一條記錄並且身份驗證失敗,則不考慮后續記錄。 如果沒有記錄匹配,則拒絕訪問。

請注意,記錄與身份驗證方法匹配。 因此,如果您的pg_hba.conf文件包含以下條目:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  peer

那么您將無法通過以下方式連接:

psql -u postgres

除非這些條目之一在前一個條目上方pg_hba.conf文件中:

# Connection type   Database   User       IP addresses   Method
local               all        postgres                  md5
local               all        postgres                  password   # Unencrypted!
local               all        all                       md5
local               all        all                       password   # Unencrypted!

對於 fedora26 和 postgres9.6

首先以root用戶登錄,然后通過以下命令進入psql

$ su postgres  

然后

$ psql

psql找到 hba_file ==> 的位置意味着pg_hba.conf

postgres=# show hba_file ; 
 hba_file  
--------------------------------------   
 /etc/postgresql/9.6/main/pg_hba.conf  
(1 row)  

在文件pg_hba.conf更改用戶對此的訪問權限

host all all 127.0.0.1/32 md5

我發現我必須安裝一個身份服務器,它偵聽端口 113。

sudo apt-get install pidentd
sudo service postgresql restart

然后 ident 起作用了。

問題仍然是你的 pg_hba.conf 文件。 這一行:你可以在 /etc/postgres/varion/main 中找到這個文件

local   all             postgres                                peer
Should be

local   all             postgres                                md5

這些是根據有關身份驗證方法的官方 PostgreSQL 文檔對這兩個選項的簡要說明。

對等認證

對等身份驗證方法的工作原理是從內核獲取客戶端的操作系統用戶名並將其用作允許的數據庫用戶名(具有可選的用戶名映射)。 此方法僅在本地連接上受支持。

密碼認證

基於密碼的身份驗證方法是 md5 和密碼。 除了通過連接發送密碼的方式(分別是 MD5 散列和明文)之外,這些方法的操作類似。

如果您完全擔心密碼“嗅探”攻擊,則首選 md5。 如果可能,應始終避免使用普通密碼。 但是,md5 不能與 db_user_namespace 功能一起使用。 如果連接受 SSL 加密保護,則可以安全地使用密碼(但如果依賴於使用 SSL,則 SSL 證書身份驗證可能是更好的選擇)。

更改此文件后,不要忘記重新啟動 PostgreSQL 服務器。 如果您使用的是 Linux,那就是sudo service postgresql restart.

我在 bash shell 中 Mac OSX 上的 PostgreSQL 9.3 上的解決方案是使用sudo進入數據文件夾,然后將必要的行附加到pg_hba.conf文件,以允許所有用戶受信任並能夠登錄。這是我所做的:

# in bash_profile edit PGDATA environmental variable
open ~/.bash_profile

# append this line to bash_profile
export PGDATA="/Library/PostgreSQL/9.3/data"

# reload bash_profile
source ~/.bash_profile

# open pg_hba.conf in vim
sudo vi /Library/PostgreSQL/9.3/data/pg_hba.conf

# append these two lines to the end of the pg_hba.conf file
local   all   all                  trust
host    all   all   127.0.0.1/32   trust

# can now login as user in bash
psql -d <db_name> -U <user_name> -W

如果您已完成所有這些操作,但仍然無效,請檢查該用戶的到期時間:

Postgres 密碼認證失敗

我花了更多的時間來解決這個我願意承認的錯誤。

我認為 pg_hba.conf 中的身份驗證配置順序與您的情況相關。 默認配置文件在 vanilla 安裝中包含幾行。 這些默認值可以匹配導致身份驗證失敗的身份驗證嘗試的條件。 無論在 .conf 文件末尾添加其他配置,它都會失敗。

要檢查使用了哪一行配置,請確保查看消息的默認日志文件。 你可能會看到這樣的東西

LOG:  could not connect to Ident server at address "127.0.0.1", port 113: Connection refused
FATAL:  Ident authentication failed for user "acme" 
DETAIL:  Connection matched pg_hba.conf line 82: "host     all             all             127.0.0.1/32            ident"

事實證明,這條默認行導致了拒絕。

host    all             all             127.0.0.1/32            ident

嘗試將其注釋掉。

解決這個問題的一個技巧是編輯 pg_hba.conf

sudo vi /etc/postgresql/9.3/main/pg_hba.conf

暫時

# Database administrative login by Unix domain socket
local   all             postgres                                   trust

在這一點上你就完成了。 為了安全起見,然后去

sudo -u postgres psql template1
ALTER USER postgres with encrypted password 'your_password';

然后返回並將 pg_hba.conf 設置回

# Database administrative login by Unix domain socket
local   all             postgres                                   md5

我有類似的問題,我在pg_hba.conf 中修復了它,甚至在刪除所有ident方法時,即使是 IP6 地址(盡管我的機器上只有 IP4)。

host all all 127.0.0.1/32 password
host all all ::1/128 password
#for pgAdmin running at local network
host all all 192.168.0.0/24 md5

如果你在 CentOS 上使用它,你可能需要在完成上述解決方案后重新加載 postgres:

systemctl restart postgresql-9.3.service

在遵循此之后,我遇到了同樣的問題: PostgreSQL setup for Rails development in Ubuntu 12.04

我嘗試了其他答案,但我所要做的就是: “config/database.yml”

development:
  adapter: postgresql
  encoding: unicode
  database: (appname)_development
  pool: 5
  username: (username you granted appname database priviledges to)
  password:

我不得不重新安裝 pdAdmin 來解決這個問題

brew cask reinstall pgadmin4

對於 Windows,如果您不想編輯 pb_gba.conf,即將該方法保留為 MD5(默認),通過在 PGadmin 的查詢工具中運行此查詢來創建一個新用戶管理員

CREATE USER admin WITH PASSWORD 'secret'

然后在cmd

psql "dbname=Main_db host=127.0.0.1 user=admin password=secret port=5432

其中 dbname 是您在 postgresql 中的數據庫

在此處輸入圖片說明

它與PostgreSQL安裝的配置問題有關:

在下面提到的 conf 文件中配置 # TYPE DATABASE USER ADDRESS METHOD 部分

查找和編輯 /var/lib/pgsql/10/data/pg_hba.conf 或根據您的文件位置更新方法(md5)。 如果您的配置不存在,請通過如下比較更新文件中的條目:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     trust
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             0.0.0.0/0            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

在下面提到的 conf 文件中配置 CONNECTIONS 和 AUTHENTICATION 部分

查找和編輯 /var/lib/pgsql/10/data/postgresql.conf 或根據您的文件位置更新監聽地址和端口

listen_addresses = '*' // # what IP address(es) to listen on;
                                    # comma-separated list of addresses;
                                    # defaults to 'localhost'; use '*' for all
port = 5432 // Set port as 5432

重啟你的 PostgreSQL:

sudo systemctl restart postgresql-10 # Update service name based on your installation

我通過 GCP SQL 中的 terraform 提供了用戶名和密碼,問題是密碼沒有通過 terraform 正確設置,所以雖然不是正確的修復,但只是為了找出確切原因。

我從 GCP 控制台更改了用戶的密碼,並且奏效了。

這對我有用http : //tecadmin.net/fatal-ident-authentication-failed-for-user-postgres/#

local   all             postgres                                trust
local   all             myapp_usr                               trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
#host    all             all             ::1/128                 trust

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM