Skip to content

About

Backend REST API simulating a real-world cybersecurity incident management system. Built with Flask, PostgreSQL, JWT auth, RBAC, Docker, and tested at 97%.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Incident Tracker API

API REST de gestion d'incidents de sécurité informatique. Les utilisateurs s'authentifient via JWT, signalent des incidents, les consultent et les gèrent selon leur rôle.


Stack technique

Élément Choix
Langage Python 3.11
Framework Flask + Flask-smorest
Base de données PostgreSQL
ORM SQLAlchemy 2.x
Auth JWT (flask-jwt-extended)
Tests pytest (97% de couverture)
Conteneurisation Docker + docker-compose
Doc API Swagger UI via flask-smorest

Lancer le projet avec Docker

Prérequis

  • Docker
  • Docker Compose

Démarrage

# Copier les variables d'environnement
cp .env.example .env

# Lancer l'API et la base de données
docker-compose up --build

L'API sera disponible sur http://localhost:5000.
La documentation Swagger est accessible sur http://localhost:5000/swagger-ui.


Variables d'environnement (.env)

Variable Description Défaut
FLASK_ENV Environnement Flask development
SECRET_KEY Clé secrète Flask À changer
DATABASE_URL URL PostgreSQL postgresql://postgres:postgres@db:5432/incident_tracker
JWT_SECRET_KEY Clé de signature JWT À changer
JWT_ACCESS_TOKEN_EXPIRES Durée de vie du token (secondes) 3600 (1h)

Système de rôles

Rôle Lire les incidents Créer / Modifier Supprimer Stats
viewer ✗ ✗ ✗ ✗
analyst ✓ ✓ ✗ ✗
admin ✓ ✓ ✓ ✓

Un incident avec le statut closed ne peut plus être modifié.


Endpoints

Auth — /api/auth

Méthode Route Description Auth
POST /api/auth/register Créer un compte Non
POST /api/auth/login Obtenir un JWT Non
POST /api/auth/logout Invalider le token Oui
GET /api/auth/me Profil connecté Oui

Incidents — /api/incidents

Méthode Route Description Rôle
GET /api/incidents/ Lister (filtres + pagination) analyst, admin
POST /api/incidents/ Créer un incident analyst, admin
GET /api/incidents/<id> Détail analyst, admin
PATCH /api/incidents/<id> Modifier analyst, admin
DELETE /api/incidents/<id> Supprimer admin
GET /api/incidents/stats Statistiques globales admin

Filtres disponibles sur GET /api/incidents/

?severity=high|medium|low|critical
?status=open|in_progress|resolved|closed
?category=malware
?page=1&per_page=20

Exemples curl

Inscription

curl -X POST http://localhost:5000/api/auth/register \
  -H "Content-Type: application/json" \
  -d '{"username": "alice", "email": "alice@example.com", "password": "secret123", "role": "analyst"}'

Connexion

curl -X POST http://localhost:5000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "alice@example.com", "password": "secret123"}'

Créer un incident

curl -X POST http://localhost:5000/api/incidents/ \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"title": "Ransomware détecté", "severity": "critical", "category": "malware"}'

Lister les incidents ouverts de sévérité high

curl "http://localhost:5000/api/incidents/?severity=high&status=open&page=1&per_page=10" \
  -H "Authorization: Bearer <token>"

Modifier le statut d'un incident

curl -X PATCH http://localhost:5000/api/incidents/1 \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"status": "in_progress", "assigned_to": 2}'

Statistiques (admin uniquement)

curl http://localhost:5000/api/incidents/stats \
  -H "Authorization: Bearer <admin_token>"

Lancer les tests

# Sans Docker
pip install -r requirements.txt
pytest

# Rapport de couverture
pytest --cov=app --cov-report=html

Structure du projet

incident-tracker-api/
├── app/
│   ├── __init__.py          # Factory Flask, extensions
│   ├── config.py            # Config production / test
│   ├── models/
│   │   ├── user.py          # Modèle User + RoleEnum
│   │   └── incident.py      # Modèle Incident + enums
│   ├── routes/
│   │   ├── auth.py          # /api/auth/*
│   │   └── incidents.py     # /api/incidents/*
│   └── utils/
│       └── security.py      # Hachage bcrypt, décorateur roles_required
├── tests/
│   ├── conftest.py          # Fixtures pytest
│   ├── test_auth.py         # Tests authentification
│   └── test_incidents.py    # Tests CRUD incidents
├── sql/
│   └── init.sql             # Référence schéma SQL
├── .env.example
├── docker-compose.yml
├── Dockerfile
├── entrypoint.sh
├── pytest.ini
├── requirements.txt
└── wsgi.py

About

Backend REST API simulating a real-world cybersecurity incident management system. Built with Flask, PostgreSQL, JWT auth, RBAC, Docker, and tested at 97%.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages