SSL 연결을 사용해 Amazon RDS 인스턴스에 성공적으로 연결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 10월 25일

Secure Socket Layer(SSL) 연결을 사용하여 Amazon Relational Database Service(Amazon RDS) DB 인스턴스에 연결하고 싶습니다.

간략한 설명

애플리케이션의 SSL 또는 전송 계층 보안(TLS)을 사용하여 MySQL, MariaDB, Microsoft SQL Server, Oracle 또는 PostgreSQL을 실행하는 DB 인스턴스에 대한 연결을 암호화할 수 있습니다. SSL/TLS 연결은 클라이언트와 DB 인스턴스 간에 전송되는 데이터를 암호화하여 단일 보안 계층을 제공합니다. 서버 인증서는 Amazon RDS DB 인스턴스에 대한 연결이 이루어지고 있는지 확인하여 추가 보안 계층을 제공합니다.

DB 인스턴스를 프로비저닝하면 Amazon RDS가 SSL 인증서를 생성하고 인스턴스에 인증서를 설치합니다. 이러한 인증서는 인증 기관에서 서명합니다. SSL 인증서에는 DB 인스턴스 엔드포인트가 SSL 인증서의 일반 이름으로 포함되어 스푸핑 공격으로부터 인스턴스를 보호합니다. Amazon RDS에서 생성한 SSL 인증서는 대부분의 경우 작동하는 신뢰할 수 있는 루트 엔터티입니다. 그러나 애플리케이션에서 인증서 체인을 허용하지 않으면 인증서가 실패할 수 있습니다. 이 경우 중간 인증서를 사용하여 AWS 리전에 연결해야 할 수 있습니다. 예를 들어 SSL을 사용해 AWS GovCloud(미국) 리전에 연결하려면 중간 인증서를 사용해야 합니다.

AWS Trust Services에서 모든 AWS 리전에 대한 중간 인증서와 루트 인증서가 모두 포함된 인증서 번들을 다운로드할 수 있습니다. 애플리케이션이 Microsoft Windows에 있고 PKCS7 파일이 필요한 경우 Amazon Trust Services에서 PKCS7 인증서 번들을 다운로드할 수 있습니다. 이 번들에는 중간 인증서와 루트 인증서가 모두 포함되어 있습니다.

해결 방법

각 데이터베이스 엔진에는 SSL/TLS를 구현하는 자체 프로세스가 있습니다. DB 클러스터에 대한 SSL/TLS 연결을 구현하려면 데이터베이스 엔진에 따라 다음 옵션 중 하나를 선택합니다.

Amazon RDS for Oracle

Amazon RDS for Oracle 인스턴스의 경우 사용자 지정 옵션 그룹에서 SSL 옵션을 추가하여 SSL 모드를 켤 수 있습니다.

Amazon 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을 사용하여 Amazon 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가 사용되며 서버만 인증할 수 있습니다. 따라서 한 방향으로만 인증이 가능합니다. 그러나 암호화는 여전히 양방향으로 가능합니다. 서버 인증서 확인을 통해 클라이언트는 인증서가 서버에 속해 있는지 확인합니다.

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;

연결이 암호화되었는지 확인하려면 다음 쿼리 중 하나를 실행합니다.

MariaDB > status;
MariaDB > SHOW VARIABLES LIKE 'have_ssl';

Amazon RDS for MySQL

Amazon RDS for MySQL, TLS 버전 1.0, 1.1 및 1.2. 지원

Amazon RDS for MySQL는 다음 버전에서 보안 연결을 위해 YaSL을 사용합니다.

  • MySQL 버전 5.7.19 및 이전 5.7 버전
  • MySQL 버전 5.6.37 및 이전 5.6 버전

MySQL은 다음 버전에서 보안 연결을 위해 OpenSSL을 사용합니다.

  • MySQL 버전 8.0
  • MySQL 버전 5.7.21 및 이상 5.7 버전
  • MySQL 버전 5.6.39 및 이상 5.6 버전

기본적으로 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;

MySQL 5.6 및 이전 버전의 경우:

GRANT USAGE ON *.* TO 'testuser'@'%' REQUIRE SSL;

연결이 암호화되었는지 확인하려면 다음 쿼리 중 하나를 실행합니다.

mysql> status;
mysql> SHOW VARIABLES LIKE 'have_ssl';

Amazon RDS for Microsoft SQL Server

다음 방법 중 하나를 사용하여 SSL을 사용하여 SQL Server DB 인스턴스에 연결할 수 있습니다.

  • 모든 연결에 SSL 강제 적용: 이 방법을 사용하면 연결이 클라이언트에 투명하게 이루어 지며 클라이언트는 SSL을 사용하기 위해 작업을 수행할 필요가 없습니다. 이 옵션을 사용하려면 rds.force_ssl 파라미터를 1(켜짐)으로 설정합니다. 기본적으로 rds.force_ssl 파라미터는 0(꺼짐)으로 설정됩니다. rds.force_ssl 파라미터는 정적입니다. 따라서 값을 변경한 후 변경 사항을 적용하려면 DB 인스턴스를 재부팅해야 합니다.
  • 특정 연결 암호화: 이 방법은 특정 클라이언트 컴퓨터에서 SSL 연결을 설정하며 클라이언트에서 연결을 암호화해야 합니다.

다른 SQL 클라이언트의 연결을 암호화하려면 연결 문자열에 encrypt=true를 추가합니다. 이 문자열은 GUI 도구의 연결 페이지에서 옵션 또는 속성으로 사용할 수 있습니다.

다음 쿼리를 실행하여 연결이 암호화되었는지 확인합니다.

SELECT ENCRYPT_OPTION FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID;

쿼리가 encrypt_option에 대해 참(true)을 반환하는지 확인합니다.

참고: JDBC를 사용하여 연결하는 클라이언트에 대해 SSL 암호화를 활성화하려면 Amazon RDS SQL 인증서를 Java CA 인증서(cacerts) 스토어에 추가해야 할 수 있습니다. Keytool 유틸리티를 사용하여 이 작업을 수행할 수 있습니다.

Amazon RDS for PostgreSQL

Amazon RDS는 PostgreSQL DB 인스턴스에 대한 SSL 암호화를 지원합니다. SSL을 사용하면 애플리케이션과 PostgreSQL DB 인스턴스 간의 PostgreSQL 연결을 암호화할 수 있습니다. 또한 PostgreSQL DB 인스턴스에 대한 모든 연결이 SSL을 사용하도록 강제할 수 있습니다. Amazon RDS for PostgreSQL, TLS 버전 1.1 및 1.2 지원

SSL을 통해 Amazon RDS for PostgreSQL DB 인스턴스에 연결하기 전에 다음을 수행하십시오.

  1. 인증서를 다운로드합니다.
  2. 인증서를 운영 체제로 가져옵니다.

자세한 내용은 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"

또한 사용자 지정 파라미터 그룹에서 rds.force_ssl1(켜짐)로 설정하여 RDS for PostgreSQL 인스턴스 SSL 사용에 대한 연결을 구성할 수 있습니다. 기본적으로 이 값은 0(꺼짐)으로 설정됩니다.

rds.force_ssl을 1(켜짐)로 설정하면 DB 인스턴스의 pg_hba.conf 파일이 새 SSL 구성을 지원하도록 수정됩니다. pg_hba_file_rules 보기를 사용하여 pg_hba.conf 파일의 내용 요약을 볼 수 있습니다.

rds.force_ssl을 0(꺼짐)으로 설정하면 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(켜짐)로 설정하면 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(켜짐)로 설정된 후에 line_number(13)의 유형 값이 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
$

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?