4.4. PostgreSQL 서버에서 TLS 암호화 구성
기본적으로 PostgreSQL 은 암호화되지 않은 연결을 사용합니다. 보다 안전한 연결의 경우 PostgreSQL 서버에서 TLS(Transport Layer Security) 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성할 수 있습니다.
사전 요구 사항
- PostgreSQL 서버가 설치되어 있어야 합니다.
- 데이터베이스 클러스터가 초기화됩니다.
- 서버가 RHEL 9.2 이상을 실행하고 FIPS 모드가 활성화된 경우 클라이언트는 확장 마스터 시크릿(Extended Master Secret) 확장을 지원하거나 TLS 1.3을 사용해야 합니다. TLS 1.2 연결이 없는 경우 실패합니다. 자세한 내용은 RHEL 9.2 이상에 적용된 Red Hat Knowledgebase 솔루션 TLS 확장 "확장 마스터 시크릿"을 참조하십시오.
절차
OpenSSL 라이브러리를 설치합니다.
# dnf install openssl
TLS 인증서 및 키를 생성합니다.
# openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 교체합니다.
서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.
# cp server.{key,crt} /var/lib/pgsql/data/.
서명된 인증서와 개인 키의 소유자 및 그룹 소유권을
postgres
사용자로 변경합니다.# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.
# chmod 0400 /var/lib/pgsql/data/server.key
/var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경하여 암호 해시 알고리즘을scram-sha-256
으로 설정합니다.#password_encryption = md5 # md5 or scram-sha-256
다음으로 변경합니다.
password_encryption = scram-sha-256
/var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경하여 SSL/TLS를 사용하도록 PostgreSQL을 구성합니다.#ssl = off
다음으로 변경합니다.
ssl=on
/var/lib/pgsql/data/pg_hba.conf
파일에서 IPv4 로컬 연결에 대해 다음 행을 변경하여 TLS를 사용하는 클라이언트의 연결만 허용하도록 모든 데이터베이스에 대한 액세스를 제한합니다.host all all 127.0.0.1/32 ident
다음으로 변경합니다.
hostssl all all 127.0.0.1/32 scram-sha-256
또는 다음 새 행을 추가하여 단일 데이터베이스 및 사용자에 대한 액세스를 제한할 수 있습니다.
hostssl mydatabase mydbuser 127.0.0.1/32 scram-sha-256
mydatabase 를 데이터베이스 이름으로 바꾸고 mydbuser 를 사용자 이름으로 바꿉니다.
postgresql
서비스를 다시 시작하여 변경 사항을 적용합니다.# systemctl restart postgresql.service
검증
연결이 암호화되었는지 수동으로 확인하려면 다음을 수행하십시오.
PostgreSQL 데이터베이스에 mydbuser 사용자로 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.
$ psql -U mydbuser -h 127.0.0.1 -d mydatabase Password for user mydbuser:
mydatabase 를 데이터베이스 이름으로 바꾸고 mydbuser 를 사용자 이름으로 바꿉니다.
현재 데이터베이스 연결에 대한 정보를 가져옵니다.
mydbuser=> \conninfo You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
PostgreSQL 에 대한 연결이 암호화되었는지 여부를 확인하는 간단한 애플리케이션을 작성할 수 있습니다. 이 예제에서는
libpq-devel
패키지에서 제공하는libpq
클라이언트 라이브러리를 사용하는 C로 작성된 애플리케이션을 보여줍니다.#include <stdio.h> #include <stdlib.h> #include <libpq-fe.h> int main(int argc, char* argv[]) { //Create connection PGconn* connection = PQconnectdb("hostaddr=127.0.0.1 password=mypassword port=5432 dbname=mydatabase user=mydbuser"); if (PQstatus(connection) ==CONNECTION_BAD) { printf("Connection error\n"); PQfinish(connection); return -1; //Execution of the program will stop here } printf("Connection ok\n"); //Verify TLS if (PQsslInUse(connection)){ printf("TLS in use\n"); printf("%s\n", PQsslAttribute(connection,"protocol")); } //End connection PQfinish(connection); printf("Disconnected\n"); return 0; }
mypassword 를 암호, mydatabase 를 데이터베이스 이름으로, mydbuser 를 사용자 이름으로 바꿉니다.
참고-l
옵션을 사용하여 컴파일할 pq 라이브러리를 로드해야 합니다. 예를 들어 GCC 컴파일러를 사용하여 애플리케이션을 컴파일하려면 다음을 수행합니다.pq
$ gcc source_file.c -lpq -o myapplication
여기서 source_file.c 에는 위의 예제 코드가 포함되어 있으며 myapplication 은 보안 PostgreSQL 연결을 확인하는 애플리케이션의 이름입니다.
예 4.4. TLS 암호화를 사용하여 PostgreSQL 데이터베이스 초기화, 생성 및 연결
이 예제에서는 PostgreSQL 데이터베이스를 초기화하고, 데이터베이스 사용자와 데이터베이스를 생성하며, 보안 연결을 사용하여 데이터베이스에 연결하는 방법을 보여줍니다.
PosgreSQL 서버를 설치합니다.
# dnf install postgresql-server
데이터베이스 클러스터를 초기화합니다.
# postgresql-setup --initdb * Initializing database in '/var/lib/pgsql/data' * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
OpenSSL 라이브러리를 설치합니다.
# dnf install openssl
TLS 인증서 및 키를 생성합니다.
# openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 교체합니다.
서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.
# cp server.{key,crt} /var/lib/pgsql/data/.
서명된 인증서와 개인 키의 소유자 및 그룹 소유권을
postgres
사용자로 변경합니다.# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.
# chmod 0400 /var/lib/pgsql/data/server.key
암호 해시 알고리즘을
scram-sha-256
로 설정합니다./var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경합니다.#password_encryption = md5 # md5 or scram-sha-256
다음으로 변경합니다.
password_encryption = scram-sha-256
SSL/TLS를 사용하도록 PostgreSQL을 구성합니다.
/var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경합니다.#ssl = off
다음으로 변경합니다.
ssl=on
postgresql
서비스를 시작합니다.# systemctl start postgresql.service
postgres
라는 시스템 사용자로 로그인합니다.# su - postgres
postgres
사용자로 PostgreSQL 대화형 터미널을 시작합니다.$ psql -U postgres psql (13.7) Type "help" for help. postgres=#
mydbuser
라는 사용자를 생성하고mydbuser
의 암호를 설정합니다.postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd'; CREATE ROLE postgres=#
mydatabase
라는 데이터베이스를 만듭니다.postgres=# CREATE DATABASE mydatabase; CREATE DATABASE postgres=#
mydbuser
사용자에게 모든 권한을 부여합니다.postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser; GRANT postgres=#
대화형 터미널에서 로그아웃합니다.
postgres=# \q
postgres
사용자 세션에서 로그아웃합니다.$ logout
/var/lib/pgsql/data/pg_hba.conf
파일에서 IPv4 로컬 연결에 대해 다음 행을 변경하여 TLS를 사용하는 클라이언트의 연결만 허용하도록 모든 데이터베이스에 대한 액세스를 제한합니다.host all all 127.0.0.1/32 ident
다음으로 변경합니다.
hostssl all all 127.0.0.1/32 scram-sha-256
postgresql
서비스를 다시 시작하여 변경 사항을 적용합니다.# systemctl restart postgresql.service
PostgreSQL 데이터베이스에
mydbuser
사용자로 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.$ psql -U mydbuser -h 127.0.0.1 -d mydatabase Password for user mydbuser: psql (13.7) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. mydatabase=>