Herstellen einer Verbindung zu einer externen Datenbank mit pgAdmin III

7

Ich versuche, von pgAdmin III (das auf beiden Computern installiert ist) eine Verbindung zu einer externen Datenbank herzustellen. Der Kunde beschwert sich:

Zugriff auf Datenbank verweigert

Der Server gewährt keinen Zugriff auf die Datenbank: Der Server meldet

FATAL: no pg_hba.conf entry for host "192.168.108.161",
                                user "postgres",
                            database "postgres",
                                 SSL off 

Um auf eine Datenbank auf einem PostgreSQL-Server zuzugreifen, müssen Sie Ihrem Client zunächst den primären Zugriff auf den Server gewähren (Host Based Authentication). PostgreSQL überprüft die pg_hba.confDatei, ob ein Muster vorhanden und aktiviert ist, das Ihrer Clientadresse / Ihrem Benutzernamen / Ihrer Datenbank entspricht, bevor SQL GRANTZugriffssteuerungslisten ausgewertet werden.

Die anfänglichen Einstellungen in pg_hba.conf sind recht restriktiv, um unerwünschte Sicherheitslücken zu vermeiden, die durch nicht überprüfte, aber obligatorische Systemeinstellungen verursacht werden. Sie werden wahrscheinlich so etwas hinzufügen wollen

host all all 192.168.0.0/24 md5 

In diesem Beispiel wird allen Benutzern im privaten Netzwerk der MD5-verschlüsselte Kennwortzugriff auf alle Datenbanken gewährt 192.168.0.0/24. Sie können den pg_hba.confin pgAdmin III integrierten Editor verwenden, um die pg_hba.confKonfigurationsdatei zu bearbeiten .

Nach dem Ändern pg_hba.confmüssen Sie ein erneutes Laden pg_ctlder Serverkonfiguration auslösen, indem Sie den Serverprozess stoppen oder neu starten.

Wobei der Server ausdrücklich angibt, dass alle Verbindungen aus dem internen Netzwerk akzeptiert werden.

pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     md5
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
host    all             all             192.168.0.0/24          md5

Ich habe den Postmaster bereits neu gestartet, damit die Änderungen wirksam werden, und bin so weit gegangen, den gesamten Computer neu zu starten. Was könnte hier noch schief gehen?

Sean Allred
quelle

Antworten:

7

Diese Linie:

 host all all 192.168.0.0/24 md5

wird durch Verbindungen von IPs Anpassung lassen , 192.168.0.Xwo Xjeder Byte ist.

Die IP-Adresse Ihrer Fehlermeldung 192.168.108.161stimmt nicht mit diesem Muster überein, da dies nicht der Fall 108ist 0.

Um Adressen wie zu aktivieren 192.168.X.Y, benötigen Sie eine /16anstatt zu /24bedeuten, dass nur die ersten 16 Bits fest sind.

So was:

 host all all 192.168.0.0/16 md5

Vergessen Sie nicht, Postgresql neu zu laden. Verwenden Sie aus den offiziellen Dokumenten pg_ctl reload. Wenn das nicht funktioniert, gibt es andere Möglichkeiten, dies in dieser Frage zu tun .

Daniel Vérité
quelle
Ich werde es versuchen, sobald ich heute einsteige! Ich wusste nicht, das /war , wie viele Bits festgelegt wurden --- das macht viel mehr Sinn , jetzt!
Sean Allred
Dies war das Problem, danke für den Hinweis! Wenn ich nun eine genaue IP-Adresse angeben möchte, würde ich sie verwenden 192.168.108.161/32oder einfach 192.168.108.161?
Sean Allred
1
Das sollte sein 192.168.108.161/32. Nehmen Sie sich auch die Zeit, um den Anfang der pg_hba.confDatei über die Spalte ADRESSE zu lesen. Alles wird erklärt.
Daniel Vérité
2

Zwei Dinge fallen mir ein.

  1. Der erste besteht darin, sicherzustellen, dass der Server die Netzwerkschnittstelle überwacht. Standardmäßig hört es nur auf dem lokalen Host. Bearbeiten Sie Ihre postgresql.confDatei und ändern Sie:

    listen_addresses = 'localhost'

    Um stattdessen so auszusehen:

    listen_addresses = '*'
  2. Wenn Sie eine Remoteverbindung herstellen, postgresbenötigt Ihr Benutzer ein Kennwort. Standardmäßig ist diesem Konto kein Kennwort zugeordnet, sodass nur die lokale vertrauenswürdige Anmeldung funktioniert. Damit die Remote-Kennwortanmeldung (z. B. md5in pg_hba.conf`) funktioniert, fügen Sie entweder ein Kennwort hinzu oder erstellen Sie einen neuen Benutzer mit einem Kennwort.

Anstatt hostin pg_hba.confVerwendung hostsslzu verwenden, müssen Remoteverbindungen SSL verwenden. Andernfalls werden die Anmeldeinformationen für Benutzername / Passwort im Klartext über die Leitung gesendet.

sehrope
quelle
1) Ich habe vergessen zu erwähnen, dass ich so bearbeitet listen_addresseshabe, aber es wird für zukünftige Benutzer hilfreich sein, dies auch zu sehen. 2) Auf dem Server kann ich pgAdmin öffnen und dann eine Verbindung zur Datenbank herstellen. Es fordert mich zur Eingabe eines Passworts auf, ich gebe eines ein (unsere Firma hat ein Standardpasswort, das wir für Testzwecke verwenden) und es verbindet sich. Würde es nicht ähnlich scheitern, wenn der postgresBenutzer kein Passwort hätte?
Sean Allred
Versuchen Sie, eine Verbindung über die Befehlszeile über herzustellen, psqlund prüfen Sie, welcher Fehler gemeldet wird. Es sollte ausführlich genug sein, um die Ursache herauszufinden. Wenn es heißt, FATAL: password authentication failed for userist es wahrscheinlich ein nicht übereinstimmendes Passwort. Wenn es heißt, handelt could not connect to server: Connection refusedes sich wahrscheinlich um ein Netzwerk- / Portproblem. Ist die von Ihnen angegebene CIDR 192.168.0.0/24korrekt? Sollte das sein 192.168.1.0/24( 1statt 0für das dritte Byte)?
sehrope
psql --host=192.168.108.160 --port=5433 --user=postgres postgresschlägt mit dem gleichen Fehler fehl (und keine Möglichkeit, es ausführlicher zu machen): "FATAL: kein pg_hba.conf-Eintrag für Host ..."
Sean Allred
Ich habe gerade den Server überprüft und er sagt tatsächlich etwas sehr Interessantes aus (wenn man bedenkt, dass dieses Problem mit pgAdmin nicht auftritt): i.stack.imgur.com/g9aLK.png
Sean Allred
Nun noch ein Punkt für psqldann. Wie hat sich pgAdmin dann lokal verbunden? Ich vermute, Sie haben eine Verbindung zu einer anderen Datenbank hergestellt. Andernfalls kann ich auch nicht sehen, wie eine lokale Verbindung funktionieren würde, wenn der Server nicht gestartet wird.
sehrope