사용자를 위해 mysql 서버에 원격 액세스 권한을 부여하는 방법은 무엇입니까?


118

SHOW GRANTSmysql 데이터베이스에서 수행 하면

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' 
    IDENTIFIED BY PASSWORD 'some_characters' 
    WITH GRANT OPTION

내가 착각하지 않았다면 root@localhost사용자 root는에서만 서버에 액세스 할 수 있습니다 localhost. root동일한 네트워크에있는 다른 모든 컴퓨터에서이 mysql 서버에 액세스 할 수있는 권한 을 부여 하도록 MySQL에 어떻게 지시합니까?


6
로 간단히 변경 localhost하면 %공용 네트워크에 대한 루트 액세스 권한이 부여됩니다. 잊지 마세요flush privileges;

6
root @ %를 추가하면 많은 위험에 노출되므로 수행해서는 안됩니다. 나는 이것이 오래된 게시물이라는 것을 알고 있지만 그 경고는 여기에 있어야합니다. 루트 계정은 공격자가 표적으로 삼은 첫 번째 계정이며 root @ '%'는 루트 사용자가 원하는 곳에서 MySQL 계정에 연결할 수 있음을 의미합니다. 주석에서 다룰 내용이 너무 많지만 가능한 한 많은 users @ '%'를 제거해야하며 여기에 선언 된 모든 항목은 매우 제한된 권한을 가져야합니다. 어쨌든 root @ '%'를 추가해서는 안되며 응용 프로그램도 해당 계정이있을 것으로 예상해서는 안됩니다.
Damon


안녕하세요 여러분,이 명령에 대한 PASSWORD 문자열을 제거해야합니다. 오류가 발생합니다. IDENTIFIED BY와 비밀번호 자체로 완료하면됩니다.
Mário de Sá Vera

답변:


143

이는 다음의 모든 컴퓨터에서 동일한 비밀번호로 루트 액세스를 허용합니다 *.example.com.

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%.example.com' 
    IDENTIFIED BY 'some_characters' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

이름 확인이 작동하지 않으면 IP 또는 서브넷으로 액세스 권한을 부여 할 수도 있습니다.

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

MySQL GRANT구문 문서.


15
...TO 'root'@'%' IDENTIFIED...어디서나 액세스 권한을 부여 할 것이라고 생각 합니까?
Aufwind 2011-06-04

3
mysql에서 명령을 실행했지만 SHOW GRANTS여전히 (제 질문에서와 같이) 동일하게 표시됩니다. 나는 심지어했다 FLUSH PRIVILGES. 내가 놓친 것이 있습니까?
Aufwind 2011-06-04

@Aufwind 나는 당신이 외에 다른 것을 필요로하지 않을 것 FLUSH PRIVILEGES입니다. 로그 아웃했다가 다시 로그인하고 액세스 권한이 있으면 mysqld 서비스를 다시 시작하십시오. 또한 여전히 동일하지 않은 것으로 간주 되지 skip networking는 않지만 라인이 활성화되어 있지 않은지 확인하십시오 . my.cnfSHOW GRANTS
Michael Berkowski 2011 년

@Aufwind 실패하면 대신 ServerFault.com에 문의해야 할 수도 있습니다.
Michael Berkowski 2011 년

10
참고 IDENTIFIED BY PASSWORD해시 41 자리 16 진수 수반한다. IDENTIFIED BY 'password'비밀번호를 직접 포함 하려면 사용하십시오 .
Rainulf 2013 년

94

시험:

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

1
무엇 것은 음 Pa55w0rd바보 같다, 내가 당신을 만들고 싶어 암호를 먹으 렴 말하지 않습니다. mysql에 로그인하려는 모든 사람을 위해?
SSpoke 2014-04-06

23
일반적으로 자리 표시 자에게 "이곳에 읽기 좋은 암호를 넣으십시오"라는 암호를 부여하는 데 사용되었습니다.
moshe beeri 2014

2
이 명령은 보안이 중요하지 않은 애플리케이션 (예 : dev 또는 QA)에만 사용하기를 원한다는 일반적인 경고가 있습니다.
einnocent

Mac에서 작동하지 않으면 권한을 부여 할 컴퓨터의 'root'@ '%'또는 'root'@ 'localhost'또는 / etc / hosts 이름을 변경하십시오.
모세 브 에리

2
다음을 실행하는 것을 잊지 마십시오 :FLUSH PRIVILEGES;
dane

44

먼저 mysql을 확인한 다음 루트 사용자가 외부에서 액세스 할 수 있도록 몇 가지 단계를 수행해야합니다.

  1. 사용 안 함 skip-networking에서 my.cnf(예 : /etc/mysql/my.cnf)

  2. bind-addressin의 값을 확인하십시오.로 my.cnf설정되어 있으면 모든 IP 또는 연결하려는 모든 IP에서 액세스를 허용하도록 127.0.0.1변경할 수 있습니다 0.0.0.0.

  3. 모든 IP에서 루트 사용자에게 원격 액세스 권한을 부여하십시오 (또는 대신 IP를 지정하십시오 %).

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
        IDENTIFIED BY 'your_root_password'
        WITH GRANT OPTION;
    FLUSH PRIVILEGES;`
  4. mysql 서비스를 다시 시작합니다.

    sudo service mysql restart

당신은 연결되지 않습니다 방화벽, 그렇지 않으면 원격 클라이언트에서 열린 MySQL의 포트 3306에 필요
데이비드 Okwii을

@Khashayar의 포인트 2에 대한 빠른 알림 : 0.0.0.0은 모든 IPv4 주소를 의미합니다. *는 모든 주소 (IPv4 또는 IPv6)를 의미합니다.
구스타보 Pinsard

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

*.* = DB.TABLE 사용자를 특정 데이터베이스 및 특정 테이블로 제한 할 수 있습니다.

'root'@'%'만든 사용자로 루트를 변경할 수 있으며 %는 모든 IP를 허용하는 것입니다. % .168.1.1 등을 변경하여 제한 할 수도 있습니다.


그래도 해결되지 않으면 my.cnf 또는 my.ini도 수정하고이 행을 주석 처리하십시오.

bind-address = 127.0.0.1#bind-address = 127.0.0.1

skip-networking#skip-networking

  • MySQL을 다시 시작하고 위의 단계를 다시 반복하십시오.

Raspberry Pi, 아래에서 bind-address 구성을 찾았습니다. \etc\mysql\mariadb.conf.d\50-server.cnf


2
*.*'user'@'address'부분 을 설명하는 유일한 답변입니다 . 감사! :)
Philipp

모든 부여 . 해커를 초대합니다.
Rick James

내가 설명하는 이유의 그 *. *
Wasim A.

8

다른 사람들이 공유하는 SQL 권한은 작업을 수행합니다. 여전히 데이터베이스에 액세스 할 수없는 경우 포트에 대한 방화벽 제한이있을 수 있습니다. 연결을 여는 방법은 서버 유형 (및 그 사이의 라우터)에 따라 다릅니다. TCP 포트 3306 인바운드를 열고 외부 시스템에 대해 유사한 액세스 규칙을 제공합니다 (모두 / 서브넷 / 단일 IP / 등).


4

/etc/mysql/mysql.conf.d/mysqld.cnf파일을 열고 다음 줄에 주석을 추가합니다.

#bind-address = 127.0.0.1

Ubuntu 19.4에서 작업
Ngô Văn Thao

3

제 경우에는 cent OS에서 원격 mysql 서버에 연결하려고했습니다. 많은 솔루션 (모든 권한 부여, IP 바인딩 제거, 네트워킹 활성화)을 수행 한 후에도 문제가 여전히 해결되지 않았습니다.

결과적으로 다양한 솔루션을 조사하는 동안 iptables를 발견하여 mysql 포트 3306이 연결을 허용하지 않는다는 것을 깨달았습니다.

이 문제를 확인하고 해결 한 방법에 대한 작은 메모가 있습니다.

  • 포트가 연결을 수락하는지 확인 :
텔넷 (mysql 서버 IP) [portNo]

-포트에서 연결을 허용하는 ip 테이블 규칙 추가 :

iptables -A INPUT -i eth0 -p tcp -m tcp -dport 3306 -j ACCEPT

-프로덕션 환경에서는 권장하지 않지만 iptables가 제대로 구성되지 않은 경우 규칙을 추가해도 문제가 해결되지 않을 수 있습니다. 이 경우 다음을 수행해야합니다.

서비스 iptables 중지

도움이 되었기를 바랍니다.


3

두 단계 :

  1. 와일드 카드로 사용자 설정 :
    create user 'root'@'%' identified by 'some_characters'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD 'some_characters' WITH GRANT OPTION

  2. vim /etc/my.cnf
    다음을 추가하십시오.
    bind-address=0.0.0.0

서버를 다시 시작하면 연결하는 데 문제가 없습니다.


계속해서 "오류 1827 (HY000) : 암호 해시에 예상 한 형식이 없습니다. 올바른 암호 알고리즘이 PASSWORD () 함수와 함께 사용 중인지 확인하십시오." 여기서 내가 뭘 잘못하고 있는지 설명해 주시겠습니까?
lampShadesDrifter

2

mysql 8 이상 버전에서는 권한을 부여하여 사용자를 추가 할 수 없습니다. 이것은 다음 쿼리를 의미합니다.

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

mysql은 다음 오류를 반환합니다.

오류 1064 (42000) : SQL 구문에 오류가 있습니다. 1 행의 'IDENTIFIED BY'written password '근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 설명서를 확인하십시오.

이는 % 도메인에 대한 루트 사용자가 없음을 의미합니다. 따라서 먼저 사용자를 삽입 한 다음 다음과 같은 권한을 부여해야합니다.

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'your password';
Query OK, 0 rows affected (0.11 sec)

mysql> GRANT ALL ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.15 sec)

mysql> FLUSH PRIVILEGES;

암호를 특정 암호로 바꾸는 것을 잊지 마십시오.


0

이것은 나를 위해 일했습니다. 하지만 영향을주지 않는 것을 먼저 시도해 본 이상한 문제가있었습니다. phpmyadmin 페이지를 업데이트하고 어떻게 든 작동하게했습니다.

local-xampp-mysql에 액세스해야하는 경우. xampp-shell-> 명령 프롬프트 열기로 이동할 수 있습니다.

그런 다음 mysql -uroot -p --port = 3306 또는 mysql -uroot -p (암호가 설정된 경우). 그런 다음 mysql 쉘 페이지에서 해당 액세스 권한을 부여 할 수 있습니다 (localhost / phpmyadmin에서도 작동 가능).

누군가 가이 주제를 발견하고 초보자 문제가 있으면 추가하십시오.


0

Ubuntu 18.04

mysqld를 설치하고 실행 중인지 확인합니다.

데이터베이스로 이동하여 루트 사용자를 설정하십시오.

sudo mysql -u root
SELECT User,Host FROM mysql.user;
DROP USER 'root'@'localhost';
CREATE USER 'root'@'%' IDENTIFIED BY 'obamathelongleggedmacdaddy';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

mysqld 권한을 편집하고 다시 시작합니다.

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

# edit the line to be this:
bind-address=0.0.0.0

sudo systemctl stop mysql
sudo systemctl start mysql

다른 컴퓨터에서 test .. mysqld 컴퓨터의 Obvs 포트 (3306)는 테스트 컴퓨터에서 연결을 허용해야합니다.

mysql -u root -p -h 123.456.789.666

MySql의 모든 추가 "보안"은 보안에 전혀 도움이되지 않습니다. 복잡하고 난독 화 될뿐입니다. 이제는 정말 긴 암호를 사용했던 예전보다 실제로 쉽게 망칠 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.