Blog

Créer un scanner de clé usb avec un Raspberry

par | 7 Sep 2020

De nos jours, nous sommes de plus en plus exposé aux virus. Il faut être vigilant pour éviter de se faire pirater et se faire voler un bon nombre de données (carte bancaire, mots de passe critiques, …). C’est pour cela que j’ai créé un scanner d’usb.

La plus grosse faille de sécurité dans un réseau se trouve entre la chaise et l’écran. Il est très imporant de limiter cette faille au maximum. On nous le répète souvent mais il faut faire attention aux liens non-officiels, attention aux spams, et aussi attention aux clés usb qui viennent de l’extérieur. Le scanner d’usb va servir à scanner toutes les clés de nos clients, nos fournisseurs, … pour être certain qu’aucun virus ne se cache dedans…

C’est parti nous allons le construire ! Vous allez voir ce n’est pas très compliqué.

Commencons par lister tous les composants nécessaires :

Les composants

Raspberry pi 4https://amzn.to/3i8N3AK
Boutonhttps://amzn.to/2R1oZEf
PLAhttps://amzn.to/3h7IQfs
LEDs 5mmhttps://amzn.to/2FbhTtZ
Connecteurshttps://amzn.to/3h7qw6b
Résistanceshttps://amzn.to/2R1pM8b

Plus votre raspberry aura de la mémoire, plus le scanne ira vite. Pour un raspberry de 8go de ram, le scan prend 1 minute pour des très petits fichiers. Pour un raspberry pi 3, le scan prend 4 minutes. Vous voyez donc la grande différence.

L’installation

Prérequis : le raspberry doit être installé (raspbian est monté sur la carte sd) et connecté au réseau local.

Commençons par faire les mises à jour du raspberry :

sudo apt-get update

sudo apt-get upgrade

Ensuite nous allons installer notre anti-virus ClamAv

sudo apt-get install clamav clamav-daemon

Pour éviter qu’il soit OOM (out of memory), nous allons modifier une valeur du fichier swap en ajoutant cette commande :

sudo nano /etc/dphys-swapfile

et en modifiant la valeur comme ceci :

CONF_SWAPSIZE=2048

Pour appliquer les modifications, faire :

sudo /etc/init.d/dphys-swapfile stop

puis

sudo /etc/init.d/dphys-swapfile start

Tout est maintenant en place ! Normalement le raspberry sait lire les NTFS, mais pour être sure on peut essayer d’installer l’outil :

sudo apt-get install ntfs-3g

Il ne reste plus qu’a entrer le script sur le raspberry et à tester si tout fonctionne bien. Pour ce faire nous allons créer le dossier “rapport” dans lequel tout va se trouver. Pour cela :

sudo mkdir /home/pi/rapport

Il faut aussi créer le fichier “usb” dans lequel la clé va être montée :

sudo mkdir /home/pi/rapport/usb

Ensuite, créer et editer le script « rapport.py » en faisant :

sudo nano /home/pi/rapport/rapport.py

Voilà le script à coller dans l’éditeur de texte nano :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Derniere version 17/07/2020 15h56
#IZIFAC

import os # module du systéme linux
import RPi.GPIO as GPIO
import time

def rapport():
        fichierlog = open("/home/pi/rapport/virus.log", "r") # ouvre le fichier en lecture
        contenulog = fichierlog.readlines() # appelle la fonction readlines pour lire toutes les lignes du fichier et les mettre dans la variable contenu
        fichierlog.close()
        contenulog.reverse()
        tempolog = open("/home/pi/rapport/tmp.txt", "w")
        for line in contenulog: # pour chaque ligne de la variable contenu
                tempolog.write(line) # écrire les lignes dans tempolog, càd le fichier tmp.texte
        tempolog.close()
        tempolog = open("/home/pi/rapport/tmp.txt", "r")
        nbr_erreur = 0
        for i in range(7):
                ligne = tempolog.readline()
                liste_mots = ligne.split()
                if liste_mots[0] == "Infected":
                        nbr = liste_mots[2]
                if liste_mots[1] == "errors":
                        nbr_erreur = liste_mots[2]
        tempolog.close() # fermer le fichier txt
        return nbr, nbr_erreur

GPIO.setmode(GPIO.BCM)

GPIO.setwarnings(False) # Evite l'affage des messages d'erreur inutile

#Une broche pour la sortie : la LED
GPIO.setup(21, GPIO.OUT)
GPIO.setup(20, GPIO.OUT)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(12, GPIO.IN)
# Une broche pour l'entree : Le poussoir

GPIO.output(21, GPIO.LOW)
GPIO.output(20, GPIO.LOW)
GPIO.output(16, GPIO.LOW)


while True:
        if GPIO.input(12) == 0:
                GPIO.output(21, GPIO.HIGH)
                GPIO.output(20, GPIO.HIGH)
                GPIO.output(16, GPIO.HIGH)
                os.system("sudo apt-get update -y")
                os.system("sudo apt-get upgrade -y")
                os.system("sudo sh -c'echo 1 > /proc/sys/vm/drop_caches'")
                os.system("sudo kill  $(pidof freshclam)")
                print("freshclam killed")
                os.system("sudo freshclam")
                print("BDD virus up to date")
                os.system("sudo umount -t ntfd-3g /dev/sda1")
                os.system("sudo umount /dev/sda1")
                os.system("sudo mount -t ntfs-3g /dev/sda1 /home/pi/rapport/usb")
                os.system("sudo mount /dev/sda1 /home/pi/rapport/usb")
                time.sleep(1)
                if len(os.listdir('/home/pi/rapport/usb')) != 0:
                        print("cle USB detectee")
                        GPIO.output(16, GPIO.LOW)
                        GPIO.output(20, GPIO.LOW)
                        GPIO.output(21, GPIO.HIGH) #Allume led bleu  21 SCANNING
                        os.system("sudo clamscan -r --remove --log=/home/pi/rapport/virus.log /home/pi/rapport/usb")
                        os.system("sudo umount /dev/sda1")
                        GPIO.output(21, GPIO.LOW) #Eteind led bleu 21 SCANNING DONE
                        retour = rapport()
                        print(retour)

                        if retour[0] == "0" and retour[1] == 0:
                                GPIO.output(20, GPIO.HIGH) #Allume led verte20
                        elif retour[1] > 0:
                                GPIO.output(16, GPIO.HIGH)
                                GPIO.output(20, GPIO.HiGH)
                        else:
                                GPIO.output(16, GPIO.HIGH) #Allume led rouge 16
                        while True:
                                if GPIO.input(12) == 0:
                                        print(GPIO.input(12))
                                        GPIO.output(20, GPIO.LOW)
                                        GPIO.output(16, GPIO.LOW)
                                        os.system("sudo shutdown now")
                                        exit()
                elif len(os.listdir('/home/pi/rapport/usb')) == 0:
                        print("Aucune cle USB trouvee")
                        GPIO.output(16, GPIO.HIGH)
                        GPIO.output(21, GPIO.HIGH)
                        GPIO.output(20, GPIO.LOW)

Copier dedans le script : Ctrl + X, y, puis enter ⏎ pour sauver et quitter.
Testons maintenant le script :

sudo python /home/pi/rapport/rapport.py

Si vous obtenez une erreur avec lsof, c’est que vous devez installer les modules.

Par contre si tout se passe bien, nous pouvons configurer le raspberry pour qu’il exécute le script à chaque démarrage
pour cela, exécuter :

sudo nano /etc/rc.local

Ajoutez ensuite une ligne avant le exit 0 :

sudo python /home/pi/rapport/rapport.py

Ca y est tout est en place, maintenant il vous suffit de relier correctement les led et le bouton, et ensuite de tout mettre dans un petit boitier et votre scanner d’usb sera prêt !

Fonctionnement

Vous devez d’abord brancher le raspberry. Une fois fait, vous pouvez insérer la clé usb. Après 2 petites secondes, vous pouvez appuyez sur le bouton et le programme va démarrer.

  1. Toutes les leds s’allument pour signaler que le raspberry fait ses mises à jour système et base de données virus.
  2. Les led s’éteignent, il ne reste que la led bleu d’allumée, ce qui signifie que le scan est en pregression.
  3. Une fois la scan terminé, la led verte ou la led rouge s’allume en fonction du résultat.
  4. Appuyer sur le bouton pour que le raspberry s’éteigne.
  • Si la led bleu et la rouge sont allumées en même temps, cela signifie que la clé n’est pas détectée. Il faut vérifier que la clé est bien mise et réappuyer sur le bouton.
  • Si la led verte et la led rouge sont allumées en même temps, cela siginie qu’il y a eu une erreur pendant le scan sur un ou plusieurs fichier(s).

Le câblage et le boitier

Voilà le shéma de cablage, et en dessous vous trouverez un bouton pour télécharger les fichiers STL du caisson que j’ai créé. J’ai utilisé des connecteurs comme ça il est très facile de brancher et débrancher le système sans se tromper.