본문 바로가기
서버구축 (WEB,DB)

MariaDB/MySQL 데이타 전송 시 암호화 통신 SQL Proxy 적용

by 날으는물고기 2023. 10. 15.

MariaDB/MySQL 데이타 전송 시 암호화 통신 SQL Proxy 적용

ProxySQL TLS/SSL For RDS MySQL Backend - ShellKode Blog

MariaDB에서 원격 접속을 허용하고 암호화 통신을 적용하려면 SQL Proxy를 사용하여 TLS/SSL을 설정해야 합니다.

 

아래는 MariaDB 서버와 SQL Proxy를 구성하는 단계입니다.

 

MariaDB SSL/TLS 구성

  1. 인증서 및 키 생성
    openssl req -newkey rsa:2048 -nodes -keyout /etc/mysql/server-key.pem -out /etc/mysql/server-req.pem
    이 명령을 실행하면 개인 키와 인증서 요청 파일이 생성됩니다.

  2. 인증서 서명
    openssl x509 -req -in /etc/mysql/server-req.pem -days 365 -CA /etc/mysql/ca-cert.pem -CAkey /etc/mysql/ca-key.pem -set_serial 01 -out /etc/mysql/server-cert.pem
    이 명령을 실행하여 서버 인증서를 서명합니다.

  3. 파일 권한 설정
    chmod 600 /etc/mysql/server-key.pem
    chmod 600 /etc/mysql/server-cert.pem
     
  4. MariaDB 설정 파일 (my.cnf) 편집
    MariaDB 설정 파일 (my.cnf)을 열고 다음 라인을 추가합니다.
    [mysqld]
    ssl-ca=/etc/mysql/ca-cert.pem
    ssl-cert=/etc/mysql/server-cert.pem
    ssl-key=/etc/mysql/server-key.pem
     
  5. MariaDB 재시작
    systemctl restart mariadb
     

MariaDB에서 SSL/TLS를 활성화하고 인증서를 생성하고 구성해야 합니다. 다음은 이를 수행하는 단계입니다.

 

SQL Proxy 설치 및 구성

  1. SQL Proxy 설치
    SQL Proxy를 공식 웹사이트에서 다운로드하고 설치합니다.
    SQL Proxy는 MariaDB 서버와 클라이언트 사이에서 중계 역할을 수행합니다. 이를 설치하고 구성해야 합니다.

  2. SQL Proxy 구성 파일 생성
    SQL Proxy를 구성하는 파일을 생성합니다. 예를 들어, proxy-config.yaml라는 파일을 만들 수 있습니다.
       instance: mydbproxy
       listener: 
         listen: 127.0.0.1:3307
         protocol: tcp
       destinations:
       - name: mydb
         target: <Your_MariaDB_Server_IP>:3306
    <Your_MariaDB_Server_IP> 부분을 실제 MariaDB 서버의 IP 주소로 바꿉니다.

  3. SQL Proxy 실행
    SQL Proxy를 구성 파일과 함께 실행합니다.
    ./cloudsql-proxy -instances=<Your_Instance_Connection_Name>=tcp:127.0.0.1:3307 -credential_file=<Path_to_Service_Account_Key_File> -config=<Path_to_proxy-config.yaml>
    • <Your_Instance_Connection_Name>: MariaDB 인스턴스 연결 이름
    • <Path_to_Service_Account_Key_File>: 서비스 계정 키 파일 경로
    • <Path_to_proxy-config.yaml>: SQL Proxy 구성 파일 경로

ProxySQL Improves MySQL SSL Connections

 

클라이언트에서 SQL Proxy에 연결

  1. 클라이언트는 SQL Proxy가 실행 중인 로컬 호스트 및 포트(예: 127.0.0.1:3307)로 연결하여 MariaDB에 접속합니다.
  2. 이 연결은 SSL/TLS를 통해 암호화됩니다.

 

이제 MariaDB와 SQL Proxy를 통해 원격 클라이언트가 암호화된 통신을 할 수 있습니다. 위의 단계를 따라가면서 MariaDB 서버와 SQL Proxy를 구성하고, 클라이언트를 SQL Proxy에 연결하는 방법을 자세히 알 수 있습니다.

Database Access with Self-Hosted MySQL/MariaDB - Teleport Docs

 

SQL Proxy를 Docker 컨테이너로 구성하는 방법

  1. Docker 이미지 가져오기
    Google Cloud SQL Proxy Docker 이미지를 Docker Hub에서 가져옵니다.
    docker pull gcr.io/cloudsql-docker/gce-proxy:1.27
  2. 서비스 계정 키 생성 및 JSON 파일로 다운로드
    Google Cloud SQL Proxy를 실행하는 데 필요한 서비스 계정 키를 생성하고 JSON 파일로 다운로드합니다. Google Cloud Console에서 서비스 계정을 만들고 적절한 권한을 부여한 다음 JSON 키를 생성하세요.
  3. Docker 컨테이너 실행
    서비스 계정 키를 마운트하여 Docker 컨테이너를 실행합니다. 또한 SQL Proxy를 실행하는 명령어를 컨테이너에 전달합니다.
    docker run -d --name sqlproxy \
      -v /path/to/your/service-account-key.json:/config.json \
      gcr.io/cloudsql-docker/gce-proxy:1.27 /cloud_sql_proxy \
      -instances=<Your_Instance_Connection_Name>=tcp:0.0.0.0:3307 \
      -credential_file=/config.json
    • /path/to/your/service-account-key.json: 서비스 계정 키 JSON 파일의 경로로 대체하세요.
    • <Your_Instance_Connection_Name>: MariaDB 인스턴스 연결 이름으로 대체하세요.
  4. Docker 컨테이너 점검
    Docker 컨테이너가 정상적으로 실행 중인지 확인합니다.
    docker ps
    컨테이너가 작동 중이어야 합니다.
  5. MariaDB 클라이언트 구성 및 연결
    이제 SQL Proxy가 실행 중인 Docker 컨테이너를 통해 MariaDB에 연결할 수 있습니다. MariaDB 클라이언트를 사용하여 다음과 같이 연결합니다.
    mysql -h 127.0.0.1 -P 3307 -u <Your_DB_User> -p
    • <Your_DB_User>: MariaDB 데이터베이스 사용자 이름으로 대체하세요.

ProxySQL를 백엔드용 SSL 구성

  • SSL은 ProxySQL v1.x에서 백엔드에만 지원됩니다. 클라이언트는 v2.x 이전 버전에서 ProxySQL에 SSL을 사용할 수 없습니다.
  • ProxySQL v1.4.5부터 mariadb-connector-c-2.3.1만 SSL/TLSv1.0을 지원합니다.
  • ProxySQL v2.x에서는 mariadb-connector-3.0.2가 SSL/TLSv1.0, TLSv1.1 및 TLSv1.2를 지원합니다. 이것은 프론트엔드 및 백엔드 연결에 적용됩니다.
  • ProxySQL은 클릭하우스 및 SQLite 임베디드도 지원합니다.
  1. 원하는 서버에 대한 mysql_servers.use_ssl을 업데이트합니다.
  2. 연결된 전역 변수를 업데이트합니다. (ProxySQL v1.x 릴리스에서만 필요하며 ProxySQL v2.x에서는 필요하지 않음)
  3. 동일한 서버에 SSL 및 비-SSL로 연결하려면 두 가지 다른 호스트 그룹에 동일한 서버를 구성하고 액세스 규칙을 정의해야 합니다.

Database load balancing for MySQL and MariaDB with ProxySQL - Severalnines

예를 들어, 하나의 서버에 SSL을 구성하는 방법은 다음과 같습니다.

-- mysql_servers 테이블을 업데이트하여 SSL 사용 설정
UPDATE mysql_servers SET use_ssl=1 WHERE port=21891;

-- 변경사항을 런타임으로 로드
LOAD MYSQL SERVERS TO RUNTIME;

-- 변경 내용을 디스크에 저장 (옵션)
SAVE MYSQL SERVERS TO DISK;

SSL 키 및 인증서 구성:
SSL 연결을 위해 키와 인증서를 구성해야 합니다.

-- mysql-ssl_p2s_cert 및 mysql-ssl_p2s_key를 설정하여 SSL 키 및 인증서 지정
SET mysql-ssl_p2s_cert="/home/vagrant/newcerts/client-cert.pem";
SET mysql-ssl_p2s_key="/home/vagrant/newcerts/client-key.pem";

-- 변경사항을 런타임으로 로드
LOAD MYSQL VARIABLES TO RUNTIME;

-- 변경사항을 디스크에 저장 (옵션)
SAVE MYSQL VARIABLES TO DISK;

SSL 연결 확인:
SSL이 ProxySQL과 MySQL 간에 예상대로 작동하는지 확인하려면 다음과 같이 수행합니다.

mysql -h127.0.0.1 -P6033 -uroot -psecret -e 'SHOW SESSION STATUS LIKE "Ssl_cipher"'

프론트엔드 SSL 구성:
ProxySQL 프론트엔드 연결에 SSL을 사용하려면 다음을 수행해야 합니다.

  1. mysql-have_ssl=true를 활성화합니다.
  2. ProxySQL은 /var/lib/proxysql/datadir에 자동으로 다음 파일을 생성합니다.
    • proxysql-ca.pem
    • proxysql-cert.pem
    • proxysql-key.pem
      이 파일들은 필요에 따라 사용자 정의 구성으로 대체할 수 있습니다.
mysql -h127.0.0.1 -P6033 -uroot -psecret -e '\s' | grep -P 'SSL|Connection'

지원되는 프로토콜 및 암호화 알고리즘:

  • TLSv1
  • TLSv1.1
  • TLSv1.2
  • TLSv1.3

백엔드 및 프론트엔드 인증서 갱신:
프론트엔드 및 백엔드 연결에 사용되는 인증서를 갱신하는 방법에 대한 설명이 포함되어 있으며, ProxySQL 2.3.0 이후로 프론트엔드 인증서를 동적으로 갱신할 수 있는 방법이 제공됩니다.

-- 프론트엔드 인증서 갱신
PROXYSQL RELOAD TLS;

이제 SSL을 활성화하고 백엔드 및 프론트엔드 연결에 대한 구성과 갱신 방법을 이해하였습니다. 필요한 경우 이 정보를 사용하여 ProxySQL에서 SSL을 구성할 수 있습니다.

728x90

댓글