!! 이 글은 Linux 인스턴스 기반입니다 !!
문제
[MySQL] [08S01] Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. java.net.ConnectException: Connection timed out: connect.
IntelliJ에 EC2 인스턴스를 연결하려는데 연결 실패가 계속되었다. MySQL 워크벤치로 실행하니 연결 권한이 없다고 해서 권한 설정을 위해 인스턴스를 실행했다.
EC2 인스턴스의 MySQL을 원격 접속하는 가이드는 검색하면 꽤 많이 나온다.
우분투 기반 리눅스에서는 mysql.conf.d 설정 파일에서 bind-address에 localhost가 할당되어있는 부분을
주석처리하면 일반적으로 원격 접속이 가능하다. 이는 localhost에서만 접속할 수 있던 상태에서 주석처리함으로써 그 외의 ip도 접속할 수 있게 되기 때문이다.
인스턴스를 다른 팀원이 만들었고 보통 우분투 기반을 하기 때문에 당연히 설정파일이 있을 줄 알았는데 아무리 찾아도 없었다.
별 옵션 다 주면서 검색했는데도 맞는 설정파일이 없었다.
이쯤되어 다른 의심이 생겨서 일단 MySQL 버전을 확인했다.
mysql --version
for Linux on x86_64 버전? 다른 가이드와 비교했더니 다른 버전이었다.
없는 설정파일을 마음대로 만들어도 서버에서 잡아줄지 모르겠어서 일단 다른 방법을 찾아보았다.
해결
가장 간단한 방법은 MySQL에서 외부 호스트에서도 접속할 수 있도록 권한을 주는 것이다.
그래서 root에 권한을 주도록 커맨드를 입력했다.
GRANT ALL PRIVILEGES ON *.* TO root@'%' WITH GRANT OPTION;
그리고 다음과 같은 에러 메시지를 받았다.
ERROR 1410 (42000): You are not allowed to create a user with GRANT
루트 계정인데도 권한을 줄 수가 없다.
그래서 1) 루트 계정을 만들고 2) 루트 계정에 권한을 주는 방식을 사용했다.
CREATE USER 'root'@'%' IDENTIFIED BY 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
권한 설정 후에는 flush privileges; 를 입력하여 권한을 적용한다.
결과 및 새로운 문제
이 방식으로 해결은 했다.
IntelliJ에서도 연결했더니 테스트도 성공했다.
그런데 여기서 문제가 생기는데, root권한을 가진 유저를 만드는 방식이기 때문에
보안에 상당히 취약하다는 점이다.
나는 개인 프로젝트에서 쓰는 용도지만 그 외에는 이런 방식을 사용하면 보안 이슈가 생길 수 있다.
root권한을 생성하고 다른 유저를 만들어 필요한 권한만 부여하고 root 계정은 삭제하는 방식을 해야할 것 같은데, 정확히 이 방법으로 제대로 동작할지는 모르겠다. 우선 현재까지의 진행을 보면
localhost에서만 접속 가능한 root가 있고 새로 만든 원격 접속 가능한 root가 있다.
보안을 위해서 일반 사용자를 두고 root는 삭제하는게 맞을 것 같다.
'기록 > Web' 카테고리의 다른 글
[React] 프로젝트 실행 (0) | 2021.09.27 |
---|---|
[Mybatis] WARNING: An illegal reflective access operation has occurred (0) | 2021.08.20 |
[IntelliJ] application.properties 과 application.yml의 차이 (0) | 2021.08.03 |
[Spring Security] There is no Password Encoder mapped for the id "null" 오류 (0) | 2021.05.06 |
[Spring][Ajax] Javascript를 통해 checkBox값 넘기기 (0) | 2021.05.06 |