due chiacchiere

Gestire i permessi delle cartelle di WordPress

La scorsa volta abbiamo visto come sottoporre il nostro codice ad un rigido regime di versionamento, che ci consente di poter tornare indietro nel tempo se qualcosa dovesse storto durante un aggiornamento. Questo sfortunatamente non basta ad evitare che malintenzionati di tutti i tipi provino a scassinare la porta sul retro per intrufolarsi dietro le quinte del tuo sito. A me ad esempio è capitato che un plugin avesse una vulnerabilità che consentiva a quei loschi figuri di scrivere file HTML nella cartella wp-content del sito. Per fortuna me ne sono accorto immediatamente, ed ho ripristinato in pochi minuti tutte le cartelle e la base di dati usando proprio i repo di GitHub di cui abbiamo parlato. Per scoraggiare tentativi simili, ho attivato l’autenticazione a due fattori per accedere al pannello di controllo, tramite il plugin iThemes Security Pro (soldi ben spesi), sebbene i tipi non fossero entrati da nessuna parte. Poi ho escogitato un sistema che rimuove i permessi di scrittura da tutti i file del sito esclusa la cartella uploads.
Eccoti uno spunto di cosa puoi scrivere (sono certo che si possa fare di meglio, io mi considero un principiante della shell di Linux):

CURRENT_PERMS=$(stat -c '%a' ~/www/config.php)
if [[ $CURRENT_PERMS == "755" || $1 == "lock" ]]; then
  chmod -R 555 ~/www/content/themes/
  chmod -R 555 ~/www/content/plugins/
  chmod -R 555 ~/www/wp/
else
  chmod -R 775 ~/www/content/themes/
  chmod -R 775 ~/www/content/plugins/
  chmod -R 775 ~/www/wp/
fi

Questo script assume che il tuo utente SSH e l’utente con cui gira il web server facciano parte dello stesso gruppo. Your mileage may vary, come direbbero in America. Supponendo di aver salvato queste righe di codice in un file chiamato perms.sh, ti basterà digitare /path/to/perms.sh per aprire e chiudere i permessi prima di applicare un aggiornamento di un plugin o di un tema con lo script che abbiamo visto la volta scorsa. In uno dei server che gestisco, il sistemista ha installato le Access Control Lists, ed i permessi me li fa gestire con due comandi getfacl e setfacl, ma sono consapevole del fatto che non tutti hanno strumenti così sofisticati sui propri server.

Dovendo lasciare la cartella degli uploads aperta e scrivibile dal server web, ho poi provveduto ad implementare un semplice script (chiamato monitor.sh) eseguito ogni 10 minuti tramite cron del sistema:

#!/bin/sh

if [[ -z "$1" ]]; then
    echo -e "Usage: monitor.sh /var/www/html/wp-content/uploads"
    exit 1
fi

# Does the folder exist?
if [ ! -d "$1" ]; then
    echo "Error: Path $1 does not exist. Aborting."
    exit 1
fi

find $1 -not -name "*.webp" \
  -not -name "*.gif" \
  -not -name "*.pdf" \
  -not -name "*.webp" \
  -not -name "*.doc*" \
  -not -name "*.jp*" \
  -not -name "*.xl*" \
  -not -type d \
   -size +0b \
   -exec ls -ldgG {} \; | awk '{if ($3 > 100) print $3 " " $7}'

Questo script fa generare un’email da cron se nota nella cartella in questione un file con un’estensione che non dovrebbe essere lì, tipo PHP o HTML. In questo modo posso essere avvisato subito se sta succedendo qualcosa di sospetto tra le cartelle del sito.

Commenti

  1. Ellenic ha detto:

    Una domanda.
    Tutto bello e chiaro, ma quanti hanno una installazione di WP su un server con accesso SSH e possibilità di lanciare script?

    L’utente medio usa servizi di hosting condiviso dove tutto questo semplicemente non è fattibile.

    1. camu ha detto:

      Hai ragione, era una premessa che avevo fatto in uno dei primi post di questa serie. Se hai un piano condiviso da 10 euro all’anno, queste istruzioni non hanno troppo senso. Ma se paghi quella cifra, vuol anche dire che reputi che non sia un problema se il sito è offline per qualche ora (o giorno) o se qualche malintenzionato s’intrufola dalla porta sul retro. Comunque oggi con piani tipo quelli offerti da SupportHost, a prezzi ragionevoli hai tutto quello di cui parlo in questa serie.

Lascia un commento