Chtěl bych vytvořit nového uživatele a dát mu sudo přístup. Abych byl konkrétní, chci, aby používal sudo vim
a upravit httpd.conf. Napsal jsem to v sudoers:
user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
Slyšel jsem však, že to může být riskantní. Proč je to problematické? Jak vážný je problém?
Přijatá odpověď:
I když omezíte argumenty příkazového řádku, nic nebrání uživateli používat vim k otevření, úpravě a přepsání libovolného náhodného souboru jakmile běží jako root.
Uživatel může spustit sudo vim /etc/httpd/conf/httpd.conf
a poté
- vymažte veškerý text z vyrovnávací paměti pro úpravy
- poté pro usnadnění vytvořte zdroj existujícího souboru (ačkoli to ani není vyžadováno):například konfigurace sudo
:r /etc/sudoers
POZNÁMKA:Pokud to není omezeno SELinux, může uživatel číst jakékoli soubor tímto způsobem! - udělit si více práv sudo
user ALL=(ALL) NOPASSWD: ALL
- přepište starou konfiguraci
:w /etc/sudoers
Umím si představit desítky podobných způsobů, jak může váš uživatel nyní přistupovat k vašemu systému, upravovat jej nebo jej zničit.
Nebudete mít ani auditní stopu, které soubory byly tímto způsobem změněny, protože jej uvidíte pouze upravovat vaši konfiguraci Apache ve zprávách sudo log. Toto je bezpečnostní riziko při udělování sudo
oprávnění libovolného editora.
To je víceméně stejný důvod, proč udělování práv na kořenové úrovni sudo příkazům, jako je tar
a unzip
je často nejistý, nic vám nebrání zahrnout do archivu náhrady za systémové binární soubory nebo konfigurační soubory systému.
Druhým rizikem, jak poukázalo mnoho dalších komentátorů, je vim
umožňuje úniky z shellu , kde můžete spustit sub-shell z vim, který vám umožní spustit libovolný libovolný příkaz . Z vaší relace sudo vim budou tyto spuštěny jako root, například shell escape:
:!/bin/bash
vám poskytne interaktivní root shell:!/bin/rm -rf /
budou dobré příběhy v hospodě.
Co dělat místo toho?
Stále můžete používat sudo
aby uživatelé mohli bezpečným způsobem upravovat soubory, které nevlastní.
V konfiguraci sudoers si můžete nastavit speciální vyhrazený příkaz sudoedit
následovaný úplným (zástupným) názvem cesty k souborům, které může uživatel upravovat:
user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Uživatel pak může použít -e
přepněte v jejich příkazovém řádku sudo nebo použijte sudoedit
příkaz:
sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf
Jak je vysvětleno v manuálové stránce:
-e (edit)
volba označuje, že místo spuštění příkazu si uživatel přeje upravit jeden nebo více souborů. Namísto příkazu se při procházení zásad zabezpečení použije řetězec „sudoedit“.
Pokud je uživatel touto zásadou autorizován, jsou provedeny následující kroky:
- Vytvoří se dočasné kopie souborů, které mají být upravovány, přičemž vlastník je nastaven na vyvolávajícího uživatele.
- Za účelem úpravy dočasných souborů se spustí editor určený zásadou. Zásada sudoers používá proměnné prostředí SUDO_EDITOR, VISUAL a EDITOR (v tomto pořadí). Pokud není nastaveno žádné z SUDO_EDITOR, VISUAL nebo EDITOR, první program uvedený v editoru
sudoers
(5) je použita.- Pokud byly změněny, dočasné soubory se zkopírují zpět do jejich původního umístění a dočasné verze se odstraní.
Pokud zadaný soubor neexistuje, bude vytvořen.
Všimněte si, že na rozdíl od většinu příkazů spouští sudo, editor se spouští s prostředím vyvolávajícího uživatele beze změn. Pokud z nějakého důvodu sudo nedokáže aktualizovat soubor jeho upravenou verzí, uživatel obdrží varování a upravená kopie zůstane v dočasném souboru.
sudoers
manuál také obsahuje celou sekci, jak může nabídnout omezenou ochranu proti únikům shellu s RESRICT
a NOEXEC
možnosti.
restrict
Neposkytujte uživatelům přístup k příkazům, které uživateli umožňují spouštět libovolné příkazy. Mnoho editorů má omezený režim, kde jsou únikové cesty shellu zakázány, ačkoli sudoedit je lepší řešení pro spouštění editorů pomocí sudo. Kvůli velkému počtu programů, které nabízejí únikové cesty shellu, je často nefunkční omezení uživatelů na sadu programů, které je nemají.
a
noexec
Mnoho systémů, které podporují sdílené knihovny, má schopnost přepsat funkce výchozí knihovny nasměrováním proměnné prostředí (obvykle LD_PRELOAD) na alternativní sdílenou knihovnu. V takových systémech lze funkci noexec sudo použít k zabránění programu spuštěnému sudo ve spouštění jiných programů. Poznámka:... ...
Chcete-li pro příkaz povolit noexec, použijteNOEXEC
tag, jak je zdokumentováno v části Specifikace uživatele výše. Zde je opět ten příklad:aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
To umožňuje uživateli aaron spouštět/usr/bin/more
a/usr/bin/vi
s povoleným noexec. To zabrání těmto dvěma příkazům ve spouštění jiných příkazů (jako je shell).