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

잔글 (봇: 자동으로 텍스트 교체 (-<source +<syntaxhighlight , -</source> +</syntaxhighlight>))
 
6번째 줄: 6번째 줄:
*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를 원격에서 접속할 수 있도록 설정한다. 이것을 응용하면 다른 계정에도 적용할 수 있다..
14번째 줄: 14번째 줄:
==확인==
==확인==
* 로컬에서 접속하여 아래 쿼리를 날려보면 localhost가 나온다.
* 로컬에서 접속하여 아래 쿼리를 날려보면 localhost가 나온다.
<source lang='console'>
<syntaxhighlight lang='console'>
mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user;
mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user;
+-----------+------+-----------------------+-------------------------------------------+
+-----------+------+-----------------------+-------------------------------------------+
23번째 줄: 23번째 줄:
+-----------+------+-----------------------+-------------------------------------------+
+-----------+------+-----------------------+-------------------------------------------+
2 rows in set (0.000 sec)
2 rows in set (0.000 sec)
</source>
</syntaxhighlight>
:즉 root 계정으로는 로컬에서만 접속가능하다.
:즉 root 계정으로는 로컬에서만 접속가능하다.
:(같은 방법으로 root 대신 다른 사용자명도 조회할 수 있다.)
:(같은 방법으로 root 대신 다른 사용자명도 조회할 수 있다.)
34번째 줄: 34번째 줄:
* 참고로 %은 모든 아이피를 포함하지만, localhost는 포함되지 않는다.
* 참고로 %은 모든 아이피를 포함하지만, localhost는 포함되지 않는다.
{{소스헤더|방법1. GRANT}}
{{소스헤더|방법1. GRANT}}
<source lang='mysql'>
<syntaxhighlight lang='mysql'>
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%' IDENTIFIED BY '패스워드';
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%' IDENTIFIED BY '패스워드';
</source>
</syntaxhighlight>
{{소스헤더|방법2. INSERT+GRANT+FLUSH}}
{{소스헤더|방법2. INSERT+GRANT+FLUSH}}
<source lang='mysql'>
<syntaxhighlight lang='mysql'>
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('%','아이디',password('패스워드'),'','','');
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('%','아이디',password('패스워드'),'','','');
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%';
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES;
</source>
</syntaxhighlight>


===IP 대역 허용===
===IP 대역 허용===
48번째 줄: 48번째 줄:


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


62번째 줄: 62번째 줄:
* 예: 111.222.33.44
* 예: 111.222.33.44
{{소스헤더|방법1. GRANT}}
{{소스헤더|방법1. GRANT}}
<source lang='mysql'>
<syntaxhighlight lang='mysql'>
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.33.44' IDENTIFIED BY '패스워드';
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'111.222.33.44' IDENTIFIED BY '패스워드';
</source>
</syntaxhighlight>
{{소스헤더|방법2. INSERT+GRANT+FLUSH}}
{{소스헤더|방법2. INSERT+GRANT+FLUSH}}
<source lang='sql'>
<syntaxhighlight lang='sql'>
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('111.222.33.44','아이디',password('패스워드'),'','','');
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';
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='아이디';
DELETE FROM mysql.user WHERE Host='%' AND User='아이디';
FLUSH PRIVILEGES;
FLUSH PRIVILEGES;
</source>
</syntaxhighlight>


==LISTEN IP대역 변경==
==LISTEN IP대역 변경==
{{참고|MySQL bind-address 변경}}
{{참고|MySQL bind-address 변경}}
<source lang='console'>
<syntaxhighlight lang='console'>
root@zetawiki:~# netstat -ntlp | grep mysqld
root@zetawiki:~# netstat -ntlp | grep mysqld
tcp        0      0 127.0.0.1:3306          0.0.0.0:*              LISTEN      7931/mysqld   
tcp        0      0 127.0.0.1:3306          0.0.0.0:*              LISTEN      7931/mysqld   
</source>
</syntaxhighlight>
<source lang='console'>
<syntaxhighlight lang='console'>
root@zetawiki:~# vi /etc/mysql/my.cnf
root@zetawiki:~# vi /etc/mysql/my.cnf
</source>
</syntaxhighlight>
<source lang='ini'>
<syntaxhighlight lang='ini'>
#bind-address            = 127.0.0.1
#bind-address            = 127.0.0.1
[mysqld]
[mysqld]
bind-address            = 0.0.0.0
bind-address            = 0.0.0.0
</source>
</syntaxhighlight>
<source lang='console'>
<syntaxhighlight lang='console'>
root@zetawiki:~# service mysql restart
root@zetawiki:~# service mysql restart
mysql stop/waiting
mysql stop/waiting
mysql start/running, process 8190
mysql start/running, process 8190
</source>
</syntaxhighlight>
<source lang='console'>
<syntaxhighlight lang='console'>
root@zetawiki:~# netstat -ntlp | grep mysqld
root@zetawiki:~# netstat -ntlp | grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*              LISTEN      8190/mysqld     
tcp        0      0 0.0.0.0:3306            0.0.0.0:*              LISTEN      8190/mysqld     
</source>
</syntaxhighlight>


==같이 보기==
==같이 보기==

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 }}