# open_basedir in izolacija po spletnih straneh

> Pravilna nastavitev open_basedir in ločitev spletnih strani: lasten uporabnik, lasten pool PHP-FPM, lastne tmp mape. Z vzorčno konfiguracijo za Nginx.

Vir: https://phpsos.de/sl/ratgeber/open-basedir/  
Stanje: 25.10.2026  
Ponudnik: PHP SOS, Nujna pomoč za PHP in varnost strežnikov. Takojšnja pomoč po WhatsAppu: https://wa.me/491736494914?text=Pozdravljeni%2C%20PHP%20SOS%2C%20potrebujemo%20pomo%C4%8D%20z%20na%C5%A1im%20stre%C5%BEnikom%20PHP.%20Podjetje%3A%20%E2%80%A6%20Spletna%20stran%3A%20%E2%80%A6

**Na kratko:** `open_basedir` omejuje mape, do katerih sme PHP dostopati. Sam po sebi je to le dodatna pregrada. Učinkovita izolacija po spletnih straneh nastane šele v sozvočju: lasten sistemski uporabnik, lasten pool PHP-FPM, lastna tmp mapa in lastni dostopi do podatkovne zbirke. Tako vdor v eno spletno stran ostane omejen na to stran.

## Zakaj po PHP2Shell izolacija odloča o škodi

Na številnih strežnikih tečeta več spletnih strani druga ob drugi: podjetniška stran, spletna trgovina, stara kampanjska stran, pri agencijah pogosto na desetine projektov strank. Pogosto si delijo sistemskega uporabnika in proces PHP. Če je ena kompromitirana, so odprte vse druge.

PHP2Shell to tveganje naredi otipljivo. Ranljivosti CVE-2026-109618 in CVE-2026-109619 omogočata izvajanje škodljive kode brez prijave, neodvisno od CMS-ja. Po poročilih medijev je bil prvi poskus napada že 17. 10. 2026, popravki so sledili 21. 10. Rešitev je posodobitev. Ali napad v času pred njo prizadene eno ali deset spletnih strani, pa odloča izolacija.

Pri drugi ranljivosti se pojavi še ena misel: po navedbah projekta PHP lahko notranje stanje zahteve ostane v workerju in ga uporabi poznejša zahteva v istem workerju. Ločeni pooli za vsako spletno stran poskrbijo, da si spletne strani workerjev tako ali tako ne delijo.

## Kaj open_basedir zmore

Z `open_basedir` določite seznam map. Funkcije PHP za delo z datotekami, kot so `fopen`, `include` ali `file_get_contents`, nato zavrnejo dostop do vsega zunaj tega seznama. Vnesena skripta tako ne more brez težav brati konfiguracijskih datotek sosednje spletne strani.

Meje so pomembne: preverjanje poteka znotraj PHP. Programi, zagnani zunaj PHP, mu ne podlegajo, napake v interpreterju pa ga lahko zaobidejo. Zato `open_basedir` vedno sodi skupaj z blokiranimi sistemskimi funkcijami, kot je opisano v vodniku [Pravilna uporaba disable_functions](https://phpsos.de/sl/ratgeber/disable-functions/), in predvsem z ločitvijo na ravni operacijskega sistema.

## Izolacija po spletnih straneh v štirih slojih

Zanesljiva ločitev se gradi iz več slojev. Vsak ujame, česar prejšnji ne zmore.

| Sloj | Ukrep | Učinek |
|---|---|---|
| Operacijski sistem | lasten sistemski uporabnik za vsako spletno stran | Datotek drugih spletnih strani ni mogoče brati |
| Procesi PHP | lasten pool PHP-FPM z lastnim socketom | brez skupnega workerja, lastne nastavitve |
| Konfiguracija PHP | `open_basedir`, lastna mapa za tmp in seje | dodatna pregrada, brez skupnih začasnih datotek |
| Podatki | lasten uporabnik podatkovne zbirke s pravicami samo na lastno zbirko | brez dostopa do tujih podatkov strank |

Pri visoki potrebi po zaščiti, na primer pri trgovinah s plačilnim prometom ali portalih z zdravstvenimi podatki, se dodajo containerji ali ločeni strežniki.

## Konfiguracija open_basedir v poolu PHP-FPM

Naslednji primer prikazuje pool za spletno stran z lastnim uporabnikom `seite1`. Poti in številko različice prilagodite svojemu sistemu.

```ini
; /etc/php/8.3/fpm/pool.d/seite1.conf
[seite1]
user = seite1
group = seite1
listen = /run/php/seite1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = ondemand
pm.max_children = 10

php_admin_value[open_basedir] = /var/www/seite1/:/var/www/seite1-tmp/
php_admin_value[upload_tmp_dir] = /var/www/seite1-tmp/
php_admin_value[sys_temp_dir] = /var/www/seite1-tmp/
php_admin_value[session.save_path] = /var/www/seite1-tmp/sessions
php_admin_value[error_log] = /var/log/php/seite1.error.log
php_admin_flag[session.upload_progress.enabled] = off
```

Zadnja vrstica takoj nastavi vmesni ukrep php.net proti PHP2Shell. Deluje samo iz poola, php.ini ali konfiguracije strežnika, ne prek `ini_set()` ali `.user.ini`. Mape ustvarite z ustreznimi pravicami:

```bash
sudo useradd --system --home /var/www/seite1 --shell /usr/sbin/nologin seite1
sudo mkdir -p /var/www/seite1-tmp/sessions
sudo chown -R seite1:seite1 /var/www/seite1-tmp
sudo chmod 700 /var/www/seite1-tmp
```

Kakšne naj bodo pravice v samem spletnem imeniku, opisuje vodnik [Pravice datotek na spletnem strežniku](https://phpsos.de/sl/ratgeber/dateirechte-webserver/).

## Povezava s spletnim strežnikom in preverjanje rezultata

V Nginxu vsaka spletna stran kaže na svoj socket. Tako nobena zahteva ne konča v poolu druge spletne strani.

```nginx
server {
    server_name seite1.example;
    root /var/www/seite1/public;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/seite1.sock;
    }
}
```

Dodatne napotke za to kombinacijo najdete na strani [Zaščita Nginxa s PHP-FPM](https://phpsos.de/sl/server/nginx-php-fpm/). Po ponovnem zagonu preverite, ali pooli res tečejo ločeno:

```bash
sudo systemctl restart php8.3-fpm
# Vsak pool naj teče pod svojim uporabnikom
ps -eo user,pid,cmd | grep "[p]hp-fpm: pool"
```

Nato preizkusite vse funkcije spletne strani: nalaganja, obdelavo slik, predpomnilnike, načrtovana opravila. Sporočila o napakah z navedbo `open_basedir restriction` v dnevniku napak pokažejo, katera pot še manjka. Dodajte samo poti, ki jih aplikacija res potrebuje, in nikoli celotnega datotečnega sistema.

> **Nasvet:**
> Agencije z veliko spletnimi stranmi strank naj konfiguracijo poola vzdržujejo kot predlogo. Tako vsaka nova spletna stran ločitev dobi samodejno, namesto da bi jo morali pozneje dograjevati. Ozadje za ta primer je na strani [Varnostni partner za agencije](https://phpsos.de/sl/branchen/agenturen-white-label/).

## Tipične ovire pri prehodu

Prehod na ločene poole je načrtljiv, a ima nekaj ponavljajočih se pasti. Najpogostejša zadeva skupno rabljene knjižnice: če ogrodje ali mapa s pisavami leži zunaj mape spletne strani, je treba to pot za branje dodati v `open_basedir`. Bolje je take odvisnosti prenesti v sam projekt.

Druga past so seje. Če se mesto shranjevanja spremeni, so vsi obiskovalci enkrat odjavljeni in tekoče košarice se izgubijo. Prehod zato načrtujte v mirnem časovnem oknu in ga interno napovejte.

Tretjič, načrtovana opravila pogosto tečejo prek ukazne vrstice in s tem pod drugim uporabnikom kot spletna stran. Preverite cron opravila in čakalne vrste ter jih zaženite pod novim uporabnikom spletne strani, sicer nastanejo datoteke z napačnim lastnikom, ki jih PHP pozneje ne sme več spreminjati.

Nazadnje naj ima vsak pool lastne meje za procese in pomnilnik. Spletna stran, ki pride pod obremenitev ali je napadena, tako ne more spraviti na kolena drugih.

## Kako PHP SOS pomaga konkretno?

- Ugotovimo, katere spletne strani si danes delijo uporabnike, procese in podatkovne zbirke.
- Za vsako spletno stran vzpostavimo lastne uporabnike, poole, tmp mape in dostope do podatkovne zbirke, ne da bi spreminjali aplikacije.
- Po prehodu preizkusimo vsako spletno stran in ciljno odpravimo manjkajoče poti.
- Ločitev dokumentiramo kot predlogo za prihodnje projekte.

Kako to sodi v celotni koncept, opisuje storitev [Utrjevanje strežnikov PHP](https://phpsos.de/sl/leistungen/server-haertung/).


## Pogosta vprašanja

**Ali open_basedir zadošča za ločitev spletnih strani med seboj?**  
Ne. open_basedir je dodatna pregrada znotraj PHP, ne trda ločitev. Izolacija postane zanesljiva šele z lastnimi sistemskimi uporabniki in pooli za vsako spletno stran, pri višji potrebi po zaščiti s containerji ali ločenimi strežniki.

**Zakaj po nastavitvi open_basedir nalaganja ne delujejo več?**  
Običajno na seznamu manjka mapa za začasne datoteke. Za vsako spletno stran ustvarite lastno tmp mapo, jo vpišite v open_basedir in upload_tmp_dir ter sys_temp_dir nastavite na to mapo.

**Ali lahko aplikacija open_basedir sama odpravi?**  
Aplikacija lahko nastavitev med izvajanjem samo še dodatno zoži, ne sprosti. open_basedir kljub temu nastavite prek php_admin_value v poolu, da je vrednost nedvoumno določena.

**Ali je izolacija mogoča tudi pri shared hostingu?**  
To je odvisno od ponudnika gostovanja. Številne ponudbe stranke ločijo z lastnimi uporabniki in procesi PHP. Povprašajte, kako je ločitev izvedena, še posebej, če je več vaših spletnih strani v enem paketu.

## Viri

- [php.net: varnostna obvestila](https://www.php.net/)
- [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/)
- [BSI IT-Grundschutz](https://www.bsi.bund.de/DE/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/IT-Grundschutz/it-grundschutz_node.html)
