Pagine

31 maggio 2011

Mettere in sicurezza una installazione di Wordpress

Tutti gli addetti ai lavori lo sanno: Wordpress è un meraviglioso strumento per il blogging facile e immediato anche per i poco esperti. Con le sue estensioni è pure capace di diventare un discreto CMS (Content Management System), ma per quanto riguarda la sicurezza... è un colabrodo!
In internet non si contano gli strumenti che hacker (o meglio cracker) smaliziati mettono a disposizione di malintenzionati per bucare un sito basato su wordpress prendendone il completo controllo.
Wordpress purtroppo non nasce con delle grandi contromisure da mettere in campo per evitare di essere "sfondato". Solo le più recenti versioni si stanno irrobustendo, e quindi mettere in campo delle linee generali di sicurezza utilizzabili indipendentemente dalla versione installata non mi pare una brutta idea.

Si lo so, lo so, è risaputo che non esiste alcun modo di impedire ad un bravo cracker di acquisire il controllo di un server e tantomeno di impedirgli di fare quel che vuole col nostro sito in wordpress, ma certamente possiamo evitare di lasciargli le chiavi sotto lo zerbino e cercare almeno di rendergli le cose difficili al punto da impegnarlo per un tempo a lui sconveniente.

Quindi vediamo quali dovrebbero essere i passi da seguire per ottenere una installazione di wordpress il più possibile sicura:
  1. Il sistema operativo.
    Diamo per scontato che non siate dei masochisti e quindi vogliate un server che gestisce la sicurezza nel migliore dei modi. Non che io abbia qualcosa da dire contro IIS (o meglio ce l'avrei eccome), ma la scelta dovrebbe ricadere su un sistema Unix like, meglio se Linux che gestisce "da sempre" la sicurezza in modo diciamo "diverso".
    Supponiamo quindi l'uso di Apache 2 sulla distribuzione Linux che più vi aggrada (Debian, Ubuntu, Centos, ecc..), non mi dilungherò in merito alla scelta perché la questione è ampia e esula da questa guida, l'importante è che tutto sia aggiornato alle ultime versioni.
  2. La versione di wordpress.
    Accertiamoci di avere la versione più recente possibile di wordpress. Ogni nuovo rilascio normalmente corregge una serie di bug presenti nel precedente. Questo aumenta di per se la sicurezza della nostra installazione di wordpress.
  3. Il database.
    Normalmente il database server utilizzato è MySql ed è bene configurarlo creando uno user dedicato per ogni installazione di wordpress. Lo user deve ovviamente avere una solida password ed è bene settare anche da quale IP questo user può accedere. Se il database server è sulla stessa macchina dove sarà ospitato wordpress useremo "localhost" altrimenti l'IP del server web.
    Se si ha accesso al database server si può procedere a riga di comando con le query:
    1. Creazione dello user:
      CREATE USER '<mio_user>'@ 'localhost' IDENTIFIED BY '<mio_user_password>';
    2. Assegnazione allo user dei privilegi di usabilità massima del database server:
      GRANT
      USAGE ON * . * TO '
      <mio_user>'@ 'localhost' IDENTIFIED BY '<mio_user_password>' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
    3. Creazione del database:
      CREATE DATABASE `
      <mio_db_wordpress>` ;
    4. Assegnazione di tutti i privilegi sul database:
      GRANT ALL PRIVILEGES ON `
      <mio_db_wordpress>` . * TO '<mio_user>'@ 'localhost';
    Se invece abbiamo il pannello amministrativo phpMyAdmin allora possiamo fare la stessa cosa in maniera più semplice usando la pagina "privilegi".
    1. La configurazione.
      Le nuove versioni di wordpress consentono, non appena installato il software sul server web, di avviare la procedura guidata di configurazione. Questo evita di procedere manualmente duplicando il file wp-config-sample.php col nuovo nome wp-config.php presente nella directory radice della vostra installazione.
      La procedura automatica nasconde anche due importanti passaggi che altrimenti dovremmo fare a mano:
      1. Generare automaticamente le parole casuali da 64 caratteri usate nelle cifrature e da associare alle costanti (le trovate nel file wp-config.php):
        AUTH_KEY
        SECURE_AUTH_KEY
        LOGGED_IN_KEY
        NONCE_KEY
        AUTH_SALT
        SECURE_AUTH_SALT
        LOGGED_IN_SALT
        NONCE_SALT
      2. Cambiare il valore della variabile $table_prefix da "wp_" in qualcosa di più complesso e casuale tipo "aCmE123_". Questo prefisso è usato da wordpress per generare i nomi di tutte le tabelle del database e l'operazione rende più difficile un attacco di database injection.
    2. Non usare lo user admin.
      Lo user admin è l'amministratore di default di ogni installazione wordpress. Durante un attacco è ovvio supporre che si tenti di indovinare la password di tale utente. Se invece questo utente non esiste e lo user amministrativo è noto solo a pochi allora la sicurezza ne gioverà certamente. Durante la procedura di installazione automatica quando ci viene chiesto lo username dell'account amministrativo si consiglia di inserirne uno che poco abbia a che fare con: admin, administrator, root, amministratore, ecc...
      E' ovvio che pure la password deve essere solida e possibilmente non composta di tutte lettere o tutti numeri.
    3. Non usare l'FTP.
      Per sua natura l'FTP è un protocollo facilmente bucabile che sconsiglio caldamente di utilizzare per accedere alla nostra installazione di wordpress. Al suo posto possiamo usare SSH e la shell (terminale, riga di comando) o l'FTP su SSH (SFTP).
    4. Permessi ai file e alle directory.
      Se lo user col quale abbiamo accesso alla nostra installazione di wordpress ce lo consente dobbiamo modificare il proprietario e i permessi di accesso ai file. Posizioniamoci nella cartella dove abbiamo installato wordpress e diamo questi comandi:
      1. cambiamo il proprietario di tutti i file e le directory:
        chown -R root:root ./*
      2. diamo permesso (755) di lettura ed esecuzione delle directory a chi non è root:
        find ./ -type d -exec chmod 755 {} \;
      3. diamo permesso (644) di sola lettura di tutti i file a chi non è root:
        find ./ -type f -exec chmod 644 {} \;
      Questo genere di configurazione limita fortemente il buon funzionamento degli uploads e di certi plugin. Non fa niente, ricordate sempre la regola principale nella configurazione di un qualsiasi sistema di sicurezza è "prima nega, poi consenti".
    5. Abilitiamo in scrittura solo le cartelle autorizzate.
      Questa parte della configurazione è poco definibile, dato che dipende fortemente dagli obiettivi del nostro sito in wordpress e dai plugin in esso installati.
      Ad esempio: dopo l'esecuzione del punto precedente la cartella wp-content/uploads non accetta più file (cioè non è possibile "uploadare" files in wordpress) e se necessario va riabilitata in scrittura col comando: chmod -R 777 ./wp-content/uploads
    6. Aggiungiamo delle regole al file .htaccess.
      Nella root del sito è conveniente inserire un file .htaccess che contiene le seguenti regole:
      <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      RewriteRule ^wp-admin/includes/ - [F,L]
      RewriteRule !^wp-includes/ - [S=3]
      RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
      RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
      RewriteRule ^wp-includes/theme-compat/ - [F,L]
      </IfModule>
    7. Fai indicizzare solo ciò che serve.
      Quando il crawler di un motore di ricerca passa nel nostro blog per indicizzarlo legge e si basa sulle istruzioni contenute nel file robots.txt. E' bene che non tutte le directory vengano indicizzate, e quindi ecco un esempio di cosa dovremmo indicare nel file:
      User-agent: *
      Disallow: /cgi-bin
      Disallow: /wp-admin
      Disallow: /wp-includes
      Disallow: /wp-content/plugins
      Disallow: /wp-content/cache
      Disallow: /wp-content/themes
      Disallow: /trackback
      Disallow: /feed
      Disallow: /comments
      Disallow: /category/*/*
      Disallow: */trackback
      Disallow: */feed
      Disallow: */comments
      Disallow: /*?*
      Disallow: /*?
      Allow: /wp-content/uploads

      # Google Image
      User-agent: Googlebot-Image
      Disallow:
      Allow: /*

      # Google AdSense
      User-agent: Mediapartners-Google*
      Disallow:
      Allow: /*

      # digg mirror
      User-agent: duggmirror
      Disallow: /

      Sitemap: http://www.example.com/sitemap.xml
    8. Conosci i tuoi plugins.
      E' il consiglio migliore che posso dare, infatti sono i plugin il veicolo migliore per accedere ai file del sito e possono causare gravi problemi. Dunque fidarsi è bene ma non fidarsi è meglio e quindi cerchiamo sempre di documentarci rigurado ai plugin che installiamo. Attenzione va anche posta alle directory o ai file che dobbiamo nuovamente rendere accessibili in scrittura per consentire al plugin di lavorare senza malfunzionamenti.
    9. Crea solo gli utenti che servono e con permessi limitati.
      Altro punto da tenere in considerazione è la creazione degli utenti. Non dovrebbero esistere utenti inutili e soprattutto ognuno dovrebbe avere solo i permessi necessati. Wordpress purtroppo non ha "di serie" una raffinata gestione dei permessi da associare agli utenti. Fortunatamente ci viene in aiuto un plugin "capability manager" col quale possiamo modificare le azioni associate ai ruoli di default ed eventualmente crearne di nuovi.
    10. Plugin consigliati.
      Alcuni plugin possono aiutare a migliorare la sicurezza generale della nostra installazione di wordpress.
      • Login lockdown
        Logga ogni tentativo di accesso e mette in atto delle semplici contromisure impedendo l'accesso da un certo IP o da un certo range di IP quando i tentativi sono troppo ravvicinati o superano un certo numero massimo.
      • Remove my version
        Nasconde la versione di wordpress attualmente installata in modo da rendere più complicato individuare eventuali bug noti.
      • WP Security scan
        Esegue una scansione della directory dove è installato wordpress e fornisce consigli utili per rendere sicuro l'accesso ai file e alle directory
    11. Aggiorare frequentemente.
      Ultimo consiglio è quello di tenere frequentemente aggiornata ognuna delle parti che compone una installazione di wordpress: il server web, il database server, wordpress stesso e i suoi plugins.

    Nessun commento:

    Posta un commento