Pokud nginx běží jako www-data, tak i privátní klíče HTTPS certifikátů musí být čitelné tímto uživatelem. To znamená, že například děravá PHP aplikace se může k těmto souborům dostat. To nevypadá jako moc velké zlepšení v bezpečnosti.
Pokud nginx startuje jako root, ale zahodí oprávnění před obsluhou příchozích požadavků, tak může načíst vše předem a pak už se bez oprávnění obejde, takže privátní klíče mohou být čitelné jen rootovi a děravá aplikace má smůlu. Navíc takový proces běžící jako root nepředstavuje riziko, neboť nepřijde do styku s nedůvěryhodnými daty.
Navíc naslouchání na privilegovaných poretech by bylo lepší řešit přes socket activation nebo podobný mechanismus, který službě předá otevřený socket, aby neprivilegovaný nginx neměl možnost otvírat jiné porty.
17. 6. 2020, 01:03 editováno autorem komentáře
Počkejte, nespletl jste si to s indiánem s mod_php? nginx jsem pár let nedělal takže možná teď kážu bludy, ale co si pamatuju tak tam se php pouštělo přes php-fpm, který úplně v klidu pustíte pod jiným uživatelem, a s trochou hraní s permissions je to řešitelné.
(jasně, tohle článek neřeší, to by bylo téma na seriál)
U druhého odstavce máte s rootem plnou pravdu do chvíle, než potřebujete, aby si mohl konfigurák editovat i neprivilegovaný uživatel, Což uznávám že není typický use case, ale občas se to hodí.
Jinak téhož cíle jde dosáhnout i druhou cestou kterou používám drahně let pomocí setcap CAP_NET_BIND_SERVICE=eip $JAIL_ROOT/usr/sbin/httpd
což může pomoci i pokud si někdo chce pouštět apache z neprivilegovaného účtu ručně i bez hraní s su/sudo
To preci neni pravda... proces PHP (v nginx php-fpm) bezi typicky pod svym vlastnim uzivatelem.
Uz leta provozuji NGINX bez roota podobnym zpusobem (jen delam preklad portu v iptables). A php-fpm bezi pod vlastnim uzivatelem. Navic kazdy projekt/web ma vlastniho php-fpm demona, ktery bezi kazdy pod jinym uzivatelem - takze si ani nemohou vzajemne na data (v pripade dobre nastavenych pristupovych prav).
Ano, to je pravda. Asi by bylo vhodnější v článku použít jako příklad jiného uživatele než www-data.
Default (bezpečné): nginx(root)=>nginx_worker(www-data)=>php-fpm(www-data)
Článek (nebezpečné): nginx(www-data)=>nginx_worker(www-data)=>php-fpm www-data)
Možnost (bezpečné): nginx(jinyuzivatel_nez_ostatni)=>nginx_worker(www-data)=>php-fpm(www-data)
Možnost (bezpečné):
nginx(jinyuzivatel_nez_ostatni)=>nginx_worker(druhy_jinyuzivatel_nez_ostatni)=>php-fpm(treti_jinyuzivatel_nez_ostatni)
Jste si jistý tím, že nginx načte privátní klíče při startu a pak zahodí oprávnění roota? Když nginxu řeknete, že má přenačíst konfiguraci, přenačte i klíče. Takže buď celou dobu běží alespoň jeden proces pořád s právy roota, a nebo to nefunguje tak, jak píšete, a nginx potřebuje přístup ke klíčům celou dobu běhu.
Neustále běží jeden proces jako root. Debian 10:
root 1092 0.0 0.0 10596 1020 ? Ss Jun13 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 1093 0.0 0.0 12056 5064 ? S Jun13 1:22 nginx: worker process
www-data 1094 0.0 0.0 11260 4560 ? S Jun13 0:01 nginx: worker process
www-data 1095 0.0 0.0 11392 4548 ? S Jun13 0:12 nginx: worker process
www-data 1096 0.0 0.0 11260 4556 ? S Jun13 0:05 nginx: worker process
www-data 1097 0.0 0.0 11260 4568 ? S Jun13 0:00 nginx: worker process
www-data 1098 0.0 0.0 11260 3648 ? S Jun13 0:00 nginx: worker process
www-data 1099 0.0 0.0 11260 3648 ? S Jun13 0:00 nginx: worker process
www-data 1100 0.0 0.0 11260 4548 ? S Jun13 0:00 nginx: worker process
Pokud nginx běží jako www-data, tak i privátní klíče HTTPS certifikátů musí být čitelné tímto uživatelem. To znamená, že například děravá PHP aplikace se může k těmto souborům dostat. To nevypadá jako moc velké zlepšení v bezpečnosti.
To už je na Vás, jak si nastavíte uživatele pro nginx a jak pro PHP.
Opravdu není dobrý nápad mít hlavní proces NGINX pod stejným uživatelem jako PHP-FPM. To už je lepší ho spouštět pod rootem.