¿Deberían seguir los privilegios de descarga después de la concesión?

Fuente del contenido: Lin Xiaobin "45 conferencias sobre combate real de MySQL"

En MySQL, la declaración de concesión se utiliza para otorgar derechos a los usuarios. Se mencionará en algunos documentos de operación que un comando flush privileges debe ejecutarse inmediatamente después de la concesión para que la declaración de concesión entre en vigor. Cuando utilicé MySQL por primera vez, seguí las instrucciones de un documento operativo y seguí este orden. Entonces, ¿los privilegios flush realmente deben ejecutarse después de la concesión? Si el comando flush no se ejecuta, ¿puede la declaración de empower realmente no tener efecto?

Primero cree un usuario: cree user'ua '@'% 'identificado por'pa';

En MySQL, el nombre de usuario (usuario) + dirección (host) representa un usuario, por lo que ua @ ip1 y ua @ ip2 representan dos usuarios diferentes. Este comando realiza dos acciones:

  • En el disco, inserte una fila en la tabla mysql.user Dado que no hay ningún permiso especificado, el valor de todos los campos de permiso en esta fila de datos es N;
  • En la memoria, inserte un objeto acl_user en la matriz acl_users, el campo de acceso de este objeto es 0.

    

Permisos globales

Actuando en toda la instancia de MySQL, esta información de permisos se almacena en la tabla de usuarios de la biblioteca mysql. Si quiero darle al usuario ua una autoridad máxima, la oración es así:
conceda todos los privilegios en *. * To'ua '@'% 'con opción de concesión;

Este comando de concesión realiza dos acciones:

  • En el disco, en la tabla mysql.user, modifique los valores de todos los campos que indican permisos en la fila del usuario'ua '@'% 'a'Y';
  • En la memoria, busque el objeto correspondiente a este usuario de la matriz acl_users y modifique el valor de acceso (bit de permiso) a binario "todos unos".

Después de que se ejecuta el comando de concesión, si un nuevo cliente inicia sesión con éxito con el nombre de usuario ua, MySQL mantendrá un objeto de hilo para la nueva conexión, y luego verificará los permisos del usuario de la matriz acl_users y copiará el valor de permiso a este objeto de hilo . En las declaraciones subsiguientes ejecutadas a este respecto, todos los juicios sobre permisos globales utilizan directamente los bits de permiso almacenados dentro del objeto hilo.

Con base en el análisis anterior, podemos saber:

  • El comando de concesión actualiza el disco y la memoria al mismo tiempo para los permisos globales. El comando entrará en vigor inmediatamente después de la finalización y la conexión recién creada utilizará los nuevos permisos.
  • Para una conexión existente, sus permisos globales no se ven afectados por el comando de concesión.

Si desea reclamar los permisos otorgados por la declaración de concesión anterior, puede usar el siguiente comando: revocar todos los privilegios en *. * From'ua '@'% ';

El uso de este comando de revocación es similar a la concesión y realiza las dos acciones siguientes:

  • En el disco, en la tabla mysql.user, modifique los valores de todos los campos que indican permisos en la fila del usuario'ua '@'% 'a "N";
  • En la memoria, busque el objeto correspondiente a este usuario de la matriz acl_users y modifique el valor de acceso a 0.

permisos de db

Si desea que el usuario ua tenga todos los permisos de la biblioteca db1, puede ejecutar el siguiente comando: conceder todos los privilegios en db1. * To'ua '@'% 'con opción de concesión;

Los registros de permisos basados ​​en la base de datos se almacenan en la tabla mysql.db y se almacenan en la matriz acl_dbs en la memoria. Este comando de concesión realiza las siguientes dos acciones:

  • En el disco, se insertó una fila de registros en la tabla mysql.db y todos los campos de bits de permiso se establecieron en "Y";
  • En la memoria, agregue un objeto a la matriz acl_dbs, el bit de permiso de este objeto es "todos 1".

    

Cada vez que necesite determinar los permisos de lectura y escritura de un usuario en una base de datos, debe atravesar la matriz acl_dbs una vez, encontrar el objeto coincidente según el usuario, el host y la base de datos, y luego juzgar de acuerdo con el bit de permiso del objeto. En otras palabras, cuando la concesión modifica los permisos de la base de datos, entra en vigor tanto en el disco como en la memoria.

El efecto de la operación de concesión en las conexiones existentes es diferente entre los permisos globales y los permisos basados ​​en db. A continuación, haremos un experimento controlado para ver cada uno.

    

Nota: La operación de set global sync_binlog requiere superpermiso.

Se puede ver que, aunque el superpermiso del usuario ua ha sido recuperado por la declaración de revocación en T3, la verificación del permiso aún pasó cuando se ejecutó set global en T4. Esto se debe a que super es una autoridad global, esta información de autoridad está en el objeto del hilo y la operación de revocación no afecta a este objeto del hilo.

Después de eliminar todos los permisos de ua a la biblioteca db1 en T5, si la sesión B opera la tabla de la biblioteca db1 en T6, se informará un error "Permisos insuficientes". Esto se debe a que acl_dbs es una matriz global y todos los subprocesos utilizan esta matriz para determinar los permisos de la base de datos, por lo que la operación de revocación afectará inmediatamente a la sesión B.

Hay una lógica especial en la implementación del código: si la sesión actual ya está en una base de datos determinada, los permisos de biblioteca obtenidos cuando se utilizó la biblioteca antes se almacenarán en la variable de sesión.

Puede ver que en el momento T6, la sesión C y la sesión B tienen la misma lógica de operación en la tabla t. Pero la sesión B informa un error y la sesión C se puede ejecutar correctamente. Esto se debe a que el uso db1 ejecutado por la sesión C en el tiempo T2 ha obtenido los permisos de esta biblioteca Antes de salir de la biblioteca db1, la sesión C siempre ha tenido permisos en esta biblioteca.

Permisos de tabla y permisos de columna

MySQL admite permisos de columna y de tabla más detallados. Entre ellos, la definición de permiso de la tabla se almacena en la tabla mysql.tables_priv y la definición de permiso de columna se almacena en la tabla mysql.columns_priv. Estos dos tipos de permisos se combinan y almacenan en la estructura hash de memoria column_priv_hash.

Los comandos de autorización para estos dos tipos de permisos son los siguientes:

create table db1.t1(id int, a int);
grant all privileges on db1.t1 to 'ua'@'%' with grant option;
GRANT SELECT(id), INSERT (id,a) ON mydb.mytbl TO 'ua'@'%' with grant option;

De manera similar a los permisos de la base de datos, estos dos permisos modifican la tabla de datos cada vez que otorgan, y también modifican la estructura hash en la memoria simultáneamente. Por lo tanto, las operaciones en estos dos tipos de permisos también afectarán inmediatamente las conexiones existentes.

privilegios de descarga 

El comando flush privileges borrará la matriz acl_users, luego leerá los datos de la tabla mysql.user y volverá a cargarla para reconstruir una matriz acl_users. En otras palabras, según los datos de la tabla de datos, la matriz de memoria de permisos globales se volverá a cargar. De manera similar, MySQL ha hecho lo mismo con los permisos de la base de datos, los permisos de la tabla y los permisos de la columna.

En otras palabras, si los datos de permisos de la memoria y la tabla de datos del disco son los mismos, no es necesario ejecutar privilegios de descarga. Y si todos usamos sentencias de concesión / revocación para ejecutar, la memoria y las tablas de datos se mantienen actualizadas originalmente sincrónicamente.

Por lo tanto, en circunstancias normales, después del comando grant, no es necesario ejecutar el comando flush privileges.

escenas a utilizar:

Cuando los datos de privilegios en la tabla de datos son inconsistentes con los datos de privilegios en la memoria, la declaración de privilegios de vaciado se puede utilizar para reconstruir los datos de la memoria para alcanzar un estado consistente.

Esta inconsistencia a menudo es causada por operaciones irregulares, como el uso directo de declaraciones DML para operar la tabla de permisos, lo que hace que los datos de permisos en la tabla de datos sean inconsistentes con los datos de permisos en la memoria.

Además, al utilizar la declaración de concesión para conceder la autorización, a menudo verá esta forma de escribir:
concesión super en *. * To'ua '@'% 'identificado por'pa';

Este comando agrega por 'contraseña' identificada. Además de la autorización, la lógica de la declaración también contiene:

  • Si el usuario'ua '@'% 'no existe, cree este usuario, la contraseña es pa;
  • Si el usuario ua ya existe, cambie la contraseña a pa.

 

Supongo que te gusta

Origin blog.csdn.net/qq_24436765/article/details/112767915
Recomendado
Clasificación