Lyhyesti: Asettaaksenne Apachen PHP:lle turvallisesti liitätte PHP:n PHP-FPM:n ja mod_proxy_fcgi:n kautta, kytkette .htaccess-tiedoston pois asetuksella AllowOverride None ja asetatte ServerTokens Prod, ServerSignature Off, TraceEnable Off ja Options -Indexes. LimitRequestBody mukautatte PHP:n rajoihin, tarpeettomat moduulit kytkette pois. Asetus ei korvaa PHP-päivitystä mutta pienentää hyökkäyspintaa selvästi.
Apache PHP2Shellin jälkeen: enemmän kuin uudelleenkäynnistys
Apache-ylläpitäjät olivat lokakuussa 2026 erityisen paineen alla. PHP-tiimi arvioi riskin korkeimmaksi mod_php:n kohdalla, koska siellä hyökkäys osoitettiin ennen kuin sovelluskoodi ylipäätään suoritetaan. Akuutit vaiheet, eli päivitys ja täydellinen uudelleenkäynnistys, kuvaa sivu Miksi mod_php kantaa korkeimman riskin.
Päivityksen jälkeen jää kysymys, kuinka hyvä Apachen asetus itsessään on. Vuosien mittaan kasvaneilla palvelimilla on usein vuosien takaisia asetuksia: hakemistolistauksia, avoimia .htaccess-oikeuksia, moduuleja, joita kukaan ei enää tarvitse. Jokainen niistä voi tehdä myöhemmästä virheestä suuremman kuin sen tarvitsisi olla.
Tämä kirjoitus kuvaa kevyen, turvallisen perusasetuksen Apache 2.4:lle PHP-FPM:n kanssa. Esimerkit käyttävät Debianin ja Ubuntun polkuja; RHEL-perheessä tiedostot ovat hakemistossa /etc/httpd/.
PHP liitetään PHP-FPM:n kautta mod_php:n sijaan
PHP-FPM:n kanssa PHP pyörii omissa prosesseissaan, erillään verkkopalvelimesta. Apache välittää pyynnöt mod_proxy_fcgi:n kautta. Apachen dokumentaation mukaan liitännällä SetHandler on etu verrattuna ProxyPassMatch-asetukseen: Apache yhdistää pyynnön ensin itse tiedostojärjestelmän tiedostoon ja välittää sen vasta sitten PHP-FPM:lle.
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/seite1.sock|fcgi://localhost/"
</FilesMatch>
Moduulit aktivoitte Debianilla ja Ubuntulla komennolla a2enmod proxy_fcgi. Joka siirtyy pois mod_php:stä, poistaa PHP-moduulin käytöstä ja vaihtaa sen jälkeen Prefork-MPM:stä Event-MPM:ään. Vanhan käyttötavan taustat selittää mod_php selitettynä: PHP Apache-prosessissa.
PHP-FPM:n puolella security.limit_extensions = .php kuuluu jokaiseen pooliin. PHP-käsikirjan mukaan FPM suorittaa muuten myös .phar-tiedostoja.
Apache PHP turvallisesti: ydinvalinnat
Jotkin asetukset koskevat koko palvelinta ja kuuluvat omaan asetustiedostoonsa, esimerkiksi /etc/apache2/conf-available/haertung.conf, aktivoituna komennolla a2enconf haertung.
# Lyhennä versiotiedot (mahdollista vain palvelinlaajuisesti)
ServerTokens Prod
ServerSignature Off
# Kytke TRACE-metodi pois
TraceEnable Off
# Periaatteessa mitään ei sallita, verkkosivustot sallivat kohdennetusti
<Directory />
Options None
AllowOverride None
Require all denied
</Directory>
Seuraava taulukko jäsentää tärkeimmät valinnat. Oletusarvot ja vaikutus ovat peräisin Apachen dokumentaatiosta.
| Direktiivi | Oletus | Suositus | Miksi |
|---|---|---|---|
ServerTokens |
Full |
Prod |
Server-otsake nimeää vain ”Apache” |
ServerSignature |
Off |
Off |
ei versiriviä virhesivujen alla |
TraceEnable |
on |
Off |
TRACE hylätään koodilla 405 |
Options |
FollowSymlinks |
-Indexes, symlinkit vain omistajan mukaan |
ei hakemistolistauksia |
AllowOverride |
None |
None |
.htaccess ei arvioida |
LimitRequestBody |
1 GiB (2.4.54:stä) | sopiva arvoon post_max_size |
hylkää suuret pyynnöt aikaisin |
Tärkeää AllowOverride-asetuksessa: monet jakelut ja CMS-ohjeet asettavat verkkojuurelle AllowOverride All. Silloin jokainen .htaccess-tiedosto voi muuttaa Rewrite-sääntöjä, käsittelijöitä ja mod_php:n kanssa jopa PHP-asetuksia. Hyökkääjä, jolla on kirjoitusoikeus upload-kansioon, voi asettaa sinne oman .htaccess-tiedoston. Asetuksella AllowOverride None tämä tie on suljettu.
VirtualHost mallipohjaksi
Seuraava VirtualHost yhdistää kohdat yhdelle verkkosivustolle. Varmennepolut, socketin ja hakemistot mukautatte. mod_ssl ja mod_headers on oltava aktiivisia.
<VirtualHost *:443>
ServerName www.example.de
DocumentRoot /var/www/seite1/public
SSLEngine on
SSLCertificateFile /etc/ssl/seite1/fullchain.pem
SSLCertificateKeyFile /etc/ssl/seite1/privkey.pem
<Directory /var/www/seite1/public>
Options -Indexes +SymLinksIfOwnerMatch
AllowOverride None
Require all granted
</Directory>
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/seite1.sock|fcgi://localhost/"
</FilesMatch>
# Estä versionhallinta ja ympäristötiedostot
<DirectoryMatch "/\.(git|svn|hg)">
Require all denied
</DirectoryMatch>
<FilesMatch "^\.env">
Require all denied
</FilesMatch>
# 32 MiB, sopii arvoon post_max_size = 32M
LimitRequestBody 33554432
Header unset X-Powered-By
Header always unset X-Powered-By
</VirtualHost>
Kaksinkertainen Header unset ei ole vahinko. Apachen dokumentaation mukaan mod_proxy_fcgi:n otsakkeet päätyvät eri sisäiseen tauluun kuin palvelimen omat otsakkeet; molemmilla muunnelmilla saatte kiinni molemmat tapaukset. Muita otsakkeita, jotka suojaavat kävijöitä aktiivisesti, kuvaa opas Verkkosivustojen tietoturvaotsakkeet.
Upload- ja välimuistikansiot tarvitsevat lisäksi suorituksen eston. Miten löydätte ja estätte kaikki kirjoitettavat kansiot, kerrotaan kohdassa PHP:n suorituksen kielto upload-kansioissa.
Moduulien karsinta ja tuloksen tarkistus
Jokainen ladattu moduuli on koodia, joka reagoi pyyntöihin. Tarkistakaa, mitkä moduulit ovat aktiivisia, ja kytkekää pois ne, joita ette tarvitse. Tyypillisiä ehdokkaita ovat autoindex, status ilman käyttörajoitusta, cgi ja userdir.
# Näytä aktiiviset moduulit
apachectl -M | sort
# Esimerkki Debian/Ubuntu: kytke hakemistolistausmoduuli pois
sudo a2dismod autoindex
# Tarkista asetukset ja lataa vasta sitten uudelleen
sudo apachectl configtest && sudo systemctl reload apache2
# Testi ulkopuolelta: TRACE:n pitäisi palauttaa 405, .git:n 403
curl -s -o /dev/null -w "%{http_code}\n" -X TRACE https://www.example.de/
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.git/HEAD
mod_status ansaitsee erityishuomion. Tilasivu näyttää käynnissä olevat pyynnöt osoitteineen ja kutsuttuine polkuineen. Jos sitä tarvitaan, rajatkaa pääsy direktiivillä Require ip hallintaverkkoihinne. Sama pätee PHP-FPM:n tilasivuihin, jotka on tehty saavutettaviksi Apachen kautta.
Älkää muuttako AllowOverride-asetusta ilman valmistelua. Siirtäkää ensin kaikkien .htaccess-tiedostojen säännöt VirtualHostiin ja testatkaa verkkosivusto kopiolla. Muuten uudelleenohjaukset ja siistit URL-osoitteet lakkaavat toimimasta uudelleenlatauksen jälkeen.
Lisäkerroksena sovelluksen edessä voi olla järkevää käyttää omaa Web Application Firewallia; aloituksen kuvaa ModSecurityn ja OWASP Core Rule Setin käyttöönotto.
Yhteenveto: järjestys voittaa yksittäisen toimenpiteen
Turvallinen Apache-asetus PHP:lle koostuu muutamasta, hyvin ymmärretystä rakennuspalikasta. PHP pyörii PHP-FPM:n kautta erillään verkkopalvelimesta, .htaccess ei ole käytössä, versiotiedot ja TRACE on kytketty pois, kokorajat sopivat PHP:hen ja kirjoitettavat kansiot eivät suorita skriptejä. Mikään näistä kohdista ei ole yksinään mullistava. Yhdessä ne varmistavat, ettei virhe yhdessä kohdassa johda heti palvelimen haltuunottoon.
Johdolle ja projektivastaaville toinen ominaisuus on lähes tärkeämpi: siisti asetus on jäljitettävissä. Kun kaikki säännöt ovat VirtualHostissa kymmenien .htaccess-tiedostojen sijaan, seuraavan kriittisen aukon kohdalla voi nopeasti tarkistaa, miten mikin verkkosivusto on liitetty. Lokakuun 2026 kaltaisessa tilanteessa se säästää juuri sen ajan, jolla on väliä.
Suunnitelkaa muutos silti rauhassa ja testiympäristön kanssa. Hätiköity vaihto mod_php:stä PHP-FPM:ään vähän ennen viikonloppua aiheuttaa todennäköisemmin uusia ongelmia kuin ratkaisee.
Miten PHP SOS auttaa konkreettisesti?
- Nykytilan tarkistus: Luemme koko Apache-asetuksen, kaikki aktiiviset moduulit ja kaikki
.htaccess-tiedostot. - Siirtymän suunnittelu: Missä mod_php pyörii yhä, valmistelemme vaihdon PHP-FPM:ään omilla pooleilla sivustoa kohden.
- Asetusten koventaminen: Asetamme ydinvalinnat, siirrämme
.htaccess-säännöt VirtualHosteihin ja estämme kirjoitettavat kansiot. - Testaus ja dokumentointi: Tarkistamme verkkosivustot ulkopuolelta jokaisen muutoksen jälkeen ja kirjaamme tilan palvelimen koventamisen yhteydessä.
Usein kysytyt kysymykset
Pitäisikö mod_php:tä vielä käyttää?
Uusiin käyttöönottoihin suosittelemme PHP-FPM:ää mod_proxy_fcgi:n kautta. PHP-tiimi arvioi PHP2Shellin riskin olevan korkein mod_php:n kohdalla. PHP-FPM:n kanssa PHP pyörii erillään verkkopalvelimesta, omilla käyttäjillä sivustoa kohden ja omilla rajoillaan.
Miksi AllowOverride None, jos CMS:ni tarvitsee .htaccess-tiedostoa?
Kuka tahansa, jolla on kirjoitusoikeus verkkojuureen, voi luoda .htaccess-tiedoston, myös sisäänajettu koodi. Asetuksella AllowOverride None Apache ei arvioi tällaisia tiedostoja. CMS:nne säännöt siirrätte silloin kertaluonteisesti VirtualHostiin. Se vaatii vähän vaivaa mutta tekee asetuksesta jäljitettävän ja nopeamman.
Voinko asettaa ServerTokens-arvon eri tavalla sivustoa kohden?
Et. Apachen dokumentaation mukaan ServerTokens on voimassa koko palvelimelle, eikä sitä voi muuttaa VirtualHostia kohden. Se ohjaa samalla versiotietoa virhesivujen alla, jonka ServerSignature näyttää.
Mikä on LimitRequestBody-asetuksen oletusarvo?
Apache 2.4.54:stä lähtien oletus on 1 GiB, versiossa 2.4.53 ja vanhemmissa se oli rajoittamaton. Asettakaa arvo PHP-asetustenne post_max_size-arvon mukaan, jotta liian suuret pyynnöt hylätään jo verkkopalvelimessa.