---
# System prepended metadata

title: '**Exam DevSecOps Enzo Croci, Dorian Danin, Florian Millet**'

---

# **Exam DevSecOps Enzo Croci, Dorian Danin, Florian Millet**
# Setup de l'env de travail
```
mkdir Exam

cd Exam

git clone -b master https://gitlab.com/soufien_abdessadeq/ecommerce-flask.git
git clone -b master https://gitlab.com/soufien_abdessadeq/web-backend-flask.git
```


## Test dans un environnement virtuel en local

![](https://i.imgur.com/MQOVm0W.png)

![](https://i.imgur.com/9uNhVLm.png)

on run l'app a la main dans le virtualenv
`flask run -h 0.0.0.0 -p 5000`

![](https://i.imgur.com/dPVyQ0D.png)

![](https://i.imgur.com/44GoUEC.png)

### docker file

![](https://i.imgur.com/jPdqQid.png)

#### back
```
FROM python:3.9


COPY requirements.txt .

RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

RUN export FLASKAPP=run.py
RUN export FLASKENV=development

CMD ["flask", "run", "-h", "0.0.0.0", "-p", "5005"]
```
#### front
```
FROM python:3.9


COPY requirements.txt .

RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

RUN export FLASK_APP=run.py
RUN export FLASK_ENV=development

CMD ["flask", "run", "-h", "0.0.0.0", "-p", "5000"]
```
#### Build image

![](https://i.imgur.com/od0vifZ.png)


### Docker-compose

#### Back
```
version: '3.9'
services:
  back:
    container_name: back
    restart: always
    build: .
    ports:
      - "5005:5005"
    networks:
      - back_network
networks:
  back_network:
    driver: bridge
```
#### Front
```
version: '3.9'
services:
  front:
    container_name: front
    restart: always
    build: .
    ports:
      - "5000:5000"
    networks:
      - front_network
networks:
  front_network:
    driver: bridge
```

### Docker compose concaténé 
```
version: '3.9'
services:
  back:
    container_name: back
    restart: always
    build: web-backend-flask
    ports:
      - "5005:5005"
    networks:
      - back_network
  front:
      container_name: front
      restart: always
      build: ecommerce-flask
      ports:
        - "5000:5000"
      networks:
        - front_network
networks:
  back_network:
    driver: bridge
  front_network:
    driver: bridge
```

## Optimiser les images 

Pour Diminuer la taille des images, retirer le superflux des requirements comme gunicorn et les dépendances inutiles, utiliser une image slim ou alpine, limiter au strict nécéssaire les sources et les imports.

## Ajout de produit
Nous allons dans les src de l'app et nous ajoutons le produit voulu, ici nous faisons une paire de gant supplémentaire.

![](https://i.imgur.com/PHucNqP.png)

Nous ajoutons les images et couverture pour nous produit

![](https://i.imgur.com/pVHM0lV.png)


## App scaling 

### Docker-compose.yml
```
version: "3"

services:
  app:
    build: app
  nginx:
    container_name: nginx
    build: nginx
    ports:
      - "3000:3000"
    depends_on:
      - app
```
### nginx.conf 
```
events {}

http {
    # Define the group of servers available
    upstream app {
        server projetcursusdev2022-app-1:5000;
        server projetcursusdev2022-app-2:5000;
        server projetcursusdev2022-app-3:5000;
        server projetcursusdev2022-app-4:5000;
        server projetcursusdev2022-app-5:5000;
    }
    server {
        # Server group will respond to port 3000
        listen 3000;
        server_name app.com;
        location / {
            proxy_pass http://app;
        }
    }
}
```

### Shell
`docker compose up --build -d --scale app=5`

### Docker ps 
on voit bien les conteneurs tourner

![](https://i.imgur.com/2yyrvAY.png)


## diagramme de l'architecture

![](https://i.imgur.com/ZgmfNKi.png)

# Questions

###### • En quoi Docker s'inscrit dans la méthodologie DevOps ?

Les conteneurs préviennent les conflits d’applications entre les différents environnements. Les conteneurs proposés par la solution Docker rapprochent les développeurs et l'IT, en facilitant la collaboration.
Docker va également nous permettre de lancer des app très rapidement afin de pouvoir les tester dans un environnement qui va ressembler a la prod final et d'allier le dev et l'ops 

###### • Quel autre élément auriez-vous pu ajouter afin de tester votre application avec la méthodologie CICD de manière automatisée ?

Nous aurions pu utiliser des outils comme sonarQB ou autre outils de tests automatisés

###### • Quel autre moyen choisiriez-vous si on vous demandait un déploiement en production "le plus rapide possible" dans le cloud ?

Nous pourrions passer par des services serverless ou des fonctions pour servir des sites statics. AWS permet également de servir des sites static via les service de stockage S3

###### • Quel élément auriez-vous pu ajouter afin de protéger les machines d'internet ?
Afin de protéger les machines d'internet nous pouvons mettre en place un firewall ainsi qu'un proxy en front, différents réseaux. On peut également modifier les ports par default entre containers et proxy et les fichiers .conf afin de pas garder les configurations par défault. 
###### • Quel élément auriez-vous pu ajouter afin de stopper les attaques avant qu'elles ne parviennent à votreinfra ?
Nous pouvons ajouter un CDN comme CloudFlare, ou bien encore des services comme AppArmor, SELinux, GRSEC…
###### • À partir de quelle étape la culture DevSecOps intègre la sécurité ?
Le DevSecOps intervient et intègre les solutions de sécurité pendant les étapes de développement et de déploiement d’une application. Cette approche doit se faire dès la génèse du projet afin d'être éfficace.