1. Limitare l’accesso a wp-admin tramite indirizzo ip

Come prima cosa limitare l’accesso a wp-admin aggiungendo un nuovo container nel file httpd.conf:

<Directory /unacartella/chitblog/wp-admin/>
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Access Control"
AuthType "Basic"
order deny,allow
deny from all
# whitelist home IP address
allow from 213.XXX.XXX.XXX
</Directory>

Se non si ha completo accesso al Server usare .htaccess. Il file .htaccess dovrebbe trovarsi nella cartella radice ma se non è presente crearlo. Se non dovesse funzionare contattare il proprio webhosting provider. Di solito – l’ultima volta che ho dovuto farlo per un altro sito – il supporto per usare .htaccess viene attivato richiedendo di attivare mod_rewrite. Con le seguenti direttive si ottiene che solo l’utente con l’indirizzo ip 213.XXX.XXX.XXX può accedere al pannello di controllo WordPress, tutti gli altri riceveranno l’errore 403 forbidden.

Se non si è a conoscenza del proprio indirizzo ip andare su un qualche sito come: http://www.mostraip.it/ ed usare l’indirizzo ip che viene mostrato nella configurazione della directory wp-dmin. Riavviare il server e vedere se funziona. Si potrebbe testare da un altro indirizzo IP per testare se effettivamente non sia possibile al pannello di controllo di WordPress.

Se non si possiede un ip fisso il proprio ip cambierà qualche volta e si dovrà editare il file nuovamente. In alternativa si potrebbe dare accesso a tutto il possibile range.

Un volta fatto qualsiasi altra persona che provasse ad accedere da un altro indirizzo ip alla cartella “wp-admin” o a effettuare il login, riceverebbe un errore:

Access forbidden! You don’t have permission to access the requested object. It is either read-protected or not readable by the server. If you think this is a server error, please contact the webmaster.

Se l’accesso è limitato ad un ip o ad alcuni ip, la persona che vorrebbe accedere o svolgere un attaccato al nostro BLOG, dovrebbe prima venire a conoscenza di quale/i ip sono permessi e eventualmente “spoofarne” (vedi anche ip-spoofing) uno. Nel senso non si deve pensare che limitare l’accesso al pannello di controllo tramite indirizzo ip basti e che sia al 100% sicuro. Di sicuro usando diversi meccanismi di sicurezza assieme, aggiornando la versione di WordPress e tutti i plugins in uso, siamo sulla buona strada.

2. Proteggere la cartella wp-admin con una password

Con i seguenti comandi creare un password file per permettere l’accesso ad uno specifico utente.

# md passwd
# htpasswd2 -c passwd/passwords chitblog_admin
New password:
Re-type new password:
Adding password for user chitblog_admin
#

Una volta creato un utente basta aggiungere le seguenti righe infondo al container (prima di </Directory>) precedentemente preparato per limitare l’accesso tramite ip:

AuthType "Basic"
AuthName "Restricted Files"
AuthBasicProvider file
AuthUserFile /unacartella/passwd/passwords
Require user chitblog_admin

Una volta fatto se si cerca di accedere al pannello di controllo viene richiesta prima la password per accedere alla cartella wp-admin sul server.

3. Proteggere il login e il pannello di controllo WordPress

Per amministrare e usare WordPress dobbiamo “accedere” al pannello di controllo e il login avviene naturalmente in rete. Quindi come prima cosa dobbiamo assicurarci che vi sia una connessione sicura (https) quando si effettua l’accesso o per navigare nel pannello di configurazione WordPress.

Forzare la connessione sicura per il login e il pannello di controllo WordPress

Per forzare WordPress ad usare ssl durante il login, aggiungere le seguenti righe all’inizio del file wp-config.php.

define( 'FORCE_SSL_LOGIN', true );
define( 'FORCE_SSL_ADMIN', true );

Con force ssl_admin e ssl_login si forza l’applicazione ad usare https durante il login e mentre si naviga nel panello di controllo di WordPress.

4. Better WP security

Personalmente penso che sia buona cosa installare il minore numero possibile di plugins e fare, dove si può, manualmente. Wp better security penso che sia uno di quei pochi plugin che vale veramente la pena d’installare.

Scaricare il plugin BETTER WP SECURITY (Scarica better wp security) estrarre il contenuto dello zip localmente, accedere tramite ftp al Server, spostarsi nella cartella wp-content/plugins e copiare il contenuto del file zip al suo interno. Oppure nel mio caso copio il plugin nella cartella wp-content/plugins.

Una volta copiato il plugin, nel pannello di controllo sotto plugin/plguins installati, apparirà una lista di plugins tra cui anche il nostro better-wp-security.

Clickare su attiva! Una volta attivato Better WP Security sulla pagina principale vi sono 21 punti importanti da seguire, alcuni dei quali sono già stati fatti durante l’installazione o nei punti precedenti, come cambiare il nome dell’admin e il prefisso delle tabelle.

Wp security i 21 punti

Clickare sulla destra su click here to fix nei punti che non sono ancora verdi. Tra punti importanti vi sono appunto cambiare il nome della cartella wp-content, il prefisso delle tabelle in MySQL e molto altro.

Posterò un articolo su better-wp-security in cui spiegherò nel dettaglo i vari punti, alcuni dei quali illustrati nei successivi punti di questa guida.

5. Limitare i tentativi di accesso e proteggere il login da attacchi

Installiamo better-wp-security che ha la funzione per proteggere il login di WordPress. Better wp security è una sorta di tutto in uno per la sicurezza di WordPress, un ottimo plugin devo dire, ma potremmo anche installare solo il plugin Limit Login Attempts e fare il resto manualmente. Una volta installato better wp security possiamo continuare con le impostazioni.

Incluso nel plugin better-wp-security vi è una funzione per proteggere il login da attacchi e altre funzioni per creare regole rewrite veramente molto utili. Essenzialmente quello che dobbiamo fare è bloccare gli utenti dopo un tot. di tentativi (per indirizzo ip). Se si cambia la URL per effettuare il login un malintenzionato, non essendo a conoscenza di tali informazioni, non potrebbe svolgere nessun attacco brute force o a vocabolario per esempio, che verrebbe subito bloccato.

Per farlo usiamo better-wp-security o un altro plugin per limitare i tentativi di accesso così da proteggere da eventuali attacchi brute force.

Better wp security ci permette di limitare i tentativi di login permessi e bloccare per 15 min ogni utente (l’indirizzo ip) che sbaglia 3 volte la sua password e altro.

Bene, andare nel registro login delle impostazioni di better wp security e configurare le seguenti impostazioni:

Limite login attemps

Enable Login Limits: mettiamo il visto per attivarlo e tutto il resto lasciare com’è, poi premere su save changes e abbiamo finito, lo script per il login è protetto.

5.2 Nascondere gli script per il login e per registrarsi

Per nascondere il login creiamo delle regole rewrite che direzionano “christeninformatica.ch/loggati” allo script per il login, così che se qualcuno volesse attaccarci, dovrebbe prima essere a conoscenza della URL per effettuare il login.

Ora ci muoviamo nella scheda di configurazione “hide” del plugin better wp security e attiviamo l’opzione.

Riempiano i campi necessari, login register e admin slug e mettiamo i due visti nei quadratini, Enable Hide Backend e Generate new secret key poi clickare su save changes.

Wp security creerà per noi delle regole rewrite, andiamo a vedere sotto il registro DASHBOARD…

scrolliamo in basso e vediamo che wp security ha aggiunto il codice nel file .htaccess:

RewriteRule ^loggati/?$ /wp-login.php?oc5oinnolvixz88lnk44 [R,L]
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$
RewriteRule ^amministratore/?$ /wp-login.php?oc5oinnolvimxz88lnk44&redirect_to=/wp-admin/ [R,L]
RewriteRule ^amministratore/?$ /wp-admin/?oc5oinnolvixz88lnk44 [R,L]
RewriteRule ^registrati/?$ /wp-login.php?oc5oinnolvimxz88lnk44&action=register [R,L] RewriteCond %{SCRIPT_FILENAME} !^(.*)admin-ajax\.php
RewriteCond %{HTTP_REFERER} !^(.*)christeninformatica.ch/wp-admin
RewriteCond %{HTTP_REFERER} !^(.*)christeninformatica.ch/wp-login\.php
RewriteCond %{HTTP_REFERER} !^(.*)christeninformatica.ch/loggati
RewriteCond %{HTTP_REFERER} !^(.*)christeninformatica.ch/amministratore
RewriteCond %{HTTP_REFERER} !^(.*)christeninformatica.ch/registrati
RewriteCond %{QUERY_STRING} !^oc5oinnolvimxz88lnk44
RewriteCond %{QUERY_STRING} !^action=logout
RewriteCond %{QUERY_STRING} !^action=rp
RewriteCond %{QUERY_STRING} !^action=register
RewriteCond %{QUERY_STRING} !^action=postpass
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$ RewriteRule ^.*wp-admin/?|^.*wp-login\.php /not_found [R,L]
RewriteCond %{QUERY_STRING} ^loggedout=true RewriteRule ^.*$ /wp-login.php?oc5oinnolvimxz88lnk44 [R,L]

Le seguenti regole rewrite fanno in modo che se qualcuno prova a “loggarsi” nel pannello di controllo di WordPress tramite wp-login.php, riceve un messaggio d’errore. Un utente deve sapere la URL esatta: christeninformatica.ch/loggati per potere accedere al pannello WordPress o per svolgere un attacco.

Ora, per loggarmi in WordPress devo usare christeninformatica.ch/loggati e vengo automaticamente direzionato a https://christeninformatica.ch/wp-login.php?oc5oinnolvimxz88lnk44.

6. Bloccare gli user-agent dannosi

Aggiungiamo delle regole rewrite nel file .htaccess che ridirezionano gli user-agent dannosi a una pagina di errore. Si tratta della blacklist di HackRepair.com generata da wp-better-security, ma se si desidera aggiungere solo le regole manualmente eccole qui:

Editiamo il file .htaccess e aggiungiamo le seguenti righe.

RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Bolt\ 0 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot\@yahoo\.com [NC,OR]
RewriteCond %{HTTP_USER_AGENT} CazoodleBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Custo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Default\ Browser\ 0 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^DIIbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^DISCo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} discobot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^eCatch [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ecxi [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailCollector [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Grafula [NC,OR]
RewriteCond %{HTTP_USER_AGENT} GT::WWW [NC,OR]
RewriteCond %{HTTP_USER_AGENT} heritrix [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^HMView [NC,OR]
RewriteCond %{HTTP_USER_AGENT} HTTP::Lite [NC,OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ia_archiver [NC,OR]
RewriteCond %{HTTP_USER_AGENT} IDBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} id-search [NC,OR]
RewriteCond %{HTTP_USER_AGENT} id-search\.org [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InterGET [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InternetSeer\.com [NC,OR]
RewriteCond %{HTTP_USER_AGENT} IRLbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ISC\ Systems\ iRc\ Search\ 2\.1 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Java [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^JetCar [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^larbin [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} libwww [NC,OR]
RewriteCond %{HTTP_USER_AGENT} libwww-perl [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Link [NC,OR]
RewriteCond %{HTTP_USER_AGENT} LinksManager.com_bot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} linkwalker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} lwp-trivial [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Maxthon$ [NC,OR]
RewriteCond %{HTTP_USER_AGENT} MFC_Tear_Sample [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^microsoft\.url [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Microsoft\ URL\ Control [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Missigua\ Locator [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla\.*Indy [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla\.*NEWT [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^MSFrontPage [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Navroad [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NearSite [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Nutch [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Octopus [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [NC,OR]
RewriteCond %{HTTP_USER_AGENT} panscient.com [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^pavuk [NC,OR]
RewriteCond %{HTTP_USER_AGENT} PECL::HTTP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^PeoplePal [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [NC,OR]
RewriteCond %{HTTP_USER_AGENT} PHPCrawl [NC,OR]
RewriteCond %{HTTP_USER_AGENT} PleaseCrawl [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^psbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^ReGet [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Rippers\ 0 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SBIder [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SeaMonkey$ [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^sitecheck\.internetseer\.com [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Snoopy [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Steeler [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Toata\ dragostea\ mea\ pentru\ diavola [NC,OR]
RewriteCond %{HTTP_USER_AGENT} URI::Fetch [NC,OR]
RewriteCond %{HTTP_USER_AGENT} urllib [NC,OR]
RewriteCond %{HTTP_USER_AGENT} User-Agent [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Web\ Sucker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} webalta [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^[Ww]eb[Bb]andit [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WebCollage [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Wells\ Search\ II [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WEP\ Search [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WWW-Mechanize [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [NC,OR]
RewriteCond %{HTTP_USER_AGENT} zermelo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus\.*Webster [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ZyBorg [NC]
RewriteRule ^* .- [F,L]

7. Rimuovere il meta tag generator di WordPress e altre informazioni

Per rimuovere le informazioni sulla versione di WordPress e altro editare il file wp-includes/default-filters.php. Una volta aperto il file appaiono una serie di funzioni, scrollare un po’ in basso fino a Actions:

wp_head, wordpress

Togliere sicuramente rsd_link, wp_generator, wlwmanifest_link e tutto quello di cui non si ha bisogno, per es, se non si usano gli script come nel mio caso o rss, si toglie tutto. Poi spiegerò come migliorare la performance di WordPress nella guida sul tuning di WordPress.

Oppure aggiungere le seguenti righe all’inizio del file functions.php del vostro tema WordPress:

remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
add_filter('the_generator', 'remove_generator');
add_filter('wp_headers', 'remove_x_pingback');
add_filter('default_feed', 'disable_rss');

7.2 Nascondere le traccie nel codice

Nascondere ogni traccia della cartella che abbiamo cambiato precedentemente nel codice html, rimuovere script inutili. Editare manualmente il fiele header.php nella cartella del tema WordPress che si sta usando, wp-content/themes/twentyten per esempio, e togliere quello che non serve. La URL del file CSS la impostiamo manualmente e spostiamo il file nella nuova destinazione se necessario. La stessa cosa facciamo con gli script...

7.3 Cambiare la cartella per gli uploads

Se si ha rinominato la cartella wp-content, si vorrà sicuramente fare in modo che il nuovo nome rimanga anche segreto. Per fare ciò aggiungere le seguenti righe all'inizio del file wp-config.php:
define( 'UPLOADS', 'grafica' );

Così che i file verrano uploadati in un altra cartella, non wp-content, e quindi non risulterà questa informazione guardando nel codicde html.

8. WordPress - SQL Injection & URL Hacking

WordPress è una applicazione scritta in PHP che fa uso di una banca dati (MySQL). Queste due caratteristiche potrebbero rendere WordPress vulnerabile ad attacchi tramite URL modificate. Queste URL modificate potrebbero venire usate in modo da eseguire comandi su una macchina o aggiungere e modificare qualcosa nella banca dati, come anche per scaricare i files /etc/passwd e /etc/shadow per poi crackare la password e altro.

SQL injection è un tipo di attacco in cui l'"hacker" tenta di aggiungere dei comandi nella URL così da manipolare dati e altro. Aggiungendo delle regole al file .htaccess che deviano tutte le richieste che contengono per es comandi SQL e altri usati in attacchi, abbiamo risolto il problema. Ecco il codice:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC]
RewriteCond %{QUERY_STRING} \.\.\/ [NC,OR]
RewriteCond %{QUERY_STRING} ^.*\.(bash|git|hg|log|svn|swp|cvs) [NC,OR]
RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
RewriteCond %{QUERY_STRING} boot\.ini [NC,OR]
RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
RewriteCond %{QUERY_STRING} http\: [NC,OR]
RewriteCond %{QUERY_STRING} https\: [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [NC,OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>|ê|"|;|\?|\*|=$).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*("|'|<|>|\|{||).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(%24&x).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(%0|%A|%B|%C|%D|%E|%F|127\.0).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(request|select|concat|insert|union|declare).* [NC]
RewriteCond %{QUERY_STRING} !^loggedout=true
RewriteCond %{QUERY_STRING} !^action=rp
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$
RewriteCond %{HTTP_REFERER} !^http://maps\.googleapis\.com(.*)$
RewriteRule ^(.*)$ - [F,L]

9. Negare l'accesso ai dati sensibili di WordPress

Una tipica installazione WordPress contiene vari file come anche gli scipt di configurazione e installazione, il file readme (LEGGIMI) ed altri. Questi file potrebbero rivelare informazioni che potrebbero venire usate per svolgere un attacco al blog - informazioni sulla versione WordPress usata, il tema, eventuali plugins e altro. Un attacker potrebbe usare un bug di un qualche plugin installato per fare exploit. O potrebbe provare i conosciuti exploit su una detarminata versione di WordPress. Per questo è anche importante di usare il minimo numero possibile di plugins e nasconderne eventualmente le tracce nel codice e nell'header. Aggiornare sempre i plugins in uso e la versione WordPress.

Oltre a questi file vogliamo anche negare l'accesso al file .htaccess. Una buona cosa, se si può richiedere o si ha accesso al server, sarebbe di configurare Apache in modo che cerchi le regole e le configurazioni in un altro file, per es: .htaccesschitblog.

Penso che i file readme.html e license.txt si possano anche cancellare, come durante il post sull'installazione di WordPress.

Inserire il seguente codice nel proprio .htaccess o modificare il file di configurazione di Apache (httpd.conf):

<files .htaccess>
Order allow,deny
Deny from all
</files>
<files readme.html>
Order allow,deny
Deny from all
</files>
<files license.txt>
Order allow,deny
Deny from all
</files>
<files install.php>
Order allow,deny
Deny from all
</files>
<files wp-config.php>
Order allow,deny
Deny from all
</files>

10. Cambiare le chiavi di autentificazione di WordPress

Le chiavi di autentificazione WordPress vengono usate per la sicurezza nel momento dell'autentificazione tramite cookies. In poche parole vengono ustate per crittografare le informazioni trasmesse tramite cookies. Cambiando ogni tanto queste chiavi avremo maggiore sicurezza.

Per cambiare le chiavi edito il file wp-config.php.

#vi wp-config.php

Wordpress Secret keys

Come si vede nell'immagine dalla riga 51 alla 58 vi sono delle chiavi. Quello che dobbiamo fare è sostiture quelle chiavi con qualcosa d'altro di nuovo.

Per generane di nuove si potrebbe usare il seguente tool: Tool per generare le secret keys di WordPress

Wordpress Secret keys generator

Ora sostituire le chiavi presenti con quelle appena generate e salvare il file.

11. Cambiare il prefisso delle tabelle di WordPress

Ora, se non l'aveste già fatto durante l'installazione, cambiare i prefissi delle tabelle della bancadati.
Per cambiare il prefisso delle tabelle bisogna prima sapere il nome di queste tabelle, poi con il comando RENAME, rinominarle. Prima di iniziare consiglio vivamente di effettuare un backup.
Accedere alla banca dati ed eseguire i seguenti comandi.

#mysql -u root -p
mysql>use chitblog
Database changed
mysql> show tables;
+------------------------------------+
| Tables_in_chitblog
+------------------------------------+
| wp_commentmeta               | 
| wp_comments                  | 
| wp_links                     | 
| wp_options                   | 
| wp_postmeta                  | 
| wp_posts                     | 
| wp_term_relationships        | 
| wp_term_taxonomy             | 
| wp_terms                     | 
| wp_usermeta                  | 
| wp_users                     | 
+------------------------------------+

13 rows in set (0.00 sec)

mysql>RENAME TABLE wp_commentmeta TO chitblog_commentmeta, wp_comments TO chitblog_comments, wp_links TO chitblog_links, wp_options TO chitblog_options, wp_postmeta TO chitblog_postmeta, wp_posts TO chitblog_posts, wp_term_relationships TO chitblog_term_relationships, wp_term_taxonomy TO chitblog_term_taxonomy, wp_terms TO chitblog_terms, wp_usermeta TO chitblog_usermeta, wp_users TO chitblog_users;

Una volta rinominate le tabelle editare il file wp-config.php, cercare la variabile $table_prefix e assegnarle un diverso valore: "chitblog_" al posto di "wp_".

12. Disabilitare l'ETag

Editare il file httpd.conf - oppure .htaccess se non si ha completo accesso al server - e aggiungere le seguenti righe alla fine del file:

Header unset ETag
FileETag None

Conclusione

Vi saranno molto probabilmente anche altre guide sulla sicurezza di WordPress, diciamo che questo è un buon inizio. Seguirà sicuro una guida più dettagliata su Better-wp-security in cui spiegerò i vari punti nei particolari, con possibili problemi e soluzioni riguardo alla configurazione e installazione di questo plugin.