V první části, Jak nastavit Linux chroot jails, jsem se zabýval chroot
a naučili jste se používat chroot wrapper v sshd
izolovat sftpusers
skupina. Když upravíte sshd_config
chcete-li vyvolat chroot wrapper a dát mu odpovídající vlastnosti, sshd
provádí určité příkazy v rámci chroot jail nebo wrapperu. Viděli jste, jak by tato technika mohla být potenciálně užitečná pro implementaci uzavřeného, nikoli zabezpečeného přístupu pro vzdálené uživatele.
Rozšířený příklad
Začnu tím, že rozšířím to, co jsem dělal předtím, částečně jako recenzi. Začněte nastavením vlastního adresáře pro vzdálené uživatele. Budu používat sftpusers
znovu seskupit.
Začněte vytvořením vlastního adresáře, který chcete použít, a nastavením vlastnictví:
# mkdir -p /sftpusers/chroot
# chown root:root /sftpusers/chroot
Tentokrát udělejte vlastníka root, nikoli sftpusers
skupina. Tímto způsobem, když přidáte uživatele, nezačínají s oprávněním vidět celý adresář.
Dále vytvořte uživatele, kterého chcete omezit (v tomto případě to musíte udělat pro každého uživatele), přidejte nového uživatele do sftpusers
group a odepřít přihlašovací shell, protože se jedná o sftp
uživatelé:
# useradd sanjay -g sftpusers -s /sbin/nologin
# passwd sanjay
Poté vytvořte adresář pro sanjay
a nastavte vlastnictví a oprávnění:
# mkdir /sftpusers/chroot/sanjay
# chown sanjay:sftpusers /sftpusers/chroot/sanjay
# chmod 700 /sftpusers/chroot/sanjay
Dále upravte sshd_config
soubor. Nejprve zakomentujte existující vyvolání subsystému a přidejte interní:
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Poté přidejte náš záznam o případu shody:
Match Group sftpusers
ChrootDirectory /sftpusers/chroot/
ForceCommand internal-sftp
X11Forwarding no
AllowTCPForwarding no
Všimněte si, že jste zpět k určení adresáře, ale tentokrát jste již nastavili vlastnictví, abyste zabránili sanjay
od vidění věcí někoho jiného. To koncové /
je také důležité.
Poté restartujte sshd
a test:
[skipworthy@milo ~]$ sftp sanjay@showme
sanjay@showme's password:
Connected to sanjay@showme.
sftp> ls
sanjay
sftp> pwd
Remote working directory: /
sftp> cd ..
sftp> ls
sanjay
sftp> touch test
Invalid command.
Tak. Sanjay vidí pouze svou vlastní složku a potřebuje cd
dělat něco užitečného.
Izolace služby nebo konkrétního uživatele
Co když teď chcete poskytnout použitelné prostředí shellu pro vzdáleného uživatele nebo vytvořit prostředí chroot jail pro konkrétní službu? Chcete-li to provést, vytvořte uvězněný adresář a kořenový souborový systém a poté vytvořte odkazy na nástroje a knihovny, které potřebujete. Dělat to všechno je trochu komplikované, ale Red Hat poskytuje skript a základní pokyny, které celý proces usnadňují.
Poznámka: Testoval jsem následující v Red Hat Enterprise Linux 7 a 8, i když rozumím tomu, že tato schopnost byla dostupná v Red Hat Enterprise Linux 6. Nemám důvod si myslet, že by tento skript nefungoval ve Fedoře, CentOS nebo jiném Distro Red Hat, ale váš počet najetých kilometrů (jako vždy) se může lišit.
Nejprve vytvořte svůj chroot adresář:
# mkdir /chroot
Poté spusťte skript z yum
který nainstaluje potřebné bity:
# yum --releasever=/ --installroot=/chroot install iputils vim python
--releasever=/
flag předá aktuální informace o lokálním vydání k inicializaci úložiště v novém --installroot
, definuje, kde je nové umístění instalace. Teoreticky byste mohli vytvořit chroot jail, který byl založen na jakékoli verzi repozitáře yum nebo dnf (skript však bude stále začínat aktuálním repozitářem systému).
Pomocí tohoto nástroje nainstalujete základní síťové nástroje, jako je editor VIM a Python. Pokud chcete, můžete zpočátku přidat další věci, včetně jakékoli služby, kterou chcete provozovat v tomto vězení. To je také jedna ze skvělých věcí na yum
a závislosti. V rámci řešení závislostí yum
provede nezbytné doplňky do stromu souborového systému spolu s knihovnami. Vynechává však několik věcí, které je třeba přidat jako další. K tomu se za chvíli dostanu.
Nyní jsou balíčky a závislosti nainstalovány a pro toto nové úložiště byl vytvořen nový klíč GPG ve vztahu k tomuto novému kořenovému systému souborů. Dále připojte své pomíjivé souborové systémy:
# mount -t proc proc /chroot/proc/
# mount -t sysfs sys /chroot/sys/
A nastavte své vazby pro vývojáře:
# mount -o bind /dev/pts /chroot/dev/pts
# mount -o bind /dev/pts /chroot/dev/pts
Upozorňujeme, že tato připojení nebudou přežít restart tímto způsobem, ale toto nastavení vám umožní testovat a hrát si s prostředím chroot jail.
Nyní otestujte, zda vše funguje, jak očekáváte:
# chroot /chroot
bash-4.2# ls
bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
Můžete vidět, že souborový systém a knihovny byly úspěšně přidány:
bash-4.2# pwd
/
bash-4.2# cd ..
Odtud vidíte správný kořenový adresář a nelze přejít nahoru:
bash-4.2# exit
exit
#
Nyní jste opustili obálku chroot, což se očekává, protože jste do něj vstoupili z místního přihlašovacího prostředí jako root. Normálně by to vzdálený uživatel neměl být schopen udělat, jak jste viděli v sftp
příklad:
[skipworthy@milo ~]$ ssh root@showme
root@showme's password:
[root@showme1 ~]# chroot /chroot
bash-4.2#
Všimněte si, že všechny tyto adresáře vytvořil root, takže kdo je vlastní. Nyní přidejte tento chroot do sshd_config
, protože tentokrát budete odpovídat pouze tomuto uživateli:
Match User leo
ChrootDirectory /chroot
Poté restartujte sshd
.
Musíte také zkopírovat /etc/passwd
a /etc/group
soubory z hostitelského systému do /chroot
adresář:
[root@showme1 ~]# cp -vf /etc/{passwd,group} /chroot/etc/
Poznámka: Pokud výše uvedený krok přeskočíte, můžete se přihlásit, ale výsledek bude nespolehlivý a budete náchylní k chybám souvisejícím s konfliktními přihlášeními
Nyní k testu:
[skipworthy@milo ~]$ ssh leo@showme
leo@showme's password:
Last login: Thu Jan 30 19:35:36 2020 from 192.168.0.20
-bash-4.2$ ls
-bash-4.2$ pwd
/home/leo
Vypadá to dobře. Můžete teď najít něco užitečného? Pojďme se pobavit:
[root@showme1 ~]# yum --releasever=/ --installroot=/chroot install httpd
Mohli byste pusťte releasever=/
, ale rád to nechávám, protože to ponechává méně šancí na neočekávané výsledky.
[root@showme1 ~]# chroot /chroot
bash-4.2# ls /etc/httpd
conf conf.d conf.modules.d logs modules run
bash-4.2# python
Python 2.7.5 (default, Aug 7 2019, 00:51:29)
Takže httpd
je tam, pokud ho chcete, ale jen pro demonstraci můžete použít rychlý jednořádkový program z Pythonu, který jste si také nainstalovali:
bash-4.2# python -m SimpleHTTPServer 8000
Serving HTTP on 0.0.0.0 port 8000 ...
A nyní máte jednoduchý webový server běžící v chrootovém vězení. Teoreticky můžete spustit libovolný počet služeb z chroot jail a ponechat je „uzavřené“ a daleko od ostatních služeb, což vám umožní odhalit pouze část prostředí s většími zdroji, aniž byste ohrozili uživatelský dojem.
Nové kontejnery Linuxu? Stáhněte si Containers Primer a naučte se základy.