El sistema de privilegios de MySQL asegura que todos los usuarios pueden ejecutar sólo la operación permitida a los mismos. Como cuando un usuario se 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
SELECTpara la tabla o el permisoDROPpara 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 yREVOKE 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
usercon los valoresHostyUserde'thomas.loc.gov'y'bob'se usarían para autenticar conexiones hechas al servidor desde el equipothomas.loc.govpor un cliente que especifique un nombre de usuario debob. De forma similar, un registro de la tabladbcon las columnasHost,User, yDbcon valores'thomas.loc.gov','bob'y'reports'se usaría cuandobobconectase desde el equipothomas.loc.govpara acceder a la base de datosreports. Las tablastables_privycolumns_privcontienen columnas de alcance indicando tablas o combinaciones de tabla/columna para las que cada registro se aplica. La columna de alcanceprocs_privindica 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 comoENUM('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
userdeterminan si se rechazan o permiten conexiones entrantes. Para conexiones permitidas, cualquier privilegio otorgado en la tablauserindica 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
dbdeterminan 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
hostse usa en conjunción con la tabladbcuando desea que un registro de la tabladbse 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 valorHostvacío en el registro de usuario de la tabladb, luego rellene la tablahostcon un registro para cada uno de estos equipos. Este mecanismo se describe con mayor detalle enSección 5.6.6, “Control de acceso, nivel 2: comprobación de solicitudes”.Nota: La tablahostno se ve afectada por los comandosGRANTniREVOKE. La mayoría de instalaciones MySQSL no necesitan usar esta tabla en absoluto. - Las tablas
tables_privycolumns_privson similares a la tabladb, 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_privse 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 enSecció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 depc84.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 quemysqlaccess 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”.
Fuente:enlace

No hay comentarios:
Publicar un comentario