abdou-rachidou / PSMM

0 stars 0 forks source link

Introduction du sujet

Le but est de récupérer les logs de serveurs FTP, SQL, Web et d’archiver les tentatives d’accès avec un compte / mot de passe non valide dans des bases SQL avec envois de mail journalier à l'administrateur système. Pour cela, vous allez avoir besoin de trois serveurs : FTP, MariaDB, Web.

Job 1: Installation des VM Debian

Nous avons trois VM serveurs sans GUI à installer (Un serveur FTP, un serveur Web et un Serveur MariaDB)

Configuration Hardware et Réseau du Serveur FTP

The primary network interface

allow-hotplug ens33
iface ens33 inet static

Configuration Hardware et Réseau du Serveur Web (Nginx avec avec auth/basic)

Hardware :

The primary network interface

allow-hotplug ens33
iface ens33 inet static

Configuration Hardware et Réseau Serveur MariaDB

The primary network interface

allow-hotplug ens33
iface ens33 inet static

Bloquer l'accès root via ssh via une machine distant

Ajout de la ligne suivante dans le fichier sudo nano "/etc/ssh/sshd_config"

  PermitRootLogin no

Job 2: Préparation de la quatrième VM(Client) ou WSL (Debian) depuis notre machine physique

Ici, nous allons utiliser WSL Debian sur notre machine

Création de notre clé ssh avec la commande "ssh-keygen" et la copie de la clé sur nos serveurs respectifs avec la commande "ssh-copy-id -i " :

  ssh-keygen -t ed25519 -C "La clé ssh pour les trois serveurs"

  ssh-copy-id -i /home/rachid/.ssh/id_ed25519.pub sql@192.168.226.133
  ssh-copy-id -i /home/rachid/.ssh/id_ed25519.pub nginx@192.168.226.131
  ssh-copy-id -i /home/rachid/.ssh/id_ed25519.pub ftpuser@192.168.226.129

Accéder à nos serveur depuis une machine distante :

  ssh sql@192.168.226.133
  ssh nginx@192.168.226.131
  ssh ftpuser@192.168.226.129

Installation des outils nécessaires

Installer les outils et clients nécéssaires pour le test de nos serveurs

  sudo apt update
  sudo apt install mariadb-client
  sudo apt install ftp

Par contre en ce qui concerne les installation avec la commande "pip", nous allons crée un environnement virtuel dans notre WSL pour pour installer les modules nécessaires à ce projet.

Créer un environnemt qu'on va nommer "rachidenv"

  sudo apt install python3.11-venv
  sudo python3 -m venv ~/rachidenv

Accéder à l'environnement virtuel crée :

  source ~/rachidenv/bin/activate

Installer les packages nécessaires :

  pip install yagmail requests

Créer un répertoire pour y mettre nos scripts

  mkdir pycripts

Job 3: Script "ssh_login.py" / "connexion.json"

Nous devons faire un script “ssh_login.py”, qui depuis la VM , va se connecter sur un des serveurs et lancer une commande shell (par exemple «df» ou «ls» ou autre).

Job 4: script + fichier .json "ssh_login_sudo.py" / "connexion.json

Nous allons utiliser le script précédent pour faire un script “ssh_login_sudo.py”, qui depuis la VM, va se connecter sur un des serveurs et lancer une commande shell, cette fois en mode «sudo».

Job 5: script + fichier .json "ssh_mysql.py" / "connexion_mysql.json"

Maintenant que nous pouvons lancer des commandes shell en «sudo» , nous allons nous connecter sur le serveur MariaDB/MySQL. Nous allons faire un script ssh_mysql.py, pour vérifier que nous avons bien accès au serveur MariaDB/MySQL.

Job 6:

Plan général :

Création de la base de données et des tables

Connexion à la base de donnée

  mariadb -u sql -p

Crée une base de données pour stocker les logs des accès échoués :

CREATE DATABASE ssh_access_logs;

Sélectionner la base de données :

USE ssh_access_logs;

Crée une table pour stocker les informations sur les tentatives d'accès échouées. Cette table va contenir le nom d'utilisateur utilisé, l'IP de l'utilisateur ayant tenté de se connecter, et la date/heure de la tentative :

CREATE TABLE failed_logins_mariadb(
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255),
    ip_address VARCHAR(45),
    attempt_time TIMESTAMP
);

Cette table contient trois colonnes :

Configuration des logs de MariaDB

Pour enregistrer les erreurs de connexion dans les logs, il faut s'assurer que la journalisation des erreurs (error logs) est activée dans la configuration de MySQL/MariaDB.

  sudo nano /etc/mysql/my.cnf

Ajouter les paramètres suivantes :

  [mysqld]
log_error = /var/log/mysql/error.log
log_warnings = 2

Redémarre MariaDB pour appliquer les changements :

  sudo systemctl restart mysql
  sudo systemctl restart mariadb

Génère des erreurs d'accès en essayant de se connecter avec des mauvais identifiants :

  mariadb -u test -test

Cette commande va enregistrer des tentatives échouées dans le fichier de log sous la forme suivante quand nous faisons un "cat" de /var/log/mysql/error.log :

  cat /var/log/mysql/error.log

La sortie de la commande affichera quelque chose comme ça 2024-09-21 14:04:15 31 [Warning] Access denied for user 'test'@'localhost' (using password: NO)

Le script ssh_mysql_error.py (Voir le script )

Permettre à mon utilisateur sql pour se connecter ma db et lui donner les privilèges nécéssaires :

CREATE USER 'sql'@'192.168.226.1' IDENTIFIED BY 'sql';

On remarque qu'on a spécifié une adresse IP 192.168.226.1 et non localhost parce qu'on veut que l'utilisateur puisse se connecter depuis une addresse IP spécifique qui est le 192.168.226.133 (adresse IP du serveur sql). Par conséquent on a mis le 192.168.226.1 pour l'utilisateur sql par ce que quand on essaye de se connecter à MariaDB depuis le WSL l'adresse IP 192.168.226.1 est perçu comme la passerelle du WSL vers le Serveur MariaDB.

Changer le localhost en spécifiant une addresse IP spécifique

Ouvrir le fichier /etc/mysql/mariadb.conf.d/50-server.cnf et modifier la ligne : bind-address = 192.168.226.133

Décommenter les lignes suivantes pour la gestion des logs :

  general_log_file       = /var/log/mysql/mysql.log
  general_log            = 1
  log_error = /var/log/mysql/error.log

Vérifier si le serveur MariaDB écoute sur le port 3306 et l'adresse qu'on a spécifié

  sudo ss -tuln | grep 3306

Résultat : tcp LISTEN 0 80 192.168.226.133:3306 0.0.0.0:* On peut constater que toutes les configuration sont prises en comptes :

Maintenant, on peut se connecter depuis notre WSL avec la commande :

  mysql -u sql -p -h 192.168.226.133

Ou encore choisir directement une base de données :

  mysql -u sql -p -h 192.168.226.133 ssh_access_logs

En ce qui concerne le script pour récupérer les mauvais tentatives d'accès au serveur MariaDB dans le fichier des logs et les insérer dans la base de données > voir le script ssh_mysql_error.py et le fichier .json ssh_mysql_error.json

Job 7 :

On va désormais s’attaquer au serveur FTP, sur votre poste installer FileZilla et accéder au serveur FTP, et depuis la VM depuis un client FTP en CLI Faites plusieurs accès avec des utilisateurs/MdP qui ne sont pas bons (pour que le serveur FTP génère des logs avec des erreurs d’accès).

Écrire le script ssh_ftp_error.py, pour qu’il récupère les logs d’erreur et les écrire dans votre base de données.

En ce qui concerne le script pour récupérer les mauvais tentatives d'accès au serveur MariaDB dans le fichier des logs et les insérer dans la base de données > voir le script ssh_ftp_error.py et le fichier .json ssh_ftp_error.json

Crée une table pour stocker les informations sur les tentatives d'accès échouées. Cette table va contenir le nom d'utilisateur utilisé, l'IP de l'utilisateur ayant tenté de se connecter, et la date/heure de la tentative :

CREATE TABLE failed_logins_ftp(
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255),
    ip_address VARCHAR(45),
    attempt_time TIMESTAMP
);

Cette table contient trois colonnes :

Job 8 :

On va maintenant s’attaquer au serveur Web. Le serveur Web est protégé par un compte utilisateur et mot de passe. Faites plusieurs accès avec des utilisateurs / MdP qui ne sont pas bons (pour que le serveur Web génère des logs avec des erreurs d’accès). Écrire le script ssh_web_error.py, pour récupérer les logs d’erreurs et les écrire dans votre base de données.

Crée une table pour stocker les informations sur les tentatives d'accès échouées. Cette table va contenir le nom d'utilisateur utilisé, l'IP de l'utilisateur ayant tenté de se connecter, et la date/heure de la tentative :

CREATE TABLE failed_logins_web(
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255),
    ip_address VARCHAR(45),
    attempt_time TIMESTAMP
);

Cette table contient trois colonnes :

Job 9 :

Maintenant que l’on a créé nos bases SQL avec les erreurs d’accès, il va falloir avertir l’administrateur. Il faut écrire un script “ssh_serveur_mail.py”, qui va envoyer un mail à l'administrateur avec les historiques des tentatives de connexion de la veille.

Étapes à suivre :

Structure générale du script ssh_serveur_mail.py :

SSH Serveur Mail

Ce script Python ssh_serveur_mail.py récupère les tentatives de connexion SSH échouées depuis une base de données MySQL et envoie un rapport par e-mail. Il supporte deux méthodes d'envoi d'e-mails : SendGrid et SMTP Gmail.

Prérequis

Méthode 1 : Envoi d'e-mails avec SendGrid