Dva recepty s minimálními právy slepené dohromady neprodukují přísnější nasazení. Jeden model nechá démona startovat s právy a po inicializaci přejít na neprivilegovaný účet; druhý nechá správce služeb spustit ho pod omezenou identitou už od první instrukce. Každý funguje sám a kombinace často vytvoří službu, která nedokáže čistě udělat ani jednu z těch dvou věcí. Zbytek textu prochází rozhodnutí popořadě.

Dva modely, jeden vlastník přepnutí

První model patří démonovi. Možnosti OpenVPN z komunitního balíčku user a group mění identitu poté, co jsou tunel a klíče nastaveny, a persist-key spolu s persist-tun udržují tyto prostředky nadále použitelné.

Druhý model patří správci služeb. Nastavení systemd User= nebo Group= určuje identitu, pod kterou proces startuje, a direktivy schopností určují, co smí držet. Volba mezi modely je otázka balíčkování dřív než otázka bezpečnosti a správce balíčku už na ni odpověděl. Vaším úkolem je tu odpověď najít, ne vymyslet třetí možnost.

Oba jsou legitimní. Chyba je brát je jako vrstvy jednoho návrhu, protože druhý model může ze změny identity prvního udělat operaci, kterou proces už nesmí provést.

Určete, kde se identita mění

Pokud jednotka už startuje jako vyhrazený účet, přidání démonovy instrukce přejít na jiný účet žádá přechod setuid, který zpevněná služba nikdy neměla dělat. Selhání se projeví jako chyba oprávnění při startu, ne jako jasná zpráva politiky. Čte se to jako chybějící schopnost, což lidi posílá k širší množině omezení místo k otázce identity.

Přečtěte si, co nainstalovaný balíček skutečně dodává, než cokoli upravíte, včetně jeho drop-in adresáře. Některé jednotky záměrně vynechávají vlastní pokles démona, protože správce to už řeší, a jiné spoléhají na tyto možnosti při přepnutí po inicializaci. Odebrání kteréhokoli z nich bez znalosti zděděného modelu je způsob, jak funkční služba přestane startovat.

Zapište zvolený model na jeden řádek: vlastněný správcem, nebo vlastněný démonem. Každá další direktiva musí být s tou větou v souladu a smíšená jednotka se má brát jako chyba, ne jako kompromis.

Schopnosti jsou limity, ne dary

Množina omezení schopností říká, co proces smí držet nejvýš. Je to strop a uvedení schopnosti tam samo o sobě nic nedává, proto jednotka se štědrou množinou omezení může i tak selhat při vytváření tunelu.

To, co skutečně umístí schopnost do ambientní množiny služby, je AmbientCapabilities=. Referenční příručka spouštění systemd dokumentuje obě direktivy odděleně a tento rozdíl vysvětluje většinu matoucích rad o schopnostech na internetu.

Přidejte schopnost až poté, co ji selhávající operace určí. Širší množina omezení skrývá skutečnou příčinu a nechává službu privilegovanější, než návrh zamýšlel. Také dělá jednotku hůř kontrolovatelnou, protože strop už nepopisuje práci. Až se skutečná závada opraví, přebytečnou schopnost odeberte.

Rozvrhněte oprávnění na celý životní cyklus

Vyjmenujte, co musí proces dělat v každé fázi: start, ustálený stav, opětovné ověření a ukončení. Vytvoření rozhraní, změny tras, čtení chráněného klíče a volání pomocníka se nedějí ve stejný okamžik ani za stejných požadavků. Seřaďte seznam podle fáze, než ho seřadíte podle schopnosti.

Možnosti trvalosti zachovávají prostředky napříč opětovným vyjednáváním a nedávají oprávnění, která nikdy nebyla držena. Klíč, který proces při startu nepřečte, zůstane nečitelný i později, ať příznaky trvalosti říkají cokoli. Příznaky zachovávají to, co už fungovalo.

Použijte vyhrazený účet, ne společný. Vývojáři OpenVPN varují před zvykem používat nobody jako obecný příklad, protože jiné služby na hostiteli už mohou pod tím účtem běžet a izolace, kterou si myslíte, že máte, tam není.

Funkce, které mění místní zátěž, jako odklon datového kanálu nebo sestavení s jiným linkováním, mohou posunout, které operace jsou potřeba. Mapu revidujte, když se změní balíček, ne jen když se něco rozbije.

Zapište plán a zachovejte přístup pro obnovu

Záznam o nasazení má pojmenovat správce, identitu při startu, zamýšlenou ustálenou identitu a každé oprávnění spolu s operací, která ho vyžaduje. Právě ten záznam dělá další změnu kontrolovatelnou místo experimentální.

Během úprav mějte dostupný přístup ke konzoli, protože jednotku, která selže při startu, je obtížné opravit na dálku. Otestujte restart a plné restartování, než změnu prohlásíte za hotovou. Jednotka, která přežije restart, může selhat ještě předtím, než je síť nahoru.

Úspěch je pochopený životní cyklus s minimálními oprávněními, ne proces, který náhodou běží pod jménem, jež není root.

Související články