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ä:
  1. Wrapperia voidaan kutsua vain tietyllä määrällä argumentteja. Oikean argumenttien formaatin tietää Apache
  2. 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
  3. Ainoastaan Web-palvelimen käyttäjällä on oikeus ajaa wrapperia.
  4. Ajettava CGI-ohjelma ei voi suorittaa viittauksia, jotka eivät ole sallittuja.
  5. CGI-ohjelman omistajan täytyy olla systeemin käyttäjä ( /etc/passwd:ssä )
  6. CGI-ohjelman omistajaryhmän täytyy olla systeemin ryhmä( /etc/group:ssä )
  7. CGI-ohjelman omistaja ei voi olla root.
  8. CGI-ohjelman omistajan UID:n täytyy olla yli vaaditun.
  9. CGI-ohjelman omistajaryhmä ei voi olla root.
  10. CGI-ohjelman omistajaryhmän GID:n täytyy olla yli vaaditun.
  11. Ohjelman omistajan täytyy kuulua ryhmään, joka on ohjelman omistajaryhmä
  12. Hakemisto, jossa ohjelma sijaitsee, täytyy olla olemassa :)
  13. Ohjelman täytyy sijaita hakemistopuissa, joita Apache tarjoaa.
  14. Hakemistoon, jossa CGI-ohjelma sijaitsee, ainoastaan sen omistajalla voi olla kirjoitusaoikeus.
  15. CGI-ohjelma, joka yritetään ajaa, täytyy olla olemassa
  16. Ainoastaan CGI-ohjelman omistajalla voi olla siihen kirjoitusoikeus.
  17. CGI-ohjelma itse ei voi olla SUID tai SGID.
  18. Onko käynnistävä omistaja/omistajaryhmä lopulta sama kuin CGI-ohjelman omistaja/omistajaryhmä?
  19. SuEXECin täytyy pystyä putsaamaan prosessin ympäristö (esim. PATH jne.)
  20. Saadaanko CGI-ohjelman suoritus lopulta käyntiin?

Yleisimmät syyt CGI-ohjelmien toimimattomuuteen ajettaessa niitä suEXECin kautta ovat  järjestyksessä:
  1. Kohdat 14 ja 16
  2. Kohta 11
  3. 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.