Cum putem securiza un sistem Raspberry Pi?

Suntem obișnuiți să considerăm placa Raspberry Pi un sistem de dezvoltare a cărui scop este unul strict funcțional la fel ca și în cazul unei plăci echipate cu un microcontroler. Uităm adesea că avem de a face cu o placă ce rulează un sistem de operare și care necesită un set de reguli de securitate asemănătoare unui sistem de calcul de uz general (desktop sau server). În momentul în care integrăm placa de dezvoltare într-un proiect real, mai ales într-un proiect cu conectivitate Internet, lipsa implementării unor măsuri de securitate compromite fără discuție scopul proiectului – degeaba funcțional sistemul se comportă corect atâta timp cât el poate fi afectat foarte ușor de incidente malițioase sau accidente de utilizare.

Există multe documentații ce dezbat acest subiect și parcurgerea lor poate să creioneze mai bine dimensiunea și seriozitatea problemei:

Securing Your Raspberry Pi: From Passwords to Firewalls

http://www.makeuseof.com/tag/securing-raspberry-pi-passwords-firewalls/

IoT Security: Tips to Protect your Device from Bad Hackers

https://www.hackster.io/charifmahmoudi/iot-security-tips-to-protect-your-device-from-bad-hackers-768093

Make your Raspberry Pi more secure

http://iot-projects.com/index.php?id=make-your-raspberry-pi-more-secure

Securing Your Raspberry Pi

https://www.madirish.net/566

How to set up a secure Raspberry Pi web server, mail server and Owncloud installation

https://www.pestmeester.nl/

Raspberry Pi Firewall and Intrusion Detection System

http://www.instructables.com/id/Raspberry-Pi-Firewall-and-Intrusion-Detection-Syst/

Setting up a (reasonably) secure home web-server with Raspberry Pi

https://mattwilcox.net/web-development/setting-up-a-secure-home-web-server-with-raspberry-pi

În cadrul proiectului de față vom structura regulile de securitate specifice unei plăci Raspberry Pi în trei categorii dictate de nivelul la care se aplică:

  • Securitate fizică
  • Reguli minimale de operare
  • Instrumente suplimentare de securitate

 

Securitatea fizică a unei plăci Raspberry Pi

Fără a avea intenția de a cădea în desuet trebuie subliniată importanța integrității fizice a sistemului de calcul. Degeaba asigurăm o securitate logică impecabilă dacă din punct de vedere fizic sistemul este amenințat de incidente de funcționare electrică sau mecanică. Unele dintre cele mai importante reguli ce trebuie respectate în utilizarea plăcii Raspberry Pi sunt:

  • Asigurarea unei surse de alimentare stabilizată și de putere electrică suficient de mare. Nu se recomandă utilizarea unor surse de tensiune ieftine. În cazul în care sistemul asigură o funcționalitate critică (controlul unei centrale termice sau a unui sistem de securitate) este recomandată utilizarea suplimentară a unui sistem UPS. Se recomandă utilizarea alimentatorului oficial al plăcii de dezvoltare:

2

https://www.robofun.ro/raspberry-pi-si-componente/alimentator-raspberry-pi-2.5-a

  • Utilizarea unei carcase este absolut necesară. Această are rolul de proteja placa de dezvoltare de praf și alte mizerii dar și de a preîntâmpina distrugrea acesteia din cauza unei descărcări electrostatice. Improvizarea unei învelitori de carton sau din alte materiale moi nu este recomandă. Se poate alege o variantă potrivită în funție de domeniul de utilizare a sistemului final:

3

https://www.robofun.ro/raspberry-pi-si-componente/raspberry-cutii

  • Utilizarea unui radiator sau / și a unui ventilator pentru microprocesorul plăcii de dezvoltare nu se face doar în cazul forțării frecvenței procesorului (overclocking). Menținerea unei temperaturi scăzute pentru procesor crește durata de funcționare a acestuia și crește fiabilitatea sistemului final.

4

https://www.robofun.ro/raspberry-pi-si-componente

  • Ignorată adesea, componenta ce stochează sistemul de operare al plăcii de dezvoltare – cardul de memorie – este un element extrem de important pentru buna funcționare a sistemului final. Carduri cu viteză mică de acces, uzate sau cu defecte de fabricație conduc la probleme ce pot fi anevoios de diagnosticat și crează multe bătăi de cap.

5

 

Reguli minimale de operare

Aceste reguli trebuie implementate indiferent de scopul sistemului (dezvoltare sau proiect operațional) fiind esențiale în operare eficientă a plăcii de dezvoltare Raspberry Pi și reprezentând un nucleu de bune practici aplicabil pentru sisteme de calcul diverse (de la routere WiFi până la servere):

  • Schimbarea datelor de conectare implicite. Minimal se recomandă schimbarea parolei utilizatorului pi cu ajutorul comenzii passwd dar mult mai bine este crearea unui cont utilizator nou și ștergerea contului pi. În acest fel sistemul nu poate fi accesat utilizând date de conectare bine cunoscute.
  • Utilizarea versiunii potrivite a sistemului de operare. Pentru placa de dezvoltare Raspberry Pi sunt disponibile mai multe variante (distribuții) ale sistemului de operare Linux. Fiecare dintre aceste variante are un anumit specific ce este potrivit unui anumit domeniu de utilizare. Chiar distribuția oficială a plăcii, distribuția Raspbian, are două versiuni: Raspbian Jessie with PIXEL și Raspbian Jessie Lite (cea din urmă nu include interfața grafică ci doar consolă de tip linie de comandă) – dacă sistemul final nu va include un ecran grafic este o risipă de resurse să se utilizeze versiunea completă (with PIXEL). În plus, un sistem de operare încărcat (cu multe pachete software instalate) prezintă mai multe riscuri de securitate.

6

(instalarea interfeței grafice doar pentru a controla sistemul de la distanță prin intermediul VNC este o opțiune extrem de infantilă, controlul cel mai bun al unui sistem Linux se realizează la nivel de linie de comandă – utilizați SSH)

  • Menținerea software-ului la zi. Instalarea ultimelor versiuni ale pachetelor software ce compun distribuția Linux nu este un moft ce ține de noi funcționalități introduse – apariția unor noi versiuni de programe este dictată de multe ori de rezolvarea unor probleme (bug-uri) de securitate.

!!! sudo apt-get update !!!

!!! sudo apt-get upgrade !!!

  • Dezinstalarea sau dezactivarea pachetelor software nefolosite. Fiecare pachet software este un posibil furnizor de probleme de securitate. Dezinstalarea pachetelor neutilizate este una dintre cele mai bune soluții. O completare a acestei reguli constă în dezactivarea serviciilor neutilizate (de exemplu, serviciul SSH reprezintă un risc ridicat de securitate, este recomandată oprirea acestui serviciu dacă nu îl utilizăm). O listă a serviciilor (a programelor ce pornesc odată cu sistemul de operare) se poate obține cu ajutorul comenzii:

sudo service –status-all | grep +

dezactivarea unui serviciu se va face cu ajutorul comenzii:

sudo systemctl disable nume_serviciu

  • Configurarea resurselor hardware în conformitate cu scopul sistemului. Chiar dacă în sine o resursă hardware, activată și neutilizată, nu implică o vulnerabilitate de securitate, este bine să avem activate doar resursele hardware utilizate (aici vorbim de porturile I/O, I2C, SPI, port serial etc.). Acest lucru se poate configura cu ajutorul comenzii:

sudo raspi-config

7

Un exemplu suplimentar îl reprezintă memoria plăcii de dezvoltare, este recomandată micșorare memoriei alocate procesorului grafic dacă nu utilizăm interfața grafică eliberând astfel mai multă memorie pentru CPU (se poate face acest lucru din Advanced -> Memory Split).

8

Instrumente suplimentare de securitate

În cele ce urmează vom prezenta o serie de programe care, utilizate corect, pot crește nivelul de securitate a unui sistem Raspberry Pi.

9

Firewall/iptables

este un mecanism intern al sistemului de operare ce permite filtrarea comunicațiilor de rețea. Filtrarea se realizează după reguli încadrate în trei mari categorii: INPUT – conexiuni de rețea de intrare, OUTPUT – conexiuni de rețea de ieșire, FORWARD – conexiuni de rețea ce traversează sistemul. Cu ajutorul acestui mecanism se poate decide ce conexiuni de rețea va accepta sistemul nostru, de la ce adrese, ce servicii (ce porturi) sunt accesate etc. De exemplu, următoarele două instrucțiuni:

sudo iptables -A INPUT -s xxx.xxx.xxx.xxx -j A

CCEPT

sudo iptables -A INPUT -j REJECT

vor avea ca efect acceptarea conexiunilor de la adresa IP xxx.xxx.xxx.xxx și rejectarea oricărei alte conexiuni – sistemul nostru va putea fi accesat doar de la adresa IP indicată. Aceasta este o practică foarte bună dacă adresele sistemelor cu care comunică sistemul nostru sunt fixe. Pentru a lista toate regulile de filtrare se poate folosi comanda:

sudo iptables -L

Fail2ban – este un utilitar ce permite blocarea comunicației de rețea cu o anumită adresă IP în urma activității malițioase generate de la acea adresă: mai multe încercări de conectare la distanță nereușite, scanarea de vulnerabilități de la distanță ș.a.m.d. Funcționarea acestuia se bazează pe scanarea fișierelor jurnal ale diverselor servicii sistem (SSH, web, mail) și, în cazul detectării unor activități rău intenționate, pe introducerea unei restricții temporare în sistemul iptables.

10

Pentru utilizare primul pas este instalarea pachetului software:

sudo apt-get install fail2ban

După care se va edita fișierul /etc/fali2ban/jail.local și se vor introduce reguli de supraveghere. Următorul bloc este un exemplu bun pentru serviciul SSH (orice adresă IP cu trei încercări nereușite de conectare va fi blocată timp de 15 minute, excepție făcând adresele locale din clasa 192.168.0.0/16):

[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
mail-whois-lines[name=%(__name__)s, dest=%(destemail)s, logpath=%(logpath)s]
logpath = /var/log/auth.log
maxretry = 3
bantime = 900
ignoreip = 192.168.0.0/16

Pentru ca modificările în fișierul de configurare să aibă efect vom reporni serviciul:

sudo /etc/init.d/fail2ban restart

Mai multe informații despre programul fail2ban puteți găsi la adresa:

http://www.fail2ban.org/wiki/index.php/Main_Page

11

rkhunter & chrootkit – sunt două programe menite să scaneze sistemul împotriva unor aplicații malițioase (rootkit-uri). Chiar dacă incidența infectării cu aplicații de tip virus este mică în cazul sistemelor Linux asta nu înseamnă că nu există amenințări la adresa sistemului de fișiere local. Rootkit-urile sunt programe, cel mai adesea rău intenționate, care modifică fișiere sistem ascunzând alte aplicații sau permițând accesul de la distanță unor persoane neautorizate. De cele mai multe ori deținătorul sistemului nici nu e conștient de infectarea acestuia. Cele două aplicații verifică integritatea fișierelor sistem și detectează aplicațiile de tip rootkit. Instalarea aplicațiilor se face cu ajutorul comenzii:

sudo apt-get install chkrootkit rkhunter libwww-perl

Rularea aplicației chkrootkit se face cu ajutorul comenzii:

sudo chkrootkit

12

Aplicația rkhunter se poate utiliza cu ajutorul comenzilor:

sudo rkhunter –update

sudo rkhunter –check

13

logwatch – este o aplicație de monitorizare și raportare pentru fișierele jurnal sistem (log-uri). Chiar dacă este un instrument pasiv (de monitorizare), utilizarea acestuia poate preveni foarte multe incidente de securitate prin alertarea timpurie a deținătorului sistemului. Instalarea acestui program se face cu ajutorul comenzii:

sudo apt-get install logwatch

14

După instalare aplicația logwatch va rula zilnic și va raporta prin email către administratorul sistemului (utilizatorul root) sumarul fișie

relor jurnal sistem. Ajustarea parametrilor de funcționare se poate face prin editarea fișierului /usr/share/logwatch/default.conf/logwatch.conf . Testarea aplicației se poate face cu ajutorul comenzii:

sudo logwatch –range=today

 

Instrumentele software prezentate nu reprezintă decât câteva exemple de aplicații ce pot ajuta utilizatorii să mențină un nivel de securitate adecvat pentru sistemele lor Raspberry Pi. Există și alte aplicații ce pot fi utilizate în funcție de scopul și domeniul de utilizare a sistemului. Vă recomandăm încă două aplicații interesant de explorat:

Snort – sistem de detecție și prevenție a intruziunilor (IDPS), foarte util în cazul sistemelor de tip gateway.

https://www.snort.org/

ClamAv – sistem open-source antivirus, necesar în cazul implementării unor servere de fișiere.

https://www.clamav.net/

Cum putem partaja fișiere în rețea utilizând o placă Raspberry Pi?

Partajarea de fișiere în rețea este necesară în mai multe situații: proiecte multi-sistem ce partajează același sistem de fișiere (calcul paralel, redundanță a serviciilor, acces concurent la o colecție de date), segregare funcțională în cadrul unui serviciu multi-sistem sau pur și simplu disponibilitatea unor fișiere către mai multe sisteme de calcul (server de fișiere). Există mai multe metode prin care o placă Raspberry Pi poate face disponibile fișiere locale prin intermediul rețelei. Lecția de față prezintă două dintre acestea: prin intermediul serverului SSH și prin intermediul serverului SAMBA.

Partajarea de fișiere prin intermediul serviciului Secure Server Shell

Serviciul SSH este gândit pentru a putea accesa de la distanță un sistem Linux la nivel de consolă (linie de comandă). Pe lângă conectarea la consola sistemului serviciul SSH permite și transferul de fișiere prin intermediul componentei SCP (Secure Copy Protocol) – componentă care se află în spatele posibilității de a partaja fișiere în rețea. Această modalitate de partajare este specifică sistemelor Linux, cu alte cuvinte putem partaja fișiere între mai multe plăci Raspberry Pi sau între o placă Raspberry Pi și alte sisteme ce rulează sistemul de operare Linux. Există diverse utilitare ce expun această facilitate altor sisteme de operare dar în cadrul acestei lecții ne vom limita la sistemul de operare Linux.

Pentru mai multe informații legate de funcționarea serviciului SSH se pot vedea și:

Raspberry Pi – Remote Access

https://www.raspberrypi.org/documentation/remote-access/

Adafruit’s Raspberry Pi Lesson 6. Using SSH

https://learn.adafruit.com/adafruits-raspberry-pi-lesson-6-using-ssh/

Sistemul care partajează fișierele în rețea (sistemul server) trebuie să aibă serverul de SSH pornit (pachetul software SSH este instalat implicit în distribuția Rasbpian dar nu pornește în mod automat din motive de securitate):

sudo /etc/init.d/ssh start

Pentru a configura pornirea automată a serviciului la restartarea sistemului putem utilitarul raspi-config sau putem utiliza comanda:

sudo systemctl enable ssh

Pe sistemul care va accesa fișierele în rețea (sistemul client) este nevoie să instalăm pachetul sshfs (SSH File System):

sudo apt-get install sshfs

Pentru a conecta un director la sisteme de fișiere local vom utiliza comenzile:

mkdir director_nou

sshfs user@xxx.xxx.xxx.xxx: director_nou

unde user este utilizatorul de pe sistemul server și xxx.xxx.xxx.xxx adresa de rețea a sistemului server. În directorul nou creat și conectat la sistemul server se va mapa (implicit) directorul home al utilizatorului user. Dacă dorim să mapăm un alt director se va completa comanda (după 🙂 cu calea către acel director dar, atenție, utilizatorul cu care ne conectăm trebuie să aibă drepturile adecvate asupra acelui director.

Pentru a deconecta legătura dintre sisteme se va utiliza comanda:

umount director_nou

În cele prezentate până acum am arătat o modalitate foarte simplă de partajare de fișiere între două sisteme Linux (oricare dintre ele, sau amândouă, putând fi plăci Raspberry Pi). Totuși, pentru a crea un server de fișiere într-o rețea locală, o soluție mult mai robustă este utilizarea serviciului SAMBA – serviciu ce permite partajarea de fișiere și de dispozitive de tip imprimantă cu sisteme ce rulează diverse sisteme de operare (în special Windows). Prin intermediul instalării serviciului SAMBA pe o placă Raspberry Pi putem partaja în rețea dispozitive de stocare de mare capacitate (hard-disk-uri USB de exemplu) obținând astfel dispozitive de stocare de rețea la un preț accesibil – dispozitivele hardware dedicate de acest tip au un cost destul de mare…

2

Pentu mai multe detalii legate de serviciul SAMBA puteți consulta și:

Samba – Wikipedia

https://en.wikipedia.org/wiki/Samba_(software)

What is Samba?

https://www.samba.org/samba/what_is_samba.html

 

Partajarea de fișiere prin intermediul serviciului SAMBA

Serverul SAMBA nu este instalat implicit și din acest motiv primul pas este instalarea pachetelor aferente:

sudo apt-get install samba

Dacă dorim să partajăm în rețea unități de stocare ce au fost formatate NTFS (sistem de fișiere specific ultimelor versiuni ale sistemului de operare Windows) este necesar să instalăm suportul pentru acest tip de sistem de fișiere pentru a putea conecta aceste unități la placa Raspberry Pi:

sudo apt-get install ntfs-3g

Pentru a defini partjarea dorită vom edita fișierul /etc/samba/smb.conf și vom adăuga la sfârșit:

[Share]

comment = share

path = /calea/catre/directorul/partajat

writeable = yes

only guest = yes

create mask = 0777

directory mask = 0777

browseable = yes

public = yes

unde share va fi numele sub care vom vedea partajarea și /calea/catre/directorul/partajat este calea completa a directorului ce urmează a fi partajat (poate fi calea către locul unde am montat drive-ul USB).  Salvăm și pornim serverul SAMBA:

sudo /etc/init.d/samba start

Dacă dorim pornirea automată a serverului la repornirea sistemului:

sudo systemctl enable samba

De pe un sistem de calcul ce rulează Windows, din aceiași rețea locală ca și sistemul Raspberry Pi, vom vedea imediat în Network sistemul Raspberry Pi și vom putea utiliza fișierele partajate. Configurația precedentă permite accesul la fișierele partajate fără nici un fel de autentificare (utilizator/parolă).

3

4

În cazul în care dorim să partajăm anumite directoare în mod restricționat trebuie să parcurgem următorii pași:

Creăm un grup de utilizatori smb:

sudo groupadd smb

Adăugăm un utilizator acestui grup (poate să fie utilizatorul implicit pi sau un alt utilizator):

sudo adduser pi smb

Stabilim o parolă pentru accesul în rețea:

sudo smbpasswd -a pi

Edităm fișierul /etc/samba/smb.conf și adăugăm la final:

[Share2]

comment = share2

path = /calea/catre/directorul/partajat

writeable = yes

only guest = no

create mask = 0777

directory mask = 0777

browseable = yes

public = no

Repornim serverul de SAMBA:

sudo /etc/init.d/samba restart

Acest nou director partajat va fi accesibil doar prin introducerea numelui de utilizator și a parolei stabilite.

5

Configurațiile precedente (prezentate pentru serviciile SSH și SAMBA) au fost testate pe plăci Raspberry Pi rulând Raspbian GNU/Linux 8 (jessie), kernel 4.4.45-v7+, sshfs 2.5-1 și samba 2:4.2.14+dfsg-0+deb8u2.

Pentru mai multe informații despre configurarea serviciului SAMBA pe o placă Raspberry Pi se pot parcurge și următoarele materiale:

Raspberry Pi Bit-Torrent/DLNA/SAMBA Server Part 2: Setting up Samba

http://joerpi.blogspot.ro/2013/06/raspberry-pi-bit-torrentdlnasamba.html

How to Turn a Raspberry Pi into a Low-Power Network Storage Device

http://www.howtogeek.com/139433/how-to-turn-a-raspberry-pi-into-a-low-power-network-storage-device/

How-To: Share a folder with a Windows computer from a Raspberry Pi

http://raspberrypihq.com/how-to-share-a-folder-with-a-windows-computer-from-a-raspberry-pi/

Cum putem partaja dispozitive USB între două plăci Raspberry Pi?

Avantajele partajării de dispozitive USB între mai multe dispozitive sunt evidente: accesul la distanță la un element de scanare, la elemente ale interfațării cu utilizatorul (tastatură, mouse) sau chiar accesul la sisteme de stocare (USB drives). Partajarea dispozitivelor USB se realizează prin intermediul rețelei și poartă denumirea de USB over Ethernet, USB over Network sau USB over IP. Există numeroase produse comerciale (software, hardware sau combinație software și hardware) ce oferă posibilitatea de a partaja dispozitive USB între mai multe sisteme de calcul dar, în general, aceste produse au un cost destul de mare. Câteva exemple:

Industrial USB 2.0 Over IP Network 4-Port Hub – TCP/IP Network

https://www.coolgear.com/product/industrial-usb-2-0-ip-network-4-port-hub-share-usb-device-tcpip-network

USB IP Extender

http://www.digivision.it/prodotti/NTI/usb-ip-extender.html

USB over Network – USB for Remote Desktop

http://www.usb-over-network.com/

USB over Network – Share and access your USB devices over local network or Internet

http://www.usb-over-network.com/usb-over-network.html

Grație proiectului open-source USB/IP putem implementa (fără nici un cost de licențiere) o partajare de dispozitive USB între sisteme ce rulează Linux (există și portări ale proiectului pentru Windows și MacOS dar nu sunt foarte stabile). În cadrul proiectului de față vom ilustra instalarea și utilizarea acestui proiect software pe două plăci de dezvoltare Raspberry PI.

2

http://usbip.sourceforge.net/

Componentele software USB/IP permit partjarea de dispozitive USB de diverse tipuri:

  • Dispozitive de stocare USB;
  • Dispozitive de intrare (tastatură, mouse);
  • Camere video sau sisteme audio USB;
  • Imprimante, scanere și chiar interfețe de rețea.

Utilizarea dispozitivelor partajate se face utilizând driverele originale ale acestora dar se introduce un nivel suplimentar de retransmitere a mesajelor I/O specifice comunicației USB: VHCI Driver – Virtual Host Controller Interface <-> Stub Driver. Sistemul care găzduiește fizic dispozitivul USB și îl partajează în rețea joacă rolul de Server iar sistemul care instalează virtual la distanță dispozitivul USB joacă rolul de Client.

 3

 

 Instalarea și configurarea USB/IP pe o placă Raspberry PI (server)

Pentru instalarea pachetului software USB/IP se va utiliza comanda (pachetul este inclus în distribuția Raspbian 7 și 8):

sudo apt-get install usbip

Pentru a vedea toate dispozitivele USB din sistem se va utiliza comanda lsusb:

4

Vom încărca componentele driver pentru server cu ajutorul comenzii:

sudo modprobe usbip-host

după care vom putea vizualiza care din dispozitivele USB sunt vizibile pentru partajare:

sudo usbip list -l

5

Pentru pornirea componentei server vom utiliza comanda:

sudo usbipd -D

iar pentru a partaja un dispozitiv vom utiliza comanda:

sudo usbip bind -b x-x.x

unde x-x.x este indicativul dispozitivului USB dorit.

În exemplul nostru dacă dorim să partajăm dispozitivul 1-1.2 care nu este altceva decât un stick USB vom da comanda:

sudo usbip bind -b 1-1.2

și vom putea verifica disponibilitatea lui cu ajutorul comenzii:

sudo usbip list -r xxx.xxx.xxx.xxx

unde xxx.xxx.xxx.xxx este adresa de rețea IP a sistemului.

6

 

Instalarea și configurarea USB/IP pe o placă Raspberry Pi (client)

La fel ca și în cazul sistemului server se va instala pachetul software USB/IP:

sudo apt-get install usbip

Pentru a vedea dispozitivele partajate de sistemul server se folosește comanda:

sudo usbip list -r xxx.xxx.xxx.xxx

unde xxx.xxx.xxx.xxx este adresa IP a sistemului server.

”Conectarea” dispozitivului USB presupune încărcarea driverului VHCI:

sudo modeprobe vhci-hcd

și atașarea propriu-zisă a dispozitivului:

sudo usbip attach –host xxx.xxx.xxx.xxx –busid x-x.x

Dacă atașarea s-a realizat cu succes dispozitivul USB se va putea vizualiza cu ajutorul comenzii lsusb.

7

În cadrul exemplului nostru, fiind vorba de un dispozitiv de stocare USB, dispozitivul se va putea utiliza ca și cum ar fi conectat local. Se va verifica identificarea ca și dispozitiv de stocare cu ajutorul comenzii:

ls -l /dev/disk/by-uuid/

8

și se va putea monta în cadrul sistemului local de fișiere:

sudo mkdir /mnt/usb

sudo mount /dev/sda /mnt/usb

Testarea configurației prezentate s-a făcut pe două plăci Raspberry Pi rulând Raspbian GNU/Linux 8 (jessie), kernel 4.4.45-v7+, și usbip 2.0+3.16.7-ckt20-1.

O alternativă comercială la proiectul USB/IP este VirtualHere USB Server. Acest produs comercial are componentă binară server specială pentru placa Raspberry Pi, client pentru mai multe sisteme de operare (inclusiv Windows) și poate fi utilizat și în variantă trial (se poate partaja un singur dispozitiv USB și se va afișa o fereastră de avertizare la fiecare utilizare).

9

https://virtualhere.com/

Pentru instalarea acestui produs comercial se poate vedea tutorialul:

VirtualHere with Raspberry Pi as USB server

http://vmwarebits.com/content/virtualhere-raspberry-pi-usb-server

Ce putem face cu un telefon vechi Android?

Chiar dacă îndrăgim telefonul inteligent pe care îl avem în prezent și chiar dacă el nu are nici o problemă de funcționare, totuși, la un moment dat, el va trebui schimbat cu unul nou – apar aplicații ce au nevoie de mai multe resurse de calcul, suntem sclavii modei în permanență schimbare, apar noi standarde de comunicație GSM (3G/4G) – nu contează motivul înlocuirii telefonului dar înlocuirea în sine la o perioadă din ce în ce mai scurtă de timp este o certitudine. În urma acestui proces de îmbunătățire continuă a dispozitivelor de comunicație mobilă rămân disponibile telefoane mobile pe care le uităm printr-un colț al dulapului sau pe care le ducem direct la centrul de reciclare. În ambele cazuri valoarea recuperată este zero. Există mai multe modalități prin care putem pune în valoare mult mai bine aceste dispozitive modificându-le scopul principal de funcționare – nu trebuie să uităm că un telefon mobil inteligent este un sistem de calcul puternic cu mult mai multe resurse hardware decât majoritatea plăcilor de dezvoltare cu care lucrăm (Arduino sau Raspberry Pi). Proiectul de față face referire la telefoanele mobile inteligente ce rulează sistemul de operare Android și dă ca exemplu trei situații în care putem pune în valoare componentele hardware ale telefonului mobil în alte scopuri decât cel pentru care a fost proiectat în ciuda arhitecturii Android total neprietenoase cu modificările la nivel funcțional.

Utilizarea unui telefon mobil Android ca și cameră de supraveghere IP (WiFi sau GSM)

Telefoanele mobile inteligente, chiar și de generație mai veche, dețin camere video performante ce pot servi foarte bine ca și camere de supraveghere. Conectivitatea de rețea (WiFi sau GSM) oferită de arhitectura unui telefon mobil inteligent contribuie excelent la scopul propus în acest prim exemplu. În acest mod transformăm un obiect inutil, un telefon mobil disponibilizat, într-un dispozitiv util și, echivalent, foarte scump. Pentru a face acest lucru este necesar să instalăm un software specializat. Există mai multe astfel de programe de acest gen dar vă recomandăm IP Webcam:

2

https://play.google.com/store/apps/details?id=com.pas.webcam

Aplicația IP Webcam permite transmiterea în rețea a imaginilor preluate de la camera video a  telefonului (oricare dintre camerele telefonului). Accesarea transmisiei on-line se poate face de pe orice client cu un browser web, inclusiv un alt telefon mobil, accesând IP-ul telefonului mobil pe portul 8080. Printre alte facilități ale aplicației putem enumera: înregistrarea video, preluarea unui singur cadru (fotografie), pornirea blitz-ului, filmarea pe timp de noapte, controlul focusului și a zoom-ului și chiar și afișarea valorilor citite de la senzorii telefonului mobil (accelerometru, senzorul de lumina, senzorul de proximitate, senzorul de temperatura și nivel de încărcare a bateriei). Aplicația poate fi configurată să pornească automat la inițializarea telefonului mobil astfel încât funcționalitatea de cameră de supraveghere să nu fie afectată de repornirea accidentală a dispozitivului. Toate aceste funcționalități pot fi accesate prin intermediul conexiunii WiFi dar și printr-o conexiune de date mobilă GSM pentru supravegherea unor spații izolate. Accesul la cameră se poate proteja prin parolă.

3

În cazul în care dorim să accesăm dispozitivul dintr-o altă rețea decât cea din care face parte (supraveghere la distanță prin Internet) se poate înregistra un cont gratuit pe serviciul cloud Ivideon ce permite accesul de oriunde la camerele înregistrate în serviciul cloud. Mai mult decât atât serviciul cloud permite și stocarea înregistrărilor video, detecția mișcării și notificări diverse. Pentru o conexiune WiFi nu este nevoie ca telefonul mobil să aibă cartelă SIM GSM.

4

Cloud Video Surveillance | Ivideon

https://www.ivideon.com/

O alternativă la instalarea unui software specializat de transmisie video este instalarea pe telefonul mobil a unui software de control la distanță ce permite accesul la toate funcționalitățile mobilului inclusiv accesul la camerele video ale acestuia. Accesul la toate funcționalitățile telefonului mobil poate deschide noi oportunități funcționale cum ar fi, de exemplu, transformarea telefonului mobil în dispozitiv de urmărire GPS. Un software foarte cunoscut este TeamViewer.

5

https://www.teamviewer.com/

Pe telefonul ce urmează a fi controlat la distanță se instalează versiunea Host a aplicației TeamViewer:

TeamViewer Host

https://play.google.com/store/apps/details?id=com.teamviewer.host.market

Controlul la distanță se poate realiza dintr-o interfață web sau instalând versiunea Viewer a aplicației (disponibilă pe Windows dar și pe telefonul mobil). Controlul la distanță a dispozitivului Android necesită înregistrare dar utilizarea este gratuită pentru scop personal. Aplicația Host pornește în mod automat o dată cu sistemul de operare Android și permite atât controlul complet al interfeței utilizator dar și supravegherea la distanță a parametriilor de funcționare.

6

Utilizarea unui telefon mobil Android ca și modem GSM / placă de rețea WiFi

Este foarte bine cunoscută posibilitatea telefoanelor mobile de a se transforma în hot-spoturi WiFi mobile pentru a partaja conexiunea la Internet cu alte dispozitive (laptop-uri sau alte telefoane mobile) – facilitatea de tethering:

https://en.wikipedia.org/wiki/Tethering

Aceiași facilitate poate fi utilizată pentru diverse plăci de dezvoltare (Raspberry Pi sau Arduino Yun) pentru a oferi acestora conectivitate Internet prin intermediul rețelei GSM sau prin intermediul unei rețele WiFi (este cazul plăcilor Raspberry Pi mai vechi ce nu au interfață WiFi integrată). În acest fel se utilizează un dispozitiv disponibil (un telefon mobil vechi) în locul unor shield-uri sau dispozitive scumpe (shield GSM, modem GSM). Este de preferat ca tethering-ul să se facă prin intermediul conexiunii USB deoarece asigură o viteză mare de transfer, nu ocupă intefața WiFi sau bluetooth a plăcii de dezvoltare și asigură și alimentarea telefonului mobil.

7

Configurarea plăcii de dezvoltare este identică pentru o conexiune de rețea GSM sau una WiFi. Pentru o placă Raspberry Pi, după conectarea fizică la portul USB al plăcii de dezvoltare a telefonului mobil se poate verifica recunoașterea hardware a acestuia prin instrucțiunea dmesg (în exemplificare s-a utilizat un telefon mobil Orange Zilo, Android 4.2.2, produs în 2014 și o placă de dezvoltare Raspberry Pi rulând Raspbian GNU/Linux 8 (jessie), kernel 4.4.43-v7+)  :

8

Instalarea lui ca dispozitiv USB cu ajutorul comenzii lsusb:

9

Și configurația de rețea asociată cu ajutorul comenzii ifconfig:

10

Configurarea dispozitivului se realizează automat în cazul configurației dată ca exemplu. Pentru detalii legate de configurația manuală se pot consulta proiectele următoare:

How to use an Android tablet as a Raspberry Pi console terminal and internet router

http://elinux.org/How_to_use_an_Android_tablet_as_a_Raspberry_Pi_console_terminal_and_internet_router

Raspberry Pi USB Tethering (using an Android phone)

https://www.youtube.com/watch?v=x_yhJ_QBfaU

Android USB Tethering to Connect a Raspberry Pi to the Internet

http://mobilesociety.typepad.com/mobile_life/2015/03/android-usb-tethering-to-connect-a-raspberry-pi-to-the-internet.html

Sau pentru utilizarea unei plăci Arduino Yun:

Configure Arduino Yun for Android Tethering

https://www.youtube.com/watch?v=wqvwG2xD-_g

Connect Arduino Yun to 3g 4g Mobile Networks

http://selfbuilt.net/wiki/doku.php?id=arduino_yun_mobile_networks

Use 3g/UMTS USB Dongle for WAN connection

https://wiki.openwrt.org/doc/recipes/3gdongle

Utilizarea unui telefon mobil Android ca și ecran tactil pentru o placă Arduino

Cu toții ne-am lovit de problema realizării unei interfețe utilizator compacte și multifuncționale pentru sistemele dezvoltate cu ajutorul plăcilor Arduino – ecrane alfanumerice sărăcăcioase, butoane ce trebuie integrate solid în carcasa sistemului sau ecrane tactile color scumpe și care consumă imediat memoria internă a plăcii de dezvoltare. Acesta este motivul pentru ce de a treia propunere de utilizare a unui telefon mobil Android vechi. Putem reutiliza telefonul mobil și îl putem transforma într-un ecran tactil color pentru un sistem Arduino fără a cheltui suplimentar și fără a epuiza memoria internă a plăcii de dezvoltare. Mai mult decât atât, dacă se combină interfațarea cu accesul la distanță – prezentat în prima parte a proiectului – vom obține un sistem cu o interfață grafică color dar și controlabil de oriunde din Internet. Conexiunea între telefonul mobil și placa de dezvoltare se realizează prin USB și există două posibilități:

Utilizând modul accesoriu bazat pe extensia Android ADK – este necesară utilizarea unei plăci Arduino Mega ADK:

11

https://www.robofun.ro/arduino/arduino_mega_adk

sau a unui shield USB Host împreună cu o placă Arduino Uno sau Arduino Mega:

12

https://www.robofun.ro/shields/usb_host_shield

A se vedea și:

Arduino ADK – Running Examples in Accessory Mode

http://labs.arduino.cc/ADK/AccessoryMode

Pentru implementare este necesară dezvoltarea aplicației Arduino dar și realizarea unei aplicații Android care să definească interfața utilizator. Există mai multe proiecte ce pot fi utilizate ca punct de plecare în implementarea acestei variante:

Arduino ADK LED Lighting

http://www.instructables.com/id/Arduino-ADK-LED-Lighting/

mover-bot – Android-based Mobile Robotics Platform

https://code.google.com/archive/p/mover-bot/

AndroidADKLED

https://sites.google.com/site/arduinosite/exercise/androidadkled/

Handbag™ for Android

http://handbagdevices.com/

Din păcate această variantă necesită un telefon mobil Android ce include în distribuția sistemului de operare extensia ADK, a se vedea și:

Android ADK supported devices

http://stackoverflow.com/questions/10186760/android-adk-supported-devices

Utilizând modul bridge (ADB: Android Development Bridge Mode) ce permite conectarea directă între telefonul mobil și o placă de dezvoltare prin intermediul unei conexiuni USB (utilizând un USB Host shield sau nu). A se vedea și:

Mega ADK – Running Examples over the ADB

http://labs.arduino.cc/ADK/ADB

Această variantă necesită ca telefonul mobil să suporte o conexiune USB OTG de tip Host și este nevoie de un adaptor de conectare USB OTG între telefonul mobil și cablul USB clasic al plăcii de dezvoltare. Dificultatea acestei variante vine din implementarea programului Android și din necesitatea ca dispozitivul Android să suporte USB OTG Host. Câteva exemple de proiecte bazate pe modul bridge:

USB_BRIDGE_ANDROID_OTG App Inventor 2

https://github.com/S2I71/usb_otg_bridge_app_inventor/

ProcessingAdb

https://github.com/agoransson/processingadb

Control an Arduino from Android device

http://solderer.tv/control-an-arduino-from-your-android-device/

Android + Arduino + USB Host + Simple Digital Output

http://mitchtech.net/android-arduino-usb-host-simple-digital-output/

În cazul în care cele două variante de implementare prezentate mai sus vi se par prea complicate există și posibilitatea de conectare a plăcii Arduino la telefonul Android prin intermediul unei conexiuni Bluetooth. Câteva exemple:

How to control arduino board using an android phone and a bluetooth module

http://www.instructables.com/id/How-control-arduino-board-using-an-android-phone-a/

Connect Arduino Uno to Android via Bluetooth

http://www.instructables.com/id/Connect-Arduino-Uno-to-Android-via-Bluetooth/

Control an Arduino with Bluetooth

http://www.allaboutcircuits.com/projects/control-an-arduino-using-your-phone/

Arduino Bluetooth Interfacing – Simplest tutorial on Bluetooth Basics

https://diyhacking.com/arduino-bluetooth-basics/

Ce putem face cu o cameră web veche?

În ultimul timp majoritatea dispozitivelor inteligente (telefon mobil, tabletă, laptop, televizor) vin echipate cu camere video performante ce permit realizarea de fotografii, înregistrări video sau video-comunicații. Utilizăm din ce în ce mai rar stațiile de lucru pentru astfel de activități și din acest motiv vechile camere video USB devin niște echipamente inutile tocmai bune de disponibilizat. Fiindcă nu au performanțe deosebite și nu sunt capabile de rezoluții foarte mari, camerele video usb (sau webcam-urile) au ajuns la prima vedere inutile în momentul de față dar… aceste echipamente pot fi reutilizate foarte ușor (și profitabil) în cadrul propriilor sisteme electronice dezvoltând astfel, cu costuri modice, diverse sisteme de achiziție, transmisie și supraveghere video. O cameră video USB poate fi conectată la orice placă de dezvoltare ce rulează Linux și dispune de o mufă USB host – în cadrul proiectului de față vom exemplifica acest lucru utilizând două dintre cele mai utilizate plăci de dezvoltare: Raspberry Pi și Arduino Yun. Ca și cameră video vom utiliza o cameră ultra-low-cost (în jur de 2$ pe ebay) dar se poate utiliza cam orice cameră web USB 1.1 sau 2.0:2

Lista oficială de camere video USB suportate de placa Raspberry Pi se poate consulta la adresa:

RPi USB Webcams

http://elinux.org/RPi_USB_Webcams

Configurarea camerei web pe o placă Raspberry Pi

După conectarea fizică a camerei la placa Raspberry Pi putem să verificăm mesajele date de nucleul sistemului de operare în urma evenimentului de conectare prin intermediul comenzii:

dmesg | tail -n11

3

Putem verifica identificarea ca dispozitiv USB prin intermediul comenzii:

lsusb

4

Sau putem verifica modurile video (rezoluțiile) suportate:

sudo lsusb -s 001:005 -v | egrep “Width|Height”

5

Verificarea mapării camerei ca dispozitiv specific se face cu ajutorul comenzii:

ls /dev/video*

6

Pentru a utiliza camera avem la dispoziție mai multe produse software pe care le putem instala și utiliza:

fswebcam – utilitar ce ne permite să preluăm un cadru video (o fotografie) și să-l salvăm într-un format ales. Instalarea acestui utilitar se face cu ajutorul comenzii:

sudo apt-get install fswebcam

Pentru a prelua o fotografie și a o salva într-un fișier denumit image.jpg executăm:

fswebcam image.jpg

Pentru mai multe detalii legate de utilizarea programului fswebcam puteți vedea și:

Using a standard USB webcam

https://www.raspberrypi.org/documentation/usage/webcams/

motion – utilitar capabil să transmită prin rețea imaginile captate de la camera video transformând astfel sistemul într-o cameră IP (WiFi sau Ethernet în funcție de capabilitățile plăcii Raspberry Pi). Instalarea se face cu ajutorul comenzii:

sudo apt-get install motion

Înainte de a porni aplicația trebuie trebuie să modificăm în fișierul de configurare (/etc/motion/motion.conf), cel puțin, următoarele directive:

# Start in daemon (background) mode and release terminal (default: off)

daemon on

# Restrict stream connections to localhost only (default: on)

stream_localhost off

Și în fișierul /etc/default/motion trebuie să modificăm:

start_motion_daemon=yes

Pornirea serviciului motion se face cu următoarea comandă:

sudo motion

După pornirea aplicației se pot urmării imaginile furnizate de camera video accesând adresa web:

http://adresa_ip_raspberrypi:8081

Facilitățile oferite de aplicația motion sunt foarte variate: înregistrare de imagini sau video, detecția mișcării, declanșarea de acțiuni în urma detecției de mișcare, transmiterea prin rețea de imagini sau flux de imagini și nu numai. Pentru o înțelegere mai bună a funcționării acestei aplicații se pot parcurge și următoarele proiecte:

Raspberry Pi remote webcam

http://www.instructables.com/id/Raspberry-Pi-remote-webcam

Build a Raspberry Pi Webcam Server in Minutes

https://pimylifeup.com/raspberry-pi-webcam-server/

Beginners Guide How To Setup a USB Webcam to your Raspberry Pi 2 in Minutes

http://www.awesomeprojects.xyz/2015/09/beginners-guide-how-to-setup-usb-webcam.html

Motion detection using the Raspberry Pi + USB Webcam

http://sjj.azurewebsites.net/?p=701

Raspberry Pi as low-cost HD surveillance camera

http://www.instructables.com/id/Raspberry-Pi-as-low-cost-HD-surveillance-camera

How to turn an USB camera with Raspberry Pi into an Onvif IP Camera?

http://www.instructables.com/id/How-to-turn-an-USB-camera-with-Raspberry-Pi-into-a

Configurațiile anterioare au fost testate pe un sistem rulând Raspbian GNU/Linux 8 (jessie), kernel 4.4.43-v7+, fswebcam 20140113-1 și motion 3.2.12+git20140228-4+b2.

Configurarea camerei web pe o placă Arduino Yun

Utilizarea unei camere web USB împreună cu o placă Arduino Yun este aproape la fel ca și în cazul plăcii Raspberry Pi dar există și câteva deosebiri. În primul rând curentul furnizat pe mufa USB a plăcii este mai mic decât în cazul plăcii Raspberry Pi și din acest motiv este posibil ca să fie nevoie să se utilizeze un hub USB cu alimentare (dacă placa Arduino Yun se resetează fără motiv după conectarea camerei video înseamnă că sigur aveți nevoie de mai mult curent, acest lucru poate fi valabil și în cazul plăcii Raspberry Pi):

7

https://www.robofun.ro/raspberry-pi-si-componente/powered-usb-hub-raspberry-pi

Un alt aspect important este faptul că placa Arduino Yun nu vine configurată implicit să ruleze sistemul de operare de pe un card ci din memoria internă. Pentru a nu uza memoria internă și pentru a face rost de mai mult spațiu pentru instalarea de programe este recomandată configurarea încărcării sistemului de operare de pe card:

How to expand the Yún disk space

https://www.arduino.cc/en/Tutorial/ExpandingYunDiskSpace

După conectarea fizică a camerei web la placa Arduino Yun se pot efectua aceleași verificări ca și în cazul precedent:

dmesg | tail -n7

8

lsusb

9

ls /dev/video*

10

Pentru utilizarea utilitarului fswebcam vom instala următoarele pachete software:

opkg update 

opkg install kmod-video-uvc 

opkg install fswebcam

iar comanda de execuție este identică cu cazul precedent:

fswebcam image.jpg

Pentru instalarea programului motion vom utiliza comanda:

opkg install motion

și pentru pornirea acestuia (după efectuarea modificărilor necesare în fișierul /etc/motion/motion.conf) comanda:

motion

Urmărirea imaginilor transmise prin rețea (WiFi sau Ethernet în funcție de configurația plăcii Arduino Yun) se poate face la aceiași adresă:

http://adresa_IP_arduinoyun:8081

Atenție!!! Procesorul plăcii Arduino Yun (Atheros AR9331 – 400MHz) nu este la fel de puternic ca procesorul plăcii Raspberry Pi (Broadcom BCM2836 – 900 MHz), din acest motiv nu putem avea pretenția la un număr mare de cadre per secundă la transmisia în rețea.

Pe lângă cele două utilitare prezentate și pentru placa Raspberry Pi, distribuția de Linux OpenWRT ce rulează pe placa Arduino Yun mai include și programul mjpg-streamer ce permite de asemenea transmisia în rețea de imagini preluate de la camera web dar nu și detecția de mișcare. Pentru instalarea acestuia vom utiliza comanda:

opkg install kmod-video-core kmod-video-uvc mjpg-streamer

iar pentru utilizare comanda:

mjpg_streamer -i “input_uvc.so -d /dev/video0 -y” -o “output_http.so”

Accesarea imaginilor transmise se poate face la adresele:

Flux video:

http:// adresa_IP_arduinoyun:8080/?action=stream

Imagini:

http:// adresa_IP_arduinoyun:8080/?action=snapshot

Pentru mai multe informații legate de utilizarea unei plăci Arduino Yun împreună cu o cameră web se pot consulta și următoarele proiecte:

WebCam in OpenWrt

http://h-wrt.com/en/doc/webcam

Wireless Security Camera with the Arduino Yun

https://learn.adafruit.com/wireless-security-camera-arduino-yun

DIY Security Camera

http://www.instructables.com/id/DIY-Security-Camera/

Build a Photobooth with an Arduino Yun, a Webcam and Dropbox

https://www.twilio.com/blog/2015/02/arduino-powered-photobooth-arduino-yun-a-webcam-and-dropbox.html