PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tổng quan về Tham số kết nối sslpassword của PostgreSQL 13 libpq

PostgreSQL từ lâu đã hỗ trợ kết nối SSL và cả cơ chế xác thực dựa trên chứng chỉ. Mặc dù không có gì trong lĩnh vực này có vẻ là mới đối với thế giới PostgreSQL. Tuy nhiên, một vấn đề nan giải nhỏ đối với kết nối máy khách (xác thực dựa trên chứng chỉ máy khách) là lời nhắc "Nhập cụm từ mật khẩu PEM:" cho khóa máy khách được mã hóa.

Một tính năng mới trong PostgreSQL 13 khen ngợi tham số máy chủ 'ssl_passphrase_command'. Trong khi tham số ssl_passphrase_command cho phép quản trị viên máy chủ chỉ định cụm mật khẩu cho các khóa máy chủ được mã hóa được sử dụng cho chứng chỉ máy chủ; tham số kết nối mới được giới thiệu ‘sslpassword 'cung cấp khả năng kiểm soát hơi tương tự cho các kết nối máy khách.

Xem lại Cơ sở hạ tầng

Để hoàn thành bài tập thực hành cho phân tích tính năng này, tôi đã thiết lập một hệ thống khá cơ bản:

  • Hai máy ảo
    • pgServer (172.25.130.189)
    • pgClient (172.25.130.178)
  • Chứng chỉ tự ký trên pgServer
  • PostgreSQL 13 được cài đặt trên cả hai máy
  • gcc để biên dịch một chương trình libpq mẫu

Thiết lập Máy chủ

Để phân tích tính năng, trước tiên hãy thiết lập phiên bản máy chủ PostgreSQL 13 với các chứng chỉ liên quan và cấu hình tương ứng trên máy ảo pgServer.

[[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

Các lệnh trên đang tạo chứng chỉ tự ký bằng khóa được bảo vệ bằng cụm mật khẩu. Quyền của server.key bị hạn chế theo yêu cầu của PostgreSQL. Việc định cấu hình phiên bản PostgreSQL để sử dụng các chứng chỉ này không còn là điều kỳ diệu nữa. Trước tiên, hãy tạo một thư mục DATA cơ sở bằng cách sử dụng:

[[email protected]]$ initdb 

và dán các thông số cấu hình sau vào postgresql.conf đã tạo:

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'

Và cũng đảm bảo rằng kết nối SSL từ nút pgClient được chấp nhận và có thể sử dụng cơ chế xác thực chứng chỉ bằng cách dán dòng sau vào pg_hba.conf đã tạo:

hostssl    all     all             172.25.130.178/32       cert clientcert=1

Tất cả những gì cần thiết bây giờ là khởi động máy chủ với cấu hình trên bằng lệnh pg_ctl:

[[email protected]]$ pg_ctl start

Thiết lập Ứng dụng khách

Bước tiếp theo sẽ là tạo các chứng chỉ ứng dụng khách được ký bởi các chứng chỉ máy chủ đã nói ở trên:

[[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:

Trong bước trên, khóa máy khách được mã hóa và CSR cho chứng chỉ máy khách được tạo. Các bước sau hoàn thành chứng chỉ máy khách bằng cách ký chứng chỉ đó bằng chứng chỉ gốc Máy chủ và Khóa máy chủ.

[[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:

Một khía cạnh quan trọng cần nhớ là tên CN trong chứng chỉ. Hãy coi nó giống như một nhận dạng hoặc Tên của thực thể. Trong chứng chỉ ứng dụng khách ở trên, nếu CN được đặt thành 'postgres', nó có nghĩa là cho một vai trò có tên là postgres. Ngoài ra, trong khi thiết lập chứng chỉ máy chủ, chúng tôi đã sử dụng CN =pgServer; có thể có vấn đề khi chúng tôi sử dụng chế độ xác minh đầy đủ của Kết nối SSL.

Đã đến lúc sao chép chứng chỉ vào máy khách để dùng thử Kết nối SSL:

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

Theo mặc định trên môi trường Linux / Unix, khi psql được sử dụng để tạo kết nối SSL, psql sẽ tìm kiếm chứng chỉ / khóa trong ‘$ {HOME} /. postgresql’ của người dùng hiện tại. Tất cả các tệp này cũng có thể được chỉ định trong các thông số kết nối - Tuy nhiên, điều đó sẽ làm mờ thứ chúng tôi muốn kiểm tra.

Trên máy pgClient, hãy thay đổi quyền của postgresql.key để đảm bảo PostgreSQL chấp nhận điều tương tự.

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

Kiểm tra Tính năng

Tham số kết nối PSQL

Chúng tôi đã hoàn thành khá nhiều việc thiết lập môi trường. Hãy thử tạo Kết nối SSL:

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

Enter PEM pass phrase:

Chà! Tất cả chỉ bắt đầu với lời nhắc trên. Nếu chúng ta có một chương trình hàng loạt hoặc một tập lệnh tự động hóa, thì lời nhắc sẽ hơi khó xử lý. Với việc bổ sung mới tham số 'sslpassword' trong chuỗi kết nối, giờ đây có thể dễ dàng xác định điều đó như bên dưới:

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

Kết nối sẽ thành công sau đó mà không cần bất kỳ lời nhắc nào.

Libpq Hook cho mật khẩu SSL

Câu chuyện tiếp tục - có thêm một hàm hook ‘PQsetSSLKeyPassHook_OpenSSL’ trong giao diện Libpq. Điều này có thể được sử dụng bởi các ứng dụng khách có thể không có quyền truy cập vào cụm mật khẩu chính và cần tạo / tìm nạp từ giao diện bên ngoài bằng cách sử dụng một số logic phức tạp.

void PQsetSSLKeyPassHook_OpenSSL(PQsslKeyPassHook_OpenSSL_type hook);

Có thể đăng ký hàm gọi lại kiểu PQsslKeyPassHook_OpenSSL_type bằng hook này. Lệnh gọi lại sẽ được gọi bởi Libpq khi cần lấy cụm mật khẩu. Chữ ký của hàm gọi lại như vậy phải là:

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

Dưới đây là một chương trình mẫu ‘client_conn.c’ - cho thấy sự tích hợp của một hook như vậy:

#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;

}

Biên dịch và chạy giống nhau để kiểm tra xem nó có thực sự hoạt động hay không:

[[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

Lời cảnh báo cuối cùng

Blog trên cho thấy một thay đổi nhỏ nhưng hữu ích trong các tham số kết nối Libpq / psql để xác thực dựa trên Chứng chỉ trong PostgreSQL. Nhưng, một lời cảnh báo - trong bài tập thực hành ở trên, chúng tôi đã sử dụng chứng chỉ tự ký; nó có thể không phù hợp lắm với môi trường tổ chức / sản xuất của bạn. Bạn có thể tìm cách lấy một số chứng chỉ của bên thứ ba để sử dụng thiết lập SSL như vậy.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận kích thước của tất cả cơ sở dữ liệu trong PostgreSQL (psql)

  2. PostgreSQL DATEADD () Tương đương

  3. Cách tốt nhất để cài đặt hstore trên nhiều lược đồ trong cơ sở dữ liệu Postgres?

  4. dplyr left_join nhỏ hơn, lớn hơn điều kiện

  5. Liệu UUID làm khóa chính trong PostgreSQL có cho hiệu suất chỉ mục kém không?