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 : 30/03 de 9h30 à 12h30=

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

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

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)

Pour Docker, suivre ce tutoriel https://www.katacoda.com/courses/docker
 * [[Media:Docker-Ropars.pdf|Transparents sur Docker]] (Thomas Ropars).

Création des comptes

 * Création d’un compte Pack étudiant Github https://education.github.com/pack
 * Création d’un compte sur le SaaS public Azure à partir de ce github student pack
 * Création d’un compte sur le SaaS public AWS à partir de ce github student pack
 * Création d’un compte sur Docker Hub https://hub.docker.com/

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

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

En 2018, l'application de démonstration s'appuyera sur JHipster.

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 (transparents)
 * Démarrage d'une machine virtuelle (Ubuntu 16.04 LTS) dans un des IaaS pour lesquels vous avez créés des comptes. Choisir une machine "gratuite" type 't2.micro' (1 vCPU, 1 GB RAM, 8GB EBS).
 * Fork d'une application Node.js Todo (à choisir parmi celles de http://todomvc.com/) par exemple : TodoMVC Meteor
 * Déploiement de votre application Todo.
 * Installation du projet
 * Installation des dépendances
 * Script de démarrage
 * Arrêt de la machine
 * Script de redémarrage au "reboot" de la machine.
 * Installer et configurer Monit.
 * Configurer dans Monit votre adresse email pour être notifié des crashs de l'application.
 * Installation de HAProxy
 * Générer un certificat serveur avec l'autorité de certification gratuite https://letsencrypt.org/
 * Sécurisation des ports avec les IPTables.
 * Filtrer tous les ports en entrée sauf SSH, ICMP, HTTP, HTTPS et 3000.
 * Filtrer tous les ports en sortie sauf SSH, ICMP et SMTPS (pour Monit).
 * Installer et Configurer InfluxDB
 * Installer et Configurer Telegraf
 * Installer et Configurer Chronograf

Scripts
mv ~/Download/iutcloud.pem ~/.ssh chmod 400 ~/.ssh/iutcloud.pem HOST_PRIMARY_AWS=52.215.12.34 ssh -i ~/.ssh/iutcloud.pem ubuntu@$HOST_PRIMARY_AWS

Sur HOST_PRIMARY_AWS curl https://install.meteor.com/ | sh cd todomvc cd examples/meteor meteor run --port 3000 ^C
 * 1) Installer Meteor
 * 1) Cloner le dépôtgit clone https://github.com/tastejs/todomvc.git
 * 1) lancer l'application sur le port 3000 (port de test non sécurisé !!!)

nohup meteor run --port 3000 &
 * 1) lancer l'application en mode détaché. L'application continue son exécution après la sortie (exit) du terminal ssh

ps axwww pkill meteor ps axwww
 * 1) pour arrêter l'application

Depuis le navigateur de votre poste de travail, naviguer sur http://52.215.12.34:3000

Installer HAProxy pour sécuriser la connexion. sudo apt-get install -y haproxy

Générer un certificat SSL pour votre serveur HAProxy openssl genrsa -out haproxy.key 2048 openssl req -new -key haproxy.key \ -out haproxy.csr openssl x509 -req -days 365 -in haproxy.csr \ -signkey haproxy.key \ -out haproxy.crt cat haproxy.crt haproxy.key \ | tee haproxy.pem

Modifier le fichier de configuration de HAProxy sudo vi /etc/haproxy/haproxy.cfg avec le fichier suivant: global log /dev/log   local0 log /dev/log   local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon

# Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private

# Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). ssl-default-bind-options no-sslv3 no-tls-tickets force-tlsv12 ssl-default-bind-ciphers !EDH:!RC4:!ADH:!DSS:HIGH:+AES128:+AES256-SHA256:+AES128-SHA256:+SHA:!3DES tune.ssl.default-dh-param 2048

defaults log    global mode   http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000


 * 1) IUT UI (80,443 --> 3000)

frontend iut-ui-http mode http option httplog option forwardfor option http-server-close option httpclose bind *:80 redirect scheme https code 301 if !{ ssl_fc }

frontend iut-ui-https option httplog option forwardfor option http-server-close option httpclose rspadd Strict-Transport-Security:\ max-age=31536000;\ includeSubDomains rspadd X-Frame-Option:\ DENY bind *:443 ssl crt /etc/ssl/haproxy/haproxy.pem ciphers !EDH:!RC4:!ADH:!DSS:HIGH:+AES128:+AES256-SHA256:+AES128-SHA256:+SHA:!3DES force-tlsv12 no-sslv3 default_backend iut-ui

backend iut-ui mode http balance roundrobin option forwardfor http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } option httpchk HEAD / HTTP/1.1\r\nHost:localhost server web01 localhost:3000 check
 * 1)    server web01 HOST_PRIMARY_AWS:3000 check
 * 2)    server web02 HOST_BACKUP_AWS:3000 check

Relancer HAProxy sudo mkdir -p /etc/ssl/haproxy sudo cp haproxy.pem /etc/ssl/haproxy/haproxy.pem haproxy -c -f /etc/haproxy/haproxy.cfg sudo service haproxy restart sudo service haproxy status

Depuis le navigateur de votre poste de travail, naviguer sur http://52.215.12.34 Depuis le navigateur de votre poste de travail, naviguer sur https://52.215.12.34. Accepter l'exception de sécurité.

Supprimer le port 3000 du security group de la machine AWS depuis la console AWS.

Visualiser le certificat du serveur openssl s_client -connect $HOST_PRIMARY_AWS:443 -showcerts

Ressources

 * https://www.digitalocean.com/community/tutorials/how-to-implement-ssl-termination-with-haproxy-on-ubuntu-14-04
 * https://serversforhackers.com/using-ssl-certificates-with-haproxy


 * https://doc.ubuntu-fr.org/iptables
 * http://dev-notes.eu/2016/08/persistent-iptables-rules-in-ubuntu-16-04-xenial-xerus/
 * https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04

=Séances 3 & 4 : 6/04=
 * DS QUICK (30 minutes) sur la séance 0 (15% de la note globale). !!!!! NE PAS ARRIVER EN RETARD !!!!
 * 1) Création d'une seconde machine virtuelle.
 * 2) Installation de l'application TodoMVC Meteor en mode distribuée (2 machines gratuites) : Meteor inclut MongoDB.
 * 3) Installation et configuration d'un load balancer HAProxy sur chaque machine dans le mode HTTPS Termination (Le certificat auto-signé est installé sur les 2 serveurs)
 * 4) Arrêter l'applications TodoMVC sur la machine 1 : Que se passe t'il ?
 * 5) Arrêter l'applications TodoMVC sur la machine 2 : Que se passe t'il ?
 * 6) Redémarrer l'applications TodoMVC sur la machine 1 : Que se passe t'il ?
 * 7) Redémarrer l'applications TodoMVC sur la machine 2 : Que se passe t'il ?
 * 8) Installation et configuration de Telegraf, Chronograf, InfluxDB sur les 2 machines pour le monitoring de celles-ci.
 * 9) Arrêter les 2 machines virtuelles en fin de séance (Les machines virtuelles (programmes et données) sont perdues !!)


 * Présentation de Docker ([[Media:SlideContainersRopars.pdf|transparents]])
 * Installation de Docker et Docker Machine
 * Les mêmes exercices mais avec des containers Docker.
 * Construire et installer l'application Meteor en mode production (meteor help build). Il faut démarrer un serveur MongoDB via Docker.
 * Déployer l'application Meteor avec Docker et Docker Compose (https://github.com/kadirahq/meteord)

Scripts
docker pull mongo docker images

docker run --name mongo-for-meteor -p 27017:27017 -d mongo docker ps -a
 * 1) Start Mongod

docker run -it --rm --link mongo-for-meteor:mongo mongo mongo mongo-for-meteor/meteor MONGO> db.getName;
 * 1) Connect Externally

cd todomvc meteor build --directory /tmp/todomvc --server https://52.215.12.34 cd /tmp/todomvc cd bundle/ (cd programs/server && npm install) export ROOT_URL='https://localhost:3000' export MAIL_URL='smtp://user:password@mailhost:port/' export MONGO_URL='mongodb://localhost:27017/meteor' node main.js

export ROOT_URL='https://localhost:3000' export MAIL_URL='smtp://user:password@mailhost:port/' export MONGO_URL='mongodb://todo_meteor:CE_MOT_DE_PASSE_N_EST_PAS_SUR@localhost:27017/meteor' node main.js

Naviguer sur http://52.215.12.34:3000

Naviguer sur https://52.215.12.34

Avec authentification docker rm -f mongo-for-meteor

docker run --name mongo-for-meteor -p 27017:27017 -d mongo --auth docker ps -a
 * 1) Start Mongod

docker exec -it mongo-for-meteor mongo admin MONGO> db.createUser({ user: "todo_meteor", pwd: "CE_MOT_DE_PASSE_N_EST_PAS_SUR", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
 * 1) Add the Initial Admin User "todo_meteor"

docker run -it --rm --link mongo-for-meteor:mongo mongo mongo -u todo_meteor -p CE_MOT_DE_PASSE_N_EST_PAS_SUR --authenticationDatabase admin mongo-for-meteor/meteor MONGO> db.getName;
 * 1) Connect Externally

Relancer Meteor export ROOT_URL='https://localhost:3000' export MAIL_URL='smtp://user:password@mailhost:port/' export MONGO_URL='mongodb://todo_meteor:CE_MOT_DE_PASSE_N_EST_PAS_SUR@localhost:27017/meteor' node main.js

Instancer de nouveau le conteneur Mongo avec un volume locale docker rm -f mongo-for-meteor mkdir ~/db docker run --name mongo-for-meteor -v /home/ubuntu/db:/data/db -p 27017:27017 -d mongo --auth ... sudo apt-get install -y tree tree ~/db

Ressources

 * https://devops.profitbricks.com/tutorials/install-and-configure-haproxy-load-balancer-on-ubuntu-1604/
 * https://www.digitalocean.com/community/tutorials/how-to-implement-ssl-termination-with-haproxy-on-ubuntu-14-04
 * https://github.com/domasx2/meteor-docker
 * https://github.com/kadirahq/meteord

=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

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

A RENDRE LE 9/05/2018

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

Réalisations
 * 1) Terminer votre cluster HA en configurant les deux containers HAProxy en mode load balancing vers les 2 processus Meteor.
 * 2) Terminer votre cluster HA en configurant les deux containers MongoDB en réplication (voir ce blog).
 * 3) Tester le crash d'une machine (voir Chaos Monkey).
 * 4) 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).
 * 5) Installer un container InfluxDB sur la machine 1 de votre cluster AWS.
 * 6) Mettre en place Telegraf sur vos 2 machines AWS et configurer le pour qu'ils écrivent le mesure dans la base InfluxDB.
 * 7) Visualiser les métriques collectées par les démons Telegraf avec une console Chronograf.
 * 8) Configurer une alerte de surcharge et dépasser de capacité disque avec Kapacitor
 * 9) 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)
 * 10) Configurer le firewall de vos 2 machines (soit via les IPTables, soit via UFW).
 * 11) Tester la pénétration de vos machines depuis l'extérieur avec un outil comme Security Monkey
 * 12) 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 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