Web Publique Sécurité - MaximeDanlee/admin2-projet GitHub Wiki

Sécurité

Potentiels vulnérabilités

  • É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.

Solutions trouvées

HTTPS

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;

Utilisateur spécifique pour le serveur web

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'];

Utilisation de paramètres pour l'accès à la base de données

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/

Sécuriser les dossiers avec les configurations/site web

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.

Interdire l'accès au site pour des non-humains

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;
}

Sources

Sources Importantes pour le HTTPS

Utiliser la combination des sources pour générer le certificat ssl et activer HTTPS sur nginX.

Pour créer et gérer les permissions de MySQL

⚠️ **GitHub.com Fallback** ⚠️