개발 Q&A

제목 MySQL 사용자 특정 ip만 외부 접속 가능하게 하기
카테고리 DB
글쓴이 주말생각 작성시각 2022/08/26 16:01:34
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 7349   RSS

MySQL 8.0 버전을 사용중입니다.

기존에 사용 중인 MySQL 계정 TEST는 host의 값이 %여서 모든 아이피에서 원격 접속이 가능합니다.

이것을 회사 사무실과 일부 ip만 접속 가능하게 하는데 구글링해서 나온 grant를 통한 방법은 처음 계정을 생성할 때 사용하는 것 같더라고요. REVOKE으로 권한을 회수하고 다시 부여하여도 특정 아이피만 접근 가능하게 하는 설정은 되지 않습니다.

 

현재 사용 중인 계정이어서 삭제하고 다시만들기도 위험하다고 생각합니다. 무언가 수정하는 방법이 없나요?

 다음글 젠킨스 배포 질문이요 (2)
 이전글 인스타그램 api 겨우 설치했는데 비로그인은 원래 안되... (1)

댓글

한대승(불의회상) / 2022/08/26 16:54:35 / 추천 0
3306 포트에 대해 방화벽으로 차단 하시고 회사 사무실과 일부 IP만 허용하세요.
주말생각 / 2022/08/26 17:16:29 / 추천 0

답변감사합니다.

안그래도 방화벽 포트를 차단하려고하는데 제가 ZONE 설정으로 규칙들을 만들어서 하려고 시도 중인데 잘 안되는군요.

tuyitu719 new / 2026/03/14 10:09:36 / 추천 0

안녕하세요.
이건 REVOKE 로 해결되는 문제가 아니라, 계정의 Host 조건을 바꾸는 문제에 가깝습니다. MySQL 계정은 단순히 TEST 하나가 아니라 '사용자'@'호스트' 조합으로 정의되고, 접속 허용 여부도 UserHost 가 함께 일치하는지를 보고 판단합니다. 그래서 'TEST'@'%' 는 “모든 호스트에서 접속 가능한 계정”이고, 권한을 회수했다가 다시 부여하는 것만으로는 % 자체가 특정 IP 제한으로 바뀌지 않습니다.

즉, 결론부터 말씀드리면 기존 계정을 삭제 후 재생성할 필요는 없지만, Host 값을 바꾸려면 계정 정의를 바꿔야 합니다. 이럴 때 쓰는 게 RENAME USER 이고, 공식 문서에도 RENAME USER 'old' TO 'new' 형식으로 기존 계정을 다른 user@host 로 바꿀 수 있다고 나와 있습니다. 또한 RENAME USER기존 계정이 갖고 있던 권한을 새 계정으로 가져갑니다.

다만 질문처럼 회사 IP + 일부 특정 IP만 허용하려면 보통 한 개 계정으로 끝나지 않고, 같은 사용자명을 Host 별로 여러 개 두는 방식으로 갑니다. MySQL 은 같은 사용자명이라도 Host 가 다르면 별도 계정으로 취급할 수 있고, 접속 시에는 더 구체적인 Host 가 먼저 매칭됩니다. 예를 들어 'TEST'@'203.0.113.10' 같은 정확한 IP 계정이 있으면, 그 접속은 'TEST'@'%' 보다 그 계정을 우선 사용합니다. % 는 “any host” 이면서 가장 덜 구체적인 값입니다.

그래서 가장 안전한 방법은 아래 순서입니다.
먼저 현재 계정 정의와 권한을 백업처럼 확인합니다.


 
 
SHOW CREATE USER 'TEST'@'%';
SHOW GRANTS FOR 'TEST'@'%';
 

SHOW CREATE USER 는 계정 생성 구문을, SHOW GRANTS 는 권한 정보를 보여줍니다.

그다음 허용할 IP들에 대해 구체적인 계정을 먼저 추가합니다. 예를 들면:


 
 
CREATE USER 'TEST'@'203.0.113.10' IDENTIFIED BY '비밀번호';
CREATE USER 'TEST'@'198.51.100.25' IDENTIFIED BY '비밀번호';
CREATE USER 'TEST'@'192.0.2.0/255.255.255.0' IDENTIFIED BY '비밀번호';
 

MySQL 문서에는 Host 부분에 정확한 IP, CIDR 표기, 서브넷 마스크 표기를 사용할 수 있는 예가 나와 있습니다. 회사가 고정 공인 IP 1개면 정확한 IP로, 대역이면 CIDR/서브넷 방식으로 잡으면 됩니다.

그리고 SHOW GRANTS FOR 'TEST'@'%'; 로 확인한 권한을 새 계정들에 동일하게 부여합니다.
이 상태에서는 허용 IP에서 들어오는 접속은 더 구체적인 Host 계정을 타게 되므로 먼저 테스트가 가능합니다. 다만 이때도 'TEST'@'%' 가 살아 있으면 허용되지 않은 다른 IP는 여전히 % 계정으로 접속 가능합니다. 즉, 테스트용으로는 괜찮지만 최종 제한은 아닙니다.

테스트가 끝나면 마지막으로 와일드카드 계정을 정리해야 합니다. 선택지는 두 가지입니다.
회사 IP가 1개라면:


 
 
RENAME USER 'TEST'@'%' TO 'TEST'@'203.0.113.10';
 

처럼 바꿀 수 있고, 이 경우 기존 권한이 같이 넘어갑니다. 여러 허용 IP가 필요하다면 % 계정은 결국 제거해야 하므로, 특정 Host 계정들을 다 만들어 검증한 뒤 DROP USER 'TEST'@'%'; 하거나, 먼저 하나로 RENAME USER 한 뒤 나머지 Host 계정을 추가하는 방식으로 마무리하면 됩니다.

주의할 점은 두 가지입니다.
첫째, mysql.user 를 직접 UPDATE 하는 방식은 권장되지 않습니다. MySQL 공식 문서도 시스템 테이블 구조를 직접 바꾸는 것은 지원되지 않는 동작이라고 경고합니다. 둘째, RENAME USER 는 그 계정이 프로시저/뷰 등의 DEFINER 로 쓰이고 있으면 실패할 수 있으니, 그런 객체가 많은 환경이면 먼저 확인하고 진행하는 편이 좋습니다.

정리하면,
REVOKE 로는 Host 제한이 안 되고, user@host 계정 자체를 바꿔야 합니다.
실무적으로는

  1. SHOW CREATE USER, SHOW GRANTS 로 현재 상태 백업

  2. 허용 IP별 TEST@host 계정 생성

  3. 기존과 같은 권한 부여

  4. 테스트

  5. 마지막에 TEST@'%' 제거
    이 순서가 가장 안전합니다.

참고 사이트: 1688