CASIRCloud

Enseignant: Didier Donsez (Polytech Grenoble, UGA)

Coordinateur : Clement Raievsky (IUT de Valence, UGA)

Etudiants : UGA - IUT Valence - L3 Pro CASIR

Modalité d’évaluation : DS (30%)+ DM (70%)

=Séance 0 : 21/03 Après-Midi=

Obligatoire
Suivre les cours suivants en vidéo :
 * Les transparents
 * http://erods.liglab.fr/icar2013/docs/icar2013-panorama-cloud-computing.pdf
 * Les vidéos
 * http://erods.liglab.fr/videos/ICAR2013/ICAR-Panorama-1.mp4
 * http://erods.liglab.fr/videos/ICAR2013/ICAR-Panorama-2.mp4

Pour Docker, suivre ce tutoriel https://www.katacoda.com/courses/docker
 * Transparents sur Docker (Thomas Ropars).

A VOIR : Mastering Chaos - A Netflix Guide to Microservices (slides)

Optionnel
Lire:
 * https://fr.wikipedia.org/wiki/Cloud_computing
 * https://www.ovh.com/fr/serveurs_dedies/comprendre-t3-t4.xml
 * http://www.interoute.fr/cloud-article/what-hybrid-cloud
 * https://fr.wikipedia.org/wiki/Devops
 * Swagger 101
 * Dette technique, Dette fonctionnelle

Vous pouvez suivre les autres présentations si vous en avez envie et le temps: http://erods.liglab.fr/icar2013/programme.html

Et notamment la présentation du datacentre d'OVH
 * http://erods.liglab.fr/videos/ICAR2013/ICAR-OVH.mp4
 * http://www.youtube.com/watch?v=4e97g7_qSxA (3 minutes)

Création des comptes

 * Création d’un compte Pack étudiant Github https://education.github.com/pack
 * Création d’un compte sur Docker Hub https://hub.docker.com/
 * Création d’un compte sur le SaaS public Heroku (ne requiert pas de carte bancaire)
 * Création d’un compte sur le SaaS public Azure à partir de ce github student pack OU Création d’un compte sur le SaaS public AWS à partir de ce github student pack

Remarque: il existe d'autres hébergeurs IaaS avec des offres gratuites 1 an pour de petites VMs : https://www.digitalocean.com ...

Installation des prérequis de JHipster
Avant la séance 1, vous installerez le générateur JHipster de projets web fullstack via l'installation par Docker https://www.jhipster.tech/installation/. Le conteneur contient alors tous les requis dans les bonnes versions : java 8, npm, nodejs, yarn, yeoman, jhipster generator.

Pour cela : docker pull jhipster/jhipster
 * 1) Installez Docker CE et Docker Compose
 * 2) Installez Heroku CLI
 * 3) Faites un pull de l'image Docker du générateur JHipster au moyen de la commande suivante.

=Séances 1 & 2 : 22/03=

L'application de démonstration s'appuyera sur JHipster et sur Prestashop.

Agenda

 * DS QUICK (30 minutes) sur la séance 0 (15% de la note globale). !!!!! NE PAS ARRIVER EN RETARD !!!!
 * Introduction aux applications distribuées ([[Media:IntroductionCloud_L3CASIR_2019.pdf|transparents]])


 * Installez JHipster via Docker
 * Générez d'une application d'online-store à partir du modèle https://raw.githubusercontent.com/mastering-microservices/tutorial/master/online-store.jh
 * Créez une application de type Monolithic (avec une base Postgres pour la production)
 * Générez le backend et le frontend de de l'exemple online-store
 * Lancez l'application online-store en mode DEV sur votre machine de développement
 * Mesurez la qualité du code généré avec SonarQube
 * Générez le client Bash (curl) à partir de la documentation OpenAPI (Swagger) avec l'outil en ligne Swagger Editor
 * Utilisez le client Bash (curl) généré.


 * Déployez votre application online-store en mode PROD sur Heroku
 * Arrêtez de l'application
 * Redémarrez l'application
 * Supprimez l'application d'Heroku

Scripts: docker pull jhipster/jhipster
 * 1) Term 1

mkdir -p ~/casircloud/online-store cd ~/casircloud/online-store docker container run --name jhipster --hostname jhipster-online-store \ -v $PWD:/home/jhipster/app \ -v ~/.m2:/home/jhipster/.m2 \ -p 8080:8080 -p 9000:9000 -p 3001:3001 \ -d -t jhipster/jhipster

EXEC="docker exec -it jhipster" $EXEC jhipster $EXEC wget https://raw.githubusercontent.com/mastering-microservices/tutorial/master/online-store.jh $EXEC jhipster import-jdl online-store.jh $EXEC ./mvnw

cd ~/casircloud/online-store EXEC="docker exec -it jhipster" $EXEC yarn start
 * 1) Term 2

cd ~/casircloud/online-store open http://localhost:9000 open http://localhost:8080/swagger-ui/index.html curl http://localhost:8080/v2/api-docs
 * 1) Term 3

cd ~/casircloud/online-store $EXEC jhipster ci-cd
 * 1) Term 4

Installez Heroku CLI https://devcenter.heroku.com/articles/heroku-cli Installez le plugin Java pour Heroku CLI https://devcenter.heroku.com/articles/deploying-executable-jar-files heroku plugins:install java
 * 1) Term 5

cd ~/casircloud/online-store $EXEC ./mvnw package -Pprod -DskipTests heroku deploy:jar target/*.war --app onlineshop-1234


 * 1) A noter, le nom des applications est global à heroku !!!!

TODO Code Quality avec SonarQube TODO Cost evaluation avec sloccount

=Séance 3 & 4 : 29/03= Le but de cette séance est d'installer une plateforme de e-commerce (Prestashop) sur une machine virtuelle IaaS (AWS ou Azure), de la sécuriser et de la surveiller.


 * Créez et démarrez une machine virtuelle (Ubuntu 16.04 LTS) dans un des IaaS pour lesquels vous avez créés des comptes. Sur AWS, choisissez une machine "gratuite" type 't2.micro' (1 vCPU, 1 GB RAM, 8GB EBS).
 * Notez l'adresse IP publique de la machine et initialisez la variable d'environnement PRESTASHOP_HOST
 * Sauvegardez la clé privée SSH dans le répertoire ~/.ssh de votre machine de développement
 * Installez Docker CE et Docker Compose

Installation
PRESTASHOP_HOST=123.45.67.89 PRESTASHOP_PRIVKEY=~/.ssh/prestashop.pem chmod 400 $PRESTASHOP_PRIVKEY ssh -i $PRESTASHOP_PRIVKEY ubuntu@$PRESTASHOP_HOST
 * DS QUICK (30 minutes) sur la séance 0 (15% de la note globale). !!!!! NE PAS ARRIVER EN RETARD !!!!
 * Recréez ou redémarrez votre machine virtuelle IaaS, si nécessaire
 * Loggez vous sur la machine virtuelle du IaaS par SSH
 * 1) l'utilisateur peut être différent d'un IaaS à un autre (ubuntu sur AWS).

Démarrage de la plateforme
Créez un répertoire prestashop mkdir prestashop

Copiez le fichier docker-compose.yml suivant dans ~/prestashop et corrigez la valeur du PS_DOMAIN, DB_PASSWD, MYSQL_ROOT_PASSWORD, ADMIN_MAIL, et ADMIN_PASSWD.
 * 1) CASIR Cloud 2019 : NOM PRENOM A COMPLETER

version: '2'

services: ps-prod-mysql: image: mysql:5 ports: - "3306"       volumes: - ./data/mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: __MYSQL_SUPER_SECRET_TO_CHANGE__ MYSQL_DATABASE: prestashop restart: always ps-prod-prestashop: image: prestashop/prestashop:1.7.5.1 environment: PS_INSTALL_AUTO: 1 DB_PASSWD: __MYSQL_SUPER_SECRET_TO_CHANGE__ DB_NAME: prestashop DB_SERVER: ps-prod-mysql PS_DOMAIN: 123.45.67.89:8001 PS_FOLDER_INSTALL: install PS_FOLDER_ADMIN: admin ADMIN_MAIL: admin@prestashop.casir.fr           ADMIN_PASSWD: __SUPER_SECRET_TO_CHANGE__ ports: - "8001:80"       volumes: - ./data/prestashop:/var/www/html/:delegated - ./data/prestashop/vendor:/var/www/html/vendor - ./data/prestashop/var:/var/www/html/var restart: always


 * 1) add smtp, nginx, myadmin

Lancez les 2 services de la composition (Prestashop et MySQL) mkdir prestashop

cd prestashop mkdir -p data/mysql mkdir -p data/prestashop mkdir -p data/prestashop/var mkdir -p data/prestashop/vendor mkdir -p configuration/nginx mkdir -p ssl_reports

docker-compose up -d docker-compose logs -f

Supprimez le répertoire d'installation sudo rm -fr data/prestashop/install sudo mv data/prestashop/admin data/prestashop/admin-XXXX

Depuis votre machine, ouvrez les page PRESTASHOP_HOST=123.45.67.89 open http://$PRESTASHOP_HOST:8001 open http://$PRESTASHOP_HOST:8001/admin-XXXX

Les crédentiels de l'admin sont admin@prestashop.casir.fr __SUPER_SECRET_TO_CHANGE__

Depuis l'interface d'administration, modifiez le catalogue de produits et le logo du site.

Complétez la composition en ajoutant ce container de serveur SMTP (smtp.yml).


 * 1) CASIR Cloud 2019 : NOM PRENOM A COMPLETER

version: '2' services: ps-smtp-prod: image: djfarrelly/maildev ports: - "1080:80"           - "25:25"        restart: always

Webservices
PRESTASHOP_HOST=123.45.67.89 WEBSERVICES_KEY=DXSLMRV2UFQL5ZE5EJJUXSAB8S7NCGY5 curl http://${WEBSERVICES_KEY}@$PRESTASHOP_HOST:8001/api/addresses curl http://${WEBSERVICES_KEY}@$PRESTASHOP_HOST:8001/api/addresses/3
 * Activez les webservices depuis le backend et générez une clé d'accès pour récupérer la liste des clients et des adresses (https://devdocs.prestashop.com/1.7/development/webservice/)
 * Testez l'accès GET via cURL

Supervision

 * Installez et Configurez InfluxDB
 * Installez et Configurez Telegraf
 * Installez et Configurez Grafana
 * Réalisez un tableau de bord Grafana en important celui-ci https://grafana.com/dashboards/61 et en éliminant les graphes inutiles.

Sauvegarde périodique de la base de données
Ajoutez à la composition un conteneur qui sauvegarde toutes les 10 minutes la base de données MySQL prestashop.

Les sauvegardes sont placées dans le répertoire ./backup/mysql

Sécurisation
openssl s_client -connect $PRESTASHOP_HOST:443 -showcerts openssl s_client -connect $PRESTASHOP_HOST:443 -showcerts
 * Sécurisez les ports de votre VM via la console d'administration du IaaS. N'autorisez que les ports TCP 22, 80, 443, 8001, 3000.
 * Ajouter un conteneur nginx pour sécuriser par SSL l'accès aux services Prestashop au moyen d'un certificat auto-signé.
 * Visualisez le certificat du serveur
 * Sauvegardez la trace dans ssl_reports/trace-1.txt
 * Vérifiez la qualité de votre configuration SSL avec https://www.ssllabs.com/ssltest/
 * Installez cipherscan (https://github.com/mozilla/cipherscan) pour vérifier et pour analyser votre configuration SSL
 * Sauvegardez le rapport cipherscan dans ssl_reports/report-1.txt
 * Améliorez votre configuration SSL avec https://github.com/mozilla/cipherscan
 * Ajouter un conteneur letencrypt pour générer automatiquement le certificat SSL du conteneur nginx
 * Modifiez la configuration du conteneur nginx pour sécuriser également l'accès à Grafana (utiliser le port 3443).
 * Modifiez les ports autorisés de votre VM via la console d'administration du IaaS. N'autorisez que les ports TCP 22, 80, 443, 3443.
 * Visualisez le certificat du serveur
 * Sauvegardez la trace dans ssl_reports/trace-2.txt
 * Vérifiez et analysez votre configuration SSL avec cipherscan
 * Sauvegardez le rapport dans ssl_reports/report-2.txt
 * Améliorez la configuration SSL à partir des instructions de cipherscan
 * Vérifiez et analysez votre configuration SSL avec cipherscan
 * Sauvegardez le rapport final dans ssl_reports/report-3.txt

Vous voici presque ingénieur en cyber-sécurité

Ressources

 * https://gilyes.com/docker-nginx-letsencrypt/
 * https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion

=DM individuel 2018-2019= Noté (70% de la note globale)

A RENDRE LE 9/05/2018 23H59.

Le DM consiste à rendre le résultat des sections "Sécurisation" et "Sauvegarde périodique de la base de données" dans un tarball (Ie .tgz) envoyé par email à mon adresse email avec votre adresse institutionnelle (@etu.univ-grenoble-alpes.fr) et avec le sujet suivant : "[CASIR Cloud 2019] Rendu DM NOM PRENOM" (Prière de bien respecter la consigne : autre chose est traité comme un SPAM).

cd prestashop tar czvf ../CASIRCloud2019_DM_NOM_PRENOM.tgz README.md *.yml configuration/nginx ssl_reports

=ARCHIVE DM individuel 2017-2018= Noté (70% de la note globale)

A RENDRE LE 9/05/2018 (date limite étendue au 01/06/2018, 23h59, deuxième date limite au 24/06/2018 23H59).

Dépend de ce qui aura été produit durant les séances 1,2,3 & 4.

Réalisations
 * 1) Générer le rapport de qualité avec le container SonarQube et faire une copie d'écran de la page des métriques dans le rapport. Donner votre avis sur la dette du projet (en 5 lignes max)
 * 2) Estimer le code généré du projet 'blog' selon la méthode COCOMOII (par exemple en utilisant ce calculateur).
 * 3) Terminer votre cluster HA en configurant les deux containers HAProxy en mode load balancing vers les 2 processus Spring de JHipster.
 * 4) Terminer votre cluster HA en configurant les deux containers MySQL en réplication maître-esclave (https://github.com/bergerx/docker-mysql-replication).
 * 5) Tester le crash d'une machine (voir Chaos Monkey).
 * 6) Combien de temps êtes vous capables de redémarrer complêment la machine (recréer une machine, refaire toutes les installations, reconfigurer les 2 machines : la survivante et la nouvelle qui a une nouvelle adresse IP).
 * 7) Installer un container InfluxDB sur la machine virtuelle 1 de votre cluster.
 * 8) Mettre en place Telegraf sur vos 2 machines virtuelles et configurer le pour qu'ils écrivent le mesure dans la base InfluxDB.
 * 9) Visualiser les métriques collectées par les démons Telegraf avec une console Chronograf.
 * 10) Configurer une alerte de surcharge et dépasser de capacité disque avec Kapacitor
 * 11) Sécuriser SSH de vos 2 VMs avec une authentification à 2 facteurs (How To Set Up Multi-Factor Authentication for SSH on Ubuntu 16.04)
 * 12) Configurer le firewall de vos 2 machines virtuelles (soit via les IPTables, soit via UFW : Attention UFW a quelques soucis avec Docker). Pour ceux qui maîtrisent Fail2Ban, vous pouvez installer et configurer un container Fail2Ban pour prévenir des ataques "brute force" lors de l'authentification sur le microservice Spring (de JHipster).
 * 13) Tester la pénétration de vos machines depuis l'extérieur avec un outil comme Security Monkey
 * 14) (NOUVEAU) Indiquer le service cloud utilisé et joindre au rapport une copie d'écran de la console dans laquelle apparaissent les machines virtuelles créés pour les besoins de votre DM et une copie d'écran de la console de facturation montrant le crédit ou le montant consommé pour les besoins de votre DM.
 * 15) Conclusion et retour d'expérience (franc) du cours. Proposition(s) d'amélioration (J'en tiendrai compte pour l'amélioration continue de ce compte. Merci).

Rendu par mail (avec copie à Clément et dans le sujet "[CASIR DM Cloud]"):

Un rapport de 15 pages (1 page par étape)
 * avec liste des commandes,
 * extraits pertinents des traces ou des logs,
 * et références vers les documents utilisés (lien web).

Vous pouvez ajouter des annexes à votre rapport.

Remarque: si certains ont entrepris ou réussi des mises en place des anciennes étapes concernant la haute disponibilité (HA = High Avaibility), n'hésitez pas à compléter votre rapport avec des pages supplémentaires.

Bonus track:
 * https://github.com/eliasgranderubio/dagda
 * http://www.sysdig.org/falco/
 * https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-grafana-to-plot-beautiful-graphs-from-zabbix-on-centos-7
 * https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-16-04
 * le tutoriel complet sur JHipster (lien, video)

=ARCHIVE DM 2016-2017= Noté (70% de la note globale)

A RENDRE LE 9/06/2017

Dépend de ce qui aura été produit durant les séances 1,2,3 & 4.

Réalisations
 * 1) Installer un container InfluxDB sur la machine 1 de votre cluster AWS.
 * 2) Mettre en place Telegraf sur vos 2 machines AWS et configurer le pour qu'ils écrivent le mesure dans la base InfluxDB.
 * 3) Visualiser les métriques collectées par les démons Telegraf avec une console Chronograf.
 * 4) Configurer une alerte de surcharge et dépasser de capacité disque avec Kapacitor
 * 5) Sécuriser SSH de vos 2 VMs avec une authentification à 2 facteurs (How To Set Up Multi-Factor Authentication for SSH on Ubuntu 16.04)
 * 6) Configurer le firewall de vos 2 machines (soit via les IPTables, soit via UFW).
 * 7) Tester la pénétration de vos machines depuis l'extérieur avec un outil comme Security Monkey
 * 8) Conclusion et retour d'expérience (franc) du cours. Proposition(s) d'amélioration.

Rendu par mail (avec copie à Clément et dans le sujet "[CASIR DM Cloud]"):

Un rapport de 8 pages (1 page par étape)
 * avec liste des commandes,
 * extraits pertinents des traces ou des logs,
 * et références vers les documents utilisés (lien web).

Vous pouvez ajouter des annexes à votre rapport.

Remarque: si certains ont entrepris ou réussi des mises en place des anciennes étapes concernant la haute disponibilité (HA = High Aviability), n'hésitez pas à compléter votre rapport avec des pages supplémentaires.

Bonus track:
 * https://github.com/eliasgranderubio/dagda
 * http://www.sysdig.org/falco/
 * https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-grafana-to-plot-beautiful-graphs-from-zabbix-on-centos-7
 * https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-16-04

Un rapport de 12 pages (1 page par étape)
 * avec liste des commandes,
 * extraits pertinents des traces ou des logs,
 * et références vers les documents utilisés (lien web).

Bonus track:
 * https://github.com/eliasgranderubio/dagda
 * http://www.sysdig.org/falco/
 * https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-grafana-to-plot-beautiful-graphs-from-zabbix-on-centos-7