En versiones anteriores a Db2 11.5.5, conceder a un usuario acceso amplio a todos los objetos de un esquema era difícil de hacer de forma precisa. La alternativa práctica era asignar DBADM o SECADM, autoridades que otorgan accesos en un ámbito mucho mayor del necesario. Db2 11.5.5 resuelve este problema con un conjunto de autoridades y privilegios específicos a nivel de esquema, diseñados para implementar el Principio de Mínimo Privilegio de forma directa.
Este artículo es deliberadamente práctico. Cada paso muestra los comandos exactos a ejecutar y las verificaciones a realizar. El lab está diseñado para reproducirse en una instancia Db2 11.5.5 o posterior.
El problema con el modelo anterior
El control de acceso en Db2 se basa en dos conceptos distintos: autoridades, que operan a nivel de instancia o base de datos, y privilegios, que operan a nivel de objeto individual.
El problema clásico surgía cuando un equipo necesitaba gestionar o acceder a todos los objetos de un esquema específico. Las opciones disponibles eran:
- Asignar
DBADM, que da control sobre toda la base de datos - Asignar
SECADM, que da control sobre toda la política de seguridad - Conceder privilegios objeto a objeto, lo que es operacionalmente costoso y difícil de mantener cuando el esquema crece
Ninguna de estas opciones es buena. Las dos primeras violan el Principio de Mínimo Privilegio. La tercera es correcta en teoría pero impracticable cuando un esquema tiene decenas o cientos de objetos.
Lo que construye este lab
Al finalizar el lab tendrá:
- una base de datos de prueba con un esquema poblado
- cuatro usuarios con perfiles de acceso distintos
- la demostración práctica de cada nueva autoridad de esquema
- la demostración de los nuevos privilegios de esquema con un único
GRANT - pruebas de verificación que confirman lo que cada usuario puede y no puede hacer
- una consulta de auditoría sobre
SYSCAT.SCHEMAAUTH
Prerrequisitos
Use una instancia Db2 en versión 11.5.5 o posterior.
También necesita:
- Acceso shell con permisos de
DBADMoSECADMpara crear usuarios y conceder autoridades - El CLP de Db2
Los usuarios del sistema operativo referenciados en el lab deben existir en el sistema antes de ejecutar los GRANT. Ejecute los siguientes comandos como root para crearlos:
useradd -m alice && echo "alice:passw0rd" | chpasswd
useradd -m thomas && echo "thomas:passw0rd" | chpasswd
useradd -m etl && echo "etl:passw0rd" | chpasswd
useradd -m secmgr && echo "secmgr:passw0rd" | chpasswd1. Crear la base de datos y el esquema de prueba
Los siguientes pasos deben ser ejecutados por el propietario de la instancia Db2.
Cree la base de datos de prueba y conéctese a ella:
db2 create database SCHLAB
db2 connect to SCHLABLa definición del procedimiento requiere un terminador multi-instrucción. Guarde el DDL en un archivo y ejecútelo con db2 -td@:
cat > /tmp/schlab_ddl.sql <<'SQLEOF'
CREATE SCHEMA sales@
CREATE TABLE sales.customers (
id INTEGER NOT NULL,
name VARCHAR(100),
email VARCHAR(100),
PRIMARY KEY (id)
)@
CREATE TABLE sales.orders (
id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
customer_id INTEGER,
amount DECIMAL(10,2),
PRIMARY KEY (id)
)@
CREATE PROCEDURE sales.register_order (IN p_customer INTEGER, IN p_amount DECIMAL(10,2))
LANGUAGE SQL
BEGIN
INSERT INTO sales.orders (customer_id, amount)
VALUES (p_customer, p_amount);
END@
SQLEOF
db2 -td@ -f /tmp/schlab_ddl.sqlInserte algunos datos de prueba:
db2 "INSERT INTO sales.customers VALUES (1, 'Alice Martin', '[email protected]')"
db2 "INSERT INTO sales.customers VALUES (2, 'Thomas Chen', '[email protected]')"
db2 "INSERT INTO sales.orders (customer_id, amount) VALUES (1, 150.00)"
db2 "INSERT INTO sales.orders (customer_id, amount) VALUES (2, 320.50)"
db2 commit2. Crear los perfiles de usuario
Trabajaremos con cuatro usuarios que representan perfiles reales:
| Usuario | Perfil previsto |
|---|---|
alice | Analista: lectura sobre todo el esquema |
etl | Pipeline ETL: inserción y ejecución en el esquema |
thomas | Propietario técnico: control total sobre el esquema |
secmgr | Gestor de seguridad: gestión de permisos sin acceso a datos |
Conceda CONNECT a la base de datos a todos:
db2 "GRANT CONNECT ON DATABASE TO USER alice"
db2 "GRANT CONNECT ON DATABASE TO USER etl"
db2 "GRANT CONNECT ON DATABASE TO USER thomas"
db2 "GRANT CONNECT ON DATABASE TO USER secmgr"3. SELECTIN: acceso de lectura al esquema completo
Antes de esta funcionalidad, conceder lectura a todos los objetos del esquema requería un GRANT SELECT por cada tabla y View. Ahora:
db2 "GRANT SELECTIN ON SCHEMA sales TO USER alice"Verifique como alice:
db2 connect to SCHLAB user alice using passw0rd
db2 "SELECT * FROM sales.customers"
db2 "SELECT * FROM sales.orders"Ambas consultas deben funcionar. Confirme que alice no puede insertar datos:
db2 "INSERT INTO sales.customers VALUES (3, 'Test User', '[email protected]')"Este comando debe fallar con SQL0551N: alice no tiene INSERTIN ni INSERT directo sobre la tabla.
Finalice la sesión:
db2 connect reset4. INSERTIN y EXECUTEIN: pipeline ETL
El usuario etl necesita insertar datos y llamar al stored procedure, pero no debe poder leer datos existentes:
db2 connect to SCHLAB
db2 "GRANT INSERTIN ON SCHEMA sales TO USER etl"
db2 "GRANT EXECUTEIN ON SCHEMA sales TO USER etl"Verifique como etl:
db2 connect to SCHLAB user etl using passw0rd
db2 "INSERT INTO sales.customers VALUES (3, 'New Customer', '[email protected]')"
db2 "CALL sales.register_order(3, 99.90)"
db2 commitAmbos deben funcionar. Confirme que etl no puede leer los datos:
db2 "SELECT * FROM sales.customers"Este comando debe fallar con SQL0551N.
Finalice la sesión:
db2 connect reset5. SCHEMAADM: control total sobre el esquema
SCHEMAADM es la autoridad más amplia. Otorga control total sobre el esquema sin dar acceso al resto de la base de datos:
db2 connect to SCHLAB
db2 "GRANT SCHEMAADM ON SCHEMA sales TO USER thomas"
db2 "GRANT USE OF TABLESPACE USERSPACE1 TO USER thomas"SCHEMAADM otorga autoridad sobre los objetos del esquema pero no incluye acceso a tablespaces. El GRANT USE OF TABLESPACE es necesario para que thomas pueda crear nuevas tablas. Sin él, el CREATE TABLE falla con SQL0286N.
Verifique como thomas:
db2 connect to SCHLAB user thomas using passw0rd
db2 "CREATE TABLE sales.campaigns (id INTEGER NOT NULL, name VARCHAR(100), PRIMARY KEY (id))"
db2 "GRANT SELECT ON TABLE sales.campaigns TO USER alice"
db2 "RUNSTATS ON TABLE sales.customers"Todas estas operaciones deben funcionar. Confirme que thomas no tiene accesos fuera del esquema:
db2 "CREATE TABLE public.test (id INTEGER)"Este comando debe fallar porque thomas no tiene autoridad sobre otros esquemas.
Finalice la sesión:
db2 connect reset6. ACCESSCTRL: gestión de permisos sin acceso a datos
ACCESSCTRL a nivel de esquema permite conceder y revocar permisos sobre objetos del esquema sin dar acceso directo a los datos:
db2 connect to SCHLAB
db2 "GRANT ACCESSCTRL ON SCHEMA sales TO USER secmgr"Verifique como secmgr:
db2 connect to SCHLAB user secmgr using passw0rd
db2 "GRANT SELECT ON TABLE sales.orders TO USER alice"
db2 "REVOKE SELECT ON TABLE sales.orders FROM USER alice"Ambas operaciones deben funcionar. Confirme que secmgr no puede leer los datos:
db2 "SELECT * FROM sales.customers"Este comando debe fallar con SQL0551N.
Finalice la sesión:
db2 connect reset7. Auditar las autorizaciones de esquema
Las concesiones a nivel de esquema son visibles en la View SYSCAT.SCHEMAAUTH. Consulte el estado actual:
db2 connect to SCHLAB
cat > /tmp/schauth.sql <<'SQLEOF'
SELECT
GRANTEE,
GRANTEETYPE,
SCHEMANAME,
SELECTINAUTH,
INSERTINAUTH,
UPDATEINAUTH,
DELETEINAUTH,
EXECUTEINAUTH,
ALTERINAUTH,
SCHEMAADMAUTH,
ACCESSCTRLAUTH,
DATAACCESSAUTH,
LOADAUTH
FROM SYSCAT.SCHEMAAUTH
WHERE SCHEMANAME = 'SALES'
ORDER BY GRANTEE
;
SQLEOF
db2 -tvf /tmp/schauth.sqlCada columna muestra Y (concesión directa), G (concesión con capacidad de propagación) o en blanco (sin concesión). Esta consulta es el punto de partida natural para una auditoría de accesos al esquema.
8. Revocar autorizaciones
Todas las concesiones son reversibles con REVOKE:
db2 "REVOKE SELECTIN ON SCHEMA sales FROM USER alice"
db2 "REVOKE INSERTIN ON SCHEMA sales FROM USER etl"
db2 "REVOKE EXECUTEIN ON SCHEMA sales FROM USER etl"
db2 "REVOKE SCHEMAADM ON SCHEMA sales FROM USER thomas"
db2 "REVOKE USE OF TABLESPACE USERSPACE1 FROM USER thomas"
db2 "REVOKE ACCESSCTRL ON SCHEMA sales FROM USER secmgr"Confirme el estado tras la revocación con la misma consulta a SYSCAT.SCHEMAAUTH.
9. Limpieza
Elimine la base de datos de prueba y los usuarios de sistema creados en los prerrequisitos:
db2 connect reset
db2 drop database SCHLABElimine los usuarios de sistema como root:
userdel -r alice
userdel -r thomas
userdel -r etl
userdel -r secmgrConclusiones principales
- Db2 11.5.5 introduce autoridades de esquema (
SCHEMAADM,ACCESSCTRL,DATAACCESS,LOAD) que permiten delegar control total o parcial sobre un esquema sin asignarDBADMniSECADM. - Los nuevos privilegios de esquema (
SELECTIN,INSERTIN,UPDATEIN,DELETEIN,EXECUTEIN) eliminan la necesidad de conceder permisos objeto a objeto. - El modelo permite implementar el Principio de Mínimo Privilegio de forma práctica y auditable.
- La visibilidad de las autorizaciones sobre el esquema está disponible en
SYSCAT.SCHEMAAUTHy las autorizaciones pueden eliminarse medianteREVOKE.
Documentación útil de IBM
Para profundizar, las referencias de IBM más útiles para este tema son: