1. mysql이 어디에 설치되어 있는지 확인하기
/usr/local/mysql-8.0.29-macos12-arm64
2. mysql이 있는 폴더에 cert 폴더를 만들어서 인증서 생성하기 (폴더 이름은 자유)
- /usr/local/mysql-8.0.29-macos12-arm64/cert
- pem 파일들을 rsa로 한번 바꿔줘야 작동한다. (MYSQL이 인식을 못하는듯함)
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
3. 인증서들이 잘 만들어졌는지 확인해보기
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
4. mysql에 인증서 접근 권한주기
- MYSQL에게 위에서 만든 server용 인증서 소유권을 넘겨줘야 정상적으로 SSL을 enable 할 수 있다.
sudo chown -R mysql:mysql server*
sudo chmod 600 server* / 600은 소유자만 사용가능한 권한
5. my.cnf 수정하기
인증서 관련 설정을 my.cnf에 해주면 되는데 서버쪽 인증서의 경로들을 설정해준다.
- mysql의 config 파일이라고 보면 된다.
- 만약 만들어져있는 my.cnf가 없다면 하나 생성하면 된다.
- 위치는 /usr/local/mysql/my.cnf로 했다.
[mysqld]
ssl
ssl-ca=/usr/local/mysql-8.0.29-macos12-arm64/cert/ca.pem
ssl-cert=/usr/local/mysql-8.0.29-macos12-arm64/cert/server-cert.pem
ssl-key=/usr/local/mysql-8.0.29-macos12-arm64/cert/server-key.pem
- .dmg로 설치한 것 기준으로 System Prefrence의 MYSQL에 가보면 config 파일을 설정할 수 있게 되어있다. 다른 방법으로 MYSQL을 설치하신 분들은 각자 확인을 해보셔야 될 듯 하다.
6. mysql 재시작하기
- .dmg로 설치했다면 System Prefrence에서 껏다가 켜면 됨
7. mysql이 SSL을 활성화 했는지 확인하기
root 계정으로 로그인해서 SSL 설정이 잘 됐는지 확인해본다. 적용이 잘 됐다면 have_ssl, have_openssl, ssl_capath, ssl_key, ssl_cert 값이 아래처럼 나오면 된다. 인증서 경로는 본인이 설정한 경로로 나오면 된다.
mysql -u root p // 로그인
show variables like '%ssl%'; // ssl 적용 됐는지 확인 명령어
mysql에 status라고 입력해보면 인증서 없이 그냥 로그인 했기 때문에 아직은 SSL이 Not in use라는 것을 알 수 있다.
8. 테스트용 mysql 계정 생성하기
- 아래처럼 생성하면 ssl이란 유저는 반드시 SSL로 로그인 해야한다.
- REQUIRE SSL을 하면 안되고 X509로 해야한다 (이유를 아시는 분은 댓글을 부탁합니다)
CREATE USER 'ssl'@'localhost' IDENTIFIED BY 'ssl'; / id: ssl, pw: ssl
GRANT ALL PRIVILEGES ON * . * TO 'ssl'@'localhost';
ALTER USER 'ssl'@'localhost' REQUIRE X509;
FLUSH PRIVILEGES;
9. 테스트
방법은 로그인 할 때 client-key와 client-cert를 함께 넘겨주면 된다.
1. SSL 옵션을 안주고 로그인 시도 -> 실패
2. SSL 옵션을 주고 시도 -> 성공
mysql -u ssl -p --ssl-mode=REQUIRED --ssl-key=client-key.pem --ssl-cert=client-cert.pem
mysql에 status라고 입력하면 SSL로 연결됐는지 확인할 수 있다.
추가 내용
- 인증을 위해서는 서버용 인증서를 만들어서 MYSQL에 설정해주고 로그인을 시도할 때 클라이언트용 인증서를 넘긴다.
- SSL 강제 여부는 유저마다 설정할 수 있다.
- SSL이 강제되지 않는 유저는 평문 통신도 가능하지만 SSL 통신도 가능하다.