"MySQL 원격 접속 허용"의 두 판 사이의 차이

잔글 (봇: 자동으로 텍스트 교체 (-<source +<syntaxhighlight , -</source> +</syntaxhighlight>))
 
(사용자 12명의 중간 판 46개는 보이지 않습니다)
3번째 줄: 3번째 줄:
;MySQL에 root 원격 접속 허용하기
;MySQL에 root 원격 접속 허용하기


==개요==
==문제상황==
*MySQL을 설치하면 기본적으로 로컬(localhost)에서만 접속이 가능하고 외부에서는 접속이 불가능하게 되어 있다.
*MySQL을 설치하면 기본적으로 로컬(localhost)에서만 접속이 가능하고 외부에서는 접속이 불가능하게 되어 있다.
:외부에서 접속해보면 다음과 같은 오류 메시지가 나온다.<ref>물론 방화벽이 뚫린 경우겠지?</ref>
:외부에서 접속해보면 다음과 같은 오류 메시지가 나온다.<ref>물론 방화벽이 뚫린 경우겠지?</ref>
<source lang='text'>
<syntaxhighlight lang='text'>
Host '135.79.246.80' is not allowed to connect to this MySQL server
Host '135.79.246.80' is not allowed to connect to this MySQL server
</source>
</syntaxhighlight>
 
* [[Toad for MySQL]]과 같은 DB 관리 도구를 사용하여 DB에 원격으로 접속하려면 허용해주는 로컬 작업이 필요하다.
*[[Toad for MySQL]]과 같은 DB 관리 도구를 사용하여 DB에 원격으로 접속하려면 허용해주는 로컬 작업이 필요하다.
* 여기서는 root를 원격에서 접속할 수 있도록 설정한다. 이것을 응용하면 다른 계정에도 적용할 수 있다..
*여기서는 root를 원격에서 접속할 수 있도록 설정한다. 이것을 응용하면 다른 계정에도 적용할 수 있다.


==확인==
==확인==
*아래 쿼리를 날려보면 localhost가 나온다.
* 로컬에서 접속하여 아래 쿼리를 날려보면 localhost가 나온다.
*즉 root 계정으로는 로컬에서만 접속가능하다.
<syntaxhighlight lang='console'>
*(같은 방법으로 root 대신 다른 사용자명도 조회할 수 있다.)
mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user;
<source lang='sql'>
+-----------+------+-----------------------+-------------------------------------------+
SELECT Host FROM mysql.user WHERE user='root';
| Host      | User | plugin                | authentication_string                    |
</source>
+-----------+------+-----------------------+-------------------------------------------+
| localhost | root | mysql_native_password | *8024A6913C57E024BDFC6E813A57DFB924E6803A |
| %        | root |                      |                                          |
+-----------+------+-----------------------+-------------------------------------------+
2 rows in set (0.000 sec)
</syntaxhighlight>
:즉 root 계정으로는 로컬에서만 접속가능하다.
:(같은 방법으로 root 대신 다른 사용자명도 조회할 수 있다.)
:버전이 '''5.7 이하'''에선 '''authentication_string''' 이 아닌 '''password''' 로 사용하여야 한다.<ref>버전 5.7부터 password 가 authentication_string 으로 변경됨</ref>


==변경==
==변경==
;모든 IP 허용<ref>참고로 %은 모든 아이피를 포함하지만, localhost는 포함되지 않는다.</ref>
* 아래에서 '아이디'는 root로 해도 되지만, root가 아닌 별도의 아이디를 사용하는 것이 보안상 유리하다.
<source lang='sql'>
 
INSERT INTO mysql.user (host,user,password) VALUES ('%','root',password('패스워드'));
===모든 IP 허용===
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
* 참고로 %은 모든 아이피를 포함하지만, localhost는 포함되지 않는다.
{{소스헤더|방법1. GRANT}}
<syntaxhighlight lang='mysql'>
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%' IDENTIFIED BY '패스워드';
</syntaxhighlight>
{{소스헤더|방법2. INSERT+GRANT+FLUSH}}
<syntaxhighlight lang='mysql'>
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('%','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES;
</source>
</syntaxhighlight>
 
===IP 대역 허용===
* 예: 111.222.xxx.xxx


;IP 대역 허용
{{소스헤더|방법1. GRANT}}
*다음과 같이 설정하면 111.222로 시작하는 모든 IP가 허용된다.
<syntaxhighlight lang='mysql'>
<source lang='sql'>
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.%' IDENTIFIED BY '패스워드';
INSERT INTO mysql.user (host,user,password) VALUES ('111.222.%','root',password('패스워드'));
</syntaxhighlight>
GRANT ALL PRIVILEGES ON *.* TO 'root'@'111.222.%';
{{소스헤더|방법2. INSERT+GRANT+FLUSH}}
<syntaxhighlight lang='sql'>
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('111.222.%','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.%';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES;
</source>
</syntaxhighlight>
:→ 111.222로 시작하는 모든 IP가 허용된다.


;특정 IP 1개 허용
===특정 IP 1개 허용===
<source lang='sql'>
* 예: 111.222.33.44
INSERT INTO mysql.user (host,user,password) VALUES ('111.222.33.44','root',password('패스워드'));
{{소스헤더|방법1. GRANT}}
GRANT ALL PRIVILEGES ON *.* TO 'root'@'111.222.33.44';
<syntaxhighlight lang='mysql'>
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.33.44' IDENTIFIED BY '패스워드';
</syntaxhighlight>
{{소스헤더|방법2. INSERT+GRANT+FLUSH}}
<syntaxhighlight lang='sql'>
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('111.222.33.44','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.33.44';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES;
</source>
</syntaxhighlight>


==원복==
==원래 상태로 복구==
*모든 IP를 허용한 경우 다음과 같이 원래 상태로 복구할 수 있다.
*모든 IP를 허용한 경우 다음과 같이 원래 상태로 복구할 수 있다.
<source lang='sql'>
<syntaxhighlight lang='sql'>
DELETE FROM mysql.user WHERE Host='%' AND User='root';
DELETE FROM mysql.user WHERE Host='%' AND User='아이디';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES;
</source>
</syntaxhighlight>
 
==LISTEN IP대역 변경==
{{참고|MySQL bind-address 변경}}
<syntaxhighlight lang='console'>
root@zetawiki:~# netstat -ntlp | grep mysqld
tcp        0      0 127.0.0.1:3306          0.0.0.0:*              LISTEN      7931/mysqld 
</syntaxhighlight>
<syntaxhighlight lang='console'>
root@zetawiki:~# vi /etc/mysql/my.cnf
</syntaxhighlight>
<syntaxhighlight lang='ini'>
#bind-address            = 127.0.0.1
[mysqld]
bind-address            = 0.0.0.0
</syntaxhighlight>
<syntaxhighlight lang='console'>
root@zetawiki:~# service mysql restart
mysql stop/waiting
mysql start/running, process 8190
</syntaxhighlight>
<syntaxhighlight lang='console'>
root@zetawiki:~# netstat -ntlp | grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*              LISTEN      8190/mysqld   
</syntaxhighlight>


==같이 보기==
==같이 보기==
*[[Toad for MySQL]]
* [[ERROR 2003 (HY000): Can't connect to MySQL server on]]
*[[MySQL root 패스워드 초기화]]
* [[ERROR 1471 (HY000): The target table user of the INSERT is not insertable-into]]
*[[MySQL 읽기전용 계정 생성]]
* [[MySQL 서버 LISTEN IP 대역 변경]]
* [[Toad for MySQL]]
* [[MySQL root 패스워드 초기화]]
* [[MySQL 읽기전용 계정 생성]]
* [[MySQL 원격 접속]]
* [[MySQL SSH 터널링]]
* [[로컬호스트]]


==주석==
==주석==

2021년 9월 24일 (금) 23:17 기준 최신판

MySQL 외부 접속 허용 설정
MySQL에 원격 접속 허용하기
MySQL에 root 원격 접속 허용하기

1 문제상황[ | ]

  • MySQL을 설치하면 기본적으로 로컬(localhost)에서만 접속이 가능하고 외부에서는 접속이 불가능하게 되어 있다.
외부에서 접속해보면 다음과 같은 오류 메시지가 나온다.[1]
Host '135.79.246.80' is not allowed to connect to this MySQL server
  • Toad for MySQL과 같은 DB 관리 도구를 사용하여 DB에 원격으로 접속하려면 허용해주는 로컬 작업이 필요하다.
  • 여기서는 root를 원격에서 접속할 수 있도록 설정한다. 이것을 응용하면 다른 계정에도 적용할 수 있다..

2 확인[ | ]

  • 로컬에서 접속하여 아래 쿼리를 날려보면 localhost가 나온다.
mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user;
+-----------+------+-----------------------+-------------------------------------------+
| Host      | User | plugin                | authentication_string                     |
+-----------+------+-----------------------+-------------------------------------------+
| localhost | root | mysql_native_password | *8024A6913C57E024BDFC6E813A57DFB924E6803A |
| %         | root |                       |                                           |
+-----------+------+-----------------------+-------------------------------------------+
2 rows in set (0.000 sec)
즉 root 계정으로는 로컬에서만 접속가능하다.
(같은 방법으로 root 대신 다른 사용자명도 조회할 수 있다.)
버전이 5.7 이하에선 authentication_string 이 아닌 password 로 사용하여야 한다.[2]

3 변경[ | ]

  • 아래에서 '아이디'는 root로 해도 되지만, root가 아닌 별도의 아이디를 사용하는 것이 보안상 유리하다.

3.1 모든 IP 허용[ | ]

  • 참고로 %은 모든 아이피를 포함하지만, localhost는 포함되지 않는다.
방법1. GRANT
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%' IDENTIFIED BY '패스워드';
방법2. INSERT+GRANT+FLUSH
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('%','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%';
FLUSH PRIVILEGES;

3.2 IP 대역 허용[ | ]

  • 예: 111.222.xxx.xxx
방법1. GRANT
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.%' IDENTIFIED BY '패스워드';
방법2. INSERT+GRANT+FLUSH
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('111.222.%','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.%';
FLUSH PRIVILEGES;
→ 111.222로 시작하는 모든 IP가 허용된다.

3.3 특정 IP 1개 허용[ | ]

  • 예: 111.222.33.44
방법1. GRANT
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.33.44' IDENTIFIED BY '패스워드';
방법2. INSERT+GRANT+FLUSH
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('111.222.33.44','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.33.44';
FLUSH PRIVILEGES;

4 원래 상태로 복구[ | ]

  • 모든 IP를 허용한 경우 다음과 같이 원래 상태로 복구할 수 있다.
DELETE FROM mysql.user WHERE Host='%' AND User='아이디';
FLUSH PRIVILEGES;

5 LISTEN IP대역 변경[ | ]

root@zetawiki:~# netstat -ntlp | grep mysqld
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      7931/mysqld
root@zetawiki:~# vi /etc/mysql/my.cnf
#bind-address            = 127.0.0.1
[mysqld]
bind-address            = 0.0.0.0
root@zetawiki:~# service mysql restart
mysql stop/waiting
mysql start/running, process 8190
root@zetawiki:~# netstat -ntlp | grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      8190/mysqld

6 같이 보기[ | ]

7 주석[ | ]

  1. 물론 방화벽이 뚫린 경우겠지?
  2. 버전 5.7부터 password 가 authentication_string 으로 변경됨
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}