Skip to content

Sécurisation du service web

JarodEphec edited this page Aug 25, 2022 · 10 revisions

Sécurisation du service web

Responsable : Jarod Boulanger-Flémal

Statut de l'étape : en attente de validation

Site statique : https://www.woodytoys.store

Site dynamique : https://b2b.woodytoys.store:8443

Identification des risques

  • Attaques de type "Déni de service" (Denial of Service - DoS) : une ou plusieurs machines envoie beaucoup de requête au serveur ce qui créé un grand ralentissement du service.
  • Protection des fichiers du serveur : Certain fichier du système pourrait est présent sur le web serveur et créé une faille de sécurité.
  • Cross-site scripting (XSS): Permet au d'envoyer du code malveillant à la personne qui navigue sur le site pendant l'échange de requête avec le serveur.
  • Intrusion SQL : Le hacker test plein de mot de passe pour ce connecter en temps que root à la base de donnée.
  • Injection SQL : Le hacker envoie des requête sql pour trouver des failles ce qui lui permet d'envoyer son propre code malveillant à la base de donnée.

Contre-mesures contrant les risques identifiés

  • Mettre un TimOut dans la configuration d'apache, par défaut à 60 seconds, il peut être baissé.
  • Bien mettre les fichiers visible par l'utilisateur dans un fichier appart et utiliser docker pour isoler le service de la machine host.
  • Utiliser un certificat SSL sur les sites pour assurer leurs identités et encrypter les échanges entre l'utilisateur et le serveur.
  • Bloquer le port public mysql et utiliser ssh pour se connecter depuis l'extérieure.

Choix des contre-mesures et justification

Certificat SSL

Les deux sites sont équipé de leurs propre certificat ssl, généré via le site zeroSSL. Pour ce faire il faut avoir un nom de domaine et une adresse Email lier a celle-ci.

Une fois les certificats généré, il faut les activés sur les deux services. J'ai créé un nouveau fichier dans WEB, HTTPS contenant les fichiers de configuration en plus qui permette de faire fonctionner HTTPS.

Activer HTTPS

Pour les deux serveurs, la mise en place a été assez similaire, voici leurs configurations.

  1. Ajouter le server name dans le fichier my-httpd.conf pour le site statique et apache2.conf pour le site dynamique.
ServerName www.woodytoys.store
ServerName b2b.woodytoys.store
  1. Ajouter le virtual host dans le fichier httpd-ssl.conf pour le site statique et default-ssl.conf pour le site dynamique.
<VirtualHost _default_:443>

#   General setup for the virtual host
DocumentRoot "/usr/local/apache2/htdocs"
ServerName www.woodytoys.store
ServerAdmin admin@woodytoys.store
...
<VirtualHost _default_:443>
                ServerName b2b.woodytoys.store
                #ServerAlias https://b2b.woodytoys.store
                ServerAdmin admin@woodytoys.store
                DocumentRoot /var/www/html
...
  1. Dans ce même fichier, pour le site dynamique, il faut dé-commenter ces lignes pour activer l'extension.
...
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
...
#LoadModule ssl_module modules/mod_ssl.so
...
#Include conf/extra/httpd-ssl.conf
...

Pour activer l'extension sur le dynamique, tout ce passe depuis le Dockerfile.

  1. Les Dockerfile permette de mettre tout les fichiers aux bonne endroit.

Dockerfile du site static:

FROM httpd
COPY ./public-html/ /usr/local/apache2/htdocs/ ;Copie de tout les fichiers visible par le client du site
COPY ./my-httpd.conf /usr/local/apache2/conf/httpd.conf ;copie du fichier de configuration de base
COPY ./server.crt /usr/local/apache2/conf/ ;copie des deux certificats ssl
COPY ./server.key /usr/local/apache2/conf/
COPY ./httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf ;copie du fichier de configuration ssl

Dockerfile du site dynamique:

FROM php:7.2-apache
RUN docker-php-ext-install mysqli ; installation extention mysql
RUN a2enmod rewrite && a2enmod ssl && a2enmod socache_shmcb ;activation des service requis pour HTTPS
COPY ./server.crt /etc/ssl/certs/ ;copie des deux certificats ssl
COPY ./server.key /etc/ssl/private/
COPY ./public-html/ /var/www/html/ ;Copie de tout les fichiers visible par le client du site
COPY ./default-ssl.conf /etc/apache2/sites-available/default-ssl.conf ;copie du fichier de configuration ssl
COPY ./apache2.conf /etc/apache2/apache2.conf ;copie du fichier de configuration de base
RUN a2ensite default-ssl ;activation du service SSL

MYSQL via ssh

Ssh permet de sécuriser la connexion à la base de donnée vers l'extérieur via l'utilisation d'une paire de clé.

  1. Généré les clés ssh.

Pour l'utiliser il vous faudra utiliser une paire de clé pouvant être généré grâce à ssh-keygen, la clé avec l'extension .pub est pour le serveur et la clé sans extension est pour l'utilisateur.

  1. Désactiver la connexion par mot de passe.

Dans le fichier /etc/ssh/sshd_config mettre la ligne PasswordAuthentication et de mettre la valeur à no.

PasswordAuthentication no
  1. Se connecter à mysql avec l'adresse ip local de l'interface virtuel de docker avec php.

Pour connaitre l'ip de cette interface, taper cette commande avec le nom de votre container :

docker exec *nom du container* cat /etc/hosts
  1. Désactiver le port mysql.

Mon VPS est chez microsoft azure donc je ferme et ouvre mes ports depuis un interface web mais avec un VPS classique il faudrait utiliser un pare-feu comme UFW.

Avant toute chose, il faut autorisé le port ssh pour être sûr de ne pas être bloqué.

sudo ufw allow *port ssh (défaut 22)*

Puis désactiver le port de mysql.

sudo ufw deny 3306

Puis activer le pare-feu.

sudo ufw enable
  1. Se connecter a un client mysql avec ssh

Pour presque tout les clients(mysql workbench, heidisql, dbeaver,...) le principe est le même, il faut mettre localhost comme adresse du serveur mais toujours mettre les identifiant de connexion. Screenshot_20220825_084644

Puis dans la partie ssh, activer le tunnel ssh, mettre l'ip du VPS, le port ssh, le nom d'utilisateur du VPS et dans la méthode d'identification sélectionner clé publique. À présent donné le chemin de votre clé privé ssh et vous pouvez vous connecter.

Screenshot_20220825_085515

Source

Clone this wiki locally