Web Publique Sécurité - MaximeDanlee/admin2-projet GitHub Wiki
- Écoute des informations échangés entre le client et le serveur,
- Injection d'SQL à l'aide de formulaires sur le site,
- Accès au fichiers du site/base de données par des personnes non-autorisés,
- Attaques DDoS.
Pour sécuriser la communication entre le serveur et le client, l'utilisation d'HTTPS est indispensable. Pour ça, il faut que le port écooute uniquement sur le port 443 et non plus sur le port 80. Ensuite, à l'aide de certbot et d'un certificat venant de "Let's Encypt" il fuat générer et renouvler régulièrement le certificat SSL. Dans la configuration de NginX on s'assure qu'on utilise bien le port 443 et on spécifie ou trouver les fichier pour la certification et le chiffrement SSL. Enfin, on spécifie quels version de SSL/TLS utiliser.
Configuration
--générer le certificat SSL-- certonly --webroot --webroot-path=/var/www/certbot --email [email protected] --agree-tos --no-eff-email -d l2-2.ephec-ti.be -d b2b.l2-2.ephec-ti.be -d www.l2-2.ephec-ti.be --renouvler le certificat-- while :; do certbot renew; sleep 12h & wait $${!}; done;'
Ensuite, dans le fichier de configuration NginX
listen 443 ssl http2; ssl_protocols TLSv1.2 TLSv1.3 ; ssl_certificate /etc/nginx/ssl/live/l2-2.ephec-ti.be/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/live/l2-2.ephec-ti.be/privkey.pem;
Pour augmenter la sécurité au niveau de la abse de données, le serveur web disposera uniquement des droits dont il a besoin. Ces droits seront limités à uniquement la ou les bases de données dont il a besoin ainsi que les action qu'il a besoin de faire.
Pour ce faire, il faut d'abord créer un utilistaeur avec mysql spécifiquement pour le site web
mysql> CREATE USER 'b2b'@'172.16.129.4' IDENTIFIED BY ''; mysql> GRANT SELECT,INSERT,UPDATE ON example_database.* TO 'b2b'@'172.16.129.4'; mysql> FLUSH PRIVILEGES;
Ensuite, il faut configurer le site web à n'utiliser que cet utilisateur pour accéder à la base de données (principalement dans la page php du site)
$hostname='172.16.129.10'; $user = "b2b"; $password = "password"; $database = "example_database"; $table = "todo_list";
Mots de Passe
Pour éviter d'exposer le mot de passe de la base de données sur github, au lieu de mettre le mot de passe directement dans le fichier process.php on l'extrait d'un fichier mysql.ini. Ce fichier ne sera bien évidemment pas push sur le GitHub, mais sera simplement écrit directement sur le serveur. De cette façon, l'interpréteur php va extraire le mot de passe de se fichier et le mot de passe ne sera ni accessible depuis GitHub, ni accessible lorsque, en cas d'erreur le serveur commence à publier des fichier php.
// parse mysql.ini for creditials
$mysql_config = parse_ini_file('mysql.ini');
//mysql credentials
$mysql_host = $mysql_config['host'];
$mysql_username = $mysql_config['username'];
$mysql_password = $mysql_config['password'];
$mysql_database = $mysql_config['database'];
Dans le but d'éviter des attaques d'injection SQL les accès à la bases de données depuis le back-end se feront à l'aide de paramètres. Ceci est fait grâce à la fonction
bind_params()présente dans le langage PHP. Cette fonction permet d'ajouter des paramètres à des scripts SQL. De cette façon, l'information du client n'aura aucun effet sur la procédure SQL et l'injection de SQL devient très difficile.
Source: https://geekflare.com/sql-injection-prevention-php/
Pour protéger les configurations du serveur web et les fichiers du site web (front-end et back-end) les dossiers dans lesquelles se trouvent ces fichiers seront accessibles uniquement aux utilisateurs concernés. Parmis ces utilisateurs se trouvent les administrateurs de l'installation informatique et le management de WoodyToys.
Pour bloquer les attaques de déni de service distribué, l'accès au site par des entités non humaines sera interdit. Ceci sera fait grâce au fichier de configuration de bind. Ce dernier reverra le code "403 - Forbidden" au client qui (non-humain) qui essaye d'accéder au site.
if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; }
- https://www.linuxtechi.com/harden-secure-nginx-web-server-linux/
- https://www.howtoforge.com/tips-and-tricks-to-secure-your-nginx-web-server/#prevent-information-disclosure
- https://certbot.eff.org/lets-encrypt/debianbuster-nginx
-
https://stackoverflow.com/questions/3354242/a-better-approach-than-storing-mysql-password-in-plain-text-in-config-file
- https://pentacent.medium.com/nginx-and-lets-encrypt-with-docker-in-less-than-5-minutes-b4b8a60d3a71
- https://www.cloudbooklet.com/how-to-install-nginx-and-lets-encrypt-with-docker-ubuntu-20-04/
Utiliser la combination des sources pour générer le certificat ssl et activer HTTPS sur nginX.