검색

4.4. PostgreSQL 서버에서 TLS 암호화 구성

download PDF

기본적으로 PostgreSQL 은 암호화되지 않은 연결을 사용합니다. 보다 안전한 연결의 경우 PostgreSQL 서버에서 TLS(Transport Layer Security) 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성할 수 있습니다.

사전 요구 사항

절차

  1. OpenSSL 라이브러리를 설치합니다.

    # dnf install openssl
  2. TLS 인증서 및 키를 생성합니다.

    # openssl req -new -x509 -days 365 -nodes -text -out server.crt \
      -keyout server.key -subj "/CN=dbhost.yourdomain.com"

    dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 교체합니다.

  3. 서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.

    # cp server.{key,crt} /var/lib/pgsql/data/.
  4. 서명된 인증서와 개인 키의 소유자 및 그룹 소유권을 postgres 사용자로 변경합니다.

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
  5. 소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.

    # chmod 0400 /var/lib/pgsql/data/server.key
  6. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경하여 암호 해시 알고리즘을 scram-sha-256 으로 설정합니다.

    #password_encryption = md5              # md5 or scram-sha-256

    다음으로 변경합니다.

    password_encryption = scram-sha-256
  7. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경하여 SSL/TLS를 사용하도록 PostgreSQL을 구성합니다.

    #ssl = off

    다음으로 변경합니다.

    ssl=on
  8. /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 를 사용자 이름으로 바꿉니다.

  9. postgresql 서비스를 다시 시작하여 변경 사항을 적용합니다.

    # systemctl restart postgresql.service

검증

  • 연결이 암호화되었는지 수동으로 확인하려면 다음을 수행하십시오.

    1. PostgreSQL 데이터베이스에 mydbuser 사용자로 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.

      $ psql -U mydbuser -h 127.0.0.1 -d mydatabase
      Password for user mydbuser:

      mydatabase 를 데이터베이스 이름으로 바꾸고 mydbuser 를 사용자 이름으로 바꿉니다.

    2. 현재 데이터베이스 연결에 대한 정보를 가져옵니다.

      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 옵션을 사용하여 컴파일할 pq 라이브러리를 로드해야 합니다. 예를 들어 GCC 컴파일러를 사용하여 애플리케이션을 컴파일하려면 다음을 수행합니다.

    $ gcc source_file.c -lpq -o myapplication

    여기서 source_file.c 에는 위의 예제 코드가 포함되어 있으며 myapplication 은 보안 PostgreSQL 연결을 확인하는 애플리케이션의 이름입니다.

예 4.4. TLS 암호화를 사용하여 PostgreSQL 데이터베이스 초기화, 생성 및 연결

이 예제에서는 PostgreSQL 데이터베이스를 초기화하고, 데이터베이스 사용자와 데이터베이스를 생성하며, 보안 연결을 사용하여 데이터베이스에 연결하는 방법을 보여줍니다.

  1. PosgreSQL 서버를 설치합니다.

    # dnf install postgresql-server
  2. 데이터베이스 클러스터를 초기화합니다.

    # postgresql-setup --initdb
    * Initializing database in '/var/lib/pgsql/data'
    * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
  3. OpenSSL 라이브러리를 설치합니다.

    # dnf install openssl
  4. TLS 인증서 및 키를 생성합니다.

    # openssl req -new -x509 -days 365 -nodes -text -out server.crt \
      -keyout server.key -subj "/CN=dbhost.yourdomain.com"

    dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 교체합니다.

  5. 서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.

    # cp server.{key,crt} /var/lib/pgsql/data/.
  6. 서명된 인증서와 개인 키의 소유자 및 그룹 소유권을 postgres 사용자로 변경합니다.

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
  7. 소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.

    # chmod 0400 /var/lib/pgsql/data/server.key
  8. 암호 해시 알고리즘을 scram-sha-256 로 설정합니다. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경합니다.

    #password_encryption = md5              # md5 or scram-sha-256

    다음으로 변경합니다.

    password_encryption = scram-sha-256
  9. SSL/TLS를 사용하도록 PostgreSQL을 구성합니다. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경합니다.

    #ssl = off

    다음으로 변경합니다.

    ssl=on
  10. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service
  11. postgres 라는 시스템 사용자로 로그인합니다.

    # su - postgres
  12. postgres 사용자로 PostgreSQL 대화형 터미널을 시작합니다.

    $ psql -U postgres
    psql (13.7)
    Type "help" for help.
    
    postgres=#
  13. mydbuser 라는 사용자를 생성하고 mydbuser 의 암호를 설정합니다.

    postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd';
    CREATE ROLE
    postgres=#
  14. mydatabase 라는 데이터베이스를 만듭니다.

    postgres=# CREATE DATABASE mydatabase;
    CREATE DATABASE
    postgres=#
  15. mydbuser 사용자에게 모든 권한을 부여합니다.

    postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser;
    GRANT
    postgres=#
  16. 대화형 터미널에서 로그아웃합니다.

    postgres=# \q
  17. postgres 사용자 세션에서 로그아웃합니다.

    $ logout
  18. /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
  19. postgresql 서비스를 다시 시작하여 변경 사항을 적용합니다.

    # systemctl restart postgresql.service
  20. 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=>
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.