[database] mysql user 등록 및 권한 설정(feat.원격 접속 허용)

EMMA·2022년 8월 5일
0

처음의 시작은 에러 해결이었는데...

회사 프로젝트 DB에 접속하기 위해 host, id, password를 입력했는데 계속 에러가 뜨는 것이었다.

그래서 user 등록부터 시작해서 권한을 설정하는 것 까지 도돌이표로 돌리다가, MS Azure에 내 IP를 등록해야 접근이 가능함을 알게되었다.

어쨌든 그 과정에서 설정 관련하여 많이 배운 것 같아 기록해본다.



1. Error 발생

원격 mysql DB에 접속하기 위해, host명/아이디/비밀번호를 전달 받고 접속을 시도했으나 아래와 같은 에러가 발생했다.

Client with IP address '...' is not allowed to connect to this MySQL server.

2. Error 검색

에러 메세지를 복사해서 구글링해보니, 대부분의 해결방책은 아래의 에러 메세지를 해결하기 위해 root의 권한을 변경하는 것이었다.

Host 'IP' is not allowed to connect to this MySQL server.

그런데 이건 내가 마주한 에러 메세지와는 좀 달라서,

  • 이게 100% 맞는 해결방법은 아닐 것이다
  • 그래도 일단 메세지의 유사함을 기반으로 시도해본다

로 결론 내리고 user 권한 설정을 건드려보기로 했다.


3. mysql user 테이블 접속

내 로컬 아이디/비밀번호로 로그인 한 후, mysql DB에 접속한다. 그 후, user 테이블을 조회한다.

#mysql DB 사용 
mysql> use mysql

#user 테이블에서 user, host, Grant_priv 컬럼만 호출 
mysql> SELECT user,host,Grant_priv FROM user 

이렇게 치면, user 테이블에서 userhost, 그리고 Grant_priv 컬럼이 조회된다.
Grant_priv는 권한 변경이 되었는지 확인하려고 랜덤하게 추가만 했다.

그리고 아래와 같이 user 계정을 추가했다.
만약 [ip주소] 대신 %를 넣으면, 모든 ip를 허용한다는 뜻이다.

mysql> CREATE user 'root'@'[ip주소]' IDENTIFIED BY '[비밀번호]'
mysql> flush privilege;  

아래와 같이 맨 위에 새로운 계정이 추가되었다.

해당 계정에 데이터베이스 관련 권한을 부여한다.
해당 host IP로 내 로컬 DB에 접속 가능하고, 모든 db 및 테이블에 대한 권한을 주는 것이다.

mysql> grant all privileges on *.* to 'root'@'[IP주소]' WITH GRANT OPTION;
mysql> flush privileges;

그러면 해당 권한이 적용되고, 그 증거로 Grant_priv 가 N -> Y로 바뀌었음을 확인할 수 있다.


4. 잘못 이해한 사실

그런데 내가 잘못 이해한 부분은, 어쨌든 해당 계정은 root 이고 지금 내가 원격 DB에 접속하기 위해서는 부여받은 회사 계정(ID)로 접속해야 한다는 것.

애초에 계정이 다르니 백날 root 계정을 추가해봤자 당연히 해결이 안된다. 아무튼 이렇게 챗바퀴를 한 2-3바퀴 돌고나서야 이를 깨닫고 사수께 확인해보니, Azure에서 내 공인 IP를 먼저 등록해야 하는 것이었다.
(그렇다...AWS도 생각해보면, 클라우드 인바운드 정책 config를 해준 후에야 접속이던 뭐던 가능해진다)

너무나 바보같았지만 Azure 와 연결되어 있다는 걸 당시에는 몰랐으므로, 그렇게 나 자신을 위로하며(...) Azure 포털에 내 IP 등록을 완료했다.


내가 사용하는 공인 IP를 등록한 다음, 다시 프로젝트 DB server로 로그인을 하면 에러 메세지가 바뀐다!

#등록 이전 
Client with IP address '...' is not allowed to connect to this MySQL server.

#등록 이후
Access denied for user '[회사 계정]'@'[내 공인 IP]' (using password: YES)

위의 과정을 거치면서 간과했던 사실들을 정리하고 나니, 바뀐 에러 메세지를 보고 계정을 등록하면 문제가 해결될 것이라는 생각이 바로 들었다.

그렇다면, 내 로컬 mysql > user 테이블에서 해당 계정을 등록해주면 되겠다.

create user '[회사 계정]'@'[내 공인 IP]';

맨 위에 블럭처리된 부분이 추가된 user/host이다.


5. 문제 해결

이제 MySQL에 접속하면, DB가 나타난다 - 이로써 문제 해결.

이번 이슈를 겪으면서 아쉬웠던 점은,

  • 원격 접속을 위한 계정 설정(user/host 등록)과, 원격 접속이 가능하도록 하는 Azure 관련 설정(AWS로 치면 인바운드 규칙이 되겠다) 2개가 존재하고, 이 2개가 같이 이뤄져야 함을 처음에 이해하지 못했다.
  • 회사 계정으로 로그인해야 하므로, root가 아닌 회사 계정(ID) 으로 접속이 가능해야 함을 간과했다. (그래서 mysql > user 테이블에 user가 root가 아닌 회사 계정으로 등록되어야 함)


참고자료
https://zetawiki.com/wiki/MySQL_%EC%9B%90%EA%B2%A9_%EC%A0%91%EC%86%8D_%ED%97%88%EC%9A%A9

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글