DAM - DAW - MP 0484 Bases de Dades - NF5
Pràctica Gestió d'usuaris, permisos i rols
Cal que responguis el que es demana en cadascun dels exercicis següents, copiant quan sigui el cas, la comanda o comandes SQL adequades. Per facilitar la correcció, respon de forma clara i concisa a les preguntes plantejades, afegint el codi SQL demanat. A ser possible divideix les comandes en les línies necessàries i les tabulacions adients per fer més entenedora la comanda.
-
Inicia sessió amb un usuari que tingui permisos d’administrador (root) i crea una nova base de dades anomenada
AdminPRAC.Mostra la llista de bases de dades creades.
Possible solució
mysql -u rootCREATE DATABASE adminprac; show databases; -
Amb la comanda
SHOW CREATE DATABASEmostra com es podria tornar a crear la base de dades (fixa't amb elCHARACTER SET).Possible solució
SHOW CREATE DATABASE adminprac;CREATE DATABASE `adminprac` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ -
Crea un nou usuari anomenat
usurpamb passwordusurpper un accés des de la pròpia màquina (localhost).Possible solució
CREATE USER usurp@localhost IDENTIFIED BY 'usurp'; -
Prova de connectar-te amb l’usuari
usurpa la base de dades AdminPRAC, ho pots fer? Perquè?Possible solució
mysql -u usurp -pusurp adminpracNo, ja que no té permisos sobre la base de dades adminprac.
Sí podem entrar sense indicar cap base de dades
mysql -u usurp -pusurp. -
Pots arreglar-ho? Escriu la sentència SQL necessària.
Possible solució
Cal iniciar sessió al mysql amb l'usuari root
mysql -u rootI donar permisos a l'usuari usurp sobre la base
adminprac. Donarem els mínims permisos, de momentSELECTsobre totes les taules possibles.GRANT SELECT ON adminprac.* TO usurp@localhost; -
Crea ara un nou usuari anomenat usurp2 amb password usurp2.
Possible solució
CREATE USER usurp2@localhost IDENTIFIED BY 'usurp2'; -
Estem en disposició de treballar amb la BD fent servir aquest nou usuari? En cas contrari esmena l’error; però que només pugui fer SELECT.
Possible solució
No. Cal iniciar sessió al mysql amb l'usuari root
mysql -u rootI donar permisos a l'usuari usurp2 sobre la base
adminprac. Donarem els mínims permisos, de momentSELECTsobre totes les taules possibles.GRANT SELECT ON adminprac.* TO usurp2@localhost; -
Surt de la connexió i entra amb l'usuari usurp, crea la taula
Alumnes(id_alumne INT(11) PRIMARY KEY AUTO_INCREMENT, nom_alumne VARCHAR(50) NOT NULL, data_naix DATE NULL)Comenta el resultat. Ha anat bé? Quin permís creus que té o necessita per a poder crear la taula? (Executa, amb l’usuari, la comanda
SHOW GRANTS)Possible solució
No. Només li haviem donatpermís de
SELECT. Per a poder crear taules necessita el permísCREATE. Anema donar-li els permisos necessaris,mysql -u rootGRANT CREATE ON adminprac.* TO usurp@localhost;Ja podem, anem a fer-ho.
mysql -u usurp -pusurp adminpracSHOW GRANTS; CREATE TABLE Alumnes( id_alumne INT(11) PRIMARY KEY AUTO_INCREMENT, nom_alumne VARCHAR(50) NOT NULL, data_naix DATE NULL);+--------------------------------------------------------------------------------------------------------------+ | Grants for usurp@localhost | +--------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `usurp`@`localhost` IDENTIFIED BY PASSWORD '*9720552CBE549897CDD6D892AA74B32897E054F0' | | GRANT SELECT, CREATE ON `adminprac`.* TO `usurp`@`localhost` +--------------------------------------------------------------------------------------------------------------+ -
Si cal, torna a entrar com a administrador i atorga-li a usurp els privilegis suficients per crear noves taules i vistes.
Possible solució
Ja ho hem fet a l'exercic anterior com usuari root amb la comanda
GRANT CREATEmysql -u rootGRANT CREATE ON adminprac.* TO usurp@localhost; -
Torna a entrar amb l'usuari usurp i prova de crear la taula Alumnes(id_alumne INT(11) PRIMARY KEY AUTO_INCREMENT, nom_alumne VARCHAR(50) NOT NULL, data_naix DATE NULL). Tot bé?
Possible solució
Ja ho hem fet a l'exercici 8.
mysql -u usurp -pusurp adminpracCREATE TABLE Alumnes( id_alumne INT(11) PRIMARY KEY AUTO_INCREMENT, nom_alumne VARCHAR(50) NOT NULL, data_naix DATE NULL); -
Pot aquest usuari treballar amb la taula Alumnes? Ens deixa? Perquè?
Possible solució
A l'haver-li donat permisos de
CREATE, pot crear taules però no pot treballar amb elles. Li donarem permís per fer el que vulgui a la base de dade, que és el que acostumem a fer. Sí pot ferSELECTja que li haviem donat aquest permís.ERROR 1142 (42000): INSERT command denied to user 'usurp'@'localhost' for table 'alumnes' ERROR 1142 (42000): UPDATE command denied to user 'usurp'@'localhost' for table 'alumnes' ERROR 1142 (42000): DELETE command denied to user 'usurp'@'localhost' for table 'alumnes'mysql -u rootGRANT ALL PRIVILEGES ON adminprac.* TO usurp@localhost; -
Insereix un parell de registres (inventa’t les dades) a la taula Alumnes. Ha anat tot bé? En cas contrari esmena l’error.
Possible solució
Sí, ja li hem donat permís.
INSERT INTO Alumnes VALUES(NULL, 'Maria', CURRENT_DATE - INTERVAL 18 YEAR + INTERVAL 7 DAY); INSERT INTO Alumnes VALUES(NULL, 'Pere', CURRENT_DATE - INTERVAL 18 YEAR + INTERVAL 17 WEEK); -
Fes una consulta simple per mostrar totes les dades de la taula Alumnes.
Possible solució
SELECT * FROM Alumnes; -
Surt de la connexió i entra amb l'usuari usurp2, pot aquest usuari treballar amb la taula Alumnes? Perquè?
Possible solució
Sí ja que li haviem donat permís de
SELECTsobre tots els objectes de la base adminprac -
Si no fos possible fer
SELECTs l'usuari usurp2, surt de la connexió i dóna-li, a usurp2, els privilegis necessaris perquè el pugui consultar les dades de la taulaadminprac.Alumnes.Possible solució
Ja té permís, si no en tingués li podem donar permís només a la taula Alumnes o bé a totes les taules de la base.
Permís de SELECT per la taula Alumnes de la base adminpracGRANT SELECT ON adminprac.Alumnes TO usurp2@localhost;o bé
Permís de SELECT per tots els objectes de la base adminpracGRANT SELECT ON adminprac.* TO usurp2@localhost; -
Torna a entrar com a usurp2 i prova visualitzar la informació de la taula adminprac.Alumnes.
Possible solució
Sí, ara ja podem fer
SELECTsobre la taula Alumnes.mysql -u usurp2 -pusurp2 adminpracSELECT * FROM Alumnes; -
Pot l’usuari usurp2 modificar o afegir dades a la taula Alumnes?
Possible solució
No, només pot fer
SELECT. -
Dóna-li ara la possibilitat de modificar alumnes però només sobre els camps que no són clau primària d’aquesta taula.
Possible solució
mysql -u rootGRANT UPDATE(nom_alumne, data_naix) ON adminprac.Alumnes TO usurp2@localhost; -
Comprova que l’usuari usurp2 pot, per exemple, canviar el nom d’un alumne.
Possible solució
mysql -u usurp2 -pusurp2 adminpracUPDATE Alumnes SET nom_alumne = 'Peret' WHERE nom_alumne = 'Pere'; -
Pot aquest usuari modificar el camp id_alumne? Proveu-ho i comenteu-ne el resultat?
Possible solució
No, ja que no li hem donat permís de
UPDATEsobre aquest camp.UPDATE Alumne SET id_alumne = 10 WHERE id_alumne = 1; ERROR 1142 (42000): UPDATE command denied to user 'usurp2'@'localhost' for table 'alumne' -
Entra ara amb un usuari administrador i executa les consultes següents:
SELECT * FROM information_schema.applicable_roles; SELECT * FROM information_schema.schema_privileges WHERE GRANTEE LIKE '_usurp%'; SELECT * FROM information_schema.user_privileges WHERE GRANTEE LIKE '_usurp%'; SELECT * FROM information_schema.table_privileges WHERE GRANTEE LIKE '_usurp%'; SELECT * FROM information_schema.column_privileges WHERE GRANTEE LIKE '_usurp%';Possible solució
La primera consulta, sobre
information_schema.applicable_rolesés possible que surti buida.SELECT * FROM information_schema.applicable_roles; +----------------+------------+--------------+------------+ | GRANTEE | ROLE_NAME | IS_GRANTABLE | IS_DEFAULT | +----------------+------------+--------------+------------+ | root@localhost | periodista | YES | NO | +----------------+------------+--------------+------------+ 1 row in set (0.001 sec) SELECT * FROM information_schema.schema_privileges WHERE GRANTEE LIKE '_usurp%'; +----------------------+---------------+--------------+-------------------------+--------------+ | GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE | +----------------------+---------------+--------------+-------------------------+--------------+ | 'usurp'@'localhost' | def | adminprac | SELECT | NO | | 'usurp'@'localhost' | def | adminprac | INSERT | NO | | 'usurp'@'localhost' | def | adminprac | UPDATE | NO | | 'usurp'@'localhost' | def | adminprac | DELETE | NO | | 'usurp'@'localhost' | def | adminprac | CREATE | NO | | 'usurp'@'localhost' | def | adminprac | DROP | NO | | 'usurp'@'localhost' | def | adminprac | REFERENCES | NO | | 'usurp'@'localhost' | def | adminprac | INDEX | NO | | 'usurp'@'localhost' | def | adminprac | ALTER | NO | | 'usurp'@'localhost' | def | adminprac | CREATE TEMPORARY TABLES | NO | | 'usurp'@'localhost' | def | adminprac | LOCK TABLES | NO | | 'usurp'@'localhost' | def | adminprac | EXECUTE | NO | | 'usurp'@'localhost' | def | adminprac | CREATE VIEW | NO | | 'usurp'@'localhost' | def | adminprac | SHOW VIEW | NO | | 'usurp'@'localhost' | def | adminprac | CREATE ROUTINE | NO | | 'usurp'@'localhost' | def | adminprac | ALTER ROUTINE | NO | | 'usurp'@'localhost' | def | adminprac | EVENT | NO | | 'usurp'@'localhost' | def | adminprac | TRIGGER | NO | | 'usurp'@'localhost' | def | adminprac | DELETE HISTORY | NO | | 'usurp2'@'localhost' | def | adminprac | SELECT | NO | +----------------------+---------------+--------------+-------------------------+--------------+ 20 rows in set (0.000 sec) SELECT * FROM information_schema.user_privileges WHERE GRANTEE LIKE '_usurp%'; +----------------------+---------------+----------------+--------------+ | GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE | +----------------------+---------------+----------------+--------------+ | 'usurp'@'localhost' | def | USAGE | NO | | 'usurp2'@'localhost' | def | USAGE | NO | +----------------------+---------------+----------------+--------------+ 2 rows in set (0.000 sec) SELECT * FROM information_schema.table_privileges WHERE GRANTEE LIKE '_usurp%'; Empty set (0.000 sec) SELECT * FROM information_schema.column_privileges WHERE GRANTEE LIKE '_usurp%'; +----------------------+---------------+--------------+------------+-------------+----------------+--------------+ | GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | PRIVILEGE_TYPE | IS_GRANTABLE | +----------------------+---------------+--------------+------------+-------------+----------------+--------------+ | 'usurp2'@'localhost' | def | adminprac | alumnes | data_naix | UPDATE | NO | | 'usurp2'@'localhost' | def | adminprac | alumnes | nom_alumne | UPDATE | NO | +----------------------+---------------+--------------+------------+-------------+----------------+--------------+ 2 rows in set (0.000 sec) -
Què diries que enregistren aquestes taules?
Possible solució
Els permisos que hem assignat als usuaris a tots nivells: Sobre totes les bases de dades (
user_privileges), sobre bases de dades concretes(schema_privileges), sobre taules concretes(table_privileges), sobre columnes concretes (column_privileges). A més, els rols creats al sistema (applicable_roles). -
Treu-li tots els permisos que l’usuari
usurp2tingui sobre la taula Alumnes, fent servir una sola comanda.Possible solució
REVOKE ALL PRIVILEGES ON adminprac.Alumnes FROM usurp2@localhost; -
Torna a executar les consultes anteriors, comenta’n el resultat?
Possible solució
Han desaparegut els permisos d'
UPDATEsobre els camps de la taula Alumnes. Si haguéssim donat el permís deSELECTsobre la taula Alumnes també hagués desaparegut.SELECT * FROM information_schema.applicable_roles; Empty set (0.000 sec) SELECT * FROM information_schema.schema_privileges WHERE GRANTEE LIKE '_usurp%'; +----------------------+---------------+--------------+-------------------------+--------------+ | GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE | +----------------------+---------------+--------------+-------------------------+--------------+ | 'usurp'@'localhost' | def | adminprac | SELECT | NO | | 'usurp'@'localhost' | def | adminprac | INSERT | NO | | 'usurp'@'localhost' | def | adminprac | UPDATE | NO | | 'usurp'@'localhost' | def | adminprac | DELETE | NO | | 'usurp'@'localhost' | def | adminprac | CREATE | NO | | 'usurp'@'localhost' | def | adminprac | DROP | NO | | 'usurp'@'localhost' | def | adminprac | REFERENCES | NO | | 'usurp'@'localhost' | def | adminprac | INDEX | NO | | 'usurp'@'localhost' | def | adminprac | ALTER | NO | | 'usurp'@'localhost' | def | adminprac | CREATE TEMPORARY TABLES | NO | | 'usurp'@'localhost' | def | adminprac | LOCK TABLES | NO | | 'usurp'@'localhost' | def | adminprac | EXECUTE | NO | | 'usurp'@'localhost' | def | adminprac | CREATE VIEW | NO | | 'usurp'@'localhost' | def | adminprac | SHOW VIEW | NO | | 'usurp'@'localhost' | def | adminprac | CREATE ROUTINE | NO | | 'usurp'@'localhost' | def | adminprac | ALTER ROUTINE | NO | | 'usurp'@'localhost' | def | adminprac | EVENT | NO | | 'usurp'@'localhost' | def | adminprac | TRIGGER | NO | | 'usurp'@'localhost' | def | adminprac | DELETE HISTORY | NO | | 'usurp2'@'localhost' | def | adminprac | SELECT | NO | +----------------------+---------------+--------------+-------------------------+--------------+ 20 rows in set (0.000 sec) SELECT * FROM information_schema.user_privileges WHERE GRANTEE LIKE '_usurp%'; +----------------------+---------------+----------------+--------------+ | GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE | +----------------------+---------------+----------------+--------------+ | 'usurp'@'localhost' | def | USAGE | NO | | 'usurp2'@'localhost' | def | USAGE | NO | +----------------------+---------------+----------------+--------------+ 2 rows in set (0.000 sec) SELECT * FROM information_schema.table_privileges WHERE GRANTEE LIKE '_usurp%'; Empty set (0.000 sec) SELECT * FROM information_schema.column_privileges WHERE GRANTEE LIKE '_usurp%'; Empty set (0.001 sec) -
Crea el rol GestorAlumnes. Ha anat tot bé? En cas contrari comenta-ho i esmena l’error.
Possible solució
Fent-ho com usuari root no hem de tenir cap problema.
CREATE ROLE GestorAlumnes; -
Dóna-li al nou rol permisos per alterar la taula
adminPRAC.Alumnes, per modificar-ne l'estructura.Possible solució
GRANT ALTER ON adminprac.Alumnes TO GestorAlumnes; -
Assigna el nou rol als usuaris que prèviament havies creat (Sí, als dos)
Possible solució
GRANT GestorAlumnes TO usurp@localhost; GRANT GestorAlumnes TO usurp2@localhost; -
Modifica el rol GestorAlumnes a fi de que els usuaris d’aquest, puguin modificar l’estructura de la taula Alumnes mitjançant la comanda
ALTER.Possible solució
GRANT ALTER ON adminprac.Alumnes TO GestorAlumnes;-
Abans de continuar comprovem els permisos de l'usuari usurp2@localhost
SHOW GRANTS FOR usurp2@localhost;COMPTE: Si veieu el permís
GRANT SELECT ON adminprac.* TO usurp2@localhostel treurem amb la comanda, executada com root,
REVOKE SELECT ON adminprac.* FROM usurp2@localhost.Anem bé si la comanda
SHOW GRANTS FOR usurp2@localhostnomés mostraGRANT `GestorAlumnes` TO `usurp2`@`localhost` GRANT USAGE ON *.* TO `usurp2`@`localhost` IDENTIFIED BY PASSWORD '*735BF74512A90FD5C35F39886F72A62C8F6D021D'
Després d’haver fet les opcions de l’apartat 25 al final tenim un usuari usurp2 que no pot teballar amb la taula Alumnes. Només quan canvïi de rol podrà executar comandes
ALTER TABLEsobre la taula Alumnes. Us poso les comandes per tal que les proveu i veieu si teniu o no permís per executar-les.mysql -u usurp2 -pusurp2Acabem d’entrar al servidor de MySQL, podrem veure la base adminprac?
use adminprac;ERROR 1044 (42000): Access denied for user 'usurp2'@'localhost' to database 'adminprac'No, no tenim permisos, caldrà que canviem de rol.
La comanda
SELECT CURRENT_ROLE()mostra el valorNULLSET ROLE GestorAlumnes; SELECT CURRENT_ROLE();Ara ja tenim el rol GestorAlumnes i, per tant, els permisos que li haviem donat.
SHOW GRANTS;Ara hem de veure que tenim permís d'
ALTERsobre la taulaadminprac.Alumnes.GRANT ALTER ON `adminprac`.`alumnes` TO `GestorAlumnes`Continuem ja que aamb aquest rol ja ens podem connectar a la base
adminpracuse adminprac;Anem a veure els permisos que tenim, fent proves...
No podem fer SELECT sobre la taula adminprac.AlumnesSELECT * FROM Alumnes; ERROR 1142 (42000): SELECT command denied to user 'usurp2'@'localhost' for table 'alumnes'No podem fer
SELECT? I què podrem fer?No podem fer UPDATE sobre la taula adminprac.AlumnesSTART TRANSACTION; UPDATE Alumnes SET nom_alumne = 'Pilar' WHERE nom_alumne = 'Maria'; ERROR 1142 (42000): UPDATE command denied to user 'usurp2'@'localhost' for table 'alumnes'UPDATEtampoc? Que estrany... o no!No podem fer INSERT sobre la taula adminprac.AlumnesINSERT INTO Alumnes VALUES(null, 'nouAlumne',current_date - interval 10 year); ERROR 1142 (42000): INSERT command denied to user 'usurp2'@'localhost' for table 'alumnes'Doncs no! Tampoc!
FIXEU-VOS que per tenir uns o altres permisos, no n'hi ha prou en tenir assignat un Rol sinño que cal indicar amb quin rol estem en tot moment. Nomñes podem tenir un rol alhora, o cap.
Canviem de rol amb la comanda
SET ROLE { <nomDelRol> | NONE }.Veiem de rol assignat amb la comanda
SELECT CURRENT_ROLE(). -
-
Connecteu-vos a la BD amb l’usuari usupr2, comproveu que efectivament aquest usuari pot alterar, per exemple, la longitud del camp nom_alumne (incrementeu-lo en 5 caràcters). Ha anat tot bé? En cas contrari esmeneu l’error modificant el que calgui sobre el rol prèviament creat.
Possible solució
mysql -u usurp2 -pusurp2SET ROLE GestorAlumnes; use adminprac; DESCRIBE Alumnes; -- No mostra res ALTER TABLE Alumnes MODIFY COLUMN nom_alumne VARCHAR(55) NOT NULL;Query OK, 0 rows affected (0.045 sec)Tot i no poder-ne veure l'estructura, l'hem poguda modificar.