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

잔글 (봇: 자동으로 텍스트 교체 (-<source +<syntaxhighlight , -</source> +</syntaxhighlight>))
 
(사용자 8명의 중간 판 22개는 보이지 않습니다)
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,Password FROM mysql.user;
mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user;
+----------------+------------------+-------------------------------------------+
+-----------+------+-----------------------+-------------------------------------------+
| Host           | User             | Password                                  |
| Host     | User | plugin                | authentication_string                    |
+----------------+------------------+-------------------------------------------+
+-----------+------+-----------------------+-------------------------------------------+
| localhost     | root             | *8024A6913C57E024BDFC6E813A57DFB924E6803A |
| localhost | root | mysql_native_password | *8024A6913C57E024BDFC6E813A57DFB924E6803A |
| 127.0.0.1      | root            | *8024A6913C57E024BDFC6E813A57DFB924E6803A |
| %        | root |                       |                                           |
| ::1            | root             | *8024A6913C57E024BDFC6E813A57DFB924E6803A |
+-----------+------+-----------------------+-------------------------------------------+
| localhost      | debian-sys-maint | *02CE4A6D8F13BE579AC2468F0357B9D1468025A7 |
2 rows in set (0.000 sec)
+----------------+------------------+-------------------------------------------+
</syntaxhighlight>
</source>
:즉 root 계정으로는 로컬에서만 접속가능하다.
:즉 root 계정으로는 로컬에서만 접속가능하다.
:(같은 방법으로 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,authentication_string) 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


;<nowiki>IP 대역 허용 ( 예: 111.222.xxx.xxx )</nowiki>
{{소스헤더|방법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,authentication_string) 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가 허용된다.


;<nowiki>특정 IP 1개 허용 ( 예: 111.222.33.44 )</nowiki>
===특정 IP 1개 허용===
<source lang='sql'>
* 예: 111.222.33.44
INSERT INTO mysql.user (host,user,authentication_string) 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대역 변경==
==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]
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>


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