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:
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_oikeudetSuoritettavia 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: