Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment gérer les utilisateurs et l'authentification dans MySQL


Introduction

La gestion des utilisateurs est l'une des responsabilités les plus importantes de quiconque souhaite gérer un système de base de données MySQL. La création, la modification et la suppression de comptes d'utilisateurs afin de représenter au mieux les utilisateurs et les services de votre environnement permettent de préparer le terrain pour verrouiller l'accès, limiter la portée des modifications et mettre en œuvre l'audit et la responsabilité des modifications.

Dans ce guide, nous expliquerons comment gérer les comptes d'utilisateurs dans MySQL. Tout d'abord, nous discuterons de ce qu'est un utilisateur valide dans MySQL et vous montrerons comment ajouter des utilisateurs supplémentaires au système. Cela conduit à une discussion sur la configuration de l'authentification pour chaque utilisateur et sur la manière dont le système choisit une option d'authentification dans une liste de possibilités. Nous continuerons à parler des modifications apportées aux utilisateurs existants, de la manière de se connecter avec les comptes que vous avez créés et de la manière de supprimer les utilisateurs dont vous n'avez plus besoin.



Prérequis

Pour suivre ce guide, vous aurez besoin d'un compte sur un serveur MySQL avec les privilèges appropriés.


Commandes que nous utiliserons

Pour créer, modifier et supprimer des utilisateurs dans MySQL, les commandes principales dont vous avez besoin sont :

  • CREATE USER :créer un nouveau compte utilisateur
  • ALTER USER  :apporter des modifications à un compte utilisateur existant
  • DROP USER  :supprimer un compte utilisateur existant


Privilèges requis

Pour exécuter les commandes ci-dessus, vous devez vous connecter à MySQL avec un compte avec CREATE USER privilèges. Le CREATE USER Le privilège vous permet de créer, modifier, supprimer et renommer des utilisateurs, entre autres actions. Nous aurons également besoin du SELECT privilège sur mysql base de données pour voir les informations sur les utilisateurs existants.

Par ordre de préférence, vous devez vous connecter en utilisant :

  • Un compte limité qui a le CREATE USER privilège et le SELECT privilège sur mysql base de données
  • La root ou utilisateur administratif disposant de tous les privilèges dans MySQL



Comprendre comment MySQL définit et interprète les comptes utilisateur

Avant de commencer à créer de nouveaux comptes, il est utile de prendre le temps de se familiariser avec les différents que MySQL utilise pour créer et faire référence aux utilisateurs. Vous devez également connaître l'algorithme d'authentification de MySQL pour comprendre quel compte utilisateur il utilisera pour authentifier les connexions.


Quelle est la syntaxe MySQL pour les comptes utilisateur ?

Dans MySQL, les comptes d'utilisateurs sont composés de deux informations distinctes, reliées par un arobase (@) :

  • Le nom d'utilisateur
  • L'hôte à partir duquel l'utilisateur se connecte

En général, les comptes d'utilisateurs du système ressembleront à ceci :

'<user>'@'<host>'

Des guillemets simples peuvent être utilisés, comme ci-dessus, pour envelopper individuellement les composants utilisateur et hôte du compte utilisateur. Ils sont parfois nécessaires si l'un des composants contient des caractères qui seraient autrement mal interprétés. En général, les ajouter est toujours une bonne idée d'être explicite.

Ainsi, plutôt que d'avoir simplement un compte appelé 'john' , dans MySQL, le nom complet du compte nécessiterait une sorte d'hôte, tel que 'john'@'localhost' . Cela signifie qu'il peut y avoir plusieurs 'john' comptes sur le système et MySQL verra chacun d'eux comme un compte unique tant qu'ils proviennent d'un domaine différent.

Cela étant dit, il est possible de définir des comptes d'utilisateurs qui n'ont pas de composant utilisateur ou hôte, mais il y a des implications importantes dont vous devez être conscient.

Vous pouvez définir un compte utilisateur sans valeur utilisateur en utilisant une chaîne vide :

''@'<host>'

Par exemple, vous pouvez créer un utilisateur en tant que ''@'localhost' . Cet utilisateur correspondrait à tout nom d'utilisateur se connectant depuis l'ordinateur local.

De même, vous pouvez avoir un compte d'utilisateur qui correspond à n'importe quel hôte. Plutôt que d'utiliser une chaîne vide, pour les valeurs d'hôte, vous utiliseriez le % caractère générique, comme ceci :

'<user>'@'%'

Par exemple, si vous créez 'john'@'%' , ce compte correspondrait à un 'john' utilisateur se connectant depuis n'importe quel hôte.



Comment MySQL authentifie-t-il les utilisateurs ?

Comprendre comment MySQL traite réellement chaque demande d'authentification est très important pour éviter une classe courante de problèmes d'authentification résultant d'hypothèses raisonnables mais incorrectes. Cela a été discuté en profondeur dans notre article d'introduction à l'authentification et à l'autorisation dans MySQL.

Lors de l'authentification d'une demande de connexion, MySQL utilise un certain nombre de champs dans le user table de son mysql interne base de données pour décider d'autoriser ou non la connexion. MySQL utilisera au maximum un enregistrement de compte d'utilisateur pour tenter d'authentifier une connexion. Cela signifie que MySQL a besoin d'un moyen de décider quel compte utilisateur utiliser s'il existe plusieurs comptes pouvant correspondre à une connexion.

L'algorithme de MySQL pour authentifier les utilisateurs commence au démarrage du serveur. Au démarrage, MySQL charge l'intégralité de mysql.user table en mémoire. Il le fait également chaque fois que des comptes d'utilisateurs sont créés à l'aide des commandes MySQL habituelles. Au fur et à mesure qu'il charge la table, il trie les entrées de la priorité la plus élevée à la plus basse.

MySQL utilise l'Host colonne comme champ de tri principal et donne la priorité aux résultats avec des valeurs plus spécifiques. Ainsi, les valeurs littérales sont triées en haut avec la priorité la plus élevée et celles qui utilisent des caractères génériques, comme % , sont triés vers le bas. Les entrées finales sont celles qui ne contiennent que % sans autres caractères, suivis d'entrées dont l'hôte est entièrement vide.

L'User la colonne est utilisée comme champ de tri secondaire pour toutes les entrées qui ont le même Host valeur. Encore une fois, les correspondances les plus exactes sont prioritaires. Depuis l'User la colonne ne peut pas utiliser de caractères génériques, toutes les entrées sont sur un pied d'égalité sauf celles avec un User vide valeur. Ceux-ci sont triés vers le bas. Si une entrée avec un User vide est sélectionnée, l'utilisateur sera authentifié en tant qu'"utilisateur anonyme", ce qui équivaut généralement à n'avoir aucun privilège.

Maintenant, chaque fois qu'une demande de connexion est faite, MySQL parcourt sa table triée en mémoire de haut en bas. Il utilise le premier entrée qu'il trouve pour authentifier l'utilisateur, qu'il y ait ou non d'autres entrées qui correspondent également. Si le client ne parvient pas à s'authentifier à l'aide de la méthode définie par cette entrée, la connexion échouera et aucune autre entrée ne sera vérifiée.



Quels sont les conséquences de ne pas inclure un utilisateur ou un hôte dans une définition de compte utilisateur MySQL ?

En raison de l'algorithme d'authentification de MySQL, des problèmes peuvent survenir si vous ne faites pas attention lors de la création de comptes d'utilisateurs sans composant utilisateur ou hôte. En effet, la façon dont MySQL décide quel enregistrement utiliser pour vous authentifier peut être peu intuitive et surprenante.

Par exemple, si un utilisateur s'authentifie auprès de MySQL avec la partie utilisateur sous forme de chaîne vide, MySQL le considérera comme un "utilisateur anonyme" pour le reste de la session. En règle générale, les utilisateurs anonymes n'ont presque aucun pouvoir et peuvent très peu faire une fois connectés. Il est même possible de s'authentifier accidentellement en tant qu'utilisateur anonyme en essayant de s'authentifier à l'aide d'un compte d'utilisateur différent.

Le défi de l'utilisation d'hôtes génériques pour les comptes d'utilisateurs est que les autres comptes d'utilisateurs qui incluent une valeur d'hôte peut facilement masquer ou rendre indisponible le compte utilisateur qui utilise le caractère générique.

Par exemple, si vous avez un compte utilisateur défini comme 'emily'@'%' , vous pouvez vous attendre à pouvoir vous authentifier auprès de 'emily' de n'importe quel hôte. Cependant, si vous avez un compte utilisateur avec un utilisateur vide mais une valeur d'hôte qui correspond à l'hôte 'emily' se connecte à partir de, MySQL s'authentifiera à l'aide de ce compte à la place (conduisant à une connexion d'utilisateur anonyme comme décrit ci-dessus).

Ainsi, à titre d'exemple, MySQL triera les comptes suivants dans l'ordre suivant :

Priorité Compte MySQL Commentaires
1 'emily'@'localhost' et 'emily'@'example.com' Ceux-ci sont de priorité égale, ce qui est normal car il n'est possible que l'un d'entre eux corresponde à une connexion.
2 ''@'localhost' et ''@'example.com' Ces deux entrées sont, encore une fois, de la même priorité. Puisqu'ils n'ont pas de composant utilisateur, mais ils en ont ont un composant d'hôte littéral, ils sont placés au bas des entrées qui ont des valeurs d'hôte exactes.
3 'emily'@'%.example.com' Cette entrée a un caractère générique dans le composant hôte, elle est donc moins prioritaire que les entrées avec des valeurs d'hôte exactes.
4 ''@'%.example.com' Cette entrée est regroupée avec les entrées qui ont un caractère générique dans leur valeur d'hôte. Comme il n'a pas de composant utilisateur, il se trouve au bas de ce groupe.
5 'emily'@'%' Cette entrée a une valeur d'hôte composée uniquement d'un caractère générique. Puisqu'il correspond à n'importe quel hôte, sa priorité est très faible.
7 ''@'%' Cette entrée peut être utilisée pour authentifier n'importe quel utilisateur de n'importe quel hôte en tant qu'utilisateur anonyme. Il est d'une priorité extrêmement faible car il correspond à n'importe quelle connexion.
6 'emily'@'' Cette entrée a une valeur d'hôte entièrement vide, qui a une priorité encore plus faible qu'un hôte qui ne contient qu'un hôte générique.
8 ''@'' Il s'agit de l'utilisateur ayant la priorité la plus faible possible. Il ne contient aucune information sur l'hôte, il est donc placé à la fin lors du tri de l'hôte. Puisqu'il contient également un utilisateur vide, il est placé sous les autres entrées de ce groupe. Comme toutes les entrées sans utilisateur, les connexions authentifiées avec cette entrée seront connectées en tant qu'utilisateur anonyme.



Comment créez-vous des utilisateurs ?

Maintenant que vous avez une idée de la façon dont MySQL gère les comptes d'utilisateurs, nous pouvons commencer à créer de nouveaux utilisateurs. N'oubliez pas de vous connecter avec un utilisateur disposant des privilèges décrits dans les prérequis.


Syntaxe de base

La syntaxe de base pour créer un nouvel utilisateur est relativement simple. Vous utilisez le CREATE USER commande, puis spécifiez l'utilisateur et l'hôte du nouveau compte :

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

Cela créera un compte de base sans configurer aucun détail au-delà de son utilisateur et de son hôte lors de la création.



Comment créer un utilisateur avec un mot de passe ?

Souvent, vous souhaitez configurer l'authentification lors de la création de l'utilisateur. Vous pouvez le faire en ajoutant l'option IDENTIFIED BY clause sur CREATE USER déclaration :

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

Cela crée un nouveau compte utilisateur, comme auparavant, et attribue un mot de passe pour le compte en même temps. Nous expliquerons comment attribuer un mot de passe après coup ou comment modifier le mot de passe d'un utilisateur ultérieurement.



Comment créer un utilisateur avec l'authentification par socket Unix ?

Bien que l'authentification par mot de passe soit la méthode d'authentification la plus courante pour la plupart des utilisateurs, ce n'est pas la seule option. MySQL fournit de nombreux mécanismes d'authentification internes et externes différents que vous pouvez configurer pour vos comptes d'utilisateurs à utiliser. À titre d'exemple, nous allons configurer un nouveau compte à l'aide de l'authentification par socket Unix.

L'authentification par socket Unix peut être utilisée dans des environnements Linux ou de type Unix afin qu'un compte sur le système d'exploitation ait accès au même nom de compte dans MySQL sans autre authentification. Dans cette configuration, l'administrateur MySQL sait que les comptes d'utilisateurs sur le système d'exploitation sont étroitement contrôlés.

Donc s'il y a une mary utilisateur sur le système d'exploitation, ils pourront se connecter au 'mary'@'localhost' compte dans MySQL si l'authentification par socket Unix est le mécanisme d'authentification défini. Configurons cela maintenant.

L'authentification par socket nécessite le auth_socket plugin, alors chargez d'abord le plugin en tapant :

INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

Ensuite, créez un compte d'utilisateur qui correspond à un compte d'utilisateur que vous avez sur votre système d'exploitation. Pour cet exemple, nous utiliserons le mary compte dont nous avons discuté ci-dessus. Si vous n'utilisez pas un nom qui correspond à l'un de vos noms de système d'exploitation, vous ne pourrez pas vous authentifier à l'aide de cet utilisateur.

Pour créer l'utilisateur avec l'authentification par socket, nous devons utiliser le IDENTIFIED WITH clause (différente de la clause IDENTIFIED BY clause utilisée précédemment) pour spécifier le plugin d'authentification à utiliser :

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

Maintenant, vous devriez pouvoir vous authentifier auprès du 'mary'@'localhost' Utilisateur MySQL de mary utilisateur sur votre système d'exploitation. Lorsque vous êtes connecté en tant que mary , connectez-vous à la base de données sans fournir de nom d'utilisateur ni de mot de passe :

mysql

Vous devriez être connecté automatiquement via l'authentification socket Unix que vous avez configurée.




Comment affichez-vous les utilisateurs existants ?

Voyons maintenant comment trouver des informations sur les utilisateurs existants.

Pour afficher tous les utilisateurs MySQL existants, comprenant leur composant utilisateur et hôte, ainsi que le plugin d'authentification qu'ils utilisent actuellement, vous pouvez SELECT ces champs du mysql.user base de données :

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)

Ici, nous pouvons voir qu'il y a six utilisateurs définis sur le système, qui ne peuvent tous se connecter que localement. Cinq des comptes sont configurés pour utiliser l'authentification par mot de passe. Le 'mary'@'localhost' compte est configuré pour utiliser l'authentification par socket Unix.

Nous pouvons trouver des informations supplémentaires sur les propriétés de l'utilisateur en utilisant le SHOW CREATE USER commande. Malgré son nom, il affiche toutes les propriétés actuelles d'un compte utilisateur, pas nécessairement celles qui ont été utilisées lors de la création initiale du compte.

Le SHOW CREATE USER La commande prend un nom de compte comme argument :

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

Il est généralement préférable de terminer la commande par le \G terminateur d'instruction au lieu des deux-points habituels (; ) afin que vous puissiez voir les résultats un peu plus clairement.

Pour afficher les propriétés de 'useradmin'@'localhost' compte, vous taperiez :

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)


Comment changez-vous les utilisateurs MySQL existants ?

Vous pouvez changer les utilisateurs existants dans MySQL en utilisant le ALTER USER commande. Cela peut être utilisé pour modifier la plupart des propriétés liées à l'utilisateur d'un compte, à l'exception des privilèges de compte, qui sont contrôlés par le GRANT et REVOKE commandes.

La syntaxe de base pour ALTER USER ressemble à ceci :

ALTER USER <user> <properties_to_change>;

Comment changer le mot de passe d'un utilisateur MySQL ?

Pour la plupart des gens, l'utilisation la plus courante de ALTER USER est de modifier les mots de passe.

Par exemple, vous pouvez modifier le mot de passe pour 'kamal'@'localhost' en tapant :

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

Si vous souhaitez définir un mot de passe temporaire pour un utilisateur qu'il devra remplacer immédiatement, vous pouvez définir et faire expirer un mot de passe en même temps :

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

Vous pouvez toujours changer votre propre mot de passe, même sans le CREATE USER privilège. Il est plus simple d'utiliser le USER() fonction pour remplir automatiquement votre propre nom d'utilisateur :

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


Comment changer les plugins d'authentification pour un utilisateur MySQL ?

Vous pouvez également modifier le mécanisme ou le plug-in utilisé pour authentifier un compte.

Dans un exemple précédent, nous avons configuré un compte appelé 'mary'@'localhost' pour utiliser l'authentification par socket Unix. Si nous voulons plus tard changer ce compte pour utiliser l'authentification par mot de passe conventionnel, nous pouvons utiliser le ALTER USER commande à nouveau.

Tout d'abord, identifiez le plugin d'authentification par défaut pour votre serveur. S'il s'agit d'une méthode d'authentification basée sur un mot de passe, il est probablement préférable de réutiliser la sélection par défaut :

SHOW VARIABLES LIKE 'default_authentication_plugin';

Dans ce cas, le plugin d'authentification par défaut est caching_sha2_password , nous l'utiliserons donc lorsque nous passerons à l'authentification par mot de passe.

Maintenant, changez 'mary'@'localhost' pour utiliser le caching_sha2_password plugin avec un nouveau mot de passe :

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

Le 'mary'@'localhost' l'utilisateur ne pourra plus se connecter à l'aide de l'authentification par socket Unix, mais il pourra se connecter à l'aide du mot de passe fourni.




Comment vous connectez-vous à MySQL ?

Nous avons expliqué comment créer et modifier des comptes utilisateur MySQL, y compris l'authentification. Cependant, nous n'avons pas expliqué comment se connecter à l'aide de ces méthodes d'authentification.

Le mysql client est un puissant client en ligne de commande qui peut être utilisé pour se connecter à des bases de données locales et distantes. Nous l'utiliserons pour expliquer comment s'authentifier à l'aide des méthodes que nous avons configurées ci-dessus.


Comment se connecter à une base de données locale avec un mot de passe ?

Pour vous connecter à une base de données MySQL hébergée localement à l'aide d'un compte utilisateur avec un mot de passe, la syntaxe de base ressemble à ceci :

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

Donc, si le 'kamal'@'localhost' l'utilisateur veut se connecter à MySQL et se connecter au testing base de données à partir de l'ordinateur sur lequel le système est hébergé, ils peuvent saisir :

mysql --user=kamal --password testing

Le mysql le client demandera le mot de passe pour 'kamal'@'localhost' . Si vous fournissez les informations d'identification correctes, vous serez connecté au testing base de données.

La spécification d'une base de données sur la ligne de commande est facultative. Si aucun n'est spécifié, vous vous connecterez au serveur mais pas à une base de données spécifique.



Comment se connecter à une base de données locale avec l'authentification par socket Unix ?

Pour vous connecter à un serveur MySQL local à l'aide de l'authentification par socket Unix, vous devez être connecté à votre système d'exploitation avec le nom de compte correspondant. Donc, si nous voulons nous authentifier auprès de 'mary'@'localhost' en utilisant l'authentification par socket Unix, nous devons d'abord nous connecter à notre ordinateur avec un nom d'utilisateur appelé mary .

Une fois que vous utilisez le bon compte de système d'exploitation, vous pouvez vous connecter directement à la base de données locale en exécutant le client, sans aucune option.

mysql

Comme auparavant, vous pouvez éventuellement ajouter un nom de base de données pour vous connecter à une base de données spécifique que vous souhaitez.



Comment se connecter à une base de données distante avec un mot de passe ?

Si votre serveur MySQL ne s'exécute pas sur votre serveur local, vous devrez spécifier l'hôte auquel le client doit essayer de se connecter. Vous pouvez le faire en ajoutant le --host option.

La plupart du temps, vous vous authentifierez avec un mot de passe sur des serveurs MySQL distants, donc la commande ressemblera à ceci :

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

Alors 'tanya'@'<tanyas_domain>' pourrait se connecter à un serveur MySQL situé sur example.com en tapant :

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



Comment supprimer des utilisateurs MySQL ?

Garder des comptes d'utilisateurs qui ne servent plus à rien est un risque pour la sécurité. Vous pouvez facilement supprimer des comptes avec le DROP USER commande.

La syntaxe de base ressemble à ceci :

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

Donc pour supprimer le 'mary'@'localhost' user, vous taperez :

DROP USER 'mary'@'localhost';

Si vous essayez de supprimer un utilisateur qui n'existe pas, vous recevrez une erreur :

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

Pour éviter cela, vous pouvez ajouter le IF EXISTS clause avant le nom du compte. Si l'utilisateur existe, il sera supprimé. Si ce n'est pas le cas, seul un avertissement sera donné :

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


Conclusion

La gestion des comptes utilisateurs et la configuration de l'authentification de MySQL sont extrêmement flexibles. Apprendre à créer, modifier et obtenir des informations sur les utilisateurs de MySQL vous aidera à administrer vos systèmes de base de données plus efficacement.

Les meilleures pratiques de sécurité dictent que vous devez créer des comptes pour chaque cas d'utilisation unique, étant donné uniquement le niveau d'accès requis pour exécuter leur portée. La création et l'authentification du compte sont les premières étapes de ce processus. Dans un autre guide, nous parlerons de l'octroi et de la révocation de privilèges pour remplir l'autre partie de cette stratégie.