Come proteggere la cartella wp-admin con password HTTP
La pagina di login di WordPress (wp-login.php) e la cartella wp-admin sono i bersagli principali degli attacchi brute force. I bot automatizzati provano migliaia di combinazioni di username e password ogni giorno. Una protezione efficace è aggiungere un secondo livello di autenticazione HTTP a livello server: prima ancora che WordPress venga caricato, il server richiede credenziali aggiuntive. In questa guida ti mostro come configurare la protezione HTTP auth su wp-admin con Apache e Nginx.
Come funziona la protezione HTTP Authentication
L’HTTP Basic Authentication è un meccanismo del web server (non di WordPress) che richiede username e password prima di accedere a una cartella o un file specifico. Quando un visitatore o un bot tenta di accedere a /wp-admin/ o wp-login.php, il browser mostra un popup nativo che richiede le credenziali. Se le credenziali non sono corrette, il server risponde con un errore 401 senza mai caricare PHP o WordPress.
Questo ha due vantaggi fondamentali:
- I bot vengono bloccati prima di PHP: il server rifiuta la richiesta a livello di configurazione, senza consumare risorse del server per eseguire WordPress.
- Doppia autenticazione: anche se un attaccante scopre le credenziali WordPress, deve superare anche l’autenticazione HTTP.
Configurazione su Apache con .htaccess
Passo 1: creare il file delle password
Per prima cosa, crea un file che contenga le credenziali. Questo file deve essere salvato fuori dalla document root per sicurezza (non accessibile dal web):
htpasswd -c /home/utente/.htpasswd nome_utente
Il comando ti chiederà di inserire e confermare la password. Il file .htpasswd conterrà l’username e la password criptata. Se vuoi aggiungere altri utenti, usa lo stesso comando senza il flag -c (che crea il file da zero).
Passo 2: configurare .htaccess nella cartella wp-admin
Crea o modifica il file .htaccess dentro la cartella wp-admin/ (non quello nella root di WordPress):
AuthType Basic AuthName "Area Riservata" AuthUserFile /home/utente/.htpasswd Require valid-user
Passo 3: proteggere anche wp-login.php
La cartella wp-admin è protetta, ma wp-login.php si trova nella root ed è il vero bersaglio dei bot. Aggiungi queste righe al file .htaccess nella root di WordPress:
<Files wp-login.php> AuthType Basic AuthName "Area Riservata" AuthUserFile /home/utente/.htpasswd Require valid-user </Files>
Configurazione su Nginx
Su Nginx la configurazione è diversa. Modifica il file di configurazione del virtual host:
# Proteggere wp-admin
location /wp-admin {
auth_basic "Area Riservata";
auth_basic_user_file /etc/nginx/.htpasswd;
location ~ .php$ {
fastcgi_pass unix:/run/php/php-fpm.sock;
include fastcgi_params;
}
}
# Proteggere wp-login.php
location = /wp-login.php {
auth_basic "Area Riservata";
auth_basic_user_file /etc/nginx/.htpasswd;
fastcgi_pass unix:/run/php/php-fpm.sock;
include fastcgi_params;
}
Dopo la modifica, ricarica la configurazione Nginx con nginx -t && systemctl reload nginx.
Risolvere il problema con admin-ajax.php
C’è un problema importante da gestire: WordPress usa il file wp-admin/admin-ajax.php per le richieste AJAX del front-end (form di contatto, caricamento dinamico di contenuti, plugin che usano AJAX). Se proteggi tutta la cartella wp-admin, queste richieste AJAX vengono bloccate e alcune funzionalità del sito smettono di funzionare.
La soluzione è escludere admin-ajax.php dalla protezione. Su Apache, aggiungi nel file .htaccess della cartella wp-admin:
<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any
</Files>
Su Nginx, aggiungi una location specifica prima della protezione di wp-admin:
location = /wp-admin/admin-ajax.php {
auth_basic off;
fastcgi_pass unix:/run/php/php-fpm.sock;
include fastcgi_params;
}
Limitare l’accesso per indirizzo IP
Se accedi al pannello admin sempre dallo stesso indirizzo IP (ufficio, VPN), puoi limitare l’accesso a wp-admin solo a quell’IP, eliminando completamente la necessità di password HTTP. Su Apache:
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 123.456.789.0
</Files>
Su Nginx:
location = /wp-login.php {
allow 123.456.789.0;
deny all;
fastcgi_pass unix:/run/php/php-fpm.sock;
include fastcgi_params;
}
Questa soluzione è la più sicura in assoluto ma richiede un IP statico. Se il tuo IP cambia frequentemente, la protezione HTTP con password è la scelta migliore.
Combinare con altri metodi di sicurezza
La protezione HTTP auth funziona al meglio quando combinata con altre misure: limitazione dei tentativi di login con plugin come Limit Login Attempts, autenticazione a due fattori (2FA) per un terzo livello di sicurezza, e username non prevedibili (mai “admin”). Con tutti questi livelli attivi, un attaccante dovrebbe superare l’autenticazione HTTP, indovinare l’username WordPress, la password WordPress e il codice 2FA — rendendo un attacco brute force praticamente impossibile.
Serve aiuto con la configurazione?
Se non hai familiarità con la configurazione del server o se vuoi proteggere il tuo sito WordPress a livello professionale, il team di SoccorsoWP può configurare tutti i livelli di sicurezza per te. Apri un ticket e blinda il tuo pannello admin.