모든 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.0127.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에 액세스 할 수 있습니다. 따라서 권한을 업데이트해야합니다.

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

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

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

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.cnfbind-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.