PostgreSQL DB 인스턴스와 함께 SSL 사용 - Amazon Relational Database Service

PostgreSQL DB 인스턴스와 함께 SSL 사용

Amazon RDS는 PostgreSQL DB 인스턴스를 위한 SSL 암호화를 지원합니다. SSL을 사용하여 애플리케이션과 PostgreSQL DB 인스턴스 사이의 PostgreSQL 연결을 암호화할 수 있습니다. 기본적으로 RDS for PostgreSQL는 모든 클라이언트가 SSL/TLS를 사용하여 연결하기를 기대하지만 사용자가 이를 요구할 수도 있습니다. RDS for PostgreSQL은 전송 계층 보안(TLS) 버전 1.1, 1.2 및 1.3을 지원합니다.

SSL 지원 및 PostgreSQL 데이터베이스에 대한 일반적인 정보는 PostgreSQL 설명서의 SSL 지원을 참조하세요. JDBC를 통한 SSL 연결 사용에 대한 자세한 내용은 PostgreSQL 설명서에서 클라이언트 구성을 참조하세요.

모든 AWS 리전에서 PostgreSQL에 대한 SSL 지원 기능을 사용할 수 있습니다. Amazon RDS는 PostgreSQL DB 인스턴스가 생성될 때 해당 인스턴스의 SSL 인증서를 만듭니다. SSL 인증서 확인을 활성화하는 경우에는 SSL 인증서에 스푸핑 공격으로부터 보호해주는 SSL 인증서를 위한 일반 이름(CN)으로 DB 인스턴스 엔드포인트가 포함됩니다.

SSL을 통해 PostgreSQL DB 인스턴스에 연결

SSL을 통해 PostgreSQL DB 인스턴스에 연결하려면
  1. 인증서를 다운로드합니다.

    인증서 다운로드에 대한 자세한 내용은 SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터에 대한 연결 암호화 단원을 참조하세요.

  2. SSL을 통해 PostgreSQL DB 인스턴스에 연결합니다.

    SSL을 사용하여 연결하면 클라이언트가 인증서 체인을 확인할지 선택할 수 있습니다. 연결 파라미터가 sslmode=verify-ca 또는 sslmode=verify-full을 지정하면, 클라이언트는 RDS CA 인증서를 트러스트 스토어에 있거나 연결 URL에서 참조되게 할 것을 요구합니다. 이 요구 사항은 데이터베이스 인증서에 서명하는 인증서 체인을 확인하는 것입니다.

    psql 또는 JDBC와 같은 클라이언트가 SSL을 지원하도록 구성되어 있는 경우 클라이언트는 먼저 SSL을 이용해 데이터베이스에 연결을 시도하도록 기본 설정되어 있습니다. SSL을 이용해 연결할 수 없는 경우 클라이언트는 SSL 없이 연결하는 방식으로 전환됩니다. libpq 기반 클라이언트(예: psql)와 JDBC에서 사용되는 기본 sslmode 모드는 서로 다릅니다. libpq 기반 클라이언트는 prefer로 기본 설정되어 있고, JDBC 클라이언트는 verify-full로 기본 설정되어 있습니다.

    sslrootcert 파라미터를 사용하여 인증서를 참조합니다(예: sslrootcert=rds-ssl-ca-cert.pem).

다음은 psql을 사용하여 인증서 확인과 함께 SSL을 사용하여 PostgreSQL DB 인스턴스에 연결하는 예입니다.

$ psql "host=db-name.555555555555.ap-southeast-1.rds.amazonaws.com port=5432 dbname=testDB user=testuser sslrootcert=rds-ca-rsa2048-g1.pem sslmode=verify-full"

PostgreSQL DB 인스턴스에 SSL 연결 요구

rds.force_ssl 파라미터를 사용하여 PostgreSQL DB 인스턴스에 대한 연결이 SSL을 사용하도록 요구할 수 있습니다. RDS for PostgreSQL 버전 15 이상의 rds.force_ssl 파라미터 기본값은 1(켜짐)입니다. 다른 모든 RDS for PostgreSQL 메이저 버전 14 이상에는 이 파라미터의 기본값이 0(꺼짐)입니다. rds.force_ssl 파라미터를 1(설정)로 설정하면 해당 DB 클러스터에 대한 연결 시 SSL/TLS를 요구합니다. rds.force_ssl 파라미터를 1(설정)로 설정하면 해당 DB 인스턴스에 대한 연결에 대해 SSL을 요구합니다.

이 파라미터의 값을 변경하려면 사용자 지정 DB 파라미터 그룹을 생성해야 합니다. 그런 다음 사용자 지정 DB 파라미터 그룹의 rds.force_ssl 값을 1로 변경하여 이 기능을 켭니다. RDS for PostgreSQL DB 인스턴스를 생성하기 전에 사용자 지정 DB 파라미터 그룹을 준비하는 경우 생성 과정 중에 기본 파라미터 그룹 대신 선택할 수 있습니다. RDS for PostgreSQL DB 인스턴스가 이미 실행된 후에 이 작업을 수행하는 경우 인스턴스가 사용자 지정 파라미터 그룹을 사용하도록 인스턴스를 재부팅해야 합니다. 자세한 정보는 Amazon RDS의 파라미터 그룹의 내용을 참조하세요.

DB 인스턴스에서 rds.force_ssl 기능이 활성화된 경우 SSL을 사용하지 않는 연결 시도는 다음 메시지와 함께 거부됩니다.

$ psql -h db-name.555555555555.ap-southeast-1.rds.amazonaws.com port=5432 dbname=testDB user=testuser psql: error: FATAL: no pg_hba.conf entry for host "w.x.y.z", user "testuser", database "testDB", SSL off

SSL 연결 상태 확인

DB 인스턴스에 연결할 때 로그온 배너에 연결의 암호화된 상태가 표시됩니다.

Password for user master: psql (10.3) SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) Type "help" for help. postgres=>

또한, sslinfo 확장을 로드한 다음 ssl_is_used() 함수를 호출하여 SSL이 사용 중인지 확인할 수 있습니다. 이 함수는 연결이 SSL을 사용할 경우 t을 반환하고, 그렇지 않으면 f를 반환합니다.

postgres=> CREATE EXTENSION sslinfo; CREATE EXTENSION postgres=> SELECT ssl_is_used(); ssl_is_used --------- t (1 row)

자세한 정보를 보려면 다음 쿼리를 사용하여 pg_settings에서 정보를 얻을 수 있습니다.

SELECT name as "Parameter name", setting as value, short_desc FROM pg_settings WHERE name LIKE '%ssl%'; Parameter name | value | short_desc ----------------------------------------+-----------------------------------------+------------------------------------------------------- ssl | on | Enables SSL connections. ssl_ca_file | /rdsdbdata/rds-metadata/ca-cert.pem | Location of the SSL certificate authority file. ssl_cert_file | /rdsdbdata/rds-metadata/server-cert.pem | Location of the SSL server certificate file. ssl_ciphers | HIGH:!aNULL:!3DES | Sets the list of allowed SSL ciphers. ssl_crl_file | | Location of the SSL certificate revocation list file. ssl_dh_params_file | | Location of the SSL DH parameters file. ssl_ecdh_curve | prime256v1 | Sets the curve to use for ECDH. ssl_key_file | /rdsdbdata/rds-metadata/server-key.pem | Location of the SSL server private key file. ssl_library | OpenSSL | Name of the SSL library. ssl_max_protocol_version | | Sets the maximum SSL/TLS protocol version to use. ssl_min_protocol_version | TLSv1.2 | Sets the minimum SSL/TLS protocol version to use. ssl_passphrase_command | | Command to obtain passphrases for SSL. ssl_passphrase_command_supports_reload | off | Also use ssl_passphrase_command during server reload. ssl_prefer_server_ciphers | on | Give priority to server ciphersuite order. (14 rows)

또한 다음 쿼리를 사용하여 프로세스, 클라이언트 및 애플리케이션별로 RDS for PostgreSQL DB 인스턴스의 SSL 사용량에 대한 모든 정보를 수집할 수도 있습니다.

SELECT datname as "Database name", usename as "User name", ssl, client_addr, application_name, backend_type FROM pg_stat_ssl JOIN pg_stat_activity ON pg_stat_ssl.pid = pg_stat_activity.pid ORDER BY ssl; Database name | User name | ssl | client_addr | application_name | backend_type ---------------+-----------+-----+----------------+------------------------+------------------------------ | | f | | | autovacuum launcher | rdsadmin | f | | | logical replication launcher | | f | | | background writer | | f | | | checkpointer | | f | | | walwriter rdsadmin | rdsadmin | t | 127.0.0.1 | | client backend rdsadmin | rdsadmin | t | 127.0.0.1 | PostgreSQL JDBC Driver | client backend postgres | postgres | t | 204.246.162.36 | psql | client backend (8 rows)

SSL 연결에 사용되는 암호를 식별하기 위해 다음과 같이 쿼리할 수 있습니다.

postgres=> SELECT ssl_cipher(); ssl_cipher -------------------- DHE-RSA-AES256-SHA (1 row)

sslmode 옵션에 대한 자세한 내용은 PostgreSQL 설명서데이터베이스 연결 제어 기능을 참조하세요.

RDS for PostgreSQL의 SSL 암호 제품군

PostgreSQL 구성 파라미터 ssl_ciphers는 SSL 연결에 허용되는 암호 모음의 범주를 지정합니다. 다음 표에는 RDS for PostgreSQL에서 사용되는 기본 암호 모음이 나와있습니다.

PostgreSQL 엔진 버전 번호 암호 그룹
16 HIGH:!aNULL:!3DES
15 HIGH:!aNULL:!3DES
14 HIGH:!aNULL:!3DES
13 HIGH:!aNULL:!3DES
12 HIGH:!aNULL:!3DES
11.4 이상 마이너 버전 HIGH:MEDIUM:+3DES:!aNULL:!RC4
11.1, 11.2 HIGH:MEDIUM:+3DES:!aNULL
10.9 이상 마이너 버전 HIGH:MEDIUM:+3DES:!aNULL:!RC4
10.7 이하 마이너 버전 HIGH:MEDIUM:+3DES:!aNULL