jueves, 6 de marzo de 2014

comprobación de solicitudes Mysql


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 userdbhosttables_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 columnas Db de cualquiera de las tablas. Estos tienen el mismo significado que en las operaciones de reconocimiento de patrones efectuadas con el operador LIKE. 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 sentencia GRANT.
  • Un valor de '%' en la columna Host de la tabla db significa ``cualquier host.'' Un valor vacío en la columna Hostde la tabla db significa ``consulta la tabla host para más información'' (un proceso que se describe más adelante en esta sección).
  • Un valor de '%' o en blanco en la columna Host de la tabla host significa ``cualquier host.''
  • Un valor de '%' o en blanco de la columna Db en cualquiera de las dos tablas, significa ``cualquier base de datos.''
  • Un valor en blanco de la columna User en 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 HostDb 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 columna Host de cualquiera de las tablas. Estos comodines tienen el mismo significado que en las operaciones de búsqueda de patrones realizadas con el operador LIKE.
  • Un valor de '%' o vacío en la columna Host de cualquiera de las tablas significa ``cualquier host.''
  • Las columnas DbTable_name y Column_name no 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 HostDb, 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 (INSERTUPDATE, 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:
  1. El servidor busca en la tabla db una concordancia en las columnas HostDb y User. Las columnas Host y Userse hacen concordar con el nombre de host y de usuario MySQL. La columna Db se hace concordar con la base de datos a la que el usuario quiere acceder. Si no hay ningún registro para Host y User, se deniega el acceso.
  2. Si hay un registro que concuerda en el registro de la tabla db y su columna Host no está vacía, ese registro define los privilegios específicos del usuario en la base de datos.
  3. Si la columna Host del registro concordante de la tabla db se encuentra vacía, significa que la tabla hostsenumera qué hosts pueden tener acceso a la base de datos. En este caso, una comprobación más se realiza en la tabla host para encontrar una concordancia en las columnas Host y Db. Si ningún registro de la tabla hostconcuerda, 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 tablas db yhost; es decir, los privilegios que tienen valor 'Y' en ambos registros. (De esta manera puede otorgar privilegios en el registro de la tabla db y 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 globales
O (privilegios de base de datos Y privilegios de host)
O privilegios de tabla
a
O 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

Entradas populares