sql >> Database >  >> RDS >> Mysql

Gebruikers en authenticatie beheren in MySQL


Inleiding

Gebruikersbeheer is een van de belangrijkste verantwoordelijkheden van iedereen die een MySQL-databasesysteem wil beheren. Door gebruikersaccounts aan te maken, te wijzigen en te verwijderen om de gebruikers en services in uw omgeving zo goed mogelijk weer te geven, wordt de basis gelegd voor het vergrendelen van de toegang, het beperken van de ruimte voor wijzigingen en het implementeren van controle en verantwoording voor wijzigingen.

In deze handleiding zullen we het hebben over het beheren van gebruikersaccounts binnen MySQL. Eerst bespreken we wat een geldige gebruiker is in MySQL en laten we u zien hoe u extra gebruikers aan het systeem kunt toevoegen. Dit leidt tot een discussie over het configureren van authenticatie voor elke gebruiker en hoe het systeem een ​​authenticatie-optie kiest uit een lijst met mogelijkheden. We gaan verder met praten over het aanbrengen van wijzigingen aan bestaande gebruikers, hoe u inlogt met de accounts die u heeft gemaakt en hoe u gebruikers verwijdert die u niet langer nodig heeft.



Vereisten

Om deze handleiding te volgen, heeft u een account op een MySQL-server nodig met de juiste rechten.


Opdrachten die we zullen gebruiken

Om gebruikers binnen MySQL aan te maken, aan te passen en te verwijderen, zijn de belangrijkste commando's die u nodig hebt:

  • CREATE USER :maak een nieuw gebruikersaccount aan
  • ALTER USER :wijzigingen aanbrengen in een bestaand gebruikersaccount
  • DROP USER :een bestaand gebruikersaccount verwijderen


Vereiste privileges

Om de bovenstaande commando's uit te voeren, moet je inloggen op MySQL met een account met CREATE USER voorrechten. De CREATE USER privilege stelt u onder andere in staat om gebruikers aan te maken, te wijzigen, te verwijderen en te hernoemen. We hebben ook de SELECT . nodig privilege op de mysql database om informatie over bestaande gebruikers te bekijken.

In volgorde van voorkeur moet u inloggen met:

  • Een beperkt account met de CREATE USER privilege en de SELECT privilege op de mysql database
  • De root of administratieve gebruiker met volledige bevoegdheden binnen MySQL



Begrijpen hoe MySQL gebruikersaccounts definieert en interpreteert

Voordat we beginnen met het maken van nieuwe accounts, is het handig om even de tijd te nemen om vertrouwd te raken met de verschillende die MySQL gebruikt voor het maken en verwijzen naar gebruikers. U moet ook bekend zijn met het authenticatie-algoritme van MySQL om te begrijpen welk gebruikersaccount het zal gebruiken om verbindingen te verifiëren.


Wat is de syntaxis van MySQL voor gebruikersaccounts?

In MySQL zijn gebruikersaccounts samengesteld uit twee afzonderlijke stukjes informatie, verbonden door een apenstaartje (@):

  • De gebruikersnaam
  • De host waarmee de gebruiker verbinding maakt

Over het algemeen zien gebruikersaccounts op het systeem er als volgt uit:

'<user>'@'<host>'

Enkele aanhalingstekens kunnen, zoals hierboven, worden gebruikt om de gebruikers- en hostcomponenten van het gebruikersaccount afzonderlijk in te pakken. Ze zijn soms nodig als een van de componenten tekens bevat die anders verkeerd zouden worden geïnterpreteerd. Over het algemeen is het altijd een goed idee om ze toe te voegen om expliciet te zijn.

Dus in plaats van alleen een account met de naam 'john' , in MySQL zou de volledige accountnaam een ​​soort host vereisen, zoals 'john'@'localhost' . Dit betekent dat er meerdere 'john' . kunnen zijn accounts op het systeem en MySQL zal elk van hen als een uniek account beschouwen, zolang ze maar van een ander domein komen.

Dit gezegd hebbende, is het mogelijk om gebruikersaccounts te definiëren die geen gebruikers- of hostcomponent hebben, maar er zijn belangrijke implicaties waarvan u zich bewust moet zijn.

U kunt een gebruikersaccount zonder gebruikerswaarde definiëren door een lege tekenreeks te gebruiken:

''@'<host>'

U kunt bijvoorbeeld een gebruiker maken als ''@'localhost' . Deze gebruiker komt overeen met elke gebruikersnaam die verbinding maakt vanaf de lokale computer.

Evenzo kunt u een gebruikersaccount hebben dat overeenkomt met elke host. In plaats van een lege tekenreeks te gebruiken, gebruikt u voor hostwaarden de % jokerteken, zoals dit:

'<user>'@'%'

Als u bijvoorbeeld 'john'@'%' . aanmaakt , dat account zou overeenkomen met een 'john' gebruiker die verbinding maakt vanuit elke gastheer.



Hoe authenticeert MySQL gebruikers?

Begrijpen hoe MySQL elk authenticatieverzoek daadwerkelijk verwerkt, is erg belangrijk om een ​​veelvoorkomende klasse van authenticatieproblemen te voorkomen die het gevolg zijn van redelijke, maar onjuiste veronderstellingen. Dit is uitgebreid besproken in onze inleiding tot authenticatie en autorisatie in het MySQL-artikel.

Bij het verifiëren van een verbindingsverzoek gebruikt MySQL een aantal velden binnen de user tabel van zijn interne mysql database om te beslissen of de verbinding wordt toegestaan. MySQL gebruikt maximaal een gebruikersaccountrecord om te proberen een verbinding te verifiëren. Dit betekent dat MySQL een manier nodig heeft om te beslissen welk gebruikersaccount moet worden gebruikt als er meer dan één account is dat overeenkomt met een verbinding.

Het algoritme van MySQL voor het verifiëren van gebruikers begint wanneer de server opstart. Bij het opstarten laadt MySQL de volledige mysql.user tabel in het geheugen. Het doet dit ook wanneer gebruikersaccounts worden aangemaakt met de reguliere MySQL-commando's. Terwijl het de tabel laadt, sorteert het de items van de hoogste prioriteit naar de laagste.

MySQL gebruikt de Host kolom als het primaire sorteerveld en geeft prioriteit aan resultaten met meer specifieke waarden. Letterlijke waarden worden dus bovenaan gesorteerd als de hoogste prioriteit en waarden die jokertekens gebruiken, zoals % , worden onderaan gesorteerd. De laatste vermeldingen zijn degene die alleen % . bevatten zonder andere tekens, gevolgd door items met een volledig lege host.

De User kolom wordt gebruikt als secundair sorteerveld voor alle items met dezelfde Host waarde. Nogmaals, de meer exacte overeenkomsten krijgen voorrang. Sinds de User kolom kan geen jokertekens gebruiken, alle vermeldingen staan ​​op gelijke voet, behalve die met een lege User waarde. Die zijn tot op de bodem gesorteerd. Indien een invoer met een blanco User waarde is geselecteerd, wordt de gebruiker geauthenticeerd als een "anonieme gebruiker", wat meestal neerkomt op het hebben van geen privileges.

Wanneer er nu een verbindingsverzoek wordt gedaan, doorloopt MySQL de gesorteerde tabel in het geheugen van boven naar beneden. Het gebruikt de eerste invoer die het vindt om de gebruiker te authenticeren, ongeacht of er andere vermeldingen zijn die ook overeenkomen. Als de client er niet in slaagt om te authenticeren met behulp van de methode die door dat item is gedefinieerd, mislukt de verbinding en worden er geen andere items gecontroleerd.



Wat zijn de implicaties van het niet opnemen van een gebruiker of host in een MySQL-gebruikersaccountdefinitie?

Vanwege het authenticatie-algoritme van MySQL kunnen er problemen ontstaan ​​als u niet voorzichtig bent bij het maken van gebruikersaccounts zonder een gebruikers- of hostcomponent. Dit komt omdat de manier waarop MySQL beslist welke record u moet gebruiken om u te verifiëren, niet intuïtief en verrassend kan zijn.

Als een gebruiker zich bijvoorbeeld bij MySQL authenticeert met het gebruikersgedeelte als een lege string, zal MySQL hem voor de rest van de sessie als een "anonieme gebruiker" beschouwen. In de regel hebben anonieme gebruikers bijna geen macht en kunnen ze heel weinig doen als ze eenmaal zijn aangesloten. Het is zelfs mogelijk om per ongeluk te authenticeren als een anonieme gebruiker wanneer u probeert te authenticeren met een ander gebruikersaccount.

De uitdaging met het gebruik van jokertekens hosts voor gebruikersaccounts is dat andere gebruikersaccounts die bevatten een hostwaarde kan het gebruikersaccount dat het jokerteken gebruikt gemakkelijk maskeren of onbeschikbaar maken.

Als u bijvoorbeeld een gebruikersaccount heeft gedefinieerd als 'emily'@'%' , je zou verwachten dat je je kunt authenticeren bij 'emily' van welke gastheer dan ook. Als u echter een gebruikersaccount heeft met een lege gebruiker maar een hostwaarde die overeenkomt met de host 'emily' verbinding maakt, zal MySQL in plaats daarvan authenticeren met dat account (wat leidt tot een anonieme gebruikerslogin zoals hierboven beschreven).

Dus als voorbeeld, MySQL sorteert de volgende accounts in de volgende volgorde:

Prioriteit MySQL-account Opmerkingen
1 'emily'@'localhost' en 'emily'@'example.com' Deze hebben dezelfde prioriteit, en dat is oké, want het is slechts mogelijk dat een van hen overeenkomt met een verbinding.
2 ''@'localhost' en ''@'example.com' Deze twee items hebben weer dezelfde prioriteit. Omdat ze geen gebruikerscomponent hebben, maar ze wel een letterlijke hostcomponent hebben, worden ze onderaan de items met exacte hostwaarden geplaatst.
3 'emily'@'%.example.com' Dit item heeft een jokerteken in de hostcomponent, dus het heeft een lagere prioriteit dan items met exacte hostwaarden.
4 ''@'%.example.com' Dit item is gegroepeerd met de items die een jokerteken hebben binnen hun hostwaarde. Omdat het geen gebruikerscomponent heeft, staat het onderaan deze groep.
5 'emily'@'%' Dit item heeft een hostwaarde die alleen uit een jokerteken bestaat. Omdat het overeenkomt met elke host, heeft het een zeer lage prioriteit.
7 ''@'%' Dit item kan worden gebruikt om elke gebruiker van elke host te authenticeren als een anonieme gebruiker. Het heeft een extreem lage prioriteit omdat het overeenkomt met elke verbinding.
6 'emily'@'' Dit item heeft een geheel lege hostwaarde, die zelfs een lagere prioriteit heeft dan een host die alleen een host met jokertekens bevat.
8 ''@'' Dit is de gebruiker met de laagst mogelijke prioriteit. Het bevat geen hostinformatie, dus het wordt aan het einde geplaatst tijdens het sorteren van de host. Omdat het ook een lege gebruiker bevat, wordt het onder andere items in deze groep geplaatst. Zoals alle vermeldingen zonder een gebruiker, worden verbindingen die met deze vermelding zijn geverifieerd, aangemeld als een anonieme gebruiker.



Hoe maakt u gebruikers aan?

Nu je een idee hebt van de manier waarop MySQL met gebruikersaccounts omgaat, kunnen we beginnen met het maken van nieuwe gebruikers. Vergeet niet in te loggen met een gebruiker met de privileges beschreven in de vereisten.


Basissyntaxis

De basissyntaxis voor het maken van een nieuwe gebruiker is relatief eenvoudig. U gebruikt de CREATE USER commando en specificeer vervolgens de gebruiker en host voor het nieuwe account:

CREATE USER '<user>'@'<host>';

Hiermee wordt een basisaccount gemaakt zonder verdere details dan de gebruiker en host bij het maken.



Hoe maak je een gebruiker aan met een wachtwoord?

Vaak wilt u authenticatie configureren terwijl u de gebruiker aanmaakt. U kunt dit doen door de optionele IDENTIFIED BY . toe te voegen clausule op CREATE USER verklaring:

CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';

Hiermee wordt een nieuw gebruikersaccount gemaakt, zoals voorheen, en wordt tegelijkertijd een wachtwoord voor het account toegewezen. We bespreken hoe u achteraf een wachtwoord kunt toewijzen of hoe u het wachtwoord van een gebruiker later kunt wijzigen.



Hoe maak je een gebruiker aan met Unix-socket-authenticatie?

Hoewel wachtwoordverificatie voor de meeste gebruikers de meest gebruikelijke verificatiemethode is, is het niet de enige optie. MySQL biedt veel verschillende interne en externe authenticatiemechanismen die u kunt configureren om uw gebruikersaccounts te gebruiken. Als voorbeeld zullen we een nieuw account configureren met Unix-socket-authenticatie.

Unix-socket-authenticatie kan worden gebruikt in Linux- of Unix-achtige omgevingen, zodat een account op het besturingssysteem zonder verdere authenticatie toegang krijgt tot dezelfde accountnaam binnen MySQL. In deze configuratie weet de MySQL-beheerder dat gebruikersaccounts op het besturingssysteem streng worden gecontroleerd.

Dus als er een mary . is gebruiker op het besturingssysteem, kunnen ze inloggen op de 'mary'@'localhost' account binnen MySQL als Unix-socketverificatie het gedefinieerde verificatiemechanisme is. Laten we dit nu configureren.

Socket-authenticatie vereist de auth_socket plug-in, dus laad eerst de plug-in door te typen:

INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

Maak vervolgens een gebruikersaccount aan dat overeenkomt met een gebruikersaccount dat u op uw besturingssysteem hebt. Voor dit voorbeeld gebruiken we de mary rekening die we hierboven hebben besproken. Als u geen naam gebruikt die overeenkomt met een van uw besturingssysteemnamen, kunt u zich niet verifiëren met deze gebruiker.

Om de gebruiker met socket-authenticatie aan te maken, moeten we de IDENTIFIED WITH . gebruiken clausule (anders dan de IDENTIFIED BY eerder gebruikte clausule) om de authenticatie-plug-in op te geven die moet worden gebruikt:

CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;

Nu zou u zich moeten kunnen authenticeren bij de 'mary'@'localhost' MySQL-gebruiker van de mary gebruiker op uw besturingssysteem. Wanneer ingelogd als mary , maak verbinding met de database zonder een gebruikersnaam of wachtwoord op te geven:

mysql

U moet automatisch worden aangemeld via de Unix-socketverificatie die u hebt geconfigureerd.




Hoe laat je bestaande gebruikers zien?

Laten we vervolgens eens kijken hoe we informatie over de bestaande gebruikers kunnen vinden.

Om alle bestaande MySQL-gebruikers te tonen, bestaande uit hun gebruikers- en hostcomponent, evenals de authenticatie-plug-in die ze momenteel gebruiken, kunt u SELECT die velden uit de mysql.user databank:

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)

Hier kunnen we zien dat er zes gebruikers zijn gedefinieerd op het systeem, die allemaal alleen lokaal kunnen inloggen. Vijf van de accounts zijn geconfigureerd om wachtwoordverificatie te gebruiken. De 'mary'@'localhost' account is geconfigureerd om Unix-socketverificatie te gebruiken.

We kunnen aanvullende informatie over gebruikerseigenschappen vinden met behulp van de SHOW CREATE USER opdracht. Ondanks zijn naam toont het alle huidige eigenschappen van een gebruikersaccount, niet noodzakelijk degene die werden gebruikt tijdens het aanmaken van het account.

De SHOW CREATE USER commando neemt een accountnaam als argument:

SHOW CREATE USER '<user>'@'<host>'\G

Het is meestal het beste om de opdracht te beëindigen met de \G statement terminator in plaats van de gebruikelijke dubbele punt (; ) zodat u de resultaten wat duidelijker kunt zien.

Om de eigenschappen weer te geven voor de 'useradmin'@'localhost' account, typ je:

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)


Hoe verander je bestaande MySQL-gebruikers?

U kunt bestaande gebruikers binnen MySQL wijzigen met behulp van de ALTER USER opdracht. Dit kan worden gebruikt om de meeste gebruikersgerelateerde eigenschappen van een account te wijzigen, met uitzondering van accountprivileges, die worden beheerd door de GRANT en REVOKE commando's.

De basissyntaxis voor ALTER USER ziet er zo uit:

ALTER USER <user> <properties_to_change>;

Hoe verander je het wachtwoord voor een MySQL-gebruiker?

Voor de meeste mensen is het meest voorkomende gebruik van ALTER USER is om wachtwoorden te wijzigen.

U kunt bijvoorbeeld het wachtwoord wijzigen voor 'kamal'@'localhost' door te typen:

ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';

Als je een tijdelijk wachtwoord wilt instellen voor een gebruiker die hij onmiddellijk moet vervangen, kun je een wachtwoord tegelijkertijd instellen en laten verlopen:

ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;

U kunt altijd uw eigen wachtwoord wijzigen, zelfs zonder de CREATE USER voorrecht. Het is het gemakkelijkst om de USER() . te gebruiken functie om automatisch je eigen gebruikersnaam in te vullen:

ALTER USER USER() IDENTIFIED BY '<new_password>';


Hoe verander je authenticatie-plug-ins voor een MySQL-gebruiker?

U kunt ook het mechanisme of de plug-in wijzigen die wordt gebruikt om een ​​account te verifiëren.

In een eerder voorbeeld hebben we een account geconfigureerd met de naam 'mary'@'localhost' om Unix-socket-authenticatie te gebruiken. Als we dat account later willen wijzigen om conventionele wachtwoordauthenticatie te gebruiken, kunnen we de ALTER USER gebruiken commando opnieuw.

Identificeer eerst de standaard authenticatie-plug-in voor uw server. Als het een authenticatiemethode op basis van een wachtwoord is, is het waarschijnlijk het beste om de standaardselectie opnieuw te gebruiken:

SHOW VARIABLES LIKE 'default_authentication_plugin';

In dit geval is de standaard authenticatie-plug-in caching_sha2_password , dus we gebruiken dat wanneer we overschakelen naar wachtwoordverificatie.

Verander nu 'mary'@'localhost' om het caching_sha2_password . te gebruiken plug-in met een nieuw wachtwoord:

ALTER USER 'mary'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<marys_password>';

De 'mary'@'localhost' gebruiker kan niet langer inloggen met Unix-socket-authenticatie, maar ze kunnen inloggen met het opgegeven wachtwoord.




Hoe log je in op MySQL?

We hebben besproken hoe u MySQL-gebruikersaccounts kunt maken en wijzigen, inclusief authenticatie. We hebben het echter nog niet gehad over hoe u daadwerkelijk kunt inloggen met deze authenticatiemethoden.

De mysql client is een krachtige opdrachtregelclient die kan worden gebruikt om verbinding te maken met lokale en externe databases. We zullen het gebruiken om te praten over authenticatie met behulp van de methoden die we hierboven hebben geconfigureerd.


Hoe log je in op een lokale database met een wachtwoord?

Om in te loggen op een lokaal gehoste MySQL-database met een gebruikersaccount met een wachtwoord, ziet de basissyntaxis er als volgt uit:

mysql --user=<username> --password <dbname>

Dus, als de 'kamal'@'localhost' gebruiker wil inloggen op MySQL en verbinding maken met de testing database vanaf de computer waarop het systeem wordt gehost, kunnen ze typen:

mysql --user=kamal --password testing

De mysql client vraagt ​​om het wachtwoord voor 'kamal'@'localhost' . Als u de juiste inloggegevens opgeeft, wordt u doorverbonden met de testing database.

Het opgeven van een database op de opdrachtregel is optioneel. Als er geen is opgegeven, maakt u verbinding met de server, maar niet met een specifieke database.



Hoe log je in op een lokale database met Unix-socket-authenticatie?

Om in te loggen op een lokale MySQL-server met behulp van Unix-socketverificatie, moet u zijn aangemeld bij uw besturingssysteem als de accountnaam die overeenkomt. Dus, als we ons willen authenticeren bij 'mary'@'localhost' met behulp van Unix-socket-authenticatie moeten we eerst inloggen op onze computer met een gebruikersnaam genaamd mary .

Zodra u het juiste besturingssysteemaccount gebruikt, kunt u rechtstreeks verbinding maken met de lokale database door de client uit te voeren, zonder opties.

mysql

Zoals eerder kunt u optioneel een databasenaam toevoegen om verbinding te maken met een specifieke database die u wilt.



Hoe log je in op een externe database met een wachtwoord?

Als uw MySQL-server niet op uw lokale server draait, moet u de host specificeren waarmee de client verbinding moet proberen te maken. U kunt dat doen door de --host . toe te voegen optie.

Meestal verifieert u zich met een wachtwoord voor externe MySQL-servers, dus de opdracht ziet er ongeveer zo uit:

mysql --user=<username> --password --host=<host> <dbname>

Dus 'tanya'@'<tanyas_domain>' kan verbinding maken met een MySQL-server op example.com door te typen:

mysql --user='tanya' --password --host='example.com' 



Hoe verwijder je MySQL-gebruikers?

Het in de buurt houden van gebruikersaccounts die geen doel meer dienen, is een veiligheidsrisico. U kunt accounts eenvoudig verwijderen met de DROP USER commando.

De basissyntaxis ziet er als volgt uit:

DROP USER '<user>'@'<host>';

Dus om de 'mary'@'localhost' . te verwijderen gebruiker, typt u:

DROP USER 'mary'@'localhost';

Als u een gebruiker probeert te verwijderen die niet bestaat, krijgt u een foutmelding:

ERROR 1396 (HY000): Operation DROP USER failed for 'mary'@'localhost'

Om dit te voorkomen, kunt u de IF EXISTS . toevoegen clausule voor de accountnaam. Als de gebruiker bestaat, wordt deze verwijderd. Als dit niet het geval is, wordt er alleen een waarschuwing gegeven:

Query OK, 0 rows affected, 1 warning (0.00 sec)


Conclusie

MySQL's gebruikersaccountbeheer en authenticatieconfiguratie is zeer flexibel. Door te leren hoe u gebruikers binnen MySQL kunt maken, wijzigen en verkrijgen, kunt u uw databasesystemen effectiever beheren.

Best practices op het gebied van beveiliging schrijven voor dat u accounts moet maken voor elke unieke use-case, gezien alleen het toegangsniveau dat nodig is om hun reikwijdte uit te voeren. Accountcreatie en authenticatie zijn de eerste fasen van dit proces. In een andere gids zullen we praten over het verlenen en intrekken van privileges om het andere deel van die strategie te vervullen.




  1. Ik heb het SQL Server ODBC-stuurprogramma geüpgraded en de prestaties zijn negatief beïnvloed. Wat kan ik doen?

  2. Hoe weet ik wanneer SQL Full Text Index Population is voltooid?

  3. Hoe u join-query's kunt maken met Sequelize op Node.js

  4. Database herstellen vanuit noodmodus in SQL Server