안녕하세요, 졸린 개발자입니다.
오늘은, MySQL의 Authentication Plugin 중 하나인, Caching SHA-2 Pluggable Authentication에 대해서 알아보도록 하겠습니다.
MySQL 8.0으로 오면서, default값이 Native Password 방식에서, Caching SHA-2 방식으로 바뀌였기 때문에,
기초적인 사항을 알면 더 재밌게 MySQL을 즐기실 수 있습니다.
Authentication Plugin이 뭐죠?
MySQL에 접속할때 사용자 인증을 담당하고 있는 플러그인입니다.
제가 mysql에 접속할때 가장 많이 쓰는 명령어는
mysql -uroot -p 인데요,
이때, root계정으로 패스워드를 입력받아 로그인처리를 해주는 것이 Authentication Plugin입니다.
물론 Authentication Plugin 종류에 따라서, 계정/패스워드로 로그인이 아닌 다른 형태도 가능하겠죠?
Caching SHA-2 Pluggable Authentication
이름을 보시면 2가지 특징이 있는 것을 확인하실 수 있습니다.
1. SHA-2
SHA-2기반으로 password를 Hashing하여 저장하는 Authentication입니다.
재미있는 점은 SHA-2기반이기 때문에, 해시 bit수를 자유자재로 MySQL측에서 늘릴 수 있다는 것입니다.
이전에는 SHA-256처럼 해시bit수가 정해져있었기 때문에, 하위호환성측면에서 좀 더 좋아진 것이라고 볼 수 있습니다.
2. Caching
캐시를 합니다.
해시결과를 캐시해놓았다가 똑같은 패스워드를 입력했을때 결과를 재사용해서, 퍼포먼스를 높입니다.
사용방법
우선, 이 플러그인은 기본적으로 mysql server에 내장되어있기 때문에 바로 사용할 수 있습니다.
Authentication Plugin은 계정마다 따로 설정할 수 있습니다.
예를 들면, user1은 A라는 플러그인, user2는 B라는 플러그인을 지정하면,
각각의 유저에 로그인할때마다 다른 플러그인이 동작하여 인증을 진행하게 됩니다.
Caching SHA-2은 아래와 같이 유저에 지정하면 됩니다.
CREATE USER 'sha2user'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password';
해당 쿼리 수행 후, mysql.user 테이블로 유저정보를 확인하면 아래와 같습니다.
*************************** 1. row ***************************
Host: localhost
User: sha2user
plugin: caching_sha2_password
authentication_string: $A$005$
%tkQ^Zk6S+h8a700eF1YW.vEhTbFf2FfCd14JbIVk.0hQD6/c1/lB
플러그인이 caching_sha2_password로 잘 지정되어있는것을 확인할 수 있습니다.
또한 해시된 결과가 authentication_string에 저장되어있는것도 확인가능합니다.
주의사항
you must use either a secure connection or an unencrypted connection that supports password exchange using an RSA key pair, as described later in this section
이 플러그인에서는 secure한 접속이 되어야합니다. 즉 2개중에 하나를 해야합니다.
1. SSL로 접속
2. RSA암호를 통한 접속
SSL로 접속
mysql 명령어로 접속하면 default 동작이 SSL을 통해서 접속하게 됩니다.
이렇게 아무것도 명령어에 넣지 않으면, 기본적으로 --ssl-mode=PREFFERED 가 되어, SSL 암호화가 되어 접속을 시도하게 됩니다.
물론 여기서 --ssl-mode=DISABLE을 추가하여, SSL접속을 끈 상태로 접속을 시도할 수 있습니다.
RSA 암호를 통한 접속
RSA 암호를 여러분들이 아신다고 가정하고 작성하겠습니다.
아시다시피, RSA는 private key와 public key가 필요합니다.
따라서, MySQL이 해당 파일을 사용할 수 있도록 path를 아래와 같은 variable에 지정하시면 됩니다.
caching_sha2_password_private_key_path (default: private_key.pem)
caching_sha2_password_public_key_path (default: public_key.pem)
하지만, RSA키 만드는 것이 귀찮으신 여러분들을 위해, MySQL에서는 친절히 auto generate도 지원합니다.
위의 path에 해당하는key파일이 없고 아래 variable이on이면, path에 해당하는 이름으로 만들어줍니다.
caching_sha2_password_auto_generate_rsa_keys (default: on)
만약 여러분이 아무 설정도 건드리시지 않으셨다면,
mysql 서버를 실행할때 default로 private_key.pem, public_key.pem을 확인하실 수 있습니다.
커넥션을 얻는 방법은 다음과 같이 2가지가 있습니다.
1. public_key를 클라이언트쪽에서 제공해서 접속
mysql --server-public-key-path
2. public_key를 서버에서부터 제공받아 접속
mysql --get-server-public-key
당연히, 1번이 보안성은 높지만, 2번이 접속할때 편리하겠죠?
RSA 암호화를 통해 로그인 정보를 보내는 것이기 때문에, 절대로 id/pw가 노출될 일이 없습니다.
그러면, RSA 암호화가 필요없는 경우도 있겠죠?
- TLS 암호화시
- Unix domain socket으로 연결할 시
이럴때는 안전하게 접속이 보장되기 때문에, 굳이 추가적인 RSA암호화가 필요없습니다
ssl을 disable해서 접속해봅시다.
secure connection이 이루어지지 않아 실패하게 됩니다.
여기서 RSA암호화로 통신을 하는데, 서버로부터 public_key를 요청하는 옵션을 켜게 되면 어떻게 될까요?
secure한 접속이므로, 접속이 잘 됩니다.
물론 아래처럼 public key 파일의 path를 입력해도 됩니다.
mysql --ssl-mode=DISABLED -u sha2user -p --server-public-key-path=file_name
결론
오늘은 MySQL의 인증을 담당하는 Authentication Plugin중,
Caching SHA-2 Pluggable Authentication에 대해 알아보았습니다.
MySQL 8.0에서 default Plugin이 Native password에서, Caching SHA-2로바뀌였다고 하더라도,
보통은 SSL을 DISABLE시킬 이유가 없기때문에, 클라이언트 입장에서는 똑같은 방식으로 접속할 수 있습니다.