Leggo sempre più spesso molta confusione sull’argomento video sorveglianza, c’è chi si affida a telecamere a basso costo basate su servizi cloud di discutibile qualità e sicurezza, chi per risparmiare ma al contempo gestire tutto localmente si affida ad NVR a basso costo molto limitati e poco potenti oppure chi si affida ad installatori professionisti installando validi e costosi sistemi ma poco personalizzabili. C’è però un’alternativa che pochi valutano, ovvero crearsi il proprio NVR casalingo.
In questo articolo vedremo come creare un NVR tramite il software open source ZoneMinder integrando anche il riconoscimento dinamico degli oggetti e persone.
Attenzione: Questo articolo si basa sulla versione “1.34.23” di ZoneMinder e “6.1.19” di Event Server. Alcune voci e configurazioni potrebbero variare nel tempo con gli aggiornamenti. É molto importante anche precisare che nonostante questo tutorial sarà molto dettagliato, si presume che l’utente abbia una minima base nell’utilizzo di sistemi operativi Linux e della relativa shell di comandi, oltre ad un minimo di capacità di eseguire del troubleshooting in autonomia.
Sommario
Introduzione
Come accennato, esistono diverse tipologie di sistemi di video sorveglianza. Analizziamo i più diffusi:
- Cloud: Generalmente si tratta di telecamere autonome a basso costo, oppure di sistemi con un controllore centralizzato, collegati direttamente ai server del produttore dove la gestione dei dispositivi e degli eventi è vincolata a questi. In questo caso può essere a rischio la sicurezza dei dati essendo tutto su server a noi non accessibili e soggetti a possibili bug o attacchi di malintenzionati. Il motivo per cui molti si affidano a questa tipologia di video sorveglianza è che risulta molto facile da configurare e gestire, ma con i relativi compromessi. Non ci soffermeremo in alcun modo su questa tipologia, ma è giusto accennarne l’esistenza;
- Locale: Si tratta di una gestione all’interno dell’edificio da sorvegliare, spesso definita anche “a circuito chiuso” o “TVCC” in italiano e “CCTV” in inglese. Questa tipologia di video sorveglianza consiste (limitandoci all’ambito casalingo) in un un dispositivo centralizzato definito “DVR” o “NVR” al quale vengono collegate direttamente, o tramite la rete locale LAN, le varie telecamere e che può fungere anche da alimentatore tramite l’utilizzo del collegamento ethernet PoE.
Considerando che ci soffermeremo sulla tipologia di gestione locale, è giusto precisare che:
- Nonostante la gestione sia locale, nulla ci vieterà di esporla verso internet per accedervi da remoto in totale sicurezza;
- Il software supporta ogni tipologia di IP Camera con a bordo i più comuni standard, in particolare vedremo il collegamento tramite protocollo RTSP;
- Nel caso la telecamera sia compatibile è possibile gestire anche il PTZ ed il protocollo ONVIF, ma non approfondiremo l’argomento;
- Le telecamere, che siano collegate tramite cavo ethernet semplice, ethernet PoE o wireless Wi-Fi, è per noi indifferente purché siano collegate sulla stessa rete LAN del dispositivo ospitante ZoneMinder;
- Non verrà consigliato alcun metodo di gestione della rete, ma verrà ampiamente mostrato come integrare telecamere presenti sulla propria rete LAN con un dispositivo ospitante ZoneMinder, anch’esso sulla medesima. Eventuali gestioni avanzate tramite l’utilizzo di VLAN o switch dedicati sono da ritenersi di nicchia nell’ambito casalingo e chiunque sia capace di gestire una rete di questo genere sicuramente riuscirà a riadattare questo tutorial per il proprio utilizzo avanzato. Nel caso si voglia una linea guida in merito consiglio la visione di questo articolo;
- Il sistema è perfettamente integrabile in altre piattaforme come Home Assistant, dove si presume vi sia una base configurata come indicato in questo articolo;
- Il riconoscimento dinamico degli oggetti e persone sfrutta la tecnologia YOLO applicabile praticamente su qualsiasi hardware adeguatamente dimensionato, ma in alternativa è possibile sfruttare processori dedicati come quelli sviluppati per il progetto Google Coral (ad esempio l’USB Acceleratore EDGE TPU).
- Vi sono client di gestione sia desktop che mobile, con supporto alle notifiche push dirette o indirette come Pushover spiegato in questo articolo.
Le alternative
Ma quindi ZoneMinder è l’unico software che permette la creazione di un sistema di video sorveglianza fai da te?
No, vi sono altri software che permettono questo ed ognuno dovrebbe scegliere quello che preferisce o quello più adatto alle proprie necessità.
L’alternativa più famosa è sicuramene Blue Iris (a pagamento e disponibile solo per Microsoft Windows), mentre rimanendo nel mondo open source Shinobi migliora costantemente anche se ad oggi non gode di un grande supporto da piattaforme esterne e dalla community. Da valutare anche il più leggero e semplice MotionEye che è ottimo da eseguire su hardware poco performante ma che risulta molto limitato e poco personalizzabile.
Un altro software che di recente sta scalando la classifica, grazie alla sua semplice e rapida integrazione con Home Assistant, è Frigate. Questo software è davvero ottimo per chi ha come obiettivo l’esclusiva integrazione all’interno di Home Assistant, volendo sfruttare anche il riconoscimento dinamico degli oggetti e persone, ma che risulta poco consigliato a chi vuole una separata e configurabile gestione da vero e proprio NVR.
Quindi perché consiglio ZoneMinder? Ecco i principali motivi:
- Risulta ampiamente collaudato esistendo dal 2002, ed è costantemente aggiornato;
- Vi è tantissima documentazione e supporto in rete, ed è installabile sulle principali distribuzioni linux;
- É disponibile l’integrazione per quasi ogni piattaforma su cui abbia senso che ci sia, rimanendo comunque autonomo e non vincolato ad altri software;
- Presenta API libere, script di gestione PTZ per tantissime telecamere e componenti aggiuntivi di vario genere;
- Vi è un client mobile e desktop ufficialmente riconosciuto, compatibile con le maggiori piattaforme e con supporto alle notifiche push;
- Supporta server, archivi ed utenti multipli oltre a supportare tutti i principali protocolli di streaming video;
- É completamente gratuito, open source ed installabile su qualsiasi hardware adeguatamente dimensionato al proprio utilizzo;
- La gestione di riconoscimento dinamica degli oggetti e persone è opzionale, ampiamente configurabile ed espandibile in base alle proprie esigenze e possibilità;
- Presenta un’elevata configurabilità con supporto ad: Upload su server esterni, bande di utilizzo, inoltro via email, trigger esterni, multiple zone e filtri avanzati.
Chiaramente come ogni cosa, anche ZoneMinder ha dei difetti. I principali sono:
- Essendo un software ormai anziano e complesso, è esoso di risorse;
- Assenza di supporto all’accelerazione hardware, che non sempre è un difetto poiché si possono raggiungere le massime prestazioni tramite l’utilizzo della sola CPU nel caso in cui la GPU fosse dedicata ad altro;
- Scarso supporto alla registrazione audio, gestita solo tramite le sorgenti FFmpeg;
- Non si possono scatenare eventi sulla base del riconoscimento degli oggetti e persone, ma solo tramite la gestione delle zone;
- L’installazione e configurazione, come vedremo, risulta un procedimento abbastanza complesso.
L'hardware
Arrivati a questo punto vi starete chiedendo: Bene, ma dove posso far girare ZoneMinder? Va bene il mio Raspberry Pi?
La risposta è: Assolutamente no.
Per quanto sia praticamente possibile eseguire ZoneMinder su un Raspberry Pi o altra single board, e tecnicamente anche gestire qualche telecamera a bassa risoluzione, è da valutare che anche in ambito casalingo una buona video sorveglianza è da consigliare con telecamere almeno HD o Full HD a 15 o 20 fps dove l’hardware necessario per una gestione fluida ed affidabile è di gran lunga superiore e deve essere adeguatamente dimensionato, anche se questo varia particolarmente da cosa e da come lo si vuole gestire.
Le discriminanti principali sono:
- Il numero di telecamere da gestire;
- La qualità d’immagine, risoluzione ed fps desiderati;
- La modalità di gestione: Analisi di immagine o registrazione continua;
- Quanti fotogrammi pre-allarme e post-allarme si vuole salvare;
- La quantità di eventi e registrazioni nel tempo che si vogliono conservare (spazio richiesto per HDD o SSD);
- L’abilitazione o meno del riconoscimento dinamico degli oggetti e persone;
- L’esecuzione diretta del sistema operativo ospitante ZoneMinder, o se virtualizzato tramite un hypervisor.
Vediamo quindi come procedere a dimensionare l’hardware, e cosa posso consigliare di acquistare in base alle mie esperienze personali.
La memoria (RAM):
Come spiegato all’interno della documentazione ufficiale vi è un preciso calcolo matematico per dimensionare la memoria, quindi ipotizziamo una situazione più o meno realistica dove abbiamo:
- 5 telecamere;
- Con risoluzione HD (1280×720);
- Con una buona qualità d’immagine ed impostando la profondità di colore a 32 bit (4 bytes);
- Con 100 fotogrammi per ognuna di pre-allarme e post-allarme.
1280 x 720 (Risoluzione HD) = 921.600 bytes
921.600 x 4 (32 bit = 4 bytes) = 3.686.400 bytes
3.686.400 x 100 (Buffer frame) = 368.640.000 bytes
368.640.000 x 5 (N° telecamere) = 1.843.200.000 bytes
1.843.200.000 / 1024 = 1.800.000 kilobytes
1.800.000 / 1024 = 1.757,812 Megabytes
1.757,812 / 1024 = 1,716 Gigabytes
Di conseguenza solo per la gestione del flusso video delle telecamere saranno necessari circa 1,8 GB di RAM.
É necessario sommare a questo valore tutto il restante, considerando anche che ZoneMinder da impostazioni predefinite è abilitato a gestire solo il 50% della RAM disponibile, gli elementi da valutare sono:
- Un 20% aggiuntivo di memoria, di supporto alla gestione dei flussi video;
- La memoria necessaria per l’esecuzione del sistema e di tutti i processi esterni a ZoneMinder sul sistema ospitante;
- La memoria necessaria all’esecuzione di altri processi ausiliari di ZoneMinder;
- Nel caso di un sistema virtualizzato, la memoria necessaria all’hypervisor ed altri sistemi virtualizzati;
- Una % di memoria da lasciare libera (in caso di emergenza) sia per il sistema ospitante che ad un eventuale hypervisor.
Il processore (CPU):
Un’altra risorsa hardware fondamentale è la potenza ed il quantitativo di Core e Threads che possiede il processore (CPU).
Come indicato nella documentazione ufficiale, sfruttando principalmente la CPU per eseguire i calcoli, sarà necessario dimensionare anche questa.
Per 5 telecamere HD con attiva l’analisi delle immagini per il rilevamento del movimento ed il riconoscimento degli oggetti e persone consiglio di non scendere al di sotto di un processore equivalente ad un Intel i5 di ottava o decima generazione (4 core/8 thread) anche se in passato sono riuscito ad eseguire senza hypervisor l’analisi per 4 telecamere su un processore Celeron e tramite hypervisor su un Intel i3 di ottava generazione (2 core/4 thread).
Da considerare che è consigliato fornire al sistema ospitante ZoneMinder almeno 4 core (Rilevati come thread nel caso di hypervisor come Proxmox), preservandone altri per l’eventuale sistema hypervisor ed altre macchine virtuali.
Dato che il processore sarà spesso sotto sforzo (in particolare durante l’analisi delle immagini), consiglio di ottimizzare al meglio sia dal BIOS/UEFI che nel locale dove posizionato, il raffreddamento del dispositivo.
L’archivio (Disco):
In caso di registrazioni continue è consigliato installare un classico HDD (SATA) meccanico direttamente, oppure in aggiunta ad un SSD (M.2 o SATA).
Da considerare anche il fattore backup nel caso si usi un hypervisor. Ipotizzando un disco di 250 GB dove 200 GB sono associati al sistema ospitante ZoneMinder, per conservare almeno 4 backup completi dell’intero sistema è necessario un HDD ausiliario di almeno 1 TB. Nulla vieta di utilizzare dischi esterni o un NAS.
Attenzione: In caso di utilizzo di un SSD consiglio di verificare la corretta abilitazione della funzione di TRIM come indicato qui, oppure una spiegazione più completa ma meno inerente al nostro utilizzo è disponibile qui.
La scelta finale:
Quindi, quale hardware è consigliato acquistare?
Nel caso si abbia la possibilità sicuramente è consigliato assemblarsi un computer con i componenti che si desidera, in base alle indicazioni fornite sopra. Se invece si vuole un dispositivo compatto, a basso consumo ma al contempo affidabile consiglio i seguenti prodotti:
Hardware basilare:
Hardware intermedio:
Hardware performante:
Per quanto riguarda invece le telecamere, sono compatibili la maggior parte di quelle che supportano un flusso video RTSP H.264. Personalmente ho apprezzato molto i prodotti Hikvision, quindi cercando uno dei più recenti modelli disponibili in rete:
- Hikvision PoE Camera DS-2CD2185FWD-I: Amazon
Materiale necessario
Per iniziare, scarichiamo questo pacchetto contenente il materiale che utilizzeremo nei vari passaggi:
Il sistema operativo
Come ho più volte ribadito, ZoneMinder viene essere eseguito su un “sistema operativo ospitante” su base Linux.
In base alla documentazione ufficiale, ed alla mia esperienza, uno dei sistemi più comunemente utilizzati e consigliati è Ubuntu nella variante server, versione 18.04 LTS (Bionic) a 64 bit scaricabile dalla pagina ufficiale di download.
Nulla vieta di eseguire lo stesso in una macchina virtuale tramite un sistema hypervisor come Proxmox. Negli esempi mostrati eseguirò un’installazione dimostrativa su una macchina virtuale tramite hypervisor VMware Fusion.
Partiamo eseguendo l’installazione del sistema operativo.
Selezionare la lingua “English” (se richiesto aggiornare subiquity) e selezionare il layout “Italian” per la tastiera:
Molto utile è la gestione dei volumi logici LVM, attiva di default durante l’installazione, che però richiede di verificare che i dischi creati occupino realmente lo spazio disponibile. Verificare quindi che il disco “ubuntu-lv” abbia la massima capienza disponibile, altrimenti ampliarlo:
Inserire le proprie credenziali, indicare un hostname coerente per il server ed installare “OpenSSH server”. Terminata l’installazione riavviare il sistema:
Ovviamente è possibile utilizzare un sistema operativo (compatibile) differente, ma in tal caso sarà a carico vostro comprendere come procedere con l’installazione sia di questo che di ZoneMinder e relativi componenti aggiuntivi.
Appena avviato il sistema eseguire l’accesso con l’utente e password precedentemente impostati, poi associare una password all’utente root (consiglio di tenere allineata la password dell’utente creato con quella di root):
# sudo su
# passwd
Abilitare quindi l’accesso via SSH tramite l’utente root modificando il relativo di configurazione:
# sudo nano /etc/ssh/sshd_config
Modificare la chiave PermitRootLogin abilitandola ed impostandola su “yes”, poi salvare premendo “CTRL + O” (Write Out) come indicato:
É altamente consigliato impostare un indirizzo IP fisso modificando il file 00-installer-config nel percorso /etc/netplan/ con il seguente contenuto:
# sudo nano /etc/netplan/00-installer-config.yaml
# This is the network config
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.0.223/24]
gateway4: 192.168.0.1
nameservers:
addresses: [192.168.0.1, 192.168.0.1]
Attenzione: Indicare l’indirizzo IP, Gateway e DNS desiderati in base a come è impostata la propria rete LAN. Il nome della scheda di rete come nell’esempio in questione ens33 può variare in base all’installazione.
Applicare e verificare le configurazioni eseguite, poi riavviare:
# sudo netplan apply
# ifconfig
# sudo reboot
Al riavvio sarà possibile collegarsi sia tramite un client SFTP come ad esempio WinSCP, FileZilla, Transmit o Cyberduck per trasferire e modificare i file presenti sul nostro server, oppure tramite un client SSH come ad esempio PuTTY (Windows) o Terminale (macOS/Linux) per eseguire i comandi di installazione e configurazione che vedremo nei futuri passaggi.
Consiglio altamente di collegarsi in SSH e di non usare direttamente il terminale della macchina.
Procediamo quindi all’aggiornamento del sistema operativo ed all’applicazione delle impostazioni di localizzazione, poi riavviamo e verifichiamole:
# sudo apt-get update
# sudo apt-get dist-upgrade
# sudo apt-get install language-pack-it language-pack-it-base
# sudo update-locale LANG=it_IT.UTF-8
# sudo timedatectl set-timezone Europe/Rome
# sudo reboot
# locale
# timedatectl
Nel caso si usi Proxmox consiglio l’installazione del seguente pacchetto seguito dall’attivazione della funzione “QEMU Guest Agent” nelle impostazioni della specifica macchina virtuale:
# sudo apt-get update
# sudo apt-get install qemu-guest-agent
Preparazione all'installazione
Eseguita l’installazione e le configurazioni basilari del sistema operativo, installiamo e configuriamo i componenti necessari all’esecuzione di ZoneMinder. Tutti i passaggi che eseguiremo sono ampiamente descritti nella documentazione ufficiale di installazione.
Per eseguire il tutto installeremo il pacchetto LAMP Server. A titolo informativo LAMP è un acronimo che fa riferimento a Linux, Apache, MySQL e PHP, che insieme permettono di creare un server web locale completo ed open source.
Installiamo quindi il pacchetto LAMP Server, poi sostituiamo il file predefinito di MySQL e modifichiamolo:
# sudo apt-get update
# sudo apt-get install tasksel
# sudo tasksel install lamp-server
# sudo rm /etc/mysql/my.cnf
# sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
# sudo nano /etc/mysql/my.cnf
Aggiungere al termine della sezione mysqld:
[mysqld]
...
sql_mode = NO_ENGINE_SUBSTITUTION
Quindi applicare le modifiche, poi modificare il file “php.ini”:
# sudo systemctl restart mysql
# sudo nano /etc/php/7.2/apache2/php.ini
Cercare all’interno del file la sezione “[Date]” e modificare la voce “date.timezone” come segue:
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Rome
Nel caso si volesse ampliare la memoria RAM che ZoneMinder può sfruttare, modificare il file relativo alla gestione dei dischi e partizioni:
# sudo nano /etc/fstab
Aggiungere al termine del file la seguente stringa, indicando la % che si desidera. Nell’esempio sottostante il 70% della memoria totale disponibile al sistema operativo verrà dedicata a ZoneMinder:
# ZoneMinder
tmpfs /dev/shm tmpfs defaults,noexec,nosuid,size=70% 0 0
Modifichiamo quindi la configurazione di Apache:
# sudo nano /etc/apache2/apache2.conf
Ed aggiungere al termine del file la seguente stringa:
# ServerName configuration
ServerName localhost
Quindi riavviare:
# sudo reboot
L'installazione di ZoneMinder
Adesso eseguiamo la vera e propria installazione di ZoneMinder.
Aggiungiamo i sorgenti, installiamo ZoneMinder e relativi componenti necessari poi applichiamo i permessi necessari:
# sudo add-apt-repository ppa:iconnor/zoneminder-1.34
# sudo apt-get update
# sudo apt-get install zoneminder php-gd libvlc-dev ffmpeg
# chmod 740 /etc/zm/zm.conf
# chown root:www-data /etc/zm/zm.conf
# chown -R www-data:www-data /usr/share/zoneminder/
# sudo adduser www-data video
Abilitiamo i moduli Apache, poi avviamo ZoneMinder:
# sudo a2enconf zoneminder
# sudo a2enmod cgi
# sudo a2enmod rewrite
# sudo a2enmod expires
# sudo a2enmod headers
# sudo systemctl enable zoneminder
# sudo systemctl start zoneminder
Attendere circa 30 secondi poi eseguire:
# sudo systemctl reload apache2
La sicurezza
Installato ZoneMinder, che gestirà la video sorveglianza per garantire la nostra sicurezza, direi che è consono rendere anche l’accesso di questo il più sicuro possibile.
Se non si vuole gestire in maniera sicura l’accesso, questa sezione può essere ignorata proseguendo con l’utilizzo limitato alla rete locale, ma vi consiglio altamente di predisporre il sistema.
Sicuramente per chi è in possesso di una VPN è consigliato accedere alla propria rete locale tramite questa, ma sfortunatamente questo tipo di approccio può essere scomodo per gestire ZoneMinder da remoto.
Vediamo quindi come renderlo sicuro e facilmente accessibile.
La prima operazione che consiglio di fare è creare un apposito account email tramite Gmail, oltre ad un servizio DDNS come ad esempio DuckDNS, NO-IP o Dyn (Da gestire tramite modem router), che sfrutteremo nei seguenti passaggi.
Troverete buona parte del materiale sotto indicato all’interno del file fornito in precedenza, scaricabile dalla sezione materiale necessario.
Accesso locale al web server:
Nel caso si volesse modificare la porta di accesso locale tramite HTTP, consiglio di seguire i seguenti passaggi:
# sudo nano /etc/apache2/ports.conf
Modificare quindi la porta predefinita “80” in quella che si desidera, ad esempio “8095”:
...
Listen 8095
...
Eseguire la medesima operazione sul seguente file:
# sudo nano /etc/apache2/sites-available/000-default.conf
Modificando:
<VirtualHost *:8095>
...
Accesso remoto sicuro al web server (SSL):
Per permettere l’accesso remoto sicuro tramite HTTPS è necessario creare un certificato:
# sudo openssl req -x509 -nodes -days 4096 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
Inserire i dati desiderati, ma è molto importante che il “Common Name” richiesto durante la creazione rispecchi il DDNS precedentemente creato oppure il proprio indirizzo IP statico fornito dal provider internet, nel caso si voglia usare quello.
Attenzione: Faccio presente che il certificato in questione è di tipo “auto generato”, di conseguenza i browser lo identificheranno come “poco sicuro”, ma in realtà sarà un certificato valido a tutti gli effetti. Su alcuni sistemi operativi come macOS o iOS potrebbe essere necessario installarlo nel portachiavi di sistema o nei profili per non avere problemi di accesso. Seguire questo tutorial per macOS, mentre su iOS basterà inviarselo via email ed installarlo dai profili dalle impostazioni.
Associare quindi i permessi ai file creati:
# sudo chown -R www-data:www-data /etc/ssl/private/apache-selfsigned.key
# sudo chown -R www-data:www-data /etc/ssl/certs/apache-selfsigned.crt
Creare i file necessari alla gestione SSL, applicare i corretti permessi e modificarne il contenuto:
# sudo nano /etc/apache2/conf-available/ssl-params.conf
Aggiungere al suo interno:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off
Modificare anche il seguente file:
# sudo nano /etc/apache2/sites-available/default-ssl.conf
E nella parte inerente ai certificati indicare quelli precedentemente creati:
...
# A self-signed (snakeoil) certificate can be created by installing
# the ssl-cert package. See
# /usr/share/doc/apache2/README.Debian.gz for more info.
# If both key and certificate are stored in the same file, only the
# SSLCertificateFile directive is needed.
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
...
Abilitare i relativi moduli e riavviare Apache:
# sudo a2enmod ssl
# sudo a2enmod headers
# sudo a2ensite default-ssl
# sudo a2enconf ssl-params
# sudo apache2ctl configtest
# sudo systemctl restart apache2
Consiglio inoltre di modificare la pagina web predefinita index.html rendendola vuota, in questo modo non apparirà la pagina predefinita di Apache.
Modificare quindi il file:
# sudo nano /var/www/html/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="it">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="">
</head>
</html>
Ed associargli i corretti permessi, poi riavviare:
# sudo chmod 644 /var/www/html/index.html
# sudo reboot
Protezione degli accessi (Fail2ban):
Un altro importantissimo fattore di sicurezza è la protezione dagli accesi indesiderati.
Per ottenere questa protezione utilizzeremo il software open source Fail2ban, che sì occuperà di analizzare i tentativi di accesso e bannerà l’indirizzo IP del malintenzionato (sia via internet che all’interno della rete locale) con delle regole da noi impostate.
In aggiunta a ZoneMinder, Fail2ban si occuperà anche della sicurezza dei moduli Apache, PHP e degli accessi via SSH.
Ci tengo a precisare che in rete non è disponibile alcuna regola per ZoneMinder correttamente funzionante, quindi mi sono occupato io stesso di creare una regola aggiornata e funzionante con le ultime versioni.
Come primo passaggio installiamo Fail2ban e rimuoviamo i file predefiniti non più necessari:
# sudo apt-get update
# sudo apt-get install fail2ban
# sudo rm /etc/fail2ban/jail.d/defaults-debian.conf
Sostituiamo i file presenti nella cartella /etc/fail2ban/, con quelli forniti presenti nel pacchetto scaricabile dalla sezione materiale necessario.
Analizziamo lo scopo dei file forniti:
- action.d:
- Tutti i file presenti sono stati modificati per evitare che ad ogni avvio e spegnimento del server venga inviata una mail di notifica.
- filter.d:
- zoneminder.conf: La regola che permette a Fail2ban di analizzare e comprendere eventuali accessi indesiderati di ZoneMinder.
- jail.d:
- jail.conf: É il file di configurazione principale di Fail2ban.
Come prima operazione, aprire ogni singolo file all’interno della cartella jail.d e verificare che tra le porte indicate vi sia quella precedentemente impostata per l’accesso HTTP. Prendendo come esempio il file zoneminder.conf:
[zoneminder]
enabled = true
port = http,https,8095
filter = zoneminder
logpath = %(apache_error_log)s
bantime = 24h
findtime = 10m
maxretry = 3
Procediamo poi modificando il file jail.conf, dove nella sezione DEFAULT:
- ignoreip: Un elenco di indirizzi IP che Fail2ban eviterà di bannare in caso di accessi falliti;
- maxretry: Dopo quanti accessi falliti l’eventuale malintenzionato verrà bannato;
- destmail: l’indirizzo email al quale verrà inviata la notifica di un accesso indesiderato con i dettagli del ban;
- sender: l’indirizzo email precedentemente creato che si occuperà di inviarci l’email.
...
[DEFAULT]
...
# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban
# will not ban a host which matches an address in this list. Several addresses
# can be defined using space (and/or comma) separator.
ignoreip = 127.0.0.1/8 192.168.0.150
...
# "maxretry" is the number of failures before a host get banned.
maxretry = 3
...
# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
#destemail = root@localhost
destemail = zoneminderalarms@gmail.com
...
# Sender email address used solely for some actions
#sender = root@<fq-hostname>
sender = zonemindersetup@gmail.com
....
Come anticipato, Fail2ban si occuperà di proteggere più servizi. Nel caso si volesse pulire la lista degli indirizzi bannati o capire lo stato dei servizi, dopo aver riavviato Fail2ban, è possibile eseguire i seguenti comandi:
# sudo fail2ban-client restart
# sudo fail2ban-client unban --all
# sudo fail2ban-client status
I componenti aggiuntivi
Strutturate le basi di ZoneMinder, è arrivato il momento di parlare dei componenti aggiuntivi.
Tra questi vi è il progetto Event Server, il gestore per l’inoltro di email Postfix e il plugin di streaming Cambozola.
Troverete buona parte del materiale sotto indicato all’interno del file fornito in precedenza, scaricabile dalla sezione materiale necessario.
Dipendenze ed utility:
Per i vari componenti che andremo ad installare sarà necessario predisporre delle dipendenze.
Oltre ad elementi necessari ho incluso qualche utility che non appesantisce il sistema ma che potrebbe tornarci utile in futuro:
# sudo apt-get update
# sudo apt-get install htop fping wget dnsutils openssl iptables iproute2 gawk grep sed jq \
curl net-tools flex bison git gcc make cmake build-essential pkg-config uuid-runtime \
libsystemd-dev ca-certificates chkrootkit ppa-purge software-properties-common
# sudo reboot
Molto comodo ad esempio chkrootkit che se eseguito permetterà di verificare eventuali “infezioni” sul nostro sistema, oppure htop per analizzare lo stato delle risorse ed i processi attivi.
Plugin di streaming Cambozola:
ZoneMinder contiene al suo interno il supporto al componente Cambozola.
Questo semplice plugin Java permette il corretto streaming della diretta delle nostre telecamere anche su browser che non lo supportano nativamente come ad esempio Internet Explorer. Sarà ovviamente necessario permettere l’esecuzione dei componenti Java. Scaricarlo dal portale ufficiale ed installarlo sulla macchina che lo richiede.
Attenzione: Potrebbe essere necessario inserire nelle configurazioni di sicurezza di Java l’indirizzo http e https di accesso a ZoneMinder.
Seppure molti dei recenti browser non hanno problemi, per compatibilità è consigliato installare questo plugin. In questo punto vedremo come installarlo e solo in un secondo momento come configurarlo.
Troverete all’interno del pacchetto fornito il cambozola.jar già pronto, da copiare all’interno del percorso /usr/share/zoneminder/www/
Sarà poi necessario associargli i permessi:
# sudo chmod 755 /usr/share/zoneminder/www/cambozola.jar
Inoltro email con Postfix:
Per permettere al sistema di inviare email, sia per ZoneMinder che Fail2ban è necessario configurare un servizio per la loro gestione.
Ne esistono svariati, ma personalmente utilizzo Postfix. Per il nostro scopo lo configureremo come “Relay Host”.
Installiamo quindi postfix con relative dipendenze utili:
# sudo apt-get update
# sudo apt-get install postfix libsasl2-2 sasl2-bin libsasl2-modules mailutils
Quando richiesto scegliere “Sito internet con smarthost” e procedere con i valori predefiniti.
Terminata l’installazione eseguire:
# sudo dpkg-reconfigure postfix
Nelle configurazioni seguenti vedremo il valore “zoneminder.com”, in realtà poi la configurazione verrà sostituita con dei file pre-configurati, in ogni caso consiglio di allinearlo con l’hostname del sistema scelto in fase di installazione.
Indicare i seguenti parametri:
- Sito internet con smarthost
- zoneminder.com
- smtp.gmail.com:587
- root
- server.zoneminder.com, localhost.zoneminder.com, localhost
- No
- 127.0.0.0/8
- 0
- +
- tutti
Sostituire i file presenti nella cartella /etc/postfix/ con quelli forniti, presenti nel pacchetto scaricabile dalla sezione materiale necessario.
Modificare quindi il file main.cf sostituendo al suo interno le parti interessate.
...
# General parameters
mydomain = zoneminder.com
myhostname = server.zoneminder.com
...
Modificare poi il file sasl_passwd con le proprie credenziali di accesso dell’email precedentemente creata:
# The server info must exactly match the value
# for "relayhost" in /etc/postfix/main.cf
smtp.gmail.com:587 zonemindersetup@gmail.com:topolino1234
Quindi applicarli e riavviare eseguendo:
# postmap hash:/etc/postfix/sasl_passwd
# postmap -q smtp.gmail.com:587 /etc/postfix/sasl_passwd
# rm /etc/postfix/sasl_passwd
# postfix reload
# sudo reboot
Al riavvio è possibile testare il corretto funzionamento provando ad inviare un’email:
# sendmail zoneminderalarms@gmail.com
Scrivere quindi un testo di prova e digitare “.” per terminare l’email.
Notifiche e riconoscimento oggetti e persone con Event Server:
Per ricevere notifiche push allo scatenarsi degli eventi ed attivare il riconoscimento dinamico di oggetti e persone è necessario installare il componente Event Server.
Tutte le informazioni su come procedere con l’installazione sono spiegate nella documentazione ufficiale, dove è indicato anche come attivare funzionalità avanzate come il Machine Learning. Noi però provvederemo all’installazione base che comprende il riconoscimento tramite la tecnologia YOLO applicabile praticamente su qualsiasi hardware, predisponendo comunque il sistema al supporto per il progetto Google Coral che può sfruttare ad esempio l‘USB Acceleratore EDGE TPU.
Installiamo quindi tutti i componenti necessari per l’esecuzione e riavviamo:
# sudo apt-get update
# sudo apt-get install python3-pip libyaml-perl libjson-perl libmodule-build-perl libssl-dev libgeos-dev
# sudo reboot
# sudo pip3 install --upgrade pip
# sudo pip3 install scikit-build
# sudo pip3 install opencv-contrib-python
# sudo perl -MCPAN -e "install Net::WebSocket::Server"
# sudo perl -MCPAN -e "install Config::IniFiles"
# sudo perl -MCPAN -e "install Crypt::Eksblowfish::Bcrypt"
# sudo perl -MCPAN -e "install Time::Piece"
# sudo perl -MCPAN -e "install LWP::Protocol::https"
# sudo perl -MCPAN -e "install Net::MQTT::Simple"
# sudo perl -MCPAN -e "install Getopt::Long"
# sudo perl -MCPAN -e shell
# install File::Spec
# quit
# sudo reboot
Passiamo quindi all’installazione del vero e proprio Event Server:
# cd /usr/src
# git clone https://github.com/pliablepixels/zmeventnotification.git
# cd zmeventnotification
# git fetch --tags
# git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
# sudo INSTALL_CORAL_EDGETPU=yes ./install.sh
Confermare tutte le richieste e dove indicato premere “y” ed attendere il termine dell’installazione.
Rimuovere quindi i file residui e predisporre le cartelle necessarie all’esecuzione:
# cd ..
# rm -r zmeventnotification
# mkdir -p /etc/zm/ssl/
# sudo chown -R www-data:www-data /etc/zm/ssl/
Sostituire i file presenti nella cartella /etc/zm/ con quelli forniti, presenti nel pacchetto scaricabile dalla sezione materiale necessario.
Nel caso sia già stato configurato l’SSL, copiare all’interno della cartella /etc/zm/ssl/ i certificati precedentemente creati, altrimenti seguire le indicazioni per crearne dei nuovi configurando l’SSL. I file sono disponibili nei seguenti percorsi:
- /etc/ssl/private/apache-selfsigned.key
- /etc/ssl/certs/apache-selfsigned.crt
Consiglio di applicare nuovamente i permessi alla cartella con il comando sopra indicato, poi riavviare. Procederemo alla loro configurazione in un secondo momento.
# cp /etc/ssl/private/apache-selfsigned.key /etc/zm/ssl/apache-selfsigned.key
# cp /etc/ssl/certs/apache-selfsigned.crt /etc/zm/ssl/apache-selfsigned.crt
# sudo chown -R www-data:www-data /etc/zm/ssl/
# sudo reboot
Conclusione
Tramite questa prima parte abbiamo quindi visto come installare ZoneMinder e tutti i componenti necessari alla sua esecuzione, nel prossimo articolo invece vedremo come procedere alla sua configurazione ed integrazione in Home Assistant.
Nel frattempo è possibile accedere al web server di zoneminder (locale) tramite il seguente indirizzo (indicando il corretto indirizzo IP e porta scelta):
http://192.168.0.223:8095/zm/
Per accedere da remoto, a patto di aver attivato l’SSL, indicare nell’URL “https” rimuovendo la porta ed indicando o l’indirizzo IP fornito dal provider internet o il DNS dinamico precedentemente scelto.
Attenzione: Nel caso si voglia attendere il prossimo articolo per la configurazione, consiglio di disattivare temporaneamente l’accesso remoto disabilitando l’apertura della porta 443 sul proprio router.
Dopo aver accettato le policy ci troveremo davanti la console principale di gestione:
9 commenti
Bravissimo! Tuttavia al contrario degli altri mi da questo errore:
sudo apache2ctl configtest
apache2: Syntax error on line 225 of /etc/apache2/apache2.conf: Syntax error on line 29 of /etc/apache2/sites-enabled/000-default.conf: directive missing closing ‘>’
Action ‘configtest’ failed.
Ottima guida veramente complimenti, una sola accortezza (magari sbaglio io), nella configurazione di postfix “postmap hash:/etc/postfix/sasl_passwd” da permession denied
Prova a dare “sudo”, la guida dopo averla scritta l’ho testata da 0 e tutto ha funzionato. Ovviamente tutto eseguito come root. Fammi sapere
Ho fatto e sembra andata a buon fine, ora sto provanto even server ma non riesco a capire perchè non riconosce nessun oggetto, o meglio vedo la cam senza i riquadri di event server.
È necessario configure il tutto. Ti consiglio di attendere l’articolo in merito 🙂
Parte 2 out
Complimenti per la guida, veramente ben fatta. L’ho seguita per filo e per segno e sembra tutto funzionare correttamente. Aspetto con ansia la parte numero 2 sulla configurazione. Ancora complimenti
Grazie! Spero di riuscire per la settimana prossima 🙂
Parte 2 out