Introduzione
La gestione degli utenti è una delle responsabilità più importanti di chiunque speri di gestire un sistema di database MySQL. La creazione, la modifica e l'eliminazione di account utente per rappresentare al meglio gli utenti e i servizi nell'ambiente aiutano a gettare le basi per bloccare l'accesso, limitare l'ambito delle modifiche e implementare il controllo e la responsabilità per le modifiche.
In questa guida parleremo di come gestire gli account utente all'interno di MySQL. Per prima cosa, discuteremo cos'è un utente valido in MySQL e ti mostreremo come aggiungere altri utenti al sistema. Ciò porta a una discussione su come configurare l'autenticazione per ciascun utente e su come il sistema sceglie un'opzione di autenticazione da un elenco di possibilità. Continueremo a parlare di come apportare modifiche agli utenti esistenti, come accedere con gli account che hai creato e come eliminare gli utenti che non ti servono più.
Prerequisiti
Per seguire questa guida, avrai bisogno di un account su un server MySQL con i privilegi appropriati.
Comandi che useremo
Per creare, modificare ed eliminare utenti all'interno di MySQL, i comandi principali di cui hai bisogno sono:
CREATE USER
:crea un nuovo account utenteALTER USER
:apporta modifiche a un account utente esistenteDROP USER
:rimuove un account utente esistente
Privilegi richiesti
Per eseguire i comandi sopra, devi accedere a MySQL con un account con CREATE USER
privilegi. Il CREATE USER
privilegio consente di creare, modificare, eliminare e rinominare utenti, tra le altre azioni. Avremo anche bisogno del SELECT
privilegio su mysql
database per visualizzare le informazioni sugli utenti esistenti.
In ordine di preferenza, dovresti effettuare il login utilizzando:
- Un account limitato che ha il
CREATE USER
privilegio e ilSELECT
privilegio sumysql
banca dati - La
root
o utente amministrativo con privilegi completi all'interno di MySQL
Capire come MySQL definisce e interpreta gli account utente
Prima di iniziare a creare nuovi account, è utile prendersi del tempo per familiarizzare con i vari che MySQL utilizza per creare e fare riferimento agli utenti. Devi anche avere familiarità con l'algoritmo di autenticazione di MySQL per capire quale account utente utilizzerà per autenticare le connessioni.
Qual è la sintassi di MySQL per gli account utente?
In MySQL, gli account utente sono composti da due informazioni separate, unite da una chiocciola (@):
- Il nome utente
- L'host da cui l'utente si sta connettendo
In generale, gli account utente sul sistema avranno il seguente aspetto:
'<user>'@'<host>'
Le virgolette singole possono essere utilizzate, come sopra, per avvolgere individualmente i componenti utente e host dell'account utente. A volte sono necessari se uno dei componenti contiene caratteri che altrimenti verrebbero interpretati erroneamente. In generale, aggiungerli è sempre una buona idea per essere espliciti.
Quindi, piuttosto che avere un account chiamato 'john'
, in MySQL, il nome completo dell'account richiede un qualche tipo di host, come 'john'@'localhost'
. Ciò significa che potrebbero esserci più 'john'
account sul sistema e MySQL li visualizzerà come un account univoco purché provenga da un dominio diverso.
Detto questo, è possibile definire account utente che non hanno un utente o un componente host, ma ci sono importanti implicazioni di cui devi essere consapevole.
Puoi definire un account utente senza un valore utente utilizzando una stringa vuota:
''@'<host>'
Ad esempio, puoi creare un utente come ''@'localhost'
. Questo utente corrisponderebbe a qualsiasi nome utente che si connette dal computer locale.
Allo stesso modo, potresti avere un account utente che corrisponde a qualsiasi host. Invece di usare una stringa vuota, per i valori host dovresti usare il %
carattere jolly, come questo:
'<user>'@'%'
Ad esempio, se crei 'john'@'%'
, quell'account corrisponderebbe a un 'john'
utente che si connette da qualsiasi ospite.
Come fa MySQL ad autenticare gli utenti?
Comprendere come MySQL elabora effettivamente ogni richiesta di autenticazione è molto importante per evitare una classe comune di problemi di autenticazione che derivano da presupposti ragionevoli ma errati. Questo è stato discusso in modo approfondito nella nostra introduzione all'autenticazione e all'autorizzazione nell'articolo MySQL.
Quando si autentica una richiesta di connessione, MySQL utilizza una serie di campi all'interno di user
tabella del suo mysql
interno database per decidere se consentire la connessione. MySQL utilizzerà al massimo uno record dell'account utente per provare ad autenticare una connessione. Ciò significa che MySQL ha bisogno di un modo per decidere quale account utente utilizzare se sono presenti più account che potrebbero corrispondere a una connessione.
L'algoritmo di MySQL per l'autenticazione degli utenti inizia all'avvio del server. All'avvio, MySQL carica l'intero mysql.user
tabella in memoria. Lo fa anche ogni volta che vengono creati account utente utilizzando i normali comandi MySQL. Quando carica la tabella, ordina le voci dalla priorità più alta alla più bassa.
MySQL usa l'Host
colonna come campo di ordinamento principale e assegna la priorità ai risultati con valori più specifici. Quindi i valori letterali sono ordinati in alto come priorità più alta e quelli che utilizzano caratteri jolly, come %
, sono ordinate fino in fondo. Le voci finali sono quelle che contengono solo %
senza altri caratteri, seguiti da voci che hanno un host completamente vuoto.
L'User
colonna viene utilizzata come campo di ordinamento secondario per tutte le voci che hanno lo stesso Host
valore. Ancora una volta, le corrispondenze più esatte hanno la priorità. Dal momento che l'User
la colonna non può utilizzare caratteri jolly, tutte le voci sono allo stesso livello tranne quelle con un User
vuoto valore. Quelli sono ordinati fino in fondo. Se qualsiasi voce con un User
vuoto selezionato, l'utente verrà autenticato come "utente anonimo", che di solito equivale a non avere privilegi.
Ora, ogni volta che viene effettuata una richiesta di connessione, MySQL scorre la sua tabella ordinata in memoria dall'alto verso il basso. Utilizza il primo voce che trova per autenticare l'utente, indipendentemente dalla presenza di altre voci che corrisponderebbero. Se il client non riesce ad autenticarsi utilizzando il metodo definito da quella voce, la connessione avrà esito negativo e non verranno verificate altre voci.
Quali sono le implicazioni della mancata inclusione di un utente o di un host nella definizione di un account utente MySQL?
A causa dell'algoritmo di autenticazione di MySQL, possono emergere problemi se non si sta attenti durante la creazione di account utente senza un utente o un componente host. Questo perché il modo in cui MySQL decide quale record utilizzare per autenticarti può essere poco intuitivo e sorprendente.
Ad esempio, se un utente si autentica su MySQL con la parte utente come stringa vuota, MySQL lo considererà un "utente anonimo" per il resto della sessione. Di norma, gli utenti anonimi non hanno quasi alcun potere e possono fare ben poco una volta connessi. È anche possibile autenticarsi accidentalmente come utente anonimo quando si tenta di autenticarsi utilizzando un account utente diverso.
La sfida con l'utilizzo di host con caratteri jolly per gli account utente è quell'altro account utente che include un valore host può facilmente mascherare o rendere non disponibile l'account utente che utilizza il carattere jolly.
Ad esempio, se hai un account utente definito come 'emily'@'%'
, potresti aspettarti di essere in grado di autenticarti su 'emily'
da qualsiasi host. Tuttavia, se hai un account utente con un utente vuoto ma un valore host che corrisponde all'host 'emily'
si sta connettendo, MySQL eseguirà invece l'autenticazione utilizzando quell'account (portando a un accesso anonimo dell'utente come descritto sopra).
Ad esempio, MySQL ordinerà i seguenti account nel seguente ordine:
Priorità | Account MySQL | Commenti |
---|---|---|
1 | 'emily'@'localhost' e 'emily'@'example.com' | Questi hanno la stessa priorità, il che va bene perché è possibile che solo uno di essi corrisponda a una connessione. |
2 | ''@'localhost' e ''@'example.com' | Queste due voci hanno, ancora una volta, la stessa priorità. Dal momento che non hanno un componente utente, ma lo fanno hanno un componente host letterale, sono posizionati in fondo alle voci che hanno valori host esatti. |
3 | 'emily'@'%.example.com' | Questa voce ha un carattere jolly nel componente host, quindi ha una priorità inferiore rispetto alle voci con valori host esatti. |
4 | ''@'%.example.com' | Questa voce è raggruppata con le voci che hanno un carattere jolly all'interno del loro valore host. Poiché non ha componenti utente, è in fondo a questo gruppo. |
5 | 'emily'@'%' | Questa voce ha un valore host costituito solo da un carattere jolly. Poiché corrisponde a qualsiasi host, ha una priorità molto bassa. |
7 | ''@'%' | Questa voce può essere utilizzata per autenticare qualsiasi utente da qualsiasi host come utente anonimo. Ha una priorità estremamente bassa poiché corrisponde a qualsiasi connessione. |
6 | 'emily'@'' | Questa voce ha un valore host completamente vuoto, che ha una priorità ancora più bassa rispetto a un host che contiene solo un host con caratteri jolly. |
8 | ''@'' | Questo è l'utente con la priorità più bassa possibile. Non contiene informazioni sull'host, quindi viene posizionato alla fine durante l'ordinamento dell'host. Poiché contiene anche un utente vuoto, viene posizionato sotto le altre voci di questo gruppo. Come tutte le voci senza un utente, le connessioni autenticate con questa voce verranno registrate come utenti anonimi. |
Come crei gli utenti?
Ora che hai un'idea del modo in cui MySQL gestisce gli account utente, possiamo iniziare a creare nuovi utenti. Ricordati di accedere con un utente con i privilegi descritti nei prerequisiti.
Sintassi di base
La sintassi di base per creare un nuovo utente è relativamente semplice. Usi il CREATE USER
comando e quindi specificare l'utente e l'host per il nuovo account:
CREATE USER '<user>'@'<host>';
Questo creerà un account di base senza configurare alcun dettaglio oltre al suo utente e host al momento della creazione.
Come si crea un utente con una password?
Spesso si desidera configurare l'autenticazione durante la creazione dell'utente. Puoi farlo aggiungendo l'opzione IDENTIFIED BY
clausola su CREATE USER
dichiarazione:
CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';
Questo crea un nuovo account utente, come prima, e allo stesso tempo assegna una password per l'account. Tratteremo come assegnare una password dopo il fatto o come modificare la password di un utente in seguito.
Come si crea un utente con l'autenticazione socket Unix?
Sebbene l'autenticazione tramite password sia il metodo di autenticazione più comune per la maggior parte degli utenti, non è l'unica opzione. MySQL fornisce molti diversi meccanismi di autenticazione interni ed esterni che puoi configurare per i tuoi account utente da utilizzare. Ad esempio, configureremo un nuovo account utilizzando l'autenticazione socket Unix.
L'autenticazione socket Unix può essere utilizzata in ambienti Linux o simili a Unix in modo che un account sul sistema operativo possa accedere allo stesso nome account all'interno di MySQL senza ulteriore autenticazione. In questa configurazione, l'amministratore MySQL sa che gli account utente sul sistema operativo sono strettamente controllati.
Quindi se c'è un mary
utente sul sistema operativo, potranno accedere a 'mary'@'localhost'
account all'interno di MySQL se l'autenticazione del socket Unix è il meccanismo di autenticazione definito. configuriamolo ora.
L'autenticazione socket richiede auth_socket
plug-in, quindi prima carica il plug-in digitando:
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Quindi, crea un account utente che corrisponda a un account utente che hai sul tuo sistema operativo. Per questo esempio useremo mary
conto di cui abbiamo parlato sopra. Se non utilizzi un nome che corrisponda a uno dei nomi del tuo sistema operativo, non potrai autenticarti utilizzando questo utente.
Per creare l'utente con autenticazione socket, dobbiamo utilizzare il IDENTIFIED WITH
clausola (diversa da IDENTIFIED BY
clausola utilizzata in precedenza) per specificare il plug-in di autenticazione da utilizzare:
CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;
Ora dovresti essere in grado di autenticarti su 'mary'@'localhost'
Utente MySQL da mary
utente sul proprio sistema operativo. Dopo aver effettuato l'accesso come mary
, connettersi al database senza fornire nome utente o password:
mysql
Dovresti accedere automaticamente tramite l'autenticazione del socket Unix che hai configurato.
Come mostri gli utenti esistenti?
Successivamente, diamo un'occhiata a come trovare informazioni sugli utenti esistenti.
Per mostrare tutti gli utenti MySQL esistenti, inclusi i loro componenti utente e host, nonché il plug-in di autenticazione che stanno attualmente utilizzando, puoi SELECT
quei campi da mysql.user
banca dati:
SELECT user,host,plugin FROM mysql.user
+------------------+-----------+-----------------------+ user | host | plugin |+------------------+-----------+-----------------------+ mary | localhost | auth_socket | mysql.infoschema | localhost | caching_sha2_password | mysql.session | localhost | caching_sha2_password | mysql.sys | localhost | caching_sha2_password | root | localhost | caching_sha2_password | useradmin | localhost | caching_sha2_password |+------------------+-----------+-----------------------+6 rows in set (0.00 sec)
Qui possiamo vedere che ci sono sei utenti definiti sul sistema, che possono accedere solo localmente. Cinque degli account sono configurati per utilizzare l'autenticazione tramite password. Il 'mary'@'localhost'
l'account è configurato per utilizzare l'autenticazione socket Unix.
Possiamo trovare ulteriori informazioni sulle proprietà dell'utente utilizzando SHOW CREATE USER
comando. Nonostante il nome, mostra tutte le proprietà correnti di un account utente, non necessariamente quelle utilizzate durante la creazione iniziale dell'account.
Il SHOW CREATE USER
il comando accetta un nome account come argomento:
SHOW CREATE USER '<user>'@'<host>'\G
Di solito è meglio terminare il comando con \G
terminatore dell'istruzione invece dei soliti due punti (;
) in modo da poter visualizzare i risultati un po' più chiaramente.
Per visualizzare le proprietà per 'useradmin'@'localhost'
account, dovresti digitare:
SHOW CREATE USER 'useradmin'@'localhost'\G
*************************** 1. row ***************************CREATE USER for useradmin@localhost: CREATE USER 'useradmin'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$O Rl7lM;@Gt{roB4EWchqDdYM142Lq7pfzcCNiK4yUxnRBlrAgr0sE3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT1 row in set (0.00 sec)
Come si cambiano gli utenti MySQL esistenti?
Puoi cambiare gli utenti esistenti all'interno di MySQL usando ALTER USER
comando. Questo può essere utilizzato per modificare la maggior parte delle proprietà relative all'utente di un account, ad eccezione dei privilegi dell'account, che sono controllati da GRANT
e REVOKE
comandi.
La sintassi di base per ALTER USER
assomiglia a questo:
ALTER USER <user> <properties_to_change>;
Come si cambia la password per un utente MySQL?
Per la maggior parte delle persone, l'uso più comune di ALTER USER
è modificare le password.
Ad esempio, puoi modificare la password per 'kamal'@'localhost'
digitando:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';
Se desideri impostare una password temporanea per un utente che dovrà sostituire immediatamente, puoi impostare e far scadere una password contemporaneamente:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;
Puoi sempre cambiare la tua password, anche senza il CREATE USER
privilegio. È più facile usare USER()
funzione per inserire automaticamente il tuo nome utente:
ALTER USER USER() IDENTIFIED BY '<new_password>';
Come si cambiano i plug-in di autenticazione per un utente MySQL?
Puoi anche modificare il meccanismo o il plug-in utilizzato per autenticare un account.
In un esempio precedente, abbiamo configurato un account chiamato 'mary'@'localhost'
per utilizzare l'autenticazione socket Unix. Se in seguito desideriamo modificare l'account per utilizzare l'autenticazione con password convenzionale, possiamo utilizzare il ALTER USER
comando di nuovo.
Innanzitutto, identifica il plug-in di autenticazione predefinito per il tuo server. Se si tratta di un metodo di autenticazione basato su password, probabilmente è meglio riutilizzare la selezione predefinita:
SHOW VARIABLES LIKE 'default_authentication_plugin';
In questo caso, il plug-in di autenticazione predefinito è caching_sha2_password
, quindi lo useremo quando passeremo all'autenticazione della password.
Ora cambia 'mary'@'localhost'
per utilizzare il caching_sha2_password
plug-in con una nuova password:
ALTER USER 'mary'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<marys_password>';
Il 'mary'@'localhost'
l'utente non sarà più in grado di accedere utilizzando l'autenticazione socket Unix, ma può accedere utilizzando la password fornita.
Come si accede a MySQL?
Abbiamo discusso di come creare e modificare gli account utente MySQL, inclusa l'autenticazione. Tuttavia, non abbiamo parlato di come accedere effettivamente utilizzando questi metodi di autenticazione.
Il mysql
client è un potente client a riga di comando che può essere utilizzato per connettersi a database locali e remoti. Lo useremo per parlare di come autenticare utilizzando i metodi che abbiamo configurato in precedenza.
Come si accede a un database locale con una password?
Per accedere a un database MySQL ospitato localmente utilizzando un account utente con una password, la sintassi di base è la seguente:
mysql --user=<username> --password <dbname>
Quindi, se il 'kamal'@'localhost'
l'utente vuole accedere a MySQL e connettersi al testing
database dal computer in cui è ospitato il sistema, possono digitare:
mysql --user=kamal --password testing
Il mysql
il client richiederà la password per 'kamal'@'localhost'
. Se fornisci le credenziali corrette, verrai connesso al testing
banca dati.
La specifica di un database sulla riga di comando è facoltativa. Se non ne viene specificato nessuno, ti connetterai al server ma non a un database specifico.
Come si accede a un database locale con l'autenticazione socket Unix?
Per accedere a un server MySQL locale utilizzando l'autenticazione socket Unix, è necessario accedere al proprio sistema operativo come nome account corrispondente. Quindi, se vogliamo autenticarci su 'mary'@'localhost'
usando l'autenticazione socket Unix, dobbiamo prima accedere al nostro computer con un nome utente chiamato mary
.
Dopo aver utilizzato l'account del sistema operativo corretto, puoi connetterti direttamente al database locale eseguendo il client, senza opzioni.
mysql
Come prima, puoi facoltativamente aggiungere un nome di database per connetterti a un database specifico che desideri.
Come si accede a un database remoto con una password?
Se il tuo server MySQL non è in esecuzione sul tuo server locale, dovrai specificare l'host a cui il client dovrebbe tentare di connettersi. Puoi farlo aggiungendo il --host
opzione.
La maggior parte delle volte, eseguirai l'autenticazione con una password su server MySQL remoti, quindi il comando sarebbe simile a questo:
mysql --user=<username> --password --host=<host> <dbname>
Quindi 'tanya'@'<tanyas_domain>'
potrebbe connettersi a un server MySQL situato su example.com
digitando:
mysql --user='tanya' --password --host='example.com'
Come si eliminano gli utenti MySQL?
Mantenere gli account utente in giro che non servono più a uno scopo è un rischio per la sicurezza. Puoi rimuovere facilmente gli account con il DROP USER
comando.
La sintassi di base è simile alla seguente:
DROP USER '<user>'@'<host>';
Quindi per eliminare il 'mary'@'localhost'
utente, dovresti digitare:
DROP USER 'mary'@'localhost';
Se provi a eliminare un utente che non esiste, riceverai un errore:
ERROR 1396 (HY000): Operation DROP USER failed for 'mary'@'localhost'
Per evitare ciò, puoi aggiungere il IF EXISTS
clausola prima del nome dell'account. Se l'utente esiste, verrà eliminato. In caso contrario, verrà dato solo un avviso:
Query OK, 0 rows affected, 1 warning (0.00 sec)
Conclusione
La configurazione dell'autenticazione e della gestione dell'account utente di MySQL è estremamente flessibile. Imparare a creare, modificare e ottenere informazioni sugli utenti all'interno di MySQL ti aiuterà ad amministrare i tuoi sistemi di database in modo più efficace.
Le best practice di sicurezza impongono di creare account per ogni caso d'uso univoco, dato solo il livello di accesso richiesto per eseguire il relativo ambito. La creazione e l'autenticazione dell'account sono le prime fasi di questo processo. In un'altra guida parleremo della concessione e della revoca dei privilegi per realizzare l'altra parte di tale strategia.