Secretos¶
Los secretos son configuraciones del proyecto que se almacenan de forma segura y cifrada. Los trabajos tendrán acceso automático a los secretos del proyecto, lo que permite conexiones seguras con servicios externos sin exponer las credenciales en los archivos del proyecto.
Tipos de secretos¶
Hay dos tipos de secretos que puedes crear en QFieldCloud:
-
Variables de entorno: Estas estarán disponibles para QGIS como variables de entorno mientras se ejecutan los trabajos de su proyecto. Debe proporcionar un nombre (sólo en mayúsculas) y un valor.
-
Configuraciones de pg_service: Esto le permite agregar una conexión PostgreSQL/PostGIS como se define en un archivo de configuración
pg_service.conf
.
!!! advertencia! QFieldCloud garantiza que sus credenciales se almacenen de forma segura y cifrada. Recomendamos encarecidamente asignar a los usuarios los privilegios mínimos en entornos compartidos para evitar posibles filtraciones. Los usuarios con permiso para subir archivos también podrían tener acceso a las credenciales correspondientes.
Variable de entorno¶
Las variables de entorno estarán disponibles para QGIS mientras se ejecuten los trabajos del proyecto.
Debe rellenar el nombre de la variable de entorno (sólo en mayúsculas) y el valor de la variable de entorno como texto libre.
Secretos y precedencia¶
Para proporcionar un control granular sobre el acceso a los datos, los secretos en QFieldCloud se pueden definir en tres niveles jerárquicos diferentes. Al iniciar un nuevo trabajo, QFieldCloud accederá a los secretos disponibles y seguirá el siguiente orden jerárquico de precedencia:
-
Secreto asignado por el usuario (máxima prioridad): Un secreto definido dentro de un proyecto y asignado a un usuario específico. Este es el nivel más específico y anula todos los demás para ese usuario.
-
Secreto a Nivel de Proyecto: Un secreto general definido para un proyecto específico. Se aplica a todos los miembros del proyecto, a menos que exista un secreto asignado por el usuario.
-
Secreto a Nivel de Organización (Precedencia Mínima): Un secreto definido a nivel de organización. Se utiliza como respaldo para todos los proyectos de la organización que lo requieren, siempre que no se haya establecido ningún secreto a nivel de proyecto o usuario.
Este sistema jerárquico permite a un administrador establecer un rol de base de datos general con privilegios bajos a nivel de la organización, mientras asigna roles más privilegiados para proyectos específicos o usuarios individuales de confianza.
Configuración de secreto¶
Para agregar un nuevo secreto, primero debes decidir qué tipo de secreto se necesita para tu proyecto.
Secreto de nivel de organización¶
Accede a la configuración de tu organización y selecciona la pestaña Secretos. Los secretos añadidos aquí estarán disponibles para todos los proyectos de la organización, a menos que se anulen.
Secreto de nivel de proyecto¶
Accede a la configuración de tu proyecto y selecciona la pestaña Secretos. Los secretos añadidos aquí anularán cualquier secreto de la organización con el mismo nombre.
Nivel asignado por el usuario¶
En la pestaña Secretos de un proyecto, puedes agregar un nuevo secreto y asignarlo explícitamente a un miembro específico del proyecto. Esto proporciona el mayor nivel de precedencia.
Añadiendo un secreto¶
Para agregar un nuevo secreto y dar acceso a su base de datos Postgres/PostGIS, siga el mismo formato definido en el archivo de configuración pg_service.conf
.
Puede hacerlo manualmente como texto sin formato o mediante el "Editor avanzado".
El "Editor avanzado" le permite pegar el contenido del archivo pg_service.conf
directamente.
Puede agregar la siguiente información:
- nombre de servicio
- nombre de base de datos
- usuario de base de datos
- contraseña de la base de datos
- host de la base de datos
- puerto de base de datos
- conexión SSL de la base de datos
Para otras configuraciones de servicio, puede utilizar el botón Agregar campo pgservice adicional para agregar configuraciones adicionales y sus valores.
Si utiliza varias definiciones de servicio, debe agregar varios secretos para cada una de ellas.
Nota
Una vez añadido, un secreto sólo puede ser eliminado, pero no puede ser editado.
Nota
Los secretos de QFieldCloud están disponibles sólo durante la ejecución de trabajos del proyecto, lo que le permite configurar sus capas de PostgreSQL como "Edición sin conexión". Usted no puede usar los secretos de QFieldCloud para distribuir los archivos pg_service.conf
entre los dispositivos. Por razones de seguridad, usted tiene que hacer esto manualmente. Puedes leer cómo configurar QField para usar un archivo pg_service.conf
.
El "Editor avanzado" permite editar la configuración directamente como texto sin formato. Esto resulta práctico si se desea copiar y pegar la configuración directamente desde el archivo pg_service.conf
.
Ejemplo¶
El siguiente ejemplo explicará el proceso de adición y verificación de la jerarquía explicada anteriormente. Puede agregar atributos adicionales a su tabla para comprobar y confirmar que solo los usuarios con los roles correspondientes puedan agregar nuevas funciones.
Parte 1: Configuración de la base de datos PostgreSQL¶
Primero, es necesario configurar la base de datos y definir los roles de usuario. A continuación, se debe agregar un activador automático para rellenar la columna de usuario asignada dentro de la base de datos.
1. Instanciación de bases de datos y extensiones¶
Comience creando una nueva base de datos y habilite las extensiones postgis
y uuid-ossp
necesarias.
-- Cree una nueva base de datos con un nombre, un propietario y una codificación específicos.
CREATE DATABASE db-og-secrets OWNER qfield ENCODING 'UTF8';
-- Conecte a la base de datos recién creada.
\c db-og-secrets
-- Instale las extensiones necesarias si aún no existen.
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
2. Establecimiento de roles¶
Cree tres roles de usuario distintos para simular la estructura de permisos escalonados que administrarán los secretos de QFieldCloud.
-- Cree tres roles, cada uno con privilegios de inicio de sesión y una contraseña asignada.
CREATE ROLE ninja_org LOGIN PASSWORD 'your_strong_password_for_org';
CREATE ROLE ninja_project LOGIN PASSWORD 'your_strong_password_for_project';
CREATE ROLE ninja_user LOGIN PASSWORD 'strong_password_for_user_001';
3. Definición de esquema y tabla¶
Cree un esquema y una tabla para las geometrías de puntos. La tabla incluirá un campo pg_user
para registrar automáticamente el rol responsable de la inserción de datos.
-- Crea un esquema llamado 'ninja' si aún no existe.
CREATE SCHEMA IF NOT EXISTS ninja;
-- Crea una tabla dentro del esquema 'ninja' con las columnas especificadas.
CREATE TABLE IF NOT EXISTS ninja.ninja_point (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
pg_user TEXT,
some_value TEXT NOT NULL,
geom GEOMETRY(POINT, 4326)
);
4. Implementación de un disparador automatizado de atribución de usuarios¶
Este disparador rellena automáticamente el campo pg_user
con el identificador del current_user
cada vez que se inserta o actualiza un registro.
-- Defina una función de activación para actualizar el campo pg_user.
BEGIN;
SET LOCAL SEARCH_PATH TO ninja, public;
CREATE OR REPLACE FUNCTION update_pg_user() RETURNS TRIGGER AS $$
BEGIN
NEW.pg_user := current_user;
RETURN NEW;
END;
$$ LANGUAGE plpgsql SET search_path FROM CURRENT;
COMMIT;
Y asigne el disparador a la tabla ninja_point para eventos INSERT o UPDATE.
BEGIN;
SET LOCAL SEARCH_PATH TO ninja, public;
DROP TRIGGER IF EXISTS trg_ninja_point_update_pg_user ON ninja.ninja_point;
CREATE TRIGGER trg_ninja_point_update_pg_user
BEFORE INSERT OR UPDATE ON ninja_point
FOR EACH ROW EXECUTE FUNCTION update_pg_user();
COMMIT;
5. Concesión de permisos¶
Para garantizar la seguridad y el acceso adecuado a los datos, otorgue a cada rol únicamente los permisos necesarios para su función. Este enfoque sigue el principio del mínimo privilegio.
En primer lugar, todos los roles necesitan permiso de USO en el esquema ninja para acceder a cualquier tabla dentro de él.
GRANT USAGE ON SCHEMA ninja TO ninja_org, ninja_project, ninja_user;
Acceso basado en roles¶
-
ninja_user
(solo lectura): esta función es para usuarios generales que solo necesitan ver datos. -
Permisos:
SELECT
-
ninja_project
(Lectura/Escritura): Esta función es para los miembros del proyecto que necesitan ver, agregar y modificar datos. -
Permisos:
SELECT
,INSERT
,UPDATE
-
ninja_org
(Admin): Este rol es para propietarios de organizaciones que requieren control total sobre los datos, incluida la eliminación de registros y la gestión de relaciones de claves externas. -
Permisos:
SELECT
,INSERT
,UPDATE
,DELETE
,REFERENCES
-- Otorgar permisos de tabla según las responsabilidades del rol
-- Acceso de solo lectura para usuarios generales
GRANT SELECT ON TABLE ninja.ninja_point TO ninja_user;
-- Acceso de lectura y escritura para los miembros del proyecto
GRANT SELECT, INSERT, UPDATE ON TABLE ninja.ninja_point TO ninja_project;
-- Acceso administrativo completo para propietarios de organizaciones
GRANT ALL PRIVILEGES ON TABLE ninja.ninja_point TO ninja_org;
Parte 2: Configuración del proyecto QFieldCloud y QGIS¶
Vaya directamente a QFieldCloud para configurar los secretos en diferentes niveles en QFieldCloud.
Escenario 1: Aplicación secreta a nivel de organización¶
-
Adición secreta: Vaya a la página de configuración de su organización y seleccione Secretos desde allí. Agregue un nuevo secreto
pg_service
usando las credenciales para el rolninja_org
. -
Verificación: Para garantizar que el secreto esté configurado en el nivel correcto, ahora puede crear una nueva entidad en la capa
ninja_point
dentro de QField. Una vez sincronizado con QFieldCloud, se espera que el atributopg_user
para la nueva función seaninja_org
.
Escenario 2: Aplicación de secreto a nivel de proyecto (precedencia sobre la organización)¶
-
Adición secreta: Navega a la página de configuración de tu proyecto y selecciona los Secretos desde allí. Agregue un nuevo secreto
pg_service
con el mismo nombre de servicio que el anterior, pero esta vez use las credenciales para el rolninja_project
. -
Verificación: Para garantizar que el secreto esté configurado en el nivel correcto, puede crear una nueva entidad en la capa
ninja_point
dentro de QField. Una vez sincronizado con QFieldCloud, se espera que el atributopg_user
para la nueva función seaninja_project
Esto demuestra que el secreto a nivel de proyecto reemplaza correctamente al secreto a nivel de organización.
Escenario 3: Aplicación secreta a nivel de usuario (máxima prioridad)¶
-
Creación de secretos: Navega a la página de configuración de tu proyecto y selecciona la pestaña Secretos. Agregue un nuevo secreto
pg_service
. Utilice las credenciales para el rolninja_user
y asigne explícitamente este secreto a su cuenta de usuario. -
Verificación: Cree una nueva característica en QField. Se espera que el atributo
pg_user
para esta función seaninja_user
, lo que confirma que el secreto asignado por el usuario tiene el nivel más alto de precedencia en la jerarquía.