3.3. MySQL 서버에서 TLS 암호화 설정
기본적으로 MySQL 은 암호화되지 않은 연결을 사용합니다. 보안 연결의 경우 MySQL 서버에서 TLS 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성합니다.
3.3.1. MySQL 서버에 CA 인증서, 서버 인증서 및 개인 키 배치
MySQL 서버에서 TLS 암호화를 활성화하려면 먼저 CA(인증 기관) 인증서, 서버 인증서 및 MySQL 서버에 개인 키를 저장합니다.
사전 요구 사항
Privacy Enhanced Mail (PEM) 형식의 다음 파일이 서버에 복사되었습니다.
-
서버의 개인 키:
server.example.com.key.pem
-
서버 인증서:
server.example.com.crt.pem
-
CA(인증 기관) 인증서:
ca.crt.pem
개인 키 및 CSR(인증서 서명 요청) 생성 및 CA에서 인증서 요청에 대한 자세한 내용은 CA 문서를 참조하십시오.
-
서버의 개인 키:
절차
CA 및 서버 인증서를
/etc/pki/tls/certs/
디렉터리에 저장합니다.# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/
MySQL 서버가 파일을 읽을 수 있도록 하는 CA 및 서버 인증서에 대한 권한을 설정합니다.
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
인증서는 보안 연결을 설정하기 전에 통신의 일부이므로 모든 클라이언트는 인증 없이 검색할 수 있습니다. 따라서 CA 및 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.
서버의 개인 키를
/etc/pki/tls/private/
디렉터리에 저장합니다.# mv <path>/server.example.com.key.pem /etc/pki/tls/private/
서버의 개인 키에 보안 권한을 설정합니다.
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
권한이 없는 사용자가 개인 키에 액세스할 수 있는 경우 MySQL 서버에 대한 연결이 더 이상 안전하지 않습니다.
SELinux 컨텍스트를 복원하십시오.
# restorecon -Rv /etc/pki/tls/
3.3.2. MySQL 서버에서 TLS 구성
보안을 강화하려면 MySQL 서버에서 TLS 지원을 활성화합니다. 결과적으로 클라이언트는 TLS 암호화를 사용하여 서버로 데이터를 전송할 수 있습니다.
사전 요구 사항
- MySQL 서버를 설치했습니다.
-
mysqld
서비스가 실행 중입니다. Privacy Enhanced Mail (PEM) 형식의 다음 파일은 서버에 있으며
mysql
사용자가 읽을 수 있습니다.-
서버의 개인 키:
/etc/pki/tls/private/server.example.com.key.pem
-
서버 인증서:
/etc/pki/tls/certs/server.example.com.crt.pem
-
CA(인증 기관) 인증서
/etc/pki/tls/certs/ca.crt.pem
-
서버의 개인 키:
- 서버 인증서의 주체 고유 이름(DN) 또는 subject alternatives name(SAN) 필드는 서버의 호스트 이름과 일치합니다.
절차
/etc/my.cnf.d/mysql-server-tls.cnf
파일을 만듭니다.다음 콘텐츠를 추가하여 개인 키, 서버 및 CA 인증서에 대한 경로를 구성합니다.
[mysqld] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pem
CRL(Certificate Revocation List)이 있는 경우 이를 사용하도록 MySQL 서버를 구성합니다.
ssl_crl = /etc/pki/tls/certs/example.crl.pem
선택 사항: 암호화 없이 연결 시도를 거부합니다. 이 기능을 활성화하려면 다음을 추가합니다.
require_secure_transport = on
선택 사항: 서버가 지원해야 하는 TLS 버전을 설정합니다. 예를 들어 TLS 1.2 및 TLS 1.3을 지원하려면 다음을 추가합니다.
tls_version = TLSv1.2,TLSv1.3
기본적으로 서버는 TLS 1.1, TLS 1.2 및 TLS 1.3을 지원합니다.
mysqld
서비스를 다시 시작합니다.# systemctl restart mysqld
검증
문제 해결을 간소화하려면 TLS 암호화를 사용하도록 로컬 클라이언트를 구성하기 전에 MySQL 서버에서 다음 단계를 수행합니다.
이제 MySQL 에 TLS 암호화가 활성화되어 있는지 확인합니다.
# mysql -u root -p -h <MySQL_server_hostname> -e "SHOW session status LIKE 'Ssl_cipher';" +---------------+------------------------+ | Variable_name | Value | +---------------+------------------------+ | Ssl_cipher | TLS_AES_256_GCM_SHA384 | +---------------+------------------------+
특정 TLS 버전만 지원하도록 MySQL 서버를 구성한 경우
tls_version
변수를 표시합니다.# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tls_version | TLSv1.2,TLSv1.3 | +---------------+-----------------+
서버가 올바른 CA 인증서, 서버 인증서 및 개인 키 파일을 사용하는지 확인합니다.
# mysql -u root -e "SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP '^ssl_ca|^ssl_cert|^ssl_key';" +-----------------+-------------------------------------------------+ | Variable_name | Value | +-----------------+-------------------------------------------------+ | ssl_ca | /etc/pki/tls/certs/ca.crt.pem | | ssl_capath | | | ssl_cert | /etc/pki/tls/certs/server.example.com.crt.pem | | ssl_key | /etc/pki/tls/private/server.example.com.key.pem | +-----------------+-------------------------------------------------+
3.3.3. 특정 사용자 계정에 대해 TLS 암호화 연결 필요
중요한 데이터에 액세스할 수 있는 사용자는 항상 TLS 암호화 연결을 사용하여 네트워크를 통해 암호화되지 않은 데이터를 전송하지 않도록 해야 합니다.
모든 연결(에서 required_secure_transport =)에 보안 전송이 필요한
서버에서 를 구성할 수 없는 경우 TLS 암호화가 필요하도록 개별 사용자 계정을 구성합니다.
사전 요구 사항
- MySQL 서버에는 TLS 지원이 활성화되어 있습니다.
- 보안 전송을 요구하도록 구성하는 사용자가 있습니다.
- CA 인증서는 클라이언트에 저장됩니다.
절차
관리 사용자로 MySQL 서버에 연결합니다.
# mysql -u root -p -h server.example.com
관리 사용자에게 원격으로 서버에 액세스할 수 있는 권한이 없는 경우 MySQL 서버에서 명령을 수행하고
localhost
에 연결합니다.REQUIRE SSL
절을 사용하여 사용자가 TLS 암호화 연결을 사용하여 연결해야 함을 적용합니다.MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
검증
TLS 암호화를 사용하여 서버에
예제
사용자로 연결합니다.# mysql -u example -p -h server.example.com ... MySQL [(none)]>
오류가 표시되지 않고 대화형 MySQL 콘솔에 액세스할 수 있는 경우 TLS와의 연결에 성공합니다.
기본적으로 클라이언트는 서버에서 제공하는 경우 TLS 암호화를 자동으로 사용합니다. 따라서
--ssl-ca=ca.crt.pem
및--ssl-mode=VERIFY_IDENTITY
옵션은 필요하지 않지만 이러한 옵션을 사용하여 클라이언트는 서버 ID를 확인하므로 보안을 개선합니다.TLS가 비활성화된
예제
사용자로 연결을 시도합니다.# mysql -u example -p -h server.example.com --ssl-mode=DISABLED ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
이 사용자에게는 TLS가 필요하지만 비활성화됨(
--ssl-mode=DISABLED
)이므로 서버에서 로그인 시도를 거부했습니다.
추가 리소스