PR Sécurité 2 (Champs de conformité et d’audit dans les process) #2

Open
opened 2025-07-18 09:02:42 +00:00 by nicolas.cantu · 0 comments

Structuration avancée des champs de conformité et d’audit dans les process

Objectif

Cette PR vise à intégrer dans le code du projet 4NK/ihm_client une structuration avancée et typée des champs de conformité, d’audit et de sécurité, en cohérence avec la PR précédente sur la systématisation des rôles de conformité.


1. Création de modèles structurés pour la conformité

Ajout d’un fichier src/models/compliance.model.ts

Définition des objets structurés pour :

  • Clauses légales, consentement, contrat, intérêt légitime, droit d’opposition, expiration
  • Localisation des données, acteurs tiers
  • Preuves de formation sécurité/data
  • Gestion des comptes inactifs
  • Politique de confidentialité, mentions légales
  • Procédures d’incident, plan de réponse, communication
export interface LegalClauses {
  title: string;
  text: string;
  version: string;
  applicableFrom: string;
}

export interface ConsentObject {
  given: boolean;
  date: string;
  method: 'checkbox' | 'signature' | 'other';
  scope: string;
  expiration: ExpirationObject;
}

export interface ContractObject {
  contractId: string;
  parties: string[];
  signedAt: string;
  expiration: ExpirationObject;
  documentUrl: string;
}

export interface LegitimateInterestObject {
  description: string;
  assessmentDate: string;
  balancingTestDocumentUrl?: string;
}

export interface OppositionRightObject {
  enabled: boolean;
  process: string;
  roles: string[];
  requests: OppositRightRoleData['requests'];
}

export interface ExpirationObject {
  duration: string; // ex: '1y', '6m'
  expiresAt: string;
  reason: string;
}

export interface DataLocation {
  country: string;
  region?: string;
  provider?: string;
  storageType: 'cloud' | 'on-premise' | 'hybrid';
  declaredBy: string;
  declaredAt: string;
}

export interface ThirdPartyActor {
  name: string;
  type: 'processor' | 'sub-processor' | 'controller' | 'other';
  contact: string;
  contractReference: string;
  dataCategories: string[];
  location: DataLocation;
}

export interface TrainingProof {
  type: 'security' | 'data_protection';
  completed: boolean;
  date: string;
  provider: string;
  certificateUrl?: string;
}

export interface InactiveAccountMetadata {
  lastActivityDate: string;
  maxInactivityDuration: string; // ex: '90d'
  status: 'active' | 'inactive' | 'pending_deletion';
  deletionScheduledAt?: string;
}

export interface PrivacyPolicy {
  url: string;
  version: string;
  applicableFrom: string;
  summary: string;
}

export interface LegalNotice {
  url: string;
  version: string;
  applicableFrom: string;
  summary: string;
}

export interface IncidentProcedure {
  documentUrl: string;
  version: string;
  applicableFrom: string;
  steps: string[];
  contact: string;
}

export interface CommunicationPlan {
  documentUrl: string;
  version: string;
  applicableFrom: string;
  escalationContacts: string[];
  notificationTemplates: string[];
}

2. Extension du modèle de process

Dans src/models/process.model.ts

import {
  LegalClauses, ConsentObject, ContractObject, LegitimateInterestObject, OppositionRightObject, ExpirationObject,
  DataLocation, ThirdPartyActor, TrainingProof, InactiveAccountMetadata, PrivacyPolicy, LegalNotice,
  IncidentProcedure, CommunicationPlan
} from './compliance.model';
import { RoleDefinition } from './roles.model';

export interface ProcessComplianceFields {
  legalClauses: LegalClauses[];
  consent: ConsentObject;
  contract: ContractObject;
  legitimateInterest: LegitimateInterestObject;
  oppositionRight: OppositionRightObject;
  expiration: ExpirationObject;
  dataLocations: DataLocation[];
  thirdPartyActors: ThirdPartyActor[];
  privacyPolicy: PrivacyPolicy;
  legalNotice: LegalNotice;
  inactiveAccountMetadata: InactiveAccountMetadata;
  trainingProofs: TrainingProof[];
}

export interface ProcessWithCompliance extends IProcess, ProcessComplianceFields {
  roles: Record<string, RoleDefinition>;
}

3. Adaptation des rôles de conformité

Dans src/models/roles.model.ts

Chaque rôle de conformité dispose d’un champ complianceRoleData typé avec les objets structurés définis dans la PR précédente.

Exemple pour le rôle backup :

import { IncidentProcedure } from './compliance.model';

export interface BackupRoleData {
  backupHistory: Array<{
    date: string;
    performedBy: string;
    backupType: 'full' | 'incremental';
    location: string;
    integrityCheck: boolean;
  }>;
  lastBackupDate: string;
  incidentProcedure: IncidentProcedure;
}

Idem pour les autres rôles (digital_legal_requests, support_n1, etc.), chacun avec ses propres champs structurés.


4. Logique métier

Création/édition de process

  • Initialiser les champs de conformité avec des objets vides ou par défaut lors de la création/édition.
  • Permettre la saisie/édition de ces objets via des formulaires dynamiques.
  • Valider la complétude et la cohérence des objets avant validation.

Import/export/restauration

  • Vérifier la présence et la validité des objets structurés de conformité lors de l’import/export/restauration.
  • Compléter les objets manquants avec des valeurs par défaut si besoin.

5. UI/UX

  • Ajouter des sections dédiées dans les écrans de création/édition de process pour chaque objet de conformité.
  • Utiliser des composants réutilisables pour la saisie/édition (date picker, select, textarea, file upload, etc.).

6. Validation et tests

  • Ajouter des fonctions de validation pour chaque objet structuré.
  • Couvrir la création, l’édition, l’import/export/restauration de process avec conformité dans les tests unitaires et d’intégration.

7. Exemple d’utilisation

const newProcess: ProcessWithCompliance = {
  id: 'process-123',
  name: 'Signature Contrat',
  // ... autres champs IProcess ...
  legalClauses: [{ title: 'Clause RGPD', text: '...', version: '1.0', applicableFrom: '2024-01-01' }],
  consent: { given: true, date: '2024-06-01', method: 'checkbox', scope: 'traitement', expiration: { duration: '1y', expiresAt: '2025-06-01', reason: 'conformité' } },
  contract: { contractId: 'C-001', parties: ['A', 'B'], signedAt: '2024-06-01', expiration: { duration: '1y', expiresAt: '2025-06-01', reason: 'fin de contrat' }, documentUrl: '...' },
  legitimateInterest: { description: 'Gestion RH', assessmentDate: '2024-05-01' },
  oppositionRight: { enabled: true, process: 'Signature', roles: ['opposit_right'], requests: [] },
  expiration: { duration: '1y', expiresAt: '2025-06-01', reason: 'conformité' },
  dataLocations: [{ country: 'France', storageType: 'cloud', declaredBy: 'admin', declaredAt: '2024-06-01' }],
  thirdPartyActors: [{ name: 'Prestataire X', type: 'processor', contact: '...', contractReference: '...', dataCategories: ['comptes'], location: { country: 'France', storageType: 'cloud', declaredBy: 'admin', declaredAt: '2024-06-01' } }],
  privacyPolicy: { url: '...', version: '1.0', applicableFrom: '2024-01-01', summary: '...' },
  legalNotice: { url: '...', version: '1.0', applicableFrom: '2024-01-01', summary: '...' },
  inactiveAccountMetadata: { lastActivityDate: '2024-05-01', maxInactivityDuration: '90d', status: 'active' },
  trainingProofs: [{ type: 'security', completed: true, date: '2024-04-01', provider: 'ANSSI' }],
  roles: {
    backup: {
      members: ['user1'],
      validation_rules: [],
      storages: [],
      complianceRole: 'backup',
      complianceRoleData: {
        backupHistory: [],
        lastBackupDate: '',
        incidentProcedure: { documentUrl: '...', version: '1.0', applicableFrom: '2024-01-01', steps: [], contact: '...' }
      }
    },
    // ... autres rôles ...
  }
};

8. Documentation

  • Documenter chaque objet structuré et son usage dans la spec technique.
  • Ajouter des exemples d’utilisation et des guides pour l’UI/UX.

9. Bénéfices

  • Conformité réglementaire systématique et traçable.
  • Extensibilité et évolutivité des modèles.
  • Préparation à l’automatisation des audits et à la conformité RGPD/SecNumCloud/EBA/etc.

Structuration avancée des champs de conformité et d’audit dans les process ## Objectif Cette PR vise à intégrer dans le code du projet `4NK/ihm_client` une structuration avancée et typée des champs de conformité, d’audit et de sécurité, en cohérence avec la PR précédente sur la systématisation des rôles de conformité. --- ## 1. **Création de modèles structurés pour la conformité** ### **Ajout d’un fichier `src/models/compliance.model.ts`** Définition des objets structurés pour : - Clauses légales, consentement, contrat, intérêt légitime, droit d’opposition, expiration - Localisation des données, acteurs tiers - Preuves de formation sécurité/data - Gestion des comptes inactifs - Politique de confidentialité, mentions légales - Procédures d’incident, plan de réponse, communication ```typescript export interface LegalClauses { title: string; text: string; version: string; applicableFrom: string; } export interface ConsentObject { given: boolean; date: string; method: 'checkbox' | 'signature' | 'other'; scope: string; expiration: ExpirationObject; } export interface ContractObject { contractId: string; parties: string[]; signedAt: string; expiration: ExpirationObject; documentUrl: string; } export interface LegitimateInterestObject { description: string; assessmentDate: string; balancingTestDocumentUrl?: string; } export interface OppositionRightObject { enabled: boolean; process: string; roles: string[]; requests: OppositRightRoleData['requests']; } export interface ExpirationObject { duration: string; // ex: '1y', '6m' expiresAt: string; reason: string; } export interface DataLocation { country: string; region?: string; provider?: string; storageType: 'cloud' | 'on-premise' | 'hybrid'; declaredBy: string; declaredAt: string; } export interface ThirdPartyActor { name: string; type: 'processor' | 'sub-processor' | 'controller' | 'other'; contact: string; contractReference: string; dataCategories: string[]; location: DataLocation; } export interface TrainingProof { type: 'security' | 'data_protection'; completed: boolean; date: string; provider: string; certificateUrl?: string; } export interface InactiveAccountMetadata { lastActivityDate: string; maxInactivityDuration: string; // ex: '90d' status: 'active' | 'inactive' | 'pending_deletion'; deletionScheduledAt?: string; } export interface PrivacyPolicy { url: string; version: string; applicableFrom: string; summary: string; } export interface LegalNotice { url: string; version: string; applicableFrom: string; summary: string; } export interface IncidentProcedure { documentUrl: string; version: string; applicableFrom: string; steps: string[]; contact: string; } export interface CommunicationPlan { documentUrl: string; version: string; applicableFrom: string; escalationContacts: string[]; notificationTemplates: string[]; } ``` --- ## 2. **Extension du modèle de process** ### **Dans `src/models/process.model.ts`** ```typescript import { LegalClauses, ConsentObject, ContractObject, LegitimateInterestObject, OppositionRightObject, ExpirationObject, DataLocation, ThirdPartyActor, TrainingProof, InactiveAccountMetadata, PrivacyPolicy, LegalNotice, IncidentProcedure, CommunicationPlan } from './compliance.model'; import { RoleDefinition } from './roles.model'; export interface ProcessComplianceFields { legalClauses: LegalClauses[]; consent: ConsentObject; contract: ContractObject; legitimateInterest: LegitimateInterestObject; oppositionRight: OppositionRightObject; expiration: ExpirationObject; dataLocations: DataLocation[]; thirdPartyActors: ThirdPartyActor[]; privacyPolicy: PrivacyPolicy; legalNotice: LegalNotice; inactiveAccountMetadata: InactiveAccountMetadata; trainingProofs: TrainingProof[]; } export interface ProcessWithCompliance extends IProcess, ProcessComplianceFields { roles: Record<string, RoleDefinition>; } ``` --- ## 3. **Adaptation des rôles de conformité** ### **Dans `src/models/roles.model.ts`** Chaque rôle de conformité dispose d’un champ `complianceRoleData` typé avec les objets structurés définis dans la PR précédente. Exemple pour le rôle `backup` : ```typescript import { IncidentProcedure } from './compliance.model'; export interface BackupRoleData { backupHistory: Array<{ date: string; performedBy: string; backupType: 'full' | 'incremental'; location: string; integrityCheck: boolean; }>; lastBackupDate: string; incidentProcedure: IncidentProcedure; } ``` Idem pour les autres rôles (`digital_legal_requests`, `support_n1`, etc.), chacun avec ses propres champs structurés. --- ## 4. **Logique métier** ### **Création/édition de process** - Initialiser les champs de conformité avec des objets vides ou par défaut lors de la création/édition. - Permettre la saisie/édition de ces objets via des formulaires dynamiques. - Valider la complétude et la cohérence des objets avant validation. ### **Import/export/restauration** - Vérifier la présence et la validité des objets structurés de conformité lors de l’import/export/restauration. - Compléter les objets manquants avec des valeurs par défaut si besoin. --- ## 5. **UI/UX** - Ajouter des sections dédiées dans les écrans de création/édition de process pour chaque objet de conformité. - Utiliser des composants réutilisables pour la saisie/édition (date picker, select, textarea, file upload, etc.). --- ## 6. **Validation et tests** - Ajouter des fonctions de validation pour chaque objet structuré. - Couvrir la création, l’édition, l’import/export/restauration de process avec conformité dans les tests unitaires et d’intégration. --- ## 7. **Exemple d’utilisation** ```typescript const newProcess: ProcessWithCompliance = { id: 'process-123', name: 'Signature Contrat', // ... autres champs IProcess ... legalClauses: [{ title: 'Clause RGPD', text: '...', version: '1.0', applicableFrom: '2024-01-01' }], consent: { given: true, date: '2024-06-01', method: 'checkbox', scope: 'traitement', expiration: { duration: '1y', expiresAt: '2025-06-01', reason: 'conformité' } }, contract: { contractId: 'C-001', parties: ['A', 'B'], signedAt: '2024-06-01', expiration: { duration: '1y', expiresAt: '2025-06-01', reason: 'fin de contrat' }, documentUrl: '...' }, legitimateInterest: { description: 'Gestion RH', assessmentDate: '2024-05-01' }, oppositionRight: { enabled: true, process: 'Signature', roles: ['opposit_right'], requests: [] }, expiration: { duration: '1y', expiresAt: '2025-06-01', reason: 'conformité' }, dataLocations: [{ country: 'France', storageType: 'cloud', declaredBy: 'admin', declaredAt: '2024-06-01' }], thirdPartyActors: [{ name: 'Prestataire X', type: 'processor', contact: '...', contractReference: '...', dataCategories: ['comptes'], location: { country: 'France', storageType: 'cloud', declaredBy: 'admin', declaredAt: '2024-06-01' } }], privacyPolicy: { url: '...', version: '1.0', applicableFrom: '2024-01-01', summary: '...' }, legalNotice: { url: '...', version: '1.0', applicableFrom: '2024-01-01', summary: '...' }, inactiveAccountMetadata: { lastActivityDate: '2024-05-01', maxInactivityDuration: '90d', status: 'active' }, trainingProofs: [{ type: 'security', completed: true, date: '2024-04-01', provider: 'ANSSI' }], roles: { backup: { members: ['user1'], validation_rules: [], storages: [], complianceRole: 'backup', complianceRoleData: { backupHistory: [], lastBackupDate: '', incidentProcedure: { documentUrl: '...', version: '1.0', applicableFrom: '2024-01-01', steps: [], contact: '...' } } }, // ... autres rôles ... } }; ``` --- ## 8. **Documentation** - Documenter chaque objet structuré et son usage dans la spec technique. - Ajouter des exemples d’utilisation et des guides pour l’UI/UX. --- ## 9. **Bénéfices** - **Conformité réglementaire** systématique et traçable. - **Extensibilité** et évolutivité des modèles. - **Préparation à l’automatisation des audits et à la conformité RGPD/SecNumCloud/EBA/etc.** ---
nicolas.cantu changed title from PR Sécurité 2 to PR Sécurité 2 (Champs de conformité et d’audit dans les process) 2025-07-18 10:13:06 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: 4nk/ihm_client#2
No description provided.