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
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

4 changes: 4 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
MYSQL_ROOT_PASSWORD=super-secret-root-password
MYSQL_PASSWORD=tlc-password-123
MYSQL_USER=tlc_user
MYSQL_DATABASE=tlc
Empty file added .scannerwork/.sonar_lock
Empty file.
22 changes: 22 additions & 0 deletions README.french.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# 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)
106 changes: 92 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,99 @@
# 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.
# Mise en œuvre de l'approche DevSecOps

## Year 2024-2025
Ce document a pour objectif de présenter notre approche pour intégrer les principes et les outils DevSecOps au cœur de notre projet. Il détaille la manière dont nous combinons les pratiques de développement (Dev), de sécurité (Sec) et d’exploitation (Ops) afin de garantir une sécurité globale.

### 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)
## Le DevSecOps c'est quoi ?

### Material
Le **DevSecOps** est l'évolution naturelle de la culture DevOps. Il repose sur le principe du **"Shift Left"** : l'idée est d'intégrer la sécurité le plus tôt possible dans le cycle de vie du développement logiciel (SDLC), plutôt que de la traiter comme une étape finale de vérification. Il s'agit avant tout d'une culture qui regroupe aussi bien les équipes de développement, de sécurité et opérationnels. L'objectif est de traiter les enjeux de sécurité au tout début du projet et tout au long de celui-ci. Comme le DevOps avant même de penser à la mise en place et la configuration de différents outils, on s'attèle d'abord a bien organiser l'équipe autour de cette idée.

All the material can be found on the Moodle module dedicated to this class.
### Les enjeux du DevSecOps

### Tutorial activities
* **Réduction des risques :** Identifier et corriger les risques avant que le projet ne soit en production coûte moins cher et réduit la surface d'attaque.
* **Agilite et Rapidite :** L'automatisation des contrôles de sécurité évite les blocages manuels en fin de projet, ça permet de déployer plus rapidement.
* **Culture de Responsabilité Partagée :** La sécurité n'est plus liée à un seul département, elle devient commune à tous les développeurs et aux équipes opérationnelles.
* **Conformité Continue :** L'objectif est de garantir en permanence que le code et l'infrastructure respectent les standards.

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
---

## Stack Technique & Outils Choisis

Nous avons sélectionné 3 outils pour couvrir les différentes phases du projet (Code, Build, Déploiement, Runtime).

### 1. SonarQube (Static Application Security Testing - SAST)

SonarQube analyse statiquement le code source pour détecter les bugs, les "code smells" et les vulnérabilités de sécurité. Dans ce projet, nous l'utilisons pour valider la conformité de notre infrastructure.

* **Utilisation :** Le fichier `sonar-scanner.sh` permet de lancer un scan. Le scanner est configuré avec un périmètre d'analyse optimisé via le fichier `sonar-project.properties`. Les résultats sont ensuite consultable sur le port 9000.
* **Avantage :** Assure une base de code propre et protégée contre les injections (SQL, XSS) ou les failles de logique. L'intégration d'une Quality Gate permet de bloquer tout build non conforme, garantissant que les corrections (comme le passage de mots de passe en clair vers l'injection dynamiquevia Vault) sont maintenues dans le temps.![](C:\Users\tbout\AppData\Roaming\marktext\images\2026-05-01-01-53-32-image.png)

### 2. HashiCorp Vault (Secrets Management)

Le stockage de secrets (clés API, mots de passe base de données) en clair dans le code ou les variables d'environnement est une faille majeure.

* **Utilisation :** Centralisation, chiffrement et rotation des secrets.
* **Avantage :** Injection dynamique des secrets uniquement au moment de l'exécution, sans aucune trace persistante dans le code source.
Protéger les données sensibles est un élement important dans la démarche DevSecOps, en effet il est primordiale de protéger des clés d'API ou tout autre élement critique. Nous avons fait le choix d'implémenter Vault afin de stocker ces clés encryptées. Un script de test est par ailleurs disponible pour ajouter au Vault les clés d'etherpad et la clé de décryptage de la base de données.

![alt text](image.png)

### 3. Falco (Cloud-Native Runtime Security)

Une sécurité parfaite au build ne garantit pas l'absence d'attaques en production. Falco surveille les appels système en temps réel.

* **Utilisation :** Détection d'activités anormales dans les conteneurs (ex: ouverture d'un shell inattendu, modification de fichiers sensibles).
* **Avantage :** Alerte immédiate et visibilité totale sur l'état de sécurité de l'aplication en cours d'exécution.
Dans une logique DevSecOps tous les élements doivent être protégés ainsi mettre ne place des secrets notamment avec Vault ou encore analyser le code avec Sonarqube serait inutile si les conteneurs eux-mêmes n'étaient pas sécurisés. C'est pourquoi nous avons fait le choix de configurer falco qui permet une approche sûr et fiable.
Un script d'automatisations est par ailleurs disponible dans le dossier racine et permet de vérifier l'état des conteneurs les plus critiques. Il donne un compte rendu de son analyse dans le fichier falco_tests.txt.

### Base de données

Le projet initial utilise une base de données mysql. Nous avons décidé de crypté la base de données. La configuration du cryptage se fait via le fichier `docker-compose.yaml`. Ce cryptage s'accompagne forcément d'une clé de décryptage, que nous protégeons dans Vault. Cette configuration passe par les fichiers `component_keyring_file.cnf`, `mysql_encryption_keys.key` et `mysqld.my` dans la racine de l'api. Malheureusement nous n'avons pas réussi à faire communiquer l'api avec la base de données.

<img src="file:///C:/Users/tbout/AppData/Roaming/marktext/images/2026-05-01-05-23-03-image.png" title="" alt="" data-align="center">

---

## Lancement du Projet

Pour lancer les conteneurs on a le docker-compose.yml à la racine du projet:
docker compose up -d
Dans le répertoire api/:
./mvnw quarkus:dev
Dans le répertoire front/:
npm start
Les fichiers de tests sont situés dans le dépôt racine:

- init-vault.sh
- init-falco.sh
- sonar-scanner.sh

---

## Difficultés rencontrées

* **SonarQube :** Il a été compliqué de lancer le scanner sans que ce dernier ne prenne trop de temps et de RAM. La mise en place et et configuration du scanner ont également pris beaucoup de temps du fait que chaque debug était associé à un long scan. Finalement, il a été décidé de se concentrer sur l'analyse des fichiers d'infrastructure que nous avions rajouté autour du projet, tout en excluant le dossier /front et /api.
* **Base de données :** Crypter la base de données a demandé la création de différents fichiers de configuration qui devaient communiquer entre eux. Il a fallu de nombreux échecs avant de savoir quels bonnes lignes utiliser dans ces fichiers. De plus, le lancement de l'application devait alors se faire dans un ordre bien précis : lancer le conteneur Vault, lancer le script `init-vault.sh` puis lancer le reste de l'application. Cela nous a motivé a créer le fichier de lancement `start.sh`. Finalement, bien que nous avons fini par réussir à lancer la base de données cryptée, et à sauvegarder sa clé de décryptage dans le Vault, nous n'avons pas réussi à la faire communiquer avec l'API.



Ces deux éléments sont les obstacles qui nous ont pris le plus de temps lors de la réalisation de ce projet. Nous voulions ajouter et configurer d'autres outils mais nous avons manqué de temps.

## Autres outils

Etant donné que le projet était hébergé en local il nous était difficile d'implémenter et configurer certains outils qui aurait pu renforcer la logique de DevSecOps mise en place pour ce projet.

### 1. OWASP Dependency-Check (Software Composition Analysis - SCA)

Cet outil scanne les dépendances pour identifier les vulnérabilités connues (CVE).

* **Utilisation :** Scan automtique des fichiers de gestion de paquets (pom.xml, package.json, etc.).
* **Avantage :** Empêche l'utilisation de bibliothèques obsolètes ou compromises.

### 2. Lynis (Analyse de Sécurité des Dépendances)

Lynis est un outil de sécurité open source conçu pour les systèmes basés sur Unix (Linux, macOS). Contrairement au SCA qui scanne les bibliothèques de code, Lynis effectue un scan de santé global du système d'exploitation.

* **Utilisation :** Analyse en temps réel du trafic entrant/sortant, blocage des requêtes malveillantes (ex. : injections SQL, XSS, scans de ports). Réalisation d'audits de sécurité et de tests de conformité
* **Avantage :** Réduit les risques d’exploitation des failles logicielles ou de configuration, tout en garantissant la disponibilité et l’intégrité des services hébergés. Il permet d'identifier les vulnérabilités connues (CVE), de réaliser des tests d'intrusion et de vérifier la configuration sécurisée de l'hôte qui héberge nos conteneurs.
Binary file added Screenshot from 2026-04-30 19-59-48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 37 additions & 0 deletions 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

18 changes: 18 additions & 0 deletions api/.mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.3/apache-maven-3.9.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
1 change: 1 addition & 0 deletions api/APIKEY.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
19d89ca52bc0fa4f19d6325464d9d7a032649b9fa68c111514627081e2784b4a
16 changes: 16 additions & 0 deletions api/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM maven:3.9.6-eclipse-temurin-17 AS build
WORKDIR /app

COPY . .


RUN mvn package -DskipTests -Dquarkus.package.type=fast-jar

FROM eclipse-temurin:17-jre
WORKDIR /app

COPY --from=build /app/target/quarkus-app/ .

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "quarkus-run.jar"]
53 changes: 53 additions & 0 deletions api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# code-with-quarkus project

This project uses Quarkus, the Supersonic Subatomic Java Framework.

If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ .

## Running the application in dev mode

You can run your application in dev mode that enables live coding using:
```shell script
docker-compose up --detach
# Wait the correct start of the docker services and then
./mvnw compile quarkus:dev
```

To stop the application and its dependencies, type `ctrl+c` in the bash session and run `docker-compose down`.

## Packaging and running the application

The application can be packaged using:
```shell script
./mvnw package
```
It produces the `code-with-quarkus-1.0.0-SNAPSHOT-runner.jar` file in the `/target` directory.
Be aware that it’s not an _über-jar_ as the dependencies are copied into the `target/lib` directory.
If you want to build an _über-jar_, execute the following command:
```shell script
./mvnw clean package -Dquarkus.package.type=uber-jar
```

The application is now runnable using `java -jar target/code-with-quarkus-1.0.0-SNAPSHOT-runner.jar`.

## Creating a native executable

You can create a native executable using:
```shell script
./mvnw package -Pnative
```

Or, if you don't have GraalVM installed, you can run the native executable build in a container using:
```shell script
./mvnw package -Pnative -Dquarkus.native.container-build=true
```

You can then execute your native executable with: `./target/code-with-quarkus-1.0.0-SNAPSHOT-runner`

If you want to learn more about building native executables, please consult https://quarkus.io/guides/maven-tooling.html.

# RESTEasy JAX-RS

Guide: https://quarkus.io/guides/rest-json


4 changes: 4 additions & 0 deletions api/component_keyring_file.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"read_only": false,
"path": "/var/lib/mysql/keyring_internal.json"
}
Loading