Proteggere l'accesso alla directory /administrator

Impedire l'accesso all'amministrazione del sito joomla!

accesso amministrazione del sito Joomla!Questo articolo è specifico per i siti in Joomla! e si applica a qualsiasi versione dalla 1.x alle ultime 3, ma la metodologia descritta si può applicare facilmente a qualsiasi CMS la cui interfaccia di amministrazione si trovi in una sottodirectory e può essere anche adattata a proteggere una singola pagina.

Non sono richieste grandi conoscenze per applicare quanto descritto qui, è sufficiente solo un poco di esperienza.

La protezione qui descritta funziona per gli applicativi PHP su server Apache e richiede la modifica al file .htaccess e la redazione di un piccolo files php.

Scrissi questo articolo qualche anno fa, nel 2010, giusto come spunto tecnologico, ma senza consigliare l'adozione di questa tecnologia con troppa insistenza. Attualmente i tentativi di accesso al sito tramite attacchi all'interfaccia di amministrazione, per trovare le password, stanno diventando frequenti ed insistenti: ho pertanto deciso di aggiornare l'articolo e vi consiglio caldamente di implementare questa protezione.

Per prima cosa bloccheremo l'accesso diretto alla directory /administrator che consente l'amministrazione del nostro sito Joomla! inserendo queste righe nel file .htaccess, subito dopo la direttiva RewriteEngine On:

RewriteCond %{REQUEST_URI} ^/administrator
RewriteCond %{HTTP_COOKIE} !allowAdminAccess=valoreCookie
RewriteRule .* - [L,F]

La prima riga controlla che l'URI richiesto inizi con /administrator, che è la directory che vogliamo proteggere, la seconda  riga verifica che non esista il cookie di nome allowAdminAccess o che lo stesso non abbia il valore valoreCookie; se entrambe le condizioni sono verificate l'ultima riga forza il webserver a fermare l'esecuzione (L) e a restituire l'errore forbidden (F). in altri termini: se si vuole accedere ad /administrator deve esserci il cookie allowAdminAccess con il valore valoreCookie.

Ma come si imposta il cookie in questione? Con un semplice script php che "nasconderemo" da qualche parte nel sito. Creiamo, ad esempio, la directory /protect ed al suo interno il file protect.php. Il contenuto del files sarà il seguente:

<?php
 if( setcookie( 'allowAdminAccess', 'valoreCookie', time()+60*60*1, '/' ) ){
 header('Location: /administrator');
 }else{
 echo 'Errore nel salvare il cookie';
 }    
?>

Non inserite spazi all'inizio del file prima del codice PHP, e, se usate un editor windows, assicuratevi di salvare il file senza BOM (byte order model).

Quando richiamerete lo script, questi creerà il cookie allowAdminAccess e gli assegnerà il valore valoreCookie con validità di una ora; se volete aumentare il tempo a vostra dispozione, vi basterà aumentare il valore dell'ultimo moltiplicatore: ogni unità corrisponde ad una ora. Se lavorate molto sull'amministrazione del sito è consigliabile impostare la durata del cookie a valori più alti di una ora, considerate quattro/otto ore come valore opportuno.

Una volta impostato il cookie, lo script reindirizzerà il browser alla directory /administrator, da cui avviene la gestione del sito. A questo punto l'accesso sarà consentito.

Quindi, da ora, per accedere alla amministrazione del sito, si dovrà richiamare lo script appena creato (e fatelo sempre!):

http://www.miosito.tld/protect/protect.php

e ci si troverà di fronte all'interfaccia di amministrazione.

Usate sempre questo indirizzo per accedere all'amministrazione del sito: così prorogherete la validità del cookie e non correrete il rischio che la sessione vi si chiuda mentre lavorate.

Ovviamente sarà opportuno cambiare il nome del file php e il nome e/o il valore del cookie (sia nel file php che in .htaccess)

 

Usare un plugin già pronto?

Esistono dei plugin che permettono di ottenere lo stesso risultato qui descritto: perché non usarli? Ovviamente non vi è un motivo per non farlo, ma possono esserci delle ragioni per implementare la soluzione qui descritta:

  • non è riconducibile ad uno schema fisso;
    potendo, o meglio dovendo, cambiare il nome/percorso del file, il nome del cookie ed il suo valore un hacker dovrà faticare non poco a capire che succede.
  • indipendenza dal CMS in uso:
    La protezione è basata sul meccanismo di controllo di Apache, e quindi è indipendente dal CMS; nessuna vulnerabilità del CMS può far sì che questo sistema di protezione non funzioni!
  • è molto resistente agli attacchi dos e ddos:
    non dovendo passare da joomla (php e mysql) assorbe molto meno risorse di sistema e quindi può gestire un elevato numero di attacchi.
  • possibilità di rapido intervento in caso di problemi:
    basterà commentare le regole in .htaccess per disattivare la protezione. avendo provveduto voi all'installazione saprete sicuramente intervenire rapidamente in caso di blocchi, senza aspettare assistenza da nessuno.
  • è educativo:
    vi permette di imparare a conoscere meglio il vostro sito, il che non è mai una perdita di tempo.

Maggiori informazioni su mod_rewrite le potete trovare, oltre che sul sito ufficiale di apache, anche in questo nostro articolo scritto per la comunità di Joomla! Italia: modificare gli url in htaccess con le funzioni di modrewrite.

 

Perché bloccare l'accesso alla directory /administrator

Sappiate che gli attacchi alla interfaccia di amministrazione di joomla stanno diventando sempre più frequenti, ed una soluzione come questa può evitarvi molti problemi ed anche parecchi costi di banda e di cpu. Invece, per quanto riguarda la protezione della parte pubblica del sito, vi consigliamo il nostro plugin di sicurezza pubblicato su questo stesso sito.

 


Se avete problemi di sicurezza contattateci, anche questo è uno dei nostri servizi. Intanto aggiungete questa economica, ma assai efficace, protezione al sito.

happy coding,

marco maria leoni

 

Commenti   

0 #18 green12 2014-12-10 15:52
ciao,
ho già applicato la protezione su diversi siti ma ho un sito in una directory e quindi il file htaccess non è in root , come modifico le righe sotto il RewriteEngine On?
grazie

===Risposta
ciao, modifichi semplicemente le path in .htaccess con il percorso completo, se non funzionano così come sono.
devi provare, perché potrebbe dipendere da come è configurato il server.
Citazione
0 #17 mari 2014-04-24 15:33
ciao
fantastica soluzione grazie!!!!
questa mattina ho seguito tutte le tue indicazioni e ha funzionato benissimo, ma non capisco adesso se digito www.miosito.it/.../file.php mi porta alla home del sito invece della pagina per l'accesso al pannello

=== Risposta
verifica il codice. senza mail non posso contattarti.
ciao.
Citazione
0 #16 fxpatrizio 2014-04-01 07:58
Ciao, la soluzione pare funzionare egregiamente. Grazie per la ottima risorsa.
Purtroppo accade un inconveniente con il sistema di pagamento PayPal integrato in Virtuemart (e così con tutti i gateway che devono accedere ai files di componenti dall'esterno), in quanto, con le impostazioni date, lo stato del pagamento non può essere aggiornato da PayPal tramite il file notify.php interno ad una sottocartella della path administrator.
Che tu o qualcuno sappia, è aggirabile senza rischiare di fallare in questo modo la tecnica di messa in sicurezza?
Grazie anticipate.

=== Risposta
VM1? non una buona scelta.
comunque puoi aggiungere una condizione alle altre per permettere l'accesso al file indicato, prima della RewriteRule, ovviamente:

RewriteCond %{REQUEST_URI} !notify.php$

ciao,
marco
Citazione
0 #15 Guest 2014-03-18 19:30
Grazie per la risposta!
Scusami, ma non sono molto ferrata, abbi pazienza!
Il mio file è ancora htaccess.txt e non .htaccess
Siccome il server è Apache ma mi dava errore 500 ho trovato una guida in cui diceva di aggiungere un cancelletto prima di
Options +FollowSymLinks
Così funziona.

Adesso il file htaccess.txt è rinominato in .htaccess, ma riesco ad accedere sia tramite il cookie che tramite accesso normale.

Ho rifatto il procedimento più volte...
Qualche altro suggerimento?

Centra "riscrivi url SEF"?

Inoltre non ho capito bene la questione dei 60 minuti...
Se accedo tramite cookie cosa succede dopo un'ora in termini spiccioli?

Grazie mille

==== Risposta
ciao.
il codice per il file .htaccess deve essere all'inizio del file stesso, dopo RewriteEngine on, ovvero prima delle regole di rewrite del cms; da ciò consegue che l'impostazione SEF di joomla non ha rilevanza.

una volta scritto il cookie puoi accedere liberamente e direttamente alla directory /administrator; decorso tale termine ricevi un messaggio di errore per accesso non consentito.

per verificare di aver fatto tutto correttamente cancella i cookies e prova ad accedere ad /administrator: devi ottenere un messaggio di errore.

ciao,
marco
Citazione
0 #14 Guest 2014-03-17 16:53
Ciao, grazie mille per la tua guida...
Sto appena uscendo da un attacco di un hacker e sto provando a blindarmi.

Ho seguito la tua guida e il nuovo link

www.miosito.it/.../protect.php

funziona.

Però continua a funzionare anche
www.miosito.it/administrator

Come mai?

Grazie

======= Risposta:
ciao,
la procedura è ben collaudata, quindi verifica attentamente i vari passi ed assicurati che .htaccess sia processato correttamente dal server (che deve essere Apache).

ricorda anche che, una volta creato il cookie tramite lo script nascosto, l'accesso alla directory /administrator è consentito per il tempo di vita impostato per il cookie stesso.

ciao,
marco
Citazione
0 #13 Guest 2014-02-19 11:15
ciao, grandi dritte. Ti volevo solo chiedere, dato che sono un novellino, come abbinale la condizione di RewriteRule .* - [L,F] con la condizione RewriteRule .*\.(phps?!sh|p l|cgi|py)$ - [F] che hai consigliato per impedire le iniezioni esterne a joomla.
per ora io ho tolto il phps? nelle estensioni in modo che il file php che genera il cookie venga eseguito.

grazie

==== Risposta
in realtà non devi togliere niente (se no disattivi la protezione). è sufficiente inserire il codice del citato articolo (mmleoni.net/.../...) subito dopo quello riportato in questa pagina. le istruzioni per lo .htaccess non sono tra loro in contrasto e possono convivere senza problemi.

ps: hai messo una mail errata :(

ciao,
marco
Citazione
0 #12 Guest 2014-02-04 15:37
Parse error: syntax error, unexpected T_NS_SEPARATOR, expecting T_STRING

=====Risposta
il codice è stato copiato male.
Citazione
0 #11 Guest 2013-11-19 19:18
Citazione Guest:
Ottima guida!! ma io sto riscontrando un problema. Ho seguito tutto ciò che viene descritto nella tua guida, ho inserito la directory "httpdocs/protect". se vado su www.miodominio.it/.../, ok non è visualizzabile.
vado su
miodomioni.it/.../protect.php ok mi da il form del mio sito off line ma dopo l accesso non mi da il cpannel di joomla ma il sito. Non vorrei fosse solo per il fatto che ho il sito off-line


Risolto!!!
avevo sbagliato il nome della cartella
Citazione
0 #10 Guest 2013-11-19 12:06
Ottima guida!! ma io sto riscontrando un problema. Ho seguito tutto ciò che viene descritto nella tua guida, ho inserito la directory "httpdocs/prote ct". se vado su www.miodominio.it/.../, ok non è visualizzabile.
vado su
miodomioni.it/.../protect.php ok mi da il form del mio sito off line ma dopo l accesso non mi da il cpannel di joomla ma il sito. Non vorrei fosse solo per il fatto che ho il sito off-line
Citazione
0 #9 Guest 2013-08-11 16:16
Ciao e grazie mille per la guida!
1)
Volevo chiederti in che modo posso evitare che il file php per la creazione del coockie venga letto nella Index of se si digita il nome della directory che lo contiene?
Ad esempio, se digito: www.miodominio.com/directory/
mi compare l'elenco dei file contenuti nella directory e ovviamente mi appare anhe il file php per creare il cookie.
C'è un modo per evitare questa cosa?

2)
Eventualmente al posto di creare una directory posso mettere il file php direttamente nella root principale del sito?
es: www.miodominio.com/.../
il file creacoockie.php verrà indicizzato da google?

3)
Ultima cosa, sarebbe utile aggiungere al file robots.txt l'istruzione Disallow: /directory/ oppure no?

Grazie ancora...

=== Risposta
1)
Apache è mal configurato. assicurati che non ci sia l'opzione "Indexes" nel file di configurazione; se non puoi accedere al file aggiungi un .htaccess nella directory con
Options -Indexes
Quick & dirty: aggiungi un file index.php vuoto nella directory.

2)
puoi mettere il file dove vuoi, non verrà indicizzato se non è linkato. meglio in una directory specifica, una volta risolto il problema di cui sopra.

3)
NOOOOO!!! vedi i commenti precedenti. così fai sapere al mondo che c'è una directory in cui vuoi che nessuno guardi... indovina che farà il mondo ;)
basta che non vi sia alcul link alla directory, cosa che per altro sarebbe folle.

ciao,
marco
Citazione

Aggiungi commento

Please note: URL in text are not linked and user's site address is only for internal use and is not published.

Comments are human checked. All spam will be removed, so don't waste your time and, especially, mine!

Codice di sicurezza
Aggiorna

L'estate si avvicina hai già trovato l'albergo per le vacanze? cerca un albergo al mare o un hotel in montagna ove trascorrere le tue vacanze.