cấp quyền truy cập từ xa cơ sở dữ liệu MySQL từ bất kỳ địa chỉ IP nào


280

Tôi biết lệnh này:

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

Nhưng sau đó nó chỉ cho phép tôi cấp một địa chỉ IP cụ thể để truy cập cơ sở dữ liệu MySQL từ xa này. Điều gì xảy ra nếu tôi muốn nó để bất kỳ máy chủ từ xa nào có thể truy cập cơ sở dữ liệu MySQL này? Làm thế nào để làm điều đó? Về cơ bản tôi đang làm cho cơ sở dữ liệu này công khai để mọi người có thể truy cập nó.


1
Trước khi làm điều này, hãy xem xét ý nghĩa bảo mật
e18r

7
không phải mọi hệ thống là một hệ thống sản xuất. một số người cần điều này để phát triển
Conrad Jones

Câu trả lời:


272
TO 'user'@'%'

% là ký tự đại diện - bạn cũng có thể làm '%.domain.com'hoặc '%.123.123.123'những thứ tương tự nếu bạn cần.


@kristopolous Có rất nhiều thứ có thể gây ra điều đó. Lệnh này là về truy cập từ xa (hai máy khác nhau). Nếu đó không phải là những gì bạn đang làm thì đây không phải là lệnh đúng. Bạn vẫn cần một mật khẩu chính xác và những thứ khác.
Ariel

11
Bạn phải sử dụng "đặc quyền tuôn ra;" để các thay đổi có hiệu lực
Didier Sampaolo

Thủ thuật khi kết nối với một cá thể db chạy trên cùng một phiên bản HĐH (ví dụ: máy phát triển của bạn), là truyền vào -h my_machine_nametham số. Điều này lừa khách hàng để xác định bạn là 'user'@my_machine_name.example.com, chứ không phải 'user'@localhost. Bằng cách này, bạn không cần tạo và duy trì tài khoản kép và tài trợ cho cả localhosttruy cập mạng và. Và, tất nhiên, hãy chắc chắn mysqldlà ràng buộc để 0.0.0.0vs 127.0.0.1.
Charlie Reitzel

173

Bật quyền truy cập từ xa (Cấp) Trang chủ / Hướng dẫn / Mysql / Bật quyền truy cập từ xa (Cấp) Nếu bạn cố gắng kết nối với máy chủ mysql của mình từ máy từ xa và gặp lỗi như bên dưới, bài viết này là dành cho bạn.

LRI 1130 (HY000): Máy chủ '1.2.3.4' không được phép kết nối với máy chủ MySQL này

Thay đổi cấu hình mysql

Bắt đầu với việc chỉnh sửa tập tin cấu hình mysql

vim /etc/mysql/my.cnf

Nhận xét ra các dòng sau.

#bind-address           = 127.0.0.1
#skip-networking

Nếu bạn không tìm thấy đường dây bỏ qua, hãy thêm nó và nhận xét nó.

Khởi động lại máy chủ mysql.

~ /etc/init.d/mysql restart

Thay đổi đặc quyền GRANT

Bạn có thể ngạc nhiên khi thấy ngay cả sau khi thay đổi ở trên, bạn không nhận được quyền truy cập từ xa hoặc có quyền truy cập nhưng không thể vào tất cả các cơ sở dữ liệu.

Theo mặc định, tên người dùng và mật khẩu mysql bạn đang sử dụng được phép truy cập máy chủ mysql cục bộ. Vì vậy, cần phải cập nhật đặc quyền.

Chạy một lệnh như dưới đây để truy cập từ tất cả các máy. (Thay thế USERNAMEPASSWORDbằng thông tin đăng nhập của bạn.)

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

Chạy một lệnh như dưới đây để cấp quyền truy cập từ IP cụ thể. (Thay thế USERNAMEPASSWORDbằng thông tin đăng nhập của bạn.)

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

Bạn có thể thay thế 1.2.3.4 bằng IP của mình. Bạn có thể chạy lệnh trên nhiều lần để truy cập GRANT từ nhiều IP.

Bạn cũng có thể chỉ định riêng USERNAME& PASSWORDđể truy cập từ xa.

Bạn có thể kiểm tra kết quả cuối cùng bằng cách:

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

Cuối cùng, bạn cũng có thể cần phải chạy:

mysql> FLUSH PRIVILEGES;

Kiểm tra kết nối

Từ thiết bị đầu cuối / dòng lệnh:

mysql -h HOST -u USERNAME -pPASSWORD

Nếu bạn nhận được một vỏ mysql, đừng quên chạy cơ sở dữ liệu hiển thị; để kiểm tra xem bạn có quyền đặc quyền từ các máy từ xa không.

Tiền thưởng: Thu hồi quyền truy cập

Nếu bạn vô tình cấp quyền truy cập cho người dùng, tốt hơn là nên thu hồi tùy chọn tiện dụng.

Sau đây sẽ thu hồi tất cả các tùy chọn cho USERNAME từ tất cả các máy:

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.

Nếu bạn thấy đặc quyền USAGE sau khi chạy lệnh REVOKE, thì tốt thôi. Nó là tốt như không có đặc quyền nào cả. Tôi không chắc chắn nếu nó có thể bị thu hồi.


7
Lưu ý rằng tôi đã phải thay đổi /etc/mysql/mysql.conf.d/mysqld.cnftập tin thay vì /etc/mysql/my.cnfnhận xét bind-addressphần. Các #skip-networkingdòng là mất tích và không nên có tác dụng bổ sung và cho ý kiến dòng.
Pawan

1
Trên MariaDB 10.1.26, tệp cấu hình là/etc/mysql/mariadb.conf.d/50-server.cnf
Kwadz

Nếu bạn đã thực hiện tất cả các điều trên mà vẫn không thể kết nối, hãy kiểm tra cài đặt tường lửa của bạn, có thể là chặn cổng 3306hoặc bất kỳ cổng nào bạn đã thiết lập
avn 18/03/19

37

Giả sử rằng bước trên đã hoàn thành và cổng MySql 3306 được truy cập miễn phí từ xa; Đừng quên liên kết địa chỉ IP công cộng trong tệp cấu hình mysql.

Ví dụ: trên máy chủ Ubuntu của tôi:

#nano /etc/mysql/my.cnf

Trong tệp, tìm kiếm khối phần [mysqld] và thêm địa chỉ liên kết mới, trong ví dụ này là 192.168.0.116. Nó sẽ trông giống như thế này

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

.....    
......

bạn có thể loại bỏ ràng buộc localhost (127.0.0.1) nếu bạn chọn, nhưng sau đó bạn phải cung cấp một địa chỉ IP cụ thể để truy cập máy chủ trên máy cục bộ.

Sau đó, bước cuối cùng là khởi động lại máy chủ MySql (trên ubfox)

stop mysql

start mysql

hoặc #/etc/init.d/mysql restartcho các hệ thống khác

Bây giờ cơ sở dữ liệu MySQL có thể được truy cập từ xa bằng cách:

mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reloadnên đủ
Lorenz Lo Sauer

Tôi chỉ làm điều này và không thể kết nối với máy chủ mysql từ xa. Sau đó tôi đã cố gắng bình luận các địa chỉ liên kết và nó đã hoạt động. Tôi cũng đã thử đăng nhập vào máy chủ bằng mysql -u <user> -p mà không chỉ định máy chủ và nó hoạt động, vì vậy có vẻ như "bạn có thể xóa ràng buộc localhost (127.0.0.1) nếu bạn chọn, nhưng sau đó bạn phải cụ thể cung cấp địa chỉ IP để truy cập máy chủ trên máy cục bộ. " không đúng (ubfox 12.04 LTS máy chủ mysql Ver 14,14 Distrib 5.5.34)
trình viên

5
Lệnh bind-addressxác định địa chỉ IP mà máy chủ mysql lắng nghe; không phải là địa chỉ IP mà máy chủ chấp nhận kết nối.
GoZoner

1
Sau khi làm theo từng bước, nó không hoạt động. Tôi gặp lỗi khi nhận xét bind-addressđịa chỉ localhost hoặc địa chỉ remotehost. 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

Có thể cung cấp địa chỉ như abc.abc:1234 thay vì 192.168.0.116 không?
bielas

26

Đối với bất kỳ ai dò dẫm điều này, đây là cách tôi có được các đặc quyền, hy vọng nó sẽ giúp được ai đó

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

Như đã lưu ý %là ký tự đại diện và điều này sẽ cho phép mọi địa chỉ IP kết nối với cơ sở dữ liệu của bạn. Giả định tôi đưa ra ở đây là khi bạn kết nối bạn sẽ có một người dùng được đặt tên root(mặc dù đó là mặc định). Thức ăn trong mật khẩu gốc và bạn tốt để đi. Lưu ý rằng tôi không có dấu ngoặc đơn ( ') xung quanh gốc người dùng.


Tại sao loại bỏ các trích dẫn duy nhất từ ​​người dùng quan trọng? Tại sao điều này khác với các câu trả lời khác (và hướng dẫn)?
DMCoding

26

Thay đổi tập tin cấu hình là cần thiết để cho phép kết nối thông qua localhost.

Để kết nối thông qua IP từ xa, Đăng nhập với tư cách là người dùng "root" và chạy các truy vấn bên dưới trong 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;

Điều này sẽ tạo một người dùng mới có thể truy cập trên localhost cũng như từ các IP từ xa.

Đồng thời nhận xét dòng dưới đây từ tệp my.cnf của bạn nằm trong /etc/mysql/my.cnf

bind-address = 127.0.0.1

Khởi động lại mysql của bạn bằng cách sử dụng

sudo service mysql restart

Bây giờ bạn sẽ có thể kết nối từ xa với mysql của bạn.


2
Điều này không trả lời câu hỏi.
CHarris

1
@ChristopheHarris tại sao bạn cảm thấy như vậy? Câu trả lời rõ ràng đưa ra hướng dẫn từng bước về cách tạo người dùng mới trong MySQL cho phép cả localhost và truy cập từ xa vào DB bằng cách sử dụng người dùng đó. Bạn có thể giải thích plesae?
harishannam

1
Không làm việc cho tôi. Vẫn có lỗi tương tự. Bất kể tôi dùng thử với root hay người dùng mới: Không thể kết nối với máy chủ MySQL trên 'xxx.xxx.xxx.xxx' ([Errno 61] Kết nối bị từ chối)
baermathias

21

Sử dụng lệnh này:

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

Sau đó:

FLUSH PRIVILEGES; 

Sau đó nhận xét dòng dưới đây trong tệp "/etc/mysql/mysql.conf.d/mysqld.cnf" (là bắt buộc!):

bind-address = 127.0.0.1 

Làm việc cho tôi!


Rất tốt. Quan trọng là cấp. Nếu không, rất nhiều lỗi cho các yêu cầu nhưyour-password-does-not-satisfy-the-current-policy-requirements
Alejandro Teixeira Muñoz

21

Để có thể kết nối với người dùng của bạn từ bất kỳ địa chỉ IP nào, hãy làm như sau:

Cho phép máy chủ mysql chấp nhận kết nối từ xa. Đối với tệp mysqld.conf mở này:

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

Tìm kiếm dòng bắt đầu bằng "địa chỉ liên kết" và đặt giá trị của nó thành 0.0.0.0

bind-address                    = 0.0.0.0

và cuối cùng lưu tập tin.

Lưu ý: Nếu bạn đang chạy MySQL 8+, lệnh bind-addresssẽ không có trong mysqld.cnftệp theo mặc định. Trong trường hợp này, thêm lệnh vào dưới cùng của tệp /etc/mysql/mysql.conf.d/mysqld.cnf.

Bây giờ khởi động lại máy chủ mysql, bằng systemdhoặc sử dụng servicelệnh cũ hơn . Điều này phụ thuộc vào hệ điều hành của bạn:

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

Cuối cùng, máy chủ mysql hiện có thể chấp nhận các kết nối từ xa.

Bây giờ chúng tôi cần tạo một người dùng và cấp quyền cho nó, vì vậy chúng tôi có thể đăng nhập với người dùng này từ xa.

Kết nối với cơ sở dữ liệu MySQL dưới dạng root hoặc bất kỳ người dùng nào khác có quyền root.

mysql -u root -p

bây giờ tạo người dùng mong muốn trong cả localhost và ký tự đại diện '%' và cấp quyền trên tất cả các DB như vậy.

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

Sau đó,

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

Và cuối cùng đừng quên tuôn ra đặc quyền

FLUSH PRIVILEGES;

Lưu ý: Nếu bạn đã cấu hình tường lửa trên máy chủ cơ sở dữ liệu của mình, bạn cũng sẽ cần mở cổng 3306mặc định của MySQL để cho phép lưu lượng truy cập vào MySQL.

Hi vọng điêu nay co ich ;)


2
sudo systemctl restart mysqld.service dành cho debian, tôi đã phải sử dụng sudo systemctl restart mysql.service dành cho
ubfox

Tôi đã cập nhật câu trả lời của mình và thêm lệnh khởi động lại mysql cho cả hai bản phân phối. cảm ơn @ ani0904071
Imtiaz Shakil Siddique

17

Chạy như sau:

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

Sau đó thử kết nối từ địa chỉ IP bạn đã chỉ định:

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

Bạn sẽ có thể kết nối.


15

Bạn có thể giải quyết vấn đề của MariaDB thông qua lệnh này :

Ghi chú:

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

%là một ký tự đại diện. Trong trường hợp này, nó đề cập đến tất cả các địa chỉ IP.


3
trong mysql, những gì bạn cần làm là (1) .change nội dung my.cnf (2). người dùng từ xa (3) đối phó với tường lửa của bạn để nghe cổng 3306.
未来 陆家嘴 顶尖

Bạn đã cứu ngày của tôi. Cảm kích điều đó!
Almett


7

Để truy cập từ xa cơ sở dữ liệu Máy chủ Mysql 8:

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

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

FLUSH PRIVILEGES;

5
  • BẮT ĐẦU MYSQL bằng quản trị viên
    • mysql -u admin-user -p (ENTER PASSWORD ON PromPT)
  • Tạo người dùng mới:
    • TẠO NGƯỜI DÙNG 'người dùng mới' @ '%' được xác định bởi 'mật khẩu'; (% -> anyhost)
  • Cấp đặc quyền:
    • GRANT CHỌN, XÓA, XÁC NHẬN, CẬP NHẬT TRÊN db_name. * ĐẾN 'người dùng mới' @ '%';
    • QUYỀN RIÊNG TƯ;

Nếu bạn đang chạy EC2, đừng quên thêm các quy tắc trong nhóm bảo mật với MYSQL / Aurura.


5

Chỉnh sửa tập tin:

/etc/mysql/percona-server.cnf

Nối mã dưới đây trong tập tin.

[mysqld] bind-address = 0.0.0.0

Tạo người dùng để truy cập từ xa.

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

Tất cả các máy chủ linux hoạt động,

Đối với MSWin c: \ Tìm vị trí không xác định vị trí \ đường dẫn tệp


[mysqld] cần thêm vào tệp, nếu không thì không hoạt động đúng
Tejas Tank

3

Chỉ cần tạo người dùng đến một số cơ sở dữ liệu như

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

Sau đó đi đến

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfvà thay đổi dòng bind-address = 127.0.0.1thànhbind-address = 0.0.0.0

Sau đó, bạn có thể kết nối với cơ sở dữ liệu đó từ bất kỳ IP nào.


3

Mở của bạn mysql consolevà thực hiện lệnh sau (nhập tên cơ sở dữ liệu, tên người dùng và mật khẩu của bạn):

CẤP TẤT CẢ TRÊN tên tập tin của bạn. * CHO admin @ '%' được xác định bởi 'yourRootPassword';

Sau đó thực thi:

QUYỀN RIÊNG TƯ;

Mở dòng lệnh và mở tệp /etc/mysql/mysql.conf.d/mysqld.cnfbằng bất kỳ trình soạn thảo nào root privileges.

Ví dụ:

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

Sau đó bình luận ra dòng dưới đây:

địa chỉ liên kết = 127.0.0.1

Khởi động lại mysql để phản ánh các thay đổi bằng lệnh:

sudo service mysql restart

Thưởng thức ;)


2

Bạn cần thay đổi tập tin cấu hình mysql:

Bắt đầu với việc chỉnh sửa tập tin cấu hình mysql

vim /etc/mysql/my.cnf

thêm vào:

bind-address = 0.0.0.0

0

Trong bảng điều khiển trang web như cPanel, bạn có thể thêm một %(ký hiệu phần trăm) trong tên máy chủ được phép để truy cập cơ sở dữ liệu MySQL của bạn.

Bằng cách thêm một, %bạn có thể truy cập cơ sở dữ liệu của mình từ bất kỳ IP hoặc trang web nào ngay cả từ các ứng dụng máy tính để bàn.


vui lòng không đề cập đến một thứ như cPanel khi một truy vấn thẳng được đưa ra, điều này sẽ không bao giờ hiển thị kết quả làm việc cho bất kỳ ai khác
Tobias Hagenbeek 7/07/2015

@TobiasHagenbeek Cảm ơn bạn đã phản hồi. Phương pháp / mẹo này không phải do tôi phát minh (Nó phổ biến trên internet). Nhưng tôi là một trong những người thử nghiệm phương pháp này và tôi thấy nó là phương pháp dễ nhất và hiệu quả nhất đó là lý do tại sao tôi đăng nó ở đây. Tôi biết có một số rủi ro bảo mật trong phương pháp này có thể bị bỏ qua.
Muhammad Saqib

0

Ví dụ trong CentOS của tôi

sudo gedit /etc/mysql/my.cnf

bình luận những dòng sau

# bind-address = 127.0.0.1

sau đó

sudo dịch vụ khởi động lại mysqld


0

Nếu bạn muốn cấp quyền truy cập từ xa cơ sở dữ liệu của bạn từ bất kỳ địa chỉ IP nào, hãy chạy lệnh mysql và sau đó chạy lệnh sau.

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

0

những gì hoạt động trên Ubuntu là cấp tất cả các đặc quyền cho người dùng:

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

và đặt địa chỉ liên kết trong /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address            = 0.0.0.0

sau đó khởi động lại daemon mysql:

service mysql restart

-7

Bạn có thể vô hiệu hóa tất cả bảo mật bằng cách chỉnh sửa /etc/my.cnf:

skip-grant-tables

việc này sẽ xóa tất cả các yêu cầu về mật khẩu
kristopolous

5
Lưu ý rằng không nên bật tùy chọn này trong môi trường sản xuất, vì điều này cho phép mọi người kết nối mà không cần mật khẩu!
AStopher

tuy nhiên, điều này lý tưởng cho môi trường nhà phát triển
DMCoding

Điều này cho phép mọi người hack cơ sở dữ liệu của bạn mà không cần sử dụng mật khẩu.
MilkyWay90

@DanielJames ngay cả đối với môi trường phát triển, đó là một ý tưởng tồi tệ
Dragas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.