Pravice nad mapami na oddaljenem računalniku

Na oddaljenem računalniku (ki je v bistvu RaspberryPi) imam priključen šifriran zunanji disk. Na ta disk bi želel delati backupe iz svojega računalnika z Duplicity.

Najprej torej zunanji disk, ki je šifriran priklopim:
sudo cryptsetup luksOpen /dev/sda1 secure_backup

Nato naredim mapo na /media:
sudo mkdir /media/secure_backup

In nanjo priklopim šifriran disk:
sudo mount /dev/mapper/secure_backup /media/secure_backup/

No, sedaj lahko brskam po zunanjem disku. Gor imam več map:
- user1
- user2
- ...

Zdaj pa problem. Na drugi strani je ta disk dosegljiv preko URL-ja:
sftp://pi@backup.si:22/media/secure_backup/

Ko poženem Duplicity, pa mi samodejno priklopi oddaljeno mapo (sftp://pi@backup.si:22/home/pi) in sicer tako, da jo uporabnik vidi v Nautilusu.

Se pravi moj uporabnik, ki se mu podatki backupirajo, lahko brska po home imeniku oddaljenega uporabnika in kar je še huje, po ostalih mapah na /media/secure_backup/.

Zdaj, ena rešitev je, da priklopim vsako mapo posebej:
sudo mount --bind /media/secure_backup/user1/ /media/user1
...

Ampak potem bi verjetno moral narediti več oddaljenih uporabnikov in vsakemu dodeliti pravice samo na njegovi mapi?

Torej:
- remoteuser1: /media/user1
- remoteuser2: /media/user2

Vprašanje je, kako to najbolj elegantno naredim, glede na to, da imam večje število uporabnikov?

sudo adduser user1
sudo chown user1.user1 /media/user1

Stvar je namreč v tem, da ko priklopim disk na /media/secure_backup so pravice nastavljene takole:
ls -lha /media/
total 16K
drwxr-xr-x  4 root root 4.0K Oct 10 06:30 .
drwxr-xr-x 22 root root 4.0K Jun 29 10:35 ..
drwxrwxr-x  2 pi   pi   4.0K Oct 10 06:49 user1
drwx------ 18 pi   pi   4.0K Aug 22 10:46 secure_backup

Jaz bi seveda rad, da ima user1 pravice samo na svoji mapi in ne tudi na secure_backup mapi. Hkrati pa se vsi podatki shranjujejo na zunanji disk na isti podimenik in z enakimi pravicami. Če se mi namreč kaj sesuje grem na zunanjo lokacijo, odklopim disk in ga prinesem domov kjer ročno obnovim podatke.


Komentarji

  • [20:51:05] <CrazyLemon>: Matthai verjetno je rešitev chrootu :)
    [20:51:27] <Matthai>: a me hočeš fentat?? :-)
    [20:51:51] <CrazyLemon>: Matthai jah na kak drug način pa boš omejil uporabnika? :)
    [20:52:05] <CrazyLemon>: uporabnike*
    [20:52:32] <CrazyLemon>: https://debian-administration.org/article/590/OpenSSH_SFTP_chroot_with_ChrootDirectory
    [20:52:52] <CrazyLemon>: chrootdirectory daš da je /media/secure_backup/%u
    [20:53:15] <CrazyLemon>: pol pa mountaš user1 v /media/secure_backup/user1 pa bo omejen samo na tisto
  • Matthai Član
    uredil/-a 10. October, 2016
    Torej, ena izmed idej iz IRC-a:
    sudo adduser user1
    sudo chmod 701 /media/secure_backup
    sudo chmod 700 /media/secure_backup/user1
    sudo chown user1.user1 /media/secure_backup/user1
    sudo chown pi.pi /media/secure_backup

    To pomen da user1 ne vidi nicesar razen /media/secure_backup, pri čemer ne ve, kaj je v tej mapi.

    Ima pa vse pravice v /media/secure_backup/user1 in tja lahko dela backup. Te mape pa ne vidi noben od ostalih userjev, razen user pi, ki ima admin privilegije.

    Če nekdo resetira geslo od uporabnika pi, mora Raspberrya ugasniti, s tem pa se odklopi tudi USB disk, ki je šifriran. Če potem Raspberrya prižge nazaj, se jaz skušam povezati nanj, da bi vtipkal LUKS geslo, vendar ker je geslo od userja pi spremenjeno, ne morem gor. In torej vem, da je nekaj narobe.


  • Matthai Član
    uredil/-a 11. October, 2016
    Mislim, da sem rešil večino težav, tako da bo tole mini vodič, če bo še kdo drug kaj podobnega potreboval.

    Imam naslednji setup.

    Na oddaljeni lokaciji je RaspberryPi (z uprabnikom pi), ki je vključen v VPN omrežje. Nanj je priključen šifriran disk. Najprej je treba namestiti cryptsetup, ki privzeto ni nameščen:
    sudo apt-get install cryptsetup
    Disk nato priključim takole (če je samo eden, na /dev/sda1):
    sudo cryptsetup luksOpen /dev/sda1 secure_backup
    Nato naredim mapo na /media:
    sudo mkdir /media/secure_backup
    In nanjo priklopim šifriran disk:
    sudo mount /dev/mapper/secure_backup /media/secure_backup/
    OK... na tej mapi imam mapo Duplicity, ki vsebuje podmape uporabnikov.

    Najprej nastavim pravice na disku in tej mapi:
    sudo chmod 701 /media/secure_backup/Duplicity
    sudo chown pi.pi /media/secure_backup

    Zdaj dodam prvega uporabnika in polinkam njegovo mapo:
    sudo adduser doma_janez
    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/
    Na podoben način dodajam še druge uporabnike (npr. doma_micka,...).

    Na računalniku od Janeza dodam v datoteko /etc/hosts:
    10.10.10.100     backup.vpn
    Uporabnik sedaj lahko dostopa do svoje mape takole:
    sftp://doma_janez@backup.si:22/media/Doma_Janez/

    Če se uporabnik poveže na backup "strežnik" preko ssh, v mapi /media vidi tole:
    ls /media/ -lha
    total 48K
    drwxr-xr-x  6 root        root        4.0K Oct 10 19:03 .
    drwxr-xr-x 22 root        root        4.0K Jun 29 10:35 ..
    drwx------  2 doma_janez doma_janez  20K Oct 10 14:59 Doma_Janez
    drwx------  2 doma_micka  doma_micka  4.0K Oct 10 09:07 Doma_Micka
    drwx------ 18 pi          pi          4.0K Aug 22 10:46 secure_backup
    Uporabnik ne more brskati po šifriranem disku:
    ls -lha /media/Doma_Micka/
    ls: cannot open directory /media/Doma_Micka/: Permission denied
    ls -lha /media/secure_backup/
    ls: cannot open directory /media/secure_backup/: Permission denied
    ...razen seveda po svoji mapi:
    ls /media/Doma_Janez

    OK, imam še manjši problem, in sicer, da uporabnik doma_janez lahko brska po drugih delih sistema, npr:
    ls /boot
    cat /boot/issue.txt
    cat /home/pi/topsecret.txt

    Na srečo pa vsaj ne more pisati po drugih delih sistema:
    touch /boot/krneki.txt
    touch: cannot touch ‘/boot/krneki.txt’: Permission denied

    S tem rešujem naslednja dva problema:
    1. Backup se dela na oddaljeno lokacijo, ki je dostopna preko VPN. Uporabnik tako ne ve kje se fizično nahaja backup, prav tako nekdo, ki prisluškuje internetni povezavi ne ve kje se fizično nahaja backup, razen, če bi prestrezal promet na VPN serverju in s pomočjo korelacije ugotovil kam se pretakajo podatki.
    To težavo sicer lahko rešujemo z dvema VPN serverjema v različnih državah... poleg tega RaspberryPi lahko v internet povežemo tudi preko wi-fi povezave, kar malenkost oteži njegovo izsleditev...

    2. Če napadalec dobi fizični dostop do RaspberryPija, ga lahko samo odklopi. V tem primeru se odklopi tudi šifriran disk. Le-ta se pa ne priklopi samodejno, pač pa moram to preko ssh povezave narediti jaz.

    OK, odprta vprašanja:


    1. Kako bi najelegantneje rešil še to, da bi uporabnik doma_janez lahko brskal samo po svojem home imeniku in backup imeniku na disku, pa nikjer drugje?

    2. A obstaja varianta, da bi sistem omogočal samo dodajanje datotek, ne pa tudi njihovo brisanje? Se pravi nek napreden ACL. S tem bi rešil problem, ko uporabnik po nesreči izbriše svoj backup, ali pa to naredi kakšen kripto virus...

    3. A Duplicity bi potem hotel (inkrementalno) dodajati datoteke (seveda bi nastavil tako, da se zgodovina backupov hrani v neskončnost, se pravi jih ne skuša brisati), ali bi skušal kaj od obstoječih datotek spreminjati/brisati in bi se vse sesulo?

    4. Kako sistem zaščititi, da mi nekdo na oddaljeni lokaciji ne bi mogel "pohekati" uporabnika pi in ostalih uporabnikov? Verjetno se ne da... Namreč, če napadalec odstrani SD kartico in v cmdline.txt doda 'init=/bin/sh', ob ponovnem zagonu vpis gesla ne bo potreben (oz. napadalec lahko kar direktno vpiše su in se prijavi kot administrator)...
    Torej, zadevo bi sicer lahko rešil z v celoti šifriranim sistemom, ampak v tem primeru ob izpadu elektrike potrebujem fizični dostop do Raspberrya, sicer se ne zažene. A slučajno obstaja še kakšna druga rešitev?

    A je kakšna varianta, da bi delal integrity check sistema in zaznal če je prišlo do sprememb? Kako zanesljivo je to, koliko računsko potratno in kako to implementirati?

    Problema 2. in 3. bi verjetno lahko rešil tako, da bi imel še nek tretji backup strežnik, ki bi se povezoval na prvi backup strežnik in iz njega inkrementalno backupiral (vlekel podatke) nase. To pomeni, da do tretjega strežnika ne uporabnik, ne drugi strežnik ne bi imel neposrednega dostopa in torej backupa na njem ne bi mogel uničiti (kar se mi zdi dobra rešitev za kripto viruse).
  • Aja, pa še tole... v crontab lahko dodam @reboot ukaz in ob vsakem rebootu (npr. izpad) elektrike pošljem mail. Če je RaspberryPi za routerjem, bo uporabnik z ifconfig ukazom videl samo lokalni in VPN IP, ki mu nič ne povesta. Če pa ves promet speljem preko VPN gatewaya, pa tudi s kakšnimi ping/wget in podobnimi fintami ne bo mogel ugotoviti fizične lokacije naprave...

    Naslednji korak bi bil, da RPi zaprem v neko omaro in gor dam magnetno stikalo s čimer zaznam, da so se vrata odprla, in takrat pošljem mail. Potem gremo pa lahko še malo komplicirat pa zaznavamo ali internet dela, in če ne, pošljemo SMS preko GSM modula... :)

    Pa jasno spremljamo SMART stanje diska in aktivnosti uporabnikov (zasedenost njihovih map) in pošiljamo redne mail alerte/reporte.
Za komentiranje se prijavite ali pa se vpišite.