Mandatos SQL para etiquetas de seguridad
- CREAR
- ALTERAR
- MOSTRAR
- DESCARTAR
DEV.SCHEMA(ADMIN)=> CREATE SECURITY LEVEL conf VALUE 500;
CREATE SECURITY LEVEL
DEV.SCHEMA(ADMIN)=> CREATE SECURITY LEVEL greater VALUE 600;
CREATE SECURITY LEVEL
DEV.SCHEMA(ADMIN)=> CREATE SECURITY LEVEL secret VALUE 800;
CREATE SECURITY LEVEL
DEV.SCHEMA(ADMIN)=> SHOW SECURITY LEVEL ALL;
NAME | LEVEL
----------+--------
PUBLIC | 0
CONF | 500
GREATER | 600
SECRET | 800
OMNI | 32767
(5 rows)
Dado que SECRET tiene un valor más alto que CONF y GREATER, un usuario con SECRET puede acceder a los niveles CONF y GREATER, pero un usuario con CONF o GREATER no puede acceder a los niveles SECRET. Un nivel GREATER puede acceder a un nivel CONF y a cualquier otro nivel con valores menores.
DEV.SCHEMA(ADMIN)=> ALTER SECURITY LEVEL conf RENAME TO TOP_SECRET VALUE
1000;
ALTER SECURITY LEVEL
Por lo tanto ahora un usuario con el nivel TOP_SECRET modificado puede acceder a los niveles SECRET, pero un usuario con los niveles SECRET no puede acceder a los niveles TOP_SECRET.
DEV.SCHEMA(ADMIN)=> CREATE CATEGORY super;
CREATE CATEGORY
DEV.SCHEMA(ADMIN)=> CREATE CATEGORY insider;
CREATE CATEGORY
DEV.SCHEMA(ADMIN)=> CREATE CATEGORY audit;
CREATE CATEGORY
DEV.SCHEMA(ADMIN)=> SHOW CATEGORY ALL;
NAME | ID
----------+--------
AUDIT | 3
INSIDER | 2
SUPER | 1
OMNI | 0
(4 rows)
DEV.SCHEMA(ADMIN)=> ALTER CATEGORY SUPER RENAME TO TOP_SECRET;
ALTER CATEGORY
DEV.SCHEMA(ADMIN)=> CREATE COHORT TOP;
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT SALES IN COHORT TOP;
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT "NA" in COHORT sales;
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT "EUROPE" in COHORT sales;
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT "Asia" in COHORT sales;
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT DIST in COHORT top;
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT ENG in COHORT "Europe";
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT FRA in COHORT "Europe";
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT GER in COHORT "Europe";
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT NE in COHORT dist;
CREATE COHORT
DEV.SCHEMA(ADMIN)=> SHOW COHORT ALL;
NAME | ID | CLOSURE
--------+----+----------------------------------------------------
Asia | 5 | "Asia"
DIST | 6 | DIST,NE
ENG | 8 | ENG
Europe | 4 | "Europe",ENG,FRA,GER
FRA | 9 | FRA
GER | 10 | GER
NA | 3 | "NA"
NE | 7 | NE
OMNI | 0 |
SALES | 2 | SALES,"NA","Europe","Asia",ENG,FRA,GER
TOP | 1 | TOP,SALES,"NA","Europe","Asia",DIST,NE,ENG,FRA,GER
(11 rows)
La jerarquía muestra que la cohorte de la parte superior puede acceder a todas las cohortes que están por debajo. DIST no puede acceder a las cohortes SALES (ambos son “hermanos” de TOP) y viceversa. NA, EUROPE y ASIA no pueden acceder a NE y viceversa.
- El nivel de etiqueta debe ser inferior o igual al nivel de etiqueta.
- Todos los miembros de la categoría de etiqueta deben ser miembros del perfil. El usuario debe tener todas las categorías de datos.
- Al menos un miembro de la cohorte de fila de tabla debe ser también miembro del perfil.
DEV.SCHEMA(ADMIN)=> CREATE USER MARY PASSWORD 'abcd' SECURITY LABEL 'secret:
blue';
CREATE USER
La ausencia de una dimensión especificada no tiene una identidad y se trata como ausente. El estado de ausencia se utiliza para decidir si se debe evaluar la comprobación de acceso.
Si falta la etiqueta en una fila, el sistema ignora el estado de usuario y permite el acceso. Si falta la etiqueta de usuario, se trata como NONE.
| Perfil de usuario | Etiqueta de seguridad | Resultado |
|---|---|---|
| Perdido | Perdido | Permitir acceso |
| Perdido | Especificado | Acceso no permitido |
| Especificado | Perdido | Permitir acceso |
| Especificado | Especificado | El usuario debe tener todas las categorías que tiene la fila de tabla. El usuario puede tener más categorías. |
| Perfil de usuario | Etiqueta de seguridad | Resultado |
|---|---|---|
| Perdido | Perdido | Permitir acceso |
| Perdido | Especificado | Acceso no permitido |
| Especificado | Perdido | Permitir acceso |
| Especificado | Especificado | El usuario debe tener al menos una cohorte en común con la fila de tabla. Tanto el usuario como la fila de tabla pueden tener otras cohortes. |
DEV.SCHEMA(ADMIN)=> CREATE USER GRETA SECURITY LABEL 'SECRET : INSIDER, AUDIT
: DIST, Europe, Asia';
CREATE USER
| Nivel | Categoría (all-of) | Cohorte (any-of) | Puede acceder |
|---|---|---|---|
| CONF | INSIDER | Asia | Sí. |
| CONF | INSIDER | HORAS | Núm. El usuario está restringido porque ninguna de las cohortes de usuario es VENTAS. |
| AUDITORÍA | OMNI | Asia | Núm. Usuario está restringido porque OMNI es igual a todas las categorías, e INSIDER y AUDIT son un subconjunto de todas las categorías. |
| MAYOR | AUDITORÍA | FRA | Sí. FRA pertenece a la cohorte Europe. |
| TOP_SECRET | SUPER | GER | Núm. El nivel es demasiado bajo y el ID de usuario no tiene SUPER como categoría. |
- El máximo de las etiquetas.
- La unión de los conjuntos de etiquetas all-of (categorías).
- La intersección de los conjuntos de etiquetas any-of (cohortes).
El sistema no calcula automáticamente las combinaciones de etiquetas. Puede definir funciones y agregados para imponer las reglas.
- combine_label(label1, label2)
Es una función escalar que combina dos o más etiquetas y devuelve la combinación más restrictivas.
- max_label(label)
Se trata de una función de agregado que combina un conjunto de etiquetas y devuelve una etiqueta única más restrictiva.
DEV.SCHEMA(ADMIN)=> SELECT combine_label('secret: blue:psg', 'public: green:
qa');
COMBINE_LABEL
------------------------
SECRET:GREEN,BLUE:NONE
(1 row)
Para etiquetar los resultados de consulta o utilizarlos para CTAS, puede combinar etiquetas con max_label y combine_label, que calcula la etiqueta más restrictiva. Las uniones no tienen etiqueta, sólo el resultado.