Apache + suexec

 ( wyx | 2018. szeptember 17., hétfő - 13:07 )

Ujabb problemam, hogy bizonyos perl scripteket root-kent szeretnek futtani CentOS 7 alatt.
A webszerver persze "apache" usernev alatt fut.

A suexec installalva van:

[root@05_app1_site1 conf.d]# suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_SYSLOG
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"

Hiaba rakom be amegfelelo Virtualhostba a cuccot, nem mukodik:

[root@05_app1_site1 conf.d]# cat testpage2.conf
#
# Definitions for Test webpage
#

Listen 10002

DocumentRoot /var/www/html/testpage2

# Logging options
ErrorLog logs/error_test_cgi.logs
TransferLog logs/access_test_cgi.logs
LogLevel trace8

Options ExecCGI SymLinksifOwnerMatch
SetHandler cgi-script
AddHandler cgi-script .cgi .pl .py
Require all granted
AllowOverride All

Azonban futatva a scriptet sajna "apache" userkent fut.

Mi hianyzik?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

https://httpd.apache.org/docs/2.4/suexec.html#usage

Ha jól értem a leírtak alapján, akkor vagy a suexecusergroup által határozod meg, hogy milyen user/group párossal fusson, vagy a mappa jogosultságot veszi figyelembe, ha a mod_userdir modulon keresztül lett hívva.

Igen, ezt az oldalt en is ismerem. A gond az, hogy a root user az elore beallitott UID alatt van, amit a suexec alapbol engedelyez, de meg ha ezt at is allitanam, egy testuser felhasznaloval sem megy a cucc.
Sajna hibat dob, ha a a testuser-t (amely mar engedelyezett uid felett van) allitom be a suexecusergroup valtozoba.
Nekem kellene egy usecase valakitol (aki hasznalja), hogy milyen permission-okkal, (dir es cgi script) es milyen apache beallitasokkal mukodik.

Évekkel ezelőtt használtam, ha jól emlékszem akkor a következő felállásban:

* A weboldal külön felhasználó alatt lakott a /var/www/user/public_html alatt.
* A /var/www/user és alatta minden az user:user tulajdonában volt.
* VirtualHost configban: SuexecUserGroup user user

Értelemszerűen az "user"-nek hozzá is kell férnie a fájlhoz, hogy futtatni tudja az Apache a nevében, ezt gondolom nem kell mondanom.

Továbbá:

AP_DOC_ROOT="/var/www"
AP_UID_MIN=500
AP_GID_MIN=100

Ez alapján a scriptednek a /var/www alatt kell lennie (ez alatt engedélyezett a suexec használata) és az user/group id-nek 500/100 felett lennie. Ha ez nem felel meg, akkor vagy sajátot kell forgatnod vagy ha van rá lehetőség, akkor át kell konfigurálni a megfelelő helyen (Debian alatt erre külön van egy apache2-suexec-custom csomag, CentOS alatt nem tudom van-e ilyen).

AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"

Ez pedig a $PATH lesz a script futtatásakor, ha erre érzékeny a scripted, akkor jó tudni.

Egyébként nem akarlak elkeseríteni, de root-ként szerintem ez sehogyan sem fog működni, legalábbis a dokumentáció ezt írja:

"suEXEC does not allow root to execute CGI/SSI programs."
"Presently, suEXEC does not allow the root group to execute CGI/SSI programs."

Maximum azt tudnám elképzelni, hogy maga az Apache futna "root"-ként és az összes többi weboldal suexec-kel "webuser"-ként, de igazság szerint már magától az ötlettől is borsódzik a hátam. A legjobb megoldás talán egy olyan felhasználó lenne, ami hozzáférne a script által matatandó dolgokhoz, csak ugye így manuálisan kell vacakolni a jogosultságok beállításával, plusz nem árt majd ledokumentálni, hogy évekkel később is tiszta legyen a szerepe.

Esetleg ránézhetsz az mpm-itk-ra is, ha hajlandó vagy kompromisszumokat hozni (lecserélni a worker/prefork mpm-t és vállalni, hogy az apache bizony root-ként fog futni, ameddig a virtuális hoszt megállapításra nem kerül a kérésből).

Oszinten szolva nekem olyan megoldas kellene, amely apache userral tud bizonyos scripteket rootkent futtani, a script drasztikus atirasa nelkul.

Otlet?

Nagyon-nagyon nem jó irány. A webszerver saját userrel triggereljen egy szolgáltatást (jelzőfájl, IPC, signal, estébé), ami rootként fut, és elvégzi a "piszkos munkát".

Egyébként meg nézz selinux beállítást, illetve logot, mert lehet, hogy ott van az eb elhantolva. (Ettől még nagyon nem illendő a webszervernek UID=0 processzt indítani)

Milyen script lenne ez? Mármint, hogy mit csinálna? Lehet, hogy nem is feltétlenül szükséges a root hozzá, csak megfelelően kell beállítani a jogosultságokat a szerveren. - Ha előre lehet tudni, hogy a script csak az /etc/asd/joska.cfg-t matatja, akkor elég annyi is, hogy a script a joskagyerek tulajdonában van, a suexec az ő nevében futtatja és joskagyerek hozzáfér az említett fájlhoz. Szerintem ez így korrekt megoldás lenne. Ha a script futtatna valami külső programot is, akkor azt is engedélyezni kell joskagyerek-nek, csak aztán ezzel érdemes ésszel bánni, mert nagyon könnyen el lehet szállni vele és akkor oda a rendszer biztonsága.

Vagy a sudo-s megoldást is ki lehet próbálni akár, amit eff linkelt.

Ui.: Egyébként ennek az egésznek van valami köze a másik, Webmines témához? Csak mert annak tudtommal van saját szervere, az sem tudja alapból mókolni a kívánt állományokat?

Igen, van koze a Webmines cucchoz, sajna.

A story: regen RHEL6-oson futott Apache alatt a Webmin, akkor meg hasznalta a Perl suid csomagjait. (ezt azota mar kivezettek)
Rengeteg kulso modul lett fejlesztve hozza, amelyek anno a rendszeren csinaltak beallitasokat, valtoztatasokat. Illetve ugye a sajat moduljai is futottak, pl. user letrehozo, service ujraindto, stb, moduok.

Jeleneg ugyaanazt kell megvalositani RHEL7-en, ahol kicsit valtozott a helyzet azota. Nincs Perl suid kezeles, de tovabbra is ragaszkodnak az Apache-hoz, mivel mas is fut alatta. (azaz a Webmin sajat webszervere dobva van, ez ugy root-kent fut, azaz mas kategoria)

Jelenleg olyan komplexak a megirt szkriptek (CGI), hogy sokaig tartana a jogosultsagokat atnezni, jobbnak lattuk, hogy az Apachera rahuzzuk valahogyan a regi funkcionalitast.

A rendszer aranylag zart, azaz a security ugyan fontos, de a funkcionalitas felulirhatja ezt.

mod_proxy a webmin saját web-jére?

Igen, ez is gondolatban volt, de akkor ugye mar apache root is lehetne....

Bar szomiszo jobb valamivel, mert itt csak auth utan kapna root jogot a Webmin. Meg persze megegy endpoit van a rendszerben, ami el tud romolni :)

A suidperl nem véletlenül lett kukázva. Azzal, hogy az Apache-ot erőszakoljátok meg, azzal csak a meglévő nagy rakás problémát toljátok magatok előtt. Láttunk már ilyen "aránylag zárt" rendszert letérdelni, egy belső audit során...
A "service ujraindto" modulok/funkció(k) például pont újraírandó/átalakítandó dolgok - hetesben pöttyet másképp köll csinálni :-P

-

ugyan nem suexec, valami suid és C ben írt egyszerű wrapper?

Csak hogy még nagyobb lukat csináljon?

szvsz. a kérdező képben van hogy weben uid0-val futtatni nem egy életbiztosítás

Igen, ez mukodik, kiprobaltam, de ugye Apache-val kombinaltan kell mennie. Azaz a weboldal bongeszesekor a C wrappernek kellene elindulni, ez meg ugy kerdese, hogyan?

sima cgi

szerintem itt az apacs usernek is kell jog (other), kulonben nem fogja tudni kiszolgalni a statikus tartalmakat (FIXME)

t

Csak a torteneti huseg kedveert:a megoldas az lett, hogy egy modded perl wrapper alkalmazast hivunk meg (ami setuid-os), es ez hivja meg az eredeti perl forditot. Biztonsagi okokbol van egy whitelist, hogy az apache melyik CGI fileokat futtathatja root-kent.