Въведение
Управлението на потребителите е от най-важните отговорности на всеки, който се надява да управлява система от база данни MySQL. Създаването, промяната и изтриването на потребителски акаунти за най-добро представяне на потребителите и услугите във вашата среда помага да се положат основите за заключване на достъп, ограничаване на обхвата за промени и прилагане на одит и отчетност за модификации.
В това ръководство ще говорим за това как да управлявате потребителски акаунти в MySQL. Първо, ще обсъдим какво е валиден потребител в MySQL и ще ви покажем как да добавите допълнителни потребители към системата. Това води до дискусия за това как да конфигурирате удостоверяване за всеки потребител и как системата избира опция за удостоверяване от списък с възможности. Ще продължим да говорим за извършването на промени в съществуващите потребители, как да влезете с акаунтите, които сте създали, и как да изтриете потребители, от които вече не се нуждаете.
Предварителни условия
За да следвате това ръководство, ще ви е необходим акаунт на MySQL сървър със съответните привилегии.
Команди, които ще използваме
За да създавате, променяте и изтривате потребители в MySQL, основните команди, от които се нуждаете, са:
CREATE USER
:създайте нов потребителски акаунтALTER USER
:направете промени в съществуващ потребителски акаунтDROP USER
:премахване на съществуващ потребителски акаунт
Задължителни привилегии
За да изпълните командите по-горе, трябва да влезете в MySQL с акаунт с CREATE USER
привилегии. CREATE USER
privilege ви позволява да създавате, променяте, изтривате и преименувате потребители, наред с други действия. Ще ни трябва и SELECT
привилегия на mysql
база данни, за да видите информация за съществуващи потребители.
По реда на предпочитание трябва да влезете, като използвате:
- Ограничен акаунт, който има
CREATE USER
привилегия иSELECT
привилегия наmysql
база данни root
или административен потребител, който има пълни привилегии в MySQL
Разбиране как MySQL дефинира и интерпретира потребителски акаунти
Преди да започнем да създаваме нови акаунти, е полезно да отделите известно време, за да се запознаете с различните, които MySQL използва за създаване и препращане към потребители. Вие също трябва да сте запознати с алгоритъма за удостоверяване на MySQL, за да разберете какъв потребителски акаунт ще използва за удостоверяване на връзки.
Какъв е синтаксисът на MySQL за потребителски акаунти?
В MySQL потребителските акаунти са съставени от две отделни части информация, съединени със знак (@):
- Потребителското име
- Хостът, от който потребителят се свързва
Като цяло, потребителските акаунти в системата ще изглеждат по следния начин:
'<user>'@'<host>'
Могат да се използват единични кавички, както по-горе, за индивидуално обвиване на потребителския и хост компонентите на потребителския акаунт. Понякога са необходими, ако някой от компонентите съдържа знаци, които иначе биха били тълкувани погрешно. Като цяло добавянето им винаги е добра идея да бъде изрично.
Така че вместо просто да имате акаунт, наречен 'john'
, в MySQL, пълното име на акаунта ще изисква някакъв вид хост, като 'john'@'localhost'
. Това означава, че може да има няколко 'john'
акаунти в системата и MySQL ще разглежда всеки от тях като уникален акаунт, стига да идва от различен домейн.
Като се има предвид всичко това, е възможно да се дефинират потребителски акаунти, които нямат потребителски или хост компонент, но има важни последици, които трябва да сте наясно.
Можете да дефинирате потребителски акаунт без потребителска стойност, като използвате празен низ:
''@'<host>'
Например, можете да създадете потребител като ''@'localhost'
. Този потребител ще отговаря на всеки потребителско име се свързва от локалния компютър.
По същия начин можете да имате потребителски акаунт, който съвпада от всеки хост. Вместо да използвате празен низ, за стойности на хост, бихте използвали %
заместващ знак, като този:
'<user>'@'%'
Например, ако създадете 'john'@'%'
, този акаунт ще съответства на 'john'
потребител, който се свързва от който и да е домакин.
Как MySQL удостоверява потребителите?
Разбирането как MySQL всъщност обработва всяка заявка за удостоверяване е много важно, за да се избегне общ клас проблеми с удостоверяване, които са резултат от разумни, но неверни предположения. Това беше обсъдено задълбочено в нашето въведение към удостоверяването и упълномощаването в статията на MySQL.
Когато удостоверява заявка за връзка, MySQL използва редица полета в user
таблица на неговия вътрешен mysql
база данни, за да реши дали да разреши връзката. MySQL ще използва най-много един запис на потребителски акаунт, за да се опитате да удостоверите връзка. Това означава, че MySQL се нуждае от начин да реши кой потребителски акаунт да използва, ако има повече от един акаунта, които могат да съответстват на връзка.
Алгоритъмът на MySQL за удостоверяване на потребители започва при стартиране на сървъра. При стартиране MySQL зарежда целия mysql.user
таблица в паметта. Той също така прави това всеки път, когато се създават потребителски акаунти с помощта на обикновените MySQL команди. Докато зарежда таблицата, тя сортира записите от най-висок приоритет към най-нисък.
MySQL използва Host
колона като основно поле за сортиране и дава приоритет на резултатите с по-конкретни стойности. Така литералните стойности се сортират най-отгоре като най-висок приоритет и тези, които използват заместващи знаци, като %
, са сортирани до дъното. Последните записи са тези, които съдържат само %
без други знаци, последвани от записи, които имат напълно празен хост.
User
колоната се използва като вторично поле за сортиране за всички записи, които имат същия Host
стойност. Още веднъж, по-точните съвпадения са с приоритет. Тъй като User
колоната не може да използва заместващи знаци, всички записи са равнопоставени с изключение на тези с празен User
стойност. Те са подредени до дъното. Ако има някакъв запис с празен User
Ако е избрана стойност, потребителят ще бъде удостоверен като „анонимен потребител“, което обикновено се равнява на липса на привилегии.
Сега, когато се направи заявка за връзка, MySQL преминава през сортираната си таблица в паметта от горе до долу. Той използва първия запис, който намира, за да удостовери потребителя, независимо дали има други записи, които също биха съвпадали. Ако клиентът не успее да се удостовери с помощта на метода, дефиниран от този запис, връзката ще се провали и няма да бъдат проверявани други записи.
Какви са последици от не включването на потребител или хост в дефиницията на потребителски акаунт в MySQL?
Поради алгоритъма за удостоверяване на MySQL могат да възникнат проблеми, ако не сте внимателни, когато създавате потребителски акаунти без потребителски или хост компонент. Това е така, защото начинът, по който MySQL решава кой запис да използва, за да ви удостовери, може да бъде неинтуитивен и изненадващ.
Например, ако потребител се удостовери в MySQL с потребителската част като празен низ, MySQL ще го счита за "анонимен потребител" за останалата част от сесията. По правило анонимните потребители нямат почти никаква мощност и могат да направят много малко, веднъж свързани. Възможно е дори случайно да се удостоверите като анонимен потребител, когато се опитвате да се удостоверите с помощта на различен потребителски акаунт.
Предизвикателството с използването на хостове за потребителски акаунти е тези други потребителски акаунти, които включват стойност на хост може лесно да маскира или да направи недостъпен потребителския акаунт, който използва заместващия знак.
Например, ако имате потребителски акаунт, дефиниран като 'emily'@'%'
, може да очаквате да можете да се удостоверите до 'emily'
от всеки хост. Въпреки това, ако имате потребителски акаунт с празен потребител, но стойност на хост, която съответства на хост 'emily'
се свързва от, MySQL ще се удостовери с помощта на този акаунт вместо това (което води до анонимен потребителски вход, както е описано по-горе).
Така че като пример MySQL ще сортира следните акаунти в следния ред:
Приоритет | MySQL акаунт | Коментари |
---|---|---|
1 | 'emily'@'localhost' и 'emily'@'example.com' | Те са с еднакъв приоритет, което е добре, защото е възможно само един от тях да съответства на връзка. |
2 | ''@'localhost' и ''@'example.com' | Тези два записа отново са със същия приоритет. Тъй като те нямат потребителски компонент, но имат имат буквален хост компонент, те се поставят в долната част на записи, които имат точни хост стойности. |
3 | 'emily'@'%.example.com' | Този запис има заместващ знак в хост компонента, така че му се дава по-нисък приоритет от записи с точни стойности на хоста. |
4 | ''@'%.example.com' | Този запис е групиран с записи, които имат заместващ знак в стойността им за хост. Тъй като няма потребителски компонент, той е в долната част на тази група. |
5 | 'emily'@'%' | Този запис има стойност на хост, състояща се само от заместващ знак. Тъй като съвпада с всеки хост, той има много нисък приоритет. |
7 | ''@'%' | Този запис може да се използва за удостоверяване на автентичността на всеки потребител от всеки хост като анонимен потребител. Той е с изключително нисък приоритет, тъй като съответства на всяка връзка. |
6 | 'emily'@'' | Този запис има изцяло празна хост стойност, която е с дори по-нисък приоритет от хост, който съдържа само заместващ хост. |
8 | ''@'' | Това е потребител с най-нисък възможен приоритет. Той не съдържа информация за хост, така че се поставя в края по време на сортирането на хоста. Тъй като съдържа и празен потребител, той се поставя под други записи в тази група. Както всички записи без потребител, връзките, удостоверени с този запис, ще бъдат влезли като анонимен потребител. |
Как създавате потребители?
Сега, когато имате представа за начина, по който MySQL обработва потребителски акаунти, можем да започнем да създаваме някои нови потребители. Не забравяйте да влезете с потребител с привилегиите, описани в предпоставките.
Основен синтаксис
Основният синтаксис за създаване на нов потребител е сравнително прост. Използвате CREATE USER
команда и след това посочете потребителя и хоста за новия акаунт:
CREATE USER '<user>'@'<host>';
Това ще създаде основен акаунт, без да конфигурира никакви подробности извън неговия потребител и хост при създаването.
Как да създадете потребител с парола?
Често искате да конфигурирате удостоверяване, докато създавате потребителя. Можете да направите това, като добавите незадължителния IDENTIFIED BY
клауза върху CREATE USER
изявление:
CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';
Това създава нов потребителски акаунт, както преди, и едновременно с това задава парола за акаунта. Ще разгледаме как да зададем парола след това или как да променим паролата на потребител по-късно.
Как да създадете потребител с удостоверяване на Unix сокет?
Докато удостоверяването с парола е най-често срещаният метод за удостоверяване за повечето потребители, това не е единствената опция. MySQL предоставя много различни вътрешни и външни механизми за удостоверяване, които можете да конфигурирате към вашите потребителски акаунти за използване. Като пример ще конфигурираме нов акаунт, използвайки удостоверяване на Unix сокет.
Удостоверяването на Unix сокет може да се използва в Linux или Unix-подобни среди, така че на акаунт в операционната система се дава достъп до същото име на акаунт в MySQL без допълнително удостоверяване. При тази конфигурация администраторът на MySQL знае, че потребителските акаунти в операционната система са строго контролирани.
Така че, ако има mary
потребител на операционната система, те ще могат да влязат в 'mary'@'localhost'
акаунт в MySQL, ако удостоверяването на Unix сокет е дефинираният механизъм за удостоверяване. Нека да конфигурираме това сега.
Удостоверяването на сокет изисква auth_socket
плъгин, така че първо заредете плъгина, като напишете:
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
След това създайте потребителски акаунт, който съответства на потребителски акаунт, който имате във вашата операционна система. За този пример ще използваме mary
акаунт, който обсъдихме по-горе. Ако не използвате име, което съответства на едно от имената на вашата операционна система, няма да можете да се удостоверите с помощта на този потребител.
За да създадем потребител с удостоверяване на сокет, трябва да използваме IDENTIFIED WITH
клауза (различна от IDENTIFIED BY
клауза, използвана по-рано), за да посочите приставката за удостоверяване, която да използвате:
CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;
Сега трябва да можете да се удостоверите в 'mary'@'localhost'
Потребител на MySQL от mary
потребител на вашата операционна система. Когато сте влезли като mary
, свържете се с базата данни, без да предоставяте потребителско име или парола:
mysql
Трябва да влезете автоматично чрез удостоверяването на Unix сокет, което сте конфигурирали.
Как показвате съществуващите потребители?
След това нека да разгледаме как да намерим информация за съществуващите потребители.
За да покажете всички съществуващи потребители на MySQL, състоящи се от техния потребителски и хост компонент, както и приставката за удостоверяване, която използват в момента, можете да SELECT
тези полета от mysql.user
база данни:
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)
Тук можем да видим, че има шест потребители, дефинирани в системата, всички от които могат да влизат само локално. Пет от акаунтите са конфигурирани да използват удостоверяване с парола. 'mary'@'localhost'
акаунтът е конфигуриран да използва удостоверяване на Unix сокет.
Можем да намерим допълнителна информация за свойствата на потребителя, като използваме SHOW CREATE USER
команда. Въпреки името си, той показва всички текущи свойства на потребителски акаунт, не непременно тези, които са били използвани при първоначалното създаване на акаунт.
SHOW CREATE USER
командата приема име на акаунт като аргумент:
SHOW CREATE USER '<user>'@'<host>'\G
Обикновено е най-добре да завършите командата с \G
терминатор на израза вместо обичайното двоеточие (;
), за да можете да видите резултатите малко по-ясно.
За показване на свойствата за 'useradmin'@'localhost'
акаунт, ще въведете:
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)
Как променяте съществуващите потребители на MySQL?
Можете да промените съществуващите потребители в MySQL с помощта на ALTER USER
команда. Това може да се използва за промяна на повечето от свързаните с потребителя свойства на акаунта, с изключение на привилегиите на акаунта, които се контролират от GRANT
и REVOKE
команди.
Основният синтаксис за ALTER USER
изглежда така:
ALTER USER <user> <properties_to_change>;
Как да промените паролата за потребител на MySQL?
За повечето хора най-честата употреба на ALTER USER
е за промяна на пароли.
Например, можете да промените паролата за 'kamal'@'localhost'
като напишете:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';
Ако искате да зададете временна парола за потребител, която той ще трябва да смени незабавно, можете да зададете и изтечете паролата едновременно:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;
Винаги можете да промените собствената си парола, дори без CREATE USER
привилегия. Най-лесно е да използвате USER()
функция за автоматично попълване на вашето собствено потребителско име:
ALTER USER USER() IDENTIFIED BY '<new_password>';
Как променяте плъгините за удостоверяване за потребител на MySQL?
Можете също да промените механизма или приставката, използвани за удостоверяване на акаунт.
В по-ранен пример конфигурирахме акаунт, наречен 'mary'@'localhost'
за да използвате удостоверяване на Unix сокет. Ако по-късно искаме да променим този акаунт, за да използва конвенционално удостоверяване с парола, можем да използваме ALTER USER
команда отново.
Първо, идентифицирайте приставката за удостоверяване по подразбиране за вашия сървър. Ако това е метод за удостоверяване, базиран на парола, вероятно е най-добре да използвате повторно избора по подразбиране:
SHOW VARIABLES LIKE 'default_authentication_plugin';
В този случай приставката за удостоверяване по подразбиране е caching_sha2_password
, така че ще го използваме, когато преминем към удостоверяване с парола.
Сега променете 'mary'@'localhost'
за да използвате caching_sha2_password
плъгин с нова парола:
ALTER USER 'mary'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<marys_password>';
'mary'@'localhost'
потребителят вече няма да може да влезе чрез удостоверяване на Unix сокет, но може да влезе с предоставената парола.
Как влизате в MySQL?
Обсъдихме как да създаваме и променяме MySQL потребителски акаунти, включително удостоверяване. Въпреки това, не сме говорили за това как всъщност да влезете, използвайки тези методи за удостоверяване.
mysql
client е мощен клиент на командния ред, който може да се използва за свързване към локални и отдалечени бази данни. Ще го използваме, за да говорим за това как да се удостоверим с помощта на методите, които конфигурирахме по-горе.
Как да влезете в локална база данни с парола?
За да влезете в локално хоствана MySQL база данни с помощта на потребителски акаунт с парола, основният синтаксис изглежда така:
mysql --user=<username> --password <dbname>
Така че, ако 'kamal'@'localhost'
потребителят иска да влезе в MySQL и да се свърже с testing
база данни от компютъра, където се хоства системата, те могат да напишат:
mysql --user=kamal --password testing
mysql
клиентът ще поиска паролата за 'kamal'@'localhost'
. Ако предоставите правилните идентификационни данни, ще бъдете свързани с testing
база данни.
Посочването на база данни в командния ред не е задължително. Ако не е посочено нито едно, ще се свържете със сървъра, но не и с конкретна база данни.
Как да влезете в локална база данни с удостоверяване на Unix сокет?
За да влезете в локален MySQL сървър, използвайки удостоверяване на Unix сокет, трябва да сте влезли във вашата операционна система като името на акаунта, което съвпада. Така че, ако искаме да се удостоверим до 'mary'@'localhost'
използвайки удостоверяване на Unix сокет, първо трябва да влезем в нашия компютър с потребителско име, наречено mary
.
След като използвате правилния акаунт в операционната система, можете да се свържете директно с локалната база данни, като изпълните клиента, без опции.
mysql
Както преди, можете по желание да добавите име на база данни, за да се свържете с конкретна база данни, която искате.
Как да влезете в отдалечена база данни с парола?
Ако вашият MySQL сървър не работи на вашия локален сървър, ще трябва да посочите хоста, с който клиентът трябва да се опита да се свърже. Можете да направите това, като добавите --host
опция.
През повечето време ще се удостоверявате с парола за отдалечени MySQL сървъри, така че командата ще изглежда така:
mysql --user=<username> --password --host=<host> <dbname>
Така че 'tanya'@'<tanyas_domain>'
може да се свърже с MySQL сървър, разположен на example.com
като напишете:
mysql --user='tanya' --password --host='example.com'
Как се изтриват потребители на MySQL?
Поддържането на потребителски акаунти, които вече не служат за цел, е риск за сигурността. Можете лесно да премахвате акаунти с DROP USER
команда.
Основният синтаксис изглежда така:
DROP USER '<user>'@'<host>';
Така че да изтриете 'mary'@'localhost'
потребител, ще въведете:
DROP USER 'mary'@'localhost';
Ако се опитате да изтриете потребител, който не съществува, ще получите грешка:
ERROR 1396 (HY000): Operation DROP USER failed for 'mary'@'localhost'
За да избегнете това, можете да добавите IF EXISTS
клауза преди името на акаунта. Ако потребителят съществува, той ще бъде изтрит. Ако не стане, ще бъде дадено само предупреждение:
Query OK, 0 rows affected, 1 warning (0.00 sec)
Заключение
Конфигурацията за управление на потребителски акаунт и удостоверяване на MySQL е много гъвкава. Научаването как да създавате, променяте и получавате информация за потребители в MySQL ще ви помогне да администрирате системите си от бази данни по-ефективно.
Най-добрите практики за сигурност диктуват, че трябва да създавате акаунти за всеки уникален случай на употреба, като се има предвид само нивото на достъп, необходимо за изпълнение на техния обхват. Създаването на акаунт и удостоверяването са първите етапи от този процес. В друго ръководство ще говорим за предоставяне и отнемане на привилегии за изпълнение на другата част от тази стратегия.