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ément | Valeur | Validé | Format |
|---|---|---|---|
| Pièce identité | CNI/CIP/PASSPORT | ✓ OCR Tesseract | Hash SHA-256 (no storage clair) |
| MSISDN | +229XXXXXXXXX | ✓ Format E.164 | Stocké DB chiffré |
| Nom complet | Prénom Nom | ✓ Field DB | Texte clair (pour ID légale) |
| Subscriber Ref | RGZ-0197979964 | ✓ Dérivé MSISDN | Visible abonné + rapports |
| UUID interne | UUID 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 → LoggedContrôle ARCEP : Vérifier ≥95% abonnés avec pièce ID validée.
-- 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.
| Champ | Type | Retention | Immuable | Source |
|---|---|---|---|---|
| subscriber_id | UUID | 12 mois | ✓ (PK FK) | DB inscription |
| subscriber_ref | TEXT | 12 mois | ✓ | Dérivé MSISDN |
| msisdn | E.164 | 12 mois | ✓ | Profil abonné |
| mac_address | XX:XX:XX:XX:XX:XX | 12 mois | ✓ | RADIUS User-Name |
| nas_id | TEXT | 12 mois | ✓ | RADIUS NAS-Identifier |
| session_start | TIMESTAMP UTC | 12 mois | ✓ | RADIUS Acct-Start-Time |
| session_stop | TIMESTAMP UTC | 12 mois | ✓ | RADIUS Acct-Stop-Time |
| bytes_in | BIGINT | 12 mois | ✓ | RADIUS Acct-Input-Octets |
| bytes_out | BIGINT | 12 mois | ✓ | RADIUS Acct-Output-Octets |
| duration_seconds | INT | 12 mois | ✓ | Calculé stop - start |
| is_active | BOOLEAN | Current | ✓ | RADIUS 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.
-- 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 purgeContrô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
| Trimestre | Période | Deadline Rapport | API Endpoint | Format |
|---|---|---|---|---|
| Q1 | 01/01 - 31/03 | 31/03 + 30j | GET /api/v1/reports/arcep/Q1/2026/pdf | PDF signé |
| Q2 | 01/04 - 30/06 | 30/06 + 30j | GET /api/v1/reports/arcep/Q2/2026/pdf | PDF signé |
| Q3 | 01/07 - 30/09 | 30/09 + 30j | GET /api/v1/reports/arcep/Q3/2026/pdf | PDF signé |
| Q4 | 01/10 - 31/12 | 31/12 + 30j | GET /api/v1/reports/arcep/Q4/2026/pdf | PDF 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
# 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
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é
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 compressedQuery 3 : Sites & NAS-IDs
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 revendeursQuery 4 : Immuabilité Logs
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-256Flux Conformité Abonné
Droit à l'Oubli (APDP)
Texte légal : Bénin APDP — Droit à l'oubli 90 jours après demande.
Implémentation RGZ :
- Abonné demande anonymisation : POST
/api/v1/apdp/deletion-request - Créer ticket support + enregistrement DB
- Verifier identité (OTP réconfirmation)
- Délai 90 jours pour traiter
- 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
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
# 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
# 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
# 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.
| Point | Vérification | Statut | Notes |
|---|---|---|---|
| 1. Identification abonnés | ≥90% avec pièce ID validée | ✓ 94.8% | OCR tesseract |
| 2. Traçabilité sessions | 12 mois retention, 100% logs | ✓ 100% | radius_sessions table |
| 3. Immuabilité données | SHA-256 append-only, chaîne intacte | ✓ 100% | logs immutables |
| 4. Chiffrement transport | TLS 1.3+ HTTPS | ✓ | Certificats Let's Encrypt |
| 5. Chiffrement DB | PostgreSQL encrypt at rest | ✓ | pgcrypto + AEAD |
| 6. APDP consentement | Explicit opt-in avant session | ✓ 98.2% | consent_given_at |
| 7. Droit oubli 90j | Processus anonymisation actif | ✓ | Task Celery quotidienne |
| 8. Rapports trimestriels | PDF signé, timeline respected | ✓ | API /api/v1/reports/arcep/* |
| 9. Incident reporting | P0/P1/P2 logs complets | ✓ | Incidents table + timeline |
| 10. SLA documentation | Uptime %, MTTR, seuils | ✓ 99.87% | Grafana + rapports |
| 11. Backup géographique | Réplique secondaire | ✓ | Backup auto 03:00 UTC |
| 12. Audit trail | Toutes actions enregistrées | ✓ | audit_trail table |
| 13. Personnel autorisé | Accès limité données sensibles | ✓ | JWT role-based |
| 14. Suppression avant délai | Zéro suppression <12 mois | ✓ | Purge 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