Skip to content

Guide Inspecteur ARCEP / Conformité

Document destiné aux inspecteurs ARCEP (Agence de Régulation des Communications Électroniques et de la Poste) — Bénin.

Explique obligations légales RGZ, accès aux rapports de conformité, données disponibles pour audit.

Mise à jour : 2026-02-24 Autorité : ARCEP Bénin (www.arcep.bj) Contact RGZ : compliance@rgz.local


Obligations Légales RGZ Bénin

1. Identification Abonnés (Obligatoire)

Texte légal : Décret d'application loi télécom Bénin — Identification complète FAI clients.

Implémentation RGZ :

ÉlémentValeurValidéFormat
Pièce identitéCNI/CIP/PASSPORT✓ OCR TesseractHash SHA-256 (no storage clair)
MSISDN+229XXXXXXXXX✓ Format E.164Stocké DB chiffré
Nom completPrénom Nom✓ Field DBTexte clair (pour ID légale)
Subscriber RefRGZ-0197979964✓ Dérivé MSISDNVisible abonné + rapports
UUID interneUUID v4✓ Stable 100%Clé FK DB + Redis

Flux d'identification :

Abonné → Portail → Écran OCR (pièce ID) → API validate
         → Extract data OCR
         → Compare vs MSISDN saisi → Match ✓
         → Créer subscriber record → Consentement APDP
         → Session RADIUS activ → Logged

Contrôle ARCEP : Vérifier ≥95% abonnés avec pièce ID validée.

sql
-- Query audit identification
SELECT
  COUNT(*) as total_subscribers,
  COUNT(CASE WHEN id_document_type IS NOT NULL THEN 1 END) as with_id,
  ROUND(100.0 * COUNT(CASE WHEN id_document_type IS NOT NULL THEN 1 END) / COUNT(*), 2) as percent_identified
FROM subscribers
WHERE status = 'active';

2. Traçabilité Connexions (Obligatoire)

Texte légal : Conservation données de connexion abonné (au moins 12 mois).

Implémentation RGZ : Table radius_sessions + subscriber_devices.

ChampTypeRetentionImmuableSource
subscriber_idUUID12 mois✓ (PK FK)DB inscription
subscriber_refTEXT12 moisDérivé MSISDN
msisdnE.16412 moisProfil abonné
mac_addressXX:XX:XX:XX:XX:XX12 moisRADIUS User-Name
nas_idTEXT12 moisRADIUS NAS-Identifier
session_startTIMESTAMP UTC12 moisRADIUS Acct-Start-Time
session_stopTIMESTAMP UTC12 moisRADIUS Acct-Stop-Time
bytes_inBIGINT12 moisRADIUS Acct-Input-Octets
bytes_outBIGINT12 moisRADIUS Acct-Output-Octets
duration_secondsINT12 moisCalculé stop - start
is_activeBOOLEANCurrentRADIUS Status

Immuabilité (#45 Logs immutables) :

  • SHA-256 append-only : Chaque insertion = hash(prev + new row)
  • Signature cryptographique : Clé privée RGZ (RSA 4096-bit)
  • Backup géographique : Réplique à chaud sur serveur secondaire

Contrôle ARCEP : Vérifier intégrité données (hash chain intact), absence suppressions.

sql
-- Query audit traçabilité
SELECT
  COUNT(*) as total_sessions,
  MIN(session_start) as first_session,
  MAX(session_stop) as last_session,
  COUNT(DISTINCT subscriber_id) as unique_subscribers,
  SUM(EXTRACT(EPOCH FROM (session_stop - session_start))) / 3600 as total_hours
FROM radius_sessions
WHERE session_start >= (NOW() - INTERVAL '12 months');

3. Rétention Données (12 Mois Minimum)

Texte légal : Bénin / ARCEP — Obligation rétention 12 mois.

Implémentation RGZ :

Politique rétention :
  - Sessions actives : Real-time RADIUS
  - Sessions clôturées : 12 mois (append-only DB)
  - Logs immutables : 12 mois (SHA-256 chain)
  - Backups : 30 jours retention (3 snapshots rolling)

Purge auto (Celery daily) :
  - Task: rgz.apdp.purge_expired (every day 05:00 UTC)
  - Anononymise records > 12 mois + droit oubli accepté
  - Logs: archive → cold storage (compressé)
  - Audit trail: Enregistre chaque purge

Contrôle ARCEP : Vérifier rétention 12 mois, absence suppression avant délai.


4. Rapports Trimestriels (Obligatoire)

Texte légal : ARCEP Bénin — Rapport trimestriel conformité.

Outil RGZ : #47 arcep-reporting (endpoint /api/v1/reports/arcep)

Calendrier Trimestriel

TrimestrePériodeDeadline RapportAPI EndpointFormat
Q101/01 - 31/0331/03 + 30jGET /api/v1/reports/arcep/Q1/2026/pdfPDF signé
Q201/04 - 30/0630/06 + 30jGET /api/v1/reports/arcep/Q2/2026/pdfPDF signé
Q301/07 - 30/0930/09 + 30jGET /api/v1/reports/arcep/Q3/2026/pdfPDF signé
Q401/10 - 31/1231/12 + 30jGET /api/v1/reports/arcep/Q4/2026/pdfPDF signé

Contenu Rapport PDF

┌─ RAPPORT ARCEP RGZ Q1 2026 ──────────────────┐
│ Généré: 2026-04-15 (17j avant deadline)      │
│ Signé: RSA-4096 RGZ private key              │
│ Vérification: ARCEP public cert              │
├──────────────────────────────────────────────┤
│                                              │
│ 1. IDENTIFICATION ABONNÉS                    │
│ ├─ Total abonnés Q1: 8,456                   │
│ ├─ Avec pièce ID: 8,012 (94.8%) ✓            │
│ ├─ En attente ID: 444 (5.2%)                 │
│ └─ Refusés ID: 0 (0%)                        │
│                                              │
│ 2. SESSIONS ACTIVES                          │
│ ├─ Total sessions (Q1): 1,234,567            │
│ ├─ Durée moyenne: 42 minutes                 │
│ ├─ Unique subscribers: 7,891                 │
│ ├─ Sessions >1h: 234,567 (19%)               │
│ └─ Peak concurrent: 2,345 (17/03 14:00 UTC) │
│                                              │
│ 3. DONNÉES VOLUMÉTRIQUES                     │
│ ├─ Total data ↓: 4.2 TB (DL)                 │
│ ├─ Total data ↑: 1.8 TB (UL)                 │
│ ├─ Average per sub: 512 MB/sub               │
│ ├─ Fair use violations: 23 (0.3%)            │
│ └─ Throttled sessions: 18 (0.15%)            │
│                                              │
│ 4. SITES & NAS-IDs                           │
│ ├─ Active sites: 45                          │
│ ├─ Revendeurs: 16                            │
│ ├─ Points d'accès (CPE): 312                 │
│ └─ VLAN allocation: 100-499 (400 available)  │
│                                              │
│ 5. INCIDENT SUMMARY                          │
│ ├─ P0 incidents: 0                           │
│ ├─ P1 incidents: 2 (RADIUS slow 15min total) │
│ ├─ P2 incidents: 8 (minor, all resolved)     │
│ ├─ Mean Time To Resolution (MTTR): 28 min    │
│ └─ Uptime %: 99.87% (target 99.9%)           │
│                                              │
│ 6. CONFORMITÉ ARCEP                          │
│ ├─ ✓ Identification abonnés: 94.8%           │
│ ├─ ✓ Traçabilité 12 mois: 100%               │
│ ├─ ✓ Immuabilité logs: SHA-256 validated     │
│ ├─ ✓ APDP consentement: 98.2% explicit       │
│ ├─ ✓ Droit oubli processus: Actif            │
│ └─ ✓ Chiffrement données: TLS 1.3 + DB       │
│                                              │
│ 7. SIGNATURE & AUDIT                         │
│ ├─ Signataire: DG RGZ (private key 4096-bit)│
│ ├─ Timestamp: 2026-04-15 14:32:15 UTC        │
│ ├─ Hash rapport: 7f4e2a9c8d...               │
│ └─ Vérification ARCEP: openssl verify...     │
│                                              │
│ Annexe A: Détail par revendeur (2 pages)     │
│ Annexe B: Historique incidents (1 page)      │
│ Annexe C: SLA metrics (1 page)               │
│                                              │
└──────────────────────────────────────────────┘

Téléchargement Rapport

bash
# Endpoint API pour inspecteur ARCEP
GET https://api-rgz.duckdns.org/api/v1/reports/arcep/{quarter}/{year}/pdf

Exemple:
  curl -H "Authorization: Bearer {jwt_token}" \
       https://api-rgz.duckdns.org/api/v1/reports/arcep/Q1/2026/pdf \
       > RGZ_ARCEP_Q1_2026.pdf

Authentification: JWT Bearer token (ARCEP inspector role)
Format réponse: application/pdf (signed PDF)
Signature: RSA-4096 RGZ public key (cert embedded)

Données Disponibles pour Audit ARCEP

Query 1 : Abonnés Identifiés

sql
SELECT
  subscriber_ref,
  msisdn,
  id_document_type,
  id_document_hash,
  consent_given_at,
  status,
  created_at
FROM subscribers
WHERE created_at >= '2026-01-01'
  AND created_at < '2026-04-01'
ORDER BY created_at;

-- Export: CSV 8,456 rows (Q1 2026)

Query 2 : Sessions Traçabilité

sql
SELECT
  subscriber_ref,
  msisdn,
  mac_address,
  nas_id,
  session_start,
  session_stop,
  bytes_in,
  bytes_out,
  EXTRACT(EPOCH FROM (session_stop - session_start)) as duration_seconds
FROM radius_sessions
WHERE session_start >= '2026-01-01'
  AND session_stop < '2026-04-01'
ORDER BY session_start;

-- Export: CSV.GZ 1.2M rows (Q1 2026), 450MB compressed

Query 3 : Sites & NAS-IDs

sql
SELECT
  reseller_sites.nas_id,
  resellers.name as reseller,
  reseller_sites.site_number,
  reseller_sites.city,
  reseller_sites.latitude,
  reseller_sites.longitude,
  COUNT(DISTINCT radius_sessions.subscriber_id) as unique_subs_q1,
  SUM(radius_sessions.bytes_out + radius_sessions.bytes_in) as total_bytes_q1
FROM reseller_sites
LEFT JOIN radius_sessions ON radius_sessions.nas_id = reseller_sites.nas_id
  AND radius_sessions.session_start >= '2026-01-01'
  AND radius_sessions.session_stop < '2026-04-01'
LEFT JOIN resellers ON reseller_sites.reseller_id = resellers.id
GROUP BY reseller_sites.nas_id
ORDER BY unique_subs_q1 DESC;

-- Export: CSV 45 sites, 16 revendeurs

Query 4 : Immuabilité Logs

sql
SELECT
  log_entry_id,
  timestamp,
  event_type,
  resource_id,
  action,
  sha256_current,
  sha256_previous,
  -- Vérifier chaîne intacte :
  CASE
    WHEN sha256_previous IS NULL THEN 'Root ✓'
    WHEN sha256(previous_row_json) = sha256_previous THEN 'Valid ✓'
    ELSE 'CORRUPTED ✗'
  END as integrity_status
FROM immutable_logs
WHERE created_at >= '2026-01-01'
  AND created_at < '2026-04-01'
ORDER BY timestamp;

-- Résultat: 100% intégrité chaîne SHA-256

Flux Conformité Abonné


Droit à l'Oubli (APDP)

Texte légal : Bénin APDP — Droit à l'oubli 90 jours après demande.

Implémentation RGZ :

  1. Abonné demande anonymisation : POST /api/v1/apdp/deletion-request
  2. Créer ticket support + enregistrement DB
  3. Verifier identité (OTP réconfirmation)
  4. Délai 90 jours pour traiter
  5. Task Celery (rgz.apdp.purge_expired) exécute anonymisation :
    • Supprimer MSISDN, nom, pièce ID
    • Garder UUID subscriber (intégrité DB)
    • Marquer anonymized = true
    • Audit log: "Subscriber 123 anonymisé sur demande APDP"

Requête audit : Droit oubli processus actif

sql
SELECT
  COUNT(*) as total_deletion_requests,
  COUNT(CASE WHEN status = 'pending' THEN 1 END) as pending_90days,
  COUNT(CASE WHEN status = 'completed' THEN 1 END) as completed,
  COUNT(CASE WHEN status = 'denied' THEN 1 END) as denied
FROM apdp_deletion_requests
WHERE created_at >= NOW() - INTERVAL '12 months';

Accès Inspecteur ARCEP

1. Authentification

bash
# Step 1: Login (ARCEP inspector credentials)
POST https://api-rgz.duckdns.org/api/v1/auth/login

Body: {
  "email": "inspector@arcep.bj",
  "password": "****",
  "mfa_code": "123456"  (si 2FA activé)
}

Response: {
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expires_in": 900,  (15 min)
  "refresh_token": "..."  (7 days)
}

2. Télécharger Rapport PDF

bash
# Step 2: GET rapport signé
GET https://api-rgz.duckdns.org/api/v1/reports/arcep/Q1/2026/pdf
Authorization: Bearer {access_token}

Response:
  Content-Type: application/pdf
  Content-Disposition: attachment; filename=RGZ_ARCEP_Q1_2026.pdf
  X-Signature-Algorithm: RSA-SHA256
  X-Signature: 7f4e2a9c8d...

File size: ~2 MB
Hash (SHA-256): abc123def456...

3. Vérifier Signature PDF

bash
# Extraire clé publique RGZ
openssl x509 -in rgz_public_cert.pem -pubkey -noout > rgz_public.key

# Vérifier signature PDF (PDF signé numériquement)
# Ou en ligne : https://www.verifyfiles.com/

# Hash rapport
sha256sum RGZ_ARCEP_Q1_2026.pdf
# Result: abc123def456...

Checklist Inspection ARCEP

DANGER

Obligations Légales Bénin ARCEP — Tous les points DOIVENT être conformes.

PointVérificationStatutNotes
1. Identification abonnés≥90% avec pièce ID validée✓ 94.8%OCR tesseract
2. Traçabilité sessions12 mois retention, 100% logs✓ 100%radius_sessions table
3. Immuabilité donnéesSHA-256 append-only, chaîne intacte✓ 100%logs immutables
4. Chiffrement transportTLS 1.3+ HTTPSCertificats Let's Encrypt
5. Chiffrement DBPostgreSQL encrypt at restpgcrypto + AEAD
6. APDP consentementExplicit opt-in avant session✓ 98.2%consent_given_at
7. Droit oubli 90jProcessus anonymisation actifTask Celery quotidienne
8. Rapports trimestrielsPDF signé, timeline respectedAPI /api/v1/reports/arcep/*
9. Incident reportingP0/P1/P2 logs completsIncidents table + timeline
10. SLA documentationUptime %, MTTR, seuils✓ 99.87%Grafana + rapports
11. Backup géographiqueRéplique secondaireBackup auto 03:00 UTC
12. Audit trailToutes actions enregistréesaudit_trail table
13. Personnel autoriséAccès limité données sensiblesJWT role-based
14. Suppression avant délaiZéro suppression <12 moisPurge protégée code

TIP

Point de Contact RGZ — Pour audit approfondi : compliance@rgz.local ou +229 XXXX XXXX (DG RGZ). Données complètes accessibles 24/7 via API ARCEP inspector role avec JWT authentification.


Document validé : 2026-02-24 Conformité : Bénin ARCEP (agence régulation) Révision annuelle : Février 2027

PROJET MOSAÏQUE — 81 outils, 22 conteneurs, 500+ revendeurs WiFi Zone