Conformite
Documentation des mesures de conformite et des standards de securite pour MyTelevision API.
Vue d'ensemble de la conformite
MyTelevision API est concue pour satisfaire les standards et reglementations de securite suivants :
| Standard | Statut | Description |
|---|---|---|
| GDPR | Conforme | Regulation europeenne protection des donnees |
| OWASP Top 10 | Implemente | Securite des applications web |
| SOC 2 Type II | En cours | Audit des controles de securite |
| PCI DSS | Partiel | Securite des cartes de paiement |
Conformite GDPR
Droits des personnes concernees
L'API fournit des endpoints pour supporter tous les droits GDPR :
| Droit | Endpoint | Description |
|---|---|---|
| Acces | GET /api/v2/users/me | Obtenir les donnees personnelles |
| Rectification | PATCH /api/v2/users/me | Mettre a jour les donnees |
| Effacement | POST /api/v2/account-deletion/request | Demander la suppression |
| Portabilite | GET /api/v2/users/me/export | Exporter les donnees |
| Restriction | POST /api/v2/users/me/restrict | Restreindre le traitement |
Droit a l'effacement (Suppression de compte)
Processus de suppression
- L'utilisateur demande la suppression -- Le statut passe a
PENDING_DELETION-- Email + Push envoyes - Date de suppression planifiee (date courante + 30 jours)
- L'utilisateur peut annuler a tout moment avant la date planifiee -- Email de restauration envoye
- Si l'utilisateur se connecte pendant la retractation, le compte est automatiquement restaure
- 3 jours avant la suppression -- Email et push d'avertissement envoyes (cron 1:00 AM)
- Apres 30 jours, le cron job execute la suppression effective -- Email final envoye avant anonymisation
Actions de suppression
- Toutes les sessions revoquees
- Tous les appareils marques comme revoques
- Tous les profils marques comme supprimes
- Email anonymise pour re-inscription (
deleted_<accountId>@deleted.local) - Compte soft-deleted avec timestamp
deletedAt
Politiques de retention des donnees
| Type de donnee | Retention | Justification |
|---|---|---|
| Donnees de compte | Jusqu'a suppression + 30j | Periode de retractation |
| Historique visionnage | 1 an | Amelioration du service |
| Logs de session | 90 jours | Monitoring de securite |
| Logs d'audit | 7 ans | Conformite legale |
| Enregistrements paiement | 7 ans | Exigences fiscales |
| Tickets support | 3 ans | Continuite de service |
Minimisation des donnees
// Ne collecter que les donnees necessaires
interface MinimalUserData {
email: string; // Requis pour le compte
// firstName, lastName - Optionnel
// phone - Uniquement si 2FA active
// address - Uniquement si livraison requise
}
// Anonymiser les donnees dans les logs
const sanitizedLog = {
userId: user.id,
email: maskEmail(user.email), // j***@example.com
ip: maskIp(request.ip), // 192.168.xxx.xxx
};
Format d'export des donnees
{
"exportDate": "2025-01-15T10:00:00Z",
"user": {
"id": "uuid",
"email": "[email protected]",
"firstName": "John",
"lastName": "Doe",
"createdAt": "2024-01-01T00:00:00Z"
},
"profiles": [],
"watchHistory": [],
"favorites": [],
"subscriptions": [],
"payments": []
}
OWASP Top 10 -- Mitigations detaillees
A01 : Broken Access Control
| Controle | Implementation |
|---|---|
| RBAC | Guards bases sur les roles sur tous les endpoints |
| Ownership | Validation de propriete des ressources |
| CORS | Whitelist stricte des origines |
| Rate limiting | Limites de requetes par profil |
// Exemple : Verification de propriete
@UseGuards(JwtAuthGuard, OwnershipGuard)
@Delete('profiles/:id')
async deleteProfile(@Param('id') id: string) {
// Seul le proprietaire peut supprimer
}
A02 : Cryptographic Failures
| Donnee | Protection |
|---|---|
| Mots de passe | bcrypt (cost 12) |
| Tokens JWT | HS256 |
| PINs | bcrypt (cost 10) |
| TLS | 1.3 force |
| Au repos | PostgreSQL TDE |
| Tokens stockes | SHA256 hash |
A03 : Injection
| Type | Prevention |
|---|---|
| SQL | Prisma ORM (requetes parametrees) |
| NoSQL | Validation de schema |
| Command | Aucune execution de shell |
| XSS | Reponses auto-echappees |
// Prisma previent l'injection SQL
const user = await prisma.user.findUnique({
where: { email: userInput }, // Parametre en securite
});
A04 : Insecure Design
| Principe | Implementation |
|---|---|
| Clean Architecture | Design en couches |
| Defauts securises | Refus par defaut |
| Defense en profondeur | Guards multiples |
| Threat modeling | Revues de securite |
A05 : Security Misconfiguration
| Domaine | Controle |
|---|---|
| Environnement | Valide au demarrage (Joi) |
| Dependances | npm audit dans le CI |
| Headers | Helmet.js active |
| Messages erreur | Pas de stack traces en production |
// Validation de l'environnement au demarrage
const configSchema = Joi.object({
JWT_SECRET: Joi.string().min(32).required(),
DATABASE_URL: Joi.string().uri().required(),
STREAMING_SIGNING_SECRET: Joi.string().min(32).required(),
// ...
});
A06 : Vulnerable Components
| Controle | Frequence |
|---|---|
| npm audit | Chaque build (CI) |
| Dependabot | PRs hebdomadaires |
| CodeQL SAST | Chaque PR |
| License check | Chaque PR |
A07 : Authentication Failures
| Controle | Implementation |
|---|---|
| Politique mot de passe | Exigences de complexite |
| Brute force | Verrouillage de compte |
| Token rotation | Rotation des refresh tokens |
| MFA | Support 2FA via Firebase |
A08 : Software and Data Integrity
| Controle | Implementation |
|---|---|
| Commits signes | Requis pour main |
| Code review | Approbations PR |
| CI/CD securise | GitHub Actions |
| Locks dependances | package-lock.json |
A09 : Security Logging and Monitoring
| Evenement | Logue |
|---|---|
| Tentatives auth | Oui |
| Changements permissions | Oui |
| Acces donnees | Oui |
| Erreurs | Oui |
| Actions admin | Oui |
A10 : SSRF Prevention
// Valider les URLs externes
const allowedDomains = ['api.tmdb.org', 'cdn.mytv.app'];
function validateExternalUrl(url: string): boolean {
const parsed = new URL(url);
return allowedDomains.includes(parsed.hostname);
}
PCI DSS -- Considerations
Reduction du perimetre
Le traitement des paiements est delegue a des providers conformes PCI :
- Stripe -- Traitement des cartes
- PayPal -- Paiement alternatif
- Apple Pay / Google Pay -- Paiements mobiles
Donnees traitees
| Donnee | Traitement |
|---|---|
| Numeros de carte | Jamais stockes (tokenises par Stripe) |
| CVV | Jamais transmis a nos serveurs |
| IDs de transaction | Stockes pour reference |
| Montants paiement | Stockes pour facturation |
Securite des webhooks
// Verifier les signatures des webhooks Stripe
@Post('webhooks/stripe')
async handleStripeWebhook(
@Body() payload: Buffer,
@Headers('stripe-signature') signature: string,
) {
try {
const event = stripe.webhooks.constructEvent(
payload,
signature,
process.env.STRIPE_WEBHOOK_SECRET,
);
// Traiter l'evenement verifie
} catch (err) {
throw new BadRequestException('Invalid signature');
}
}
Gestion des secrets
| Environnement | Methode |
|---|---|
| Developpement | Fichier .env (gitignored) |
| Staging | Docker secrets |
| Production | Docker secrets / Kubernetes secrets |
# Docker Compose Production
services:
api:
secrets:
- jwt_secret
- db_password
environment:
JWT_SECRET_FILE: /run/secrets/jwt_secret
secrets:
jwt_secret:
external: true
db_password:
external: true
Securite reseau
# Kubernetes Network Policy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-network-policy
spec:
podSelector:
matchLabels:
app: mytv-api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: nginx-ingress
ports:
- port: 3000
egress:
- to:
- podSelector:
matchLabels:
app: postgresql
ports:
- port: 5432
- to:
- podSelector:
matchLabels:
app: redis
ports:
- port: 6379
Tests de securite
Tests automatises
| Type de test | Outil | Frequence |
|---|---|---|
| SAST | CodeQL | Chaque PR |
| Dependances | npm audit | Chaque build |
| Secrets | gitleaks | Pre-commit |
| Licences | license-checker | Chaque PR |
Tests manuels
| Test | Frequence | Perimetre |
|---|---|---|
| Test de penetration | Annuel | API complete |
| Revue de code | Chaque PR | Code modifie |
| Revue architecture | Trimestriel | Design systeme |
Reponse aux incidents
Classification des incidents de securite
| Severite | Description | Temps de reponse |
|---|---|---|
| Critical | Data breach, RCE | 1 heure |
| High | Auth bypass, SQLi | 4 heures |
| Medium | XSS, Info disclosure | 24 heures |
| Low | Vulnerabilites mineures | 72 heures |
Processus de reponse aux incidents
- Detection -- Alerte du monitoring/rapport
- Triage -- Evaluer la severite et le perimetre
- Confinement -- Limiter les dommages
- Eradication -- Supprimer la menace
- Recuperation -- Restaurer les services
- Lessons Learned -- Post-mortem
Contacts d'urgence
| Role | Contact | Escalation |
|---|---|---|
| Security Lead | [email protected] | Immediat |
| DevOps On-call | [email protected] | 15 min |
| CTO | [email protected] | 30 min |
| Legal | [email protected] | Si requis |
Checklist de conformite
Avant deploiement
- Tous les secrets dans le secret manager
- TLS 1.3 configure
- Security headers actives
- Rate limiting actif
- Validation des entrees complete
- Gestion des erreurs aseptisee
- Logging configure
- Alertes de monitoring parametrees
- HTTPS force
- CORS correctement configure
- Base de donnees acces restreint
Revue periodique
- Hebdomadaire : Audit des dependances (npm audit)
- Mensuel : Verification de rotation des secrets
- Trimestriel : Revue des acces
- Trimestriel : Formation securite
- Semestriel : Exercice de reponse aux incidents
- Annuel : Test de penetration
- Annuel : Revue des politiques