Ari Rantala -> Oppaat -> Apache
Web-palvelin: muistiinpanot
8. suEXEC - CGI Wrapper
suEXEC?
- Pohjatiedot: SUID, SGID. Tulkattavia skriptejä ei
voida
ajaa SUID tai SGIDinä.
- Apachen käyttäjät voivat ajaa omia CGI ja
SSI
-ohjelmiaan omalla ID:llä ja GID:llä. Tämä
mahdollistaa
sen, että käyttäjät voivat suojata asiallisesti
(chmod
700) CGI-ohjelmiensa käyttämät tiedostoihin pohjautuvat
tietovarastot. Normaalisti ohjelmat ajetaan Web-palvelimen
käyttäjän
(nobody) ID:llä ja GID:llä
- Kunnolla käytettynä suEXEC ei ole isompi
tietoturvariski kuin "normaalit" CGI-ohjelmatkaan.
- suEXEC -koodi ei ole osana Apachen
perusasennusta, mutta esim. SuSE Linuxien 10.* mukana
seuraavat Apachet
käyttävät oletuksena suEXECiä käyttäjien
kotihakemistojen
- suEXEC perustuu Set User Id (SUID)
-periaattella toimivaan ohjelmaan, jota kutsuu Apache Web-palvelin.
Tätä suEXEC-ohjelmaa kutsutaan kun halutaan suorittaa joko
CGI- tai SSI-ohjelma.
- suEXEC-ohjelma on rootin SUID, jota vain Web-palvelimen
käyttäjä voi ajaa.
- suEXEC-ohjelma ajaa kohdeohjelman (CGI tai SSI)
omistajansa SUIDina.
- suEXEC-ohjelma suorittaa tarkastuksia. Jonkin
mennessä pieleen ohjelman ajo päättyy virheeseen. Katso
20 kohdan
tarkistuslista Apachen suEXEC-manuaalista http://www.apache.org/docs/suexec.html
Tässä sama tiivistettynä:
- Wrapperia voidaan kutsua vain tietyllä
määrällä argumentteja. Oikean argumenttien
formaatin tietää Apache
- Web-palvelimen käyttäjän (nobody tai apache)
täytyy olla todellinen järjestelmän
käyttäjä. Toisin sanoen nobody tai apache täytyy
löytyä /etc/passwd-tedostosta
- Ainoastaan Web-palvelimen
käyttäjällä on oikeus ajaa wrapperia.
- Ajettava CGI-ohjelma ei voi suorittaa viittauksia, jotka
eivät ole sallittuja.
- CGI-ohjelman omistajan täytyy olla systeemin
käyttäjä ( /etc/passwd:ssä )
- CGI-ohjelman omistajaryhmän täytyy olla systeemin
ryhmä( /etc/group:ssä )
- CGI-ohjelman omistaja ei voi olla root.
- CGI-ohjelman omistajan UID:n täytyy olla yli vaaditun.
- CGI-ohjelman omistajaryhmä ei voi olla root.
- CGI-ohjelman omistajaryhmän GID:n täytyy olla yli
vaaditun.
- Ohjelman omistajan täytyy kuulua ryhmään,
joka on ohjelman omistajaryhmä
- Hakemisto, jossa ohjelma sijaitsee, täytyy olla
olemassa :)
- Ohjelman täytyy sijaita hakemistopuissa, joita Apache
tarjoaa.
- Hakemistoon, jossa CGI-ohjelma sijaitsee, ainoastaan sen
omistajalla voi olla kirjoitusaoikeus.
- CGI-ohjelma, joka yritetään ajaa, täytyy
olla
olemassa
- Ainoastaan CGI-ohjelman omistajalla voi olla siihen
kirjoitusoikeus.
- CGI-ohjelma itse ei voi olla SUID tai SGID.
- Onko käynnistävä omistaja/omistajaryhmä
lopulta sama kuin CGI-ohjelman omistaja/omistajaryhmä?
- SuEXECin täytyy pystyä putsaamaan prosessin
ympäristö (esim. PATH jne.)
- Saadaanko CGI-ohjelman suoritus lopulta käyntiin?
Yleisimmät syyt CGI-ohjelmien toimimattomuuteen ajettaessa
niitä suEXECin kautta ovat järjestyksessä:
- Kohdat 14 ja 16
- Kohta 11
- Kohdat 7 ja 9
suEXECin lokitiedoston paikka SuSEssa
- /var/log/apache/suexec.log
- Web-palvelin luo tiedoston automaattisesti, kun
ensimäinen SuEXECiin liittyvä ilmoitus tulee.
suEXECin asennus
HUOM: SuSE Linuxien 10.* -> mukana seuraavat Apachet
käyttävät oletuksena suEXECiä. Sitä ei
tarvitse erikseen asentaa niihin.
Jos suEXEC on tarvetta asentaa Apachen käännöksen
yhteydessä, seuraavassa on siihen eräs toimiva konfigurointi.
konffaa
#!/bin/sh
./configure --prefix=/www/apache3 \
--enable-suexec \
--suexec-caller=nobody \
--suexec-userdir=public_html/su \
--suexec-logfile=/www/apache3/logs/suexec_log \
--suexec-uidmin=500 \
--suexec-gidmin=500
|
Apachen asennusohjeista:
konffaa
#!/bin/sh
./configure --prefix=/www/apache3 \
--enable-suexec \
--suexec-caller=nobody \
--suexec-userdir=.nobody \
--suexec-docroot=/www/apache3/htdocs3 \
--suexec-logfile=/www/apache3/logs/suexec_log \
--suexec-uidmin=500 \
--suexec-gidmin=500 \
--suexec-safepath="/bin:/usr/bin"
|
SuEXEC, DocumentRoot ja Virtuaalihostit
Jos SuEXEC, niin voi DocumentRoottia voi
käyttää
vain Virtuaalihostin kanssa, jossa User ja Group määritelty
samaksi, kuin SuexecDocRootista ajettavat skriptit.
Esimerkki:
httpd.conf:
===========
...
Listen 83
Listen 8081
...
# Huomaa: kommentoituna(voi olla kaiketi kuinka päin
vaan):
# BindAddress *
# "Pääserveri", Dokujen mukaan tällä ei ole
merkitystä, jos yksikin Listen määritelty,
# onpahan tuossa "alleviivaamassa", mikä on
"pääserverin" portti.
Port 83
...
# "Pääserverin" User ja Group:
User nobody
Group nobody
# Namevirtualhosteja ei tarvita tässä, malliksi kommentoituna
#NameVirtualHost 12.34.56.78:80
#NameVirtualHost 12.34.56.78
<VirtualHost 195.xxx.xxx.xxx:8081>
DocumentRoot /www/apache3/htdocs/su
#ServerName www.firma.fi
User ara
Group ara
ErrorLog logs/8081error_log
TransferLog logs/8081access_log
</VirtualHost>
Kommentit
- Web-palvelimen porttiin 83 tulevat pyynnöt
käsitellään normaalisti
- Porttiin 8081 tulevat pyynnöt ohjautuvat
virtuaalihostiin. Skriptit, joiden omistajana ja
omistajaryhmänä on ara (tässä
DocumentRootissa), ajetaan SuEXECin läpi.
|