← Retour au blog

Data Act et Data Governance Act en pratique

Lucian BLETAN

Data Act et Data Governance Act en pratique

Le Data Act et le Data Governance Act encouragent le partage utile tout en protégeant droits et acteurs. L’objectif est d’industrialiser des partages responsables: rôles clairs, contrats explicites, contrôles continus et preuves d’audit. Ce guide se concentre sur l’état des lieux jusqu’en 2024, sans évoquer d’éléments postérieurs.

chronologie

  • 2022-06-23: DGA entre en vigueur.
  • 2023-09-24: DGA s’applique, notamment pour les intermédiaires et l’altruisme de données.
  • 2024-01-11: Data Act entre en vigueur.

dga en vigueur 2022-06-23

dga applicable 2023-09-24

data act en vigueur 2024-01-11

roles

  • data holder: possède et expose, maintient le catalogue, applique IAM et filtrage ligne/colonne.
  • data user: consomme selon contrat, respecte la finalité, ne détourne pas l’usage.
  • intermediaire: facilite l’accès, vérifie les règles, trace les décisions.
  • autorite: contrôle la mise en oeuvre, peut solliciter les preuves.

roles

data holder

data user

intermediaire

autorite

catalogue et versions

iam et rls cls

finalite explicite

respect du contrat

evaluation demandes

traçabilite decisions

controle et audit

contrats et acces

Un contrat doit être court, diffusable et vérifiable.

  • objet: quelles données, versions, unités, cadence.
  • finalite: autorisée, interdite, durée.
  • securite: chiffrement, IAM, RLS/CLS.
  • conservation: délais producteur et consommateur.
  • audit: journaux, formats, rétention.
contract:
  id: "telemetrie_appareils_v1:eu-west-1"
  dataset: "telemetrie_appareils_v1"
  version: "1.2.0"
  owner: "@iot-platform"
  purpose_allow: ["maintenance preventive", "qualite service"]
  purpose_deny: ["profilage marketing", "revente brute"]
  access_methods: ["api", "export parquet"]
  pii: "masquee"
  rls: "device_owner_id = :consumer_account_id"
  retention_producer_days: 365
  retention_consumer_days: 180
  audit_trail: "governance.access_log"
  contacts:
    security: "sec@exemple.com"
    data_steward: "data@exemple.com"

processus de demande d’acces

ok

non

data user

depot de demande

decrire finalite et datasets

intermediaire verifie cadre

data holder valide technique

rejeter et journaliser

emettre credentiels scopes

consommation controlee

journal acces horodate

exposition pour audit

gouverner la reutilisation

  • catalogue des partages et des finalités approuvées.
  • évaluation courte des risques avant chaque nouveau partage.
  • comité de réutilisation mensuel: incidents, exceptions, volumes.
  • plan de dépréciation quand le schéma change.
2024-04-212024-04-282024-05-052024-05-122024-05-192024-05-262024-06-022024-06-092024-06-162024-06-232024-06-302024-07-072024-07-142024-07-212024-07-28annonce v2 gel des features v1 double publication support securite v1 decommission v1 v1migrationextinctionplan de deprecation semver et migration

modeles de controles

rls ligne et cls colonne

-- politique RLS: restreindre aux appareils du consommateur
CREATE POLICY rls_device_owner
ON iot.telemetrie_appareils
AS PERMISSIVE
FOR SELECT
TO role_consommateur
USING (device_owner_id = current_setting('app.consumer_account_id')::text);

-- CLS simple via vue masquees
CREATE OR REPLACE VIEW iot.telemetrie_appareils_v1 AS
SELECT
  device_id,
  reading_ts,
  CASE WHEN has_privilege('see_raw_email') THEN owner_email ELSE 'masked' END AS owner_email,
  CASE WHEN has_privilege('see_raw_location') THEN gps_lat ELSE round(gps_lat::numeric, 2) END AS gps_lat,
  CASE WHEN has_privilege('see_raw_location') THEN gps_lon ELSE round(gps_lon::numeric, 2) END AS gps_lon,
  temperature_c,
  voltage_v
FROM iot.telemetrie_appareils_raw;

journal d’acces minimal

CREATE TABLE IF NOT EXISTS governance.access_log (
  event_id         UUID PRIMARY KEY,
  happened_at      TIMESTAMP NOT NULL,
  actor_principal  TEXT NOT NULL,
  dataset          TEXT NOT NULL,
  contract_id      TEXT NOT NULL,
  action           TEXT CHECK (action IN ('read','export','revoke','rotate')),
  rows_read        BIGINT,
  purpose          TEXT,
  decision         TEXT CHECK (decision IN ('allow','deny')),
  reason           TEXT
);

verification de schema et versions

-- table de reference des versions
CREATE TABLE IF NOT EXISTS governance.schema_registry (
  dataset TEXT,
  version TEXT,
  schema_hash TEXT,
  released_at TIMESTAMP,
  PRIMARY KEY(dataset, version)
);

-- check de compatibilite lors d'un changement
-- (pseudo-code SQL, adaptez aux fonctions disponibles)

evaluation rapide des risques

  • nature: PII, données sensibles, agrégations.
  • transferts: hors UE, sous-traitants concernés.
  • volumetrie: transactionnel vs export massif.
  • finalite: utile, proportionnée, non détournée.
  • mesures: chiffrement, RLS/CLS, masquage, rotation des clés.
risk_check:
  pii: "faible"
  transfers_extra_eu: "non"
  volumes: "moyens"
  purpose_ok: true
  mitigations: ["masquage", "rls", "chiffrement au repos"]
  reviewer: "@governance"
  reviewed_at: "2024-04-14"

cas d’usage

b2b maintenance preventive

  • holder: fabricant d’appareils.
  • user: prestataire de maintenance.
  • finalite: prédire pannes, planifier interventions.
  • limites: pas d’usage marketing, pas de revente des flux bruts.

flux capteurs

normalisation

vues masquees v1

contrat maintenance

api quotas et rls

monitoring consommation

rapports usage et audit

b2g situation exceptionnelle

  • accès du secteur public aux données privées dans des cas stricts, nécessaires et proportionnés.
  • prévoir un canal dédié, des journaux détaillés, une révision post-incident.
b2g_channel:
  trigger: "situation exceptionnelle documentee"
  scope: "liste delimitee de champs et de dates"
  approval: ["legal", "security", "exec"]
  logging: "granulaire, exportable"
  review_window_days: 30

interoperabilite et portabilite

  • schémas sémantiques stables, versions semver.
  • formats ouverts: parquet, jsonl, csv avec dictionnaire.
  • endpoints cohérents: listing, lecture par clé, pagination, filtres.
  • export programmatique et retrait global.
schema_registry:
  dataset: "telemetrie_appareils"
  versions:
    - "1.1.0"
    - "1.2.0"
  fields:
    - name: "device_id"
      type: "string"
      desc: "identifiant stable"
    - name: "reading_ts"
      type: "timestamp"
      desc: "horodatage utc"
    - name: "temperature_c"
      type: "float"
      desc: "temperature en celsius"

quotas et throttling

Mettez des garde-fous explicites et traçables.

-- quotas par contrat et par jour
CREATE TABLE IF NOT EXISTS governance.contract_quota (
  contract_id TEXT,
  period      DATE,
  rows_limit  BIGINT,
  rows_used   BIGINT DEFAULT 0,
  PRIMARY KEY (contract_id, period)
);

-- verification avant export
CREATE OR REPLACE FUNCTION governance.check_quota(p_contract TEXT, p_rows BIGINT)
RETURNS BOOLEAN AS $$
DECLARE
  rec governance.contract_quota;
BEGIN
  SELECT * INTO rec FROM governance.contract_quota
  WHERE contract_id = p_contract AND period = current_date;
  IF NOT FOUND THEN
    INSERT INTO governance.contract_quota(contract_id, period, rows_limit, rows_used)
    VALUES (p_contract, current_date, 1000000, 0)
    RETURNING * INTO rec;
  END IF;
  IF rec.rows_used + p_rows > rec.rows_limit THEN
    RETURN FALSE;
  END IF;
  UPDATE governance.contract_quota
    SET rows_used = rows_used + p_rows
  WHERE contract_id = p_contract AND period = current_date;
  RETURN TRUE;
END;
$$ LANGUAGE plpgsql;

exceptions controlees

  • exception motivée, datée, limitée en portée.
  • revue périodique et traçabilité complète.
exception:
  id: "ex-2024-04-20-001"
  policy_target: "telemetrie_appareils_v1#rls"
  granted_to: "@partner-maintenance"
  reason: "investigation incident capteur lot A"
  scope: "10 devices sur 7 jours"
  expires_at: "2024-04-27"
  reviewer: "@security"

supervision

Suivez quelques métriques simples pour piloter.

  • délai d’attribution des accès.
  • taux de demandes rejetées pour finalité floue.
  • incidents liés à versioning ou schéma.
  • fraîcheur et latence livrées vs SLA.
  • écarts d’usage vs contrat.

supervision

delai attribution acces

taux demandes rejetees

incidents schema

fraicheur latence

ecarts usage

modele d’api

Exposez des endpoints cohérents et simples.

GET /api/v1/datasets/telemetrie_appareils_v1/readings?device_id=...&from=...&to=...
Authorization: Bearer <token>

200 OK
Content-Type: application/json
{
  "contract_id": "telemetrie_appareils_v1:eu-west-1",
  "rows": [
    {"device_id":"A42","reading_ts":"2024-04-14T10:00:00Z","temperature_c":21.0,"voltage_v":3.7},
    {"device_id":"A42","reading_ts":"2024-04-14T10:05:00Z","temperature_c":21.2,"voltage_v":3.7}
  ],
  "next": null
}

pipeline conformite et preuves

Construisez un pipeline qui produit naturellement les preuves.

contrat yaml

validation schema

deploiement vues masquees

publication catalogue

attribution acces

journalisation acces

exports de preuves

publication catalogue

  • une page par dataset avec versions, finalités, SLA, contacts.
  • un point d’accès machine lisible pour automatiser.
{
  "dataset": "telemetrie_appareils_v1",
  "version": "1.2.0",
  "owner": "@iot-platform",
  "purpose_allow": ["maintenance preventive", "qualite service"],
  "access_methods": ["api", "export parquet"],
  "pii": "masquee",
  "sla": {"availability": "99.5%", "freshness_max": "PT6H"}
}

offboarding et retrait

Quand un contrat prend fin, la révocation doit être simple, traçable et attestée.

date fin contrat atteinte

notifier parties

revoquer tokens

retrait global des exports

attestation de suppression

archiver preuves

checklists

  • contrat: complet, versionné, diffusé.
  • finalité: claire, limitée, pertinente.
  • sécurité: IAM, RLS/CLS, masquage, chiffrement.
  • audit: journaux immuables, exports prêts.
  • migration: notes, double publication, dates.
  • exceptions: datées, motivées, revues.
readiness_check:
  contract_ready: true
  purpose_clear: true
  security_controls: ["iam","rls","cls","masking","encryption"]
  audit_ready: true
  migration_plan: "ok"
  exceptions_policy: "ok"

erreurs courantes

  • clauses floues -> litiges -> gabarits clairs et listes allow et deny
  • versions sauvages -> casse en prod -> semver et double publication
  • exceptions permanentes -> derive -> expiration obligatoire et revue périodique
  • absence de journaux -> preuve impossible -> access_log normalisé et exportable
  • sur-collecte -> risques inutiles -> limiter champs, filtrer tôt, agréger quand possible