OS(리눅스) 설정이후 MySQL 설정을 진행한다.
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
방화벽에 등록한다.
새로운 사용자를 생성
CREATE USER '사용자명'@'호스트' IDENTIFIED BY '비밀번호';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
생성한 사용자에게 특정 데이터베이스에 대한 권한을 부여
GRANT 권한 ON 데이터베이스명.* TO '사용자명'@'호스트';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'myuser'@'localhost';
권한 변경 사항을 적용
FLUSH PRIVILEGES;
SELECT user, host FROM user;
user와 host를 보여준다.
+------------------+-----------+
| user | host |
+------------------+-----------+
| myuser | % |
| root | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
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 인증서들이 어디에 있는지 확인할 수 있다.
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
CREATE USER '사용자명'@'호스트' IDENTIFIED BY '비밀번호' REQUIRE SSL;
REQUIRE SSL 을 통해 SSL 연결을 강제할 수 있다.
sudo find /var/lib/mysql -name '*.pem' -ls
조회한 키들을 FTP로 다운로드하거나 cat 을 통해 내용을 복사하여 사용할 수 있다.
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 보안 연결을 설정하는 데 사용되는 중요한 구성 요소입니다. 각 파일의 역할은 다음과 같습니다:
ca (Certificate Authority):cert (Certificate):cert 파일은 클라이언트 또는 서버의 공개 키 인증서를 포함합니다.key (Private Key):key 파일은 클라이언트 또는 서버의 개인 키를 포함합니다.일반적으로 ca 파일만 제공하는 것은 서버 인증을 위한 최소 요구 사항입니다. 이를 통해 클라이언트는 서버 인증서가 신뢰할 수 있는 CA에 의해 서명되었는지 확인할 수 있습니다. 그러나 이는 서버만 인증하고 클라이언트는 인증하지 않는 단방향 인증입니다.
보다 강력한 보안을 위해서는 상호 인증(mutual authentication)을 사용하는 것이 좋습니다. 이를 위해서는 ca, cert, key 파일을 모두 제공해야 합니다. 이렇게 하면 클라이언트와 서버 모두 서로의 신원을 확인할 수 있습니다. 클라이언트는 서버 인증서를 검증하고, 서버는 클라이언트 인증서를 검증합니다.
따라서 보안성을 최대한 유지하려면 ca, cert, key 파일을 모두 사용하는 것이 좋습니다. 그러나 상황에 따라 ca 파일만으로도 충분할 수 있습니다. 예를 들어, 서버 인증만 필요하고 클라이언트 인증이 필요하지 않은 경우에는 ca 파일만 사용할 수 있습니다.
보안 요구 사항과 애플리케이션의 특성에 따라 적절한 수준의 인증과 파일 사용을 결정해야 합니다.