웹사이트 검색

PostgreSQL 연결에 SSL을 활성화하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - PostgreSQL 14 설치
  4. 3단계 - SSL 설치
  5. 4단계 - PostgreSQL용 Certbot 갱신 구성
  6. 5단계 - PostgreSQL 구성
  7. 6단계 - PostgreSQL 연결 구성
  8. 7단계 - 인증서 갱신
  9. 8단계 - 연결 테스트
  10. 9단계 - 클라이언트 확인\n
  11. 결론

기본적으로 모든 PostgreSQL 연결은 안전하지 않으므로 트래픽이 많은 프로덕션 환경에서 실행할 때 보안 문제가 발생할 수 있습니다. SSL 암호화는 전송된 모든 데이터가 연결 중간에 있는 사람에 의해 가로채지 않도록 합니다.

이 자습서에서는 PostgreSQL 연결에 SSL/TLS를 활성화하는 방법을 알려줍니다.

전제 조건

  • A Linux server. For our tutorial, we are running a Ubuntu 22.04 server.

  • A non-root sudo user.

  • A fully qualified domain name (FQDN) like postgresql.example.com.

  • Make sure everything is updated.

    $ sudo apt update
    $ sudo apt upgrade
    
  • Few packages that your system needs.

    $ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -y
    

    Some of these packages may already be installed on your system.

1단계 - 방화벽 구성

패키지를 설치하기 전에 첫 번째 단계는 HTTP, HTTPS 및 PostgreSQL용 포트를 열도록 방화벽을 구성하는 것입니다.

방화벽의 상태를 확인하십시오.

$ sudo ufw status

다음과 같은 내용이 표시되어야 합니다.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

방화벽에서 HTTP, HTTPS 및 PostgreSQL 포트를 엽니다.

$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https

상태를 다시 확인하여 확인하십시오.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
5432                       ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)
5432 (v6)                  ALLOW       Anywhere (v6)             

2단계 - PostgreSQL 14 설치

Ubuntu 22.04는 기본적으로 PostgreSQL 14와 함께 제공됩니다. 설치하려면 다음 명령을 실행하십시오.

$ sudo apt install postgresql postgresql-contrib

postgresql-contrib 패키지에는 몇 가지 추가 유틸리티가 포함되어 있습니다.

PostgreSQL의 공식 APT 리포지토리를 사용하여 설치할 수도 있습니다. 다음 명령을 실행하여 PostgreSQL GPG 키를 추가합니다.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

소스 목록에 APT 저장소를 추가하십시오.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

시스템 저장소를 업데이트하십시오.

$ sudo apt update

이제 위에서 언급한 명령을 사용하여 PostgreSQL을 설치할 수 있습니다.

PostgreSQL 서비스의 상태를 확인하십시오.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago
   Main PID: 3497 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.

서비스가 기본적으로 활성화되어 실행되고 있음을 알 수 있습니다.

postgres 계정의 암호를 설정합니다.

$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '<new_password>';"

3단계 - SSL 설치

Lets Encrypt를 사용하여 SSL 인증서를 설치하려면 Certbot 도구를 다운로드해야 합니다. 이를 위해 Snapd 패키지 설치 프로그램을 사용합니다. Ubuntu 22.04는 Snap과 함께 사전 설치되어 제공됩니다.

Snapd 버전이 최신인지 확인하세요.

$ sudo snap install core 
$ sudo snap refresh core

Certbot을 설치합니다.

$ sudo snap install --classic certbot

다음 명령을 사용하여 /usr/bin 디렉터리에 대한 심볼릭 링크를 생성하여 Certbot 명령이 실행되도록 합니다.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL 인증서를 생성합니다.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d postgresql.example.com

위의 명령은 서버의 /etc/letsencrypt/live/postgresql.example.com 디렉토리에 인증서를 다운로드합니다.

Diffie-Hellman 그룹 인증서를 생성합니다.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

4단계 - PostgreSQL용 Certbot 갱신 구성

PostgreSQL에는 Lets Encrypt 폴더의 인증서에 액세스할 수 있는 권한이 없으므로 폴더의 인증서를 직접 사용하도록 지시할 수 없습니다. 대안은 인증서를 PostgreSQL 디렉토리에 복사하는 것이지만 인증서가 만료되어 수동으로 다시 복사해야 하므로 일시적으로만 작동합니다.

가장 좋은 방법은 갱신할 때마다 자동으로 실행되고 복사 작업을 수행하는 갱신 후크를 사용하는 것입니다.

PostgreSQL 데이터 디렉터리를 찾습니다.

$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'

갱신 후크 파일을 생성하고 편집을 위해 엽니다.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

다음 코드를 붙여넣습니다.

#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# only for SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

파일을 실행 가능하게 만드십시오.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

5단계 - PostgreSQL 구성

PostgreSQL 구성 파일의 경로를 찾습니다.

$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'

편집할 파일을 엽니다.

$ sudo nano /etc/postgresql/15/main/postgresql.conf

연결 설정 섹션을 찾아 listen_address 변수의 주석 처리를 제거하고 해당 값을 *로 변경합니다. 다음과 같이 표시되는지 확인합니다.

listen_address = '*'		# what IP address(es) to listen on;

SSL 섹션을 찾고 다음 값과 일치하도록 파일을 편집합니다.

ssl = on  
ssl_cert_file = 'server.crt'  
ssl_key_file = 'server.key'  
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

6단계 - PostgreSQL 연결 구성

편집을 위해 /etc/postgresql/15/main/pg_hba.conf 파일을 엽니다.

$ sudo nano /etc/postgresql/15/main/pg_hba.conf

PostgreSQL용 SSL을 활성화하려면 다음 줄을 추가합니다.

hostssl all  all  0.0.0.0/0  scram-sha-256

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

7단계 - 인증서 갱신

강제 갱신을 수행하려면 다음 명령을 실행하십시오. 이렇게 하면 PostgreSQL이 사용할 올바른 위치에 인증서를 복사하는 배포 스크립트가 트리거됩니다.

$ sudo certbot renew --force-renewal

인증서가 PostgreSQL 데이터 디렉터리에 복사되었는지 확인합니다.

$ sudo ls /var/lib/postgresql/15/main/

인증서를 표시하는 다음 출력이 표시됩니다.

base          pg_dynshmem   pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf  server.crt
global        pg_logical    pg_replslot  pg_stat       pg_tblspc    pg_wal      postmaster.opts       server.key
pg_commit_ts  pg_multixact  pg_serial    pg_stat_tmp   pg_twophase  pg_xact     postmaster.pid

변경 사항을 적용하려면 PostgreSQL을 다시 시작하십시오.

$ sudo systemctl restart postgresql

8단계 - 연결 테스트

PostgreSQL 클라이언트가 설치된 다른 컴퓨터에서 데이터베이스에 연결합니다.

$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres

다음 PostgreSQL 프롬프트가 표시되어야 합니다. PostgreSQL 14 클라이언트와 함께 클라이언트를 사용하고 있으므로 호환되지 않는 버전에 대한 경고가 표시됩니다.

Password for user postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), server 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
WARNING: psql major version 14, server major version 15.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

이는 성공적인 SSL 연결을 확인합니다.

쉘을 종료합니다.

postgres=# \q

앱에서 연결 문자열을 사용하는 경우 SSL 연결을 위해 다음 형식으로 사용합니다.

postgres://user::5432/database_name?sslmode=require

SSL 모드를 verify-full 또는 verify-ca로 변경할 수 있습니다. system>/var/lib/postgresql/.postgresql 클라이언트 측 위치.

/var/lib/postgresql/.postgresql 디렉터리를 만듭니다.

$ sudo mkdir -p /var/lib/postgresql/.postgresql

Lets Encrypt 루트 인증서는 서버의 /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt 위치에 있는 ISRG Root X1입니다.

루트 인증서를 /var/lib/postgresql/.postgresql 디렉터리에 복사합니다.

$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt

verify-full 또는 verify-ca 모드를 사용하여 연결을 테스트하면 성공적인 연결이 표시되어야 합니다.

9단계 - 클라이언트 확인

서버의 PostgreSQL 셸에 로그인합니다.

$ sudo -i -u postgres psql

다음 SQL 명령을 실행하여 연결된 클라이언트를 확인하십시오.

SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;

비슷한 출력이 표시되어야 합니다.

 pid  | usename  | datname  | ssl | version |         cipher         | bits |  client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
 5126 | postgres | postgres | t   | TLSv1.3 | TLS_AES_256_GCM_SHA384 |  256 | 122.161.84.220
 5154 | postgres | postgres | f   |         |                        |      |
(2 rows)

이것은 서버 측에서 클라이언트 연결을 확인합니다.

결론

이것으로 PostgreSQL 연결에서 SSL 활성화에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.