Une connexion SSH permet d'administrer un serveur, Linux dans la plupart des cas. Cette connexion s'effectue grâce à un login et un mot de passe associé, généralement root (bien que le login root frontal soit déconseillé).
Si vous hébergez votre site/blog sur un serveur de type mutualisé ou dédié vous avez la possibilité de gérer ce serveur à distance via SSH. Autant dire que si une personne non autorisée se connecte sur votre serveur, il est libre de littéralement détruire toutes vos données ainsi que le système.
Il se peut parfois que l'on vous ait volé vos identifiants et que rien ne soit passé sur votre serveur, que l'attaquant attende un moment opportun pour attaquer ou collecter certaines de vos données. Et dans ce cas vous n'en saurez rien !
Je vous propose de mettre une place une notification par email (alerte) à chaque connexion effectuée sur votre serveur. Vous serez ainsi averti en temps réel de cette intrusion indésirable, à condition de consulter votre email régulièrement.
En pratique
A chaque connexion un fichier contenant des commandes est appelé, il s'agit du fichier .bashrc. Ce fichier est présent à la racine de chaque profil utilisateur Linux.
Éditez le fichier avec l'éditeur de votre choix (nano pour moi) :
nano ~/.bashrc
Se placer à la fin du fichier et ajouter le code suivant :
# notification email de chaque connexion ssh echo 'NOTIFICATION - Acces SSH en ROOT sur `hostname` le:' `date` `who` | mail -s "NOTIFICATION - Connexion en ROOT via SSH depuis: `who | cut -d"(" -f2 | cut -d")" -f1`" votre@email.com
En remplaçant votre adresse email en fin de ligne.
Si vous souhaitez envoyer le mail en copie à un second email :
# notification email de chaque connexion ssh echo 'NOTIFICATION - Acces SSH en ROOT sur `hostname` le:' `date` `who` | mail -s "NOTIFICATION - Connexion en ROOT via SSH depuis: `who | cut -d"(" -f2 | cut -d")" -f1`" votre@email.com -c second@email.com
Voici un exemple de notification reçue :
Déconnecter un utilisateur SSH
Si vous recevez une notification de connexion et que celle-ci ne vous semble pas autorisée à se connecter sur votre serveur, il vous faut réagir.
Lister toutes les connexions SSH utilisez la commande who:
server # who root pts/0 2009-10-24 15:17 (lns-bzn-20-82-55-3-2.adsl.proxad.net)
La date et l'heure sont celles de la connexion.
Si vous n'obtenez qu'une seule ligne alors c'est vous même qui êtes connecté et personne d'autre, vous pouvez retourner à vos occupations sans souci. En revanche, si deux lignes ou plus apparaissent c'est que vous n'êtes pas la seule personne connectée sur votre serveur.
Changer tout d'abord le mot de passe du compte concerné :
server # passwd nom_du_compte
A chaque connexion SSH le démon SSHD déclenche un processus, lui même identifié par un numéro de processus (PID). Il vous suffit de tuer le processus correspondant à cette connexion pour déconnecter l'utilisateur. Listons tous les processus correspondants à SSHD :
server # ps aux | grep sshd root 31115 0.0 0.0 8152 2472 ? Ss 15:16 0:00 sshd: root@notty
Dans notre cas il s'agit du PID 31115. Tuons le processus pour déconnecter l'utilisateur avec la commande kill -9 :
kill -9 31115
Conclusion
Ce système permet d'être averti en cas d'intrusion sur votre serveur, vous pouvez d'ailleurs utilisez des méchanismes d'avertissement par SMS si vous ne pouvez consulter vos mails en permanence.
Dans le cas où vous travaillez à plusieurs administrateurs sur un serveur, cela permet également d'avoir un historique de connexion.
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
19 commentaires
Excellent article !
Bravo, je comprend mieux, moi qui croyais que le SSH est un protocole de communication sécurisé.
@achille52 : SSH est un protocole de sécurisation sécurisé grâce un échange de clé en début de communication. Donner des identifiants n'engage en rien la sécurité du protocole. Le trou de sécurité dans les systèmes informatiques est souvent l'humain 🙂
Il est possible de réaliser du brutforce sur le SSH, mais il est également possible de s'en prémunir (fail2ban + règles iptables).
Intéressant et bien mieux expliquer que bon nombre de tuto sur le Net... mais tu aurais pas une possibilité pour pouvoir surveiller tous les logins de cette façon ?
Sympa l'article, dès que je trouve le temps ... Je configure ça sur mon serveur !
Hello
Pourquoi ne pas utiliser la variable d'environnement SSH_CLIENT ? Car ta méthode pose problème lorsque plusieurs utilisateurs sont connectés.
Ca serait donc bêtement :
echo 'NOTIFICATION - Acces SSH en ROOT sur `hostname` le:' `date` `who` | mail -s "NOTIFICATION - Connexion en ROOT via SSH depuis: $SSH_CLIENT" votre@email.com
ou echo $SSH_CLIENT|cut -d ' ' -f1 si tu ne veux que l'adresse IP
@gslongo : tu as raison, mieux vaut utiliser la variable $SSH_CLIENT, je n'y avais tout simplement pas pensé !
Merci pour cet excellent article !
(Par contre il ne s'agit pas de "nano ~./bashrc" mais de "nano ~/.bashrc")
@macben: c'est corrigé merci
Je précise : pour les personnes qui sont chez Free, il faut dans la config de la freebox sur votre compte Free autoriser l'envoi des mails sur le port 25 (interdit par défaut) et rebooter la freebox.
Ouais ! c'est pas mal, sauf que comme dab, certains se défocent, mais dans le vide, car ça ne marche pas !!!
Votre astuce est plutôt sympa, une sécurité supplémentaire directement utilisable et facile à installer.
En rajoutant cela :
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP
ont finalise la sécurité ssh
Bonjour,
Je dois passer à coté d'un détail car lorsque j'utilise la ligne de commande dans ma console, je reçois bien le mail, par contre une fois dans mon bashrc, et que je me connecte, aucun mail.
Quelqu'un a t'il une idée?
Merci d'avance
@kwark: tu veux dire que ça fonctionne quand tu te connectes physiquement devant la machine et pas à distance via un client SSH ?
Ne serait-il pas plus logique de mettre ça dans le fichier /etc/profile ? Ainsi, la fonction marche pour tous les utilisateurs du système.
D'ailleurs, pour être sûr qu'il y a bien un client SSH lancé (sinon les appels depuis un cron vont charger le bashrc aussi), il faudrait ajouter un test :
if [ "$SSH_CLIENT" != "" ]; then
## commande mail
fi
@Yvan:
Pour ma part, le root est redirigé sur mon mail perso (/etc/aliases), donc ça se simplifie en :
if [ ! -z "$SSH_CLIENT" ]; then
echo "Connexion SSH en $USER sur `hostname` depuis $SSH_CLIENT" | mail -s "Connexion via SSH depuis : $SSH_CLIENT" root
fi
Ce qui donne le user qui va bien, l'adresse IP de la machine qui s'y connecte et n'impacte pas tous les crons lancés.
Merci en tout cas pour cette information, qui m'a permis de mettre en place quelque chose de très simple !
@Yvan: En entreprise je passe aussi via le fichier aliases pour simplifier les configurations, tu fais bien !
Bonjour après un message d'erreur de syntaxe sur " ( " j'ai du modifier la commande who | cut -d"(" -f2 | cut -d")" -f1
elle a pour ma part fonctionné en changeant les " par cela: '
Ce qui donne:
# notification email de chaque connexion ssh
echo 'NOTIFICATION - Acces SSH en ROOT sur hostname le:' date who | mail -s "NOTIFICATION - Connexion en ROOT via SSH depuis: who | cut -d'(' -f2 | cut -d')' -f1" votre@email.com
Si cela peut aider quelqu'un!
Cordialement
@Ertios: j'ai corrigé la mise en forme, je pense que WordPress a remplacé certains caractères, maintenant cela devrait être bon 🙂