19.02.2018

CGI/SSI-tekniikat

CGI/SSI-tekniikoiden käyttäminen www-palveluissa (users.jyu.fi/groups.jyu.fi)

CGI/SSI

 

Tämä dokumentti sisältää tietoa CGI:n ja SSI:n käyttämisestä palvelimella, jossa sijaitsevat palvelut groups.jyu.fi ja users.jyu.fi.

Ryhmä- ja käyttäjien henkilökohtaisten sivujen palvelimassa  on käytössä suexec käyttäjien kotihakemistossa ajettavien cgi-skriptien osalta. CGI-skriptien suoritus on sallittu vain www-sivujen alihakemistossa cgi-bin (ja sen alihakemistoissa), joten kaikki CGI-skriptit on sijoitettava sinne.

Jos haluat käyttää cgi-skriptejä niin tee seuraavasti:

  • Tee hakemisto cgi-bin kotisivujesi alle minne siirät CGI-skriptisi.
  • Skriptitiedoston päätteenä tulee olla .cgi riippumatta siitä millä ohjelmointikielelle se on tehty
  • Skriptitiedoston alussa tulee olla määritelty millä ohjelmointikielellä se on tehty eli minkä tulkin kautta se suoritetaan. Esimerkkeinä
    • bash: #!/bin/bash
    • python #!/usr/bin/python
    • perl: #!/usr/bin/perl
  • Tarkista tiedoston oikeudet alla olevien suexec-vaatimusten mukaan

Yleisimpiä suexec:n aiheuttamia ongelmia:

Apachen sivulta löytyy dokumentteja asiasta:

http://httpd.apache.org/docs/2.4/suexec.html

http://httpd.apache.org/docs/2.4/mod/mod_include.html

suEXEC on Apache www-palvelimen ominaisuus, joka mahdollistaa CGI- ja SSI-ohjelmien suorittamisen eri käyttäjien oikeuksilla.

Käytännössä tämä tarkoittaa sitä, että käyttäjän kotihakemistossa olevat CGI/SSI-ohjelmat ajetaan ko. käyttäjän oikeuksilla.

Koska suEXEC:llä on haluttu parantaa palvelimen tietoturvaa, on suEXEC:iin sisäänrakennettu tiukat vaatimukset ajettavan tiedoston oikeuksista yms.

  • Hakemiston (jossa ajettava tiedosto on) omistajan/ryhmän pitää olla samat kuin itse käyttäjän (uid/gid). Nämä tiedot saa selville Unix-koneessa komenolla "id".
  • Suoritettavan tiedoston omistajan ja ryhmän pitää olla samat kuin käyttäjän, jona tiedosto suoritetaan.
  • Em. hakemistoon ja suoritettavaan tiedostoon ei saa olla kirjoitusoikeutta muilla kuin itse käyttäjällä/ryhmällä.
  • SSI-sivuissa (*.shtml) käytettävä <!--#exec cmd="komento"--> on suEXEC:ä käytettässä hyvin tarkasti rajattu. Suoritettava komento "komento" ei saa sisältää esim. välilyöntejä yms. erikoismerkkejä, vaan "komento" tulkitaan yhdeksi ainoaksi komennoksi. Lisäksi "komento" on löydyttävä samasta hakemistosta kuin komennon sisältävä shtml-sivukin.

Mikäli 'cmd=".."'-osassa halutaan suorittaa useampia komentoja tai halutaan välittää komennolle parametrejä tms., on kommenot kirjoitettava komentotiedostoksi. Tällöin "cmd="..."'-osaan laitetaan kyseisen komentojonotiedoston  nimi.

Esim. cmd="echo Testing cmd" ei toimi, vaan "echo Testing cmd" on laitettava tiedostoon (esim. komento.sh) ja muutettava 'cmd' muotoon 'cmd="komento.sh"'. Lisäksi komento.sh-tiedostolle on annettava suoritusoikeus (esim. chmod +x komento.sh).

SELinux ja sen huomioiminen

Huomioitavaa edellä olevien suexec-rajoitusten lisäksi on palvelimella käytössä selinux-rajoitukset. SELinux (Security Enhanced linux) on teknologia joka mahdollistaa sääntöpohjaisen pääsynhallinnan. Useimmiten näistä ei tarvitse välittää koska se vain vahvistaa suexec-rajoituksia mutta ajoittain oikeudet voivat mennä väärin. Kyseinen teknologia on käytössä {users, groups}.jyu.fi-palvelimilla. Käytännössä tämä näkyy käyttäjille tiedostojen merkkaamisena tietyntyyppisiksi joita www-palvelin on sallittu operoida.
Perustyyppi www-tiedostoille on httpd_user_content_t, suoritettavat ohjelmat (skriptit) ovat muotoa httpd_user_script_exec_t
ja esim .htaccess-tiedostojen tyyppi on httpd_user_htaccess_t. Tässä yhteydessä puhutaan myös selinux-kontekstista mikä pitää edellä esitellyn tyyppitiedon lisäksi sisällään roolitiedon, tyyppitiedon ja mahdollisen monitasoisen pääsynhallinnan. Englanniksi samat asiat ovat Role-Based Access Control (RBAC), Type Enforcement (TE), and, optionally, Multi-Level Security (MLS).

Katsottaessa tiedoston yksittäisen tiedoston tietoja (-Z optio näyttää selinux-tiedot)

> ls -lahZ index.html
-rw-rwxrwx. testuser users unconfined_u:object_r:httpd_user_content_t:s0 index.html

Alussa näkyvät tiedoston oikeudet muodossa käyttäjän oikeudet, ryhmän oikeudet ja muiden oikeudet rwx-muodossa. Siis luku,kirjoitus ja tieto siitä onko tiedostolla suoritetusoikeudet. Tämän jälkeen tulee selinux kontekstimuodossa user:role:type:level syntax
Lisää tiedostojen oikeuksista linuxissa: https://linux.fi/wiki/Tiedoston_oikeudet

Suoritettavia tiedostoja voi olla vain käyttäjän cgi-bin -hakemistossa mikä johtui apachen suexec-vaatimuksesta. Lisäksi suoritettavalla tiedostolla tulee olla tyyppi httpd_user_script_exec_t sekä suoritusbitti päällä. Yleensä selinux-konteksti menee automaattisesti oikein mutta ei välttämättä aina.
Ainoa keino varmistua ja korjata tilanne on poistaa www-tilan aktivointi salasana.jyu.fi-palvelussa ja tämän jälkeen tehdä aktivointi uudestaan. Kyseinen operaatio suorittaa tarkistuksen käyttäjän kotisivutiedostoille ja korjaa mahdolliset ongelmat
Selinux-kontekstia voi muokata myös komennolla chcon antamalla sille aluksi kokonaan uuden selinux-kontekstin ja lopuksi tiedoston nimen jonka selinux-kontekstia ollaan muokkaamassa esimerkiksi alla tehdään k.txt tiedostolle:

> ls -Z k.txt
-rwxr-xr-x. testuser users system_u:object_r:httpd_user_content_t:s0 k.txt
> chcon system_u:object_r:httpd_user_script_exec_t:s0 k.txt
> ls -Z k.txt
-rwxr-xr-x. testuser users system_u:object_r:httpd_user_script_exec_t:s0 k.txt

Nämä chcon-komennolla tehdy muutokset eivät säily uudelleenaktivoinnin jälkeen. Se siis sopii testaukseen jos epäilee jotain selinux-ongelmaa.

Lisäluettavaa selinuxista: