sql >> Databasteknik >  >> RDS >> Mysql

Hur man hanterar användare och autentisering i MySQL


Introduktion

Användarhantering är en av de viktigaste uppgifterna för alla som hoppas kunna hantera ett MySQL-databassystem. Att skapa, ändra och ta bort användarkonton för att bäst representera användarna och tjänsterna i din miljö hjälper till att lägga grunden för att låsa åtkomst, begränsa utrymmet för ändringar och implementera revision och ansvar för ändringar.

I den här guiden kommer vi att prata om hur man hanterar användarkonton inom MySQL. Först kommer vi att diskutera vad en giltig användare är i MySQL och visa dig hur du lägger till ytterligare användare till systemet. Detta leder till en diskussion om hur man konfigurerar autentisering för varje användare och hur systemet väljer ett autentiseringsalternativ från en lista med möjligheter. Vi fortsätter att prata om att göra ändringar i befintliga användare, hur man loggar in med de konton du har skapat och hur man tar bort användare som du inte längre behöver.



Förutsättningar

För att följa den här guiden behöver du ett konto på en MySQL-server med lämpliga rättigheter.


Kommandon vi kommer att använda

För att skapa, ändra och ta bort användare inom MySQL, är kärnkommandona du behöver:

  • CREATE USER :skapa ett nytt användarkonto
  • ALTER USER :gör ändringar i ett befintligt användarkonto
  • DROP USER :ta bort ett befintligt användarkonto


Obligatoriska rättigheter

För att utföra kommandona ovan måste du logga in på MySQL med ett konto med CREATE USER privilegier. CREATE USER privilegium låter dig skapa, ändra, ta bort och byta namn på användare, bland andra åtgärder. Vi behöver också SELECT privilegium på mysql databas för att se information om befintliga användare.

I prioritetsordning bör du logga in med:

  • Ett begränsat konto som har CREATE USER privilegium och SELECT privilegium på mysql databas
  • root eller administrativ användare som har fullständiga rättigheter inom MySQL



Förstå hur MySQL definierar och tolkar användarkonton

Innan vi börjar skapa nya konton är det bra att ta lite tid att bekanta sig med de olika som MySQL använder för att skapa och hänvisa till användare. Du måste också vara bekant med MySQL:s autentiseringsalgoritm för att förstå vilket användarkonto den kommer att använda för att autentisera anslutningar.


Vad är MySQLs syntax för användarkonton?

I MySQL är användarkonton sammansatta av två separata delar av information, sammanfogade av ett tecken (@):

  • Användarnamnet
  • Värden som användaren ansluter från

I allmänhet kommer användarkonton på systemet att se ut så här:

'<user>'@'<host>'

Enstaka citattecken kan användas, som ovan, för att individuellt omsluta användar- och värdkomponenterna för användarkontot. De är ibland nödvändiga om någon av komponenterna innehåller tecken som annars skulle misstolkas. I allmänhet är det alltid en bra idé att lägga till dem för att vara tydlig.

Så hellre än att bara ha ett konto som heter 'john' , i MySQL skulle det fullständiga kontonamnet kräva någon form av värd, till exempel 'john'@'localhost' . Det betyder att det kan finnas flera 'john' konton på systemet och MySQL kommer att se vart och ett av dem som ett unikt konto så länge de kommer från en annan domän.

Med allt detta sagt är det möjligt att definiera användarkonton som inte har en användar- eller värdkomponent, men det finns viktiga konsekvenser som du måste vara medveten om.

Du kan definiera ett användarkonto utan ett användarvärde genom att använda en tom sträng:

''@'<host>'

Du kan till exempel skapa en användare som ''@'localhost' . Den här användaren skulle matcha alla användarnamn ansluter från den lokala datorn.

På samma sätt kan du ha ett användarkonto som matchar från vilken värd som helst. Istället för att använda en tom sträng för värdvärden skulle du använda % jokertecken, så här:

'<user>'@'%'

Till exempel, om du skapar 'john'@'%' , skulle det kontot matcha en 'john' användare som ansluter från alla värd.



Hur autentiserar MySQL användare?

Att förstå hur MySQL faktiskt behandlar varje autentiseringsbegäran är mycket viktigt för att undvika en vanlig klass av autentiseringsproblem som beror på rimliga, men felaktiga antaganden. Detta diskuterades lite djupare i vår introduktion till autentisering och auktorisering i MySQL-artikeln.

Vid autentisering av en anslutningsbegäran använder MySQL ett antal fält inom user tabell över dess interna mysql databas för att bestämma om anslutningen ska tillåtas. MySQL kommer att använda högst ett användarkontopost för att försöka autentisera en anslutning. Detta innebär att MySQL behöver ett sätt att bestämma vilket användarkonto som ska användas om det finns fler än ett konto som kan matcha en anslutning.

MySQL:s algoritm för autentisering av användare börjar när servern startar. Vid start laddar MySQL in hela mysql.user tabell i minnet. Det gör det också när användarkonton skapas med vanliga MySQL-kommandon. När den laddar tabellen, sorterar den posterna från högsta prioritet till lägsta.

MySQL använder Host kolumnen som det primära sorteringsfältet och prioriterar resultat med mer specifika värden. Så bokstavliga värden sorteras högst upp som högsta prioritet och de som använder jokertecken, som % , sorteras till botten. De sista posterna är de som bara innehåller % utan andra tecken, följt av poster som har en helt tom värd.

User kolumnen används som ett sekundärt sorteringsfält för alla poster som har samma Host värde. Återigen prioriteras de mer exakta matchningarna. Sedan User kolumnen kan inte använda jokertecken, alla poster är jämställda förutom de med en tom User värde. De är sorterade till botten. Om någon post med en tom User värdet är valt, kommer användaren att autentiseras som en "anonym användare", vilket vanligtvis motsvarar att inte ha några privilegier.

Nu, närhelst en anslutningsbegäran görs, går MySQL igenom dess sorterade tabell i minnet från toppen till botten. Den använder första posten hittar för att autentisera användaren, oavsett om det finns andra poster som också skulle matcha. Om klienten misslyckas med att autentisera med den metod som definieras av den posten, kommer anslutningen att misslyckas och inga andra poster kommer att kontrolleras.



Vilka är konsekvenser av att inte inkludera en användare eller värd i en MySQL-användarkontodefinition?

På grund av MySQL:s autentiseringsalgoritm kan problem uppstå om du inte är försiktig när du skapar användarkonton utan en användar- eller värdkomponent. Detta beror på att sättet som MySQL bestämmer vilken post som ska användas för att autentisera dig kan vara ointuitivt och överraskande.

Till exempel, om en användare autentiserar till MySQL med användardelen som en tom sträng, kommer MySQL att betrakta dem som en "anonym användare" under resten av sessionen. Som regel har anonyma användare nästan ingen makt och kan göra väldigt lite när de är anslutna. Det är möjligt att av misstag autentisera sig som en anonym användare när man försöker autentisera med ett annat användarkonto.

Utmaningen med att använda jokertecken värdar för användarkonton är det andra användarkonton som inkluderar ett värdvärde kan enkelt maskera, eller göra otillgängligt, användarkontot som använder jokertecken.

Om du till exempel har ett användarkonto definierat som 'emily'@'%' , kan du förvänta dig att kunna autentisera till 'emily' från vilken värd som helst. Men om du har ett användarkonto med en tom användare men ett värdvärde som matchar värden 'emily' ansluter från, kommer MySQL att autentisera med det kontot istället (vilket leder till en anonym användarinloggning enligt beskrivningen ovan).

Så som ett exempel kommer MySQL att sortera följande konton i följande ordning:

Prioritet MySQL-konto Kommentarer
1 'emily'@'localhost' och 'emily'@'example.com' Dessa har samma prioritet, vilket är okej eftersom det bara är möjligt för en av dem att matcha en anslutning.
2 ''@'localhost' och ''@'example.com' Dessa två poster har återigen samma prioritet. Eftersom de inte har en användarkomponent, men de gör har en bokstavlig värdkomponent, de placeras längst ner i posterna som har exakta värdvärden.
3 'emily'@'%.example.com' Denna post har ett jokertecken i värdkomponenten, så den har lägre prioritet än poster med exakta värdvärden.
4 ''@'%.example.com' Denna post är grupperad med de poster som har ett jokertecken inom sitt värdvärde. Eftersom den inte har någon användarkomponent ligger den längst ned i den här gruppen.
5 'emily'@'%' Denna post har ett värdvärde som endast består av ett jokertecken. Eftersom den matchar vilken värd som helst har den mycket låg prioritet.
7 ''@'%' Denna post kan användas för att autentisera vilken användare som helst från vilken värd som helst som en anonym användare. Den har extremt låg prioritet eftersom den matchar vilken anslutning som helst.
6 'emily'@'' Denna post har ett helt tomt värdvärde, som har ännu lägre prioritet än en värd som bara innehåller en jokerteckenvärd.
8 ''@'' Detta är den lägsta möjliga prioritetsanvändaren. Den innehåller ingen värdinformation så den placeras i slutet under värdsorteringen. Eftersom den också innehåller en tom användare, placeras den under andra poster i denna grupp. Liksom alla poster utan en användare kommer anslutningar som autentiseras med denna post att loggas in som en anonym användare.



Hur skapar du användare?

Nu när du har en känsla för hur MySQL hanterar användarkonton kan vi börja skapa några nya användare. Kom ihåg att logga in med en användare med de rättigheter som beskrivs i förutsättningarna.


Grundläggande syntax

Den grundläggande syntaxen för att skapa en ny användare är relativt enkel. Du använder CREATE USER kommandot och ange sedan användaren och värden för det nya kontot:

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

Detta kommer att skapa ett grundläggande konto utan att konfigurera några detaljer utöver dess användare och värd när det skapas.



Hur skapar du en användare med ett lösenord?

Ofta vill du konfigurera autentisering medan du skapar användaren. Du kan göra detta genom att lägga till den valfria IDENTIFIED BY sats till CREATE USER uttalande:

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

Detta skapar ett nytt användarkonto, som tidigare, och tilldelar samtidigt ett lösenord för kontot. Vi kommer att ta upp hur man tilldelar ett lösenord i efterhand eller hur man ändrar en användares lösenord senare.



Hur skapar du en användare med Unix-socket-autentisering?

Även om lösenordsautentisering är den vanligaste autentiseringsmetoden för de flesta användare, är det inte det enda alternativet. MySQL tillhandahåller många olika interna och externa autentiseringsmekanismer som du kan konfigurera för dina användarkonton att använda. Som ett exempel kommer vi att konfigurera ett nytt konto med Unix-socket-autentisering.

Unix-socket-autentisering kan användas i Linux eller Unix-liknande miljöer så att ett konto i operativsystemet ges tillgång till samma kontonamn inom MySQL utan ytterligare autentisering. I den här konfigurationen vet MySQL-administratören att användarkonton i operativsystemet är noggrant kontrollerade.

Så om det finns en mary användare på operativsystemet kommer de att kunna logga in på 'mary'@'localhost' konto inom MySQL om Unix-socket-autentisering är den definierade autentiseringsmekanismen. Låt oss konfigurera detta nu.

Socket-autentisering kräver auth_socket plugin, så ladda först plugin genom att skriva:

INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

Skapa sedan ett användarkonto som matchar ett användarkonto du har på ditt operativsystem. För det här exemplet använder vi mary konto som vi diskuterade ovan. Om du inte använder ett namn som matchar ett av dina operativsystemnamn kommer du inte att kunna autentisera med den här användaren.

För att skapa en användare med socket-autentisering måste vi använda IDENTIFIED WITH klausul (annan än IDENTIFIED BY klausul som användes tidigare) för att ange vilken autentiseringsplugin som ska användas:

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

Nu bör du kunna autentisera till 'mary'@'localhost' MySQL-användare från mary användare på ditt operativsystem. När du är inloggad som mary , anslut till databasen utan att ange något användarnamn eller lösenord:

mysql

Du bör loggas in automatiskt genom den Unix-socket-autentisering som du konfigurerade.




Hur visar du befintliga användare?

Låt oss sedan ta en titt på hur man hittar information om befintliga användare.

För att visa alla befintliga MySQL-användare, bestående av deras användar- och värdkomponent, samt autentiseringsplugin som de använder för närvarande, kan du SELECT dessa fält från mysql.user databas:

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)

Här kan vi se att det finns sex användare definierade på systemet, som alla endast kan logga in lokalt. Fem av kontona är konfigurerade att använda lösenordsautentisering. 'mary'@'localhost' kontot är konfigurerat för att använda Unix-socket-autentisering.

Vi kan hitta ytterligare information om användaregenskaper genom att använda SHOW CREATE USER kommando. Trots namnet visar den alla aktuella egenskaper för ett användarkonto, inte nödvändigtvis de som användes när det första kontot skapades.

SHOW CREATE USER kommandot tar ett kontonamn som ett argument:

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

Det är vanligtvis bäst att avsluta kommandot med \G satsterminator istället för det vanliga kolonet (; ) så att du kan se resultaten lite tydligare.

För att visa egenskaperna för 'useradmin'@'localhost' konto skulle du skriva:

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)


Hur ändrar du befintliga MySQL-användare?

Du kan ändra befintliga användare inom MySQL med ALTER USER kommando. Detta kan användas för att ändra de flesta användarrelaterade egenskaperna för ett konto, med undantag för kontoprivilegier, som kontrolleras av GRANT och REVOKE kommandon.

Den grundläggande syntaxen för ALTER USER ser ut så här:

ALTER USER <user> <properties_to_change>;

Hur ändrar du lösenordet för en MySQL-användare?

För de flesta är den vanligaste användningen av ALTER USER är att ändra lösenord.

Du kan till exempel ändra lösenordet för 'kamal'@'localhost' genom att skriva:

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

Om du vill ställa in ett tillfälligt lösenord för en användare som de måste ersätta omedelbart, kan du ställa in och upphöra att gälla samtidigt:

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

Du kan alltid ändra ditt eget lösenord, även utan CREATE USER privilegium. Det är enklast att använda USER() funktion för att automatiskt fylla i ditt eget användarnamn:

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


Hur ändrar du autentiseringsplugin för en MySQL-användare?

Du kan också ändra mekanismen eller plugin som används för att autentisera ett konto.

I ett tidigare exempel konfigurerade vi ett konto som heter 'mary'@'localhost' för att använda Unix-socket-autentisering. Om vi ​​senare vill ändra det kontot till att använda konventionell lösenordsautentisering kan vi använda ALTER USER kommandot igen.

Identifiera först standardinsticksprogrammet för autentisering för din server. Om det är en lösenordsbaserad autentiseringsmetod är det förmodligen bäst att återanvända standardvalet:

SHOW VARIABLES LIKE 'default_authentication_plugin';

I det här fallet är standardinsticksprogrammet för autentisering caching_sha2_password , så vi kommer att använda det när vi byter till lösenordsautentisering.

Ändra nu 'mary'@'localhost' för att använda caching_sha2_password plugin med ett nytt lösenord:

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

'mary'@'localhost' användare kommer inte längre att kunna logga in med Unix-socket-autentisering, men de kan logga in med det angivna lösenordet.




Hur loggar du in på MySQL?

Vi har diskuterat hur man skapar och ändrar MySQL-användarkonton, inklusive autentisering. Vi har dock inte pratat om hur man faktiskt loggar in med dessa autentiseringsmetoder.

mysql client är en kraftfull kommandoradsklient som kan användas för att ansluta till lokala och fjärrdatabaser. Vi kommer att använda den för att prata om hur man autentiserar med metoderna vi konfigurerade ovan.


Hur loggar du in på en lokal databas med ett lösenord?

För att logga in på en lokalt värd MySQL-databas med ett användarkonto med ett lösenord, ser den grundläggande syntaxen ut så här:

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

Så, om 'kamal'@'localhost' användare vill logga in på MySQL och ansluta till testing databas från datorn där systemet är värd, kan de skriva:

mysql --user=kamal --password testing

mysql klienten kommer att fråga efter lösenordet för 'kamal'@'localhost' . Om du anger rätt referenser kommer du att kopplas till testing databas.

Att ange en databas på kommandoraden är valfritt. Om ingen anges kommer du att ansluta till servern men inte till en specifik databas.



Hur loggar du in på en lokal databas med Unix-socket-autentisering?

För att logga in på en lokal MySQL-server med Unix-socket-autentisering måste du vara inloggad på ditt operativsystem som det kontonamn som matchar. Så om vi vill autentisera till 'mary'@'localhost' med Unix-socket-autentisering måste vi först logga in på vår dator med ett användarnamn som heter mary .

När du väl använder rätt operativsystemkonto kan du ansluta direkt till den lokala databasen genom att köra klienten, utan några alternativ.

mysql

Som tidigare kan du valfritt lägga till ett databasnamn för att ansluta till en specifik databas du vill ha.



Hur loggar du in på en fjärrdatabas med ett lösenord?

Om din MySQL-server inte körs på din lokala server måste du ange den värd som klienten ska försöka ansluta till. Du kan göra det genom att lägga till --host alternativ.

För det mesta kommer du att autentisera med ett lösenord till fjärranslutna MySQL-servrar, så kommandot skulle se ut ungefär så här:

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

'tanya'@'<tanyas_domain>' kunde ansluta till en MySQL-server som finns på example.com genom att skriva:

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



Hur tar du bort MySQL-användare?

Att hålla kvar användarkonton som inte längre tjänar ett syfte är en säkerhetsrisk. Du kan enkelt ta bort konton med DROP USER kommando.

Den grundläggande syntaxen ser ut så här:

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

Så för att ta bort 'mary'@'localhost' användare skulle du skriva:

DROP USER 'mary'@'localhost';

Om du försöker ta bort en användare som inte finns får du ett felmeddelande:

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

För att undvika detta kan du lägga till IF EXISTS klausul före kontonamnet. Om användaren finns kommer den att raderas. Om den inte gör det kommer endast en varning att ges:

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


Slutsats

MySQL:s användarkontohantering och autentiseringskonfiguration är mycket flexibel. Att lära sig att skapa, ändra och få information om användare inom MySQL hjälper dig att administrera dina databassystem mer effektivt.

Bästa säkerhetspraxis dikterar att du ska skapa konton för varje unikt användningsfall, endast givet den åtkomstnivå som krävs för att utföra deras omfattning. Skapande och autentisering av konton är de första stegen i denna process. I en annan guide kommer vi att prata om att bevilja och återkalla privilegier för att uppfylla den andra delen av den strategin.




  1. Fixa "ERROR 1054 (42S22):Okänd kolumn "..." i "ordersats" när du använder UNION i MySQL

  2. Modellering av produktvarianter

  3. Följ med mig på PAUG Database Designer Conference

  4. Vad betyder select count(1) från table_name på alla databastabeller?