모든 IP 주소에서 MySQL 데이터베이스에 대한 원격 액세스 권한 부여


280

이 명령을 알고 있습니다.

GRANT ALL PRIVILEGES
ON database.*
TO 'user'@'yourremotehost'
IDENTIFIED BY 'newpassword';

그러나이 원격 MySQL 데이터베이스에 액세스하기 위해 특정 IP 주소 만 부여 할 수 있습니다. 원격 호스트가이 MySQL 데이터베이스에 액세스 할 수 있도록하려면 어떻게해야합니까? 어떻게합니까? 기본적으로 나는이 데이터베이스를 공개하여 모든 사람들이 액세스 할 수 있도록합니다.


1
이 작업을 수행하기 전에 보안 관련 사항을 고려하십시오. security.stackexchange.com/questions/63881/…
— e18r

7
모든 시스템이 프로덕션 시스템 인 것은 아닙니다. 어떤 사람들은 개발을 위해 이것을 필요로합니다.
— 콘래드 존스

답변:


272
TO 'user'@'%'

%는 와일드 카드 입니다. 필요한 경우 '%.domain.com'또는 '%.123.123.123'이와 같은 작업을 수행 할 수도 있습니다 .


@kristopolous 그 원인이 될 수있는 많은 것들이 있습니다. 이 명령은 원격 액세스 (두 개의 다른 시스템)에 관한 것입니다. 그것이 당신이하고있는 것이 아니라면 이것이 올바른 명령이 아닙니다. 여전히 올바른 비밀번호와 다른 것들이 필요합니다.
— Ariel

11
"플러시 권한"을 사용해야합니다. 변경 사항을 적용하려면
— Didier Sampaolo

동일한 OS 인스턴스 (예 : 개발 머신)에서 실행중인 DB 인스턴스에 연결할 때의 트릭은 -h my_machine_name매개 변수 를 전달하는 것 입니다. 이렇게하면 클라이언트가 나를 'user'@my_machine_name.example.com대신 로 식별하도록 속 'user'@localhost입니다. 이 방법으로 이중 계정 localhost과 네트워크 액세스에 대한 보조금 및 보조금을 생성 및 유지할 필요가 없습니다 . 그리고, 물론, 반드시 mysqld결합되어 0.0.0.0대 127.0.0.1.
— 찰리 레이첼 18

173

원격 액세스 활성화 (Grant) 홈 / 자습서 / Mysql / 원격 액세스 활성화 (Grant) 원격 시스템에서 mysql 서버에 연결하려고하면 아래와 같이 오류가 발생하면이 문서가 도움이됩니다.

오류 1130 (HY000) : '1.2.3.4'호스트는이 MySQL 서버에 연결할 수 없습니다

mysql 설정 변경

mysql 설정 파일 편집으로 시작

vim /etc/mysql/my.cnf

다음 줄을 주석으로 처리하십시오.

#bind-address           = 127.0.0.1
#skip-networking

스킵 네트워킹 라인을 찾지 못하면 추가하고 주석 처리하십시오.

mysql 서버를 다시 시작하십시오.

~ /etc/init.d/mysql restart

GRANT 권한 변경

위의 변경 후에도 원격 액세스 권한을 얻지 못하지만 모든 데이터베이스에 액세스 할 수있는 것은 아닙니다.

기본적으로 사용중인 mysql 사용자 이름과 비밀번호는 로컬로 mysql-server에 액세스 할 수 있습니다. 따라서 권한을 업데이트해야합니다.

모든 머신에서 액세스하려면 아래와 같은 명령을 실행하십시오. (교체 USERNAME및 PASSWORD자격 증명에 의해.)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

다음과 같은 명령을 실행하여 특정 IP에서 액세스하십시오. (교체 USERNAME및 PASSWORD자격 증명에 의해.)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'1.2.3.4' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

1.2.3.4를 IP로 바꿀 수 있습니다. 위의 명령을 여러 번 실행하여 여러 IP의 액세스 권한을 부여 할 수 있습니다.

별도의 USERNAME& PASSWORD원격 액세스를 지정할 수도 있습니다.

다음을 통해 최종 결과를 확인할 수 있습니다.

SELECT * from information_schema.user_privileges where grantee like "'USERNAME'%";

마지막으로 다음을 실행해야 할 수도 있습니다.

mysql> FLUSH PRIVILEGES;

연결 테스트

터미널 / 명령 줄에서 :

mysql -h HOST -u USERNAME -pPASSWORD

mysql 쉘을 얻는다면 show 데이터베이스를 실행하는 것을 잊지 마십시오. 원격 컴퓨터에서 올바른 권한이 있는지 확인하십시오.

보너스 팁 : 액세스 취소

실수로 사용자에게 액세스 권한을 부여한 경우에는 취소 옵션이 더 좋습니다.

다음은 모든 컴퓨터에서 USERNAME에 대한 모든 옵션을 취소합니다.

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'%';
Following will revoke all options for USERNAME from particular IP:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'1.2.3.4';
Its better to check information_schema.user_privileges table after running REVOKE command.

REVOKE 명령을 실행 한 후 USAGE 권한이 표시되면 괜찮습니다. 전혀 특권이없는 것만 큼 좋습니다. 취소 할 수 있는지 확실하지 않습니다.


7
부분 을 주석 처리하는 /etc/mysql/mysql.conf.d/mysqld.cnf대신 파일 을 변경해야했습니다 . 라인 누락 및 추가하고 선 주석의 영향이 없을 것이다. /etc/mysql/my.cnfbind-address#skip-networking
— Pawan

1
MariaDB 10.1.26에서 구성 파일은/etc/mysql/mariadb.conf.d/50-server.cnf
— Kwadz

위의 모든 작업을 수행했지만 여전히 연결할 수없는 경우 방화벽 설정을 확인하고 포트를 차단 3306하거나 설정 한 포트 중 하나 일 수 있습니다.
— avn

37

위 단계가 완료되었고 MySql 포트 3306에 원격으로 액세스 할 수 있다고 가정합니다. mysql 설정 파일에서 공개 IP 주소를 바인딩하는 것을 잊지 마십시오.

예를 들어 내 우분투 서버에서 :

#nano /etc/mysql/my.cnf

파일에서 [mysqld] 섹션 블록을 검색 하고 새 바인드 주소를 추가하십시오 (이 예에서는 192.168.0.116). 이런 식으로 보일 것입니다

......    
.....    
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

bind-address        = 127.0.0.1    
bind-address        = 192.168.0.116

.....    
......

원하는 경우 th localhost (127.0.0.1) 바인딩을 제거 할 수 있지만, 로컬 시스템의 서버에 액세스하려면 IP 주소를 지정해야합니다.

그런 다음 마지막 단계는 MySql 서버를 다시 시작하는 것입니다 (우분투에서)

stop mysql

start mysql

또는 #/etc/init.d/mysql restart다른 시스템

이제 다음을 통해 MySQL 데이터베이스에 원격으로 액세스 할 수 있습니다.

mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reload충분하다
— Lorenz Lo Sauer

방금이 작업을 수행했으며 mysql 서버에 원격으로 연결할 수 없습니다. 그런 다음 bind-addresses를 주석 처리하려고 시도했습니다. 또한 호스트를 지정하지 않고 mysql -u <user> -p를 사용하여 서버에 로그인을 시도했지만 작동했기 때문에 "원하는 경우 localhost (127.0.0.1) 바인딩을 제거 할 수 있지만 로컬 컴퓨터의 서버에 액세스 할 수있는 IP 주소를 제공하십시오. " 정확하지 않습니다. (우분투 12.04 LTS 서버 mysql Ver 14.14 Distrib 5.5.34)
— Programster

5
bind-address지시어는 IP 주소 MySQL은 그 결정 서버 를 기울인다에를; 서버가 연결을 수락하는 IP 주소가 아닙니다 .
— GoZoner

1
모든 단계를 수행 한 후에는 작동하지 않습니다. bind-address로컬 호스트 또는 원격 호스트 주소를 주석 처리 할 때 오류가 발생 합니다. mysql.serviceJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
— baermathias

192.168.0.116 대신 abc.abc:1234와 같은 주소를 제공 할 수 있습니까?
— bielas

26

이것으로 혼란스러워하는 사람이라면 여기에 내가 권한을 부여하는 방법이 있습니다. 누군가에게 도움이되기를 바랍니다.

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY
'yourRootPassword';

언급 한 바와 같이 %와일드 카드이므로 모든 IP 주소를 데이터베이스에 연결할 수 있습니다. 내가 여기서 가정한다는 것은 연결 할 때 이름이 지정된 사용자 root(기본)입니다. 루트 비밀번호를 입력하면 좋습니다. '사용자 루트 주위에 작은 따옴표 ( ) 가 없습니다 .


사용자에서 작은 따옴표를 제거하는 것이 중요한 이유는 무엇입니까? 이것이 다른 답변 (및 설명서)과 다른 이유는 무엇입니까?
— DMCoding

26

로컬 호스트를 통한 연결을 활성화하려면 구성 파일을 변경해야합니다.

원격 IP를 통해 연결하려면 "루트"사용자로 로그인하여 mysql에서 아래 쿼리를 실행하십시오.

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

원격 호스트뿐만 아니라 로컬 호스트에서도 액세스 할 수있는 새 사용자가 생성됩니다.

또한 /etc/mysql/my.cnf에있는 my.cnf 파일에서 아래 행을 주석으로 처리하십시오.

bind-address = 127.0.0.1

를 사용하여 mysql을 다시 시작하십시오.

sudo service mysql restart

이제 mysql에 원격으로 연결할 수 있습니다.


2
이것은 질문에 대답하지 않습니다.
— CHarris

1
@ChristopheHarris 왜 그렇게 느끼십니까? 대답은 MySQL에서 해당 사용자를 사용하여 로컬 호스트와 DB에 대한 원격 액세스를 모두 허용하는 새 사용자를 만드는 방법에 대한 단계별 지침을 명확하게 제공합니다. plesae는 설명 할 수 있습니까?
— harishannam

1
나를 위해 작동하지 않습니다. 여전히 같은 오류가 있습니다. 루트 사용자 또는 새 사용자로 시도하든 'xxx.xxx.xxx.xxx'에서 MySQL 서버에 연결할 수 없음 ([Errno 61] 연결이 거부 됨)
— baermathias

21

이 명령을 사용하십시오 :

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY 'yourRootPassword';

그때:

FLUSH PRIVILEGES; 

그런 다음 "/etc/mysql/mysql.conf.d/mysqld.cnf"파일에서 아래 행을 주석 처리하십시오 (필수)!

bind-address = 127.0.0.1 

나를 위해 작동합니다!


아주 좋은 것입니다. 보조금이 중요합니다. 그렇지 않은 경우와 같은 요청에 대한 오류의 많은your-password-does-not-satisfy-the-current-policy-requirements
— 알레한드로 텍사스 무 노즈

21

모든 IP 주소에서 사용자와 연결할 수있게하려면 다음을 수행하십시오.

mysql 서버가 원격 연결을 수락하도록 허용하십시오. 이 열린 mysqld.conf 파일의 경우 :

sudo gedit /etc/mysql/mysql.conf.d/mysqld.cnf

"bind-address"로 시작하는 행을 검색하고 값을 0.0.0.0으로 설정하십시오.

bind-address                    = 0.0.0.0

마지막으로 파일을 저장하십시오.

참고 : MySQL 8 이상을 실행하는 경우 기본적으로 bind-address지시문이 mysqld.cnf파일에 없습니다 . 이 경우 지시문을 파일 맨 아래에 추가하십시오 /etc/mysql/mysql.conf.d/mysqld.cnf.

이제 systemd이전 service명령을 사용하거나 이전 명령을 사용 하여 mysql 서버를 다시 시작하십시오 . 운영 체제에 따라 다릅니다.

sudo systemctl restart mysql # for ubuntu    
sudo systemctl restart mysqld.service # for debian

마지막으로 mysql 서버는 이제 원격 연결을 수락 할 수 있습니다.

이제 사용자를 생성하고 권한을 부여해야하므로이 사용자로 원격으로 로그인 할 수 있습니다.

루트 또는 루트 권한을 가진 다른 사용자로 MySQL 데이터베이스에 연결하십시오.

mysql -u root -p

이제 localhost 및 '%'와일드 카드에서 원하는 사용자를 만들고 모든 DB에 대한 권한을 부여하십시오.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

그때,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

마지막으로 권한을 플러시하는 것을 잊지 마십시오

FLUSH PRIVILEGES;

참고 : 데이터베이스 서버에서 방화벽을 구성한 경우 3306MySQL 로의 트래픽을 허용하려면 포트 MySQL의 기본 포트를 열어야 합니다.

도움이 되었기를 바랍니다 ;)


2
sudo는 systemctl 데비안, 나는 sudo는 systemctl를 다시 시작 mysql.service 우분투위한 사용했다 다시 시작 mysqld.service IS
— ani0904071

나는 대답을 업데이트하고 두 배포판 모두에 대해 mysql restart 명령을 추가했습니다. 감사합니다 @ ani0904071
— Imtiaz Shakil Siddique

17

다음을 실행하십시오.

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to root@'ipaddress' IDENTIFIED BY 'mysql root password';     
mysql> FLUSH PRIVILEGES;     
mysql> exit

그런 다음 지정한 IP 주소에서 연결을 시도하십시오.

mysql -h address-of-remove-server -u root -p   

연결할 수 있어야합니다.


15

다음 명령을 통해 MariaDB의 문제를 해결할 수 있습니다 .

노트 :

GRANT ALL ON *.* to root@'%' IDENTIFIED BY 'mysql root password';

%와일드 카드입니다. 이 경우 모든 IP 주소를 나타냅니다.


3
mysql에서, 당신이해야 할 일은 (1) .change my.cnf content (2) .grant remote user (3) 방화벽을 처리하여 3306 포트를 수신하는 것입니다.
— 未来 陆家嘴 顶尖 的 投资 人

당신은 내 하루를 구했습니다. 감사합니다!
— Almett


7

데이터베이스 MySQL 서버 8에 원격으로 액세스하려면 :

CREATE USER 'root'@'%' IDENTIFIED BY 'Pswword@123';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

5
  • 관리자를 사용하여 MYSQL 시작
    • mysql -u admin-user -p (비밀번호 입력 프롬프트)
  • 새 사용자를 작성하십시오.
    • 'password'로 식별 된 'newuser'@ '%'사용자 작성; (%-> 애니 호스트)
  • 그랜트 특권 :
    • db_name에서 GRANT 선택, 삭제, 삽입, 업데이트. * TO 'newuser'@ '%';
    • 홍당무;

EC2 인스턴스를 실행중인 경우 MYSQL / Aurura를 사용하여 보안 그룹에 인바운드 규칙을 추가하는 것을 잊지 마십시오.


5

파일 편집 :

/etc/mysql/percona-server.cnf

아래 코드를 파일에 추가하십시오.

[mysqld] bind-address = 0.0.0.0

원격 액세스를위한 사용자를 작성하십시오.

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to snippetbucketdotcom@'%' IDENTIFIED BY 'tejastank';   
mysql> FLUSH PRIVILEGES;    
mysql> exit

모든 리눅스 서버가 작동합니다.

MSWin c : \ 위치 찾기 위치 \ 파일 경로


[mysqld] 파일에 추가해야합니다. 그렇지 않으면 제대로 작동하지 않습니다
— Tejas Tank

3

다음과 같은 데이터베이스에 사용자를 만드십시오.

GRANT ALL PRIVILEGES ON <database_name>.* TO '<username>'@'%' IDENTIFIED BY '<password>'

그런 다음

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf줄 bind-address = 127.0.0.1을 다음으로 변경하십시오.bind-address = 0.0.0.0

그런 다음 모든 IP에서 해당 데이터베이스에 연결할 수 있습니다.


3

를 열고 mysql console다음 명령을 실행하십시오 (데이터베이스 이름, 사용자 이름 및 비밀번호 입력).

yourdatabasename에 모두 부여하십시오. * 'yourRootPassword'에 의해 식별 된 admin @ '%';

그런 다음 실행하십시오.

홍당무;

명령 줄을 열고로 /etc/mysql/mysql.conf.d/mysqld.cnf편집기를 사용 하여 파일 을 엽니 다 root privileges.

예를 들면 다음과 같습니다.

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

그런 다음 아래 줄을 주석으로 처리하십시오.

바인드 주소 = 127.0.0.1

명령을 사용하여 변경 사항을 반영하려면 mysql을 다시 시작하십시오.

sudo service mysql restart

즐겨 ;)


2

mysql 설정 파일을 변경해야합니다 :

mysql 설정 파일 편집으로 시작

vim /etc/mysql/my.cnf

더하다:

bind-address = 0.0.0.0

0

cPanel과 같은 웹 사이트 패널 %에서 허용 된 호스트 이름에 단일 (백분율 부호)을 추가 하여 MySQL 데이터베이스에 액세스 할 수 있습니다.

하나 %를 추가하면 데스크탑 응용 프로그램에서도 모든 IP 또는 웹 사이트에서 데이터베이스에 액세스 할 수 있습니다.


직접적인 쿼리가 제시 될 때 cPanel과 같은 것을 언급하지 마십시오. 이것은 다른 사람에게는 실제적인 결과를 보여주지 않을 것입니다
— Tobias Hagenbeek

@TobiasHagenbeek 의견을 보내 주셔서 감사합니다. 이 방법 / 트릭은 나에 의해 발명되지 않았습니다 (인터넷에서 일반적입니다). 그러나이 방법의 테스터 중 하나이며 가장 쉽고 효과적인 방법이라는 것을 알았습니다. 이 방법에는 무시할 수있는 보안 위험이 있음을 알고 있습니다.
— Muhammad Saqib

0

예를 들어 CentOS에서

sudo gedit /etc/mysql/my.cnf

다음 줄을 주석으로 처리하십시오.

# 바인드 주소 = 127.0.0.1

그때

sudo 서비스 mysqld 재시작


0

모든 IP 주소에서 데이터베이스에 대한 원격 액세스 권한을 부여하려면 mysql 명령을 실행 한 후 다음 명령을 실행하십시오.

GRANT ALL PRIVILEGES ON *.*
TO 'root'@'%' 
IDENTIFIED BY 'password' 
WITH GRANT OPTION;

0

Ubuntu에서 효과가 있었던 것은 사용자에게 모든 권한을 부여하는 것입니다.

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;

바인드 주소를 /etc/mysql/mysql.conf.d/mysqld.cnf다음으로 설정하십시오 .

bind-address            = 0.0.0.0

그런 다음 mysql 데몬을 다시 시작하십시오.

service mysql restart

-7

/etc/my.cnf를 편집하여 모든 보안을 비활성화 할 수 있습니다 :

skip-grant-tables

이것은 모든 암호 요구 사항을 제거합니다
— kristopolous

5
프로덕션 환경에서는이 옵션을 활성화하지 않는 것이 좋습니다. 암호없이 누구나 연결할 수 있습니다!
— AStopher

그러나 이것은 개발 환경에 이상적입니다
— DMCoding

이를 통해 사람들은 암호를 사용하지 않고 데이터베이스를 해킹 할 수 있습니다.
— 밀키 웨이 90

@DanielJames 개발 환경에서도 끔찍한 아이디어입니다.
— Dragas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.