sql >> Databasteknik >  >> RDS >> PostgreSQL

En översikt över PostgreSQL 13 libpq sslpassword anslutningsparametrar

PostgreSQL har sedan länge stödt SSL-anslutningar och även certifikatbaserade autentiseringsmekanismer. Även om ingenting i detta avseende verkar vara nytt för PostgreSQL-världen. Ett litet tjatande problem för klientanslutning (klientcertifikatbaserad autentisering) var dock en uppmaning "Ange PEM-lösenordsfras:" för krypterad klientnyckel.

En ny funktion i PostgreSQL 13 kompletterar serverparametern 'ssl_passphrase_command'. Medan parametern ssl_passphrase_command tillåter serveradministratörer att ange en lösenfras för krypterade servernycklar som används för servercertifikat; den nyligen introducerade anslutningsparametern 'sslpassword' ger något liknande kontroll för klientanslutningar.

En titt på infrastrukturen 

För att gå igenom en praktisk övning för denna funktionsanalys har jag etablerat ett ganska grundläggande system:

  • Två virtuella maskiner
    • pgServer ( 172.25.130.189 ) 
    • pgClient  ( 172.25.130.178 )
  • Självsignerade certifikat på pgServer
  • PostgreSQL 13 installerad på båda datorerna 
  • gcc för att kompilera ett exempel på libpq-program

Konfigurera servern 

För att analysera funktionen, låt oss först ställa in en PostgreSQL 13-serverinstans med relevanta certifikat och respektive konfiguration på den virtuella pgServer-maskinen.

[[email protected]]$ echo ${HOME}

/var/lib/pgsql/

[[email protected]]$ mkdir ~/server_certs/ 

[[email protected]]$ openssl genrsa -des3 -passout pass:secretserverpass -out ~/server_certs/server.key

[[email protected]]$ openssl req -new -key ~/server_certs/server.key -days 365 -out ~/server_certs/server.crt -x509 -subj "/C=AU/ST=NSW/L=DY/O=MyOrg/OU=Dev/CN=pgServer"

Enter pass phrase for /var/lib/pgsql/server_certs/server.key:

[[email protected]]$ chmod 0600 /var/lib/pgsql/server_certs/server.key

[[email protected]]$ cp ~/server_certs/server.crt ~/server_certs/root.crt

Kommandona ovan genererar ett självsignerat certifikat med en nyckel som skyddas av en lösenfras. Behörigheterna för server.key är begränsade som krävs av PostgreSQL. Att konfigurera PostgreSQL-instansen för att använda dessa certifikat är ingen magi nu. Skapa först en bas DATA-mapp med:

[[email protected]]$ initdb 

och klistra in följande konfigurationsparametrar i den genererade postgresql.conf:

ssl=on

ssl_cert_file='/var/lib/pgsql/server_certs/server.crt'

ssl_key_file='/var/lib/pgsql/server_certs/server.key'

ssl_ca_file='/var/lib/pgsql/server_certs/root.crt'

ssl_passphrase_command = 'echo secretserverpass'

listen_addresses = '172.25.130.189'

Och se till att en SSL-anslutning från pgClient-noden accepteras och kan använda certifikatautentiseringsmekanismen genom att klistra in följande rad i den genererade pg_hba.conf:

hostssl    all     all             172.25.130.178/32       cert clientcert=1

Allt som behövs nu är att starta servern med ovanstående konfiguration med kommandot pg_ctl:

[[email protected]]$ pg_ctl start

Konfigurera klienten 

Nästa steg skulle vara att generera klientcertifikat som är signerade av ovannämnda servercertifikat:

[[email protected]]$ mkdir ~/client_certs/

[[email protected]]$ openssl genrsa -des3 -passout pass:secretclientpass -out ~/client_certs/postgresql.key

[[email protected]]$ openssl req -new -key ~/client_certs/postgresql.key -out ~/client_certs/postgresql.csr -subj "/C=AU/ST=NSW/L=DY/O=MyOrg/OU=Dev/CN=postgres"

Enter pass phrase for ~/client_certs/postgresql.key:

I steget ovan genereras en krypterad klientnyckel och en CSR för klientcertifikatet. Följande steg slutför ett klientcertifikat genom att signera det med serverrotcertifikatet och servernyckeln.

[[email protected]]$ openssl x509 -req -in ~/client_certs/postgresql.csr -CA ~/server_certs/root.crt -CAkey ~/server_certs/server.key -out ~/client_certs/postgresql.crt -CAcreateserial

Signature ok

subject=/C=AU/ST=NSW/L=DY/O=MyOrg/OU=Dev/CN=postgres

Getting CA Private Key

Enter pass phrase for /var/lib/pgsql/server_certs/server.key:

En viktig aspekt att komma ihåg är CN-namnet i certifikat. Betrakta det som mer av en identifiering eller namn på enheten. I klientcertifikatet ovan, om CN är inställt på "postgres", är det avsett för en roll som heter postgres. När vi konfigurerade servercertifikatet använde vi också CN=pgServer; det kan spela någon roll när vi använder ett fullständigt verifieringsläge för SSL-anslutning.

Dags att kopiera certifikaten till klientdatorn för att prova SSL-anslutningen:

[[email protected]]$ scp -r client_certs/* [email protected]:~/.postgresql

Som standard i Linux/Unix-miljöer, när psql används för att skapa SSL-anslutningar, söker den efter certifikat/nycklar i '${HOME}/.postgresql' för den aktuella användaren. Alla dessa filer kan också specificeras i anslutningsparametrar - Det skulle dock ha grumlat det vi vill testa.

På pgClient-datorn, ändra behörigheten för postgresql.key för att se till att PostgreSQL accepterar detsamma.

[[email protected]]$ chmod 0600 ~/.postgresql/postgresql.key

Testa funktionen 

PSQL Connection parameter 

Vi är i stort sett klara med inställningen av miljön. Låt oss försöka skapa en SSL-anslutning:

[[email protected]]$ psql "host=172.25.130.189 port=5432 user=postgres dbname=postgres sslmode=prefer"

Enter PEM pass phrase:

Tja! Det hela började endast med ovanstående uppmaning. Om vi ​​har ett batchprogram eller ett automatiseringsskript är uppmaningen lite svår att hantera. Med det nya tillägget av parametern 'sslpassword' i anslutningssträngen är det nu lätt att specificera det enligt nedan:

[[email protected]]$ psql "host=172.25.130.189 port=5432 user=postgres dbname=postgres sslmode=prefer sslpassword=secretclientpass"

Anslutningen bör vara framgångsrik efter detta, utan någon uppmaning.

Libpq Hook for SSL-lösenord

Berättelsen fortsätter - det finns tillägg av en hook-funktion 'PQsetSSLKeyPassHook_OpenSSL' i Libpq-gränssnittet. Detta kan användas av klientapplikationer som kanske inte har tillgång till nyckellösenordsfrasen och som behöver generera/hämta från ett externt gränssnitt med hjälp av någon komplex logik.

void PQsetSSLKeyPassHook_OpenSSL(PQsslKeyPassHook_OpenSSL_type hook);

En återuppringningsfunktion av typen PQsslKeyPassHook_OpenSSL_type kan registreras med denna hook. Återuppringningen kommer att anropas av Libpq när du behöver få en lösenordsfras. Signaturen för en sådan återuppringningsfunktion bör vara:

int my_callback_function(char *buf, int size, PGconn *conn);

Nedan är ett exempelprogram 'client_conn.c' - som visar integration av en sådan krok:

#include <stdlib.h>

#include <string.h>

#include "libpq-fe.h"

void do_exit(PGconn *conn) {

    PQfinish(conn);

    exit(1);

}

/**

 * For PQsetSSLKeyPassHook_OpenSSL to provide password for SSL Key

 **/

int ssl_password_provider(char *buf, int size, PGconn *conn)

{    

    const char * default_key_password = "secretclientpass";

    strcpy(buf, default_key_password);

    return strlen(default_key_password);

}

/**

 * Sample program to make a connection and check server version

 */

int main() 

{

    PQsetSSLKeyPassHook_OpenSSL( ssl_password_provider );

    PGconn *conn = PQconnectdb("host=172.25.130.189 port=5413 user=postgres dbname=postgres sslmode=prefer");

    if (PQstatus(conn) == CONNECTION_BAD) 

    {

        fprintf(stderr, "Connection to DB failed: %s\n", PQerrorMessage(conn));

        do_exit(conn);

    }

    printf("Server version: %d\n", PQserverVersion(conn));

    PQfinish(conn);

    return 0;

}

Kompilera och kör samma sak för att kontrollera om det verkligen fungerar:

[[email protected]]$ gcc -DUSE_OPENSSL  -I/usr/pgsql-13/include/ -lpq -L/usr/pgsql-13/lib/ client_conn.c -o client_conn

[[email protected]]$ client_conn

[[email protected]]$ ./client_conn

Server version: 130000

En sista varning

Ovanstående blogg visar en liten men användbar förändring i Libpq/psql-anslutningsparametrar för certifikatbaserad autentisering i PostgreSQL. Men, ett varningens ord - i ovanstående praktiska övning har vi använt självsignerade certifikat; det kanske inte passar så bra i din organisation/produktionsmiljö. Du kan försöka få några tredjepartscertifikat för att använda en sådan SSL-inställning.


  1. MySQL High Availability Framework förklaras – Del II:Semisynkron replikering

  2. Sätt som tillgång kan spara pengar för ditt företag

  3. Oracle Floats vs Number

  4. Hur man beräknar dagliga aktiva användare (DAU) i MySQL