75 votes

Puis-je faire en sorte que la webcam prenne une photo lorsqu'un mot de passe incorrect est saisi ?

J'utilise un ordinateur portable. Je pensais avoir un support dans ma machine Ubuntu. Lorsqu'un mot de passe incorrect est saisi, une photo est prise ultérieurement, révélant qui a tenté d'obtenir l'accès.

J'ai cherché partout et je n'ai trouvé que des trucs pour faire ça sur les Macs. Est-il possible d'écrire un script pour Ubuntu pour faire la même chose .

Si c'est possible, alors quel est un script ou un logiciel pour que cela se produise.

63voto

RN. Points 559

Sur la base de ce poste sur les Ubuntuforums par BkkBonanza .

Il s'agit d'une approche utilisant PAM et qui fonctionnera pour toutes les tentatives de connexion échouées. Que vous utilisiez SSH, un terminal virtuel ou l'écran de connexion habituel, cela n'a pas d'importance puisque tout est géré par PAM au final.

  1. Installer ffmpeg Install ffmpeg nous allons l'utiliser comme une ligne de commande pour récupérer les images de la webcam. Update ffmpeg est supprimé lors de la mise à jour vers Ubuntu 14.04. Nous pouvons utiliser avconv à la place de ffmpeg dans le script ci-dessous. Il n'est pas nécessaire d'installer quoi que ce soit séparément.

  2. Créez un petit script quelque part, par exemple /usr/local/bin/grabpicture avec le contenu suivant :

     #!/bin/bash
     ts=`date +%s`
     ffmpeg -f video4linux2 -s vga -i /dev/video0 -vframes 3 /tmp/vid-$ts.%01d.jpg
     exit 0  #important - has to exit with status 0

    Changez le /dev/video0 avec le périphérique vidéo actuel de votre webcam et choisissez un chemin d'accès où les images seront sauvegardées - je choisis simplement /tmp . Dans la version la plus récente d'Ubuntu, utilisez avconv au lieu de ffmpeg ( sudo apt-get install libav-tools ).

  3. Rendez-le exécutable, par exemple chmod +x /usr/local/bin/grabpicture .

  4. Testez-le, en l'appelant simplement : /usr/local/bin/grabpicture . Vérifiez si vous voyez des fichiers apparaître dans /tmp/vid....jpg .

  5. Configurez PAM pour qu'il appelle cette fonction à chaque tentative échouée.

    Note : faites-le avec précaution - si cela échoue, vous ne pourrez plus accéder à votre système de manière régulière.

    1. Ouvrez une fenêtre de terminal avec un accès root ( sudo -i ) et laissez-le ouvert - juste au cas où vous vous tromperiez dans les étapes suivantes.

    2. Ouvrir /etc/pam.d/common-auth dans votre éditeur préféré, par exemple en faisant gksudo gedit /etc/pam.d/common-auth . Gardez à l'esprit pour les étapes suivantes que l'ordre des lignes dans ce fichier est important.

    3. Localisez la ligne ci-dessous. Par défaut, il y a une ligne avant celui qui a pam_deny.so . Sur mon système 12.04, cela ressemble à ceci :

        auth    [success=1 default=ignore]      pam_unix.so nullok_secure
    4. Dans cette ligne, changez le success=1 à success=2 pour qu'il saute notre script en cas de succès. Il s'agit d'une étape importante Si vous avez échoué à cette étape, voyez ci-dessous comment récupérer (***).

    5. Juste en dessous, ajoutez-en un nouveau pour appeler le script actuel :

        auth    [default=ignore]                pam_exec.so seteuid /usr/local/bin/grabpicture
    6. Enregistrez et fermez le fichier. Il n'est pas nécessaire de redémarrer quoi que ce soit.

  6. Testez-le.

    1. Dans une nouvelle fenêtre de terminal, en tant qu'utilisateur régulier, essayez de su -l username pour se connecter comme un autre utilisateur avec le nom d'utilisateur username (à changer par un vrai, bien sûr). Entrez délibérément un mauvais mot de passe. Vérifiez si cela donne lieu à une nouvelle image.
    2. La même chose que ci-dessus, mais saisissez maintenant le mot de passe correct. Vérifiez si vous vous connectez et qu'une photo n'est pas prise.
  7. Si les tests ont réussi, vous pouvez vous déconnecter de votre DE (Unity/KDE/...) et vous devriez voir la même chose en entrant un mauvais mot de passe depuis l'écran de connexion.

(***) Comment récupérer le système si vous avez modifié le fichier /etc/pam.d/common-auth :

  • Redémarrer l'ordinateur
  • Au démarrage de Grub appuyez sur "e" pour éditer
  • Ajouter

init=/bin/sh

à la ligne commençant par "linux"

Monter le système avec un accès en écriture

mount -o remount,rw /

Modifiez le fichier et corrigez

vi /etc/pam.d/common-auth

0voto

Raffa Points 11919

Explication

Une façon de lancer une commande lorsqu'un mot de passe incorrect est saisi est d'utiliser le journal des autorisations.

Journal des autorisations

Le journal des autorisations permet de suivre l'utilisation des systèmes d'autorisation, de la mécanismes d'autorisation des utilisateurs qui demandent un mot de passe, comme le système comme le système Pluggable Authentication Module (PAM), la commande sudo, les connexions à distance à sshd et ainsi de suite. Le fichier journal des autorisations peut être accessible à l'adresse /var/log/auth.log . Ce journal est utile pour connaître les les connexions des utilisateurs et l'utilisation de la commande sudo.

Plus d'informations ici sur LinuxLogFiles

En cas d'échec d'une tentative de connexion, un enregistrement sera ajouté au fichier /var/log/auth.log et la dernière ligne contiendra quelque chose comme :

pam_unix(gdm-password:auth): authentication failure;

Si vous surveillez constamment la modification du fichier et vérifiez si la dernière ligne contient le mot-clé échec avec par exemple grep failure vous savez alors qu'une tentative de connexion vient d'échouer et vous pouvez exécuter la commande que vous voulez en fonction de cette action.


Solution

Changement echo "failed login" dans le scripts ci-dessous à la commande que vous souhaitez exécuter en cas d'échec de la connexion.

Vous pouvez surveiller la dernière ligne de la /var/log/auth.log avec un script comme ceci :

#!/bin/bash

while true
do
       sleep 1

        if (( $(tail -1 /var/log/auth.log | grep failure | wc -l) == 1))

        then

                echo "failed login"

                # Your command here

        fi

done

Ou encore mieux, vous pouvez installer inotify-tools et utiliser inotifywait pour surveiller le fichier à la place de l'option sleep 1 et le script sera comme ceci :

#!/bin/bash

while inotifywait -q -e modify /var/log/auth.log >/dev/null

do

        if (( $(tail -1 /var/log/auth.log | grep failure | wc -l) == 1))

        then

                echo "failed login"

                # Your command here

        fi

done

inotify-tools peut être installé avec la commande suivante :

sudo apt install inotify-tools

Mise en œuvre

Pour exécuter cette solution en tant que service système, veuillez suivre les étapes suivantes :

  • Copiez et collez le code script ci-dessus ( sans echo "failed login" comme j'ai ajouté cette ligne à des fins de débogage uniquement ) dans un fichier dans votre répertoire personnel et nommez-le TakePicture.sh et enregistrez le fichier.

  • Créer le fichier Shell Shell. exécutable en exécutant la commande suivante dans le terminal :

    chmod +x ~/TakePicture.sh

  • Créer et modifier un service systemd personnalisé pour exécuter le Shell Shell au démarrage en exécutant la commande suivante dans le terminal :

    sudo nano /etc/systemd/system/TakePicture.service

  • Copier et coller le code suivant dans l'éditeur, remplacer USERNAME avec votre nom d'utilisateur et l'enregistrer en appuyant sur Ctrl + X puis appuyez sur Y puis appuyez sur Enter :

    [Unit] Description=Take Picture

    [Service] Type=oneshot ExecStart=/home/USERNAME/TakePicture.sh

    [Install] WantedBy=multi-user.target

  • Démarrez le service en exécutant la commande suivante dans le terminal :

    sudo systemctl start TakePicture

  • Activez le service en exécutant la commande suivante dans le terminal :

    sudo systemctl enable TakePicture


Avis :

Le journal des autorisations contiendra toutes sortes d'échecs de connexion ou d'authentification (par exemple, GDM, SSH, authentification de l'utilisateur du terminal, sudo, ... etc.)

Si votre objectif est juste d'activer le script lorsqu'une connexion physique réelle se produit (c'est-à-dire que quelqu'un est assis devant votre ordinateur, utilise votre clavier et regarde votre écran), alors vous devez modifier l'instruction if ci-dessus pour qu'elle soit comme ceci :

if (( $(tail -1 /var/log/auth.log | grep gdm | grep failure | wc -l) == 1))

si GDM est votre gestionnaire de connexion. De cette façon, le script ne sera déclenché que si un échec réel de connexion physique se produit.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X