Op het ticket staat 'Toestemming geweigerd' op opslag/logs. Het snelle antwoord: chmod -R 777 opslag. De app werkt weer. Drie maanden later wordt een .php opgeslagen in storage/uploads uitgevoerd omdat nginx nog steeds deze map bedient.
Webrechten zijn geen Unix-bureaucratie: scheiding tussen code, gegevens, uploads en uitvoering.
Aanbevolen model
Code (git-implementatie): menselijke/CI-eigenaar, alleen-lezen op internet. Gegevens (opslag, cache): gericht schrijven naar www-data. Uploads: subboom zonder tolk.
| Pad | Eigenaar | Mode | Opmerking |
|---|---|---|---|
| app/ | implementeren:www-data | 750/640 | geen upload |
| opslag/ | www-gegevens | 770 richt | logboeken, cache |
| openbaar/uploads | www-gegevens | 750 | noexec indien mogelijk |
umask en systemd
umask 027 of 002 afhankelijk van het groepsmodel. PHP-FPM user=www-data, aparte pool per multi-tenant app.
Vermijd het uitvoeren van implementatiescripts als root zonder definitieve chown.
nginx / Apache
locatie ^~ /uploads/ { locatie ~ \.php$ { alles weigeren; } } — blokkeer uitvoering, zelfs als het .php-bestand is geüpload.
Afzonderlijke vhost-gebruiker als gedeelde hosting beperkt is.
ACL voor kromme gevallen
setfacl -m u:www-data:rwX storage zonder wereld te openen. Reset ACL na herstelback-up - vaak vergeten.
Geautomatiseerde audit
Script na implementatie: mislukt als find . -perm -0002. Waarschuwingen over SUID nieuw. Documenteer tijdelijke uitzondering met ticket en vervaldatum.
Controle van uitdrukkelijke machtigingen
zoek /var/www -type f -perm -0002
zoek /var/www -type d -perm -0002
zoek /var/www -naam '*.php' -pad '*/uploads/*'
Correct: chown implement:www-data, chmod 640 files / 750 dirs, nginx deny PHP-uploads.
Documenteer uitzonderingen met ticket en vervaldatum. Scan het CI opnieuw na de implementatie.
Ontwikkelaarstraining: “toestemming geweigerd” → strace/id/groups vóór chmod.
Een enkele, voor iedereen schrijfbare uploadmap is voldoende voor kleine compromissen in de toeleveringsketen van het CMS.
SELinux/AppArmor op geharde distributies: chcon soms vereist na implementatie - documentcontexten, niet alleen chmod.
Containers: volume-mount UID-toewijzing — toestemming geweigerd op mysterieuze wijze, vaak UID-host ≠ containergebruiker.
Technische schuldmachtigingen
Audit-erfenis: oude provider chmod 777 storage nergens gedocumenteerd. Sprintherstelplan: nginx deny + ACL + chown.
PHP-FPM-poolgebruiker per multi-tenantclient indien gedeeld op maat: isolatie door Unix-gebruiker > chmod-wereld.
Git houdt standaard geen permissies bij; indien nodig zijn er hook-herstelmodi na het afrekenen.
Operationele samenvatting
De juiste rechten op webhosting scheiden lezen, schrijven en uitvoeren per rol: implementeren schrijft code, www-data schrijft uploads en cache, niemand voert PHP uit bij uploads. Het gedeelde systeem compenseert soms met open_basedir; VPS vereist expliciete discipline.
Webshell-audit na een incident: chmod alleen onvoldoende - nginx weigert uitvoering, rotatiegeheimen, vectoruploadanalyse. Integreer scanmachtigingen in CI-implementatie. Training: toestemming geweigerd → eigenaar/groep vóór modus.
Stap voor stap handleiding
- Identificeer gebruiker PHP-FPM (
ps aux | grep php-fpm). - Geef de webroot van de huidige eigenaar weer (
namei -l /var/www/app/public). - Pas implement:www-data 750/640 toe op code.
- opslag en upload 770/750 www-data.
- nginx weigert PHP bij uploads.
- Scan CI wereldbeschrijfbaar.
- Documenteer uitzonderingen.
Bij een kwaadaardig uploadincident: isoleer vhost, bewaar het bestand voor analyse, roteer het DB-wachtwoord als er een vermoeden bestaat van SQL-injectie, herstel de machtigingen van IaC en niet handmatige chmod-paniek.
Houd een gedateerd runbook bij, voor/na-statistieken en beoordeling na incidenten: cumulatieve discipline voorkomt paniek op vrijdagavond.
Houd een gedateerd runbook bij, voor/na-statistieken en beoordeling na incidenten: cumulatieve discipline voorkomt paniek op vrijdagavond.
Houd een gedateerd runbook bij, voor/na-statistieken en beoordeling na incidenten: cumulatieve discipline voorkomt paniek op vrijdagavond.
Houd een gedateerd runbook bij, voor/na-statistieken en beoordeling na incidenten: cumulatieve discipline voorkomt paniek op vrijdagavond.
Houd een gedateerd runbook bij, voor/na-statistieken en beoordeling na incidenten: cumulatieve discipline voorkomt paniek op vrijdagavond.
Houd een gedateerd runbook bij, voor/na-statistieken en beoordeling na incidenten: cumulatieve discipline voorkomt paniek op vrijdagavond.
CMS
WP uploadt niet-exec, Laravel-opslag is alleen beschrijfbaar. Symlink implementeert machtigingen voor current.
Beslis en ga vooruit zonder blinde vlek
- Identificeer de PHP-FPM-gebruiker —
namei -lin webroot, eigenaar implement:www-data. - Pas 750/640 toe op de code — opslag en uploads 770/750, nginx weigert PHP in uploads.
- Scan wereldbeschrijfbaar — vind in post-implementatie CI, ticketuitzonderingen met vervaldatum.
- Train de ontwikkelaars — toestemming geweigerd → strace/id/groups vóór chmod 777 paniek.
- Herstellen vanuit IaC na kwaadwillig uploadincident — geen handmatige nood-chmod.
Gedeeld versus VPS: vergelijk de limieten via de overzicht en onze beveiligingsgidsen.
Veelgestelde vragen
chmod 755 of 775 voor een website?
755 op statische bestanden als www-data alleen leest. 775 alleen als meerdere gebruikers in de groep moeten schrijven: strikte groep, nooit schrijfbaar voor iedereen.
Eigenaar www-data of inzetten?
App-bestanden: implementeren: www-data 640, mappen 750. Uploads: www-data beschrijfbaar, PHP-uitvoering uitgeschakeld in uploadmap via nginx.
ACL versus recursieve chmod?
setfacl voor specifieke gevallen (deploy + www-data). chmod -R 777 is een anti-patroon dat het echte gebruiker/groepsconflict verbergt.
Hoe auditeren?
vind schrijfbaar voor iedereen, vind onverwachte SUID, controleer uploadpaden. Integreer in CI of script na implementatie.
Toestemming voor volgende fout geweigerd: wijzig eigenaar vóór modus – altijd in die volgorde.
