Wprowadzenie
Zarządzanie użytkownikami jest najważniejszym obowiązkiem każdego, kto chce zarządzać systemem baz danych MySQL. Tworzenie, zmienianie i usuwanie kont użytkowników, aby jak najlepiej reprezentować użytkowników i usługi w Twoim środowisku, pomaga stworzyć podstawy do blokowania dostępu, ograniczania zakresu zmian oraz wdrażania kontroli i odpowiedzialności za modyfikacje.
W tym przewodniku omówimy, jak zarządzać kontami użytkowników w MySQL. Najpierw omówimy, czym jest prawidłowy użytkownik w MySQL i pokażemy, jak dodać dodatkowych użytkowników do systemu. Prowadzi to do dyskusji o tym, jak skonfigurować uwierzytelnianie dla każdego użytkownika i jak system wybiera opcję uwierzytelnienia z listy możliwości. W dalszym ciągu będziemy rozmawiać o wprowadzaniu zmian w istniejących użytkownikach, o tym, jak zalogować się na utworzone konta i jak usunąć użytkowników, których już nie potrzebujesz.
Wymagania wstępne
Aby postępować zgodnie z tym przewodnikiem, potrzebujesz konta na serwerze MySQL z odpowiednimi uprawnieniami.
Polecenia, których będziemy używać
Aby tworzyć, modyfikować i usuwać użytkowników w MySQL, podstawowe polecenia, których potrzebujesz to:
CREATE USER
:utwórz nowe konto użytkownikaALTER USER
:wprowadź zmiany na istniejącym koncie użytkownikaDROP USER
:usuń istniejące konto użytkownika
Wymagane uprawnienia
Aby wykonać powyższe polecenia, musisz zalogować się do MySQL za pomocą konta z CREATE USER
przywileje. CREATE USER
przywilej umożliwia między innymi tworzenie, modyfikowanie, usuwanie i zmianę nazwy użytkowników. Będziemy również potrzebować SELECT
przywilej na mysql
bazy danych, aby zobaczyć informacje o istniejących użytkownikach.
W kolejności preferencji należy zalogować się za pomocą:
- Ograniczone konto, które ma
CREATE USER
przywilej iSELECT
przywilej namysql
baza danych root
lub administrator, który ma pełne uprawnienia w MySQL
Zrozumienie, jak MySQL definiuje i interpretuje konta użytkowników
Zanim zaczniemy tworzyć nowe konta, warto poświęcić trochę czasu na zapoznanie się z różnymi, których MySQL używa do tworzenia i odwoływania się do użytkowników. Musisz także znać algorytm uwierzytelniania MySQL, aby zrozumieć, jakiego konta użytkownika będzie używał do uwierzytelniania połączeń.
Jaka jest składnia MySQL dla kont użytkowników?
W MySQL konta użytkowników składają się z dwóch oddzielnych informacji połączonych znakiem @:
- Nazwa użytkownika
- Host, z którego łączy się użytkownik
Ogólnie konta użytkowników w systemie będą wyglądać następująco:
'<user>'@'<host>'
Pojedyncze cudzysłowy mogą być używane, jak powyżej, do indywidualnego pakowania użytkownika i hosta składników konta użytkownika. Czasami są one konieczne, jeśli którykolwiek ze składników zawiera znaki, które w innym przypadku zostałyby błędnie zinterpretowane. Ogólnie rzecz biorąc, dodanie ich zawsze jest dobrym pomysłem, aby być wyraźnym.
Więc zamiast mieć konto o nazwie 'john'
, w MySQL pełna nazwa konta wymagałaby jakiegoś hosta, takiego jak 'john'@'localhost'
. Oznacza to, że może być wiele 'john'
konta w systemie, a MySQL będą widzieć każde z nich jako unikalne konto, o ile pochodzą z innej domeny.
Biorąc to wszystko pod uwagę, możliwe jest zdefiniowanie kont użytkowników, które nie mają komponentu użytkownika ani hosta, ale istnieją ważne implikacje, o których musisz wiedzieć.
Możesz zdefiniować konto użytkownika bez wartości użytkownika, używając pustego ciągu:
''@'<host>'
Na przykład możesz utworzyć użytkownika jako ''@'localhost'
. Ten użytkownik pasowałby do dowolnego nazwa użytkownika łącząca się z komputera lokalnego.
Podobnie możesz mieć konto użytkownika, które pasuje do dowolnego hosta. Zamiast używać pustego ciągu, dla wartości hosta użyjesz %
symbol wieloznaczny, taki jak ten:
'<user>'@'%'
Na przykład, jeśli utworzysz 'john'@'%'
, to konto będzie pasować do 'john'
użytkownik łączy się z dowolnego gospodarza.
Jak MySQL uwierzytelnia użytkowników?
Zrozumienie, w jaki sposób MySQL faktycznie przetwarza każde żądanie uwierzytelnienia, jest bardzo ważne, aby uniknąć typowej klasy problemów z uwierzytelnianiem, które wynikają z rozsądnych, ale błędnych założeń. Zostało to szczegółowo omówione w naszym wprowadzeniu do uwierzytelniania i autoryzacji w artykule MySQL.
Podczas uwierzytelniania żądania połączenia, MySQL używa wielu pól w obrębie user
tabela jego wewnętrznego mysql
bazy danych, aby zdecydować, czy zezwolić na połączenie. MySQL użyje co najwyżej jeden rekord konta użytkownika, aby spróbować uwierzytelnić połączenie. Oznacza to, że MySQL potrzebuje sposobu decydowania, którego konta użytkownika użyć, jeśli istnieje więcej niż jedno konto, które może pasować do połączenia.
Algorytm MySQL służący do uwierzytelniania użytkowników rozpoczyna się wraz z uruchomieniem serwera. Podczas uruchamiania MySQL ładuje cały mysql.user
tabeli do pamięci. Robi to również za każdym razem, gdy konta użytkowników są tworzone przy użyciu zwykłych poleceń MySQL. Podczas ładowania tabeli sortuje wpisy od najwyższego do najniższego priorytetu.
MySQL używa Host
kolumna jako podstawowe pole sortowania i nadaje priorytet wynikom z bardziej szczegółowymi wartościami. Tak więc wartości dosłowne są sortowane od góry jako najwyższy priorytet i te, które używają symboli wieloznacznych, takich jak %
, są sortowane do dołu. Ostateczne wpisy to te, które zawierają tylko %
bez innych znaków, po których następują wpisy z całkowicie pustym hostem.
User
kolumna jest używana jako drugorzędne pole sortowania dla wszystkich wpisów, które mają ten sam Host
wartość. Po raz kolejny priorytetem są dokładniejsze dopasowania. Od User
kolumna nie może używać symboli wieloznacznych, wszystkie wpisy są na równi z wyjątkiem tych z pustym User
wartość. Są one sortowane do dołu. Jeśli jakikolwiek wpis z pustym User
wartość jest wybrana, użytkownik zostanie uwierzytelniony jako „anonimowy użytkownik”, co zwykle oznacza brak uprawnień.
Teraz za każdym razem, gdy wysyłane jest żądanie połączenia, MySQL przechodzi przez posortowaną tabelę w pamięci od góry do dołu. Używa pierwszego wpis, który znajdzie w celu uwierzytelnienia użytkownika, niezależnie od tego, czy istnieją inne wpisy, które również pasują. Jeśli klient nie dokona uwierzytelnienia przy użyciu metody zdefiniowanej przez ten wpis, połączenie zakończy się niepowodzeniem i żadne inne wpisy nie zostaną sprawdzone.
Jakie są implikacje nieuwzględnienia użytkownika lub hosta w definicji konta użytkownika MySQL?
Ze względu na algorytm uwierzytelniania MySQL mogą pojawić się problemy, jeśli nie będziesz ostrożny podczas tworzenia kont użytkowników bez komponentu użytkownika lub hosta. Dzieje się tak, ponieważ sposób, w jaki MySQL decyduje, którego rekordu użyć do uwierzytelnienia, może być nieintuicyjny i zaskakujący.
Na przykład, jeśli użytkownik uwierzytelni się w MySQL z częścią użytkownika jako pustym ciągiem, MySQL uzna go za "anonimowego użytkownika" do końca sesji. Z reguły anonimowi użytkownicy nie mają prawie żadnej władzy i po połączeniu mogą zrobić bardzo niewiele. Możliwe jest nawet przypadkowe uwierzytelnienie jako anonimowy użytkownik podczas próby uwierzytelnienia przy użyciu innego konta użytkownika.
Wyzwanie z użyciem symboli wieloznacznych hostów w przypadku kont użytkowników to inne konta użytkowników, które obejmują wartość hosta może łatwo maskować lub blokować konto użytkownika, które używa symbolu wieloznacznego.
Na przykład, jeśli masz konto użytkownika zdefiniowane jako 'emily'@'%'
, możesz oczekiwać, że będziesz w stanie uwierzytelnić się przed 'emily'
od dowolnego hosta. Jeśli jednak masz konto użytkownika z pustym użytkownikiem, ale z wartością hosta odpowiadającą hostowi 'emily'
z którego się łączy, MySQL dokona uwierzytelnienia przy użyciu tego konta (co prowadzi do anonimowego logowania użytkownika, jak opisano powyżej).
Jako przykład, MySQL posortuje następujące konta w następującej kolejności:
Priorytet | Konto MySQL | Komentarze |
---|---|---|
1 | 'emily'@'localhost' i 'emily'@'example.com' | Są one o równym priorytecie, co jest w porządku, ponieważ tylko jeden z nich może dopasować połączenie. |
2 | ''@'localhost' i ''@'example.com' | Te dwa wpisy mają ponownie ten sam priorytet. Ponieważ nie mają komponentu użytkownika, ale tak mają dosłowny komponent hosta, są umieszczane na dole wpisów, które mają dokładne wartości hostów. |
3 | 'emily'@'%.example.com' | Ten wpis ma symbol wieloznaczny w komponencie hosta, więc ma niższy priorytet niż wpisy z dokładnymi wartościami hosta. |
4 | ''@'%.example.com' | Ten wpis jest pogrupowany z wpisami, które mają symbol wieloznaczny w wartości hosta. Ponieważ nie ma komponentu użytkownika, znajduje się na dole tej grupy. |
5 | 'emily'@'%' | Ten wpis ma wartość hosta składającą się tylko z symbolu wieloznacznego. Ponieważ pasuje do dowolnego hosta, ma bardzo niski priorytet. |
7 | ''@'%' | Ten wpis może służyć do uwierzytelniania dowolnego użytkownika z dowolnego hosta jako użytkownika anonimowego. Ma bardzo niski priorytet, ponieważ pasuje do każdego połączenia. |
6 | 'emily'@'' | Ten wpis ma całkowicie pustą wartość hosta, która ma nawet niższy priorytet niż host zawierający tylko hosta z symbolami wieloznacznymi. |
8 | ''@'' | To jest użytkownik o najniższym możliwym priorytecie. Nie zawiera informacji o hostach, więc jest umieszczany na końcu podczas sortowania hostów. Ponieważ zawiera również pustego użytkownika, jest umieszczany pod innymi wpisami w tej grupie. Podobnie jak wszystkie wpisy bez użytkownika, połączenia uwierzytelnione tym wpisem będą rejestrowane jako użytkownik anonimowy. |
Jak tworzyć użytkowników?
Teraz, gdy już wiesz, w jaki sposób MySQL obsługuje konta użytkowników, możemy rozpocząć tworzenie nowych użytkowników. Pamiętaj, aby zalogować się z użytkownikiem z uprawnieniami opisanymi w wymaganiach wstępnych.
Podstawowa składnia
Podstawowa składnia tworzenia nowego użytkownika jest stosunkowo prosta. Używasz CREATE USER
polecenie, a następnie określ użytkownika i hosta dla nowego konta:
CREATE USER '<user>'@'<host>';
Spowoduje to utworzenie podstawowego konta bez konfigurowania jakichkolwiek szczegółów poza użytkownikiem i hostem podczas tworzenia.
Jak utworzyć użytkownika z hasłem?
Często chcesz skonfigurować uwierzytelnianie podczas tworzenia użytkownika. Możesz to zrobić, dodając opcjonalny IDENTIFIED BY
klauzula na CREATE USER
oświadczenie:
CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';
Spowoduje to, jak poprzednio, utworzenie nowego konta użytkownika i jednoczesne przypisanie hasła do konta. Omówimy, jak przypisać hasło po fakcie lub jak później zmienić hasło użytkownika.
Jak utworzyć użytkownika z uwierzytelnianiem przez gniazdo Unix?
Chociaż uwierzytelnianie hasłem jest najpopularniejszą metodą uwierzytelniania dla większości użytkowników, nie jest to jedyna opcja. MySQL zapewnia wiele różnych wewnętrznych i zewnętrznych mechanizmów uwierzytelniania, które można skonfigurować do użycia na kontach użytkowników. Jako przykład skonfigurujemy nowe konto przy użyciu uwierzytelniania gniazda Unix.
Uwierzytelnianie przez gniazdo Unix może być używane w środowiskach Linux lub Unix, dzięki czemu konto w systemie operacyjnym ma dostęp do tej samej nazwy konta w MySQL bez dalszego uwierzytelniania. W tej konfiguracji administrator MySQL wie, że konta użytkowników w systemie operacyjnym są ściśle kontrolowane.
Więc jeśli istnieje mary
użytkownik w systemie operacyjnym, będzie mógł zalogować się do 'mary'@'localhost'
konto w MySQL, jeśli zdefiniowanym mechanizmem uwierzytelniania jest uwierzytelnianie przez gniazdo Unix. Skonfigurujmy to teraz.
Uwierzytelnianie przez gniazdo wymaga auth_socket
wtyczki, więc najpierw załaduj wtyczkę, wpisując:
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Następnie utwórz konto użytkownika zgodne z kontem użytkownika, które masz w systemie operacyjnym. W tym przykładzie użyjemy mary
konto, które omówiliśmy powyżej. Jeśli nie użyjesz nazwy, która pasuje do jednej z nazw Twojego systemu operacyjnego, uwierzytelnienie przy użyciu tego użytkownika nie będzie możliwe.
Aby utworzyć użytkownika z uwierzytelnianiem przez gniazdo, musimy użyć IDENTIFIED WITH
klauzula (inna niż IDENTIFIED BY
klauzula używana wcześniej), aby określić wtyczkę uwierzytelniającą do użycia:
CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;
Teraz powinieneś być w stanie uwierzytelnić się na 'mary'@'localhost'
Użytkownik MySQL z mary
użytkownika w systemie operacyjnym. Po zalogowaniu się jako mary
, połącz się z bazą danych bez podawania nazwy użytkownika ani hasła:
mysql
Powinieneś być zalogowany automatycznie przez skonfigurowane uwierzytelnianie gniazda Unix.
Jak pokazać istniejących użytkowników?
Następnie przyjrzyjmy się, jak znaleźć informacje o istniejących użytkownikach.
Aby wyświetlić wszystkich istniejących użytkowników MySQL, składający się z ich komponentu użytkownika i hosta, a także wtyczki uwierzytelniającej, której aktualnie używają, możesz SELECT
te pola z mysql.user
baza danych:
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)
Tutaj widzimy, że w systemie jest zdefiniowanych sześciu użytkowników, z których wszyscy mogą logować się tylko lokalnie. Pięć kont jest skonfigurowanych do korzystania z uwierzytelniania hasłem. 'mary'@'localhost'
konto jest skonfigurowane do korzystania z uwierzytelniania gniazda Unix.
Dodatkowe informacje o właściwościach użytkownika możemy znaleźć za pomocą SHOW CREATE USER
Komenda. Pomimo swojej nazwy pokazuje wszystkie aktualne właściwości konta użytkownika, niekoniecznie te, które były używane podczas początkowego tworzenia konta.
SHOW CREATE USER
polecenie przyjmuje nazwę konta jako argument:
SHOW CREATE USER '<user>'@'<host>'\G
Zwykle najlepiej jest zakończyć polecenie \G
terminator instrukcji zamiast zwykłego dwukropka (;
), dzięki czemu wyniki będą bardziej przejrzyste.
Aby wyświetlić właściwości dla 'useradmin'@'localhost'
konto, wpisz:
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)
Jak zmienić istniejących użytkowników MySQL?
Możesz zmienić istniejących użytkowników w MySQL za pomocą ALTER USER
Komenda. Można to wykorzystać do zmiany większości właściwości konta związanych z użytkownikiem, z wyjątkiem uprawnień konta, które są kontrolowane przez GRANT
i REVOKE
poleceń.
Podstawowa składnia ALTER USER
wygląda tak:
ALTER USER <user> <properties_to_change>;
Jak zmienić hasło dla użytkownika MySQL?
Dla większości ludzi najczęstsze użycie ALTER USER
jest zmiana haseł.
Na przykład możesz zmodyfikować hasło dla 'kamal'@'localhost'
wpisując:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';
Jeśli chcesz ustawić tymczasowe hasło dla użytkownika, które będzie musiał natychmiast zastąpić, możesz ustawić i wygasnąć hasło w tym samym czasie:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;
Zawsze możesz zmienić własne hasło, nawet bez CREATE USER
przywilej. Najłatwiej jest użyć USER()
funkcja automatycznego wpisywania własnej nazwy użytkownika:
ALTER USER USER() IDENTIFIED BY '<new_password>';
Jak zmienić wtyczki uwierzytelniające dla użytkownika MySQL?
Możesz także zmienić mechanizm lub wtyczkę używaną do uwierzytelniania konta.
We wcześniejszym przykładzie skonfigurowaliśmy konto o nazwie 'mary'@'localhost'
aby używać uwierzytelniania przez gniazdo Unix. Jeśli później zechcemy zmienić to konto, aby korzystało z konwencjonalnego uwierzytelniania hasła, możemy użyć ALTER USER
polecenie ponownie.
Najpierw zidentyfikuj domyślną wtyczkę uwierzytelniającą dla twojego serwera. Jeśli jest to metoda uwierzytelniania oparta na haśle, prawdopodobnie najlepiej będzie ponownie użyć domyślnego wyboru:
SHOW VARIABLES LIKE 'default_authentication_plugin';
W tym przypadku domyślną wtyczką uwierzytelniającą jest caching_sha2_password
, więc użyjemy tego, gdy przejdziemy na uwierzytelnianie hasłem.
Teraz zmień 'mary'@'localhost'
aby użyć caching_sha2_password
wtyczka z nowym hasłem:
ALTER USER 'mary'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<marys_password>';
'mary'@'localhost'
użytkownik nie będzie już mógł się logować przy użyciu uwierzytelniania gniazda Unix, ale może zalogować się przy użyciu podanego hasła.
Jak logujesz się do MySQL?
Omówiliśmy, jak tworzyć i modyfikować konta użytkowników MySQL, w tym uwierzytelnianie. Jednak nie rozmawialiśmy o tym, jak faktycznie zalogować się przy użyciu tych metod uwierzytelniania.
mysql
klient to potężny klient wiersza poleceń, którego można używać do łączenia się z lokalnymi i zdalnymi bazami danych. Użyjemy go, aby porozmawiać o tym, jak uwierzytelnić się za pomocą metod, które skonfigurowaliśmy powyżej.
Jak zalogować się do lokalnej bazy danych za pomocą hasła?
Aby zalogować się do lokalnie hostowanej bazy danych MySQL przy użyciu konta użytkownika z hasłem, podstawowa składnia wygląda następująco:
mysql --user=<username> --password <dbname>
Tak więc, jeśli 'kamal'@'localhost'
użytkownik chce zalogować się do MySQL i połączyć się z testing
bazy danych z komputera, na którym znajduje się system, mogą wpisać:
mysql --user=kamal --password testing
mysql
klient zapyta o hasło dla 'kamal'@'localhost'
. Jeśli podasz poprawne dane uwierzytelniające, połączysz się z testing
baza danych.
Określenie bazy danych w wierszu poleceń jest opcjonalne. Jeśli żaden nie zostanie określony, połączysz się z serwerem, ale nie z konkretną bazą danych.
Jak zalogować się do lokalnej bazy danych z uwierzytelnianiem przez gniazdo Unix?
Aby zalogować się do lokalnego serwera MySQL przy użyciu uwierzytelniania przez gniazdo Unix, musisz być zalogowany do swojego systemu operacyjnego pod nazwą konta, która jest zgodna. Tak więc, jeśli chcemy uwierzytelnić się w 'mary'@'localhost'
używając uwierzytelniania gniazda Unix, najpierw musimy zalogować się do naszego komputera za pomocą nazwy użytkownika o nazwie mary
.
Gdy używasz prawidłowego konta systemu operacyjnego, możesz połączyć się bezpośrednio z lokalną bazą danych, uruchamiając klienta, bez żadnych opcji.
mysql
Tak jak poprzednio, możesz opcjonalnie dołączyć nazwę bazy danych, aby połączyć się z konkretną bazą danych, którą chcesz.
Jak zalogować się do zdalnej bazy danych za pomocą hasła?
Jeśli twój serwer MySQL nie działa na twoim lokalnym serwerze, będziesz musiał określić hosta, z którym klient powinien się połączyć. Możesz to zrobić, dodając --host
opcja.
Przez większość czasu będziesz uwierzytelniać się hasłem do zdalnych serwerów MySQL, więc polecenie wyglądałoby mniej więcej tak:
mysql --user=<username> --password --host=<host> <dbname>
A więc 'tanya'@'<tanyas_domain>'
może połączyć się z serwerem MySQL znajdującym się na example.com
wpisując:
mysql --user='tanya' --password --host='example.com'
Jak usunąć użytkowników MySQL?
Utrzymywanie kont użytkowników, które już nie służą celowi, stanowi zagrożenie dla bezpieczeństwa. Możesz łatwo usunąć konta za pomocą DROP USER
polecenie.
Podstawowa składnia wygląda tak:
DROP USER '<user>'@'<host>';
Aby usunąć 'mary'@'localhost'
użytkownik, wpisz:
DROP USER 'mary'@'localhost';
Jeśli spróbujesz usunąć użytkownika, który nie istnieje, pojawi się błąd:
ERROR 1396 (HY000): Operation DROP USER failed for 'mary'@'localhost'
Aby tego uniknąć, możesz dodać IF EXISTS
klauzula przed nazwą konta. Jeśli użytkownik istnieje, zostanie usunięty. Jeśli tak się nie stanie, zostanie wyświetlone tylko ostrzeżenie:
Query OK, 0 rows affected, 1 warning (0.00 sec)
Wniosek
Zarządzanie kontami użytkowników i konfiguracja uwierzytelniania MySQL jest bardzo elastyczna. Nauka tworzenia, modyfikowania i uzyskiwania informacji o użytkownikach w MySQL pomoże Ci skuteczniej zarządzać systemami baz danych.
Najlepsze praktyki w zakresie bezpieczeństwa nakazują tworzyć konta dla każdego unikalnego przypadku użycia, biorąc pod uwagę tylko poziom dostępu wymagany do wykonania ich zakresu. Tworzenie i uwierzytelnianie konta to pierwsze etapy tego procesu. W innym przewodniku porozmawiamy o przyznawaniu i odwoływaniu uprawnień w celu realizacji drugiej części tej strategii.