PostgreSQL 14: TLS 연결

요약



PostgreSQL을 외부 데이터베이스 서버로 사용하려면 TLS/SSL 연결을 사용하는 것이 좋습니다. 이 게시물은 인증서 생성, 서버 구성 및 확인 방법을 보여줍니다.

3 단계 만 있습니다.
  • 서버 인증서 준비
  • 자체 서명된 인증서 생성
  • (선택 사항) 클라이언트가 확인할 CA 서명 인증서 생성

  • 서버 구성 파일 편집
  • postgresql.conf: 편집 옵션, listen_address/ssl
  • pg_hba.conf: hostssl 정의 추가

  • 클라이언트 시스템에서 확인
  • sslmode
  • 와 함께 psql 사용


    환경



  • OpenBSD 7.1
  • PostgreSQL 14.2

  • 참조


  • "ssl-tcp"에 대한 공식 문서: 14 , current

  • 지도 시간



    1. 서버 인증서 준비



    자체 서명된 인증서 생성



    PostgreSQL 데이터 디렉터리에 _postgresql 사용자로 서버 인증서를 만듭니다.

    $ doas su - _postgresql
    $ whoami
    _postgresql
    
    $ cd /var/postgresql/data
    


    openssl 명령줄 도구를 사용하여 자체 서명된 인증서를 만듭니다.
    물론 아래 -days 36500는 수정할 수 있습니다. 즉, 36500일 = 거의 100년 이내에 유효합니다.

    $ # ksh
    $ DB_HOST_DOMAIN="(...)"
    $ openssl req -new -x509 -days 36500 -nodes -text -out server.crt -keyout server.key -subj "/CN=$DB_HOST_DOMAIN"
    


    결과는 다음과 같습니다.

    Generating a 2048 bit RSA private key
    ..............................................................................+++++
    ................+++++
    writing new private key to 'server.key'
    -----
    


    당신은 볼 수 있습니다:

    $ ls -l server\.*
    -rw-r--r--  1 _postgresql  _postgresql  3660 Apr 24 13:17 server.crt
    -rw-r--r--  1 _postgresql  _postgresql  1704 Apr 24 13:17 server.key
    


    키 권한 수정:

    $ chmod 400 server.key
    


    /var/postgresql/data에서 _postgresql로 유지합니다.

    (선택 사항) 클라이언트가 확인할 CA 서명 인증서 생성



    망설이지 않고/etc/ssl/openssl.cnf를 편집하여 v3_ca 확장을 사용하면 클라이언트에서 ID를 확인할 수 있는 서버 인증서를 만들 수 있습니다. 루트 및 중간 인증서를 생성합니다. 편집에 대한 자세한 내용은 the official docs에 있습니다.

    $ # create a certificate signing request (CSR) and a public/private key file
    $ openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=$ROOT_CA_DOMAIN"
    $ chmod 400 root.key
    
    $ # create a root certificate authority
    $ openssl x509 -req -in root.csr -text -days 36500 -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey root.key -out root.crt
    $ # ... might be end with "Error Loading extension section v3_ca"
    
    $ # create a server certificate signed by the new root certificate authority
    $ openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=$DB_HOST_DOMAIN"
    $ chmod 400 server.key
    
    $ openssl x509 -req -in server.csr -text -days 36500 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt
    


    여기에서 "Error Loading extension section v3_ca"를 만날 수 있습니다. 이 경우 this post 다음에 /etc/ssl/openssl.cnf를 수정해 보십시오.

    $ ls {root,server}*
    root.crt   root.csr   root.key   root.srl   server.crt server.csr server.key
    


    2. 서버 구성 파일 편집



    귀하는 /var/postgresql/data(으)로 _postgres에 있습니다. 오른쪽?

    $ whoami
    _postgresql
    $ pwd  
    /var/postgresql/data
    


    postgresql.conf 편집:

    $ nvim postgresql.conf
    


    원격 클라이언트의 요청과 SSL 연결을 활성화하려면 다음을 수행하십시오.

      #listen_addresses = 'localhost' ...
    + listen_addresses = '*'
      ...
      #port = 5432
    + port = {$DB_PORT} # (optional) for security
      ...
      #ssl = off
    + ssl = on
      #ssl_cert_file = 'server.crt'
      #ssl_ca_file = ''
      #ssl_crl_file = ''
      #ssl_key_file = 'server.key'
    


    또한 자체 서명되지 않은 인증서를 사용하고 root.crt가 있는 경우 ssl_ca_file를 채워야 합니다.

    다음으로 pg_hba.conf를 편집합니다.

    $ nvim pg_hba.conf
    


    클라이언트에서 SSL 연결을 허용하기 위해 맨 아래에 줄hostssl을 추가하려면 다음을 수행하십시오.

    + hostssl all             all             0.0.0.0/0               md5
    


    14부터는 자체 서명된 인증서를 사용할 때 clientcert를 0으로 설정할 필요가 없습니다. "auth-options" 중 하나이며 유효한 클라이언트 인증서가 있는 경우 verify-ca 또는 verify-full로 설정할 수 있습니다. , 1(defalut, then)/0/no-verify로 설정할 수 있습니다.

    게다가 도중에 무언가 실패할 때/var/postgresql/logfile은 세부 정보를 얻는 데 확실히 유용합니다.

    사용자에게 돌아가 보겠습니다.

    $ # end of behavior as _postgresql
    $ exit
    


    데이터베이스 서버를 다시 시작합니다.

    $ doas rcctl restart postgresql
    


    완료.

    3. 클라이언트 시스템에서 확인



    클라이언트 시스템에서 "sslmode=require"와 함께 psql 을 사용합니다.

    $ psql "sslmode=require host=$DB_HOST port=$DB_PORT user=$DB_USER dbname=$DB_NAME"
    Password for user ...: 
    


    db 사용자의 암호를 입력하십시오.

    psql (14.2)
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
    Type "help" for help.
    
    postgres=#
    


    여기서 "프로토콜: TLSv1.3"등을 기반으로 TLS 연결을 획득합니다 :)

    좋은 웹페이지 즐겨찾기