Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
185 changes: 171 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,178 @@
# UR1/ESIR DevOps Course
This repository contains the material and content of the DevOps course at the engineering school ESIR of the University of Rennes 1.
# Pull request DevOps & Security
Réalisé par : **OUATTARA Daouda**, **GUEI Floraine**, **KONE Séfihait**, **DURAND Corentin**

## Year 2024-2025
Ce projet a pour objectif de mettre en pratique les principes DevOps et sécurité autour d'une architecture web composée d’un frontend Angular et d’un backend Quarkus, interconnectés à travers une API, et orchestrés à l’aide de Docker Compose.

### Scheduling
Dans une logique de sécurité et de bonnes pratiques DevSecOps, l’ensemble de l’infrastructure a été renforcé par :

- Introduction to the course and DevOps: March 25th, 2025
- Quick overview of DevSecOps and MLSecOps: May the 23rd, 2025
- Final presentations: May 16th, 2025 (8h-11h)
- **La conteneurisation complète** des services (Angular, Quarkus, MySQL, Etherpad, SMTP) via Docker
- **L’analyse de vulnérabilités** sur les images Docker avec [Trivy](https://github.com/aquasecurity/trivy)
- **L’audit de sécurité des conteneurs** avec [InSpec](https://www.inspec.io/)
- **La gestion des secrets et des variables sensibles** avec [HashiCorp Vault](https://www.vaultproject.io/) (envisagée ou intégrée selon l'étape du projet)

### Material
## La conteneurisation complète

All the material can be found on the Moodle module dedicated to this class.

### Tutorial activities
L'ensemble de l'architecture a été entièrement conteneurisé à l’aide de **Docker** et orchestré via **Docker Compose**, afin de garantir la portabilité, la cohérence des environnements, et une facilité de déploiement en local ou sur serveur.

Students have to choose a system with micro-services to apply some DevOps related tools on it;
if they cannot think of such system/project, they can go to the [doodle](https://github.com/barais/doodlestudent) github page and use it.
You can also find a "detailled" pull request to launch the application on "dev mode".
This is the kind of pull requests that is expected to be __sent on THIS repo__ for the evaluation of your technical realisation
### Services conteneurisés

| Service | Description | Image utilisée | Port exposé |
|-------------|-----------------------------------------|-------------------------------------|-------------|
| **frontend** | Application Angular (mode dev) | `node:16` | `4200` |
| **backend** | Application Quarkus (mode dev) | `maven:3.9-eclipse-temurin-17` | `8080` |
| **database** | Base de données relationnelle MySQL | `mysql:8` | Interne |
| **etherpad** | Éditeur collaboratif de texte | `etherpad/etherpad` | `9001` |
| **smtp** | Serveur SMTP de test (mail local) | `bytemark/smtp` | Interne |

---

### Réseau et isolation

Tous les services sont interconnectés au sein d’un **réseau Docker privé** nommé `backend` :
- Ce réseau isole les services des appels extérieurs non désirés.
- Seuls les ports utiles (4200 pour Angular, 8080 pour Quarkus) sont exposés à l’extérieur.
- MySQL, SMTP et Etherpad sont accessibles uniquement **par les autres services**, pas depuis l'extérieur.
- **Important :** dans le code (Angular et Quarkus), les appels à localhost ont été remplacés par les noms des services Docker (ex : http://backend:8080, http://etherpad:9001), car localhost dans un conteneur ne pointe pas vers les autres services, mais vers lui-même.

---

### Configuration des services

- Le **frontend Angular** est lancé via `ng serve` dans le conteneur, avec `--host 0.0.0.0` pour autoriser l’accès depuis l’extérieur.
- Le **backend Quarkus** est exécuté en mode `dev` via `./mvnw quarkus:dev`, avec `quarkus.http.host=0.0.0.0` configuré dans `application.properties`. Un `Dockerfile.dev` a été créé dans le dossier `/api` pour permettre l'exécution de Quarkus en mode développement dans un conteneur. Il utilise l’image Maven avec JDK 17.
- Les **fichiers `.env`** permettent de centraliser les variables sensibles (par ex. `DB_USER`, `DB_PASS`, `MYSQL_ROOT_PASSWORD`).

---

### Docker Compose

Tous les services sont définis dans un fichier `docker-compose.yaml` (situé dans le dossier `/api`) et peuvent être lancés simultanément avec :

```bash
docker compose up --build
```

## L’analyse de vulnérabilités

Afin de renforcer la sécurité de l'infrastructure conteneurisée, l'outil [Trivy](https://github.com/aquasecurity/trivy) a été utilisé pour détecter les vulnérabilités connues (CVE) dans :

- les **images Docker utilisées** (OS + librairies)
- les **fichiers de configuration** comme les `Dockerfile`
- les **dépendances applicatives** (Node.js pour Angular, Java/Maven pour Quarkus)

---

### Scan d'images Docker

Trivy permet de scanner les images locales créées par Docker Compose :

```bash
# Exemple : scanner l'image backend (nom réel selon docker images)
trivy image backend
```
Il retourne un rapport clair classant les vulnérabilités par sévérité (LOW, MEDIUM, HIGH, CRITICAL).

## L’audit de sécurité des conteneurs

Dans une logique DevSecOps, l’outil [InSpec](https://www.inspec.io/) a été utilisé pour auditer les conteneurs Docker au niveau :
- des utilisateurs (droits root, utilisateurs non privilégiés)
- des services exposés
- des ports écoutés
- des fichiers critiques (droits, existence)

InSpec permet de définir des **tests de sécurité sous forme de code**, et de les exécuter régulièrement sur les conteneurs.

---

### Création du profil InSpec

Un profil personnalisé a été créé à l’aide de la commande suivante (via Docker) :

```bash
docker run --rm -it \
-v "$PWD":/share \
chef/inspec \
init profile /share/container-security
```

### Exécution d’un profil InSpec sur un conteneur Docker

Pour exécuter les audits de sécurité InSpec sur les conteneurs (comme `backend`), il faut connaitre le nom du conteneur et qu'il soit lancé.

```bash
docker run --rm -it \
-v "$PWD":/share \
-v /var/run/docker.sock:/var/run/docker.sock \
chef/inspec \
exec /share/container-security -t docker://backend
```

Remplace `backend` par le nom réel du conteneur Docker que tu veux auditer (visible avec `docker ps`)



## La gestion des secrets avec HashiCorp Vault

Pour sécuriser les secrets et les variables sensibles, [HashiCorp Vault](https://www.vaultproject.io/) a été intégré dans l’infrastructure. Vault permet de centraliser et de gérer les secrets de manière sécurisée, tout en limitant leur exposition dans les fichiers de configuration.

---

### Intégration de Vault

- Un conteneur Vault a été ajouté à l’architecture Docker Compose.
- Les secrets sensibles, tels que les identifiants de base de données (`DB_USER`, `DB_PASS`) et d'autres clés sensibles, sont destinés à être gérés via Vault.
- Actuellement, seule la clé `API_KEY` a été stockée dans Vault pour des tests, en utilisant la commande suivante :

```bash
docker exec -e VAULT_ADDR=http://127.0.0.1:8200 \
-e VAULT_SKIP_VERIFY=true \
-e VAULT_TOKEN=root \
-it vault \
vault kv put secret/api API_KEY=your_api_key
```

- Les services peuvent accéder aux secrets via l’API de Vault, en utilisant des tokens d’authentification.

---

### Limites actuelles

- **Fichier de secret `API_KEY` non supprimé :** Bien que la clé `API_KEY` ait été stockée dans Vault, le fichier contenant cette clé n’a pas encore été supprimé. Cela nécessite une adaptation complète du code pour utiliser exclusivement Vault.
- **Secrets volatils :** Les secrets stockés dans Vault disparaissent lorsque les conteneurs sont redémarrés. Cela est dû à l’utilisation d’un backend de stockage en mémoire (non persistant). Une solution envisagée est de configurer un backend persistant, comme un stockage de fichiers ou une base de données.
- **Utilisation limitée :** Pour l’instant, seul le secret `API_KEY` est géré dans Vault. L’objectif est d’étendre cette gestion à tous les secrets sensibles de l’infrastructure.

---

### Commandes utiles pour Vault

Pour initialiser et déverrouiller Vault après le démarrage du conteneur :

```bash
# Initialiser Vault
vault operator init

# Déverrouiller Vault
vault operator unseal
```

Pour ajouter un secret dans Vault :

```bash
vault kv put secret/myapp API_KEY=your_api_key
```

Pour récupérer un secret depuis Vault :

```bash
vault kv get secret/myapp
```

---

### Améliorations futures

- Supprimer complètement les fichiers contenant des secrets sensibles, comme `API_KEY`, et migrer leur gestion vers Vault.
- Configurer un backend persistant pour Vault afin de conserver les secrets même après un redémarrage des conteneurs.
- Étendre l’utilisation de Vault pour gérer tous les secrets sensibles de l’infrastructure, tels que les identifiants de base de données et autres clés critiques.
- Automatiser l’initialisation et le déverrouillage de Vault pour simplifier son utilisation dans l’environnement Docker.
21 changes: 21 additions & 0 deletions README_old.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# UR1/ESIR DevOps Course
This repository contains the material and content of the DevOps course at the engineering school ESIR of the University of Rennes 1.

## Year 2024-2025

### Scheduling

- Introduction to the course and DevOps: March 25th, 2025
- Quick overview of DevSecOps and MLSecOps: May the 23rd, 2025
- Final presentations: May 16th, 2025 (8h-11h)

### Material

All the material can be found on the Moodle module dedicated to this class.

### Tutorial activities

Students have to choose a system with micro-services to apply some DevOps related tools on it;
if they cannot think of such system/project, they can go to the [doodle](https://github.com/barais/doodlestudent) github page and use it.
You can also find a "detailled" pull request to launch the application on "dev mode".
This is the kind of pull requests that is expected to be __sent on THIS repo__ for the evaluation of your technical realisation
35 changes: 35 additions & 0 deletions doodle/README.french.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Doodle in quarkus

Ce repository est une application de type doodle développée avec quarkus.io pour le back et angular pour le front.

Elle initialise automatiquement un pad pour la réunion et un salon de discussion.

Le but est de faire travailler les étudiants sur la partie déploiement de ce type d'application dite cloud native.

Votre mission est de mettre en production une telle application en permettant
- qu'à chaque commit sur ce repository, si les tests passent, alors nous déployons automatiquement une nouvelle version dans un contexte (Continuous Deployement)
- que l'application doit être monitorer finement.
- que l'application redémarre automatiquement en cas de crash du serveur ou de crash d'un des services de l'application.
- que Les accès doivent http doivent utiliser https.


Une démo de l'application est accessible [ici](https://doodle.diverse-team.fr).

- Voici une petite [vidéo](https://drive.google.com/file/d/1GQbdgq2CHcddTlcoHqM5Zc8Dw5o_eeLg/preview) de présentation des fonctionnalités de l'application.
- Voici une petite [vidéo](https://drive.google.com/file/d/1l5UAsU5_q-oshwEW6edZ4UvQjN3-tzwi/preview) de présentation de l'architecture de l'application.
- Voici une petite [vidéo](https://drive.google.com/file/d/1jxYNfJdtd4r_pDbOthra360ei8Z17tX_/preview) de revue de code de l'application.

Un descriptif du cours, des TPs et des étapes du projet est lui accessible [ici](https://hackmd.diverse-team.fr/s/SJqu5DjSD)

## Prérequis

Vérifiez que vous avez installé sur votre machine de développement :

- Java (JDK) 11+, e.g. [Oracle JSE](https://www.oracle.com/java/technologies/javase-jdk11-downloads.html) (avec la variable d'environnement JAVA_HOME bien configurée)
- [Maven](http://maven.apache.org/install.html)
- [Git](https://git-scm.com/download/)
- [Docker](https://docs.docker.com/engine/install/) (au moins version 19.03.0, 20.10 préféré)
- Docker compose ([Compose V2](https://docs.docker.com/compose/cli-command/#installing-compose-v2) préféré, nécésité de lancer des configuration compose en version 3.8)
- [Node](https://nodejs.org/en/) au moins version 16
- npm au moins version 8 (installé avec Node)
- Un IDE Java (Eclipse, IntelliJ IDEA, NetBeans, VS Code, Xcode, etc.)
31 changes: 31 additions & 0 deletions doodle/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Remote meetings planning

This project is used in a course on the *ops* part at the [University of Rennes](https://www.univ-rennes1.fr/), France. It is a kind of doodle clone developed in so-called "cloud-native" technologies in order to allow students to work on a continuous deployment chain in a containerized environment. Among the feature, the application automatically initializes a pad for the meeting and a chat room for the meeting participants.

- The [back](https://github.com/barais/doodlestudent/tree/main/api) is developed using the [quarkus.io](https://quarkus.io/) framework.
- The [front](https://github.com/barais/doodlestudent/tree/main/front) is developed in [angular](https://angular.io/) using the [primeng](https://www.primefaces.org/primeng/) angular UI component library and the [fullcalendar](https://fullcalendar.io/) graphical component.

A demo of the application is available [here](https://doodle.diverse-team.fr/).

Three videos (in french) are available. They present:
- the [main application feature](https://drive.google.com/file/d/1GQbdgq2CHcddTlcoHqM5Zc8Dw5o_eeLg/preview),
- its [architecture](https://drive.google.com/file/d/1l5UAsU5_q-oshwEW6edZ4UvQjN3-tzwi/preview)
- and a [short code review](https://drive.google.com/file/d/1jxYNfJdtd4r_pDbOthra360ei8Z17tX_/preview) .

For french native speaker that wants to follow the course. The course web page is available [here](https://hackmd.diverse-team.fr/s/SJqu5DjSD).

## Requirments

Verify that these are installed on your computer :

- Java (JDK) 11+, e.g. [Oracle JSE](https://www.oracle.com/java/technologies/javase-jdk11-downloads.html) (with the JAVA_HOME environment variable correctly set)
- [Maven](http://maven.apache.org/install.html)
- [Git](https://git-scm.com/download/)
- [Docker](https://docs.docker.com/engine/install/) (at least version 19.03.0, 20.10 preferred)
- Docker compose ([Compose V2](https://docs.docker.com/compose/cli-command/#installing-compose-v2) preferred, should be able to run 3.8 compose files)
- [Node](https://nodejs.org/en/) at least version 16
- npm at least version 8 (installed with Node)
- A Java IDE (Eclipse, IntelliJ IDEA, NetBeans, VS Code, Xcode, etc.)

If you are on Windows, Docker can not mount files outside your user folder (Unless an absolute path is provided).
Please, clone the doodle in the user folder or change the compose file to correctly mount the etherpad APIKEY.txt
5 changes: 5 additions & 0 deletions doodle/api/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
*
!target/*-runner
!target/*-runner.jar
!target/lib/*
!target/quarkus-app/*
4 changes: 4 additions & 0 deletions doodle/api/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=tlc
MYSQL_USER=tlc
MYSQL_PASSWORD=tlc
37 changes: 37 additions & 0 deletions doodle/api/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
release.properties
.mvn/wrapper/maven-wrapper.jar
# Eclipse
.project
.classpath
.settings/
bin/

# IntelliJ
.idea
*.ipr
*.iml
*.iws

# NetBeans
nb-configuration.xml

# Visual Studio Code
.vscode
.factorypath

# OSX
.DS_Store

# Vim
*.swp
*.swo

# patch
*.orig
*.rej

2 changes: 2 additions & 0 deletions doodle/api/.mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
1 change: 1 addition & 0 deletions doodle/api/APIKEY.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
19d89ca52bc0fa4f19d6325464d9d7a032649b9fa68c111514627081e2784b4a
4 changes: 4 additions & 0 deletions doodle/api/Dockerfile.dev
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM maven:3.9-eclipse-temurin-11-alpine
WORKDIR /app
COPY . .
CMD ["./mvnw", "quarkus:dev"]
Loading