Jít na obsah Jít na navigaci Jít na vyhledávání

Polyinstancování adresáře /tmp

Trocha teorie

Dlouholetým problémem UNIXově založených operačních systémů je adresář /tmp sloužící jako dočasné úložiště pro všechny. Tento adresář má práva nastavená na rwxrwxrwx, tedy zápis pro kohokoli. Nevýhodou však byl i absolutní přístup k datům jiných uživatelů, a proto byl zaveden tzv. sticky bit, který omezuje zápis pouze na soubory a adresáře vlastněné patřičným uživatelem. Každý tedy může zapisovat nové soubory, ale jen do těch existujících, které vlastní.

Novou možnost fyzické separace pak nabízí tzv. polyinstantia­tion. Každému uživateli namapuje daný adresář na jiný, pro něj v původní cestě nepřístupný. V případě adresáře /tmp by se např. jednalo o mapu z /tmp-inst nebo klidně i /tmp/users. Mechanismus, který polyinstancování zajišťuje, automaticky vytvoří adresář dle uživatelského jména a jím nahradí cílový adresář dle mapy.

Ukázka z praxe

Nastavení se provádí v konfiguračním souboru /etc/security/namespace.conf prostřednictvím PAM modulu pam_namespace.so:

# /etc/security/namespace.conf
#
# See /usr/share/doc/pam-*/txts/README.pam_namespace for more information.
#
#/tmp     /tmp-inst/            both      root,adm
#/var/tmp /var/tmp/tmp-inst/    both      root,adm
#$HOME    $HOME/$USER.inst/inst- context
/tmp      /tmp/users/           user      root

Zakomentované příklady zahrnují polyinstancing /tmp, /var/tmp (který osobně doporučuji nastavit jako symbolický odkaz do /tmp) a domovského adresáře uživatele. Důležitý parametr je typ, který zpravidla může být:

  • user (na základě uživatelského jména)
  • context (na základě bezpečnostního kontextu, pouze SElinux)
  • both (obojí)

Poslední čtvrtý parametr udává výjimky. V mém případě bude na základě uživatelského jména namapován adresář /tmp z /tmp/users s výjimkou uživatele root.

Jak na to

Nejprve vytvoříme adresář, ze kterého budeme mapovat, v mém případě /tmp/users. Tomuto adresáři nastavíme z bezpečnostních důvodů nulová práva a zadáme mapu v konfiguračním souboru /etc/security/namespace.conf.

Nyní je třeba pečlivě zvážit nastavení modulů PAM. Po zkušenostech z praxe nedoporučuji spouštět PAM modul ve všech případech autentizace (soubor /etc/pam.d/common-session, způsobí to více problémů než užitku. Polyinstancování jsem proto zúžil na dva jediné typy autentizace – login a sshd.

Ukázka začlenění PAM modulu do souboru s autentizací:

# Enable polyinstantiation
session    required   pam_namespace.so

Je třeba dát si pozor na to, kam modul umístíme. Existují místa, kdy je moc brzy a kdy zase moc pozdě – lepší je si to párkrát zkusit a pozorně sledovat logy (např. auth.log). Pokud se mechanismus aplikuje, měli bychom po novém přihlášení mít adresář /tmp v ideálním případě prázdný. Přihlásíme-li se na roota, měli bychom vidět /tmp/users a v něm adresář s naším a případně dalšími uživatelskými jmény. Máme hotovo.

Osobně mám přímé přihlášení na root uživatele zakázané a přistupuji přes sudo. Bohužel v tomto případě se mi nepodařilo sudo nijak donutit vyvolat čistý login (nejspíše proto, že sudo je spouštěno z shellu, na který již bylo polyinstacování aplikované), takže ani po přihlášení na roota mi /tmp neodhalil žádná svá tajemství. Pokud nedejbože nutně potřebuji vidět obsah neořezaného /tmp, obejdu bezpečnostní mechanismus mountnutím root partition např. do /mnt a podívám se tam :)

Štítky:

Komentáře

Komentáře jsou uzavřeny