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.
Nous avons trois VM serveurs sans GUI à installer (Un serveur FTP, un serveur Web et un Serveur MariaDB)
allow-hotplug ens33
iface ens33 inet static
Hardware :
allow-hotplug ens33
iface ens33 inet static
allow-hotplug ens33
iface ens33 inet static
Ajout de la ligne suivante dans le fichier sudo nano
"/etc/ssh/sshd_config"
PermitRootLogin no
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
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
"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).
"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».
"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.
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 :
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 )
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.
Ouvrir le fichier /etc/mysql/mariadb.conf.d/50-server.cnf
et modifier la ligne :
bind-address = 192.168.226.133
general_log_file = /var/log/mysql/mysql.log
general_log = 1
log_error = /var/log/mysql/error.log
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 :
mysql -u sql -p -h 192.168.226.133
mysql -u sql -p -h 192.168.226.133 ssh_access_logs
ssh_mysql_error.py
et le fichier .json ssh_mysql_error.json
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.
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 :
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 :
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.
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.
pip install mysql-connector-python sendgrid
Créez un fichier ssh_serveur_mail.json
avec les informations de configuration de la base de données et de (l'e-mail. Voir le fichier ssh_serveur_mail.json
contenant la configuration avec sendGrid utilisant une clé API)
Fichier ssh_serveur_mail.json (SendGrid) :
{
"db_config": {
"user": "nom d'utlisateur",
"password": "passwd utilisateur",
"host": "IP du serveur",
"database": "nom de la base de données"
},
"email_config": {
"sender": "your_verified_email@domain.com",
"recipient": "recipient_email@domain.com",
"clé": "clé api"
}
}
;
Utilisez une adresse e-mail vérifiée par SendGrid comme expéditeur.
Fichier ssh_serveur_mail.json (SMTP Gmail) :
{
"db_config": {
"user": "sql",
"password": "sql",
"host": "192.168.226.133",
"database": "ssh_access_logs"
},
"email_config": {
"sender": "your_email@gmail.com",
"password": "your_gmail_app_password",
"recipient": "recipient_email@gmail.com",
"smtp_server": "smtp.gmail.com",
"smtp_port": 587
}
}