mesures prises pour la sécurité - falcoda/Projet-DevWeb-III GitHub Wiki
Sécurité du Serveur
Sécurité contre xss (cross-site scripting)
Il s'agit d'un type de faille de sécurité. Le cross-site scripting est le fait d'injecter du contenu dans une page afin d'effectuer des actions dans les navigateur web visitant le site. Il est également possible de rediriger vers d'autres site afin de faire de l'hameçonnage ou encore de voler les identifiants de connexions.
Nous avons essayé d'effectué ce genre d'attaque sur notre site mais cela ne semble pas fonctionner. Cependant, nous nous sommes renseignés sur les protections contre ce genre d'attaque et avons trouvés le module "xss" de node js qui permet d'effectuer des tests sur les données envoyées vers le serveur. Voici le lien vers la documentation du module xss
Sécurité contre les injections sqli
Il s'agit d'une méthode expoitant des failles de sécuritées d'une application intéragissant avec une base de donnée. Elle permet d'injecter un morceau de requête dans la requête SQL en cours. Cela a pour but de compromettre la sécurité de la base de donnée.
Pour se protéger contre ce genre d'attaque nous utilisons un outil du module mysql qui est de mettre un "?" à l'endroit ou on souhaite mettre une donnée dans la requête sql. Voici un petit exemple :
connexion.query( 'SELECT * FROM utilisateurs WHERE id =?' , [ userId ] , function (results) { ... } );
Voici la liste des valeurs qui sont échapées grâce au "?" :
- Les nombres restent inchangés
- Les booléens sont convertis en true/false
- Les objets de date sont convertis en 'YYYY-mm-dd HH:ii:ss'chaînes
- Les tampons sont convertis en chaînes hexadécimales, par exemple X'0fa5'
- Les chaînes sont échappées en toute sécurité
- Les tableaux sont transformés en liste, par exemple ['a', 'b']en'a', 'b'
- Les tableaux imbriqués sont transformés en listes groupées (pour les insertions groupées), par exemple ['a', 'b'], 'c', 'd'se transforment en('a', 'b'), ('c', 'd')
- Les objets qui ont une toSqlStringméthode seront .toSqlString()appelés et la valeur retournée est utilisée comme SQL brut.
- Les objets sont transformés en key = 'val'paires pour chaque propriété énumérable sur l'objet. Si la valeur de la propriété est une fonction, elle est ignorée; si la valeur de la propriété est un objet, toString () est appelé dessus et la valeur renvoyée est utilisée.
- undefined/ nullsont convertis en NULL
- NaN/ Infinity sont laissés tels quels. MySQL ne les prend pas en charge, et essayer de les insérer en tant que valeurs déclenchera des erreurs MySQL jusqu'à ce qu'elles implémentent le support.
Sécurisation
- Afin de sécuriser au mieux notre serveur nous avons mis en place le protocole https.
Voici comment nous nous y sommes pris :
Nous avons générés des clés à l'aide de l'outil OpenSSL en fonction de différents paramètre tels que le nom de l'ASBL mais également l'adresse email du président, ect.
openssl genrsa -out key.pem
openssl req -new -key key.pem -out csr.pem
openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem
rm csr.pem
Ensuite nous utilisons ces deux clés dans les options de démarrage de notre serveur afin que notre site web soit accessible via le protocole https.
let https = require("https");
let fs = require("fs");
let options = {
key: fs.readFileSync('./key.pem'),
cert: fs.readFileSync('./cert.pem')
};
https.createServer(options, app).listen(443);
- Premièrement, nous ajoutons les modules https et fs à notre serveur Node Js.
- Ensuite, nous déclarons une variable appelée options qui contient le chemin vers les deux fichiers contenant les clés générées précédement.
- Finalement, nous lançons un serveur d'écoute sur le port 443.
- La seconde chose que nous avons mis en place pour sécuriser le serveur est un fail2ban
Afin d'installer ce dernier il suffit d'utiliser les commandes suivantes :
apt-get install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Voici deux commandes utiles lorsque vous avez un fail2ban sur votre serveur :
sudo fail2ban-client status sshd ==> Voir la listes des adresses ip bannies
sudo fail2ban-client set sshd unbanip [...] ==> Dé bannir quelqu'un via son addresse ip
- Nous avons également généré des mots de passes alléatoirs avec le site "https://www.motdepasse.xyz/" afin d'augmenter la sécurité de ceux-ci
Sécurité logicielle
Afin de se proteger contre les attaques de brut force et des attaques DDOS, nous avons rajouté un module node JS permettant de limiter le nombre de requètes par minutes.
Installation
Il suffit d'installer le module directement sur le serveur
npm install --save express-rate-limit
Utilisation
Nous avons paramètrer le plugin de la manière suivante :
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 250
});
app.use(limiter);
Nous limitons le nombre de requètes a 250 par minutes.
Module Forever
Dans le cas ou des personnes arriveraient a faire tomber notre site internet, nous utilisons le module node js "forever" afin d'assurer un redémarrage automatique du serveur.
installation
Il faut utiliser cette commande : sudo npm install forever -g
Commandes utiles
- sudo forever start server.js : afin de démarrer le serveur
- sudo forever list : afin de lister les processus de forever
- sudo forever stopall : afin d'arreter le site
- sudo forever restartall : afin de redémarrer le site