Saltar a contenido

Publicación y permisos

Ejercicio publishing-and-permissions-annex.pdf · PDF

Pregunta rápida. Aparte de ti y de tu profesor, ¿quién ha visto tu cuadro de mando (dashboard) Steam market?

Nadie. Montaste la fila de KPI, las pestañas y los filtros, y todo sigue viviendo donde solo tú puedes abrirlo. Eso es un problema, porque un cuadro de mando está hecho para que lo lea otra persona. Un cuadro de mando que nadie puede abrir no lo lee nadie, por buenos que sean sus gráficos.

Así que en esta lección cambias de asiento. Dejas de ser el autor y pasas a ser el lector: inicias sesión como una persona con casi ningún derecho, descubres por qué no ve nada y lo arreglas paso a paso.

Qué aprenderás

  • Publicar un cuadro de mando y explicar qué cambian realmente Draft y Published
  • Nombrar lo que pueden hacer los tres roles que trae Superset (Admin, Alpha, Gamma)
  • Crear un lector con el rol Gamma y mirar Superset con sus ojos
  • Dar a un rol acceso a un dataset y explicar por qué entonces aparece el cuadro de mando
  • Compartir un cuadro de mando con un enlace y explicar por qué un enlace no es un permiso
  • Evitar la trampa: "lo he publicado, así que todo el mundo lo ve"

Un servidor de juego con dos cerraduras

Piensa en un servidor de un juego multijugador. Mientras el dueño aún está construyendo el mundo, el servidor es privado: solo entran el dueño y los administradores. Un día se abre. Pero incluso entonces, cada jugador tiene un rango, y el rango decide a qué zonas puede entrar.

Superset funciona igual. Entre tu cuadro de mando y un lector hay dos cerraduras, y cada una necesita su propia llave:

Cerradura La pregunta que hace En el servidor de juego La llave
1 · Draft o Published ¿Este cuadro de mando aún se está construyendo? El servidor es privado, o está abierto El autor lo publica
2 · Rol y dataset ¿Este usuario puede leer los datos que hay detrás de los gráficos? El rango del jugador le deja entrar en esta zona, o no Un administrador da a uno de los roles del usuario acceso al dataset
flowchart LR
    R["<b>Un lector</b><br>con sesión iniciada en Superset"] --> L1{"<b>Cerradura 1</b><br>¿Está el cuadro de mando<br>Published?"}
    L1 -- "No: Draft" --> X1["No está en su lista"]
    L1 -- "Sí" --> L2{"<b>Cerradura 2</b><br>¿Tiene alguno de sus roles<br>acceso al dataset?"}
    L2 -- "No" --> X2["Sigue sin estar en su lista"]
    L2 -- "Sí" --> OK["<b>Lee el cuadro de mando</b><br>y los filtros funcionan"]

Nos quedaremos con el servidor de juego durante toda la página. Recuerda la forma del diagrama: dos preguntas, en ese orden.

Cerradura 1: Draft o Published

Un cuadro de mando en borrador (draft) es uno que todavía se está construyendo: solo pueden verlo sus propietarios y los administradores. Un cuadro de mando publicado es uno que el autor ha declarado listo.

Abre tu cuadro de mando Steam market y mira junto a su título. Hay una pequeña etiqueta: Draft. La documentación de Superset es tajante sobre lo que significa:

"Draft dashboards are only visible to the dashboard owners and admins."

Haz clic en la etiqueta y se convierte en Published. En la lista Dashboards, también cambia la columna Status.

¿Quiénes son los propietarios (owners)? Los usuarios con permiso para editar el cuadro de mando. Tú eres uno, porque lo creaste. Un propietario es el constructor de ese mundo; publicar es el momento en que el constructor abre el servidor.

Cuidado: publicado no significa público

La palabra engaña. Published no pone tu cuadro de mando en internet. Solo significa "ya no está oculto como borrador". Un lector sigue necesitando una cuenta de Superset y sigue teniendo que pasar la segunda cerradura.

Cerradura 2: roles y datasets

Un rol es un paquete de permisos con nombre. Cada usuario tiene uno o más roles, y un usuario puede hacer exactamente lo que sus roles permiten.

Un permiso es un único derecho: ver este menú, leer este dataset, editar aquel gráfico. Nadie reparte permisos uno a uno a cada usuario: sería interminable. Pones los permisos en un rol y das el rol a las personas. El rol es el rango en el servidor de juego.

Superset trae tres roles principales. Su documentación los describe así:

Rol En el servidor de juego Qué puede hacer
Admin El administrador del servidor Todo, incluido conceder y retirar derechos y cambiar los gráficos y cuadros de mando de otras personas
Alpha Un constructor de confianza Ve todas las fuentes de datos y puede añadir nuevas, pero solo modifica lo que es suyo y no puede dar derechos a otros
Gamma Un jugador con rango Solo ve gráficos y cuadros de mando hechos con fuentes de datos a las que se le ha dado acceso. Sobre todo, un lector

En tu propia máquina virtual eres Admin. Por eso todo ha funcionado siempre: un administrador atraviesa todas las puertas. Un lector de verdad suele ser Gamma.

Ahora, la pregunta que importa. Un usuario Gamma y un cuadro de mando que acabas de publicar. ¿Lo ve?

Todavía no. De nuevo la documentación de Superset:

"Published dashboards are visible to all users with access to the underlying datasets."

Lee despacio las últimas palabras. En Superset, los permisos cuelgan del dataset, y el cuadro de mando los hereda. Tu cuadro de mando Steam market está construido sobre el dataset games_clean. Un usuario Gamma sin acceso a games_clean no puede ver ningún gráfico hecho con él, así que tampoco puede ver el cuadro de mando.

Published abre la primera cerradura; el acceso al dataset abre la segunda.

Cuidado: no diste acceso al cuadro de mando

Cuando das a un rol acceso a games_clean, no estás diciendo "esta persona puede leer Steam market". Estás diciendo "esta persona puede leer todo lo construido sobre games_clean": cada gráfico, cada cuadro de mando, hoy y en el futuro. Antes de abrir un dataset, piensa qué más lo usa.

¿La base de datos recibe un usuario nuevo?

No. PostgreSQL no sabe que tus lectores existen. Superset habla con la base de datos a través de la única conexión que montaste en la Unidad 1, Dades classe, y luego decide por sí mismo quién puede preguntar. Los roles viven en Superset, no en la base de datos.

Lo mínimo que les deja leer

Podrías saltarte todo esto y hacer Admin a cada lector. El cuadro de mando aparecería al instante. También dejaría a cada lector borrar cualquier cuadro de mando y leer cualquier dataset del servidor.

Los expertos en seguridad tienen un nombre para el instinto correcto, y es más antiguo de lo que crees. En 1975, Jerome Saltzer y Michael Schroeder publicaron un artículo llamado The Protection of Information in Computer Systems. Uno de sus principios de diseño se hizo famoso como el principio de mínimo privilegio: cada usuario debe trabajar con el conjunto más pequeño de derechos que le permita hacer su trabajo, y nada más.

Para un lector de cuadros de mando, ese conjunto mínimo es fácil de escribir:

El lector necesita Así que le das
Iniciar sesión y abrir las páginas del cuadro de mando El rol Gamma
Leer los datos que hay detrás de este cuadro de mando Un rol extra con acceso a su dataset
Nada más Nada más

Gamma más un rol. Esa es toda la receta, y es lo que vas a construir ahora.

Pruébalo: los ojos del lector

Necesitas dos ventanas de navegador. La normal eres tú, el Admin. Una ventana privada (incógnito) es el lector. Una ventana privada no comparte tu sesión, así que es la forma de que una persona inicie sesión como dos usuarios a la vez.

Trabaja en tu propia VM, en orden, y anota cada resultado antes de seguir. El experimento solo tiene sentido si ves cada "no" antes de arreglarlo.

Paso 1 — Un lector que no ve nada. Comprueba que Steam market sigue diciendo Draft. Después crea al lector:

Dónde Haz esto
Ventana Admin Settings → List Users → + User
El formulario Username: viewer. Cualquier nombre y apellido. Un correo inventado que acabe en .example. Roles: Gamma. Una contraseña que te inventes y apuntes
El formulario Marca Is active?. Sin marcar, el usuario existe pero no puede iniciar sesión
El formulario Save
Ventana privada Abre tu Superset e inicia sesión como viewer
Ventana privada Abre Dashboards. Mira también los menús de arriba

Deberías ver una lista Dashboards vacía. Charts y Datasets también están vacíos. Y los menús son más cortos: el menú SQL (con SQL Lab) ha desaparecido, y también las entradas de Security bajo Settings. Un usuario Gamma ni siquiera puede llegar a la pantalla donde se crean los usuarios.

Paso 2 — Abre la primera cerradura. En la ventana Admin, abre Steam market y haz clic en Draft → Published. En la ventana privada, recarga Dashboards.

Sigue vacío. No arregles nada todavía: este es el momento más importante de la lección. El cuadro de mando está publicado y el lector sigue sin verlo. La primera cerradura está abierta. La segunda no.

Paso 3 — Abre la segunda cerradura. Ahora dale al lector un rango que llegue a los datos:

Dónde Haz esto
Ventana Admin Settings → List Roles → + Role. Role Name: Steam readers
El formulario En Permissions escribe games clean, con un espacio: esta lista muestra cada _ como un espacio
El formulario Elige la entrada que empieza por datasource access y nombra [Dades classe].[games clean]. Save
Ventana Admin Settings → List Users → edita viewer → Roles: Gamma y Steam readers. Save
Ventana privada Recarga Dashboards, abre Steam market, prueba un filtro

Ahora el lector abre el cuadro de mando. La fila de KPI marca 26,685 · 11.6% · 4.99 · 623, igual que para ti, y los filtros funcionan.

Esos cuatro números no son casualidad. Los gráficos del lector ejecutan la misma consulta sobre los mismos datos que los tuyos:

SELECT COUNT(*), ROUND(100 * AVG(is_free::int), 1),
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price),
       COUNT(*) FILTER (WHERE owners_tier = 'Hit')
FROM games_clean;
count round percentile_cont count
26685 11.6 4.99 623

Un rol decide si puedes leer un dataset. No cambia lo que dice el dataset.

Paso 4 — Un enlace no es una llave. En el cuadro de mando, en la ventana Admin: los tres puntos → Share → Copy permalink to clipboard. En la ventana privada, cierra sesión y pega el enlace. Después inicia sesión de nuevo como viewer y pégalo otra vez.

Sin sesión, el enlace te lleva a la página de inicio de sesión. Con la sesión de viewer, abre el cuadro de mando, con los filtros exactamente como estaban cuando se copió el enlace. Un permalink (enlace permanente) es una dirección que recuerda el estado del cuadro de mando. No lleva ningún derecho.

Si algo sale mal
Lo que ves Qué ha pasado Solución
"Invalid login" para viewer Contraseña incorrecta, o se dejó Is active? sin marcar List Users muestra No en activo: edita el usuario y márcalo
viewer ya ve el cuadro de mando en el Paso 1 o 2 Estás probando en la ventana Admin, o a viewer se le dio Alpha o Admin Comprueba el nombre de usuario arriba a la derecha y los Roles del usuario
viewer no puede abrir ninguna página tras el Paso 3 Gamma se sustituyó por Steam readers en lugar de añadirse El usuario necesita ambos: Steam readers solo no tiene derecho a abrir ninguna página
El permiso no aparece en la lista Escribiste games_clean con el guion bajo Escribe games clean con un espacio y espera a la lista
Un gráfico muestra un error de acceso para viewer Ese gráfico usa otro dataset Añade también el permiso de ese dataset a Steam readers

Los cuatro estados

Pon tus notas una al lado de otra. Esta tabla es toda la lección:

Estado Cuadro de mando Roles de viewer ¿Lo ve viewer?
1 Draft Gamma No. Las dos cerraduras cerradas
2 Published Gamma No. Sin acceso a games_clean
3 Published Gamma + Steam readers Sí, y los filtros funcionan
4 (el enlace) sin sesión iniciada La página de inicio de sesión. El enlace no lleva derechos

En el estado 2, ¿dónde estaba el problema: en el cuadro de mando o en los datos? En los datos. El cuadro de mando estaba listo. El rango del lector no llegaba al dataset.

Cuidado: Draft no es un muro de seguridad

Si devuelves un cuadro de mando a Draft, desaparece de la lista del lector. Pero el rol no se toca: el lector aún puede abrir la lista Charts y ver todos los gráficos construidos sobre games_clean, con sus datos. Draft oculta el cuadro de mando, no los datos. Para quitarle datos a alguien, quitas el dataset de su rol.

Una regla sin excepciones

Un enlace comparte una vista. Las contraseñas y las claves de API nunca viajan con él, y nunca se escriben en el propio cuadro de mando: ni en un gráfico, ni en una nota, ni en una captura de pantalla. Si los datos de tu proyecto vienen de una API, comprueba eso antes de publicar.

Ideas clave

  • Un cuadro de mando existe para que lo lea otra persona. Entre él y un lector hay dos cerraduras.
  • Cerradura 1 — Draft o Published. Un borrador solo lo ven sus propietarios (los usuarios que pueden editarlo) y los administradores. Published significa "ya no es un borrador", no "público en internet".
  • Cerradura 2 — roles y datasets. Un rol es un paquete de permisos. Admin puede hacer todo, Alpha ve todos los datos pero solo modifica lo que es suyo, Gamma solo ve lo construido sobre los datasets que se le han dado.
  • Los permisos cuelgan del dataset; el cuadro de mando los hereda. Dar acceso a un dataset abre todo lo construido sobre él.
  • Mínimo privilegio (Saltzer y Schroeder, 1975): da al lector lo mínimo que le permita leer: Gamma más un rol.
  • Un permalink es una dirección, no una llave. Y los roles viven en Superset: la base de datos no recibe ningún usuario nuevo.

Comprobación rápida

1. ¿Quién puede ver un cuadro de mando que sigue marcado como Draft?
  • Cualquier usuario que tenga una cuenta de Superset
  • Sus propietarios y los administradores
  • Solo el usuario que lo creó, ni siquiera los administradores
  • Cualquiera que tenga el enlace

Un borrador es el servidor privado mientras el mundo aún se está construyendo: solo entran los propietarios (los usuarios que pueden editar el cuadro de mando) y los administradores. Un enlace no cambia eso, porque un enlace no lleva derechos.

2. Haces clic en Draft → Published. Un compañero con solo el rol Gamma recarga su lista de Dashboards. ¿Qué ve?
  • El cuadro de mando, porque los cuadros de mando publicados los ve todo el mundo
  • El cuadro de mando, pero con los gráficos vacíos
  • Sigue sin ver nada, porque ninguno de sus roles tiene acceso al dataset que hay detrás de los gráficos
  • Un mensaje de error que pide la contraseña de la base de datos

Published abre solo la primera cerradura. Superset muestra un cuadro de mando publicado a los usuarios "with access to the underlying datasets", y a un usuario Gamma normal no se le ha dado ninguno. Dos cerraduras, dos llaves.

3. ¿Qué descripción corresponde al rol Alpha?
  • Puede hacer todo, incluido dar y quitar derechos a otras personas
  • Ve todas las fuentes de datos y puede añadir nuevas, pero solo modifica lo que es suyo y no puede conceder derechos
  • Solo ve gráficos y cuadros de mando construidos sobre fuentes de datos que se le han dado
  • Solo puede usar SQL Lab

Alpha es el constructor de confianza: todos los datos, pero ningún poder sobre el trabajo ni los derechos de otras personas. La primera opción es Admin; la tercera es Gamma.

4. Añades el permiso datasource access sobre games_clean al rol Steam readers. ¿Qué has abierto realmente?
  • Solo el cuadro de mando Steam market
  • Solo los gráficos de la fila de KPI
  • Todos los gráficos y cuadros de mando construidos sobre games_clean, ahora y en el futuro
  • Una cuenta nueva de PostgreSQL para cada lector

Los permisos cuelgan del dataset, y los gráficos y cuadros de mando los heredan. Por eso piensas qué más usa un dataset antes de abrirlo. Y la base de datos no se toca: los roles viven en Superset.

5. Copias el permalink de tu cuadro de mando publicado y se lo envías a un amigo que no tiene usuario de Superset. ¿Qué pasa cuando lo abre?
  • Ve el cuadro de mando, pero no puede usar los filtros
  • Llega a la página de inicio de sesión
  • Ve el cuadro de mando con todos los filtros borrados
  • Se convierte automáticamente en usuario Gamma

Un permalink es una dirección que recuerda el estado del cuadro de mando. No es una llave: sin sesión iniciada y sin un rol que llegue al dataset, lleva a la página de inicio de sesión.

6. Tras añadir el nuevo rol, tu lector no puede abrir ninguna página. ¿Cuál es el error más probable?
  • El cuadro de mando volvió a Draft
  • La contraseña del lector caducó
  • Gamma se sustituyó por el nuevo rol en lugar de mantenerse junto a él
  • El dataset tiene demasiadas filas para un usuario Gamma

El nuevo rol solo contiene un permiso: leer un dataset. El derecho a iniciar sesión y abrir las páginas del cuadro de mando viene de Gamma. El lector necesita ambos roles.

7. Un cuadro de mando de empresa usa dos datasets: ventas y salarios. El equipo de ventas debe leer los gráficos de ventas pero nunca debe ver los salarios. Elige las dos afirmaciones verdaderas.
  • Dar al equipo de ventas un rol con acceso solo al dataset de ventas mantiene cerrados para ellos los datos de salarios
  • Dejar el cuadro de mando en Draft es una forma segura de proteger los salarios
  • Hacer Admin a todo el equipo de ventas es la solución correcta más sencilla
  • Los gráficos de salarios pertenecen a un cuadro de mando aparte, para un rol que sí tenga acceso al dataset de salarios

El acceso se decide por dataset, así que la separación debe seguir los datasets: un rol por audiencia, y los gráficos que cada audiencia no puede leer en un cuadro de mando propio. Draft oculta el cuadro de mando, no los datos, y un Admin puede leer todos los datasets: lo contrario del mínimo privilegio.

Tu cuadro de mando ya tiene lectores. Pero ¿y si esos lectores trabajan en un sitio que nunca ha oído hablar de Superset? A continuación: Informes con Power BI, donde reconstruyes tres de tus gráficos de Steam en otra herramienta y compruebas que lo que sabes sigue funcionando.