sql >> Base de Datos >  >> RDS >> Mysql

Cómo administrar usuarios y autenticación en MySQL


Introducción

La administración de usuarios es una de las responsabilidades más importantes de cualquiera que desee administrar un sistema de base de datos MySQL. Crear, modificar y eliminar cuentas de usuario para representar mejor a los usuarios y servicios en su entorno ayuda a sentar las bases para bloquear el acceso, limitar el alcance de los cambios e implementar la auditoría y la responsabilidad de las modificaciones.

En esta guía, hablaremos sobre cómo administrar cuentas de usuario dentro de MySQL. Primero, discutiremos qué es un usuario válido en MySQL y le mostraremos cómo agregar usuarios adicionales al sistema. Esto lleva a una discusión sobre cómo configurar la autenticación para cada usuario y cómo el sistema elige una opción de autenticación de una lista de posibilidades. Continuaremos hablando sobre cómo realizar cambios en los usuarios existentes, cómo iniciar sesión con las cuentas que ha creado y cómo eliminar usuarios que ya no necesita.



Requisitos previos

Para seguir esta guía, necesitará una cuenta en un servidor MySQL con los privilegios apropiados.


Comandos que usaremos

Para crear, modificar y eliminar usuarios dentro de MySQL, los comandos principales que necesita son:

  • CREATE USER :crear una nueva cuenta de usuario
  • ALTER USER :realizar cambios en una cuenta de usuario existente
  • DROP USER :eliminar una cuenta de usuario existente


Privilegios requeridos

Para ejecutar los comandos anteriores, debe iniciar sesión en MySQL con una cuenta con CREATE USER privilegios El CREATE USER El privilegio le permite crear, modificar, eliminar y renombrar usuarios, entre otras acciones. También necesitaremos el SELECT privilegio en mysql base de datos para ver información sobre los usuarios existentes.

En orden de preferencia, debe iniciar sesión usando:

  • Una cuenta limitada que tiene el CREATE USER privilegio y el SELECT privilegio en mysql base de datos
  • La root o usuario administrativo que tiene todos los privilegios dentro de MySQL



Comprender cómo MySQL define e interpreta las cuentas de usuario

Antes de comenzar a crear nuevas cuentas, es útil tomarse un tiempo para familiarizarse con las diversas que utiliza MySQL para crear y referirse a los usuarios. También debe estar familiarizado con el algoritmo de autenticación de MySQL para comprender qué cuenta de usuario utilizará para autenticar las conexiones.


¿Cuál es la sintaxis de MySQL para las cuentas de usuario?

En MySQL, las cuentas de usuario se componen de dos piezas de información separadas, unidas por un signo de arroba (@):

  • El nombre de usuario
  • El host desde el que se conecta el usuario

En general, las cuentas de usuario en el sistema tendrán el siguiente aspecto:

'<user>'@'<host>'

Se pueden usar comillas simples, como se indicó anteriormente, para envolver individualmente los componentes de usuario y host de la cuenta de usuario. A veces son necesarios si alguno de los componentes contiene caracteres que, de otro modo, se malinterpretarían. En general, agregarlos siempre es una buena idea para ser explícito.

Entonces, en lugar de tener una cuenta llamada 'john' , en MySQL, el nombre completo de la cuenta requeriría algún tipo de host, como 'john'@'localhost' . Esto significa que puede haber múltiples 'john' cuentas en el sistema y MySQL verá cada una de ellas como una cuenta única siempre que provengan de un dominio diferente.

Habiendo dicho todo esto, es posible definir cuentas de usuario que no tengan un componente de usuario o host, pero hay implicaciones importantes que debe tener en cuenta.

Puede definir una cuenta de usuario sin un valor de usuario utilizando una cadena vacía:

''@'<host>'

Por ejemplo, podría crear un usuario como ''@'localhost' . Este usuario coincidiría con cualquiera nombre de usuario que se conecta desde la computadora local.

Del mismo modo, podría tener una cuenta de usuario que coincida con cualquier host. En lugar de usar una cadena vacía, para los valores de host, usaría el % comodín, así:

'<user>'@'%'

Por ejemplo, si crea 'john'@'%' , esa cuenta coincidiría con un 'john' usuario que se conecta desde cualquier anfitrión.



¿Cómo autentica MySQL a los usuarios?

Comprender cómo MySQL realmente procesa cada solicitud de autenticación es muy importante para evitar una clase común de problemas de autenticación que resultan de suposiciones razonables pero incorrectas. Esto se discutió con cierta profundidad en nuestra introducción a la autenticación y autorización en el artículo de MySQL.

Al autenticar una solicitud de conexión, MySQL utiliza una serie de campos dentro del user tabla de su mysql interno base de datos para decidir si permitir la conexión. MySQL usará como máximo uno registro de cuenta de usuario para intentar autenticar una conexión. Esto significa que MySQL necesita una forma de decidir qué cuenta de usuario usar si hay más de una cuenta que podría coincidir con una conexión.

El algoritmo de MySQL para autenticar a los usuarios comienza cuando se inicia el servidor. Al iniciarse, MySQL carga todo el mysql.user tabla en la memoria. También hace esto cada vez que se crean cuentas de usuario utilizando los comandos regulares de MySQL. A medida que carga la tabla, ordena las entradas de mayor a menor prioridad.

MySQL usa el Host columna como el campo de clasificación principal y prioriza los resultados con valores más específicos. Entonces, los valores literales se ordenan en la parte superior como la prioridad más alta y aquellos que usan comodines, como % , se ordenan al final. Las entradas finales son aquellas que solo contienen % sin otros caracteres, seguido de entradas que tienen un host completamente en blanco.

El User La columna se usa como un campo de clasificación secundario para cualquier entrada que tenga el mismo Host valor. Una vez más, se priorizan las coincidencias más exactas. Dado que el User la columna no puede usar comodines, todas las entradas están en pie de igualdad excepto aquellas con un User en blanco valor. Esos están ordenados al final. Si alguna entrada tiene un User en blanco se selecciona el valor, el usuario se autenticará como un "usuario anónimo", lo que generalmente equivale a no tener privilegios.

Ahora, cada vez que se realiza una solicitud de conexión, MySQL revisa su tabla ordenada en la memoria de arriba a abajo. Utiliza el primero entrada que encuentra para autenticar al usuario, independientemente de si hay otras entradas que también coincidan. Si el cliente no puede autenticarse usando el método definido por esa entrada, la conexión fallará y no se verificará ninguna otra entrada.



¿Cuáles son las implicaciones de no incluir un usuario o host en una definición de cuenta de usuario de MySQL?

Debido al algoritmo de autenticación de MySQL, pueden surgir problemas si no tiene cuidado al crear cuentas de usuario sin un componente de usuario o host. Esto se debe a que la forma en que MySQL decide qué registro usar para autenticarte puede ser poco intuitiva y sorprendente.

Por ejemplo, si un usuario se autentica en MySQL con la parte del usuario como una cadena en blanco, MySQL lo considerará un "usuario anónimo" durante el resto de la sesión. Como regla general, los usuarios anónimos casi no tienen poder y pueden hacer muy poco una vez conectados. Incluso es posible autenticarse accidentalmente como un usuario anónimo al intentar autenticarse con una cuenta de usuario diferente.

El desafío de usar hosts comodín para cuentas de usuario es que otras cuentas de usuario que incluyen un valor de host puede enmascarar fácilmente, o hacer que no esté disponible, la cuenta de usuario que usa el comodín.

Por ejemplo, si tiene una cuenta de usuario definida como 'emily'@'%' , es posible que espere poder autenticarse en 'emily' de cualquier anfitrión. Sin embargo, si tiene una cuenta de usuario con un usuario en blanco pero un valor de host que coincide con el host 'emily' se está conectando, MySQL se autenticará usando esa cuenta en su lugar (lo que lleva a un inicio de sesión de usuario anónimo como se describe anteriormente).

Entonces, como ejemplo, MySQL clasificará las siguientes cuentas en el siguiente orden:

Prioridad Cuenta MySQL Comentarios
1 'emily'@'localhost' y 'emily'@'example.com' Estos tienen la misma prioridad, lo cual está bien porque solo uno de ellos puede coincidir con una conexión.
2 ''@'localhost' y ''@'example.com' Estas dos entradas son, nuevamente, de la misma prioridad. Dado que no tienen un componente de usuario, pero tienen un componente de host literal, se colocan en la parte inferior de las entradas que tienen valores de host exactos.
3 'emily'@'%.example.com' Esta entrada tiene un comodín en el componente de host, por lo que tiene menor prioridad que las entradas con valores de host exactos.
4 ''@'%.example.com' Esta entrada se agrupa con las entradas que tienen un comodín dentro de su valor de host. Dado que no tiene un componente de usuario, se encuentra en la parte inferior de este grupo.
5 'emily'@'%' Esta entrada tiene un valor de host que consiste solo en un comodín. Dado que coincide con cualquier host, tiene una prioridad muy baja.
7 ''@'%' Esta entrada se puede utilizar para autenticar a cualquier usuario de cualquier host como usuario anónimo. Tiene una prioridad extremadamente baja ya que coincide con cualquier conexión.
6 'emily'@'' Esta entrada tiene un valor de host completamente en blanco, que tiene una prioridad incluso menor que un host que solo contiene un host comodín.
8 ''@'' Este es el usuario de menor prioridad posible. No contiene información sobre el host, por lo que se coloca al final durante la clasificación del host. Dado que también contiene un usuario en blanco, se coloca debajo de otras entradas en este grupo. Como todas las entradas sin usuario, las conexiones autenticadas con esta entrada se iniciarán como un usuario anónimo.



¿Cómo se crean usuarios?

Ahora que tiene una idea de la forma en que MySQL maneja las cuentas de usuario, podemos comenzar a crear algunos usuarios nuevos. Recuerde iniciar sesión con un usuario con los privilegios descritos en los requisitos previos.


Sintaxis básica

La sintaxis básica para crear un nuevo usuario es relativamente simple. Usas el CREATE USER comando y luego especifique el usuario y host para la nueva cuenta:

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

Esto creará una cuenta básica sin configurar ningún detalle más allá de su usuario y host en la creación.



¿Cómo se crea un usuario con contraseña?

A menudo, desea configurar la autenticación mientras crea el usuario. Puede hacer esto agregando el IDENTIFIED BY opcional cláusula en CREATE USER declaración:

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

Esto crea una nueva cuenta de usuario, como antes, y asigna una contraseña para la cuenta al mismo tiempo. Cubriremos cómo asignar una contraseña después del hecho o cómo cambiar la contraseña de un usuario más adelante.



¿Cómo se crea un usuario con autenticación de socket Unix?

Si bien la autenticación con contraseña es el método de autenticación más común para la mayoría de los usuarios, no es la única opción. MySQL proporciona muchos mecanismos de autenticación internos y externos diferentes que puede configurar para que los usen sus cuentas de usuario. Como ejemplo, configuraremos una nueva cuenta utilizando la autenticación de socket de Unix.

La autenticación de socket de Unix se puede usar en entornos Linux o similares a Unix para que una cuenta en el sistema operativo tenga acceso al mismo nombre de cuenta dentro de MySQL sin más autenticación. En esta configuración, el administrador de MySQL sabe que las cuentas de usuario en el sistema operativo están estrictamente controladas.

Así que si hay una mary usuario en el sistema operativo, podrá iniciar sesión en 'mary'@'localhost' cuenta dentro de MySQL si la autenticación de socket Unix es el mecanismo de autenticación definido. Configuremos esto ahora.

La autenticación de socket requiere el auth_socket complemento, así que primero cargue el complemento escribiendo:

INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

A continuación, cree una cuenta de usuario que coincida con una cuenta de usuario que tenga en su sistema operativo. Para este ejemplo, usaremos mary cuenta que discutimos anteriormente. Si no usa un nombre que coincida con uno de los nombres de su sistema operativo, no podrá autenticarse con este usuario.

Para crear el usuario con autenticación de socket, necesitamos usar el IDENTIFIED WITH cláusula (diferente a la cláusula IDENTIFIED BY cláusula utilizada anteriormente) para especificar el complemento de autenticación a utilizar:

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

Ahora, debería poder autenticarse en 'mary'@'localhost' Usuario MySQL de mary usuario en su sistema operativo. Cuando inicia sesión como mary , conéctese a la base de datos sin proporcionar ningún nombre de usuario o contraseña:

mysql

Debe iniciar sesión automáticamente a través de la autenticación de socket de Unix que configuró.




¿Cómo se muestran los usuarios existentes?

A continuación, echemos un vistazo a cómo encontrar información sobre los usuarios existentes.

Para mostrar todos los usuarios de MySQL existentes, que consisten en su usuario y componente de host, así como el complemento de autenticación que están usando actualmente, puede SELECT esos campos del mysql.user base de datos:

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)

Aquí, podemos ver que hay seis usuarios definidos en el sistema, todos los cuales solo pueden iniciar sesión localmente. Cinco de las cuentas están configuradas para usar autenticación de contraseña. El 'mary'@'localhost' la cuenta está configurada para usar la autenticación de socket de Unix.

Podemos encontrar información adicional sobre las propiedades del usuario usando el SHOW CREATE USER dominio. A pesar de su nombre, muestra todas las propiedades actuales de una cuenta de usuario, no necesariamente las que se usaron durante la creación inicial de la cuenta.

El SHOW CREATE USER El comando toma un nombre de cuenta como argumento:

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

Por lo general, es mejor finalizar el comando con \G terminador de declaración en lugar de los dos puntos habituales (; ) para que pueda ver los resultados un poco más claramente.

Para mostrar las propiedades del 'useradmin'@'localhost' cuenta, escribiría:

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)


¿Cómo se cambian los usuarios existentes de MySQL?

Puede cambiar los usuarios existentes dentro de MySQL usando ALTER USER dominio. Esto se puede usar para cambiar la mayoría de las propiedades relacionadas con el usuario de una cuenta, con la excepción de los privilegios de la cuenta, que están controlados por GRANT y REVOKE comandos.

La sintaxis básica para ALTER USER se parece a esto:

ALTER USER <user> <properties_to_change>;

¿Cómo se cambia la contraseña de un usuario de MySQL?

Para la mayoría de las personas, el uso más común de ALTER USER es modificar contraseñas.

Por ejemplo, puede modificar la contraseña para 'kamal'@'localhost' escribiendo:

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

Si desea establecer una contraseña temporal para un usuario que tendrá que reemplazar de inmediato, puede establecer y hacer caducar una contraseña al mismo tiempo:

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

Siempre puede cambiar su propia contraseña, incluso sin el CREATE USER privilegio. Es más fácil usar USER() función para completar automáticamente su propio nombre de usuario:

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


¿Cómo cambia los complementos de autenticación para un usuario de MySQL?

También puede cambiar el mecanismo o complemento utilizado para autenticar una cuenta.

En un ejemplo anterior, configuramos una cuenta llamada 'mary'@'localhost' para utilizar la autenticación de socket de Unix. Si más adelante queremos cambiar esa cuenta para usar la autenticación de contraseña convencional, podemos usar el ALTER USER comando de nuevo.

Primero, identifique el complemento de autenticación predeterminado para su servidor. Si se trata de un método de autenticación basado en contraseña, probablemente sea mejor reutilizar la selección predeterminada:

SHOW VARIABLES LIKE 'default_authentication_plugin';

En este caso, el complemento de autenticación predeterminado es caching_sha2_password , así que lo usaremos cuando cambiemos a la autenticación de contraseña.

Ahora, cambia 'mary'@'localhost' para usar el caching_sha2_password complemento con una nueva contraseña:

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

El 'mary'@'localhost' el usuario ya no podrá iniciar sesión con la autenticación de socket de Unix, pero podrá iniciar sesión con la contraseña proporcionada.




¿Cómo se inicia sesión en MySQL?

Hemos discutido cómo crear y modificar cuentas de usuario de MySQL, incluida la autenticación. Sin embargo, no hemos hablado sobre cómo iniciar sesión usando estos métodos de autenticación.

El mysql client es un potente cliente de línea de comandos que se puede utilizar para conectarse a bases de datos locales y remotas. Lo usaremos para hablar sobre cómo autenticarse usando los métodos que configuramos anteriormente.


¿Cómo se inicia sesión en una base de datos local con una contraseña?

Para iniciar sesión en una base de datos MySQL alojada localmente usando una cuenta de usuario con una contraseña, la sintaxis básica se ve así:

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

Entonces, si 'kamal'@'localhost' el usuario quiere iniciar sesión en MySQL y conectarse a testing base de datos de la computadora donde está alojado el sistema, pueden escribir:

mysql --user=kamal --password testing

El mysql el cliente solicitará la contraseña para 'kamal'@'localhost' . Si proporciona las credenciales correctas, se le conectará a la testing base de datos.

La especificación de una base de datos en la línea de comandos es opcional. Si no se especifica ninguno, se conectará al servidor pero no a una base de datos específica.



¿Cómo se inicia sesión en una base de datos local con autenticación de socket Unix?

Para iniciar sesión en un servidor MySQL local utilizando la autenticación de socket de Unix, debe iniciar sesión en su sistema operativo con el nombre de cuenta que coincida. Entonces, si queremos autenticarnos en 'mary'@'localhost' usando la autenticación de socket Unix, primero tenemos que iniciar sesión en nuestra computadora con un nombre de usuario llamado mary .

Una vez que esté utilizando la cuenta del sistema operativo correcta, puede conectarse directamente a la base de datos local ejecutando el cliente, sin opciones.

mysql

Como antes, opcionalmente puede agregar un nombre de base de datos para conectarse a una base de datos específica que desee.



¿Cómo se inicia sesión en una base de datos remota con una contraseña?

Si su servidor MySQL no se está ejecutando en su servidor local, deberá especificar el host al que el cliente debe intentar conectarse. Puede hacerlo agregando --host opción.

La mayoría de las veces, se autenticará con una contraseña en servidores MySQL remotos, por lo que el comando se vería así:

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

Así que 'tanya'@'<tanyas_domain>' podría conectarse a un servidor MySQL ubicado en example.com escribiendo:

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



¿Cómo se eliminan los usuarios de MySQL?

Mantener cuentas de usuario que ya no tienen un propósito es un riesgo de seguridad. Puede eliminar cuentas fácilmente con DROP USER comando.

La sintaxis básica se ve así:

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

Entonces, para eliminar el 'mary'@'localhost' usuario, escribiría:

DROP USER 'mary'@'localhost';

Si intenta eliminar un usuario que no existe, recibirá un error:

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

Para evitar esto, puede agregar el IF EXISTS cláusula antes del nombre de la cuenta. Si el usuario existe, será eliminado. Si no lo hace, solo se dará una advertencia:

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


Conclusión

La configuración de autenticación y gestión de cuentas de usuario de MySQL es muy flexible. Aprender a crear, modificar y obtener información sobre usuarios dentro de MySQL lo ayudará a administrar sus sistemas de bases de datos de manera más eficaz.

Las mejores prácticas de seguridad dictan que debe crear cuentas para cada caso de uso único, dado solo el nivel de acceso requerido para realizar su alcance. La creación y autenticación de la cuenta son las primeras etapas de este proceso. En otra guía, hablaremos sobre otorgar y revocar privilegios para cumplir con la otra parte de esa estrategia.