Objavljeno:

RaspberryPi kot varen NAS

Da je varnostno arhiviranje nujnost običajnim uporabnikom postaja jasno vsaj od pojava kriptovirusov dalje. Dejstvo je, da so zunanji diski resnično poceni, zato je res smiselno, da poskrbimo za redne varnostne kopije pomembnih podatkov.

Vendar pa uporaba zunanjih (USB) diskov zahteva nekaj discipline – diske je treba priključiti na računalnik in sprožiti varnostno arhiviranje – poleg tega je včasih smiselno, da arhivsko kopijo podatkov hranimo na oddaljeni lokaciji. Če namreč v stanovanju pride do požara ali poplave, obstaja precejšnja verjetnost, da bo skupaj z računalnikom uničen tudi zunanji disk. Podobno velja tudi v primeru kraje ali druge odtujitve računalniške opreme. Zato je včasih smiselno, da varnostno kopijo hranimo nekje v oblaku (v tem primeru naj bo obvezno šifrirana!) ali na neki zunanji lokaciji. V tokratnem prispevku si bomo ogledali, kako za oddaljeni podatkovni strežnik (NAS) uporabimo kar poceni RaspberryPi z zunanjim diskom.

Seveda pa to ne bo običajen NAS, pač pa bo hramba varnostnih kopij nekoliko bolj zahtevna. Zahteve, ki jih bomo postavili so:

  1. Varnostno arhiviranje poteka popolnoma samodejno in za uporabnika neopazno.
  2. Varnostna kopija se dela na oddaljeno lokacijo.
  3. Iz računalnika, ki se varnostno arhivira ni razvidno kje fizično se nahaja arhivski strežnik, prav tako nekdo, ki prisluškuje internetni povezavi ne more ugotoviti kje se fizično nahaja arhivski strežnik. To je pomembno v primeru, da želimo arhivirati pomembne podatke, za katere ne želimo, da nam jih napadalec zaseže oz. odtuji (npr. zaupne dokumente, ki dokazujejo korupcijo v vrhovih družbe, Wikileaks dokumente, itd. – napadalec nam lahko zaseže računalnike, arhiv s podatki pa bo ostal skrit nekje na internetu).
  4. Če napadalec dobi fizični dostop do arhivskega strežnika, ne more do podatkov iz arhiva.
  5. Administrator arhivskega strežnika ali drugi legitimni uporabniki arhivskega strežnika ne morejo do podatkov iz arhivov drugih uporabnikov.

Zapleteno? Niti ne, z Linuxom je stvar precej enostavno rešljiva.

Priprava RaspberryPi

Najprej pripravimo RaspberryPi (npr. različico 3), na katerega namestimo Raspbian in ga ustrezno posodobimo ter varnostno ojačamo. RaspberryPi vključimo v OpenVPN omrežje. Mimogrede, v primeru, da se RaspberryPi noče sinhronizirati z NTP strežniki, to storimo ročno:

sudo service ntp restart
ntpq -p | egrep "^\*|jitter"

POMEMBNO:Nato onemogočimo samodejno prijavo uporabnika v sistem. To storimo z ukazom:

sudo raspi-config

Izberemo Boot OptionsB1 Desktop / CLI in izberemo B1 Console (Text console, required user to login).

Nato na sistem namestimo programski paket cryptsetup, ki privzeto ni nameščen:

sudo apt-get install cryptsetup

Nato na prosta USB vrata priključimo LUKS šifriran disk. USB disk sicer lahko šifriramo tudi iz ukazne vrstice, vendar bo za večino uporabnikov najenostavneje, da ga šifriramo (formatiramo s šifriranjem) kar preko orodja Diski v Ubuntu sistemu.

Ko disk priključimo na RaspberryPi, bi ga sistem moral zaznati kot napravo /dev/sda1, kar sicer lahko preverimo z ukazom:

sudo sfdisk -l

Dobili bomo približno takle izpis:

...Device Boot Start End #cyls #blocks Id System
/dev/mmcblk0p1 128 2143 2016 64512 c W95 FAT32 (LBA)
 start: (c,h,s) expected (128,0,1) found (0,130,3)
 end: (c,h,s) expected (1023,3,16) found (8,138,2)
/dev/mmcblk0p2 2144 479727 477584 15282688 83 Linux
 start: (c,h,s) expected (1023,3,16) found (96,0,1)
 end: (c,h,s) expected (1023,3,16) found (495,3,16)
/dev/mmcblk0p3 0 - 0 0 0 Empty
/dev/mmcblk0p4 0 - 0 0 0 Empty

Disk /dev/sda: 364801 cylinders, 255 heads, 63 sectors/track
Units: cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

Device Boot Start End #cyls #blocks Id System
/dev/sda1 0+ 45600- 45601- 366283322+ ee GPT
 start: (c,h,s) expected (0,0,2) found (0,0,1)
/dev/sda2 0 - 0 0 0 Empty
/dev/sda3 0 - 0 0 0 Empty
/dev/sda4 0 - 0 0 0 Empty

Naprava mmcblk je SD kartica na kateri je nameščen Raspbian, /dev/sda pa je (prvi) zunanji USB disk.

Sedaj priklopimo šifrirani razdelek tega diska:

sudo cryptsetup luksOpen /dev/sda1 secure_backup

Vnesemo geslo, in šifrirani disk je priključen v sistem.

Nato naredimo ustrezno mapo na /media:

sudo mkdir /media/secure_backup

…in nanjo priklopimo šifriran disk:

sudo mount /dev/mapper/secure_backup /media/secure_backup/

Podatki iz zunanjega šifriranega diska so sedaj vidni na mapi /media/secure_backup. Na tej mapi naredimo podmapo npr. Duplicity, kamor bomo shranjevali arhive uporabnikov:

sudo mkdir /media/secure_backup/Duplicity

V tej mapi nato ustvarimo ustrezne podmape za vsakega uporabnika (npr. Doma_Janez, Doma_Metka,…).

Nato nastavimo pravice na disku in na tej mapi, in sicer tako, da preprečimo pregledovanje (“listanje”) vsebine mape, disk pa zaklenemo tako, da je dostopen samo uporabniku pi (to je privzeti uporabnik na Raspbian sistemu):

sudo chmod 701 /media/secure_backup/Duplicity
sudo chown pi.pi /media/secure_backup

Zdaj dodamo prvega uporabnika in njegovo mapo za arhiviranje povežemo na /media:

sudo adduser doma_janez

(vnesemo podatke uporabnika in njegovo geslo)

sudo mkdir /media/Doma_Janez
sudo mount --bind /media/secure_backup/Duplicity/Doma_Janez/ /media/Doma_Janez
sudo chmod 700 /media/secure_backup/Duplicity/Doma_Janez/
sudo chown -R doma_janez.doma_janez /media/secure_backup/Duplicity/Doma_Janez/

S tem smo na RaspberryPi sistemu ustvarili uporabnika doma_janez, ki ima na sistemu preko mape /media/Doma_Janez dostopen svoj arhiv na šifriranem disku.

Na podoben način dodamo še ostale uporabnike (npr. doma_metka, itd.).

Uporabnik, ki bi skušal dostopati do arhivskih diskov drugih uporabnikov, bi tako dobil zavrnitev dostopa:

ls -lha /media/Doma_Metka/
ls: cannot open directory /media/Doma_Metka/: Permission denied
ls -lha /media/secure_backup/
ls: cannot open directory /media/secure_backup/: Permission denied

S tem smo dosegli, da vsak od uporabnikov vidi zgolj svojo arhivsko mapo. Izjema je uporabnik pi (s skrbniškim dostopom), ki vidi vse mape in s tem vse arhive, a ta problem bomo elegantno rešili kasneje.

Bistveno je, da je zunanji USB disk v sistem povezan ročno, torej se ob ponovnem zagonu sistema ne priklopi samodejno. V primeru, da RaspberryPi napravi  zmanjka elektrike, moramo seveda disk (preko ssh povezave) ponovno ročno priklopiti. Če pa bo do naprave dostopil napadalec in jo fizično odnesel, pa bo ob izpadu elektrike disk odklopljen in napadalec brez gesla ne bo imel dostopa do njegove vsebine.

Na tem mestu velja opozoriti na to, da bi napadalec lahko iz RaspberryPi računalnika odstranil SD kartico in v cmdline.txt dodal ‘init=/bin/sh‘, s čimer bi zaobšel geslo za dostop do RaspberryPi sistema. Sicer bi se celoten OS Raspbian dalo namestiti na način, da bi bilo že za zagon Raspberrya potrebno vpisati geslo, vendar bi to zahtevalo, da ima administrator sistema ob vsakem izpadu elektrike ali ponovnem zagonu sistema fizični dostop. Kar pa je nekoliko neudobno, zato te rešitve ne bomo uporabili.

Mimogrede, če bodo NAS sistem uporabljali Windows računalniki, se seveda splača namestiti tudi Samba podporo.

Priprava arhiviranja pri uporabniku

Na računalniku uporabnika (v našem primeru gre za domači računalnik uporabnika Janez), najprej nastavimo OpenVPN povezavo (predpostavljamo, da ustrezno infrastrukturo že imamo), in sicer na način, da OpenVPN strežnik ne služi kot prehod uporabnika v internet. To pomeni, da uporabnikov promet v internet ne bo posredovan preko OpenVPN strežnika, pač pa bo računalnik zgolj vključen v VPN omrežje in bo videl ostale računalnike v VPN omrežju.

Nato v datoteko /etc/hosts dodamo (ob predpostavki, da v VPN omrežju uporabljamo IP naslovni prostor 10.10.5.0/24 in da ima naš arhivski strežnik VPN IP 10.10.5.200):

10.10.5.200 backup.vpn

Uporabnik sedaj lahko dostopa do svoje mape preko SSH oz. SFTP povezave:

sftp://doma_janez@backup.si:22/media/Doma_Janez/

Uporabniku sedaj nastavimo arhiviranje z aplikacijo DejaDup. Aplikacija omogoča inkrementalno arhiviranje, uporabnik pa si lahko nastavi geslo, tako da so njegovi arhivi šifrirani. S tem uporabnik elegantno onemogoči, da bi oddaljeni administrator lahko dostopal do vsebine njegovih arhivov.

Lokacija arhiva.

Lokacija arhiva.

S tem smo na strani uporabnika dosegli naslednje:

  • arhiviranje poteka samodejno in za uporabnika neopazno;
  • uporabnik ne ve kje se fizično nahaja arhivski strežnik;
  • njegov arhiv je šifriran z njegovim geslom in torej do njegove vsebine ne more dostopati niti administrator arhivskega strežnika.
Nastaviteve samodejnega tedenskega arhiviranja.

Nastavitev samodejnega tedenskega arhiviranja.

Zaključek

S tem smo na hitro in z relativno nizkimi stroški vzpostavili sistem varnostnega arhiviranja podatkov. Seveda tak sistem ni tako zmogljiv in zanesljiv kot so to profesionalni NAS sistemi, je pa izjemno poceni in varen, z nekaj triki pa ga lahko še precej izboljšamo.

Monitoring sistema

Za začetek na njem postavimo sistem monitoringa oziroma nadzora njegovega delovanja. Uporabimo lahko aplikacijo Netmonitor., ki je procesorsko zelo nezahtevna, a zelo zmogljiva in uporabna.

Namestitev je enostavna. Če želimo izvajati nadzor samo osnovnih funkcij sistema v ukazno vrstico na RaspberryPi vpišemo:

curl -Ss 'https://raw.githubusercontent.com/firehol/netdata-demo-site/master/install-required-packages.sh' >/tmp/kickstart.sh && bash /tmp/kickstart.sh netdata

Če pa želimo nadzor vseh funkcij sistema, pa vpišemo:

curl -Ss 'https://raw.githubusercontent.com/firehol/netdata-demo-site/master/install-required-packages.sh' >/tmp/kickstart.sh && bash /tmp/kickstart.sh netdata-all

Zgornja ukaza na ciljnem sistemu pripravita vse potrebno za namestitev Netmonitorja. Sledi namestitev:

git clone https://github.com/firehol/netdata.git --depth=1
cd netdata
sudo ./netdata-installer.sh

Netmonitor je s tem nameščen. Odpremo samo še požarni zid, da do podatkov lahko dostopamo iz VPN omrežja:

sudo ufw allow from 10.10.5.0/24 to any port 19999 proto tcp

Do podatkov o obremenitvi sistema lahko sedaj dostopamo kar preko spletnega brskalnika preko URL naslova http://10.10.5.200:19999 (IP naslov RaspberryPi računalnika in vrat 19999):

Monitoring porabe pasovne širine pri arhiviranju.

Monitoring porabe pasovne širine pri arhiviranju.

Arhiviranje arhiva

Zaradi večje varnosti lahko namesto na en disk, podatke arhiviramo na dva diska. Najenostavneje to rešimo z nakupom dveh diskov, ki jih postavimo v RAID polje. Obstajajo tudi zunanji USB diski, ki vsebujejo dva diska, ki sta že v RAID polju. Možnost je tudi periodično sinhroniziranje z Rsync (namig: rsync -av –delete /media/USBHDD1/Duplicity /media/USBHDD2/Duplicity/).

Vendar pa posebno nevarnost predstavljajo kripto virusi ali pa neumnost uporabnikov, ki bi morda skušali pobrisati ali okvariti arhiv. V tem primeru lahko podatke iz vseh arhivov z uporabo aplikacije Duplicity inkrementalno arhiviramo na drugo lokacijo (lahko na istem ali na drugem disku).

V primeru, da bo kripto virus ali uporabnik sam pomotoma izbrisal svoj arhiv, bomo njegov arhiv iz inkrementalne kopije lahko obnovili na stanje pred neljubim dogodkom – in to ne glede na to, ali je arhiv šifriran ali ne!

Dodatno skrivanje lokacije arhivskega strežnika

Vsekakor je smiselno, da imamo pomembne podatke arhivirane na več oddaljenih lokacijah, po možnosti na različnih potresnih območjih. Uporabimo lahko več RaspberryPi naprav, ki si podatke sinhronizirajo med seboj (namig: rsync -avHe ssh user@server:/path/to/file /home/user/path/to/file oziroma: rsync -avH /home/user/path/to/file -e ssh user@server:/path/to/file).

Te naprave so lahko povezane v več med seboj povezanih OpenVPN omrežij, katerih centralni strežniki se po možnosti nahajajo v različnih državah. Če je uporabnik lociran v OpenVPN omrežju z IP naslovom 10.10.10.2, arhivski strežnik pa se nahaja v omrežju 10.10.5.200, bo zgolj s preprosto korelacijsko analizo prometa v VPN omrežju težko ugotoviti kje točno se arhivski strežnik nahaja. In če se VPN omrežji (ali celo več njih) raztezata čez več držav, bo zaradi “težav” z jurisdikcijo še težje ugotoviti pravo lokacijo arhiva.

Seveda je RaspberryPi napravo potrebno povsem zakleniti v VPN omrežje, na način, da nobenega njenega prometa ne spustimo neposredno na internet, pač pa vsa komunikacija arhivskega strežnika poteka preko VPN omrežja (npr. s požarnim zidom iz zunanjim usmerjevalnikom). S tem onemogočimo, da bi uporabnik kakorkoli lahko ugotovil pravi IP naslov arhivskega strežnika.

Fizična varnost

Za dodatno varnost si lahko poleg zaščite pred strelo kupimo še brezprekinitveni napajalnik (UPS), na katerega povežemo RaspberryPi, zunanji disk ter omrežno opremo na katero je arhivski strežnik povezan. Ker je poraba teh naprav razmeroma majhna, nam UPS zagotavlja razmeroma dolgo delovanje. Bistveno pa je, da v tem primeru lahko zaznamo izpad električne energije in o tem obvestimo administratorja sistema. Pri tem si pomagamo s programskim paketom apcupsd. O njem, in konfiguraciji alarmov pa v kakšnem drugem prispevku.

Ena izmed možnosti je tudi, da na RaspberryPi priključimo kamero in s pomočjo ustrezne programske opreme izvajamo videonadzor z zaznavanjem gibanja. Ali pa s pomočjo magnetnega stikala zaznamo kdaj je nekdo odprl omaro v kateri se nahaja arhivski strežnik… Poceni možnosti varovanja infrastrukture je kar nekaj.

Integriteto sistema lahko preverjamo tudi programsko. Orodja, ki jih lahko uporabimo na Raspbianu so AIDE (Advanced Intrusion Detection Environment) ali Tripwire (oziroma Sxid, Integrit ali Samhain).

Nastavljanje alarmov

Za dodatno varnost je smiselno nastaviti tudi samodejne e-poštne ali SMS alarme v primeru, da zaznamo kakšne težave. Poleg poročanja o izpadih elektrike se splača poročati o vsakem ponovnem zagonu sistema (namig: v Crontab uporabimo ukaz @reboot). Preverjamo lahko dosegljivost sistema v VPN omrežju (iz poljubnega v VPN vključenega računalnika ali iz VPN strežnika, pomagamo si z ukazom ping).

Smiselno je tudi spremljati SMART stanje diska (uporabimo orodje smartmontools) in njegovo zasedenost (namig: df -h). Oziroma, ali je disk sploh priključen (namigi: mount, ls /dev/mapper, ls /dev/disk/by-uuid/). Skratka, z nekaj malega programiranja v bashu, si lahko sestavimo precej učinkovit in zmogljiv sistem zaznavanja morebitnih težav.

* * *

Tak sistem bo morda nekoliko bolj zapleten za postavitev in upravljanje kot sodobni NAS sistemi, je pa odlično igrišče za učenje in razumevanje tehnologije, poleg tega nam omogoča uporabo nekaterih dodatnih varnostnih tehnologij, ki jih komercialni NAS sistemi nudijo zgolj ob doplačilu oziroma jih sploh ne nudijo. Poleg tega je tak sistem izjemno poceni, porabi malo energije in deluje zelo tiho.

In ja, če želimo kaj “močnejšega”, lahko uporabimo OpenMediaVault. Gre za zmogljiv NAS sistem, ki je glede funkcij in upravljanja precej primerljiv s komercialnimi rešitvami (podpira tudi različne RAID konfiguracije!). Strojno je precej nezahteven in deluje tudi na RaspberryPi napravah. Naj omenimo le, da zaradi omejitev strojne opreme (RAM) na Raspberyu ne deluje ZFS sistem. No, v bistvu deluje, ampak bolj eksperimentalno…

Kategorije: Informacijska varnost, Odprta koda
Ključne besede: Raspberry Pi