GNU/Linux >> Znalost Linux >  >> Linux

Základní zabezpečení NFS – NFS, no_root_squash a SUID

Narazil jsem na mnoho široce otevřených serverů NFS, které by mohly být o něco bezpečnější a bezpečnější s několika rychlými změnami. Toto je rychlý průvodce, díky kterému jsou věci trochu bezpečnější. Toto v žádném případě není úplný průvodce zabezpečením NFS, ale může věci trochu zabezpečit bez velkého úsilí. Chcete-li přejít na jinou úroveň, musíte se podívat na implementaci NFSv4 a Kerberos.

Základní možnosti exportu mohou zahrnovat:

  • no_all_squash :Tato možnost zakáže veškeré zmáčknutí.
  • rw :Tato možnost umožňuje serveru NFS používat požadavky na čtení i zápis na svazek NFS.
  • ro :Tato možnost umožňuje serveru NFS používat na svazku NFS požadavky pouze pro čtení.
  • synchronizovat :Tato možnost umožňuje serveru NFS odpovídat na požadavky pouze poté, co byly změny potvrzeny do stabilního úložiště.
  • asynchronní :Tato možnost umožňuje serveru NFS porušovat protokol NFS a odpovídat na požadavky dříve, než budou jakékoli změny provedeny ve stabilním úložišti.
  • zabezpečené :Tato možnost vyžaduje, aby požadavky pocházely z internetového portu.
  • nejisté :Tato možnost přijímá všechny nebo všechny porty.
  • wdelay :Tato možnost umožňuje serveru NFS odložit potvrzení požadavku na zápis na disk, pokud má podezření, že probíhá další související požadavek na zápis nebo že může brzy dorazit.
  • no_wdelay :Tato možnost umožňuje serveru NFS povolit vícenásobné požadavky na zápis na disk v rámci jedné operace. Tato funkce může zlepšit výkon, ale pokud server NFS obdrží mnoho malých požadavků, může toto chování snížit výkon. Měli byste si být vědomi toho, že tato možnost nemá žádný účinek, pokud je také nastavena async.
  • subtree_check :Tato možnost umožňuje kontrolu podstromu.
  • no_subtree_check :Tato možnost zakáže kontrolu podstromu, která má určité problémy se zabezpečením, ale může zlepšit spolehlivost.
  • anonuid=UID :Tyto možnosti explicitně nastavují uid a gid anonymního účtu; to může být užitečné, když chcete, aby všechny požadavky vypadaly, jako by byly od jednoho uživatele.
  • anongid=GID :Tato možnost zakáže anonuid=UID.

Co je root_squash?

root_squash umožní uživateli root na klientovi přistupovat a vytvářet soubory na serveru NFS jako root. Technicky vzato, tato možnost donutí NFS změnit kořenový adresář klienta na anonymní ID a ve skutečnosti to zvýší bezpečnost tím, že zabrání vlastnictví účtu root na jednom systému migrovat na jiný systém. To je potřeba, pokud hostujete kořenové souborové systémy na serveru NFS (zejména pro bezdiskové klienty); s ohledem na to může být použit (střídmě) pro vybrané hostitele, ale neměli byste používat no_root_squash, pokud si nejste vědomi důsledků.

SUID a NFS

suid je metoda, kdy uživatel přebírá práva vlastníka souboru, když je spuštěn uživatelem. Proč mě to zajímá? Představte si, že by uživatel mohl zkopírovat soubor na svazek NFS, povolit suid bit na souboru a pak to spustit na serveru nebo klientovi NFS, čímž by se v procesu efektivně povýšil na root?

Zde je příklad demonstrující rizika.

Název hostitele serveru NFS je server, název hostitele klienta NFS je klient. Podsíť v ukázkové síti je 192.168.1.0/24. Tento příklad také předpokládá, že oba systémy používají stejné verze OS (tj. oba jsou RHEL 7 nebo oba SLES 12), pokud se hlavní verze OS shodují.

1. Na serveru NFS vytvořte dočasný adresář (/export/test) a exportujte s následujícími možnostmi (nahraďte 192.168.1.0/255.255.255.0 vlastní sítí/maskou sítě):

server# vi /etc/exports
/export/test  192.168.1.0/255.255.255.0(no_root_squash,insecure,rw)

2. Restartujte server nfs. To se liší v závislosti na chuti linuxu..

RHEL:

server# systemctl restart nfs

SUSE:

server# systemctl restart nfsserver

3. Na klientském počítači připojte export:

client# mkdir /mnt/nfstest
client# mount -t nfs server:/export/test /mnt/nfstest

4. Na klientovi jako uživatel root zkopírujte binární soubor vi do připojení NFS.

client# which vi
—— output ———
/usr/bin/vi
client# cp /usr/bin/vi /mnt/nfstest

5. Nastavte bit suid na zkopírovaný binární soubor.

client# chmod u+s /mnt/nfstest/vi

6. SSH na server nfs jako neprivilegovaný uživatel. Jako uživatel bez oprávnění spusťte vi umístěné v exportovaném připojení na serveru:

server$ /export/test/vi /etc/passwd

7. V souboru s hesly najděte účet bez privilegií a změňte UID na 0, uložte, odhlaste se a poté se znovu přihlaste jako neprivilegovaný uživatel. Uživatel je nyní root.

Totéž bude fungovat na klientovi, pokud spustíte vi z připojení NFS jako běžný uživatel, můžete jej nasměrovat na jakýkoli soubor na hostiteli a budete moci upravovat jako root. Bude fungovat s jakoukoli binárkou, na kterou si vzpomenete.

Jak se tomu vyhnout?

1. Nejprve smažte soubor vi z exportního adresáře :) a poté povolte root_squash na exportu nfs. Na serveru upravte /etc/exports znovu upravte no_root_squash na root_squash:

server# vi /etc/exports
/export/test  192.168.1.0/255.255.255.0(root_squash,insecure,rw)

2. Restartujte nfs server, znovu připojte souborový systém na klientovi:

server# systemctl restart nfs
client# umount /mnt/test
client# mount -t nfs server:/export/test /mnt/nfstest

3. Když uživatel root vytvoří nějaké soubory na připojení NFS, zkontrolujte oprávnění:

client# touch /mnt/nfstest/{test1,test2,test3}

V závislosti na oprávněních nastavených v /export/test vám bude oprávnění buď odepřeno, nebo pokud je adresář celosvětově zapisovatelný, budou oprávnění k souborům vypadat podobně jako:

-rw-r--r--  1 65534  65534     0 Nov  6  2015 test1
-rw-r--r--  1 65534  65534     0 Nov  6  2015 test2
-rw-r--r--  1 65534  65534     0 Nov  6  2015 test3

Root_squash přemapuje kořenové UID na uid anonymního uživatele. Toto uid je konfigurovatelné v souboru exports, man /etc/exports pro více informací. Znovu zkopírujte příkaz vi (pokud je to povoleno) jako root na klientovi na svazek nfs a opakujte výše uvedené kroky (ssh na server spusťte vi v /etc/passwd). Tentokrát nebudete mít oprávnění k uložení souboru, oprávnění jsou zvýšena na neprivilegovaný účet.

To je o něco bezpečnější, ale ještě jsme neskončili. Dalším krokem, který můžete udělat, je připojit exportovaný souborový systém na server NFS s volbou nosuid.

server# vi /etc/fstab

4. Najděte bod připojení pro /export/, změňte výchozí hodnoty sloupce voleb na.

/dev/mapper/sys_vg-export_lv     /export    ext3    defaults      0       0
/dev/mapper/sys_vg-export_lv     /export    ext3    nosuid        0       0

5. Znovu namontujte držák:

server# mount -o remount /export

6. Uložte soubor vi na připojení, nastavte bit suid, přepněte na neprivilegovaný účet a zkuste to znovu:

server# cp /usr/bin/vi /export/test; chmod u+s /export/test/vi
server# su - someuser
server$ /export/test/vi /etc/passwd

Po provedení změny v předaném souboru vám nebude povoleno změnu uložit.

7. Skočte na klienta jako neprivilegovaný uživatel a zkuste totéž:

client$ /export/test/vi /etc/passwd

Stále to funguje, klient musí být také znovu připojen pomocí možnosti nosuid:

client# mount -t nfs -o nosuid server:/export/test /mnt/nfstest

Otestujte to znovu s neprivilegovaným účtem, mělo by to selhat.

Existuje několik dalších možností, které lze zadat v bodě připojení, aby se dále omezilo, co z nich lze spouštět, podívejte se na noexec (žádné spustitelné soubory), nodev (žádné soubory zařízení). Pokud je vyžadováno další zabezpečení, podívejte se na Kerberos a NFSv4.


Linux
  1. Nastavení serveru a klienta NFS na Debian 9 (Stretch)

  2. Nastavení serveru a klienta NFS na CentOS 6.3

  3. Nastavení serveru a klienta NFS na OpenSUSE 12.2

  1. Nastavení serveru a klienta NFS v systému Scientific Linux 6.3

  2. Nastavení serveru a klienta NFS na CentOS 7.2

  3. Nakonfigurujte základní zabezpečení

  1. Instalace serveru a klienta NFS na CentOS 7

  2. Naučte se NFS prostřednictvím konfigurace serveru a klienta

  3. Jak nastavit NFS server a klienta na Rocky/Alma Linux 8