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 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
Host
de 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
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 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 Db
,
Table_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
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 privilegio
SHUTDOWN
, 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 columnas Host
,
Db
y User
. Las
columnas Host
y User
se 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.
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.
Si la columna Host
del registro
concordante de la tabla db
se encuentra
vacía, significa que la tabla hosts
enumera 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
host
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 tablas
db
y host
; 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 tabla hosts
.)
Tras determinar los privilegios específicos de la base de datos
otorgados por los registros de las tablas db
y host
, 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 O privilegios de columna
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
privilegio SELECT
. Sus privilegios podrían
estar configurados de manera que la tabla
user
otorgue un privilegio, y la tabla
db
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áquina
public.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 | ... +--------------------+----+- | public.your.domain | % | ... (all privileges set to 'N') | %.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.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.