# SR06 projet Protection
Code Téva-Thomas machines
sr06p045
924TQrLl5btk
Code Clement-Madeleine machines:
sr06p038
52LcnGCeLTfZ
Sujet rappels :
- La zone LAN correspond au réseau interne de l'entreprise et contient la machine virtuelle appelée vm-lan
- La zone INTERNET correspond au réseau externe et contient la machine virtuelle vm-int (client web)
- La zone WEB est une zone de confiance intermédiaire, qui contient la machine virtuelle vm-web (serveur web)
- La zone SQL est une seconde zone de confiance intermédiaire, qui contient la machine virtuelle vm_sql (base de données)

# 1. Création des machines virtuelles et des réseaux
- on créée les 5 machines virtuelles vm-lan, vm-int, vm-web et vm-sql et vm-router
### Adresses IP VMs:
On affiche chaque adresse IP trouvée en fonction des interfaces.
```
hostname -I
```
**Pour Téva et Thomas**
#### - vm-sql
- 192.168.59.2/24 ens19
- 172.23.4.13 ens18
#### - vm-lan
- 192.168.56.2/24 ens19
- 172.23.3.139 ens18
#### - vm-int
- 192.168.57.2/24 ens19
- 172.23.4.161 ens18
#### - vm-web
- 192.168.58.2/24 ens19
- 172.23.3.240 ens18
#### - vm-router
- 192.168.56.254/24 ens19
- 192.168.58.254/24 ens20
- 192.168.57.254/24 ens21
- 192.168.59.254/24 ens22
- 172.23.4.54 ens18
**Pour Madeleine et Clément**
#### - vm-sql
- 192.168.59.2/24 ens19
- 172.23.3.216 ens18
#### - vm-lan
- 192.168.56.2/24 ens19
- 172.23.3.154 ens18
#### - vm-int
- 192.168.57.2/24 ens19
- 172.23.4.215 ens18
#### - vm-web
- 192.168.58.2/24 ens19
- 172.23.3.52 ens18
#### - vm-router
- 192.168.56.254/24 ens19
- 192.168.58.254/24 ens20
- 192.168.57.254/24 ens21
- 192.168.59.254/24 ens22
- 172.23.4.118 ens18
### Propriétés des Vms:
### - vm-int
- clone de vm-cli du projet Risque (TO DO: CORRIGER ERREURS module RISQUE)
- doivent disposer d'un client web léger (lynx) et d'un client ssh : vérifier avec commande:
```
ssh username@adresse_IP
```
```
lynx
g <URL site>
```
Ces commandes doivent fonctionner pour montrer que lynx et ssh sont bien installés sur le système
### - vm-lan
- clone de vm-cli du projet Risque (TO DO: CORRIGER ERREURS module RISQUE)
- doit disposer d'un client web léger (lynx) et d'un client ssh
### - vm-web
- clone de vm-web du projet du module Risque (TO DO: CORRIGER ERREURS module RISQUE / supprimer tout logiciel inutile)
- doit disposer d'un serveur web et d'une application PHP disponible en deux versions
Verification, si actif retourne "running since":
```
sudo service apache2 status
```
- applications web doivent chacune proposer un formulaire permettant de réaliser une requête sur la base de données de vm-sql et d'afficher le résultat en retour
### - vm-sql
- clone de vm-web du projet du module Risque (TO DO: CORRIGER ERREURS module RISQUE / supprimer tout logiciel inutile)
- on télécharge maria-db
```
sudo apt install mariadb-server
```
### Créer les réseaux reliant les machines virtuelles conformément à la figure:
Avec la commande suivante, on met adresse IP de sortie/on indente bien:
```
sudo nano /etc/netplan/00-installer-config.yaml
```
### - vm-int

### - vm-sql

### - vm-web

### - vm-lan

### - vm-router

## 2. Sécurisation de l'application web
### Création application cloisonné avec Backend: DMZ1 = Tiers application (Web) + DMZ2 = Tiers données (Sql)
- connexion à mariadb: avec mdp etu
```
sudo mysql -u root -p
```
- création de la BDD
```
CREATE DATABASE users;
USE users;
CREATE TABLE customers(
id INT(11) NOT NULL AUTO_INCREMENT,
nom VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
telephone VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
- Ajouter des données :
```SQL=
INSERT INTO customers (nom, password, telephone) VALUES
('John Doe', 'pass123', '1234567890'),
('Jane Smith', 'password123', '9876543210'),
('Michael Johnson', 'secret', '5555555555'),
('Alice Johnson', 'qwerty', '9999999999'),
('David Wilson', 'abcdef', '1111111111');
```

- Voir les table de la BDD et les infos rentrées dans la base :
```
SHOW TABLES;
SELECT * FROM customers;
```
- ajout d'un user droit lecture :
```
CREATE USER 'sr06p038'@'%' IDENTIFIED BY 'B7y27cVNz5uD';
GRANT ALL ON users.* TO 'sr06p038'@'%';
```
- Autoriser les connexions à distance :
```
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
bind-adresses=127.0.0.1 devient bind-adresses=0.0.0.0
sudo service mysql restart
```
- Se connecter via terminal au compte sr06p038
```
sudo mysql -u sr06p038 -h 192.168.59.2 -p
```
- Injection sql sur le site pas sécurisé depuis vm-lan par exemple: Montrer que ce n'est pas sécurisé
```
lynx 192.168.58.2:80/index_secur.php
```
```
nom: a' or 1=1; -- '
mot de passe: fahflez (n'importe quoi)
```
### rôle des trois tiers sont les suivants :
- Tiers présentation :
Il est constitué d'une page web et d'une page de style, utilisables par un client web léger depuis vm-lan et vm-int (faire simple).
Ces pages sont stockées sur vm-web et accédées via le serveur Apache de vm-web.
La page web propose à l'utilisateur un formulaire de saisie qui permettra de faire une requête dans la base de données et d'afficher les résultats de la requête.
- Tiers application :
C'est une application écrite en PHP, stockée sur vm-web et appelée depuis le tiers présentation.
Elle est en charge de réaliser les requêtes correspondant aux demandes exprimées par l'utilisateur via le formulaire du tiers présentation.
- Tiers gestion des données :
Il est constitué des tables SQL stockées sur vm-sql et gérées via MariaDB. Ces tables sont interrogées par le tiers applicatif
### Application:
L'application est disponible en deux versions afin de mettre en exergue des failles et de les corriger.
Ces deux versions sont accessibles via des URL différentes sur vm-web pour les besoins des tests.
La première version n'inclut aucune sécurité. La seconde version inclut les sécurisations recommandées.
https://www.php.net/manual/fr/security.database.sql-injection.php
### Application:
- Installer les paquets php-codesniffer et nikto. Configurer un utilisateur dédié pour restreindre l'utilisation des commandes de ces paquets (telles que phpcs et nikto).
```
sudo apt install php-codesniffer
```
```
sudo apt install nikto
```
utilisarteur phpcs (mdp: phpcs) a utiliser pour phpcs et nikto:
```
sudo adduser phpcs
# Adding user `phpcs' ...
# Adding new group `phpcs' (1002) ...
# Adding new user `phpcs' (1002) with group `phpcs' ...
# Creating home directory `/home/phpcs' ...
# Copying files from `/etc/skel' ...
sudo visudo
# raouter la ligne :
phpcs ALL=(ALL) NOPASSWD: /usr/bin/phpcs, /usr/bin/phpcbf
sudo chown phpcs /usr/bin/phpc*
sudo chgrp phpcs /usr/bin/phpc*
sudo chmod 700 /usr/bin/phpc*
sudo chown phpcs /usr/bin/nikto
sudo chgrp phpcs /usr/bin/nikto
sudo chmod 700 /usr/bin/nikto
```
- Utiliser phpcs sur vm-web afin d'analyser les deux versions de l'application.
```
phpcs /var/www/html/index.php
phpcs /var/www/html/index_secur.php
```
Si il y a des erreurs qui peuvent être corrigés :
```
sudo phpcbf /var/www/html/<file>
```
- Utiliser nikto sur vm-web et depuis vm-lan afin d'analyser les deux versions de l'application.
sur vm-web :
```
su phpcs
```
```
nikto -h 192.168.58.2
- Nikto v2.1.5
---------------------------------------------------------------------------
+ Target IP: 192.168.58.2
+ Target Hostname: 192.168.58.2
+ Target Port: 80
+ Start Time: 2023-05-22 13:59:44 (GMT0)
---------------------------------------------------------------------------
+ Server: Apache/2.4.41 (Ubuntu)
+ The anti-clickjacking X-Frame-Options header is not present.
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ DEBUG HTTP verb may show server debugging information. See http://msdn.microsoft.com/en-us/library/e8z01xdh%28VS.80%29.aspx for details.
+ OSVDB-561: /server-status: This reveals Apache information. Comment out appropriate line in httpd.conf or restrict access to allowed hosts.
+ 6544 items checked: 0 error(s) and 3 item(s) reported on remote host
+ End Time: 2023-05-22 13:59:59 (GMT0) (15 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
```
sur vm-lan :
```
nikto -h ns1.servweb.test
- Nikto v2.1.5
---------------------------------------------------------------------------
+ Target IP: 192.168.58.2
+ Target Hostname: ns1.servweb.test
+ Target Port: 80
+ Start Time: 2023-05-22 14:00:13 (GMT0)
---------------------------------------------------------------------------
+ Server: Apache/2.4.41 (Ubuntu)
+ The anti-clickjacking X-Frame-Options header is not present.
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ DEBUG HTTP verb may show server debugging information. See http://msdn.microsoft.com/en-us/library/e8z01xdh%28VS.80%29.aspx for details.
+ 6544 items checked: 0 error(s) and 2 item(s) reported on remote host
+ End Time: 2023-05-22 14:00:34 (GMT0) (21 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
```
# 3. Configuration du routage et du filtrage : ==Iptables==
- Chose à faire pour sauvegarder les iptables :
```
sudo apt-get install iptables-persistent
```
- A chaque fois que vous voulez sauvegarder les iptables
```
sudo iptables-save -f /etc/iptables/rules.v4
```
Si vous ne sauvegardez pas, les modifs seront perdues au redémarrage
## Configurer les vm de sorte à autoriser les connexion suivantes via vm-routeur
## Les routes
- Il faut créer une route qui passe par le routeur dans /etc/netplan/00-installer-config.yaml
Ne pas oubliez la commande après chaque modification :
```
sudo netplan apply
```
Voir image dans 1. pour les routes
## Configuration des règles du pare-feu
POUR TOUTES LES VMS SAUF VM-INT qui a TOUT En ACCEPT:
```
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD DROP
```
Liste :
- vm-lan peut contacter vm-web et vm-sql (service web et ssh)
- vm_int peut contacter vm-web (service web uniquement) via
- vm_web peut contacter vm-sql (accès à la base de données)
### sur vm-lan :
```
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
```
```
sudo iptables -A INPUT -i ens18 -j DROP
```
```
sudo iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT -m state --state ESTABLISHED
```
```
sudo iptables -A OUTPUT -o ens18 -j DROP
```
### Sur vm-web et vm-sql (les vms sont accessibles en ssh depuis vm-lan sur ens19) :
```
sudo iptables -A INPUT -i ens18 -j DROP
```
```
sudo iptables -A OUTPUT -o ens18 -j DROP
```
### Sur vm-router :
FORWARD
```
http LAN to WEB
sudo iptables -A FORWARD -s 192.168.56.2 -d 192.168.58.2 -p tcp --dport 80 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.56.2 -s 192.168.58.2 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
ssh LAN to WEB
sudo iptables -A FORWARD -s 192.168.56.2 -d 192.168.58.2 -p tcp --dport 22 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.56.2 -s 192.168.58.2 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Udp domain LAN to WEB
sudo iptables -A FORWARD -s 192.168.56.2 -d 192.168.58.2 -p udp --dport 53 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.56.2 -s 192.168.58.2 -p udp --sport 53 -j ACCEPT
Ssh LAN to sql
sudo iptables -A FORWARD -s 192.168.56.2 -d 192.168.59.2 -p tcp --dport 22 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.56.2 -s 192.168.59.2 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Int to web
sudo iptables -A FORWARD -s 192.168.57.2 -d 192.168.58.2 -p tcp --dport 80 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.57.2 -s 192.168.58.2 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Web to sql
sudo iptables -A FORWARD -s 192.168.58.2 -d 192.168.59.2 -p tcp --dport 3306 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.58.2 -s 192.168.59.2 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
Udp domain int to WEB
sudo iptables -A FORWARD -s 192.168.57.2 -d 192.168.58.2 -p udp --dport 53 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.57.2 -s 192.168.58.2 -p udp --sport 53 -j ACCEPT
```
### Sur vm-Sql
```
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
```
```
sudo iptables -A INPUT -i ens18 -j DROP
```
### Sur vm-Int
Aucune règle : tout en ACCEPT de base
### Configurer les vm de sorte à autoriser les connexion suivantes via vm-routeur :
- Aucune connexion ne peut atteindre vm-lan ;
```
sudo iptables -P FORWARD DROP
sudo iptables -A FORWARD -o ens19 -d 192.168.56.0/24 -j DROP
```
- Aucune connexion depuis vm-int ne peut atteindre vm-sql (DMZ).
Normalement pas besoin car on a tout refusé avec drop avant
```
sudo iptables -A FORWARD -i ens21 -s 192.168.57.0/24 -j DROP
```
## 4. Serveur DNS (pour Gi4+)
= retrouver le serveur web de la DMZ via son nom et non son adresse IP
- Ajouter un serveur DNS dans la DMZ WEB
- Configurer le DNS de sorte que le serveur web puisse être retrouvé grâce à son nom
- Adapter les règles de filtrage de manière à ce que le trafic DNS (UDP port 53) puisse être opérationnel, tout en gardant une politique par défaut de filtrage complet.
https://www.tutos.eu/3446
installation de Bind
```
sudo apt install bind9
```
dans /etc/bind/named.conf.options :
```
options {
directory "/var/cache/bind";
dnssec-validation auto;
listen-on-v6 { ::1; };
};
```
dans /etc/bind/named.conf.local :
```
//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
zone "servweb.test" {
type master;
file "/etc/bind/db.servweb.test";
};
```
dans /etc/bind/db.servweb.test
```
; Zone file for servweb.test
$TTL 1h
@ IN SOA ns1.servweb.test. admin.servweb.test. (
2023052101 ; Serial
1h ; Refresh
15m ; Retry
1w ; Expire
1h ; Minimum TTL
)
@ IN NS ns1.servweb.test.
ns1 IN A 192.168.58.2
```
la commande: nslookup ns1.servweb.test
```
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: ns1.servweb.test
Address: 192.168.58.2
```
dig ns1.servweb.test
```
; <<>> DiG 9.16.1-Ubuntu <<>> ns1.servweb.test
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62862
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;ns1.servweb.test. IN A
;; ANSWER SECTION:
ns1.servweb.test. 3404 IN A 192.168.58.2
;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun May 21 10:51:02 UTC 2023
;; MSG SIZE rcvd: 61
```
## Tests pendant PRESENTATION
Rappels
vm-lan peut contacter vm-web et vm-sql (service web et ssh)
vm_int peut contacter vm-web (service web uniquement)
vm_web peut contacter vm-sql (accès à la base de données)
Voir iptables :
```
sudo iptables -vL
```
- Tester le fonctionnement de l'application web depuis vm-lan et depuis vm-int.
TEST : depuis vm-lan ->vm-web :
```
lynx 192.168.58.2:80
```
```
lynx ns1.servweb.test
```
TEST : depuis vm-int ->vm-web :
```
lynx 192.168.58.2:80
```
```
lynx ns1.servweb.test
```
- Tester les connexions ssh depuis vm-lan vers vm-web et vm-sql.
TEST ssh: depuis Vm-lan -> Vm-sql
```
ssh etu@192.168.59.2
```
TEST ssh: depuis Vm-lan -> Vm-web
```
ssh etu@192.168.58.2
```
- Tester les interdictions décrites ci-dessus
Aucune connexion ne peut atteindre vm-lan :
```
ssh etu@192.168.56.2
```
: ne fonctionne pas
```
ping 192.168.56.2
```
: ne fonctionne pas
Aucune connexion depuis vm-int ne peut atteindre vm-sql (DMZ) :
```
ssh etu@192.168.59.2
```