Cahier 2017 groupe n°4 : Différence entre versions
(→Mise en place d'un système overlayfs sous une machine virtuelle) |
(→Le système overlayfs pour la sécurisation de configuration/données d'origine) |
||
(2 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 472 : | Ligne 472 : | ||
ansible-playbook playbook.yml | ansible-playbook playbook.yml | ||
− | ==Le système overlayfs pour la sécurisation de | + | ==Le système overlayfs pour la sécurisation de configuration d'origine== |
Un système overlayfs est un mécanisme de montage permettant de superposer dans un répertoire le contenu de plusieurs autres répertoires. | Un système overlayfs est un mécanisme de montage permettant de superposer dans un répertoire le contenu de plusieurs autres répertoires. |
Version actuelle datée du 5 février 2018 à 15:32
Sommaire
- 1 Système pour réinstallation rapide d'un système linux
- 2 Partie commune
- 3 Soutenance
Système pour réinstallation rapide d'un système linux
Objectifs
- L'objectif principal de notre tache est de créer un programme permettant de récupérer la configuration d'un système linux (configuration réseau, packages, et dossiers importants) afin de l'utiliser pour configurer un système linux fraîchement installé.
- Il faudra ensuite proposé un système de fichiers incrémental permettant de forcer le système à l'état n-1 voire à l'état initial.
Réinstallation rapide
- Pour la première partie de ce sujet, nous avons réalisé deux script shell ayant plusieurs fonctions.
- Le premier script récupère la configuration d'un système linux :
- crée un répertoire pour y enregistrer la configuration
- récupère le dossier de configuration réseau /etc/network
- récupère la liste des miroirs des archives debian
- récupère la liste des packages installés
- récupère les dossiers /etc/default et /etc/alternatives
getconf.sh
#!/bin/bash #get the current network and packages config of a linux system for further recover if [ "$(id -u)" != "0" ] ; then echo "error : This script must be run as root" exit fi echo "Trying to get the current configuration of the system" if [ -e backup -a -d backup ] ; then answer="\0" echo "A backup directory is already existing" while [ $answer != "n" -a $answer != "y" ] ; do echo "Do you want to overwrite this backup ? [y/n] :" read answer done if [ $answer = "n" ] ; then echo "Overwriting refused" echo "done" exit else rm -r backup mkdir backup cd backup cp -r /etc/network . echo "Network configuration saved" cp -r /var/cache/debconf . cp /etc/apt/sources.list . cp -r /etc/apt/sources.list.d . echo "Mirror configuraiton saved" touch packages dpkg --get-selections > packages echo "Packages list saved" cp -a /etc/alternatives . cp -a /etc/default . echo "Other important files saved" echo "Basic configuration successfully saved" echo "done" exit fi else mkdir backup cd backup cp -r /etc/network . echo "Network configuration saved" cp -r /var/cache/debconf . cp /etc/apt/sources.list . cp -r /etc/apt/sources.list.d . echo "Mirror configuraiton saved" touch packages dpkg --get-selections > packages echo "Packages list saved" cp -a /etc/alternatives . cp -a /etc/default . echo "Other important files saved" echo "Basic configuration successfully saved" echo "done" exit fi fi
- Le deuxième script effectue l'opposé du premier, supprimant la configuration actuelle d'un nouveau système linux pour y coller celle que l'on a sauvegardée précédemment :
setconf.sh
#!/bin/bash #set an old network and packages config of a linux system on a freshly installed linux system if [ "$(id -u)" != "0" ] ; then echo "error : This script must be run as root" exit fi echo "Trying to set the old configuration on the system" if [ -e backup -a -d backup ] ; then answer="\0" while [ $answer != "n" -a $answer != "y" ] ; do echo "Do you want to configure the network and the packages on this system ? [y/n] :" read answer done if [ $answer = "n" ] ; then echo "Configuration aborted" echo "done" exit else rm -r /etc/network cp -r backup/network /etc/ echo "Network reconfigured, going to restart..." /etc/init.d/networking restart echo "Network has been restarted" rm -r /var/cache/debconf cp -r backup/debconf /var/cache/ dpkg-reconfigure debconf rm /etc/apt/sources.list cp backup/sources.list /etc/apt/ rm -r /etc/apt/sources.list.d cp -r backup/sources.list.d /etc/apt/ echo "Mirror configured, updating packages list..." apt-get update echo "Packages list updated" echo "Installing all packages..." dpkg --set-selections < backup/packages apt-get dselect-upgrade echo "Packages installed" rm -r /etc/alternatives cp -a backup/alternatives /etc/ rm -r /etc/defaultreboot cp -a backup/default /etc/ echo "done" echo "The system needs to reboot" answer="\0" while [ $answer != "n" -a $answer != "y" ] ; do echo "Do you want to reboot now ? [y/n] :" read answer done if [ $answer = "n" ] ; then echo "Reboot refused" echo "done" exit else echo "System is going to reboot" reboot exit fi fi else echo "error : There is no backup directory here, execute getconf.sh on the system you want to recover first" exit fi
- La récupération et l’installation du réseau, des configurations du miroir des archives, et des répertoire alternatives et default se fait simplement par la commande cp. L'option -a permet de copier les liens symboliques ainsi que l'arborescence tels qu'ils sont. Cependant la copie des liens symbolique semble ne pas fonctionner sur certains type de formatage de clé usb.
- Pour réinstaller les packages, il suffit de récupérer la liste des packages installés grâce à la commande dpkg --get-selections dont la sortie et redirigée vers un fichier texte. Ensuite il faut mettre à jour la liste des packages sur le nouveau système avec dpkg --set-selections qui prend en entrée le fichier texte précédent. Enfin il suffit d'upgrade les packages (apt-get dselect-upgrade) afin de tous les installer.
Système de fichiers incrémental (overlay fs)
Partie commune
Installation d'une machine virtuelle sur le serveur Cordouan
- Nous avons installé une machine virtuel xen à l'aide la commande :
xen-create-image --hostname=ima5-tomate --dir=/usr/local/xen --ip=172.26.76.106 --netmask=255.255.255.224 --gateway=172.26.79.254
L'adresse ip est temporaire et sera remplacé par la suite par 193.48.57.184 (réseau de TP ima5)
- L'interface ethernet est montée sur le pont insecure en modifiant le fichier de configuration (/etc/xen/ima5-tomate.cfg) :
vif = [ 'mac=00:16:3E:5C:6B:A2, bridge=INSECURE' ]
Encore une fois, ceci est temporaire et nous utiliserons le pont IMA5sc par la suite.
- La machine virtuelle peut être lancée et stoppée avec les commandes suivantes :
xl create /etc/xen/ima5-tomate.cfg xl destroy /etc/xen/ima5-tomate.cfg
- Pour accéder à la console de la machine virtuelle, on utilise :
xl console ima5-tomate
Création d'une partition LVM
- On veut placer les /var et /home de la machine virtuelle sur un disque partitionné de cordouan.
- On créer d'abord deux partitions de 10Go sur cordouan :
lvcreate -L10G -ima5-tomate_home lvcreate -L10G -ima5-tomate_var
- Il faut ensuite modifier le fichier de configuration de la machine virtuelle (/etc/xen/ima-tomate) pour ajouter les disques :
disk = [ 'file:/usr/local/xen/domains/ima5-tomate/disk.img,xvda2,w', 'file:/usr/local/xen/domains/ima5-tomate/swap.img,xvda1,w', 'phy:/dev/virtual/ima5-tomate_var,xvda3,w', 'phy:/dev/virtual/ima5-tomate_home,xvda4,w' ]
- Puis on formate ces deux nouveau disques :
mkfs -t ext4 /dev/xvda3 mkfs -t ext4 /dev/xvda4
- Enfin on monte les partitions dans la VM :
- On ajoute la ligne suivante dans le fichier /etc/fstab de la VM afin que le /home soit monté au lancement :
/dev/xvda4 /home ext4 defaults 0 2
- Le /var doit d'abord être monté sur un fichier temporaire :
mount /dev/xvda3 /mnt
Puis on déplace le /var actuel dans ce nouveau fichier :
mv /var/* /mnt
Enfin on ajoute la ligne suivante dans le fichier /etc/fstab de la VM :
/dev/xvda3 /home ext4 defaults 0 2
Création du serveur SSH
- L’installation du serveur ssh se fait tout simplement grâce à :
apt-get install ssh
- Il suffit ensuite de modifier le fichier /etc/ssh/sshd_config pour pouvoir accéder à la machine en root :
PermitRootLogin yes
Cette ligne est déjà écrite dans le fichier, il faut juste changer l'option par "yes".
Configuration du serveur DNS
- Il faut d'abord installer bind pour la configuration du DNS ainsi qu'un serveur apache2 :
apt-get install bind9 apache2
- Nous avons aussi réserver le nom de domaine tomatecomsique.space sur gandi.net.
- Nous créons le dossier du site web :
mkdir /var/www/www.tomatecosmique.space
- Enfin nous configurons le bind :
- On commence par créer le fichier de zone db.tomatecosmique.space dans /etc/bind/, son contenu est :
; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA dns1.tomatecosmique.space. root.tomatecomsique.space. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ; Negative Cache TTL ; @ IN NS dns1.tomatecosmique.space. dns1 IN A 193.48.57.184
- Ensuite on configure /etc/bind/named.conf.local :
zone "tomatecosmique.space" { type master; file "/etc/bind/db.tomatecosmique.space"; allow-transfer { 217.70.177.40; }; };
- Et /etc/bind/named.conf.options :
options { directory "/var/cache/bind"; dnssec-validation auto; auth-nxdomain no; listen-on-v6 { any; }; };
- Enfin on relance le service bind :
service bind9 restart
- Il y a aussi une configuration à effectuer sur le site gandi :
- Dans l'onglet "Gérer les 'glues records'" :
Nom du serveur : dns1.tomatecosmique.space IP : 193.48.57.184
- Dans l'onglet "Modifier les serveurs DNS" :
DNS1 : dns1.tomatecosmique.space DNS2 : ns6.gandi.net
Sécurisation du site via certificat SSL
- Obtention du certificat :
openssl req -nodes -newkey rsa:2048 -sha1 -keyout tomatecosmique.space.key -out tomatecosmique.space.csr
- On copie les clés dans les dossiers appropriés :
cp certificat.crt /etc/ssl/certs/tomatecosmique.space.crt cp serveur.key /etc/ssl/private/tomatecosmique.space.key cp GandiStandardSSLCA.pem /etc/ssl/certs/GandiStandardSSLCA.pem
Le fichier GandiStandardSSLCA.pem est généré une fois le certificat validé par gandi
- On peut ensuite faire un hashage pour prendre en compte le certificat :
c_rehash /etc/ssl/certs
- Ensuite on configure apache2 :
- On crée d'abord le fichier 000-tomatecosmique.space-ssl.conf dans /etc/apache2/sites-available/ :
#NameVirtualHost *:443 <VirtualHost 193.48.57.184:443> ServerName www.tomatecosmique.space ServerAlias tomatecosmique.space DocumentRoot /var/www/www.tomatecosmique.space/ CustomLog /var/log/apache2/secure_access.log combined SSLEngine on SSLCerticateFile /etc/ssl/certs/tomatecosmique.space.crt SSLCerticateKeyFile /etc/ssl/private/tomatecosmique.space.key SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA.pem SSLVerifyClient None </VirtualHost>
- On modifie ensuite /etc/apache2/ports.conf :
Listen 80 443 <IfModule ssl_module> Listen 443 </IfModule> <IfModule mod_gnutls.c> Listen 443 </IfModule>
- Enfin on exécute les commandes suivantes pour finir la configuration d'apache :
a2enmod ssl a2ensite 000-tomatecosmique.space-ssl.conf service apache2 reload
Sécurisation avec DNSSEC
- On commence par modifier /etc/bind/named.conf.options :
options { directory "/var/cache/bind"; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; auth-nxdomain no; listen-on-v6 { any; }; };
- On génère ensuite les clés KSK et ZSK dans /etc/bind/ :
dnssec-keygen -a RSASHA1 -b 2048 -f KSK -r /dev/urandom -n ZONE tomatecosmique.space dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE tomatecosmique.space
- On rajoute les lignes suivantes à la fin du fichier /etc/bind/db.tomatecosmique.space :
$INCLUDE Ktomatecosmique.space.+007+22620.key $INCLUDE Ktomatecosmique.space.+007+23885.key
- On peut enfin signer la zone :
dnssec-signzone -o tomatecosmique.space -k Ktomatecosmique.space.+007+22620 db.tomatecosmique.space Ktomatecosmique.space.+007+23885
RAID5 et cryptage des données
Sécurisation via RAID5
Depuis cordouan, nous créons 3 disque disques virtuels avec lvcreate :
lvcreate -L 1G -n /dev/virtual/ima5-tomate_raid1 lvcreate -L 1G -n /dev/virtual/ima5-tomate_raid2 lvcreate -L 1G -n /dev/virtual/ima5-tomate_raid3
Nous rajoutons ces disques à la configuration de notre machine virtuelle. Toujours depuis cordouan, dans /etc/xen/ima5-tomate.cfg, nous ajoutons :
'phy:/dev/virtual/ima5-tomate_raid1,xvdd1, w', 'phy:/dev/virtual/ima5-tomate_raid2,xvdd2 w', 'phy:/dev/virtual/ima5-tomate_raid3,xvdd3 w',
Depuis notre machine virtuelle cette fois, nous installons mdadm :
apt-get install mdadm
Nous créons le disque RAID5 md0 :
mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd1 /dev/xvdd2 /dev/xvdd3
Nous installons le système de fichier ext4 dessus :
mkfs -t ext4 /dev/md0
Nous sauvegardons le tout et montons le disque :
mdadm --detail --scan >> /etc/mdadm/mdadm.conf mount /dev/md0 /mnt
Enfin nous effectuons un petit test afin de noter la reconstruction de notre disque. Nous supprimons une des partitions et observons qu'il est bien manquant dans la configuration :
mdadm --set-faulty /dev/md0 /dev/xvdd2 mdadm --remove /dev/md0 /dev/xvdd2 cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 xvdd3[2] xvdd2[1] xvdd1[0] 2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU] unused devices: <none>
Nous montons le disque à nouveau et pouvons noter la reconstruction du disque :
mount /dev/md0 /mnt
root@Papaye:/mnt# ls lost+found
Nous remettons la partition : mdadm --add /dev/md0 /dev/xvdd2
Et on observe la reconstruction grâce à cat /proc/mdstat.
Cryptage des données
Dans cette partie, nous allons voir comment crypter des données sur un disque virtuel. De la même manière que pour la partie précédente, nous créons un disque virtuel via la commande :
lvcreate -L 1G -n /dev/virtual/ima5-tomate_cryptage
Nous rajoutons ce disque à la configuration de notre machine virtuelle. Depuis cordouan, dans /etc/xen/ima5-tomate.cfg, nous ajoutons :
'phy:/dev/virtual/ima5-tomate_cryptage,xvdd4, w',
Nous configurons le disque en type Luks :
cryptsetup luksFormat /dev/xvdd4
La phrase secrète est : glopglop.
Nous pouvons vérifier les informations via cette commande :
blkid | grep crypto
Ainsi, nous obtenons les informations suivantes :
/dev/xvdd4: UUID="50b21f40-ca69-4c42-aa68-83b8e9b96922" TYPE="crypto_LUKS"
Nous ouvrons et ajoutons un mapping avec :
cryptsetup luksOpen /dev/xvdd4 crypthome
Puis, nous saisissons la phrase secrète.
Nous formatons le mapping en ext3:
mkfs.ext3 /dev/mapper/crypthome
Ensuite nous montons notre partition. Montage :
mkdir /mnt/crypthome && mount /dev/mapper/crypthome /mnt/crypthome
Démontage :
umount /mnt/crypthome
Nous encryptons à nouveau la partition avec la commande suivante :
cryptsetup luksClose crypthome
Soutenance
Utilisation d'ansible pour le déploiement automatique
- Il faut commencer par installer le package ansible et ses dépendances (python simplejson). Les dépendances doivent aussi être installées sur la machine esclave.
- Il faut ensuite configurer la connexion en ssh sur la machine esclave :
ssh-copy-id root@193.48.57.182
- Le fichier /etc/ansible/hosts contient les hosts à contrôller par ansible.
- La connection peut être testée avec :
ansible all -m ping
- On créé ensuite une arborescence de fichier pour définir les tâches à effectuer :
-Ansible _playbook.yml -roles -role1 -tasks _main.yml ... -handlers _main.yml -var ... -role2 ...
- Exemple avec installation et configuration d'apache2 sur une machine virtuelle :
- playbook.yml :
--- - hosts: all roles: - apache2
"hosts:" permet de préciser les machines sur lesquelles effecteur les actions qui suivent. "roles:" est simplement le listes des rôles à exécuter.
- roles/apache2/tasks/main.yml :
--- - name: "Install apache2" apt: name=apache2 - name: "Service" service: name=apache2 enabled=yes state=started - name: "Config apache_1" copy: src=../var/virtualhost.conf dest=/etc/apache2/sites-available/virtualhost.conf - name: "Config apache_2" copy: src=../var/ports.conf dest=/etc/apache2/ports.conf - name: "Config apache_3" copy: src=../var/apache2.conf dest=/etc/apache2/apache2.conf - name: "Config apache_4" copy: src=../var/index.html dest=/var/www/html/index.html - name: "Config apache_5" shell: a2ensite virtualhost.conf notify: "Restart apache2"
- roles/apache2/var contient les 4 fichiers utilisés par 'copy'.
- roles/apache2/handlers/main.yml :
--- - name: "Restart apache2" service: name=apache2 state=restarted - name: "Enable virtualhost" shell: a2ensite virtualhost.conf
Les handleurs définis ici sont utilisés dans /roles/apaches2/tasks/main.yml avec 'notify'
- On peut tester la syntaxe avec :
ansible-playbook playbook.yml --syntax-check
Et exécuter le playbook avec :
ansible-playbook playbook.yml
Le système overlayfs pour la sécurisation de configuration d'origine
Un système overlayfs est un mécanisme de montage permettant de superposer dans un répertoire le contenu de plusieurs autres répertoires. La configuration la plus simple est celle de deux répertoires, appelons-les upper et lower que l’on peut imaginer comme des calques contenant des fichiers. Lorsque l’on veut lire le contenu d’un fichier, on regarde tout d’abord sur le calque supérieur – upper – puis, si aucun fichier ne correspond au nom recherché on ira examiner ensuite le contenu du calque inférieur. Ce système permet de garder les fichiers originaux du systèmes en créant des copies modifiables.
Mise en place d'un système overlayfs sous une machine virtuelle
Dans cet exemple on s'intéresse au répertoire /etc; on peut faire autrement avec d'autres répertoires du système: /usr, /bin, /var, etc.
Tout d'abord il faut monter la partition réservée pour le système overlay:
mkdir /data mkfs -t ext4 /dev/xvdd5 mount /dev/xvdd5 /data mkdir /data/etc mkdir /data/work
Ensuite il faut remonter la partition système en lecture seule:
mount / -o ro,remount
Enfin nous pouvons réaliser le montage overlay de /data/etc en superposition sur /etc, tout en utilisant /data/work comme répertoire de travail interne.
mount -t overlay -o lowerdir=/etc,upperdir=/data/etc,workdir=/data/work overlay /etc
Avec cette configuration, toutes les modifications qui seront faites au niveau du répertoire /etc vont apparaître sur /data/etc, et le /etc restera intact.