Làm thế nào để cấp quyền truy cập từ xa vào máy chủ mysql cho người dùng?


118

Nếu tôi làm SHOW GRANTStrong cơ sở dữ liệu mysql của mình, tôi nhận được

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

Nếu tôi không nhầm, root@localhostcó nghĩa là người dùng chỉ rootcó thể truy cập máy chủ từ localhost. Làm cách nào để yêu cầu MySQL cấp rootquyền truy cập máy chủ mysql này từ mọi máy khác (trong cùng một mạng)?


6
Thay đổi đơn giản localhostđể %sẽ cấp quyền truy cập gốc vào mạng công cộng. Đừng quênflush privileges;

6
Việc thêm root @% khiến bạn gặp nhiều rủi ro và không nên làm. Tôi biết đây là một bài viết cũ nhưng cảnh báo đó nên ở đây. Tài khoản root là tài khoản đầu tiên bị những kẻ tấn công nhắm mục tiêu và root @ '%' có nghĩa là người dùng root có thể kết nối với tài khoản MySQL của bạn từ bất cứ đâu mà họ thích. Có quá nhiều điều để bao gồm trong các nhận xét, nhưng bạn nên cố gắng xóa càng nhiều người dùng @ '%' càng tốt và bất kỳ người dùng nào được khai báo tại đó sẽ có đặc quyền rất hạn chế. Dù thế nào đi nữa, bạn chắc chắn không nên thêm root @ '%' và các ứng dụng của bạn cũng không nên mong đợi tài khoản đó xuất hiện.
Damon


Xin chào các bạn, nên xóa chuỗi MẬT KHẨU đối với lệnh này ... nó đang gây ra lỗi ... chỉ cần kết thúc với IDENTIFIED BY và sau đó là mật khẩu của chính nó.
Mário de Sá Vera

Câu trả lời:


143

Điều này cấp quyền truy cập root với cùng một mật khẩu từ bất kỳ máy nào trong *.example.com:

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

Nếu phân giải tên không hoạt động, bạn cũng có thể cấp quyền truy cập bằng IP hoặc mạng con:

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

MySQL GRANT cú pháp .


15
Tôi cho rằng ...TO 'root'@'%' IDENTIFIED...sẽ cấp quyền truy cập từ mọi nơi?
Aufwind

3
Tôi đã thực hiện lệnh trong mysql, nhưng SHOW GRANTSvẫn hiển thị tương tự (như trong câu hỏi của tôi). Tôi thậm chí đã làm FLUSH PRIVILGES. Có điều gì tôi bỏ lỡ?
Aufwind

@Aufwind Tôi sẽ không yêu cầu bạn cần bất cứ thứ gì khác ngoài FLUSH PRIVILEGES. Đăng xuất và đăng nhập lại, khởi động lại dịch vụ mysqld nếu bạn có quyền truy cập. Ngoài ra, hãy chắc chắn rằng skip networkingdòng không được bật trong của bạn my.cnfmặc dù điều đó sẽ không giải thích cho việc bạn SHOW GRANTSvẫn không giống nhau.
Michael Berkowski

@Aufwind Nếu không, bạn có thể phải hỏi lại ServerFault.com.
Michael Berkowski

10
Lưu ý rằng IDENTIFIED BY PASSWORDđược đi kèm với một số thập lục phân 41 chữ số được băm. Sử dụng IDENTIFIED BY 'password'nếu bạn muốn bao gồm mật khẩu trực tiếp.
Rainulf

94

Thử:

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

1
umm cái gì Pa55w0rdcó vẻ ngu ngốc, đừng nói với tôi đó là mật khẩu bạn muốn tạo. Đối với tất cả những người cố gắng đăng nhập mysql của bạn?
SSpoke

23
Nó chỉ thường được sử dụng để cung cấp cho người giữ vị trí mật khẩu, nói rằng "đặt mật khẩu tốt đã đọc của bạn ở nơi này".
moshe beeri

2
Lệnh này với cảnh báo thông thường rằng bạn chỉ muốn sử dụng nó cho các ứng dụng không quan tâm đến bảo mật, ví dụ như dev hoặc QA.
einnocent

nếu nó không hoạt động trên mac, hãy thử thay đổi 'root' @ '%' bằng 'root' @ 'localhost' hoặc / etc / hosts tên của máy tính bạn đang cấp đặc quyền.
moshe beeri

2
Đừng quên chạy điều này sau:FLUSH PRIVILEGES;
dane

44

Bạn cần thực hiện một số bước để đảm bảo rằng mysql đầu tiên và sau đó người dùng root có thể truy cập từ bên ngoài:

  1. Tắt skip-networkingtrong my.cnf(ví dụ /etc/mysql/my.cnf:)

  2. Kiểm tra giá trị của bind-addressin my.cnf, nếu nó được đặt thành 127.0.0.1, bạn có thể thay đổi nó thành 0.0.0.0để cho phép truy cập từ tất cả các IP hoặc bất kỳ ip nào bạn muốn kết nối.

  3. Cấp quyền truy cập từ xa cho người dùng root từ bất kỳ ip nào (hoặc chỉ định ip của bạn thay vì %)

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
        IDENTIFIED BY 'your_root_password'
        WITH GRANT OPTION;
    FLUSH PRIVILEGES;`
  4. Khởi động lại dịch vụ mysql:

    sudo service mysql restart

Bạn cũng cần phải mở cổng mysql 3306 từ các khách hàng tường lửa khác từ xa sẽ không kết nối
David Okwii

Chỉ cần một thông báo nhanh về điểm 2 từ @Khashayar: 0.0.0.0 có nghĩa là bất kỳ địa chỉ IPv4 nào. * có nghĩa là BẤT KỲ địa chỉ nào, có thể là IPv4 hoặc IPv6.
Gustavo Pinsard

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

*.* = DB.TABLE bạn có thể hạn chế người dùng đối với cơ sở dữ liệu cụ thể và bảng cụ thể.

'root'@'%'bạn có thể thay đổi quyền root với bất kỳ người dùng nào bạn đã tạo và% là cho phép tất cả IP. Bạn có thể hạn chế nó bằng cách thay đổi% .168.1.1, v.v.


Nếu điều đó không giải quyết được, hãy sửa đổi my.cnf hoặc my.ini và nhận xét những dòng này

bind-address = 127.0.0.1đến #bind-address = 127.0.0.1

skip-networkingđến#skip-networking

  • Khởi động lại MySQL và lặp lại các bước trên một lần nữa.

Raspberry Pi, tôi đã tìm thấy cấu hình địa chỉ ràng buộc trong \etc\mysql\mariadb.conf.d\50-server.cnf


2
Chỉ trả lời giải thích phần *.*'user'@'address'. Cảm ơn! :)
Philipp

Cho phép TẤT CẢ . mời tin tặc tham gia.
Rick James

đó là lý do tại sao tôi giải thích *. *
Wasim A.

8

Các quyền SQL đó mà những người khác đang chia sẻ có hiệu quả. Nếu bạn vẫn không thể truy cập cơ sở dữ liệu, có thể bạn chỉ có một hạn chế tường lửa cho cổng. Nó phụ thuộc vào loại máy chủ của bạn (và bất kỳ bộ định tuyến nào ở giữa) như cách mở kết nối. Mở cổng TCP đến 3306 và cung cấp cho nó một quy tắc truy cập tương tự cho các máy bên ngoài (all / subnet / single IP / etc.).


4

Mở /etc/mysql/mysql.conf.d/mysqld.cnftệp và nhận xét dòng sau:

#bind-address = 127.0.0.1

Làm việc trên Ubuntu 19.4
Ngô Văn Thảo

3

Trong trường hợp của tôi, tôi đang cố gắng kết nối với máy chủ mysql từ xa trên cent OS. Sau khi trải qua rất nhiều giải pháp (cấp tất cả các đặc quyền, xóa các ràng buộc ip, kích hoạt kết nối mạng), vấn đề vẫn không được giải quyết.

Hóa ra, trong khi xem xét các giải pháp khác nhau, tôi bắt gặp iptables, điều này khiến tôi nhận ra cổng mysql 3306 không chấp nhận kết nối.

Đây là một ghi chú nhỏ về cách tôi đã kiểm tra và giải quyết vấn đề này.

  • Kiểm tra xem cổng có chấp nhận kết nối không:
telnet (ip máy chủ mysql) [portNo]

-Thêm quy tắc bảng ip để cho phép kết nối trên cổng:

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j CHẤP NHẬN

-Không khuyến nghị điều này cho môi trường sản xuất, nhưng nếu iptables của bạn không được định cấu hình đúng cách, việc thêm các quy tắc có thể vẫn không giải quyết được sự cố. Trong trường hợp đó, cần thực hiện như sau:

dịch vụ iptables dừng

Hi vọng điêu nay co ich.


3

Hai bước:

  1. thiết lập người dùng với ký tự đại diện:
    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
    thêm những điều sau:
    bind-address=0.0.0.0

khởi động lại máy chủ, bạn sẽ không gặp bất kỳ vấn đề gì khi kết nối với nó.


Tiếp theo, nhận được "ERROR 1827 (HY000): Hàm băm mật khẩu không có định dạng mong đợi. Kiểm tra xem thuật toán mật khẩu chính xác có đang được sử dụng với hàm PASSWORD () hay không." Bạn có thể giải thích những gì tôi đang sai ở đây?
lampShadesDrifter 24/07/19

2

Với phiên bản mysql 8 trở lên, bạn không thể thêm người dùng bằng cách cấp đặc quyền. nó có nghĩa là với truy vấn này:

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

mysql sẽ trả về lỗi này:

LỖI 1064 (42000): Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn sử dụng tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần 'IDENTIFIED BY' mật khẩu đã viết 'ở dòng 1

điều này có nghĩa là bạn không có người dùng root cho% domain. vì vậy, trước tiên bạn cần phải chèn người dùng và sau đó cấp các đặc quyền như sau:

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;

Đừng quên thay thế mật khẩu bằng mật khẩu cụ thể của bạn.


0

Điều này đã làm việc cho tôi. Nhưng có một vấn đề kỳ lạ mà ngay cả khi tôi đã thử đầu tiên thì nó cũng không ảnh hưởng. Tôi đã cập nhật trang phpmyadmin và nó hoạt động bằng cách nào đó.

Nếu bạn cần truy cập vào local-xampp-mysql. Bạn có thể vào xampp-shell -> mở dấu nhắc lệnh.

Sau đó là mysql -uroot -p --port = 3306 hoặc mysql -uroot -p (nếu có đặt mật khẩu). Sau đó, bạn có thể cấp các tài khoản đó từ trang shell mysql (cũng có thể hoạt động từ localhost / phpmyadmin).

Chỉ thêm những điều này nếu ai đó tìm thấy chủ đề này và gặp vấn đề với người mới bắt đầu.


0

Ubuntu 18.04

Cài đặt và đảm bảo mysqld chúng tôi đang chạy ..

Đi vào cơ sở dữ liệu và thiết lập người dùng gốc:

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;

Chỉnh sửa quyền mysqld và khởi động lại:

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

Từ máy khác, kiểm tra .. Cổng Obvs (3306) trên máy mysqld phải cho phép kết nối từ máy kiểm tra.

mysql -u root -p -h 123.456.789.666

Tất cả các "bảo mật" bổ sung của MySql hoàn toàn không giúp bảo mật, nó chỉ làm phức tạp và rối mắt, bây giờ thực sự dễ dàng hơn để vặn nó hơn so với ngày xưa, nơi bạn chỉ sử dụng một mật khẩu thực sự dài.

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.