Skip to content

Instantly share code, notes, and snippets.

@regilero
Created June 17, 2021 08:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save regilero/8c18e3cd3184e6d9e244b39cd1441f6a to your computer and use it in GitHub Desktop.
Save regilero/8c18e3cd3184e6d9e244b39cd1441f6a to your computer and use it in GitHub Desktop.
docker-compose stack for security courses
version: '3'
# Fichier docker-compose.yml
# TP Sécurité Web
# --------------
# * DVWA: Damn Vulnerable Web Application (apache/php5.6/MySQL)
# * Varnish: Serveur Reverse Proxy mis en place devant Nodegoat
# * NodeGoat: Application NodeJs+MongoDb Vulnerable
#
# local |docker-compose, réseau interne
# |
# localhost:8000 | +---------+ +----------+ +-----------+
# | [8000]| | varnish | | nodegoat | | mongodb |
# \------------|----+[80] +---+[4000] +---+[27017] |
# | | | | (nodeJs) | | |
# | | 264MB | | 522MB | | 419MB |
# | +---------+ +----------+ +-----------+
# |
# localhost:8021 | +-----------------+ +-----------+
# | [8021]| | dvwa | | db |
# \------------|----+[80] +----------+[3306] |
# | | (Apache + php5) | | (MySQL) |
# | | 419MB | | 448MB |
# | +-----------------+ +-----------+
#
# # Pré-requis
# --------------
# - docker
# - docker-compose
# - nous allons essayer de prendre les ports TCP/IP 8000 et 8021 de votre
# machine, vérifiez donc qu'ils ne soit pas déjà pris par un autre service
# (par exemple un Nginx, Apache ou autre qui serait réglé par le plus grand
# des hasards sur ces mêmes ports).
# Pour installer docker c'est très facile sur un Linux (regardez dans google)
# Sur windows il faut installer Docker Desktop ou bien utiliser le linux caché
# dans les nouveaux windows (WSL2) -- ce dernier étant la melleure solution --.
# Installez git-bash aussi si vous ne l'avez pas encore.
# - https://docs.docker.com/docker-for-windows/install/
# - https://docs.docker.com/docker-for-windows/wsl/
# Si vous n'arrivez pas à installer docker-desktop sur Windows
# - https://chocolatey.org/install
# - https://stefanscherer.github.io/get-started-with-docker-on-windows-using-chocolatey/
#
#
# # Utilisation
# --------------
# - Mettez ce fichier dans un dossier vide destiné à héberger le projet
# - Allez dans ce dossier avec une console (un shell), c'est à partir de
# ce dossier que vous pourrez lancer les commandes docker-compse
# - Lancez le projet:
# * soit avec:
#
# docker-compose up
#
# * soit avec:
#
# docker-compose up -d
#
# La première commande garde l'ensemble des dockers attachés à l'écran, et
# permet d'avoir le log de chaque service en direct. Mais il faut ouvrir
# d'autres sessions de console pour pouvoir taper d'autres commandes. On sort
# avec CONTROl+C.
# La deuxième avec le '-d' permet de le mode 'détaché'. Où l'ensemble des services
# tourne en tâche de fond sans que la sortie ne soit attachée à votre session.
# La première fois qu'on utilise ce 'cluster' les images de base sont
# téléchargées et donc c'est un peu long. Mais les fois suivantes ce sera très
# rapide.
#
# Une fois le cluster lancé voici les commandes utiles:
#
# * lister l'état du cluster
#
# docker-compose ps
#
# ce qui donne à peu près:
# zorg@rickroll:~/foobar$ docker-compose ps
# Name Command State Ports
# ----------------------------------------------------------------------------------
# foobar_db_1 docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp
# foobar_dvwa_1 apachectl -D FOREGROUND Up 0.0.0.0:8021->80/tcp
# foobar_mongodb_1 docker-entrypoint.sh --wir ... Up 27017/tcp
# foobar_nodegoat_1 sh -c sleep 15 && /init.sh ... Up
# foobar_varnish_1 /start.sh Up 0.0.0.0:8000->80/tcp
#
#
# * arrêter le cluster
#
# docker-compose stop
# # ou
# docker-compose down
#
# * voir les logs d'un des services: dans le 'ps' ci-dessus je vois que le service
# 'nodegoat' se nomme en fait 'foobar_nodegoat_1'. Ce nom long est le nom du docker, et je peux donc le logger ainsi:
#
# docker logs foobar_nodegoat_1
# # ou
# docker logs -f foobar_nodegoat_1
#
#
# * Se connecter en shell dans un des services (dvwa, nodegoat, varnish, db ou mongodb)
# ici par exemple sur dvwa (notez qu'il n'y a donc pas besoin de ssh ni de taper
# les horribles commandes docker du type docker run --rm -it kekchose /bin/bash)
#
# docker-compose exec dvwa /bin/bash
#  # Si vous utilisez git-bash sous windows il faut parfois faire ceci plutôt:
# docker-compose exec dvwa //bin/bash
# # Ou si vous avez des messages d'erreur à propos d'un tty manquant:
# winpty docker-compose exec dvwa //bin/bash
#
# * Lancer une commande sur un des services (ici par exemple un ls sur le docker nodegoat)
#
# docker-compose exec nodegoat 'ls -alh /home/user/project'
# # ou :
# winpty docker-compose exec nodegoat 'ls -alh /home/user/project'
#
# # Accéder aux services
# ----------------------
#
# Tant que le docker-compose toune vous avez normalement accès aux services sur
# ces deux URL:
#
# * http://localhost:8000
# * http://localhost:8021
#
# # Utilisation avancée: DVWA
# ---------------------------
#
# http://dvwa.example.com:8021/setup.php (reset de la base)
#
# le projet dvwa fournit un service apache qui réponds effectivement sur le nom
# 'localhost', mais avec quelque chose qui n'est pas très utile.
# Il y a plusieurs 'VirtualHosts par nom' dans ce service, et il s'attends en
# fait à être interrogé sur les noms de domaine:
# * www.example.com
# * dvwa.example.com
# Hors vous ne possédez pas, à priori, le droit de faire pointer ces enregistrements
# vers 127.0.0.1 dans un serveur DNS officiel.
# il faut donc jouer avec votre fichier local 'hosts' (/etc/hosts sous Linux et
# quelque part caché dans /C:\Windows\System32\drivers sour Windows de mémoire)
# et ajouter ces 2 faux enregistrements DNS:
# -------
# 127.0.0.1 www.example.com
# 127.0.0.1 dvwa.example.com
# -------
# Après cela vous pourrez accéder à :
# * http://www.example.com:8021
# * http://dvwa.example.com:8021
# * http://www.example.com:8000
#
# La base MySQL s'initialise sur
# * http://dvwa.example.com:8021/config/
#
# # Utilisation avancée: NodeGoat
# -------------------------------
#
# La base mongodb est réinitialisée à chaque down/up mais vous pouvez le faire
# à tout moment avec cette commande, qui donne des détails sur les lignes
# injectées en base, et donc par exemple des comptes utilisateur
#
# docker-compose exec nodegoat /init.sh
# Nodegoat est sur http://www.example.com:8000
# l'aide de NoGoat est sur http://www.example.com:8000/tutorial
#
services:
db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "insecure"
MYSQL_DATABASE: "dvwa"
MYSQL_USER: "dvwa"
MYSQL_PASSWORD: "p@ssw0rd"
volumes:
- db_data:/var/lib/mysql
dvwa:
image: regilero/insecure:dvwa1.0
restart: unless-stopped
tty: true
depends_on:
- db
links:
- db:db
ports:
- 8021:80
nodegoat:
image: regilero/insecure:nodegoat1.0
tty: true
depends_on:
- mongodb
links:
- mongodb:mongodb
# that sleep 15 is ugly, a real production stuff would use 'dockerize'
command: ["sh", "-c", "sleep 15 && /init.sh && /start.sh"]
environment:
MONGODB_URL: "mongodb://mongodb:27017/nodegoat"
NODE_ENV: "production"
HOSTNAME: "localhost:8000"
mongodb:
image: mongo:4.0-xenial
restart: unless-stopped
environment:
DATABASE_AUTHENTICATION: "false"
command: --wiredTigerCacheSizeGB 0.2
volumes:
- mongodb_data:/data/db
varnish:
image: regilero/insecure:varnish1.0
restart: unless-stopped
depends_on:
- nodegoat
- mongodb
links:
- nodegoat:nodegoat
ports:
- 8000:80
volumes:
db_data:
mongodb_data:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment