concedere l'accesso remoto al database MySQL da qualsiasi indirizzo IP


282

Sono a conoscenza di questo comando:

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

Ma poi mi consente solo di concedere un determinato indirizzo IP per accedere a questo database MySQL remoto. Cosa succede se lo voglio in modo che qualsiasi host remoto possa accedere a questo database MySQL? Come lo faccio? Fondamentalmente sto rendendo pubblico questo database in modo che tutti possano accedervi.


1
Prima di fare ciò, considera le implicazioni sulla sicurezza: security.stackexchange.com/questions/63881/…
e18r

7
non tutti i sistemi sono sistemi di produzione. alcune persone hanno bisogno di questo per lo sviluppo.
Conrad Jones,

Risposte:


274
TO 'user'@'%'

% è un carattere jolly: puoi anche fare '%.domain.com'o '%.123.123.123'cose del genere se ne hai bisogno.


@kristopolous Ci sono molte cose che potrebbero causare questo. Questo comando riguarda l'accesso remoto (due macchine diverse). Se non è quello che stai facendo, questo non è il comando giusto. Hai ancora bisogno di una password corretta e di altre cose.
Ariel,

11
Devi usare "flush privileges;" affinché le modifiche
abbiano

Il trucco quando ci si connette a un'istanza db in esecuzione sulla stessa istanza del sistema operativo (ad es. La propria macchina di sviluppo), è passare il -h my_machine_nameparametro. Questo inganna il cliente per identificarti come 'user'@my_machine_name.example.com, piuttosto che 'user'@localhost. In questo modo non è necessario creare e mantenere doppi account e concessioni per entrambi localhoste l'accesso alla rete. E, naturalmente, essere sicuri mysqldè destinata a 0.0.0.0vs. 127.0.0.1.
Charlie Reitzel,

173

Abilita accesso remoto (Concedi) Home / Tutorial / Mysql / Abilita accesso remoto (Concedi) Se provi a connetterti al tuo server mysql da una macchina remota e ti imbatti in un errore come di seguito, questo articolo fa per te.

ERRORE 1130 (HY000): l'host '1.2.3.4' non può connettersi a questo server MySQL

Cambia configurazione mysql

Inizia con la modifica del file di configurazione mysql

vim /etc/mysql/my.cnf

Commenta le seguenti righe.

#bind-address           = 127.0.0.1
#skip-networking

Se non trovi la linea skip-networking, aggiungila e commentala.

Riavvia il server mysql.

~ /etc/init.d/mysql restart

Cambia privilegio GRANT

Potresti essere sorpreso di vedere anche dopo le modifiche di cui sopra che non stai ottenendo l'accesso remoto o l'accesso, ma non riesci a tutti i database.

Per impostazione predefinita, il nome utente e la password mysql in uso sono autorizzati ad accedere a mysql-server localmente. Quindi è necessario aggiornare il privilegio.

Esegui un comando come di seguito per accedere da tutte le macchine. (Sostituisci USERNAMEe PASSWORDcon le tue credenziali.)

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

Esegui un comando come di seguito per consentire l'accesso da un IP specifico. (Sostituisci USERNAMEe PASSWORDcon le tue credenziali.)

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

Puoi sostituire 1.2.3.4 con il tuo IP. È possibile eseguire il comando sopra più volte per concedere l'accesso da più IP.

Puoi anche specificare un accesso separato USERNAMEe PASSWORDper remoto.

Puoi controllare il risultato finale:

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

Infine, potresti anche dover eseguire:

mysql> FLUSH PRIVILEGES;

Test di connessione

Dal terminale / dalla riga di comando:

mysql -h HOST -u USERNAME -pPASSWORD

Se ottieni una shell mysql, non dimenticare di eseguire show database; per verificare se si dispone dei privilegi giusti da macchine remote.

Suggerimento bonus: revoca l'accesso

Se si accede accidentalmente a un utente, è meglio avere a portata di mano l'opzione di revoca.

Di seguito verranno revocate tutte le opzioni per USERNAME da tutte le macchine:

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.

Se vedi il privilegio USAGE dopo aver eseguito il comando REVOKE, va bene. È buono come nessun privilegio. Non sono sicuro che possa essere revocato.


7
Si noti che ho dovuto modificare il /etc/mysql/mysql.conf.d/mysqld.cnffile anziché /etc/mysql/my.cnfcommentare la bind-addressparte. La #skip-networkingriga manca e non deve esserci alcun effetto di aggiunta e commentando la linea.
Pawan,

1
Su MariaDB 10.1.26, il file di configurazione è/etc/mysql/mariadb.conf.d/50-server.cnf
Kwadz,

Se hai fatto tutto quanto sopra e non riesci ancora a connetterti, controlla le impostazioni del tuo firewall, potrebbe essere la porta bloccata 3306o qualunque porta tu abbia impostato
av

37

Supponendo che il passaggio precedente sia completato e che la porta MySql 3306 sia accessibile gratuitamente da remoto; Non dimenticare di associare l'indirizzo IP pubblico nel file di configurazione mysql.

Ad esempio sul mio server Ubuntu:

#nano /etc/mysql/my.cnf

Nel file, cerca il blocco di sezione [mysqld] e aggiungi il nuovo indirizzo di bind, in questo esempio è 192.168.0.116. Sembrerebbe qualcosa del genere

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

.....    
......

è possibile rimuovere l'associazione localhost (127.0.0.1) se si sceglie, ma è necessario fornire in modo specifico un indirizzo IP per accedere al server sul computer locale.

Quindi l'ultimo passaggio è riavviare il server MySql (su Ubuntu)

stop mysql

start mysql

o #/etc/init.d/mysql restartper altri sistemi

Ora è possibile accedere al database MySQL da remoto:

mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reloaddovrebbe bastare
Lorenz Lo Sauer

Ho appena fatto questo e non sono riuscito a connettermi al server mysql da remoto. Ho quindi provato a commentare gli indirizzi di bind e ha funzionato. Ho anche provato ad accedere al server con mysql -u <utente> -p senza specificare l'host e ha funzionato, quindi sembra che "puoi rimuovere l'associazione localhost (127.0.0.1) se scegli, ma poi devi specificatamente fornire un indirizzo IP per accedere al server sul computer locale. " non è corretto. (ubuntu 12.04 LTS server mysql Ver 14.14 Distrib 5.5.34)
Programster

5
La bind-addressdirettiva determina l'indirizzo IP su cui il server mysql è in ascolto; non gli indirizzi IP da cui il server accetta le connessioni.
GoZoner,

1
Dopo aver seguito ogni passaggio non funziona. Viene visualizzato un errore quando si commenta bind-addressl'host locale o l'indirizzo host remoto. 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,

È possibile fornire un indirizzo come abc.abc:1234 anziché 192.168.0.116?
bielas

26

Per chiunque abbia armeggiato con questo, ecco come ho ottenuto i privilegi, spero che aiuti qualcuno

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

Come notato %è un carattere jolly e questo consentirà a qualsiasi indirizzo IP di connettersi al database. Il presupposto che faccio qui è quando ti connetti avrai un utente di nome root(che è l'impostazione predefinita però). Inserisci la password di root e sei a posto. Nota che non ho virgolette singole ( ') intorno alla radice dell'utente.


Perché è importante rimuovere le virgolette singole dall'utente? Perché questo differisce dalle altre risposte (e dal manuale)?
DMCoding

26

Sono necessarie modifiche al file di configurazione per abilitare le connessioni tramite localhost.

Per connettersi tramite IP remoti, accedi come utente "root" ed esegui le query seguenti in 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;

Ciò creerà un nuovo utente accessibile su localhost e da IP remoti.

Commenta anche la riga seguente dal tuo file my.cnf che si trova in /etc/mysql/my.cnf

bind-address = 127.0.0.1

Riavvia il tuo mysql usando

sudo service mysql restart

Ora dovresti essere in grado di connetterti in remoto al tuo mysql.


2
Questo non risponde alla domanda.
Charris,

1
@ChristopheHarris perché ti senti così? La risposta fornisce istruzioni dettagliate su come creare un nuovo utente in MySQL che consenta sia l'accesso locale che remoto al DB usando quell'utente. Puoi spiegarci?
Harishannam,

1
Non funziona per me. Hanno ancora lo stesso errore. Non importa se lo provo con root o con un nuovo utente: Impossibile connettersi al server MySQL su "xxx.xxx.xxx.xxx" ([Errno 61] Connessione rifiutata)
baermathias

21

Usa questo comando:

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

Poi:

FLUSH PRIVILEGES; 

Quindi commentare la riga seguente nel file "/etc/mysql/mysql.conf.d/mysqld.cnf" (è obbligatorio!):

bind-address = 127.0.0.1 

Per me va bene!


Molto buono. Importante la concessione. In caso contrario, molti errori per richieste comeyour-password-does-not-satisfy-the-current-policy-requirements
Alejandro Teixeira Muñoz,

21

Per essere in grado di connettersi con l'utente da qualsiasi indirizzo IP, attenersi alla seguente procedura:

Consenti al server mysql di accettare connessioni remote. Per questo file mysqld.conf aperto:

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

Cerca la riga che inizia con "bind-address" e imposta il suo valore su 0.0.0.0

bind-address                    = 0.0.0.0

e infine salva il file.

Nota: se si esegue MySQL 8+, la bind-addressdirettiva non sarà nel mysqld.cnffile per impostazione predefinita. In questo caso, aggiungi la direttiva alla fine del file /etc/mysql/mysql.conf.d/mysqld.cnf.

Ora riavvia il server mysql, con systemdo usa il servicecomando precedente . Questo dipende dal tuo sistema operativo:

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

Infine, il server mysql è ora in grado di accettare connessioni remote.

Ora dobbiamo creare un utente e concedergli l'autorizzazione, in modo da poter accedere con questo utente da remoto.

Connettiti al database MySQL come root o qualsiasi altro utente con privilegio di root.

mysql -u root -p

ora crea l'utente desiderato sia in localhost che nel carattere jolly '%' e concedi le autorizzazioni su tutti i DB in quanto tali.

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

Poi,

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

E infine non dimenticare di svuotare i privilegi

FLUSH PRIVILEGES;

Nota: se hai configurato un firewall sul tuo server di database, dovrai anche aprire la porta 3306predefinita di MySQL per consentire il traffico su MySQL.

Spero che questo ti aiuti ;)


2
sudo systemctl restart mysqld.service è per debian, ho dovuto usare sudo systemctl restart mysql.service è per ubuntu
ani0904071

Ho aggiornato la mia risposta e aggiunto il comando mysql restart per entrambe le distribuzioni. grazie @ ani0904071
Imtiaz Shakil Siddique l'

17

Eseguire quanto segue:

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

Quindi provare una connessione dall'indirizzo IP specificato:

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

Dovresti essere in grado di connetterti.


15

È possibile risolvere il problema di MariaDB tramite questo comando :

Nota:

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

%è un jolly. In questo caso, si riferisce a tutti gli indirizzi IP.


3
in mysql, ciò che devi fare è (1) .cambiare il contenuto my.cnf (2) .grant utente remoto (3) gestire il tuo firewall per ascoltare la porta 3306.
未来 陆家嘴 顶尖 的 投资 人

Mi hai salvato la giornata. Apprezzalo!
Almett,


7

Per accedere in remoto al database Mysql server 8:

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

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

FLUSH PRIVILEGES;

5
  • INIZIA MYSQL usando l'utente admin
    • mysql -u admin-user -p (INSERISCI PASSWORD SU PROMPT)
  • Crea un nuovo utente:
    • CREA UTENTE 'newuser' @ '%' IDENTIFICATO DA 'password'; (% -> anyhost)
  • Privilegi concessi:
    • GRANT SELECT, DELETE, INSERT, UPDATE ON db_name. * TO 'newuser' @ '%';
    • FLUSH PRIVILEGES;

Se si esegue un'istanza EC2, non dimenticare di aggiungere le regole in entrata nel gruppo di sicurezza con MYSQL / Aurura.


5

Modifica file:

/etc/mysql/percona-server.cnf

Aggiungi sotto il codice nel file.

[mysqld] bind-address = 0.0.0.0

Crea utente per l'accesso remoto.

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

Tutti i server Linux funzionano,

Per MSWin c: \ Trova percorso di installazione \ percorso file


[mysqld] è necessario aggiungerlo nel file, altrimenti non funziona correttamente
Tejas Tank

3

Basta creare l'utente in alcuni database come

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

Quindi vai a

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfe cambia la linea bind-address = 127.0.0.1inbind-address = 0.0.0.0

Successivamente è possibile connettersi a quel database da qualsiasi IP.


3

Apri il tuo mysql consoleed esegui il seguente comando (inserisci il nome del tuo database, nome utente e password):

CONCEDERE TUTTO sul nome del tuo database. * TO admin @ '%' IDENTIFICATO DA 'yourRootPassword';

Quindi eseguire:

FLUSH PRIVILEGES;

Apri la riga di comando e apri il file /etc/mysql/mysql.conf.d/mysqld.cnfusando qualsiasi editor con root privileges.

Per esempio:

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

Quindi commentare la riga seguente:

bind-address = 127.0.0.1

Riavvia mysql per riflettere le modifiche usando il comando:

sudo service mysql restart

Godere ;)


2

È necessario modificare il file di configurazione mysql:

Inizia con la modifica del file di configurazione mysql

vim /etc/mysql/my.cnf

Inserisci:

bind-address = 0.0.0.0

0

Nei pannelli di siti Web come cPanel è possibile aggiungere un singolo %(segno di percentuale) nei nomi host consentiti per accedere al database MySQL.

Aggiungendo un singolo %è possibile accedere al database da qualsiasi IP o sito Web anche da applicazioni desktop.


per favore non fare riferimento a qualcosa come cPanel quando viene presentata una query semplice, questo non mostrerà mai un risultato funzionante per nessun altro
Tobias Hagenbeek

@TobiasHagenbeek Grazie per il tuo feedback. Questo metodo / trucco non è stato inventato da me (è comune su Internet). Ma sono uno dei tester di questo metodo e ho scoperto che è il metodo più semplice e funzionante ed è per questo che l'ho pubblicato qui. So che ci sono alcuni rischi per la sicurezza in questo metodo che possono essere trascurati.
Muhammad Saqib,

0

Ad esempio nel mio CentOS

sudo gedit /etc/mysql/my.cnf

commentare le seguenti righe

# bind-address = 127.0.0.1

poi

sudo service mysqld restart


0

Se si desidera concedere l'accesso remoto al database da qualsiasi indirizzo IP, eseguire il comando mysql e successivamente eseguire il comando seguente.

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

0

ciò che ha funzionato su Ubuntu è garantire tutti i privilegi all'utente:

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

e impostando l'indirizzo di bind in /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address            = 0.0.0.0

quindi riavviando il demone mysql:

service mysql restart

-7

Puoi disabilitare tutta la sicurezza modificando /etc/my.cnf:

skip-grant-tables

questo rimuove tutti i requisiti di password
kristopolous

5
Si noti che non è consigliabile abilitare questa opzione in un ambiente di produzione, in quanto ciò consente a chiunque di connettersi senza password!
Dopo il

tuttavia, questo è l'ideale per un ambiente di sviluppo
DMCoding

Ciò consente alle persone di hackerare il database senza utilizzare una password.
MilkyWay90,

@DanielJames anche per l'ambiente di sviluppo è un'idea terribile
Dragas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.