Utilisation du service de notification par sms de free pour une connexion ssh à un serveur

Rédigé par Alain Olivetti - -
Free a récemment mis en place une option, activable sur l'interface de gestion de votre abonnement, afin d'envoyer des sms sur votre portable depuis un appareil connecté via une page web. Il est donc possible de l'utiliser pour s'envoyer des messages depuis un script exécuté sur un serveur par exemple.

Étant convaincu que malgré toute l'énergie que je peux dépenser, il m'est impossible d'empêcher un pirate de s'introduire dans un de mes serveurs, je me suis dit que ce serait une bonne idée d'utiliser ce service de notification afin de m'en avertir au plus tôt (si cela devait arriver).
L'idée est la suivante, dès qu'un utilisateur se connecte au serveur en ssh, le serveur exécute un script qui m'envoie par sms l'identité de l'utilisateur ainsi que son adresse ip de connexion.

Pour un maximum de sécurité, on m'a conseillé de réaliser cela au niveau du système d'authentification PAM. Dans les grandes lignes cela fonctionne de la manière suivante : lorsqu'un utilisateur se connecte en ssh, le démon sshd demande au système PAM d'effectuer l'authentification. C'est à ce niveau que sera exécuté le script.

Étape 1 : le script

Voici comment mettre cette solution en place. Tout d'abord, il faut créer le script. La version ci-dessous est une version modifié/simplifié du script freemobile-smsapi-client disponible sur GitHub :
#!/bin/sh

# Envoi de sms uniquement pour l'ouverture d'une session
if [ "$PAM_TYPE" != "open_session" ]; then
	exit 0
fi

# Caractère de fin de ligne (http://en.wikipedia.org/wiki/Percent-encoding#Character_data)
NEWLINE_CHAR="%0D%0A" # Valeurs possibles : %0A, %0D et %0D%0A

# URL d'accès à l'API
SMSAPI_BASEURL="https://smsapi.free-mobile.fr"

# Action d'envoi de notification
SMSAPI_SEND_ACTION="sendmsg"

# Login utilisateur / identifiant Free Mobile (celui utilisé pour accéder à l'Espace Abonné)
USER_LOGIN="??????????"

# Clé d'identification (générée et fournie par Free Mobile via l'Espace Abonné, "Mes Options" : https://mobile.free.fr/moncompte$
API_KEY="??????????"

MESSAGE_HEADER="Connexion SSH${NEWLINE_CHAR}--${NEWLINE_CHAR}"

MESSAGE_FOOTER="${NEWLINE_CHAR}--${NEWLINE_CHAR}Serveur: `hostname -s`"

MESSAGE_TO_SEND="date: `date`${NEWLINE_CHAR}login: $PAM_USER${NEWLINE_CHAR}from: $PAM_RHOST"

FINAL_MESSAGE_TO_SEND="$MESSAGE_HEADER$MESSAGE_TO_SEND$MESSAGE_FOOTER" # Assemble header, message et footer

HTTP_STATUS_CODE=$(curl --insecure --get "$SMSAPI_BASEURL/$SMSAPI_SEND_ACTION" --data "user=$USER_LOGIN" --data "pass=$API_KEY" --dat$

# Codes réponse HTTP possibles
# 200 : Le SMS a été envoyé sur votre mobile.
# 400 : Un des paramètres obligatoires est manquant.
# 402 : Trop de SMS ont été envoyés en trop peu de temps.
# 403 : Le service n'est pas activé sur l'espace abonné, ou login / clé incorrect.
# 500 : Erreur côté serveur. Veuillez réessayez ultérieurement.

if [ "$HTTP_STATUS_CODE" -eq 200 ]; then
    # echo "API responded with 200: exiting with 0" #DEBUG
    exit 0
else
    echo "Error: API responded with $HTTP_STATUS_CODE"
    exit 1
fi
On sauvegarde le fichier en lui donnant le nom que l'on veut. Ici je vais l'appeler smsfree.sh et je le sauvegarde dans le dossier /usr/bin. Pour finir, on rend le script exécutable :
$chmod +x smsfree.sh
Remarques :