Mandatos SQL para etiquetas de seguridad

Puede utilizar los mandatos SQL siguientes con todos los componentes de etiqueta de seguridad:
  • CREAR
  • ALTERAR
  • MOSTRAR
  • DESCARTAR
A continuación se proporciona un ejemplo de cómo crear y visualizar niveles:
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.

Restricción: No puede cambiar los valores de nivel ni eliminar ningún nivel de seguridad, cohorte o categoría si tiene alguna tabla de seguridad de filas definida en el sistema.
Para modificar el nivel de seguridad, cámbiele el nombre y asígenele un nuevo valor, como en el ejemplo siguiente utilizando el nombre y valor de CONF del ejemplo anterior:
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.

A continuación se muestra un ejemplo de cómo crear y visualizar categorías. El sistema genera los ID automáticamente.
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)
Para modificar una categoría, cámbiele el nombre y asígenele un nuevo valor, como en el ejemplo siguiente:
DEV.SCHEMA(ADMIN)=> ALTER CATEGORY SUPER RENAME TO TOP_SECRET;
ALTER CATEGORY
Las cohortes son un conjunto estricto de jerarquías y puede poner cohortes en otras cohortes para un control más fino de acceso, como en el ejemplo siguiente:
DEV.SCHEMA(ADMIN)=> CREATE COHORT TOP;
CREATE COHORT
DEV.SCHEMA(ADMIN)=> CREATE COHORT SALES IN COHORT TOP; 
CREATE COHORT
Lo siguiente es un ejemplo de cómo crear y visualizar cohortes diferentes. El sistema genera automáticamente los ID:
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.

Cuando un usuario acceder a una fila de tabla, el perfil de seguridad del usuario se compara con la etiqueta de seguridad en el objeto para determinar si se debe permitir el acceso. La comprobación de acceso es la siguiente:
  • 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.
No tiene que utilizar las tres dimensiones (nivel, categoría, cohorte) de la etiqueta de seguridad. Por ejemplo, si desea utilizar la categoría y el nivel de seguridad, pero ninguna cohorte, puede especificarlo como se indica a continuación:
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.

La tabla siguiente muestra la comparación all-of utilizada para comparar categorías.
Tabla 1. Comparación all-of (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 todas las categorías que tiene la fila de tabla. El usuario puede tener más categorías.
La tabla siguiente muestra cómo se utiliza la comparación any-of para comparar cohortes.
Tabla 2. Comparación any-of (cohortes)
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.
A partir de los ejemplos siguientes, cree un usuario:
DEV.SCHEMA(ADMIN)=> CREATE USER GRETA SECURITY LABEL 'SECRET : INSIDER, AUDIT 
: DIST, Europe, Asia';
CREATE USER
A partir de los ejemplos proporcionados, la tabla siguiente muestra cómo una coincidencia con el usuario creado GRETA determina qué acceso se permite.
Tabla 3. Etiquetas y acceso
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.
Cuando se combinan etiquetas de seguridad, las reglas de la seguridad multinivel determinan que el resultado es la combinación más restrictiva, definida como sigue:
  • 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.

Se pueden utilizar las siguientes funciones incorporadas para calcular la combinación de dos o más etiquetas de seguridad:
  • 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.

En el ejemplo siguiente, SECRET es más restrictivo que PUBLIC, de modo que el resultado es SECRET. Dos categorías son más restrictivas que una, y puesto que tiene que tener ambas categorías para ver los datos, el resultado es BLUE yGREEN. Las cohortes son más restrictivas debido a la intersección. En este caso, la intersección de PSG y QA está vacía, de modo que el resultado es explícitamente NONE. Tenga en cuenta que un NONE explícito significa que los datos no son visibles para nadie excepto OMNI.
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.