Jan Roeper - Informatiktipps

Anzeige www.rotturm.com

linux, security, software-engineering, outdoor

Raspberry Fotofalle mit Pi camera und Paket Motion 13.03.2017

Es soll eine Fotofalle/Überwachungskamera mit folgenden Anforderungen erstellt werden:

  • Hardware: Raspberry Pi 3 Model B und Kamera Modul für Raspberry Pi
  • Bewegungserkennung per Paket Motion
  • Skalieren der Bilder mit ImageMagick und Versenden dieser per Telegram zum Empfang aufs Smartphone
  • Versenden der Videos per scp auf einen anderen Rechner
  • Schonung der SD-Card durch Einrichten einer RAM-Disk

Hinweise

  • Linux Version: Raspbian GNU/Linux 8.0 (jessie)
  • Motion Archiv: motion-mmal-lowflyerUK-20151114.tar.gz
  • Telegram Version: Telegram-cli version 1.4.1
  • ImageMagick Version: 6.8.9-9 Q16 arm 2016-06-01
  • Bitte beim Nachbauen alle Pfadangaben kontrollieren.
  • In der beschriebenen Lösung werden absichtlich absolute Pfade verwendet, da das package motion sonst Probleme macht.

Einkaufsliste

Der Raspberry 3 Modell B hat eine höhere Stromaufnahme als die Vorgängermodelle, daher wird ein 2.5A Netzteil empfohlen. Weiterhin wird noch eine USB-Maus und USB-Tastatur benötigt.

Raspbian GNU/Linux 8.0 (jessie) installieren

  1. SD-Karte formatieren,
  2. am einfachsten NOOBS Installer herunterladen und auf die SD-Karte entpacken,
  3. Karte einlegen und booten,
  4. Länder- und Spracheinstellung vornehmen.

Netzwerkanschluss

Hier sollen nur zwei Sonderfälle behandelt werden, normalerweise verbindet sich der Raspberry ohne Probleme.

WLAN mit Zertifikat (hier am Beispiel für Eduroam)

Zertifikat herunterladen und abspeichern unter: /etc/wpa_supplicant/eduroamcert.pem

dann: sudo nano /etc/wpa_supplicant/wpa_supplicant.conf mit folgendem Inhalt speichern:



LAN mit statischer IP

Die nicht zu empfehlende Variante, über einen Eintrag in /etc/network/interfaces eine statische IP zu konfigurieren, macht Probleme mit dhcpcd, dem dhcp-client daemon.

Der empfohlene Weg ist:
sudo editor /etc/dhcpcd.conf [ip/24 ist die Kurzschreibweise für Netzmaske 255.255.255.0]


dann: sudo systemctl daemon-reload

Nutzer pi "umbenennen"

Update
Seit Raspbian-Update Ende 2016 funktioniert die nachstehende Methode nicht mehr!
Hier gibt es eine mögliche Vorgehensweise.

Um Bruteforceangriffen vorzubeugen, ist es nicht verkehrt, den allgemein bekannten Nutzer pi zu ersetzen.
Dazu kurz ein Überblick über Gruppen, Nutzer, root und sudo...

Anzeigen, in welchen Gruppen pi Mitglied ist:cat /etc/group | grep pi
Gruppen auflisten: groups

Was macht sudo? Die Antwort gibt wiki.ubuntuusers.de/sudo: Der Befehl sudo kann Programmaufrufen vorangestellt werden. Er ermöglicht berechtigten Benutzern, das Programm im Namen und mit den Rechten eines anderen Benutzers auszuführen. Sudo fragt vor der Ausführung des Programms unter einem anderem Namen nach dem Passwort des aufrufenden Benutzers. Damit wird überprüft, ob dieser den Befehl selbst eingegeben hat.
(Beispielsweise, wenn man mal eben vom Rechner weg ist, könnte jemand den nicht gesperrten Bildschirm ausnutzen und schnell sudo irgendwas tippen. Es wird also nochmal geprüft, ob man der eingeloggte Nutzer ist)
Der Kreis der berechtigten Benutzer ist in der Datei /etc/sudoers festgelegt. Standardmäßig wird als Ziel-Benutzer root angenommen.


Also, was ist zu tun: (Achtung, man kann sich aus dem System ausperren!)
  1. neuen Benutzer anlegen mit sudo adduser
  2. diesen zu sudoers hinzufügen per sudo visudo
  3. zu Gruppe sudo hinzufügen z.B. per sudo nano /etc/group
  4. mit groups pi alle Gruppen auflisten, wo pi Mitglied ist (audio, video, users, i2c, gpio, ...)
  5. neuen Benutzer zu diesen Gruppen hinzufügen, z.B. mit sudo editor /etc/group
  6. pi abmelden, als neuer Benutzer anmelden
  7. pi komplett entfernen: sudo deluser --remove-home --remove-all-files pi (das brachte Fehler wg. eines Prozesses)
  8. also: pi aus seinen Gruppen wie sudo,adm,... händisch entfernen per z.B. sudo editor /etc/group und reboot
  9. prüfen, ob pi noch Dateien hat: sudo find / -user 1000 (pi hat uid 1000)

SSH öffnen und sicherer machen

Der Raspberry soll fernwartbar sein, also brachen wir Zugang per SSH. Siehe auch:
help.ubuntu.com/community/SSH/OpenSSH/Configuring#Specify_Which_Accounts_Can_Use_SSH
www.debianroot.de/server/sshd_config-1097.html

ssh-Daemon installieren:


sudo nano /etc/ssh/sshd_config dort ändern:


dann SSH Daemon Konfiguration neu laden: sudo /etc/init.d/ssh reload

ssh Zugriff auf einen remote host per Schlüssel [http://www.schlittermann.de/doc/ssh.html]

Die vom Paket Motion aufgenommenen Videodateien sollen per scp auf einen anderen Rechner übertragen werden. Damit hierbei kein Passwort angegeben werden muss, erfolgt die Authentifizierung per Schlüssel.
Achtung! Wenn die Key-Datei in falsche Hände gerät, ist der remote host nicht mehr sicher!

  1. Schlüssel generieren: ssh-keygen -t rsa -b 4096 (Ohne Eingabe eines Passwortes!)
  2. Kopieren des Schlüssels: ssh-copy-id -i ~/.ssh/id_rsa.pub nutzer@ip.des.remote.host
  3. sofort zu Bestätigung einloggen: ssh nutzer@ip.des.remote.host
  4. ssh auf remote host wie oben absichern:sudo nano /etc/ssh/sshd_config, dort Einträge wie oben und
  5. zusätzliche Einträge für die ssh-Konfiguration auf dem remote host:
  6. SSH Daemon Konfiguration neu laden: sudo /etc/init.d/ssh reload
  7. ausloggen: logout
Achtung! Bitte log-files im Auge behalten! (/var/log/auth.log)
Per Paket tcp-wrapper (meist schon installiert) können angreifende IP-Bereiche für Verbindungsanfragen ausgeschlossen werden. (uni-wuerzburg.de)

sudo nano /etc/hosts.deny
dort IP-Bereiche eintragen: ALL: ersterBlock.zweiterBlock.0.0/255.255.0.0

Ram-Disk

Da unter motion ständig Schreibvorgänge laufen, ist es ratsam, eine RAM-Disk einzurichten:

sudo mkdir /mnt/ramdisk
mounten per fstab:sudo nano /etc/fstab
dort eintragen: tmpfs /mnt/ramdisk tmpfs nodev,nosuid,size=100M 0 0

Filesysteme aus fstab neu mounten per reboot oder sudo mount -a

Paket Motion

Motion Home
pimylifeup.com/raspberry-pi-webcam-server
www.instructables.com
www.instructables.com
raspberrypi.org

Da die "Pi camera" keine USB-Kamera ist, gestaltet sich die Vorbereitung etwas komplizierter als bei einer USB-Kamera. Entsprechende feature requests liegen vor.
Nach etwas Hermumprobieren ergaben sich folgende Installationsschritte:
Editieren der Konfiguration:nano mmal/motion-mmalcam-both.conf
dort die RAM-Disk eintragen:target_dir /mnt/ramdisk/motion_target_dir

Starten lässt es sich nun mit ./motion -c motion-mmalcam-both.conf

Telegram

Auch die Telegraminstallation hatte ihre Tücken!
  1. sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev
  2. mkdir telegram
  3. cd telegram
  4. git clone --recursive https://github.com/vysheng/tg.git
  5. ./configure
  6. make(bringt Fehler: > telegram-cli: tgl/mtproto-utils.c:101: BN2ull: Assertion `0' failed.)
  7. nano ./tgl/mtproto-utils.c
  8. make
  9. bin/telegram-cli -k tg-server.pub -W
  10. zum Empfang der SMS mit dem Freischaltcode eine freie Handynummer eingeben, mit der der Raspi senden soll: +4915213456789
  11. den Empfänger der zu versendenden Bilder angeben: add_contact +491521234512345 Vorname Nachname
  12. Testnachricht versenden mit Tiefstrich zwischen Vor-u. Nachname:msg Vorname_Nachname test
  13. beenden mit safe_quit

Paket Imagemagick

Um die Bilder zu bearbeiten oder zu skalieren, wird Imagemagick benutzt.
sudo apt-get install imagemagick imagemagick-doc

Skripte

Motion hat Callbackhandler für verschiedene Events. Es sollen zwei genutzt werden: on_movie_end und on_picture_safe.

Editieren der Konfiguration:nano mmal/motion-mmalcam-both.conf

Dort die beiden Eventhandler eintragen (Nutzerpfad anpassen!):
on_movie_end /home/pi/mmal/on_movie_end.sh %f

und:
on_picture_save /home/pi/mmal/on_picture_save.sh %f

Script zum Übertragen der aufgenommenen Videodateien auf einen Host und Löschen der lokalen Dateien:

nano mmal/on_movie_end.sh



Nachfolgendes Script dient zum Versenden der aufgenommenen Bilddateien per Telegram und Löschen der lokalen Dateien.
Hier ist anzumerken, dass Motion ständig diesen Callbackhandler aufruft, auch mit den Pfaden zu den aktuellen regelmäßigen Schnappschüssen zur Überwachung.
Diese sollen nicht verschickt werden. Weiterhin gibt es bei Erkennung von Bewegung zwei Bilder, die sich durch die Dateiendungen .jpg und .JPG und in ihrer Größe unterscheiden.
Hier wird nur die kleine Datei genutzt.

nano mmal/on_picture_save.sh




Skript, um eine Nachricht per Telegram zu versenden:
nano telegram/telegram-msg.sh




Skript, um ein Bild per Telegram zu versenden:
nano telegram/telegram-send_photo.sh




Skript, um motion zu pausieren:
nano mmal/pause_motion.sh




Skript, um motion wieder zu starten:
nano mmal/resume_motion.sh



Skripte ausführbar machen:
chmod u+x mmal/on_movie_end.sh
chmod u+x mmal/on_picture_save.sh
etc.

Autostart nach reboot

Wichtig ist nun, dass motion nach einem Neustart auch gestartet wird.
Es wird bei einem Neustart /etc/rc.local als root ausgeführt, daher starten wir dort ein Script als einfacher Nutzer:

sudo nano /etc/rc.local
sudo -H -u pi /home/pi/scripts/rc-local.sh

Das zu startende Skript startet seinerseits motion:
sudo nano scripts/rc-local.sh
/home/pi/mmal/motion -n -c /home/pi/mmal/motion-mmalcam-both.conf 1>/dev/null 2>&1 </dev/null &

Zusätzliche Erweiterungen

Skript für Cronjob, um stündlich die externe IP-Adresse an ein php-Skript zu melden:
crontab -e

@hourly /home/pi/scripts/cron-hourly.sh > /dev/null

Das auszuführende Skript:
nano scripts/cron-hourly.sh