Aktuellt läge: PHP2Shell. Två kritiska PHP-sårbarheter (CVSS 9,2) tillåter skadlig kod utan inloggning. Patchar sedan den 21 oktober 2026.Vad som bör göras nu →

Konfigurera Apache för PHP säkert

Apache är flexibel, och just det gör den känslig för felkonfiguration. Så kopplar ni in PHP via PHP-FPM, stänger .htaccess som bakdörr och ställer in de viktigaste kärnalternativen säkert.

Aktualitet 6 min läsningHärdning och konfiguration

Kort sagt: För att konfigurera Apache för PHP säkert kopplar ni in PHP via PHP-FPM och mod_proxy_fcgi, stänger av .htaccess med AllowOverride None och sätter ServerTokens Prod, ServerSignature Off, TraceEnable Off och Options -Indexes. LimitRequestBody anpassar ni till PHP-gränserna, moduler som inte behövs stänger ni av. Konfigurationen ersätter ingen PHP-uppdatering men minskar angreppsytan tydligt.

Apache efter PHP2Shell: mer än en omstart

Apache-operatörer stod i oktober 2026 under särskilt tryck. PHP-teamet bedömer risken som störst vid mod_php, eftersom en exploit där har visats innan någon applikationskod alls körs. De akuta stegen, alltså patchning och fullständig omstart, beskriver sidan Varför mod_php bär den högsta risken.

Efter patchen återstår frågan hur bra själva Apache-konfigurationen är. Servrar som vuxit fram över tid bär ofta inställningar från många år: kataloglistor, öppna .htaccess-rättigheter, moduler som ingen längre behöver. Var och en av dem kan göra ett senare fel större än det behövde vara.

Det här inlägget beskriver en smal, säker grundkonfiguration för Apache 2.4 med PHP-FPM. Exemplen använder sökvägar för Debian och Ubuntu; i RHEL-familjen ligger filerna under /etc/httpd/.

Koppla in PHP via PHP-FPM i stället för mod_php

Med PHP-FPM körs PHP i egna processer, skilt från webbservern. Apache lämnar förfrågningar vidare via mod_proxy_fcgi. Enligt Apache-dokumentationen har inkopplingen via SetHandler en fördel jämfört med ProxyPassMatch: Apache kopplar först själv förfrågan till en fil i filsystemet och lämnar sedan först vidare till PHP-FPM.

<FilesMatch "\.php$">
    SetHandler "proxy:unix:/run/php/seite1.sock|fcgi://localhost/"
</FilesMatch>

Modulerna aktiverar ni under Debian och Ubuntu med a2enmod proxy_fcgi. Den som byter från mod_php avaktiverar PHP-modulen och växlar därefter från prefork- till event-MPM. Bakgrund om det gamla driftläget förklarar mod_php förklarat: PHP i Apache-processen.

På PHP-FPM-sidan hör security.limit_extensions = .php hemma i varje pool. Enligt PHP-manualen kör FPM annars även .phar-filer.

Konfigurera Apache för PHP säkert: kärnalternativen

Vissa inställningar gäller för hela servern och hör hemma i en egen konfigurationsfil, till exempel /etc/apache2/conf-available/haertung.conf, aktiverad med a2enconf haertung.

# Korta versionsuppgifter (bara servergemensamt möjligt)
ServerTokens Prod
ServerSignature Off

# Stäng av TRACE-metoden
TraceEnable Off

# Tillåt i grunden ingenting, webbplatser öppnar riktat
<Directory />
    Options None
    AllowOverride None
    Require all denied
</Directory>

Tabellen nedan placerar de viktigaste alternativen. Standardvärden och verkan kommer från Apache-dokumentationen.

Direktiv Standard Rekommendation Varför
ServerTokens Full Prod Server-huvudet anger bara ”Apache”
ServerSignature Off Off ingen versionsrad under felsidor
TraceEnable on Off TRACE avvisas med 405
Options FollowSymlinks -Indexes, symlänkar bara efter ägare inga kataloglistor
AllowOverride None None .htaccess utvärderas inte
LimitRequestBody 1 GiB (sedan 2.4.54) passande till post_max_size avvisa stora förfrågningar tidigt

Viktigt vid AllowOverride: många distributioner och CMS-anvisningar sätter AllowOverride All för webbroten. Då kan varje .htaccess-fil ändra rewrite-regler, handlers och vid mod_php till och med PHP-inställningar. En angripare med skrivrättigheter i en uppladdningsmapp kan där lägga en egen .htaccess. Med AllowOverride None är den vägen stängd.

En VirtualHost som mall

Följande VirtualHost förenar punkterna för en enskild webbplats. Certifikatsökvägar, socket och kataloger anpassar ni. mod_ssl och mod_headers måste vara aktiva.

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

    # Spärra versionshantering och miljöfiler
    <DirectoryMatch "/\.(git|svn|hg)">
        Require all denied
    </DirectoryMatch>
    <FilesMatch "^\.env">
        Require all denied
    </FilesMatch>

    # 32 MiB, passande till post_max_size = 32M
    LimitRequestBody 33554432

    Header unset X-Powered-By
    Header always unset X-Powered-By
</VirtualHost>

Det dubbla Header unset är inget misstag. Enligt Apache-dokumentationen hamnar huvuden från mod_proxy_fcgi i en annan intern tabell än huvuden från servern själv; med båda varianterna fångar ni båda fallen. Fler huvuden som aktivt skyddar besökare beskriver guiden Säkerhetsrubriker för webbplatser.

Uppladdnings- och cachemappar behöver dessutom en körspärr. Hur ni hittar och spärrar alla skrivbara mappar står under Förbjud PHP-körning i uppladdningsmappar.

Rensa ut moduler och kontrollera resultatet

Varje laddad modul är kod som reagerar på förfrågningar. Kontrollera vilka moduler som är aktiva och stäng av det ni inte behöver. Typiska kandidater är autoindex, status utan åtkomstbegränsning, cgi och userdir.

# Visa aktiva moduler
apachectl -M | sort
# Exempel Debian/Ubuntu: stäng av modulen för kataloglistor
sudo a2dismod autoindex
# Kontrollera konfigurationen och ladda först därefter om
sudo apachectl configtest && sudo systemctl reload apache2
# Test utifrån: TRACE ska ge 405, .git 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

Särskild uppmärksamhet förtjänar mod_status. Statussidan visar pågående förfrågningar med adresser och anropade sökvägar. Behövs den begränsar ni åtkomsten med Require ip till era förvaltningsnät. Detsamma gäller PHP-FPM:s statussidor som gjorts nåbara via Apache.

Viktigt

Ställ inte om AllowOverride utan förberedelse. För först över reglerna från alla .htaccess-filer till VirtualHost och testa webbplatsen på en kopia. Annars fungerar omdirigeringar och vackra URL:er inte längre efter omladdningen.

Som ytterligare ett lager framför applikationen kan en egen Web Application Firewall vara meningsfull; ingången beskriver Använd ModSecurity och OWASP Core Rule Set.

Slutsats: ordning slår enskilda åtgärder

En säker Apache-konfiguration för PHP består av få, väl förstådda byggstenar. PHP körs via PHP-FPM skilt från webbservern, .htaccess utvärderas inte, versionsuppgifter och TRACE är avstängda, storleksgränserna passar PHP och skrivbara mappar kör inga skript. Ingen av punkterna är spektakulär i sig. Tillsammans ser de till att ett fel på ett ställe inte genast leder till att servern tas över.

För ledning och projektansvariga är en andra egenskap nästan viktigare: en städad konfiguration är spårbar. Står alla regler i VirtualHost i stället för utspridda i dussintals .htaccess-filer går det snabbt att vid nästa kritiska sårbarhet kontrollera vilken webbplats som är inkopplad hur. I ett läge som i oktober 2026 sparar det just den tid det handlar om.

Planera ändå omställningen i lugn och ro och med testmiljö. Ett förhastat byte från mod_php till PHP-FPM strax före en helg skapar snarare nya problem än det löser.

Hur hjälper PHP SOS konkret?

  • Kontrollera beståndet: Vi läser ut hela Apache-konfigurationen, alla aktiva moduler och alla .htaccess-filer.
  • Planera övergången: Där mod_php fortfarande körs förbereder vi bytet till PHP-FPM med egna pooler per webbplats.
  • Härda konfigurationen: Vi sätter kärnalternativen, för över .htaccess-regler till VirtualHost och spärrar skrivbara mappar.
  • Testa och dokumentera: Efter varje ändring kontrollerar vi webbplatserna utifrån och dokumenterar läget inom ramen för serverhärdningen.

Vanliga frågor

Bör jag fortfarande använda mod_php?

För nya installationer rekommenderar vi PHP-FPM via mod_proxy_fcgi. PHP-teamet bedömer risken från PHP2Shell som störst vid mod_php. Med PHP-FPM körs PHP skilt från webbservern, med egna användare per webbplats och egna gränser.

Varför AllowOverride None om mitt CMS behöver .htaccess?

En .htaccess kan skapas av var och en som får skriva i webbroten, även inplanterad kod. Med AllowOverride None utvärderar Apache inte sådana filer. Ert CMS:s regler för ni då en gång över till VirtualHost. Det är lite arbete men gör konfigurationen spårbar och snabbare.

Kan jag sätta ServerTokens olika per webbplats?

Nej. Enligt Apache-dokumentationen gäller ServerTokens för hela servern och kan inte ändras per VirtualHost. Det styr samtidigt versionsuppgiften under felsidor som ServerSignature visar.

Vilket standardvärde har LimitRequestBody?

Sedan Apache 2.4.54 ligger standard på 1 GiB, i version 2.4.53 och äldre var det obegränsat. Sätt värdet så att det passar post_max_size i er PHP-konfiguration, så att för stora förfrågningar avvisas redan i webbservern.

Källor

Direktkontakt

Varje timme räknas. Skriv till oss nu.

Beskriv kort system, PHP-version och observation. Vi hör av oss, klarlägger läget och arbetar på distans tills incidenten är avslutad och dokumenterad.

Direkthjälp