PostgreSQL erfährt nie, dass ein Client in einem VPN ist. Es empfängt eine TCP-Verbindung von einer Adresse und eine Reihe von Anmeldedaten und entscheidet, was damit geschieht. Den Zugriff vom Tunnel abhängig zu machen heißt daher, drei getrennte Entscheidungen so anzuordnen, dass sie übereinstimmen, und dann die eine Adresse zu prüfen, die der Server tatsächlich sieht, statt der, die Sie im Diagramm gezeichnet haben.

Drei Entscheidungen, die nicht verschmelzen dürfen

Wo der Server lauscht, ist eine Entscheidung. Welcher Datenverkehr diese Adresse erreichen kann, ist eine zweite, getroffen von der Host-Firewall und jeder Netzwerkgrenze davor. Welche Datenbankidentität sich von welcher Quelle authentifizieren darf, ist eine dritte, getroffen in pg_hba.conf.

Jede wird von einer anderen Komponente durchgesetzt, und jede scheitert mit einer anderen Meldung. Sie in einer Diskussion zu vermischen, führt dazu, dass Leute die HBA-Datei bearbeiten, um ein Firewallproblem zu beheben. Halten Sie sie in der Reihenfolge: Ein Listener, der nicht gebunden ist, kann nicht erreicht werden, ein gefilterter Port kann nicht verbunden werden, und eine HBA-Regel entscheidet nur, was nach dem Bestehen einer Verbindung geschieht. Wenn eine Änderung keine Wirkung hat, stellen Sie fest, welche der drei Schichten Sie tatsächlich geändert haben.

Wo der Server lauscht

Binden Sie an eine Adresse, die der Maschine tatsächlich zugewiesen ist, nicht an einen Schnittstellennamen:

listen_addresses = '10.20.0.30'

Die Datenbank kann hinter dem VPN-Gateway stehen, ohne eine eigene Tunnelschnittstelle zu haben, und genau deshalb ist eine Adresse das Richtige, was man benennen sollte. Das Ändern dieser Einstellung erfordert einen vollständigen Neustart; ein Reload genügt nicht.

Filtern Sie dann den Port, normalerweise 5432, auf dem Host und an jeder Grenze davor. Das Binden an eine private Adresse ist kein Beweis für öffentliche Ablehnung, denn eine Portweiterleitung oder eine Cloud-Adresszuordnung kann Pakete immer noch an diesen privaten Listener liefern.

Die Adresse, die HBA tatsächlich sieht

Bei geroutetem Zugriff sieht der Server die innere Tunneladresse jedes Clients. Bei Quellübersetzung sieht er stattdessen die übersetzte Adresse des Gateways, und jeder Client fällt auf diesen einen Wert zusammen. Prüfen Sie die Quelle über die eigenen Verbindungsnachweise des Servers, bevor Sie ein Präfix zur Freigabe wählen.

Für eine Bereitstellung, die bereits TLS und SCRAM verwendet, sieht ein bewusst enges Beispiel für Fernzugriff so aus:

hostssl appdb app_login 10.8.0.0/24 scram-sha-256
host all all 0.0.0.0/0 reject
host all all ::/0 reject

Das erlaubt eine Rolle und eine Datenbank über TLS aus dem genannten Pool und weist dann anderen entfernten TCP-Zugriff ab. Es ist kein Ersatz für eine vollständige HBA-Datei: Behalten Sie lokale Administration, Replikation und jeden anderen autorisierten Dienst bei und setzen Sie die engen Regeln vor breitere Erlaubnisse.

Wenn Übersetzung im Spiel ist, kann die HBA Clients nicht anhand ihrer ursprünglichen Adressen unterscheiden. Halten Sie die Netzwerkzulassung eng und verlangen Sie echte Datenbank-Anmeldedaten, und ersetzen Sie niemals trust-Authentifizierung durch ein tatsächliches Konto.

Der erste Treffer gewinnt, ohne Rückfall

PostgreSQL liest die Datei von oben nach unten und verwendet den ersten Datensatz, der auf die Verbindung passt. Es gibt keinen zweiten Versuch, wenn die Authentifizierung dieses Datensatzes fehlschlägt, sodass eine frühere breite Erlaubnis eine spätere Ablehnung still aushebelt.

Diese Reihenfolgeregel ist der häufigste Grund, warum eine sorgfältig geschriebene Ablehnung nie wirksam wird. Setzen Sie die spezifischen Regeln zuerst und die breiten zuletzt, und lesen Sie die Datei dann als Sequenz statt als Menge. Eine Regel, die Sie unten hinzugefügt haben, ist keine Richtlinie, sondern ein Kommentar. Verschieben Sie sie nach oben und laden Sie neu, bevor Sie zu dem Schluss kommen, dass die Datei ignoriert wird.

Die HBA-Referenz definiert sowohl die Reihenfolge als auch den Unterschied zwischen host- und hostssl-Datensätzen, was wichtig ist, wenn der Sinn der Regel darin besteht, dass die Verbindung verschlüsselt sein muss.

Reload, Neustart und der abgelehnte Fall

HBA-Änderungen werden durch einen Reload angewendet, und die Ansicht pg_hba_file_rules hilft Ihnen, Parse-Fehler zu finden. Diese Ansicht beschreibt den aktuellen Inhalt der Datei, nicht ob der laufende Server sie erfolgreich geladen hat, sodass eine saubere Auflistung kein Beweis dafür ist, dass die neuen Regeln aktiv sind.

Änderungen am Listener benötigen ihren eigenen Neustart, und die beiden Vorgänge sind leicht zu verwechseln, wenn eine Änderung wirkungslos zu sein scheint.

Testen Sie mit frischen Sitzungen: Ein genehmigter Client mit dem vorgesehenen Konto verbindet sich, dasselbe Konto von einem nicht genehmigten Pfad nicht, und eine nicht autorisierte Datenbankidentität scheitert weiterhin von innerhalb des VPN. Diese drei Ergebnisse trennen die Netzwerkgrenze von der Datenbankautorisierung, was der ganze Sinn davon ist, die Entscheidungen getrennt zu halten.

Ähnliche Artikel