새 TLS 인증서를 사용하여 Aurora MySQL DB 클러스터에 연결할 애플리케이션 업데이트 - Amazon Aurora

새 TLS 인증서를 사용하여 Aurora MySQL DB 클러스터에 연결할 애플리케이션 업데이트

2023년 1월 13일부터 Amazon RDS는 전송 계층 보안(TLS)을 사용하여 Aurora DB 클러스터에 연결하기 위한 용도의 새 인증 기관(CA) 인증서를 게시했습니다. 아래에서 새 인증서를 사용하기 위해 애플리케이션을 업데이트하는 방법에 관한 정보를 찾으실 수 있습니다.

이 주제는 클라이언트 애플리케이션에서 TLS를 사용하여 DB 클러스터에 연결하는지 여부를 판단하는 데 도움이 됩니다. SSL/TLS를 사용해 연결한다면 이 애플리케이션에서 연결 시 인증서 확인이 필요한지 여부를 추가로 확인할 수 있습니다.

참고

어떤 애플리케이션은 서버에서 인증서를 성공적으로 확인할 수 있는 경우에만 Aurora MySQL DB 클러스터에 연결하도록 구성되어 있습니다.

이러한 애플리케이션의 경우 클라이언트 애플리케이션 트러스트 스토어를 업데이트하여 새 CA 인증서를 포함해야 합니다.

클라이언트 애플리케이션 트러스트 스토어에서 CA 인증서를 업데이트한 후에는 DB 클러스터에서 인증서를 교환할 수 있습니다. 이 절차를 프로덕션 환경에서 구현하기 전에 개발 또는 스테이징 환경에서 테스트해볼 것을 적극 권장합니다.

인증서 교환에 대한 자세한 내용은 SSL/TLS 인증서 교체 단원을 참조하십시오. 인증서 다운로드에 대한 자세한 내용은 SSL/TLS를 사용하여 DB 클러스터에 대한 연결 암호화 단원을 참조하십시오. Aurora MySQL DB 클러스터에서 TLS를 사용하는 방법에 대한 자세한 내용은 Aurora MySQL DB 클러스터에서 TLS 사용 섹션을 참조하세요.

애플리케이션에서 TLS를 사용하여 Aurora MySQL DB 클러스터에 연결하는지 여부 확인

Aurora MySQL 버전 2(MySQL 5.7과 호환됨)를 사용 중이고 성능 스키마가 활성화되어 있는 경우 다음 쿼리를 실행하여 연결 시 TLS를 사용하는지 여부를 확인합니다. 성능 스키마 활성화에 대한 자세한 내용은 MySQL 설명서의 성능 스키마 빠른 시작을 참조하십시오.

mysql> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;

이 샘플 출력에서는 사용자 본인의 세션(admin)과 webapp1로 로그인된 애플리케이션에서 모두 TLS를 사용 중임을 알 수 있습니다.

+----+-----------------+------------------+-----------------+ | id | user | host | connection_type | +----+-----------------+------------------+-----------------+ | 8 | admin | 10.0.4.249:42590 | SSL/TLS | | 4 | event_scheduler | localhost | NULL | | 10 | webapp1 | 159.28.1.1:42189 | SSL/TLS | +----+-----------------+------------------+-----------------+ 3 rows in set (0.00 sec)

클라이언트에서 연결 시 인증서 확인이 필요한지 여부 확인

JDBC 클라이언트 및 MySQL 클라이언트에서 연결 시 인증서 확인이 필요한지 여부를 확인할 수 있습니다.

JDBC

아래의 MySQL 커넥터/J 8.0 관련 예시에서는 애플리케이션의 JDBC 연결 속성을 확인하여 성공적인 연결을 위해 유효한 인증서가 필요한지 여부를 판단하는 한 가지 방법을 보여줍니다. MySQL에 대한 모든 JDBC 연결 옵션에 대한 자세한 내용은 MySQL 문서의 구성 속성을 참조하십시오.

MySQL 커넥터/J 8.0을 사용 중인 경우 다음 예제와 같이 연결 속성에서 sslModeVERIFY_CA 또는 VERIFY_IDENTITY로 설정되어 있다면 TLS 연결 시 서버 CA 인증서에 대한 확인이 필요합니다.

Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD);
참고

데이터베이스에 연결할 때 TLS를 사용하도록 애플리케이션을 명시적으로 구성하지 않았더라도 MySQL Java Connector v5.1.38 이상 또는 MySQL Java Connector v8.0.9 이상을 사용하여 데이터베이스에 연결하는 경우, 이러한 클라이언트 드라이버는 기본적으로 TLS를 사용합니다. 또한 TLS 사용 시 부분 인증서 확인을 수행하고 데이터베이스 서버 인증서가 만료되면 연결에 실패합니다.

MySQL

MySQL 클라이언트에 관한 다음 예시에서는 스크립트의 MySQL 연결을 확인하여 성공적인 연결을 위해 유효한 인증서가 필요한지 여부를 판단하는 두 가지 방법을 보여줍니다. MySQL 클라이언트의 모든 연결 옵션에 대한 자세한 내용은 MySQL 문서의 암호화된 연결을 위한 클라이언트 측 구성을 참조하십시오.

MySQL 5.7 또는 MySQL 8.0 클라이언트를 사용 중인 경우 다음 예제와 같이 --ssl-mode 옵션에 대해 VERIFY_CA 또는 VERIFY_IDENTITY를 지정했다면 TLS 연결 시 서버 CA 인증서에 대한 확인이 필요합니다.

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-mode=VERIFY_CA

MySQL 5.6 클라이언트를 사용 중인 경우 다음 예시와 같이 --ssl-verify-server-cert 옵션을 지정했다면 SSL 연결 시 서버 CA 인증서에 대한 확인이 필요합니다.

mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-verify-server-cert

애플리케이션 트러스트 스토어 업데이트

MySQL 애플리케이션을 위한 트러스트 스토어 업데이트에 관한 자세한 내용은 MySQL 문서의 SSL 인증서 설치 단원을 참조하십시오.

참고

트러스트 스토어를 업데이트할 때 새 인증서를 추가할 뿐 아니라 이전 인증서를 유지할 수도 있습니다.

JDBC를 위한 애플리케이션 트러스트 스토어 업데이트

TLS 연결을 위해 JDBC를 사용하는 애플리케이션에 대해 트러스트 스토어를 업데이트할 수 있습니다.

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

인증서를 가져오는 샘플 스크립트는 트러스트 스토어로 인증서를 가져오기 위한 샘플 스크립트 섹션을 참조하세요.

애플리케이션에서 mysql JDBC를 사용 중인 경우 애플리케이션에서 다음 속성을 설정하십시오.

System.setProperty("javax.net.ssl.trustStore", certs); System.setProperty("javax.net.ssl.trustStorePassword", "password");
참고

보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

애플리케이션을 시작할 때 다음 속성을 설정하십시오.

java -Djavax.net.ssl.trustStore=/path_to_truststore/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_truststore_password com.companyName.MyApplication

TLS 연결 설정을 위한 Java 코드 예제

다음 코드 예시에서는 JDBC를 사용하여 서버 인증서를 확인하는 SSL 연결을 설정하는 방법을 보여줍니다.

public class MySQLSSLTest { private static final String DB_USER = "user name"; private static final String DB_PASSWORD = "password"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "file-path-to-keystore"; private static final String KEY_STORE_PASS = "keystore-password"; public static void test(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); System.setProperty("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); Connection connection = DriverManager.getConnection("jdbc:mysql://jagdeeps-ssl-test.cni62e2e7kwh.us-east-1.rds.amazonaws.com:3306",properties); Statement stmt=connection.createStatement(); ResultSet rs=stmt.executeQuery("SELECT 1 from dual"); return; } }
중요

데이터베이스 연결에서 TLS를 사용함을 확인하고 애플리케이션 트러스트 스토어를 업데이트한 후에는 데이터베이스에서 rds-ca-rsa2048-g1 인증서를 사용하도록 업데이트할 수 있습니다. 지침은 DB 인스턴스를 수정하여 CA 인증서 업데이트의 3단계를 참조하십시오.