Una vez establecida una conexión, el servidor entra en el estado 2 del control de acceso. Por cada petición que viene en la conexión, el servidor determina que operación realizar, y entonces comprueba si tiene suficientes privilegios para hacerlo. Aquí es donde las columnas de privilegios de las tablas grant entran en juego. Esots privilegios puede venir de cualquiera de las tablas
user, db, host, tables_priv, o columns_priv.(Puede encontrar útil consultar Sección 5.6.2, “Cómo funciona el sistema de privilegios”, que enumera las columnas presentes en cada una de las tablas grant.)
La tabla
user otorga privilegios que se asignan de manera global, y que se aplican sin importar sobre qué base de datos trabajamos. Por ejemplo, si la tabla user le otorga el privilegio DELETE, usted podrá borrar registros de cualquier tabla en cualquier base de datos en todo el servidor. En otras palabras, los privilegios de la tabla userson privilegios de superusuario. Es aconsejable otorgar privilegios en la tabla user sólo a superusuarios tales como administradores de base de datos. Para otros usuarios, debería dejar los privilegios de la tabla user con el valor 'N' y otorgar los privilegios únicamente a niveles más específicos. Puede otorgar privilegios para bases de datos, tablas o columnas particulares.
Las tablas
db y host otorgan privilegios específicos para una base de datos. Los valores en las columnas de estas tablas pueden tener los siguientes formatos:- Los caracteres comodín '
%' y '_' pueden utilizarse en las columnasDbde cualquiera de las tablas. Estos tienen el mismo significado que en las operaciones de reconocimiento de patrones efectuadas con el operadorLIKE. Si quiere utilizar cualquiera de estos caracteres literales al otorgar privilegios, debe incluirlos en una secuencia de escape con una barra invertida. Por ejemplo, para incluir el carácter '_' como parte del nombre de una base de datos, especifíquelo como '\_' en la sentenciaGRANT. - Un valor de
'%'en la columnaHostde la tabladbsignifica ``cualquier host.'' Un valor vacío en la columnaHostde la tabladbsignifica ``consulta la tablahostpara más información'' (un proceso que se describe más adelante en esta sección). - Un valor de
'%'o en blanco en la columnaHostde la tablahostsignifica ``cualquier host.'' - Un valor de
'%'o en blanco de la columnaDben cualquiera de las dos tablas, significa ``cualquier base de datos.'' - Un valor en blanco de la columna
Useren cualquiera de las tablas concuerda con el usuario anónimo.
El servidor lee y ordena las tablas
db y host al mismo tiempo que lee la tabla user. El servidor ordena la tabla dbbasándose en el rango de las columnas Host, Db y User, y ordena la tabla host basándose en el rango de las columnas Host y Db. Igual que con la tabla user, la ordenación coloca los valores menos específicos en última posición, y cuando el servidor busca correspondencias, utiliza la primera que encuentra.
Las tablas
tables_priv y columns_priv otorgan privilegios específicos para tablas y columnas respectivamente. Los valores en las columnas de rango de estas tablas pueden tener los siguientes formatos:- Los caracteres comodín '
%' y '_' pueden ser utilizados en la columnaHostde cualquiera de las tablas. Estos comodines tienen el mismo significado que en las operaciones de búsqueda de patrones realizadas con el operadorLIKE. - Un valor de
'%'o vacío en la columnaHostde cualquiera de las tablas significa ``cualquier host.'' - Las columnas
Db,Table_nameyColumn_nameno pueden contener caracteres comodín ni estar en blanco en ninguna de las tablas.
El servidor ordena las tablas
tables_priv y columns_priv basándose en las columnas Host, Db, y User. Esto es similar a la ordenación de la tabla db, pero más simple, porque únicamente la columna Host puede contener comodines.
El proceso de verificación de peticiones se describe aquí. (Si usted está familirizado con el código fuente de control de acceso, se dará cuenta de que la descripción aquí contenida difiere ligeramente de el algoritmo utilizado en el código. La descripción es equivalente a lo que el código hace realmente; solo difiere para hacer la explicación más simple.)
Para peticiones que requieran privilegios de administrador, como
SHUTDOWN o RELOAD, el servidor comprueba únicamente el registro de la tabla user porque es la única tabla que especifica los privilegios administrativos. El acceso se otorga si el registro permita la operación demandada, y es denegado en caso contrario. Por ejemplo, si usted quisiera ejecutar mysqladmin shutdown, pero su registro de la tabla user no le otorga el privilegioSHUTDOWN, el servidor deniega el acceso sin ni siquiera codnsultar las tablas db o host. (No contienen ninguna columna Shutdown_priv, así que no hay necesidad de hacerlo.)
Para peticiones sobre bases de datos (
INSERT, UPDATE, etc.), el servidor primero comprueba los privilegios globales del usuario (superuser) mirando el registro de la tabla user. Si el registro permite la operación demandada, se otorga el acceso. Si los privilegios globales de la tabla user son insuficientes, el servidor determina los privilegios específicos sobre la base de datos comprobando las tablas db y host:- El servidor busca en la tabla
dbuna concordancia en las columnasHost,DbyUser. Las columnasHostyUserse hacen concordar con el nombre de host y de usuario MySQL. La columnaDbse hace concordar con la base de datos a la que el usuario quiere acceder. Si no hay ningún registro paraHostyUser, se deniega el acceso. - Si hay un registro que concuerda en el registro de la tabla
dby su columnaHostno está vacía, ese registro define los privilegios específicos del usuario en la base de datos. - Si la columna
Hostdel registro concordante de la tabladbse encuentra vacía, significa que la tablahostsenumera qué hosts pueden tener acceso a la base de datos. En este caso, una comprobación más se realiza en la tablahostpara encontrar una concordancia en las columnasHostyDb. Si ningún registro de la tablahostconcuerda, se deniega el acceso. Si hay una concordancia, los privilegios específicios sobre la base de datos del usuario son calculados como la intersección (¡no unión!) de los privilegios en los registros de las tablasdbyhost; es decir, los privilegios que tienen valor'Y'en ambos registros. (De esta manera puede otorgar privilegios en el registro de la tabladby entonces restringir selectivamente host a host utilizando los registros de la tablahosts.)
Tras determinar los privilegios específicos de la base de datos otorgados por los registros de las tablas
db yhost, el servidor los añade a los privilegios globales otorgados por la tabla user. Si el resultado permite la operación demandada, se otorga el acceso. En caso contrario, el servidor comprueba sucesivamente la tabla del usuario y los privilegios de las columnas en las tablas tables_priv y columns_priv, los añade a los privilegios del usuario, y permite o deniega el acceso basándose en el resultado.
Expresado en términos booleanos, la descripción precedente de como se calculan los privilegios de un usuario, se puede resumir en:
privilegios globalesO (privilegios de base de datos Y privilegios de host)O privilegios de tablaaO privilegios de colum n
Puede no ser evidente por qué, si los privilegios globales del registro en la tabla
user no han sido inicialmente suficientes para la operación demandada, el servidor añado estos privilegios a los de base de datos, tabla y columna más tarde. La razón es que una petición puede requerir más de un tipo de privilegio. Por ejemplo, si usted ejecuta una sentencia INSERT INTO ... SELECT, necesita tanto el privilegio INSERT como el privilegioSELECT. Sus privilegios podrían estar configurados de manera que la tabla user otorgue un privilegio, y la tabladb otorgue el otro. En este caso, necesita ambos privilegios para realizar la sentencia, pero el servidor no puede saberlo desde cada una de las tablas únicamente; los privilegios otorgados por los registros de ambas tablas deben ser combinados.
La tabla
host no es afectada por sentencias GRANT o REVOKE, así que en la mayoría de las instalaciones MySQL queda sin utilizar. Si usted la modifica directamente, puede utilizarla para algunos propósitos específicos, como mantener una lista de servidores seguros. Por ejemplo, en TcX, la tabla host contiene una lista de todas las máquinas en la red local. Éstas tienen otorgados todos los privilegios.
También puede utilizar la tabla
host para indicar hosts que no son seguros. Supongamos que tiene una máquinapublic.su.dominio que está situada en un lugar público que no considera seguro. Puede permitir el acceso a todos los hosts de su red excepto a esa máquina utilizando registros de la tabla host como este:+--------------------+----+-| Host | Db | ...+--------------------+----+-.. (all privileges set to 'N') | %.your.domain | % || public.your.domain | % | .... (all privileges set to 'Y')+--------------------+----+-
Nauturalmente, usted debe siempre comprobar sus entradas en las tablas grant (por ejemplo, utilizando
SHOW GRANTS o mysqlaccess) para estar seguro de que sus privilegios de acceso son realmente los que piensa que son.
Fuente:enlace

No hay comentarios:
Publicar un comentario