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 user
son 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 columnasDb
de 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 columnaHost
de la tabladb
significa ``cualquier host.'' Un valor vacío en la columnaHost
de la tabladb
significa ``consulta la tablahost
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 columnaHost
de la tablahost
significa ``cualquier host.'' - Un valor de
'%'
o en blanco de la columnaDb
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 db
basá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 columnaHost
de 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 columnaHost
de cualquiera de las tablas significa ``cualquier host.'' - Las columnas
Db
,Table_name
yColumn_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 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
db
una concordancia en las columnasHost
,Db
yUser
. Las columnasHost
yUser
se hacen concordar con el nombre de host y de usuario MySQL. La columnaDb
se hace concordar con la base de datos a la que el usuario quiere acceder. Si no hay ningún registro paraHost
yUser
, se deniega el acceso. - Si hay un registro que concuerda en el registro de la tabla
db
y su columnaHost
no está vacía, ese registro define los privilegios específicos del usuario en la base de datos. - Si la columna
Host
del registro concordante de la tabladb
se encuentra vacía, significa que la tablahosts
enumera qué hosts pueden tener acceso a la base de datos. En este caso, una comprobación más se realiza en la tablahost
para encontrar una concordancia en las columnasHost
yDb
. Si ningún registro de la tablahost
concuerda, 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 tablasdb
yhost
; es decir, los privilegios que tienen valor'Y'
en ambos registros. (De esta manera puede otorgar privilegios en el registro de la tabladb
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 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