SSL 연결을 사용하여 Amazon RDS 인스턴스에 성공적으로 연결하려면 어떻게 해야 합니까?
Secure Socket Layer(SSL) 연결을 사용하여 Amazon Relational Database Service(Amazon RDS) DB 인스턴스에 연결하려고 합니다.
간략한 설명
MySQL, MariaDB, Microsoft SQL Server, Oracle 또는 PostgreSQL을 실행하는 DB 인스턴스에 대한 연결을 암호화하려면 애플리케이션에서 SSL 또는 Transport Layer Security(TLS)를 사용하십시오. SSL/TLS 연결은 클라이언트와 DB 인스턴스 간에 전송되는 데이터를 암호화하므로 한 계층의 보안을 제공합니다. 서버 인증서는 Amazon RDS DB 인스턴스에 대한 연결이 진행되고 있는지 검증하므로 추가적인 보안 계층을 제공합니다.
DB 인스턴스를 프로비저닝하면 Amazon RDS가 SSL 인증서를 생성하고 인스턴스에 해당 인증서를 설치합니다. 이러한 인증서는 인증 기관(CA)에서 서명합니다. SSL 인증서에는 스푸핑 공격으로부터 인스턴스를 보호하기 위한 SSL 인증서의 일반 이름으로 DB 인스턴스 엔드포인트가 포함됩니다. Amazon RDS에서 생성한 SSL 인증서는 신뢰할 수 있는 루트 엔터티이며 대부분의 사례에서 작동합니다. 하지만 애플리케이션이 인증서 체인을 허용하지 않는 경우 인증서가 실패할 수 있습니다. 이런 경우에는 중간 인증서를 사용하여 AWS 리전에 연결하십시오. 예를 들어 SSL을 사용하여 AWS GovCloud(미국) 리전에 연결할 때는 중간 인증서를 사용해야 합니다.
AWS Trust Services에서 모든 리전의 중간 인증서와 루트 인증서를 모두 포함하는 인증서 번들을 다운로드할 수 있습니다. 애플리케이션이 Microsoft Windows에 있고 PKCS7 파일이 필요한 경우 Amazon Trust Services에서 PKCS7 인증서 번들을 다운로드할 수 있습니다. 이 번들에는 중간 인증서와 루트 인증서가 모두 포함되어 있습니다.
해결 방법
각 데이터베이스 엔진에는 SSL/TLS를 구현하는 자체 프로세스가 있습니다. DB 클러스터에 대한 SSL/TLS 연결을 구현하려면 데이터베이스 엔진에 따라 다음 방법 중 하나를 사용하십시오.
Amazon RDS for Oracle
Amazon RDS for Oracle 인스턴스의 경우 SSL 모드를 켜려면 사용자 지정 옵션 그룹에 SSL 옵션을 추가하십시오.
RDS for Oracle은 TLS 버전 1.0과 1.2를 지원합니다. Oracle SSL 옵션을 사용하려면 옵션 그룹에서 SQLNET.SSL_VERSION 옵션 설정을 사용하십시오. 이 옵션 설정에는 다음과 같은 값이 허용됩니다.
- "1.0" - 클라이언트가 TLS 1.0만 사용하여 DB 인스턴스에 연결할 수 있습니다.
- "1.2" - 클라이언트가 TLS 1.2만 사용하여 DB 인스턴스에 연결할 수 있습니다.
- "1.2 또는 1.0" - 클라이언트가 TLS 1.2 또는 1.0을 사용하여 DB 인스턴스에 연결할 수 있습니다.
기존 Oracle SSL 옵션의 경우 SQLNET.SSL_VERSION이 자동으로 “1.0"으로 설정됩니다. 필요한 경우 설정을 변경할 수 있습니다.
Oracle SSL 옵션을 사용하는 Oracle DB 인스턴스에 연결하기 전에 먼저 SSL을 사용하도록 SQL*Plus 클라이언트를 구성해야 합니다. JDBC를 통한 SSL 연결을 사용하려면 키스토어를 생성하고 Amazon RDS 루트 CA 인증서를 신뢰한 다음, SSL 연결을 구성해야 합니다.
JDBC를 사용하여 SSL 연결을 설정하는 예제 코드:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class OracleSslConnectionTest { private static final String DB_SERVER_NAME = "example-dns"; private static final Integer SSL_PORT = "example-ssl-option-port-in-option-group"; private static final String DB_SID = "example-oracle-sid"; private static final String DB_USER = "example-username"; private static final String DB_PASSWORD = "example-password"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "example-file-path-to-keystore"; private static final String KEY_STORE_PASS = "example-keystore-password"; public static void main(String[] args) throws SQLException { final Properties properties = new Properties(); final String connectionString = String.format( "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SID=%s)))", DB_SERVER_NAME, SSL_PORT, DB_SID); properties.put("example-username", DB_USER); properties.put("example-password", DB_PASSWORD); properties.put("oracle.jdbc.J2EE13Compliant", "true"); properties.put("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); properties.put("javax.net.ssl.trustStoreType", "JKS"); properties.put("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); final Connection connection = DriverManager.getConnection(connectionString, properties); // If there is no exception, it means that an SSL connection can be opened } }
SSL을 사용하여 RDS for Oracle 인스턴스에 연결하기 전에 다음을 확인하십시오.
- RDS 루트 인증서가 다운로드되어 지갑 파일에 추가되었습니다. 이 파일은 sqlnet.ora 파일에 WALLET_LOCATION 파라미터로 지정된 디렉터리에 저장됩니다.
- TNS 항목에 올바른 SSL 포트 번호가 있습니다.
- Amazon RDS 보안 그룹이 SSL 포트를 통해 시스템으로부터의 인바운드 연결을 허용하도록 구성되어 있습니다.
- 방화벽 또는 보안 정책이 Amazon RDS의 SSL 포트에서 트래픽을 허용하도록 적절하게 구성되어 있습니다.
Amazon RDS for MariaDB
Amazon RDS for MariaDB는 TLS 버전 1.0, 1.1, 1.2 및 1.3을 지원합니다. 단방향 TLS 연결에서는 클라이언트 인증서 없이 TLS가 사용되며 서버만 인증할 수 있습니다. 따라서 인증은 한 방향으로만 가능합니다. 그러나 암호화는 여전히 양방향으로 가능합니다. 자세한 내용은 MariaDB 웹사이트에서 MariaDB 클라이언트에 대한 단방향 TLS 활성화를 참조하십시오.
클라이언트는 서버 인증서 확인을 통해 인증서가 서버에 속하는지 확인합니다. 자세한 내용은 MariaDB 웹사이트에서 서버 인증서 확인을 참조하십시오.
RDS 인증서로 MySQL 5.7 이상 클라이언트를 실행하려면 다음과 유사한 명령을 실행하십시오.
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY
RDS 인증서로 MariaDB 클라이언트를 실행하려면 다음과 유사한 명령을 실행하십시오.
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert
특정 사용자 또는 계정에 대한 SSL 연결을 요구하려면 MariaDB 버전을 기반으로 다음 쿼리를 실행하십시오.
ALTER USER 'test'@'%' REQUIRE SSL;
성능 스키마가 켜져 있고 데이터베이스 인스턴스에 연결된 애플리케이션이 있는 RDS for MariaDB 버전 10.5 이상의 경우 SSL/TLS를 사용하는 연결을 확인하십시오.
MariaDB> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;
참고: 성능 스키마에 대한 자세한 내용은 MariaDB 웹사이트에서 성능 스키마를 참조하십시오.
Amazon RDS for MySQL
MySQL은 보안 연결을 위해 OpenSSL을 사용합니다. 자세한 내용은 Amazon RDS에서 MySQL DB 인스턴스에 대한 SSL/TLS 지원을 참조하십시오.
기본적으로 MySQL 클라이언트 프로그램은 서버가 암호화된 연결을 지원할 경우 암호화된 연결을 설정하려고 시도합니다. 추가적인 보안을 위해 --ssl-ca 파라미터를 사용하여 DB 인스턴스 엔드포인트를 일반 이름으로 포함하는 SSL 인증서를 참조하십시오. SSL 인증서는 스푸핑 공격으로부터 인스턴스를 보호합니다.
MySQL 5.7 이상에서 --ssl-ca 파라미터를 사용하여 클라이언트를 시작하려면 다음과 유사한 명령을 실행하십시오.
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-mode=VERIFY_IDENTITY
특정 사용자 또는 계정에 대한 SSL 연결을 요구하려면 MySQL 버전을 기반으로 다음과 유사한 명령을 실행하십시오.
mysql -h myinstance.123456789012.rds-us-east-1.amazonaws.com -u testuser -p --ssl-ca=[full path]global-bundle.pem --ssl-verify-server-cert
MySQL 5.7 이상의 경우 다음 명령을 실행하십시오.
ALTER USER 'testuser'@'%' REQUIRE SSL;
성능 스키마가 켜져 있고 데이터베이스 인스턴스에 연결된 애플리케이션이 있는 RDS for MySQL 버전 5.7 또는 8.0의 경우 SSL/TLS를 사용하는 연결을 확인하십시오.
mysql> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;
참고: 성능 스키마에 대한 자세한 내용은 MariaDB 웹사이트에서 성능 스키마를 참조하십시오.
Amazon RDS for Microsoft SQL Server
SSL을 사용하여 RDS for Microsoft SQL Server DB 인스턴스에 연결하려면 모든 연결에 SSL을 강제 적용하거나 특정 연결을 암호화할 수 있습니다.
다른 SQL 클라이언트의 연결을 암호화하려면 연결 문자열에 encrypt=true를 추가합니다. 이 문자열은 GUI 도구의 연결 페이지에서 옵션 또는 속성으로 사용할 수 있습니다.
연결이 암호화되었는지 확인하려면 다음 쿼리를 실행하십시오.
SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID;
쿼리가 encrypt_option에 대해 true를 반환하는지 확인합니다.
참고: JDBC를 사용하여 연결하는 클라이언트에 대해 SSL 암호화를 활성화하려면 Java CA 인증서(cacerts) 스토어에 RDS SQL 인증서를 추가해야 할 수 있습니다. 이 작업을 수행하려면 keytool 유틸리티를 사용하십시오.
Amazon RDS for PostgreSQL
Amazon RDS는 PostgreSQL DB 인스턴스에 대한 SSL 암호화를 지원합니다. 자세한 내용은 PostgreSQL DB 인스턴스에서 SSL 사용을 참조하십시오.
SSL을 통해 RDS for PostgreSQL DB 인스턴스에 연결하기 전에 다음 단계를 완료하십시오.
- 인증서를 다운로드합니다.
- 운영 체제로 인증서를 가져옵니다.
자세한 내용은 SSL을 통해 PostgreSQL DB 인스턴스에 연결을 참조하십시오.
인증서를 참조하려면 sslrootcert 파라미터를 사용하십시오. 예를 들어 sslrootcert=rds-ssl-ca-cert.pem과 같이 사용합니다.
psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=verify-full sslrootcert=global-bundle.pem"
SSL을 사용하도록 RDS for PostgreSQL 인스턴스에 대한 연결을 구성하려면 사용자 지정 파라미터 그룹에서 rds.force_ssl을 **1(on)**로 설정합니다. 기본적으로 이 값은 **0(off)**으로 설정됩니다.
rds.force_ssl을 **1(on)**로 설정하면 DB 인스턴스의 pg_hba.conf 파일이 새 SSL 구성을 지원하도록 수정됩니다. pg_hba.conf 파일의 요약 내용을 보려면 pg_hba_file_rules 보기를 사용합니다. 자세한 내용은 PostgreSQL 웹사이트에서 pg_hba_file_rules를 참조하십시오.
rds.force_ssl을 **0(off)**으로 설정하는 경우 pg_hba.conf 파일은 다음과 비슷하게 표시됩니다.
SELECT * FROM pg_hba_file_rules; line_number | type | database | user_name | address | netmask | auth_method | options | error -------------+-------+-------------------+------------+----------+---------+-------------+---------+------- 4 | local | {all} | {all} | | | md5 | | 10 | host | {all} | {rdsadmin} | samehost | | md5 | | 11 | host | {all} | {rdsadmin} | all | | reject | | 12 | host | {rdsadmin} | {all} | all | | reject | | 13 | host | {all} | {all} | all | | md5 | | 14 | host | {replication} | {all} | samehost | | md5 | | 15 | host | {rds_replication} | {all} | all | | md5 | | (7 rows)
rds.force_ssl을 **1(on)**로 설정하는 경우 pg_hba.conf 파일은 다음과 비슷하게 표시됩니다.
SELECT * FROM pg_hba_file_rules; line_number | type | database | user_name | address | netmask | auth_method | options | error -------------+---------+-------------------+------------+----------+---------+-------------+---------+------- 4 | local | {all} | {all} | | | md5 | | 10 | host | {all} | {rdsadmin} | samehost | | md5 | | 11 | host | {all} | {rdsadmin} | all | | reject | | 12 | host | {rdsadmin} | {all} | all | | reject | | 13 | hostssl | {all} | {all} | all | | md5 | | 14 | host | {replication} | {all} | samehost | | md5 | | 15 | hostssl | {rds_replication} | {all} | all | | md5 | |
참고: rds.force_ssl이 **1(on)**로 설정된 후 line_number (13)의 type 값이 hostssl로 업데이트될 수 있습니다.
인스턴스에서 SSL 연결을 활성화하고 RDS for PostgreSQL 인스턴스에 대한 연결을 시작하면 다음과 비슷한 메시지가 표시됩니다.
psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg"
. . . SL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) Type "help" for help.
SSL이 아닌 모든 연결은 다음 메시지와 함께 거부됩니다.
psql "host=myinstance.123456789012.rds-us-east-1.amazonaws.com port=5432 user=testuser dbname=testpg sslmode=disable"psql: FATAL: no pg_hba.conf entry for host "host.ip", user "testuser", database "testpg", SSL off
관련 정보

관련 콘텐츠
- 질문됨 일 년 전lg...
- AWS 공식업데이트됨 일 년 전