El sistema de privilegios de MySQL asegura que todos los usuarios pueden ejecutar sólo la operación permitida a los mismos. Como usuario, cuando conecta a un servidor MySQL, su identidad se determina mediante el equipo desde el que se conecta y el nombre de usuario que especifique. Cuando efectúe peticiones tras conectar, el sistema le otorga privilegios acorde a su identidad y lo que quiera hacer.
MySQL considera tanto su nombre de usuario y su equipo a la hora
de identificarle, ya que no hay razón para asumir que un nombre
de usuario pertenece a la misma persona en cualquier sitio de
Internet. Por ejemplo, el usuario joe
que
conecta desde office.com
no tiene porqué ser
la misma persona que el usuario joe
que
conecta desde elsewhere.com
. MySQL trata esto
permitiendole distinguir usuarios en diferentes equipos que
tienen el mismo nombre. Puede otorgar un conjunto de privilegios
para conexiones de joe
desde
office.com
, y un conjunto distinto para
conexiones de joe
desde
elsewhere.com
.
El control de acceso de MySQL implica dos etapas:
Etapa 1: El servidor comprueba si debe permitirle conectarse.
Etapa 2: Asumiendo que se conecta, el servidor comprueba
cada comando que ejecuta para ver si tiene suficientes
permisos para hacerlo. Por ejemplo, si intenta seleccionar
registros de una tabla en una base de datos o eliminar una
tabla de la base de datos, el servidor verifica que tenga el
permiso SELECT
para la tabla o el permiso
DROP
para la base de datos.
Si sus permisos cambian (por usted mismo o alguien distinto) mientras está conectado, estos cambios no tienen porqué tener efecto inmediatamente para el siguiente comando que ejecute. Consulte Sección 5.6.7, “Cuándo tienen efecto los camios de privilegios” para más detalles.
El servidor guarda información de privilegios en las tablas de
permisos de la base de datos mysql
(esto es,
en la base de datos llamada mysql
). El
servidor MySQL lee el contenido de dichas tablas en memoria
cuando arranca y las vuelve a leer bajo las circunstancias
indicadas en Sección 5.6.7, “Cuándo tienen efecto los camios de privilegios”. Las decisiones
acerca de control de acceso se basan en las copias en memoria de
las tablas de permisos.
Normalmente, manipula los contenidos de las tablas de permisos
indirectamente usando los comandos GRANT
y
REVOKE
para configurar cuentas y controlar
los privilegios disponibles para cada una. Consulte
Sección 13.5.1.3, “Sintaxis de GRANT
y REVOKE
”. La discusión aquí describe la
estructura subyacente de las tablas de permisos y cómo el
servidor usa sus contenidos cuando interactúa con clientes.
El servidor usa las tablas user
,
db
, y host
en la base de
datos mysql
en ambas etapas de control de
acceso. Las columnas en estas tablas de permisos se muestran a
continuación:
Nombre tabla | user | db | host |
Alcance columnas | Host |
Host |
Host |
User |
Db |
Db |
|
Password |
User |
||
Columnas privilegios | Select_priv |
Select_priv |
Select_priv |
Insert_priv |
Insert_priv |
Insert_priv |
|
Update_priv |
Update_priv |
Update_priv |
|
Delete_priv |
Delete_priv |
Delete_priv |
|
Index_priv |
Index_priv |
Index_priv |
|
Alter_priv |
Alter_priv |
Alter_priv |
|
Create_priv |
Create_priv |
Create_priv |
|
Drop_priv |
Drop_priv |
Drop_priv |
|
Grant_priv |
Grant_priv |
Grant_priv |
|
Create_view_priv |
Create_view_priv |
Create_view_priv |
|
Show_view_priv |
Show_view_priv |
Show_view_priv |
|
Create_routine_priv |
Create_routine_priv |
||
Alter_routine_priv |
Alter_routine_priv |
||
References_priv |
References_priv |
References_priv |
|
Reload_priv |
|||
Shutdown_priv |
|||
Process_priv |
|||
File_priv |
|||
Show_db_priv |
|||
Super_priv |
|||
Create_tmp_table_priv |
Create_tmp_table_priv |
Create_tmp_table_priv |
|
Lock_tables_priv |
Lock_tables_priv |
Lock_tables_priv |
|
Execute_priv |
|||
Repl_slave_priv |
|||
Repl_client_priv |
|||
Columnas seguridad | ssl_type |
||
ssl_cipher |
|||
x509_issuer |
|||
x509_subject |
|||
Columnas recursos control | max_questions |
||
max_updates |
|||
max_connections |
|||
max_user_connections |
Execute_priv
se presentó en MySQL 5.0.0,
pero no fue operacional hasta MySQL 5.0.3.
Las columnas Create_view_priv
y
Show_view_priv
se añadieron en MySQL 5.0.1.
Las columnas Create_routine_priv
,
Alter_routine_priv
, y
max_user_connections
se añadieron en MySQL
5.0.3.
Durante la segunda etapa de control de acceso, el servidor
efectúa una verificación de petición para asegurar que cada
cliente tiene suficientes privilegios para cada petición que
recibe. Adicionalmente las tablas de permisos
user
, db
, y
host
, el servidor puede consultar las tablas
tables_priv
y columns_priv
para peticiones que impliquen tablas. Las tablas
tables_priv
y columns_priv
proveen de un control de privilegios más fino a nivel de tabla
y columna. Tienen las siguientes columnas:
Nombre tabla | tables_priv | columns_priv |
Alcance de columnas | Host |
Host |
Db |
Db |
|
User |
User |
|
Table_name |
Table_name |
|
Column_name |
||
Columnas privilegios | Table_priv |
Column_priv |
Column_priv |
||
Otras columnas | Timestamp |
Timestamp |
Grantor |
Las columnas Timestamp
y
Grantor
actualmente no se usan y no se
discuten más en esta sección.
Para verificación de peticiones que impliquen rutinas
almacenadas, el servidor puede consultar la tabla
procs_priv
. Esta tabla tiene las siguientes
columnas:
Nombre tabla | procs_priv |
Alcance de columnas | Host |
Db |
|
User |
|
Routine_name |
|
Routine_type |
|
Columnas privilegios | Proc_priv |
Otras columnas | Timestamp |
Grantor |
La tabla procs_priv
existe desde MySQL 5.0.3.
La columna Routine_type
se añadió en MySQL
5.0.6. Hay una columna ENUM
con valores de
'FUNCTION'
o 'PROCEDURE'
para indicar el tipo de rutina a que se refiere el registro.
Esta columna permite que los privilegios se otorgen
separadamente para una función y para un procedimiento con el
mismo nombre.
Las columnas Timestamp
y
Grantor
no se usan actualmente y no se
discuten más aquí.
Cada tabla de permisos contiene columnas de alcance y columnas de privilegios:
Las columnas de alcance determinan el alcance de cada
entrada (registro) en las tablas; esto es, el contexto en
que el registro se aplica. Por ejemplo, un registro de la
tabla user
con los valores
Host
y User
de
'thomas.loc.gov'
y
'bob'
se usarían para autenticar
conexiones hechas al servidor desde el equipo
thomas.loc.gov
por un cliente que
especifique un nombre de usuario de bob
.
De forma similar, un registro de la tabla
db
con las columnas
Host
, User
, y
Db
con valores
'thomas.loc.gov'
,
'bob'
y 'reports'
se
usaría cuando bob
conectase desde el
equipo thomas.loc.gov
para acceder a la
base de datos reports
. Las tablas
tables_priv
y
columns_priv
contienen columnas de
alcance indicando tablas o combinaciones de tabla/columna
para las que cada registro se aplica. La columna de alcance
procs_priv
indica la rutina de
almacenamiento que se aplica a cada registro.
Las columnas de privilegios indican qué privilegios se otorgan a un registro de la tabla; esto es, qué operaciones pueden ejecutarse. El servidor combina la información de diversas tablas de permisos para tener una descripción completa de los permisos de un usuario. Las reglas usadas para ello se describen en Sección 5.6.6, “Control de acceso, nivel 2: comprobación de solicitudes”.
Las columnas de alcance contienen cadenas de caracteres. Se declaran tal y como se muestra a continuación; el valor por defecto es la cadena de caracteres vacía:
Nombre de columna | Tipo |
Host |
CHAR(60) |
User |
CHAR(16) |
Password |
CHAR(16) |
Db |
CHAR(64) |
Table_name |
CHAR(64) |
Column_name |
CHAR(64) |
Routine_name |
CHAR(64) |
Con propósito de chequeos de acceso, las comparaciones de los
valores de Host
no tienen en cuenta
mayúsculas y minúsculas. Los valores de
User
, Password
,
Db
, y Table_name
son
sensibles a mayúsculas y minúsuclas. Los valores de
Column_name
no son sensibles a mayúsculas y
minúsculas.
En las tablas user
, db
, y
host
, cada privilegio se lista en una
columna separada que se declara como ENUM('N','Y')
DEFAULT 'N'
. En otras palabras, cada privilegio puede
estar desactivado o activado, estando desactivados por defecto.
En las tablas tables_priv
,
columns_priv
, and
procs_priv
, las columnas de privilegios se
declaran como columnas de tipo SET
. Los
valores en estas columnas pueden contener cualquier combinación
de los privilegios controlados por la tabla:
Nombre de tabla | Nombre de columna | Posible conjunto de elementos |
tables_priv |
Table_priv |
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop',
'Grant', 'References', 'Index', 'Alter' |
tables_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
columns_priv |
Column_priv |
'Select', 'Insert', 'Update', 'References' |
procs_priv |
Proc_priv |
'Execute', 'Alter Routine', 'Grant' |
Brevemente, el servidor usa las tablas de permisos como sigue:
Las columnas de alcance de la tabla user
determinan si se rechazan o permiten conexiones entrantes.
Para conexiones permitidas, cualquier privilegio otorgado en
la tabla user
indica los privilegios
globales del usuario (superusuario). Estos privilegios se
aplican a todas las bases de datos en
el servidor.
Las columnas de alcance de la tabla db
determinan qué usuarios pueden acceder a qué bases de
datos desde qué equipo. La columna de privilegios determina
qué operaciones se permiten. Un privilegio otorgado a nivel
de base de datos se aplica a la base de datos y a todas sus
tablas.
La tabla host
se usa en conjunción con
la tabla db
cuando desea que un registro
de la tabla db
se aplique a varios
equipos. Por ejemplo, si queiere que un usuario sea capaz de
usar una base de datos desde varios equipos en su red, deje
el valor Host
vacío en el registro de
usuario de la tabladb
, luego rellene la
tabla host
con un registro para cada uno
de estos equipos. Este mecanismo se describe con mayor
detalle en Sección 5.6.6, “Control de acceso, nivel 2: comprobación de solicitudes”.
Nota: La tabla
host
no se ve afectada por los comandos
GRANT
ni REVOKE
. La
mayoría de instalaciones MySQSL no necesitan usar esta
tabla en absoluto.
Las tablas tables_priv
y
columns_priv
son similares a la tabla
db
, pero son más detalladas: se aplican
a nivel de tabla y de columna en lugar de a nivel de base de
datos. Un privilegio otorgado a nivel de tabla se aplica a
la tabla y a todas sus columnas. Un privilegio otorgado a
nivel de columna se aplica sólo a la columna especificada.
La tabla procs_priv
se aplica a rutinas
almacenadas. Un privilegio otorgado a nivel de rutina se
aplica sólo a una única rutina.
Permisos administrativos (tales como RELOAD
o
SHUTDOWN
) se especifican sólo en la tabla
user
. Esto es debido a que las operaciones
administrativas son operaciones del propio servidor y no
específicas de bases de datos, así que no hay ninguna razón
para listar estos privilegios en las otras tablas de permisos.
De hecho, para determinar si puede realizar una operación
administrativa, el servidor sólo necesita consultar la tabla
user
.
El privilegio FILE
también se especifica
sólo en la tabla user
. No es un privilegio
administrativo como tal, pero la habilidad de leer o escribir
archivos en el equipo servidor es independiente de las bases de
datos a las que acceda.
El servidor mysqld lee los contenidos de las
tablas de permisos en memoria cuando arranca. Puede decirle que
las vuelva a leer mediante el comando FLUSH
PRIVILEGES
o ejecutando los comandos
mysqladmin flush-privileges o
mysqladmin reload . Los cambios en las tablas
de permisos tienen efecto como se indica en
Sección 5.6.7, “Cuándo tienen efecto los camios de privilegios”.
Cuando modifica los contenidos de las tablas de permisos, es una
buena idea asegurarse que sus cambios configuran permisos tal y
como desea. Para consultar los permisos de una cuenta dada, use
el comando SHOW GRANTS
. Por ejemplo, para
determinar los permisos que se otorgan a una cuenta con valores
Host
y User
de
pc84.example.com
y bob
,
use este comando:
mysql> SHOW GRANTS FOR 'bob'@'pc84.example.com';
Una herramienta de diagnóstico útil es el script
mysqlaccess , proporcionado por Yves Carlier
para la distribución MySQL. Invoque
mysqlaccess con la opción
--help
para ver cómo funciona. Note que
mysqlaccess chequea acceso usando sólo las
tablas user
, db
, y
host
. No chequea los privilegios de tabla,
columna, o rutina especificados en las tablas
tables_priv
, columns_priv
,
o procs_priv
.
Para ayuda adicional en problemas relacionados con el
diagnóstico de permisos, consulte
Sección 5.6.8, “Causas de errores Access denied
”. Para consejos generales sobre
seguridad , consulte Sección 5.5, “Cuestiones de seguridad general”.
É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.