I když je většina shellů postavena co nejpohodlněji, bezpečnost nechávají raději na operačním systému, což je sice správné, ale ne vždy výhodou. Samozřejmě ve chvíli, kdy konfigurujete jednu službu za druhou a nevíte kam skočit dřív, by nějaký restriktivní shell způsobil maximálně vyhození monitoru z okna, ale na druhou stranu se může takový shell hodit čistě pro jednodušší práci se soubory uživatele v jeho adresáři a tady to je přesně to místo, kdy bychom mu měli umožnit spouštět jenom některé programy a příkazy, které uznáme za vhodné a ne všechny, co jsou v systému dostupné.
Restriktivních shellů moc není a abych řekl pravdu, tak znám dostatečně vybavený jenom jeden, a to lshell. Objevil ho jeden z našich čtenářů a upozornil na něj v diskusi pod článkem Jak nahradit FTP pomocí SFTP a zamknout uživatele. Článek rozebíral podobný problém, kdy cílem bylo přes openssh zpřístupnit SFTP, ale ne shell a navíc ještě v chrootu, aby uživatel necestoval mimo svůj domácí adresář.
Zpřístupnit uživatelům shell je trochu komplexnější problém, protože zde dochází ke spouštění programů a je potřeba nastavit limity tak, aby uživatel měl přístup jen k tomu, co potřebuje a nenarušoval klid ostatních. Přesně tohle lshell zvládá, a navíc nedovolí uživatelům spustit jejich vlastní skripty a programy, které neodsouhlasíte.
Lshell je napsaný v Pythonu a o bezpečnost se stará vlastními mechanismy. To mimo jiné znamená, že pokud v něm někdo najde chybu, dostane přístup k celému disku, i když samozřejmě s omezenými právy daného uživatele. Proto se určitě nespoléhejte na jednu ochranu a stejně jako v jiných případech, i zde počítejte s neočekávanými událostmi.
Instalace
Strašení bylo dost, pojďme si lshell nainstalovat a nakonfigurovat. Instalace není nějak složitá, v repositářích Debianu i v Ubuntu se lshell nachází, takže stačí spustit
# apt-get install lshell
Na jiných systémech bude instalace obdobná nebo se dá použít přímá instalace skriptem setup.py. Shell je napsaný v Pythonu, takže pokud ho v systému nemáte (například nějaký malý router s OpenWRT), počítejte s touto závislostí.
Uživatelé, kteří budou mít lshell nastavený jako výchozí shell, by měli být ve skupině lshell, jinak nebude fungovat logování.
Konfigurace
Když je lshell na svém místě, přípraven stát se strážcem u brány k vašemu serveru, je čas podívat se na konfiguraci v souboru /etc/lshell.conf, kde se dá nastavit všechno, co souvisí s tím, co bude uživatel spouštět. Nejlepší bude rozebrat si konfigurační soubor pěkně po kouskách.
[global]
logpath : /var/log/lshell/
loglevel : 2
logfilename : %y%m%d-%u
V globální sekci konfiguračního souboru se nastavuje to nejdůležitější, logy. Do nich lshell zapisuje všechno dění, které se vymyká tomu, co jste uživatelům dovolili. Takže když se někdo snaží dostat, kam nemá, nebo spustit, co nemá, bude to zapsáno v logu a budete mít přehled o uživatelích, kteří nerespektují nastavená pravidla.
Výchozí nastavení by mohlo zbytečně zanášet adresář s logy, takže ho doporučuji trochu upravit a počeštit:
logfilename : %m%y-%u
Adresář s logy můžeme nechat jak je. Loglevel s hodnotou dvě nás bude informovat o přihlášení uživatele a o jeho prohřešcích. Při nastavení na hodnotu 1 najdeme v logu pouze prohřešky, 0 neloguje nic a 3 se chová shodně s 2.
[default]
allowed : ['ls','echo','cd','ll','pwd','grep','|','vim']
V sekci default najdeme vše, co se týká výchozích pravidel lshellu. Pokud chceme nastavit pravidla pro konkrétní uživatele, uděláme to v sekci s jejich názvem, jako třeba
[root]
allowed : ['all']
kde uživateli root povolíme spouštět všechno, ale na ostatní se bude aplikovat výchozí politika.
Přejdeme k jednotlivým omezením. Parametrem allowed nastavujeme seznam povolených příkazů a programů (all povoluje vše). S tím také souvisí další parametry, které tento ještě upravují.
forbidden : [';', '&','`','>','<', '$(', '${','|']
sudo_commands : ['']
Na prvním řádku jsou vypsané všechny znaky, které nejsou při zadávání povoleny. V tomto případě třeba nejde použít přesměrování standardního vstupu a výstupu nebo roura. Na dalším řádku se nachází seznam programů, které lze spustit jako root pomocí sudo.
Když uživatel udělá něco špatně, lshell ho o tom informuje a když překročí určitý počet prohřešků, tak ho to odpojí. Zde se nastavuje, kolik takových prohřešků bude.
warning_counter : 2
Aliasy lshell také umí a uživatel je nemůže nějak ovlivnit.
aliases : {'ll':'ls -l', 'vi':'vim'}
Při přihlášení by mohli být někteří uživatelé lshellem zmateni, takže pomůže je o tom informovat.
intro : "== Omezený shell. Zadej '?' nebo 'help' pro nápovědu. =="
Uživatel je držen v jeho domovském adresáři, ale můžete nastavit i další adresáře, do kterých bude mít přístup, aniž by to vyvolalo varování.
path : ['/home/bla/','/etc']
Když nechceme, aby měl uživatel přístup do celého svého adresáře, ale jen třeba do jeho podadresáře, uděláme to pomocí tohoto parametru. Pokud chceme nastavit toto pravidlo ve výchozím chování, můžeme k tomu použít klíčové slovo %u, které bude ve výsledku nahrazeno uživatelským jménem.
home_path : '/home/%u/'
Tímto nastavíme systémovou proměnnou $PATH.
env_path : ':/usr/local/bin:/usr/sbin'
Když chce uživatel přenášet soubory přes SFTP/SCP, lshell ho umí omezit i v tomhle. Hodnota 1 podporu pro scp zapne a 0 vypne.
scp : 1
Je možné zakázat také pouze upload
scp_upload : 0
Nebo download.
scp_download : 0
SFTP je komplexnější než SCP a pokud se jím cítíte ohroženi, můžete ho uživatelům zakázat a nechat jim třeba jen SCP.
sftp : 1
Také spouštění programů přímo přes SSH (ssh uzivatel@server program) lze omezit třeba jen na výpis adresáře nebo zálohování přes rsync.
overssh : ['ls', 'rsync']
Když uživatel spustí program nebo přístup, ke kterému nemá právo, se striktním nastavením bude zapsán v logu, dostane varování a samozřejmě se sníží počet varování do automatického odpojení.
strict : 1
Uživatele také můžeme donutit, aby soubory odeslané přes scp hrnul pouze do daného adresáře.
scpforce : '/home/bla/uploads/'
A nakonec nám zbývá nastavení historie, kde můžeme ovlivnit soubor, kam se má uložit, a její délku.
history_size : 100
history_file : "/home/%u/.lshell_history"
Závěr
Lshell dává správcům serverů do ruky nástroj, který uživatelům umožní přístup přes SSH k jejich datům a zároveň je udrží od sebe dostatečně oddělené. Samozřejmě se na lshell musí pohlížet pouze jako na jednu vrstvu zabezpečení, protože když se v něm najde chyba, může se pak uživatel dostat i k něčemu, k čemu nemá. V takovém případě by ovšem měly zafungovat další ochrany, kterými by měl každý server disponovat.