Journal [Tuto/HowTo] Concevoir une camera de surveillance avec un Raspberry Pi

Posté par  . Licence CC By‑SA.
41
17
jan.
2017

Sommaire

Tuto testé sur un Raspberry Pi type 1A avec Raspbian Jessie (la version (25/07/2016) sans pixel) et un serveur Zoneminder
Tuto d'origine : [Tuto/HowTo] Concevoir une camera de surveillance avec un Raspberry Pi

Introduction

Principe de base

  • Créer une camera de surveillance sécurisée compatible avec ZoneMinder. Cette camera sera plus sécurisée que les caméras grand public que l'on trouve dans le commerce.

Côté Hardware

  • Nous allons créer une caméra Hardware avec un Raspberry Pi (conseillé type 2 voir plus), un vieux spot halogène de travail (protection métal), une webcam et du câble RJ45 Cat5 ou 6, un morceau de carton (recup), une alimentation pour raspberry pi (même que chargeur smartphone (min 1A, conseillé 2A)). Pour pouvoir voir la nuit en utilisant des Leds infrarouge, vous devez ouvrir la webcam (sans la casser) et enlever la lentille rectangulaire qui se situe devant la camera. Par contre la camera sera plus éblouie durant la journée (vous pouvez utiliser deux webcams, une avec la lentille infrarouge (jour) et une sans (nuit)).

Côté Software

  • Sur une Raspbian seront installé motion, openssh-server, autossh, Tor. Avec ces logiciels nous allons établir une liaison SSH permanente depuis le serveur ZoneMinder vers la camera de surveillance. Ainsi les communications seront protégées par le tunnel de données SSH dont la cible sera Motion. Motion quant à lui sera chargé de "lire" la webcam et de générer un flux de données lisible par ZoneMinder.

Software

Installation et configuration des logiciels de la caméra

Note : je pars du principe que tu viens d'installer Raspbian et n'a encore rien fait dessus.

Système

  • Mettre à jour le système et supprimer les trucs inutiles
sudo su
apt-get purge libreoffice* wolfram-engine sonic-pi minecraft-pi greenfoot pcmanfm realvnc-vnc-server supercollider-ide
apt-get update
apt-get upgrade
apt-get autoremove
apt-get autoclean
rpi-update
  • Installer les pré-requis
apt-get install motion tor screen
  • Redémarrer la machine
reboot

Liaison SSH

  • Créer un utilisateur dédié à recevoir le tunnel de données
sudo adduser video_surveillance
  • Ajouter l'utilisateur au groupe videos
usermod -a -G video video_surveillance
  • Éditer /etc/ssh/sshd/config
sudo nano /etc/ssh/sshd_config
  • Ajouter les lignes suivantes en adaptant à vos besoins
Match user video_surveillance
        PermitOpen 127.0.0.1:*
  • PermitOpen 127.0.0.1:* Hostname:Port, ici nous restreignons les tunnels de l'utilisateur à la boucle locale; le caractère * signifie "tous". Une fois sûr de votre config vous pouvez remplacer par le ou les ports pour joindre vos caméras

    • Redémarrer le serveur SSH
sudo service ssh restart

Motion

  • Créer le répertoire de travail, ici j'ai choisi /opt/script/motion/
sudo mkdir -p /opt/script/motion/
  • Créer le fichier de configuration
sudo nano /opt/script/motion/motion.conf
  • Coller la configuration suivante en l'adaptant éventuellement
videodevice /dev/video0
input -1
start_motion_daemon=no
webcam_localhost off
quiet on
post_capture 0
output_all off
control_localhost off
output_normal off
width 640
height 480
webcam_maxrate 25
ffmpeg_video_codec msmpeg4
stream_localhost off
stream_port 6881
  • Si vous ne l'utilisez que via le tunnel SSH remplacez webcam_localhost off par webcam_localhost on afin d'empêcher d'autres d'accéder à la caméra

    • Créer le script de démarrage
sudo nano /opt/script/motion/startMotion.sh
  • Ajouter dedans les lignes suivantes en les adaptant éventuellement
#!/bin/bash
sleep 5
su video_surveillance -c "/usr/bin/screen -d -m -S motion motion -c /opt/script/motion/motion.conf"
  • Créer le script d’arrêt
sudo nano /opt/script/motion/stopMotion.sh
  • Ajouter dedans les lignes suivantes en les adaptant éventuellement
#!/bin/bash
su video_surveillance -c "/usr/bin/screen -S motion -X quit"
  • Accorder les bonnes permissions sur le script de lancement
sudo chown root:root -R /opt/script/motion
sudo chmod 755 -R /opt/script/motion
  • Ajouter le script au démarrage du système en éditant /etc/rc.local
sudo nano /etc/rc.local
  • Ajouter la ligne suivante juste avant exit 0
sudo /opt/script/motion/startMotion.sh

Tor

Note : Tor n'est normalement pas nécéssaire si votre caméra ne change pas de réseau. Néanmoins dans l'utilisation que nous allons en faire en cas de vol de la caméra vous pourrez récupérer quand même le flux vidéo. Si votre réseau passe d'IPv4 à IPv6 cette méthode devrait aussi permettre la communication entre Zoneminder et votre caméra en attendant que vous reconfiguriez votre réseau.

sudo su
mkdir -p /var/lib/tor/hidden_service
mkdir -p /var/lib/tor/hidden_service/ssh
echo "HiddenServiceDir /var/lib/tor/hidden_service/ssh" >> /etc/tor/torrc
echo "HiddenServicePort 22 127.0.0.1:22" >> /etc/tor/torrc
chown debian-tor:root -R /var/lib/tor/hidden_service/
chmod 700 -R /var/lib/tor/hidden_service/
service tor restart
cat /var/lib/tor/hidden_service/ssh/hostname
  • Note : Pensez à noter l'adresse en .onion que la dernière commande va vous fournir, vous en aurez besoin pour la suite. Si par la suite vous souhaitez la ré-afficher, entrez cette commande sur votre caméra
sudo cat /var/lib/tor/hidden_service/ssh/hostname

Mise en place sur le serveur ZoneMinder

Liaison SSH

  • Installer les pré-requis
sudo apt-get install autossh tor
  • Exporter la clé SSH
sudo su
ssh-copy-id -i ~/.ssh/id_rsa.pub video_surveillance@adresseCamera
  • Note : si vous n'avez jamais créé de clés pour votre utilisateur root (admin) alors envoyez les commandes suivantes
sudo su
ssh-keygen -t rsa -b 4096 -o -a 666
  • Pour vérifier l’existence de la clé RSA de root entrerz la commande suivante
sudo cat /root/.ssh/id_rsa.pub
  • Vérifier que la connexion sans mot de passe fonctionne
ssh video_surveillance@adresseCamera
  • Rendre compatible le client ssh avec le réseau Tor
sudo nano /etc/ssh/ssh_config
  • Et ajouter ces lignes
            Host *.onion
            ProxyCommand nc -xlocalhost:9050 -X5 %h %p
  • Créer le script de démarrage qui va créer la liaison peu après le boot
sudo nano /opt/scripts/creatTunnelForvideo_surveillance.sh
  • Ajouter le script suivant en adaptant ses variables
#!/bin/bash
#  -> WTFPL - infos script : https://www.0rion.netlib.re/forum4/viewtopic.php?f=34&t=498
# -> code by voxdemonix <-

   #pour tester que la création de tunnel fonctionne vous pouvez adapter la ligne suivante puis la lancer dans votre shell
#su myUser -c 'autossh -M 0 -q -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -L 6881:127.0.0.1:6881 video_surveillance@HOSTNAME'


ipCameraLan="192.168.1.42" # l'adresse IP locale de votre camera
adresseCameraTor="monTorHiddenService.onion" # l'adresse en .onion de ta camera que je t'ai dis de noter quelques paragraphes plus haut
adresseMacCamera="00:00:00:00:00:00" #l'adresse mac de votre camera (tapez ifconfig dans un terminal sur votre server pour la voir)
UserLocalForSshTunneling="root" # l'user a utiliser sur votre ordinateur pour le montage du tunnel (dans ce tuto on utilise root afin d'empêcher un virus ayant piraté l'user principale d’exécuter des commandes sur la camera)
UserRemoteForSshTunneling="video_surveillance" # l'user a utiliser côté server/caméra ( /!\ n'utilisez jamais root ni pi !)
portEntree="6881" # le port sur le serveur ZoneMinder ; un port par caméra
portSortie="6881" # le port sur le serveur/camera

if [ ! "$SUDO_USER" ]; then
exit 0
fi
sleep 60 # petit délais d'attente afin que le réseau soit prêt et la machine démarrée

ping $ipCameraLan -c 1 >> /dev/null 2>&1
macRecover=$(arp -n | grep -i -o $adresseMacCamera)

if [ "$macRecover" == "$adresseMacCamera" ]; then
   su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree:127.0.0.1:$portSortie $UserRemoteForSshTunneling@$ipCameraLan -f"
else
   su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree:127.0.0.1:$portSortie $UserRemoteForSshTunneling@$adresseCameraTor -f"
fi

ipCameraLan="192.168.1.42" => l'adresse IP locale de votre camera
adresseCameraTor="monTorHiddenService.onion" => l'hostname WAN ou l'adresse Tor Hidden Service au choix
adresseMacCamera="00:00:00:00:00:00" => l'adresse mac de votre camera (tapez ifconfig dans un terminal sur votre server pour la voir)
UserLocalForSshTunneling="root" => l'user a utiliser sur votre ordinateur pour le montage du tunnel (dans ce tuto on utilise root afin d'empêcher un virus ayant piraté l'user principale d’exécuter des commandes sur la camera)
UserRemoteForSshTunneling="myUserServer" => l'user a utiliser côté server ( /!\ n'utilisez jamais root ou pi !)
portEntree="6881" => le port sur ZoneMinder
portSortie="6881" => le port de motion (voir paramètre stream_port de motion.conf) sur la caméra

  • Accorder les bons droits sur le script
sudo chown root:root /opt/scripts/creatTunnelForvideo_surveillance.sh
sudo chmod 755 /opt/scripts/creatTunnelForvideo_surveillance.sh
  • Éditer /etc/rc.local
sudo nano /etc/rc.local
  • Ajouter la ligne suivante juste avant exit 0
sudo /opt/scripts/creatTunnelForvideo_surveillance.sh

Ajouter la webcam à ZoneMinder

  • Rendez-vous sur la WEBUI de ZoneMinder avec un utilisateur pouvant ajouter une cam

  • Cliquer sur "Ajouter une caméra"

    • Onglet General Type de source : Distant (remote)
    • Onglet Source Protocole : HTTP Méthode : Simple Nom d'hôte : 127.0.0.1 Port : 6881 Largeur (nb pixels) : 640 Hauteur (nb pixels) : 480

screenshot-2016_01_07-ZoneMinder-addCamera_General-motionSoftware.png
screenshot-2016_01_07-ZoneMinder-addCamera_Source-motionSoftware.png

Hardware

  • Récupérez un vieux spot halogène de chantier en métal (les anciens sont plus robustes avec plus de place à l'intérieur)

  • Percez un trou un l'arrière afin de faire passer le câble (le RJ45 + le câble d'alim du RaspberryPi prennent un peu plus de place que le câble d'alimentation d'origine)

  • Soit vous passez vos câbles puis colmatez l'espace avec du silicone (pas très propre), soit, comme dans les photos suivantes, procurez-vous une boite de dérivation et forez deux trous pour la fixer avec des vis. Veillez à ce qe l'eau ne puisse s'infiltrer.

  • Fixez la webcam avec de la toile isolante (papier américain). Pour la stabiliser (le spot n'étant pas cubique) utilisez du carton que vous pliez pour lui donner un effet ressort.

  • Insérez votre Raspberry Pi et branchez le

  • Découpez un morceau de carton (ici récupéré sur un pack de 6 bières) afin de couvrir la vitre du spot, le but étant de protéger l'intérieur du soleil tout en laissant un espace de visibilité pour la webcam

  • Refermez le tout et colmatez avec du silicone les éventuels trou de forage

  • Enjoy!

tuto_image_01.jpg
tuto_image_02.jpg
tuto_image_03.jpg
tuto_image_04.jpg
tuto_image_05.jpg

  • # Webcam utilisée

    Posté par  . Évalué à 6.

    J'ai oublié de mentionner quelle webcam est utilisée.
    Donc son petit nom : 360 Degree Rotation Wide Angle 12 MP HD USB Camera w/ Microphone (testé sur ubuntu et raspbian avec succès)

    Les logiciels utilisés dans le tuto sont motion, openssh-server, autossh, Tor, screen, zoneminder

    Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

    • [^] # Re: Webcam utilisée

      Posté par  . Évalué à 3. Dernière modification le 17 janvier 2017 à 16:43.

      Petite astuce en Bonus
      Ne vous tracassez pas du sens de la webcam ou de si elle est bien parallèle au sol. En effet motion (le logiciel) vous permet de tourner l'image de la vidéos grâce à l'argument rotate X ou X est le nombre de degré. Ce paramètre est a insérer dans le fichier de configuration de motion (ici /opt/script/motion/motion.conf).
      Veillez juste a ce qu'elle soit bien placée comparé à la vitre afin d'éviter les reflets (ici j'ai rajouté un cône de papier autour de la webcam pour diminuer les reflets (si vous collez la camera à la vitre vous risquez d'avoir un léger effet miroir).

      Cordialement.

      Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

  • # Merci !

    Posté par  . Évalué à 5.

    Et ce pour diverses raisons :

    • Le tutoriel en lui-même
    • Le partage sur LinuxFR (personnellement je ne connaissais pas ton blog, mais c'est chose faite) pour une meilleure visibilité.
    • Et au passage la découverte musicale Best of NCS 2017

    Donc, merci !

    • [^] # Re: Merci !

      Posté par  . Évalué à 1.

      Je suis content que ça fasse (au moins) un heureux :)

      PS: en taggant le tuto je suis tombé sur ton thread traitant de la camera intelligente avec du software libre. Si tu as traité le sujet et que tu as des astuces et idées pour améliorer la camera IP fait maison n'hésite pas à partager*1 :)

      *1 une amélioration qui serait intéressante serait : en utilisation avec deux webcams détecter la nuit sur camera 1 (jour) afin de couper la camera 1 et de lancer la camera 2 (nuit).

      Best of NCS 2017

      :)

      Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

  • # Correction

    Posté par  . Évalué à 1. Dernière modification le 18 janvier 2017 à 13:36.

    Désolé aux modos de ne pas avoir été assez efficace lors de ma relecture avant de poster. (j'ai galéré sur certains passages pour la mise en forme, j'en fus distrait)
    Pour le prochain tuto je vais tenter de passer par la section wiki.

    Donc listes des erreurs :

    supprimer la ligne suivante (doublon) dans Introduction - Côté hardware

    un vieux spot halogène de chantier (recup),

    un peu plus loin

    me que chargeur smartphone

    remplacer par

    même que chargeur smartphone (min 1A, conseillé 2A)

    Juste après "Lancez la suite de commandes suivantes qui va créer un hidden service ssh" la première ligne des commandes pour installer tor : "bash" est censé être là pour la coloration syntaxique, là on dirait une commande ^ ^

    Juste après

    Cliquez sur "Ajouter une caméra"
    La mise en forme par en freestyle

    Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.