Mappen, bestanden & rechten - 2019 (WordPress)

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

Op Unix kennen bestanden en mappen een eigenaar plus diverse rechten (schrijven, lezen en executie) voor verschillende partijen (eigenaar, groep, overig) en nog wat liflafjes. Het is een interessant puzzeltje om dat goed in te stellen, waarbij 'goed' afhankelijk is van oa. de context. Welkom bij de ingang van het konijnenhol.

  • Dit artikel heeft voornamelijk betrekking op productie-omgevingen
  • Met bestanden wordt vaak zowel bestanden als mappen bedoeld, omdat deze vaak hetzelfde zijn.

Het problemen

  • Beveiliging: Bestandsinstellingen is primair een beveiligingsprobleem: Rechten wil je zoveel mogelijk beperken, ten einde beveiligingsissues zoveel mogelijk te beperken
  • Gebruiksgemak: Naast veilig, moet een oplossing uiteraard ook werkbaar zijn. Gebruiksgemak is minder een issue voor productie-omgevingen (waar als het goed is, je eigenlijk nooit 'werkt'), dan voor ontwikkel-omgevingen
  • Flexibiliteit: Specifieker: WordPress kan zichzelf updaten. Heel flexibel, maar tegelijkertijd een beveiligings-issue, want een gekraakte WordPress-site kan zichzelf updaten op manieren die je niet wilt
  • Kennis: Misschien eigenlijk wel het grootste issue: De materie rondom bestandsattributen is vrij complex. Vermoedelijk is de kennis van de beheerder van deze materie, nog wel de belangrijkste factor.

Waarschijnlijk komen al deze aspecten tezamen in de vraag wie moet wat kunnen?

Wie moet wat kunnen?

Webserver/WordPress moet kunnen lezen

Het meest voor de hand liggende: De webserver moet de bestanden van (in dit geval) een WordPress-instantie kunnen lezen. Met Webserver, Apache en WordPress bedoel ik in deze context meestal hetzelfde.

Beheerder moet kunnen lezen

In de praktijk wordt het leven van de beheerder (ikzelf) nogal lastig als ik de bestanden van een instantie niet kan lezen → Beheerder moet kunnen lezen.

Mag WordPress zichzelf updaten?

WordPress kan zichzelf updaten. Da's oa. handig om snel beveiligingslekken te dichten, bv. zero-day exploits. Het heeft echter een vergaande security-consequentie: Apache/WordPress moet dan schrijftoegang hebben tot alle mappen en bestanden (maar geen executie-rechten). Is dat gewenst?

Wat Digital Ocean hierover schrijft:

WordPress has the ability to update itself. That means that somehow, the process probably associated with Apache, 
needs to be able to read and write all files in a WordPress instance

* Is that a desirable situation? It makes a site much more funerable to hacking
* If so, how to implement this? Make the Apache-process owner of all files? Or simply enable ''Others'' to read & write?

...

First, I would strongly recommend not setting your permissions to 777. This is 
a serious security concern. The user wp-user does not exist by default on Ubuntu 
and is likely left over from the host you exported your site from. All your web 
files should be owned by www-data. Assuming your web root remains /var/www/html 
(the default on the WP one-click image) you can fix the ownership with:

chown -Rf www-data.www-data /var/www/html

Ik kies ervoor dat WordPress zichzelf inderdaad mag updaten (lente 2018). Bijkomstig voordeel: Ik hoef geen aparte rechten in te stellen voor mappen zoals Uploads.

Een mogelijk alternatief:

  • Script uitvoeren die de rechten verruimt
  • Updates toepassen
  • Script uitvoeren om rechten weer terug te draaien.

Deze procedure zou zelfs in één kort script kunnen.

Schrijfrechten WordPress specifieke mappen

Indien je hebt besloten dat WordPress zichzelf niet mag updaten, moet je wellicht voor diverse specifieke mappen alsnog schrijftoegang instellen (bv. wp-content/uploads). Aangezien ik ervoor kies dat WordPress zichzelf mag updaten, behandel ik dit niet verder hier.

Update via CLI

Via de terminal (CLI - command line interface) kun je leuke dingen doen met een WordPress-instantie, waaronder updates. Die kan ik doen vanuit m'n eigen beheer-account, of middels sudo -u vanuit het Apache-account (details verderop).

Update via GUI

De WordPress-GUI (dus de site in een browser) is een proces van Apache/WordPress/Webserver. Als die mag schrijven, kun je de site updaten via een browser. Als je WordPress alleen schrijfrechten geeft tot bepaalde mappen (bv. uploads of vertalingen, of plugins), dan kunnen alleen die onderdelen via de GUI bijgewerkt worden.

Nooit Root

Als je ooit sudo nodig hebt om als beheerder iets operationeels te doen, dan klopt er iets niet aan de instellingen. WordPress geeft een waarschuwing als je via de CLI wp gebruikt als beheerder. Voorbeeld:

sudo wp core update
Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that 
your WordPress install exists under.

If you REALLY mean to run this as root, we won't stop you, but just bear in mind that any code on this 
site will then have full control of your server, making it quite DANGEROUS.

If you'd like to continue as root, please run this again, adding this flag:  --allow-root

If you'd like to run it as the user that this site is under, you can run the following to become the 
respective user:

    sudo -u USER -i -- wp <command>

Update core via CLI

wp core update geeft een foutmelding, als www-data de standaard-eigenaar is, en ik het commando uitvoer:

> wp core update

Unable to open /var/www/example.com/wp-content/wflogs/ips.php for reading and writing.

Uitvoeren als root is ook geen oplossing. De echte oplossing is gelukkig eenvoudig, en WordPress is uitermate behulpzaam:


En dit werkt super:

sudo -u www-data wp core update

Update core via GUI

Op het moment dat je een site update via de GUI, is het al het Apache-proces dat de update uitvoert. Je hoeft dus niet van user te wisselen zoals bij updaten via de CLI.

Plan van Aanpak

Enkele manieren om rechten te configureren:

  1. Webserver: Alle mappen & bestanden zijn van het webserver-proces (meestal www-data)
  2. Van mij: Alle mappen & bestanden zijn van mij
  3. Other: Alle mappen & bestanden zijn van x. Nadere instellingen zijn geconfigureerd via o - others
  4. Groups: Rechten beheren middels groups
  5. Geavanceerd: Gebruik een geavanceerd systeem voor rechtenbeheer zoals mountpoint [1].

De aanpak hangt voor mij van de situatie af:

  • Ontwikkelomgeving (=m'n laptop): van mij-aanpak
  • Productieomgeving: Other-aanpak.

Webserver

Ooit leek het zo simpel te zijn: Alle bestanden en mappen zijn van de webserver (in mijn geval 'www-data). In de praktijk lijkt dat te simpel te zijn → Zie Other-aanpak.

Van mij

Hier is geen twijfel over: Op m'n ontwikkelomgeving ben ik de eigenaar van alle bestanden en mappen. Anders wordt het te ingewikkeld. De hele map /var/www is van mij, en ik mag alles

Other

  • Als uitgangspunt is de webserver (www-data in mijn geval) eigenaar van alle bestanden en mappen. In de praktijk lijkt dat dermate beperkt te zijn, dat het eigenlijk niet bijster veel uitmaakt of ik nou de eigenaar ben, of de webserver, of een derde entiteit - Zo lang het uiteraard maar niet root is
  • Op plekken waar de webserver schrijftoegang heeft, wordt dit geconfigueerd middels other, bv. chmod o+rw /var/www/example/com/wp-content/uploads (slecht voorbeeld?)
  • → Dit kan een stuk verfijnder. Ihb. configuratie van rechten én eigenaarschap (zie script voor uitleg).

Script (lente 2018)

#!/bin/bash
#
###################################################################################

###################################################################################
# Intro & manual
###################################################################################
#
echo " "
echo " "
echo "============================================================"
echo "wp_rights - Set folder & file rights in a WordPress instance"
echo "============================================================"
echo " "
echo "Set rights as suitable on a webserver. This may not be"
echo "desirable for a development environment"
echo "Details: http://wiki.devliegendebrigade.nl/Mappen,_bestanden_%26_rechten_(WordPress)"
echo " "
echo "Argument 1 - Absolute path (required)"
echo " "
echo "Example"
echo "======="
echo "wp_rights /var/www/example.com"
echo " "

owner="www-data"

##############################################################
# Process input arguments
##############################################################
#
echo " "
echo "Processing input arguments..."
echo "============================="

working_dir=$1

if [ -z "$working_dir" ];	then 
	echo "No path provided. Exiting"
	exit 
else
	echo "Path is provided"	
fi

if [ ! -d "$working_dir" ]; then
	echo "Path doesn't exist. Exiting"
	exit
else
	echo "Path does exist"	
fi	

echo "Provided path: $working_dir"
echo "Owner: $owner"

##############################################################
# Set ownership on all files & folders
##############################################################
#
echo " "
echo "Set ownership on all files & folders..."
echo "======================================="

sudo chown -Rv "$owner:$owner" $working_dir


##############################################################
# Bottom line: Nobody allowed anything
##############################################################
#
echo " "
echo "Bottom line: Nobody allowed anything..."
echo "======================================="

sudo chmod -Rv 000 $working_dir


##############################################################
# Make folders executable to all
##############################################################
#
# Too cumbersome to limit this
#
echo " "
echo "Make folders executable to all..."
echo "=================================="

sudo chmod -Rv +X $working_dir


##############################################################
# Make folders readable to all
##############################################################
#
# Too cumbersome to limit this
#
echo " "
echo "Make folders readable to all..."
echo "================================"

sudo find $working_dir -type d -exec chmod o+r {} \;


##############################################################
# Make folders & files readable & writeable to "www-data"
##############################################################
#
# * Otherwise, WordPress can't update itself
# * More: wiki.devliegendebrigade.nl/Mappen,_bestanden_%26_rechten_(WordPress)
#
echo " "
echo "Make folders & files readable & writeable to www-data'..."
echo "========================================================="

sudo chmod -Rv u+rw $working_dir


##############################################################
# Finished
##############################################################
#
echo " "
echo "Finished"
echo "========"

Zie ook

Bronnen