1. Limitare l’accesso a wp-admin tramite indirizzo IP
Limitare l’accesso alla cartella “wp-admin” tramite indirizzo IP aggiungendo le seguenti righe nel file httpd.conf:
<Directory /unacartella/chitblog/wp-admin/> Require ip xxx.xxx.xxx.xxx </Directory>
Con le seguenti direttive si ottiene che solo l’utente con l’indirizzo IP XXX.XXX.XXX.XXX può accedere all’area d’amministrazione di WordPress.
Se non si possiede un indirizzo 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 di indirizzi IP.
Per controllare se funziona si potrebbe testare da un altro indirizzo IP per accertarsi se effettivamente non sia possibile accedere all’area d’amministrazione di WordPress.
Una volta fatto qualsiasi altra persona che provasse ad accedere da un altro indirizzo IP alla cartella “wp-admin” o a effettuare l’accesso a WordPress, 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.
2. Proteggere la cartella wp-admin con una password
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 – prima di </Directory> – precedentemente preparato per limitare l’accesso tramite indirizzo IP:
AuthType "Basic" AuthName "Restricted Files" AuthBasicProvider file AuthUserFile /unacartella/passwd/passwords Require user chitblog_admin
Ora, se si cerca di accedere all’area d’amministrazione di WordPress viene richiesta prima la password per accedere alla cartella wp-admin sul server.
3. Proteggere il login e l’area d’amministrazione WordPress
Per accedere all’area d’amministrazione di WordPress dobbiamo assicurarci di farlo con una connessione sicura ( https ).
Forzare la connessione sicura per il login e l’area d’amministrazione 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 nell’area d’amministrazione di WordPress.
4. iThemes Security Plugin WordPress sicurezza
Scaricare il plugin iThemes Security ( Scarica iThemes Security ) estrarre il contenuto dello zip localmente e copiarlo sul Server nella cartella wp-content/plugins/.
Una volta copiato il plugin nell’area d’amministrazione sotto Plugin/Plugin Installati apparirà una lista di plugins tra cui anche iThemes Security.
Cliccare su attiva! Una volta attivato iThemes Security sulla pagina principale ci sono diverse impostazioni per la sicurezza che si possono attivare e configurare.
Cliccare su “Enable” per attivare specifiche impostazioni della sicurezza di WordPress.
5. Proteggere il login da attacchi Brute Force
A tale scopo si può usare iThemes Security che ha la funzione “Local Brute Force Protection” che serve appunto per proteggere il login da attacchi Brute Force.
Per attivare questa funzione cliccare su “Enable” sotto “Local Brute Force Protection“.
Per configurare la funzione Local Brute Force Protection di iThemes Security cliccare su “Configure Settings”.
5.2 Nascondere lo script per accedere a WordPress
Per “nascondere” lo script wp-login.php andare nelle impostazioni avanzate di iThemes Security.
Cliccare sotto “Hide Backend” su Configure Settings.
Nel menu di configurazione sotto “Hide Backend” selezionare “Enable the hide backend feature” e in “Login Slug” dare un nome come per esempio login-chit. Una volta apportate le modifiche salvare le impostazioni cliccando su “Save Settings”.
Ora un utente deve prima sapere l’URL esatta – christeninformatica.ch/login-chit per esempio – per potere accedere all’area d’amministrazione di WordPress o per svolgere un attacco Brute Force.
6. Bloccare gli user-agent dannosi
Aggiungere delle regole rewrite nel file .htaccess che deviano gli user-agent dannosi a una pagina di errore. Si tratta della blacklist di HackRepair.com messa a disposizione da iThemes Security ma se si desidera aggiungere solo le regole manualmente eccole qui:
Editare il file .htaccess e aggiungiere 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 info
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”.
Togliere sicuramente rsd_link, wp_generator, wlwmanifest_link e tutto quello di cui non si ha bisogno..
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');
7.2 Nascondere le traccie nel codice
Nascondere ogni traccia della cartella che abbiamo cambiato precedentemente ( wp-content ) nel codice html e rimuovere gli script inutili. Editare manualmente il fiele header.php nella cartella del tema WordPress che si sta usando, wp-content/themes/twentyseventeen per esempio, e togliere quello che non serve. La URL del file CSS la impostiamo manualmente e spostiamo il file nella nuova destinazione. Fare la stessa cosa con gli script.
7.3 Cambiare la cartella per gli uploads in WordPress
Se si ha rinominato la cartella wp-content, si vorrà sicuramente fare in modo che il nuovo nome rimanga segreto. Per fare ciò aggiungere le seguenti righe all’inizio del file wp-config.php:
define( 'UPLOADS', 'grafica' );
In questo modo i file verranno “uploadati” in un altra cartella – non wp-content – e quindi non si potrà ottenere questa informazione guardando nel codice html.
8. Sicurezza WordPress – SQL Injection & URL Hacking
WordPress è una applicazione scritta in PHP che fa uso di un database (MySQL). Queste due caratteristiche potrebbero rendere WordPress vulnerabile ad attacchi tramite URL modificate. Le URL modificate potrebbero venire usate in modo da eseguire comandi sul server, aggiungere e modificare qualcosa nella banca dati, scaricare i files /etc/passwd e /etc/shadow e altro.
SQL injection è un tipo di attacco in cui l'”hacker” tenta di aggiungere dei comandi nella URL così da manipolare i dati e altro. Aggiungendo delle regole al file .htaccess che deviano tutte le richieste che contengono comandi SQL e altri usati per svolgere 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 script di configurazione e installazione, il file readme.html e altri. Questi file rivelano informazioni che potrebbero venire usate per svolgere un attacco al Blog. Un attacker potrebbe usare un bug di un qualche plugin installato e usare un qualche exploit. O potrebbe provare i conosciuti exploit su una detarminata versione di WordPress.
Oltre a questi file negare l’accesso al file .htaccess.
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 si avrà maggiore sicurezza.
Per cambiare le chiavi editare il file wp-config.php.
#vi wp-config.php
Come si vede nell’immagine dalla riga 51 alla 58 ci sono delle chiavi. Quello che dobbiamo fare è sostiturle con qualcosa d’altro di nuovo.
Per generarne di nuove si potrebbe usare il seguente tool: Tool per generare le secret keys di WordPress.
Ora sostituire le chiavi presenti con quelle appena generate e salvare il file.
11. Cambiare il prefisso delle tabelle di WordPress
Se non l’avete già fatto durante l’installazione cambiare i prefissi delle tabelle del database. Per cambiare il prefisso delle tabelle bisogna prima saperne il nome, 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 e aggiungere le seguenti righe alla fine del file:
Header unset ETag FileETag None
Ciao,
complimenti per la guida.
Mi manca solo un passaggio… io non ho completo accesso al Server dove devo salvare il file .htaccess ?
Salve Andrea e scusa se rispondo solo adesso. Nella cartella root (radice) htdocs di solito, dove si trovano tutti gli script, la cartella wp-admin e altre, come anche la pagina index.php.
Vedrò di completare la guida in modo che sia più chiaro. Grazie mille Andrea!!