Loading...
MySQL 9.5 Reference Manual 9.5의 8.3.2 Encrypted Connection TLS Protocols and Ciphers의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MySQL은 여러 TLS 프로토콜과 암호화 스위트(cipher)를 지원하며, 암호화된 연결에 대해 허용할 프로토콜과 암호화 스위트를 구성할 수 있습니다. 또한 현재 세션이 사용하는 프로토콜과 암호화 스위트를 확인하는 것도 가능합니다.
MySQL 9.5는 연결에 대해 TLSv1.2와 TLSv1.3 프로토콜을 지원합니다. TLSv1.3을 사용하려면 MySQL 서버와 클라이언트 애플리케이션 모두 OpenSSL 1.1.1 이상을 사용하여 컴파일되어야 합니다. Group Replication 구성 요소는 MySQL 8.0.18부터 TLSv1.3을 지원합니다(자세한 내용은 Section 20.6.2, “Securing Group Communication Connections with Secure Socket Layer (SSL)” 참조).
MySQL 9.5는 오래된 TLSv1 및 TLSv1.1 프로토콜을 지원하지 않습니다.
허용되는 TLS 프로토콜은 서버 측과 클라이언트 측 모두에서 구성할 수 있으며, 지원되는 TLS 프로토콜 중 일부만 포함하도록 할 수 있습니다. 양쪽의 구성에는 최소한 하나의 공통된 프로토콜이 포함되어 있어야 하며, 그렇지 않으면 연결 시도에서 사용할 프로토콜을 협상할 수 없습니다. 자세한 내용은 Connection TLS Protocol Negotiation을 참조하십시오.
호스트 시스템에서 특정 TLS 프로토콜만 허용할 수 있으며, 이는 MySQL 자체에서 해당 프로토콜을 허용하더라도 호스트에서 허용하지 않는 프로토콜은 MySQL 연결에서 사용할 수 없음을 의미합니다. 이 문제에 대한 가능한 우회 방법은 다음과 같습니다:
/etc/ssl/openssl.cnf 파일이 있을 수 있습니다:1[system_default_sect] 2MinProtocol = TLSv1.3
값을 더 낮은 프로토콜 버전 또는 None으로 변경하면 시스템이 더 허용적으로 됩니다. 이 우회 방법은 더 낮은(보안 수준이 낮은) 프로토콜을 허용함으로써 보안상 부정적인 결과를 초래할 수 있다는 단점이 있습니다.
System-wide host configuration
MySQL 구성에서 TLSv1.2를 허용하고, 호스트 시스템 구성에서 TLSv1.2 이상만 사용하는 연결을 허용하는 경우, TLSv1.2만을 사용하여 MySQL 연결을 설정할 수 있습니다.
MySQL 구성에서 TLSv1.2를 허용하지만, 호스트 시스템 구성에서 TLSv1.3 이상만 사용하는 연결을 허용한다고 가정해 봅시다. 이 경우, MySQL에서 허용하는 프로토콜 중 어느 것도 호스트 시스템에서 허용되지 않으므로, MySQL 연결을 전혀 설정할 수 없습니다.
서버 측에서는 tls_version 시스템 변수의 값이 MySQL 서버가 암호화된 연결에 대해 허용하는 TLS 프로토콜을 결정합니다. tls_version 값은 클라이언트로부터의 연결, 이 서버 인스턴스가 소스인 일반 소스/레플리카 복제 연결, Group Replication 그룹 통신 연결, 그리고 이 서버 인스턴스가 도너인 Group Replication 분산 복구 연결에 적용됩니다. 관리용 연결 인터페이스도 유사하게 구성되지만, admin_tls_version 시스템 변수를 사용합니다(참조: Section 7.1.12.2, “Administrative Connection Management”). 이 논의는 admin_tls_version에도 적용됩니다.
tls_version 값은 하나 이상의 콤마로 구분된 TLS 프로토콜 버전 목록이며, 대소문자를 구분하지 않습니다. 기본적으로 이 변수에는 MySQL을 컴파일하는 데 사용한 SSL 라이브러리와 MySQL Server 릴리스에서 지원하는 모든 프로토콜이 나열됩니다. 따라서 기본 설정은 MySQL Server TLS Protocol Default Settings에 표시된 것과 같습니다.
런타임 시점에 tls_version 값을 확인하려면 다음 문장을 사용하십시오:
1mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version'; 2+---------------+-----------------------+ 3| Variable_name | Value | 4+---------------+-----------------------+ 5| tls_version | TLSv1.2,TLSv1.3 | 6+---------------+-----------------------+
tls_version 값을 변경하려면 서버 시작 시 설정하십시오. 예를 들어, TLSv1.2 또는 TLSv1.3 프로토콜을 사용하는 연결만 허용하고 다른 프로토콜을 사용하는 연결은 금지하려면, 서버 my.cnf 파일에 다음과 같은 줄을 사용하십시오:
1[mysqld] 2tls_version=TLSv1.2,TLSv1.3
더욱 엄격하게 하여 TLSv1.3 연결만 허용하려면, tls_version을 다음과 같이 설정하십시오:
1[mysqld] 2tls_version=TLSv1.3
tls_version는 런타임에 변경할 수 있습니다. Server-Side Runtime Configuration and Monitoring for Encrypted Connections을 참조하십시오.
클라이언트 측에서는 --tls-version 옵션이 클라이언트 프로그램이 서버와의 연결에 대해 허용하는 TLS 프로토콜을 지정합니다. 옵션 값의 형식은 앞에서 설명한 tls_version 시스템 변수와 동일합니다(하나 이상의 콤마로 구분된 프로토콜 버전 목록).
이 서버 인스턴스가 레플리카인 소스/레플리카 복제 연결의 경우, CHANGE REPLICATION SOURCE TO 문장의 SOURCE_TLS_VERSION 옵션이 레플리카가 소스와의 연결에 대해 허용하는 TLS 프로토콜을 지정합니다. 옵션 값의 형식은 앞에서 설명한 tls_version 시스템 변수와 동일합니다. Section 19.3.1, “Setting Up Replication to Use Encrypted Connections”을 참조하십시오.
SOURCE_TLS_VERSION에 지정할 수 있는 프로토콜은 SSL 라이브러리에 따라 달라집니다. 이 옵션은 서버 tls_version 값과 독립적이며 그 영향을 받지 않습니다. 예를 들어, 레플리카 역할을 하는 서버는 인커밍 연결에 대해 TLSv1.3만 허용하도록 tls_version을 TLSv1.3으로 설정하는 동시에, 소스로의 아웃고잉 레플리카 연결에 대해서는 TLSv1.2만 허용하도록 SOURCE_TLS_VERSION을 TLSv1.2로 설정할 수 있습니다.
이 서버 인스턴스가 분산 복구(즉, 클라이언트 역할)를 시작하는 조인 멤버인 Group Replication 분산 복구 연결의 경우, group_replication_recovery_tls_version 시스템 변수가 클라이언트가 허용하는 프로토콜을 지정합니다. 이 옵션 역시 서버 tls_version 값과 독립적이며, 이 서버 인스턴스가 도너일 때 적용되는 tls_version의 영향을 받지 않습니다. Group Replication 서버는 일반적으로 그룹 멤버십 기간 동안 도너와 조인 멤버 두 역할 모두로 분산 복구에 참여하므로, 이 두 시스템 변수를 모두 설정해야 합니다. Section 20.6.2, “Securing Group Communication Connections with Secure Socket Layer (SSL)”를 참조하십시오.
TLS 프로토콜 구성은 Connection TLS Protocol Negotiation에 설명된 대로 특정 연결이 사용하는 프로토콜에 영향을 줍니다.
허용되는 프로토콜 목록은 “hole”이 생기지 않도록 선택해야 합니다. 예를 들어, 다음 서버 구성 값은 hole이 없습니다:
1tls_version=TLSv1.2,TLSv1.3 2tls_version=TLSv1.3
Hole 금지 규칙은 클라이언트나 레플리카와 같은 다른 구성 컨텍스트에도 적용됩니다.
암호화된 연결을 비활성화하려는 의도가 아니라면, 허용되는 프로토콜 목록이 비어 있으면 안 됩니다. TLS 버전 파라미터를 빈 문자열로 설정하면 암호화된 연결을 설정할 수 없습니다:
tls_version: 서버는 암호화된 인커밍 연결을 허용하지 않습니다.
--tls-version: 클라이언트는 서버에 대한 암호화된 아웃고잉 연결을 허용하지 않습니다.
SOURCE_TLS_VERSION: 레플리카는 소스에 대한 암호화된 아웃고잉 연결을 허용하지 않습니다.
group_replication_recovery_tls_version:
조인 멤버는 분산 복구 연결에 대한 암호화된 연결을 허용하지 않습니다.
암호화된 연결에는 기본 암호화 스위트 집합이 적용되며, 허용되는 암호화 스위트를 명시적으로 구성하여 이를 재정의할 수 있습니다. 연결 설정 중에는 연결의 양쪽에서 일부 암호화 스위트를 공통적으로 허용해야 하며, 그렇지 않으면 연결이 실패합니다. 양쪽에서 공통적으로 허용되는 암호화 스위트 중에서, SSL 라이브러리는 제공된 인증서가 지원하며 우선순위가 가장 높은 암호화 스위트를 선택합니다.
TLSv1.2를 사용하는 암호화된 연결에 적용할 암호화 스위트를 하나 이상 지정하려면 다음을 수행하십시오:
서버 측에서 ssl_cipher 시스템 변수를 설정하고, 클라이언트 프로그램에서는 --ssl-cipher 옵션을 사용합니다.
이 서버 인스턴스가 소스인 일반 소스/레플리카 복제 연결의 경우, ssl_cipher 시스템 변수를 설정합니다. 이 서버 인스턴스가 레플리카인 경우에는 CHANGE REPLICATION SOURCE TO 문장의 SOURCE_SSL_CIPHER 옵션을 사용합니다. Section 19.3.1, “Setting Up Replication to Use Encrypted Connections”을 참조하십시오.
Group Replication 그룹 멤버의 경우, 이 서버 인스턴스가 도너인 Group Replication 그룹 통신 연결 및 Group Replication 분산 복구 연결에 대해서는 ssl_cipher 시스템 변수를 설정합니다. 이 서버 인스턴스가 조인 멤버인 Group Replication 분산 복구 연결에 대해서는 group_replication_recovery_ssl_cipher 시스템 변수를 사용합니다. Section 20.6.2, “Securing Group Communication Connections with Secure Socket Layer (SSL)”를 참조하십시오.
TLSv1.3을 사용하는 암호화된 연결의 경우, OpenSSL 1.1.1 이상은 다음과 같은 암호화 스위트를 지원하며, 이들은 모두 서버 시스템 변수 --tls-ciphersuites 또는 --admin-tls-ciphersuites에 대해 기본적으로 사용 가능하게(enabled) 설정되어 있습니다:
1TLS_AES_128_GCM_SHA256 2TLS_AES_256_GCM_SHA384 3TLS_CHACHA20_POLY1305_SHA256 4TLS_AES_128_CCM_SHA256
참고
MySQL 9.5에서 서버 시스템 변수 --tls-ciphersuites 또는 --admin-tls-ciphersuites에 TLS_AES_128_CCM_8_SHA256을 사용하면 폐기 예정(deprecation) 경고가 발생합니다.
허용되는 TLSv1.3 암호화 스위트를 명시적으로 구성하려면 다음 파라미터를 설정하십시오. 각 경우 구성 값은 하나 이상의 콜론으로 구분된 암호화 스위트 이름 목록입니다.
서버 측에서는 tls_ciphersuites 시스템 변수를 사용합니다. 이 변수가 설정되지 않은 경우 기본값은 NULL이며, 이는 서버가 기본 암호화 스위트 집합을 허용함을 의미합니다. 변수가 빈 문자열로 설정된 경우, 활성화된 암호화 스위트가 없으므로 암호화된 연결을 설정할 수 없습니다.
클라이언트 측에서는 --tls-ciphersuites 옵션을 사용합니다. 이 옵션이 설정되지 않은 경우 클라이언트는 기본 암호화 스위트 집합을 허용합니다. 옵션이 빈 문자열로 설정된 경우, 활성화된 암호화 스위트가 없으므로 암호화된 연결을 설정할 수 없습니다.
이 서버 인스턴스가 소스인 일반 소스/레플리카 복제 연결의 경우, tls_ciphersuites 시스템 변수를 사용합니다. 이 서버 인스턴스가 레플리카인 경우에는 CHANGE REPLICATION SOURCE TO 문장의 SOURCE_TLS_CIPHERSUITES 옵션을 사용합니다. Section 19.3.1, “Setting Up Replication to Use Encrypted Connections”을 참조하십시오.
Group Replication 그룹 멤버의 경우, 이 서버 인스턴스가 도너인 Group Replication 그룹 통신 연결과 Group Replication 분산 복구 연결에 대해서는 tls_ciphersuites 시스템 변수를 사용합니다. 이 서버 인스턴스가 조인 멤버인 Group Replication 분산 복구 연결에 대해서는 group_replication_recovery_tls_ciphersuites 시스템 변수를 사용합니다. Section 20.6.2, “Securing Group Communication Connections with Secure Socket Layer (SSL)”를 참조하십시오.
암호화 스위트 지원을 위해서는 MySQL 서버와 클라이언트 애플리케이션 모두 OpenSSL 1.1.1 이상으로 컴파일되어야 합니다.
특정 암호화 스위트는 특정 TLS 프로토콜에서만 동작할 수 있으며, 이는 TLS 프로토콜 협상 프로세스에 영향을 줍니다. Connection TLS Protocol Negotiation을 참조하십시오.
특정 서버가 어떤 암호화 스위트를 지원하는지 확인하려면, Ssl_cipher_list 상태 변수의 세션 값을 확인하십시오:
1SHOW SESSION STATUS LIKE 'Ssl_cipher_list';
Ssl_cipher_list 상태 변수에는 가능한 SSL 암호화 스위트가 나열됩니다(non-SSL 연결의 경우 비어 있음). MySQL이 TLSv1.3을 지원하는 경우, 값에는 가능한 TLSv1.3 암호화 스위트가 포함됩니다.
참고
ECDSA 암호화 스위트는 ECDSA를 디지털 서명에 사용하는 SSL 인증서와 함께 사용할 때만 동작하며, RSA를 사용하는 인증서와는 동작하지 않습니다. MySQL Server의 SSL 인증서 자동 생성 프로세스는 ECDSA로 서명된 인증서를 생성하지 않고, RSA로 서명된 인증서만 생성합니다. ECDSA 인증서를 사용할 수 있는 경우가 아니라면 ECDSA 암호화 스위트를 선택하지 마십시오.
TLSv1.3을 사용하는 암호화된 연결의 경우, MySQL은 SSL 라이브러리의 기본 암호화 스위트 목록을 사용합니다.
TLSv1.2를 사용하는 암호화된 연결의 경우, MySQL은 서버 시스템 변수 --ssl-cipher 및 --admin-ssl-cipher와 함께 사용할 때 다음과 같은 기본 암호화 스위트 목록을 SSL 라이브러리에 전달합니다.
1ECDHE-ECDSA-AES128-GCM-SHA256 2ECDHE-ECDSA-AES256-GCM-SHA384 3ECDHE-RSA-AES128-GCM-SHA256 4ECDHE-RSA-AES256-GCM-SHA384 5ECDHE-ECDSA-CHACHA20-POLY1305 6ECDHE-RSA-CHACHA20-POLY1305 7ECDHE-ECDSA-AES256-CCM 8ECDHE-ECDSA-AES128-CCM 9DHE-RSA-AES128-GCM-SHA256 10DHE-RSA-AES256-GCM-SHA384 11DHE-RSA-AES256-CCM 12DHE-RSA-AES128-CCM 13DHE-RSA-CHACHA20-POLY1305
다음과 같은 암호화 스위트 제한이 적용됩니다:
--ssl-cipher 및 --admin-ssl-cipher와 함께 사용하면 경고가 발생합니다:1ECDHE-ECDSA-AES128-SHA256 2ECDHE-RSA-AES128-SHA256 3ECDHE-ECDSA-AES256-SHA384 4ECDHE-RSA-AES256-SHA384 5DHE-DSS-AES128-GCM-SHA256 6DHE-RSA-AES128-SHA256 7DHE-DSS-AES128-SHA256 8DHE-DSS-AES256-GCM-SHA384 9DHE-RSA-AES256-SHA256 10DHE-DSS-AES256-SHA256 11ECDHE-RSA-AES128-SHA 12ECDHE-ECDSA-AES128-SHA 13ECDHE-RSA-AES256-SHA 14ECDHE-ECDSA-AES256-SHA 15DHE-DSS-AES128-SHA 16DHE-RSA-AES128-SHA 17TLS_DHE_DSS_WITH_AES_256_CBC_SHA 18DHE-RSA-AES256-SHA 19AES128-GCM-SHA256 20DH-DSS-AES128-GCM-SHA256 21ECDH-ECDSA-AES128-GCM-SHA256 22AES256-GCM-SHA384 23DH-DSS-AES256-GCM-SHA384 24ECDH-ECDSA-AES256-GCM-SHA384 25AES128-SHA256 26DH-DSS-AES128-SHA256 27ECDH-ECDSA-AES128-SHA256 28AES256-SHA256 29DH-DSS-AES256-SHA256 30ECDH-ECDSA-AES256-SHA384 31AES128-SHA 32DH-DSS-AES128-SHA 33ECDH-ECDSA-AES128-SHA 34AES256-SHA 35DH-DSS-AES256-SHA 36ECDH-ECDSA-AES256-SHA 37DH-RSA-AES128-GCM-SHA256 38ECDH-RSA-AES128-GCM-SHA256 39DH-RSA-AES256-GCM-SHA384 40ECDH-RSA-AES256-GCM-SHA384 41DH-RSA-AES128-SHA256 42ECDH-RSA-AES128-SHA256 43DH-RSA-AES256-SHA256 44ECDH-RSA-AES256-SHA384 45ECDHE-RSA-AES128-SHA 46ECDHE-ECDSA-AES128-SHA 47ECDHE-RSA-AES256-SHA 48ECDHE-ECDSA-AES256-SHA 49DHE-DSS-AES128-SHA 50DHE-RSA-AES128-SHA 51TLS_DHE_DSS_WITH_AES_256_CBC_SHA 52DHE-RSA-AES256-SHA 53AES128-SHA 54DH-DSS-AES128-SHA 55ECDH-ECDSA-AES128-SHA 56AES256-SHA 57DH-DSS-AES256-SHA 58ECDH-ECDSA-AES256-SHA 59DH-RSA-AES128-SHA 60ECDH-RSA-AES128-SHA 61DH-RSA-AES256-SHA 62ECDH-RSA-AES256-SHA 63DES-CBC3-SHA
1!DHE-DSS-DES-CBC3-SHA 2!DHE-RSA-DES-CBC3-SHA 3!ECDH-RSA-DES-CBC3-SHA 4!ECDH-ECDSA-DES-CBC3-SHA 5!ECDHE-RSA-DES-CBC3-SHA 6!ECDHE-ECDSA-DES-CBC3-SHA
1!aNULL 2!eNULL 3!EXPORT 4!LOW 5!MD5 6!DES 7!RC2 8!RC4 9!PSK 10!SSLv3
서버가 ssl_cert 시스템 변수를 위에 나열된 제한된 암호화 스위트 또는 암호화 스위트 범주를 사용하는 인증서로 설정하여 시작되면, 서버는 암호화된 연결 지원이 비활성화된 상태로 시작됩니다.
MySQL에서의 연결 시도는 연결 양쪽에서 모두 사용 가능하고, 양쪽 모두에서 프로토콜-호환 암호화 스위트가 사용 가능한 가장 높은 TLS 프로토콜 버전의 사용을 협상합니다. 협상 프로세스는 서버와 클라이언트를 컴파일하는 데 사용된 SSL 라이브러리, TLS 프로토콜 및 암호화 스위트 구성, 사용되는 키 크기와 같은 요소에 따라 달라집니다:
연결 시도가 성공하려면, 서버와 클라이언트 TLS 프로토콜 구성에서 공통으로 허용되는 프로토콜이 있어야 합니다.
마찬가지로, 서버와 클라이언트 암호화 스위트 구성에도 공통으로 허용되는 암호화 스위트가 있어야 합니다. 특정 암호화 스위트는 특정 TLS 프로토콜에서만 동작할 수 있으므로, 협상 프로세스에서 사용 가능한 프로토콜은 호환 암호화 스위트도 존재할 때에만 선택됩니다.
TLSv1.3이 사용 가능하다면 가능한 경우 TLSv1.3이 사용됩니다(이는 서버와 클라이언트 구성이 모두 TLSv1.3을 허용해야 하며, 양쪽 모두 TLSv1.3과 호환되는 암호화 스위트를 허용해야 함을 의미합니다). 그렇지 않으면 MySQL은 사용 가능한 프로토콜 목록을 계속 검사하여, 가능하면 TLSv1.2를 사용하고, 그 다음 프로토콜로 진행합니다. 협상은 보안 수준이 더 높은 프로토콜에서 낮은 프로토콜 순으로 진행됩니다. 협상 순서는 프로토콜이 구성된 순서와는 무관합니다. 예를 들어, tls_version의 값이 TLSv1.2,TLSv1.3이든 TLSv1.3,TLSv1.2이든 협상 순서는 동일합니다.
보안을 향상하려면 최소 2048-bit RSA 키 크기를 사용하는 인증서를 사용하십시오.
서버와 클라이언트에 공통으로 허용되는 프로토콜과 해당 프로토콜과 호환되는 암호화 스위트가 하나도 없는 경우, 서버는 연결 요청을 종료합니다.
MySQL에서는 지원할 프로토콜 목록을 지정할 수 있습니다. 이 목록은 기반 SSL 라이브러리에 그대로 전달되며, 최종적으로는 제공된 목록에서 어떤 프로토콜을 실제로 활성화할지는 해당 라이브러리에 달려 있습니다. SSL 라이브러리가 이를 어떻게 처리하는지에 대한 정보는 MySQL 소스 코드와 OpenSSL SSL_CTX_new() 설명서를 참조하십시오.
현재 클라이언트 세션이 사용하는 암호화 TLS 프로토콜과 암호화 스위트를 확인하려면, Ssl_version 및 Ssl_cipher 상태 변수의 세션 값을 확인하십시오:
1mysql> SELECT * FROM performance_schema.session_status 2 WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher'); 3+---------------+---------------------------+ 4| VARIABLE_NAME | VARIABLE_VALUE | 5+---------------+---------------------------+ 6| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 | 7| Ssl_version | TLSv1.2 | 8+---------------+---------------------------+
연결이 암호화되지 않은 경우, 두 변수 값은 비어 있습니다.
8.3.1 Configuring MySQL to Use Encrypted Connections
8.3.3 Creating SSL and RSA Certificates and Keys