Ajankohtainen tilanne: PHP2Shell. Kaksi kriittistä PHP-haavoittuvuutta (CVSS 9.2) sallii haittakoodin suorittamisen ilman kirjautumista. Korjaukset 21.10.2026 alkaen.Mitä nyt on tehtävä →

Tunnusten ja .env-tiedostojen oikea suojaus

Miten suojaatte tietokannan salasanat, API-avaimet ja muut salaisuudet PHP-projekteissa: .env-tiedostot verkkojuuren ulkopuolella, verkkopalvelimen estot, tiukat oikeudet ja hallittu vaihto tapahtuman jälkeen.

Tilanne Lukuaika 4 minTurvallinen kehitys

Lyhyesti: .env-tiedoston suojaatte niin, ettei se ole lainkaan julkisesti saavutettavassa hakemistossa: verkkojuuri osoittaa alikansioon kuten public/, ja konfiguraatio on yhtä tasoa ylempänä. Lisäksi verkkopalvelin estää kaikki pisteellä alkavat tiedostot, tiedosto on luettavissa vain omistajalle ja PHP-prosessille, eikä se kuulu koskaan Git-repositorioon. Tunkeutumisen jälkeen kaikki siinä olevat tunnukset katsotaan tunnetuiksi ja vaihdetaan.

Tiedosto, jossa on talon avaimet

Nykyaikaiset PHP-projektit tallentavat salaisuutensa mielellään tiedostoon nimeltä .env: tietokannan salasana, sähköpostipalvelimen tunnukset, API-avaimet maksu- ja toimituspalveluihin, avain, jolla sovellus allekirjoittaa evästeet. Kehykset kuten Laravel ja Symfony käyttävät tätä mallia, ja monet omat toteutukset ovat omaksuneet sen.

Ajatus on hyvä: konfiguraatio ja koodi on erotettu, ja jokainen ympäristö saa omat arvonsa. Vaaralliseksi se muuttuu, jos tiedosto päätyy väärään hakemistoon. Jos se on verkkojuuressa eikä verkkopalvelin estä sitä, yksi kutsu selaimessa riittää lukemaan kaikki tunnukset kerralla.

Lisäksi on muunnelmia muilla nimillä: .env.local, .env.production, config.local.php tai tiedostoja, joissa on tallennuspalvelujen tunnukset. Se, mitä tässä kuvataan .env-tiedostolle, pätee kaikkiin tiedostoihin, joissa on salaisuuksia.

Tällaisia tiedostoja etsivät jatkuvasti automaattiset skannerit. Se ei ole yksittäisten hyökkääjien erikoisuus vaan internetin taustakohinaa, samoin kuin massaskannaukset korjaamattomien PHP-versioiden löytämiseksi.

Missä .env-tiedoston pitäisi sijaita

Tehokkain toimenpide on rakenteellinen: verkkopalvelimen saa tarjoilla vain kansion, jonka on todella tarkoitus olla julkinen. Laravelissa ja Symfonyssa se on kansio public/. Kaikki muu, eli koodi, konfiguraatio, lokit ja .env, sijaitsee sen yläpuolella eikä ole HTTP:llä lainkaan osoitettavissa.

/srv/www/shop/
├── .env              ← ei saavutettavissa
├── config/
├── src/
├── vendor/
└── public/           ← ainoa verkkojuuri
    ├── index.php
    └── assets/

Käytännössä verkkojuuri osoittaa silti usein itse projektihakemistoon, esimerkiksi koska hosting-paneeli määrää niin tai koska muutossa polkua ei ole mukautettu. Tarkistakaa siksi verkkopalvelimen konfiguraatiosta tai paneelista, mihin root tai DocumentRoot osoittaa.

.env-tiedoston suojaus: verkkopalvelimen esto toisena puolustuslinjana

Jos verkkojuurta ei voi muuttaa tai haluatte lisäsuojaa, estäkää piilotiedostot verkkopalvelimessa. Kansion .well-known on tällöin pysyttävä saavutettavana, koska sitä käytetään muun muassa varmenteiden myöntämiseen.

# Estä kaikki pisteellä alkavat tiedostot ja kansiot paitsi .well-known
location ~ /\.(?!well-known/) {
    deny all;
    return 404;
}
# Estä pisteellä alkavat tiedostot
<FilesMatch "^\.">
    Require all denied
</FilesMatch>

Vastaus 404 eikä 403 ei paljasta, että tiedosto on olemassa. Toimiiko esto, tarkistatte ulkopuolelta:

# Odotettu tulos: 403 tai 404, ei koskaan 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

Kaksi viimeistä riviä eivät ole sattumaa: kopiot kuten .env.bak tai .env.old syntyvät huoltotöissä ja unohtuvat usein. Lisää tällaisista jäänteistä on kirjoituksessa Varmuuskopiotiedostot verkkojuuressa.

Oikeudet, Git ja kopioiden käsittely

Myös verkkojuuren ulkopuolella pätee vähimpien oikeuksien periaate. Hyväksi havaittu jako:

  1. Omistaja on käyttöönottokäyttäjä, ei PHP-prosessi.
  2. Ryhmä on PHP-FPM-poolin ryhmä, jolla on vain lukuoikeus; oikeudet 640.
  3. Ei kirjoitusoikeutta PHP-prosessille. Sovelluksen ei tarvitse pystyä muuttamaan omia tunnuksiaan.
  4. Ei oikeita arvoja repositoriossa: Vain .env.example paikkamerkkeineen viedään versionhallintaan, oikea tiedosto on tiedostossa .gitignore.
  5. Erilliset arvot ympäristöittäin: Kehitys, staging ja tuotanto käyttävät eri tunnuksia, jotta testiympäristön vuoto ei avaa tuotantoa.
chown deploy:shop-php /srv/www/shop/.env
chmod 640 /srv/www/shop/.env
# Tarkista, onko tiedosto koskaan viety versionhallintaan
git log --all --oneline -- .env

Kiinnittäkää huomiota myös virhesivuihin. Kehykset näyttävät debug-tilassa toisinaan ympäristömuuttujia ja konfiguraatioarvoja; tuotantojärjestelmässä tämän tilan on oltava pois päältä. Tarkistakaa se jokaisen käyttöönoton jälkeen, sillä väärä arvo itse .env-tiedostossa voi kytkeä sen takaisin päälle.

Jos viimeinen komento tuottaa osumia, tunnukset ovat Git-historiassa ja katsotaan paljastuneiksi, vaikka tiedosto puuttuisi nykyään. Miksi tämä on erityisen arkaluonteista, jos .git-kansio on palvelimella, kuvaa Julkinen .git-kansio: aliarvioitu tietovuoto. Oikeuksien perusteet selittää opas Tiedosto-oikeudet verkkopalvelimella.

Tärkeää

Testitiedostot, joissa on phpinfo(), näyttävät ympäristömuuttujat. Joka välittää salaisuuksia ympäristömuuttujina, paljastaa ne unohtuneen testitiedoston kautta. Taustat löytyvät kirjoituksesta phpinfo()-tiedostot: miksi niiden on poistuttava.

Tunkeutumisen jälkeen: tunnusten vaihto

Mikään esto ei suojaa hyökkääjältä, joka jo suorittaa koodia palvelimella. PHP-prosessin on pystyttävä lukemaan konfiguraationsa, joten sama prosessi ujutettu koodi voi sen myös. PHP2Shellin jälkeen pätee siksi: jos tunkeutumista ei voida sulkea pois, kaikki palvelimella olevat tunnukset on käsiteltävä tunnettuina.

Hallittu vaihto kattaa tietokannan salasanat, sähköposti- ja SMTP-tunnukset, ulkoisten palvelujen API-avaimet, sovelluksen allekirjoitusavaimet ja tallennuspalvelujen tunnukset. Järjestys ja ajankohta kannattaa suunnitella: joka vaihtaa ensin ja puhdistaa palvelimen vasta sitten, antaa hyökkääjälle mahdollisesti uudet arvotkin.

Vuodon vahingon rajaatte jo etukäteen siten, että jokainen salaisuus saa tehdä vain sen verran kuin on tarpeen. Verkkosivuston tietokantakäyttäjä ei tarvitse oikeuksia muihin tietokantoihin. Ulkoisten palvelujen API-avaimet voi monilla tarjoajilla rajata yksittäisiin toimintoihin tai lähettäjäosoitteisiin, esimerkiksi lähetysten luonti mutta ei maksatusten käynnistäminen. Ja jokainen sovellus saa omat tunnukset sen sijaan, että useat verkkosivustot jakaisivat saman sähköpostitilin tai avaimen. Silloin vuoto koskee selkeästi rajattua aluetta, ja vaihto pysyy hallittavana.

Konttiympäristöissä .env-tiedosto ei kuulu imageen eikä julkisesti saavutettavaan rekisteriin. Sulkekaa se pois tiedostolla .dockerignore ja välittäkää salaisuudet vasta ajon aikana alustan mekanismeilla.

Pitkällä aikavälillä kannattaa katsoa keskitettyjä salaisuuksien säilytyspaikkoja, kuten OWASP niitä suosittelee: salaisuudet yhdessä paikassa, käyttölokin, säännöllisen vaihdon ja mahdollisimman lyhyen voimassaolon kanssa.

Miten PHP SOS auttaa konkreettisesti?

  • Tarkistamme ulkopuolelta, ovatko verkkosivustojenne asetustiedostot, kopiot ja piilotiedostot haettavissa.
  • Muutamme verkkojuuren, verkkopalvelimen estot ja tiedosto-oikeudet niin, etteivät salaisuudet ole enää HTTP:llä saavutettavissa.
  • Tarkistamme repositoriot ja käyttöönotot sinne viedyistä tunnuksista.
  • Tapahtuman jälkeen suunnittelemme ja tuemme kaikkien asianomaisten tunnusten vaihtoa oikeassa järjestyksessä.

Nämä työt kuuluvat PHP-verkkopalvelinten koventamiseemme.

Usein kysytyt kysymykset

Onko verkkojuuressa oleva .env-tiedosto automaattisesti julkinen?

Ei automaattisesti, mutta usein. Se, onko tiedosto haettavissa, riippuu verkkopalvelimen konfiguraatiosta. Monet oletuskonfiguraatiot suojaavat vain .htaccess-tiedostoja, eivät muita pisteellä alkavia tiedostoja. Testi curlilla tuo selvyyden.

Ovatko ympäristömuuttujat turvallisempia kuin .env-tiedosto?

Eivät periaatteessa. OWASP huomauttaa, että ympäristömuuttujat ovat kaikkien käyttäjän prosessien luettavissa ja voivat päätyä lokeihin tai muistivedoksiin. Ne välttävät kuitenkin verkkojuuressa olevan tiedoston. Parempia ovat keskitetyt salaisuuksien säilytyspaikat, missä ympäristö tukee niitä.

Mitä tehdä, jos .env-tiedosto oli haettavissa?

Pitäkää kaikkia siinä olevia tunnuksia tunnettuina ja vaihtakaa ne: tietokanta, sähköposti, rajapinnat, maksupalvelut, sovelluksen avaimet. Tarkistakaa sen jälkeen käyttölokeista, haettiinko tiedosto, ja ottakaa henkilötietojen osalta mukaan tietosuojavastaava.

Kuuluuko .env-tiedosto Git-repositorioon?

Ei. Repositorioon kuuluu korkeintaan malli ilman oikeita arvoja, esimerkiksi .env.example. Oikea tiedosto suljetaan pois .gitignorella ja toimitetaan palvelimelle erikseen.

Voiko phpinfo() paljastaa tunnuksia?

Kyllä. phpinfo() näyttää muun muassa ympäristömuuttujat ja palvelinmuuttujat. Jos salaisuudet ovat siellä, ne tulostuvat mukana. Testitiedostot, joissa on phpinfo(), eivät siksi kuulu koskaan saavutettavissa olevalle järjestelmälle.

Lähteet

Pikayhteys

Jokainen tunti on tärkeä. Kirjoittakaa meille nyt.

Kuvatkaa lyhyesti järjestelmä, PHP-versio ja havainnot. Otamme yhteyttä, selvitämme tilanteen ja työskentelemme etänä, kunnes tapaus on käsitelty loppuun ja dokumentoitu.

Pikaapu