Frage Nicht-Superuser kann keine Verbindung herstellen, wenn der Server während der Verwendung von dblink kein Kennwort anfordert


Ich möchte einige Cross-Datenbank-Referenzen in meiner Anwendung machen. Kurz gesagt, ich habe zwei Datenbanken namens Meta und Op. Ich möchte einige ausgewählte Abfrage von Meta zu einer Tabelle in der Op-Datenbank wie unten aber den folgenden Fehler erhalten. Ich habe es mit Passwort und ohne Passwort versucht. Apropos caixa Benutzer ist ein Nicht-Super-Benutzer und mein Zielserver (op Der Datenbankserver verfügt über den MD5-Authentifizierungsmodus.)

meta=> select * from dblink('dbname=op password=caixa','SELECT op_col from op_table') AS t(op_col varchar);

FEHLER: Passwort ist erforderlich

DETAIL: Nicht-Superuser kann keine Verbindung herstellen, wenn der Server kein Kennwort anfordert.

HINWEIS: Die Authentifizierungsmethode des Zielservers muss geändert werden.

Was der HINWEIS in der obigen Fehlermeldung suggeriert? Muss ich den Authentifizierungsmodus des Servers ändern? Ohne Änderung des Authentifizierungsmodus des Servers (MD5) kann ich die obige Abfrage nicht ausführen?


10
2017-08-11 19:32


Ursprung


Antworten:


Von Dokumentation:

Nur Superuser können dblink_connect zum Erstellen verwenden   Nicht passwortauthentifizierte Verbindungen. Wenn Nicht-Superuser das brauchen   Fähigkeit, Gebrauch dblink_connect_u stattdessen.

und

dblink_connect_u () ist identisch mit dblink_connect (), außer dass es   ermöglicht Nicht-Superusern die Verbindung mit einer beliebigen Authentifizierungsmethode.

Das bedeutet dein dblink Anruf verwendet dblink_connect implizit. Benutzen dblink_connect_u Stattdessen oder ändern Sie Ihre Authentifizierungsmethode z. MD5.

Beachten Sie, dass Sie auch die Berechtigung zum Gewähren ausführen benötigen caixa Rolle, zum Beispiel durch:

GRANT EXECUTE ON FUNCTION dblink_connect_u(text) TO caixa;
GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO caixa;

Arbeitsbeispiel (nach GRANT):

meta=> SELECT dblink_connect_u('conn1', 'dbname=op');
meta=> SELECT * FROM dblink('conn1','SELECT op_col from op_table')
            AS t(op_col varchar);
 op_col 
--------
 aaa
 bbb
 ccc
(3 rows)
meta=> SELECT dblink_disconnect('conn1');

BEARBEITEN:

Entschuldigung für eine leicht irreführende Antwort. Natürlich Du nicht brauchen dblink_connect_u für md5 authentifiziert Verbindung. Es gibt eine Möglichkeit, die ich sehe. PostgreSQL hat zwei verschiedene Verbindungstypen: Gastgeber und lokal.

Laufen:

psql -h localhost ..

enthält Host-Verbindung, aber

dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');

Verwendet lokal Geben Sie also ein, wenn Sie eine Nicht-Kennwortmethode für die lokale Verbindung haben (z. B. Ident-Methode oder Vertrauensstellung), dann wird das Ergebnis zurückgegeben

ERROR:  password is required
DETAIL:  Non-superuser cannot connect if the server does not request a password.
HINT:  Target server's authentication method must be changed.

Prüfen

dblink_connect('mycon','hostaddr=127.0.0.1 dbname=vchitta_op user=caixa password=caixa')

zum Gastgeber Verbindung. Bitte posten Sie, falls möglich, Ihre pg_hba.conf.

Ich überprüfte auch was CONNECT Privileg auf vchitta_op DB, aber Fehlermeldung ist anders:

REVOKE CONNECT ON DATABASE vchitta_op FROM PUBLIC;
REVOKE CONNECT ON DATABASE vchitta_op FROM caixa;

SELECT dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');
ERROR:  could not establish connection
DETAIL:  FATAL:  permission denied for database "vchitta_op"
DETAIL:  User does not have CONNECT privilege.

11
2017-08-11 19:59



Es gibt einen Workaround, der den Trick für mich gemacht hat. Nicht-Superuser können Funktionen mit Privilegien eines Superusers ausführen, wenn die Option "SECURITY DEFINER" eingestellt ist. ( http://www.postgresql.org/docs/9.1/static/sql-createfunction.html )

Das bedeutet, dass Sie eine Funktion (mit Superuser-Eigentümer und Option SECURITY DEFINER) erstellen können, die datenbankübergreifend manipuliert (mithilfe von dblink () ohne Passwort) und führe es unter Nicht-Superuser aus


3
2018-05-12 08:15



Ich habe ein ähnliches, aber ein anderes Problem. Ich habe zwei Server mit identischer postgres.conf und pg_hba.conf. Eine Version 9.2.3 und eine Version 9.2.4

9.2.3

pg_hba.conf hat

    local   all     dblinkuser      trust

dann verbinde ich mich mit der Datenbank unter Verwendung irgendeines gewöhnlichen Benutzers

    theater_map=# select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
    dblink_connect 
    ----------------
    OK
    (1 row)

Erfolg in Verbindung.

9.2.4

Meine pg_hba.conf hat denselben Eintrag wie oben

    theater_map=> select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
    ERROR:  password is required
    DETAIL:  Non-superuser cannot connect if the server does not request a password.
    HINT:  Target server's authentication method must be changed.

JETZT Ich ändere meine pg_hba.conf auf 9.2.4 wie folgt

    local   all     dblinkuser      md5

und postgres neu starten

    theater_map=> select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
    dblink_connect 
    ----------------
   OK
   (1 row)

Ich habe das Änderungsprotokoll zwischen den Versionen 9.2.3 und 9.2.4 überprüft, konnte jedoch keine Details finden.

hinweis: das ändern der auth-methode von trust zu md5 auf 9.2.3 macht keinen unterschied und funktioniert immer noch. 


0
2017-07-11 13:48