# Správna ochrana prístupových údajov a súborov .env

> Ochrana súboru .env: správny webový koreň, blokovanie vo webservery, úzke práva k súborom, žiadne tajomstvá v Gite a výmena po bezpečnostnom incidente.

Zdroj: https://phpsos.de/sk/blog/env-dateien-schuetzen/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**Stručne:** Súbor .env ochránite tak, že vôbec neleží vo verejne dostupnom priečinku: webový koreň ukazuje na podpriečinok ako `public/`, konfigurácia leží o úroveň vyššie. Webserver navyše blokuje všetky súbory s bodkou na začiatku, súbor je čitateľný len pre vlastníka a proces PHP a nikdy nepatrí do repozitára Git. Po vlámaní sa všetky prístupové údaje v ňom považujú za známe a vymenia sa.

## Súbor s kľúčmi od domu

Moderné projekty PHP radi ukladajú svoje tajomstvá do súboru s názvom `.env`: heslo databázy, prístup k poštovému serveru, kľúče API pre platobné a prepravné služby, kľúč, ktorým aplikácia podpisuje cookies. Frameworky ako Laravel a Symfony tento vzor používajú a mnohé vlastné vývoje ho prevzali.

Myšlienka je dobrá: konfigurácia a kód sú oddelené a každé prostredie dostane vlastné hodnoty. Nebezpečné to začne byť, keď súbor skončí v nesprávnom priečinku. Ak leží vo webovom koreni a webserver ho neblokuje, stačí jediné volanie v prehliadači, aby sa prečítali všetky prístupy naraz.

K tomu pristupujú varianty s inými názvami: `.env.local`, `.env.production`, `config.local.php` alebo súbory s prístupovými údajmi k úložným službám. Čo je tu opísané pre `.env`, platí pre všetky súbory, v ktorých sú tajomstvá.

Takéto súbory neustále hľadajú automatizované skenery. Nie je to špecialita jednotlivých útočníkov, ale základný šum na internete, podobne ako hromadné skeny nezáplatovaných verzií PHP.

## Kde by mal súbor .env ležať

Najúčinnejším opatrením je štruktúra: webserver smie doručovať len priečinok, ktorý má byť skutočne verejný. V Laraveli a Symfony je to priečinok `public/`. Všetko ostatné, teda kód, konfigurácia, protokoly a `.env`, leží nad ním a cez HTTP sa vôbec nedá adresovať.

```text
/srv/www/shop/
├── .env              ← nedostupný
├── config/
├── src/
├── vendor/
└── public/           ← jediný webový koreň
    ├── index.php
    └── assets/
```

V praxi však webový koreň často ukazuje na samotný priečinok projektu, napríklad preto, že to vyžaduje hostingový panel alebo že sa pri sťahovaní neupravila cesta. Skontrolujte preto v konfigurácii webservera alebo v paneli, kam ukazuje `root` resp. `DocumentRoot`.

## Ochrana súboru .env: blokovanie vo webservery ako druhá línia

Ak sa webový koreň nedá zmeniť, alebo ak chcete dodatočné zabezpečenie, zablokujte skryté súbory vo webservery. Priečinok `.well-known` pritom musí zostať dostupný, pretože sa okrem iného používa na vydávanie certifikátov.

```nginx
# Zablokovať všetky súbory a priečinky s bodkou na začiatku, okrem .well-known
location ~ /\.(?!well-known/) {
    deny all;
    return 404;
}
```

```apache
# Zablokovať súbory s bodkou na začiatku
<FilesMatch "^\.">
    Require all denied
</FilesMatch>
```

Odpoveď 404 namiesto 403 neprezradí, že súbor existuje. Či blokovanie funguje, skontrolujte zvonka:

```bash
# Očakáva sa: 403 alebo 404, nikdy 200
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.env
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.env.example
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.env.bak
```

Posledné dva riadky nie sú náhoda: kópie ako `.env.bak` alebo `.env.old` vznikajú pri údržbe a často sa zabudnú. Viac o takýchto pozostatkoch je v článku [Záložné súbory vo webovom koreni](https://phpsos.de/sk/blog/backup-dateien-im-webroot/).

## Práva, Git a zaobchádzanie s kópiami

Aj mimo webového koreňa platí princíp najmenších práv. Osvedčené rozdelenie:

1. **Vlastníkom** je používateľ pre nasadzovanie (deploy), nie proces PHP.
2. **Skupinou** je skupina poolu PHP-FPM, ktorá smie len čítať; práva `640`.
3. **Žiadny prístup na zápis** pre proces PHP. Aplikácia nemusí vedieť meniť vlastné prístupové údaje.
4. **Žiadne skutočné hodnoty v repozitári:** commituje sa len `.env.example` so zástupnými hodnotami, skutočný súbor je v `.gitignore`.
5. **Oddelené hodnoty pre každé prostredie:** vývoj, staging a produkcia používajú rôzne prístupy, aby únik v testovacom prostredí neotvoril produkciu.

```bash
chown deploy:shop-php /srv/www/shop/.env
chmod 640 /srv/www/shop/.env
# Skontrolovať, či bol súbor niekedy commitnutý
git log --all --oneline -- .env
```

Dávajte pozor aj na chybové stránky. Frameworky v režime ladenia (debug) niekedy zobrazujú premenné prostredia a konfiguračné hodnoty; na produkčnom systéme musí byť tento režim vypnutý. Skontrolujte to po každom nasadení, pretože nesprávna hodnota v samotnom `.env` ho môže opäť zapnúť.

Ak posledný príkaz vráti nálezy, prístupové údaje sú v histórii Git a považujú sa za odhalené, aj keď súbor dnes chýba. Prečo je to obzvlášť citlivé, keď priečinok `.git` leží na serveri, opisuje [Verejný priečinok .git: podceňovaný únik údajov](https://phpsos.de/sk/blog/git-ordner-oeffentlich/). Základy o právach vysvetľuje sprievodca [Práva k súborom na webovom serveri](https://phpsos.de/sk/ratgeber/dateirechte-webserver/).

> **Dôležité:**
> Testovacie súbory s `phpinfo()` zobrazujú premenné prostredia. Kto odovzdáva tajomstvá ako premenné prostredia, prezradí ich cez zabudnutý testovací súbor. Súvislosti sú v článku [Súbory phpinfo(): prečo musia zmiznúť](https://phpsos.de/sk/blog/phpinfo-dateien-entfernen/).

## Po vlámaní: vymeniť prístupové údaje

Žiadne blokovanie nechráni pred útočníkom, ktorý už na serveri spúšťa kód. Proces PHP musí vedieť čítať svoju konfiguráciu, takže votrelecký kód v tom istom procese to dokáže tiež. Po PHP2Shell preto platí: ak sa vlámanie nedá vylúčiť, všetky prístupové údaje na serveri sa musia považovať za známe.

Usporiadaná výmena zahŕňa databázové heslá, prístupy k pošte a SMTP, kľúče API externých služieb, podpisové kľúče aplikácie a prístupy k úložným službám. Poradie a čas by sa mali naplánovať: kto najprv vymení a až potom vyčistí server, môže útočníkovi dať nové hodnoty rovno so sebou.

Škodu pri úniku obmedzíte už vopred tým, že každé tajomstvo smie len toľko, koľko je nutné. Databázový používateľ webu nepotrebuje práva na iné databázy. Kľúče API externých služieb sa dajú u mnohých poskytovateľov obmedziť na jednotlivé funkcie alebo adresy odosielateľa, napríklad zakladať zásielky, ale nespúšťať výplaty. A každá aplikácia dostane vlastné prístupy, namiesto toho, aby viaceré weby zdieľali ten istý poštový účet alebo ten istý kľúč. Potom sa únik týka jasne vymedzenej oblasti a výmena zostáva prehľadná.

V prostrediach kontajnerov nepatrí súbor `.env` ani do obrazu (image), ani do verejne dostupného registra. Vylúčte ho cez `.dockerignore` a tajomstvá odovzdávajte až za behu cez mechanizmy platformy.

Z dlhodobého hľadiska sa oplatí pozrieť na centrálne úložiská tajomstiev, ako ich odporúča OWASP: tajomstvá na jednom mieste, s prístupovým protokolom, pravidelnou výmenou a čo najkratšou platnosťou.

## Ako konkrétne pomáha PHP SOS?

- Zvonka preveríme, či sú konfiguračné súbory, kópie a skryté súbory vašich webov dostupné.
- Webový koreň, blokovanie vo webservery a práva k súborom prestavíme tak, aby tajomstvá neboli dostupné cez HTTP.
- Skontrolujeme repozitáre a nasadenia na commitnuté prístupové údaje.
- Po incidente naplánujeme a sprevádzame výmenu všetkých dotknutých prístupov v správnom poradí.

Tieto práce sú súčasťou nášho [spevnenia servera (hardening) pre webservery PHP](https://phpsos.de/sk/leistungen/server-haertung/).


## Časté otázky

**Je súbor .env vo webovom koreni automaticky verejný?**  
Nie automaticky, ale často. Či je dostupný, závisí od konfigurácie webservera. Mnohé štandardné konfigurácie chránia len súbory .htaccess, nie iné súbory s bodkou na začiatku. Jasno urobí test pomocou curl.

**Sú premenné prostredia bezpečnejšie než súbor .env?**  
Nie zásadne. OWASP upozorňuje, že premenné prostredia sú čitateľné pre všetky procesy používateľa a môžu sa objaviť v protokoloch alebo výpisoch pamäte. Vyhnete sa však súboru vo webovom koreni. Lepšie sú centrálne úložiská tajomstiev, kde ich prostredie podporuje.

**Čo robiť, ak bol súbor .env dostupný?**  
Všetky v ňom obsiahnuté prístupové údaje považovať za známe a vymeniť: databáza, pošta, API, platobné služby, kľúče aplikácie. Potom v prístupových protokoloch skontrolovať, či sa súbor sťahoval, a pri osobných údajoch zapojiť zodpovedného pracovníka pre ochranu údajov.

**Patrí súbor .env do repozitára Git?**  
Nie. Do repozitára patrí najviac šablóna bez skutočných hodnôt, napríklad .env.example. Skutočný súbor sa vylúči cez .gitignore a na server sa dodáva oddelene.

**Môže phpinfo() prezradiť prístupové údaje?**  
Áno. phpinfo() zobrazuje okrem iného premenné prostredia a serverové premenné. Ak sú tam tajomstvá, vypíšu sa spolu s nimi. Testovacie súbory s phpinfo() preto nikdy nepatria na dostupný systém.

## Zdroje

- [OWASP Secrets Management Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html)
- [Dokumentácia Nginx](https://nginx.org/en/docs/)
- [Apache HTTP Server: dokumentácia](https://httpd.apache.org/docs/)
