MySQL 외부접속 설정하기

kocean·2024년 5월 27일

OS(리눅스) 설정이후 MySQL 설정을 진행한다.

AlmaLinux Setup

ss -ltn

커맨드를 통해 외부 포트가 열려있는지 확인할 수 있다.

State        Recv-Q        Send-Q               Local Address:Port                Peer Address:Port       Process
LISTEN       0             151                              *:3306                           *:*
sudo firewall-cmd --zone=public --add-service=mysql --permanent
sudo firewall-cmd --reload

방화벽에 등록한다.

MySQL 유저 생성

  1. 새로운 사용자를 생성

    CREATE USER '사용자명'@'호스트' IDENTIFIED BY '비밀번호';
    • '사용자명': 생성할 사용자의 이름
    • '호스트': 사용자가 접속할 수 있는 호스트 (예: 'localhost', '%' - 모든 호스트)
    • '비밀번호': 사용자의 비밀번호
    CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
  2. 생성한 사용자에게 특정 데이터베이스에 대한 권한을 부여

    GRANT 권한 ON 데이터베이스명.* TO '사용자명'@'호스트';
    • '권한': 부여할 권한 (예: SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES 등)
    • '데이터베이스명': 권한을 부여할 데이터베이스의 이름
    • '사용자명': 권한을 부여할 사용자의 이름
    • '호스트': 권한을 부여할 사용자의 호스트
    GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'myuser'@'localhost';
  3. 권한 변경 사항을 적용

    FLUSH PRIVILEGES;
SELECT user, host FROM user;

user와 host를 보여준다.

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| myuser           | %         |
| root             | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
+------------------+-----------+

SSL 적용

MySQL에 SSL이 활성화 되어 있는지 확인한다.

SHOW VARIABLES LIKE '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_crl       |          |
| ssl_crlpath   |          |
| ssl_key       |          |
+---------------+----------+
9 rows in set (0.01 sec)

‘DISABLED’로 비활성화 되어 있는 것을 확인할 수 있다.

SSL/RSA 키 페어를 생성한다.

sudo mysql_ssl_rsa_setup --uid=mysql

해당 명령어는 Deprecated 되었다. 현재 작동 자체는 하지만, MySQL 메뉴얼(링크)를 참고해 권장되는 새로운 키페어 생성방법을 이용하도록 하자.

sudo find /var/lib/mysql -name '*.pem' -ls

생성된 .pem 인증서들이 어디에 있는지 확인할 수 있다.

SSL 사용 강제하기

sudo nano /etc/my.cnf

[mysqld]
# Require clients to connect either using SSL
# or through a local socket file
require_secure_transport = ON
sudo systemctl restart mysql

특정 유저의 SSL 사용 강제하기

CREATE USER '사용자명'@'호스트' IDENTIFIED BY '비밀번호' REQUIRE SSL;

REQUIRE SSL 을 통해 SSL 연결을 강제할 수 있다.

SSL로 연결하기

sudo find /var/lib/mysql -name '*.pem' -ls

조회한 키들을 FTP로 다운로드하거나 cat 을 통해 내용을 복사하여 사용할 수 있다.

Nodejs에서 SSL 연결하기

host: genSecret()?.host || '',
port: genSecret()?.port || 3306,
user: genSecret()?.username || '',
password: genSecret()?.password || '',
database: genSecret()?.database || '',
ssl: {
  ca: process.env.DATABASE_CA_CERT,
  cert: fs.readFileSync('/path/to/client-cert.pem'),
  key: fs.readFileSync('/path/to/client-key.pem'),
  rejectUnauthorized: true,
  minVersion: 'TLSv1.2'
},

파일 형태로 키 파일을 제공할 수도 있고. .env 파일에 키값을 제공할 수도 있다. 각 줄 끝에 \n 이스케이프 문자를 추가하여 한줄로 제공하면된다.

DATABASE_CA_CERT="-----BEGIN CERTIFICATE-----\n<code...>\n-----END CERTIFICATE-----"

참고사항

ca, cert, key 파일은 SSL/TLS 보안 연결을 설정하는 데 사용되는 중요한 구성 요소입니다. 각 파일의 역할은 다음과 같습니다:

  1. ca (Certificate Authority):
    • CA 파일은 신뢰할 수 있는 인증 기관(CA)의 인증서를 포함합니다.
    • 클라이언트는 서버 인증서가 신뢰할 수 있는 CA에 의해 서명되었는지 확인하기 위해 CA 인증서를 사용합니다.
    • CA 인증서는 서버 인증서의 진위 여부를 검증하는 데 사용됩니다.
  2. cert (Certificate):
    • cert 파일은 클라이언트 또는 서버의 공개 키 인증서를 포함합니다.
    • 클라이언트 인증서는 클라이언트의 신원을 증명하는 데 사용됩니다.
    • 서버 인증서는 서버의 신원을 증명하고 클라이언트가 서버를 인증할 수 있도록 합니다.
  3. key (Private Key):
    • key 파일은 클라이언트 또는 서버의 개인 키를 포함합니다.
    • 개인 키는 인증서에 해당하는 공개 키와 쌍을 이루며, 암호화 및 복호화에 사용됩니다.
    • 개인 키는 기밀로 유지되어야 하며, 클라이언트 또는 서버 측에서만 알고 있어야 합니다.

일반적으로 ca 파일만 제공하는 것은 서버 인증을 위한 최소 요구 사항입니다. 이를 통해 클라이언트는 서버 인증서가 신뢰할 수 있는 CA에 의해 서명되었는지 확인할 수 있습니다. 그러나 이는 서버만 인증하고 클라이언트는 인증하지 않는 단방향 인증입니다.

보다 강력한 보안을 위해서는 상호 인증(mutual authentication)을 사용하는 것이 좋습니다. 이를 위해서는 ca, cert, key 파일을 모두 제공해야 합니다. 이렇게 하면 클라이언트와 서버 모두 서로의 신원을 확인할 수 있습니다. 클라이언트는 서버 인증서를 검증하고, 서버는 클라이언트 인증서를 검증합니다.

따라서 보안성을 최대한 유지하려면 ca, cert, key 파일을 모두 사용하는 것이 좋습니다. 그러나 상황에 따라 ca 파일만으로도 충분할 수 있습니다. 예를 들어, 서버 인증만 필요하고 클라이언트 인증이 필요하지 않은 경우에는 ca 파일만 사용할 수 있습니다.

보안 요구 사항과 애플리케이션의 특성에 따라 적절한 수준의 인증과 파일 사용을 결정해야 합니다.

Source

How To Configure SSL/TLS for MySQL on Ubuntu 18.04

profile
MODE PUSH MODE PUSH

0개의 댓글