Come proteggere phpMyAdmin

Ho notato che ci sono strane richieste al mio sito Web che cercano di trovare phpmyadmin, come

/phpmyadmin/ /pma/ 

eccetera.

Ora ho installato PMA su Ubuntu tramite apt e vorrei accedervi tramite webaddress diverso da / phpmyadmin /. Cosa posso fare per cambiarlo?

Grazie


Aggiornare

Per Ubuntu 9.10 e Apache2, l'impostazione corrispondente si trova nel file /etc/apache2/conf.d/phpmyadmin.conf che è un collegamento a /etc/phpmyadmin/apache.conf . Il file contiene

 Alias /phpmyadmin /usr/share/phpmyadmin 

where il primo /phpmyadmin dovrebbe essere cambiato in qualcosa di diverso se si vuole evitare l'attività non necessaria, ad esempio:

 Alias /secret /usr/share/phpmyadmin 

La più grande minaccia è che un utente malintenzionato possa sfruttare una vulnerabilità come; attraversamento di directory, o usando SQL Injection per call load_file() per leggere il nome utente / password in chiaro nel file di configuration e quindi effettuare il login usando phpmyadmin o over tcp port 3306. Come pentester ho usato questo model di attacco per compromettere un sistema.

Ecco un ottimo modo per bloccare phpmyadmin:

  • NON PERMETTARE LOGIN RADICI REMOTE! Phpmyadmin può invece essere configurato per utilizzare "Cookie Auth" per limitare l'accesso dell'utente al sistema. Se hai bisogno di alcuni privilegi di root, crea un account personalizzato che può aggiungere / eliminare / creare ma non ha grant o file_priv .
  • Rimuovi permessi file_priv da each account. file_priv è uno dei privilegi più pericolosi in MySQL perché consente a un utente malintenzionato di leggere file o caricare una backdoor.
  • Indirizzo IP della whitelist che ha accesso all'interface phpmyadmin. Ecco un esempio .htaccess reulset:
 Order deny,allow Deny from all allow from 199.166.210.1 
  • Non si dispone di un path di file prevedibile come: http://127.0.0.1/phpmyadmin . Scanner di vulnerabilità come Nessus / Nikto / Acunetix / w3af eseguiranno la ricerca per questo.

  • Firewall off tcp port 3306 in modo che non possa essere accessibile da un utente malintenzionato.

  • Usa HTTPS, altrimenti i dati e le password possono essere divulgati a un utente malintenzionato. Se non vuoi sborsare $ 30 per un certificato, utilizza un autofirmato. Lo accettenetworking una sola volta e anche se fosse stato modificato a causa di un MITM verrai avvisato.

Uno dei miei dubbi su phpMyAdmin era che, per impostazione predefinita, tutti gli utenti MySQL possono accedere al db. Se la password di root di DB è compromise, qualcuno può distruggere il db. Volevo trovare un modo per evitarlo limitando quale utente MySQL può accedere a phpMyAdmin.

Ho trovato che usare la configuration di AllowDeny in PhpMyAdmin è molto utile. http://wiki.phpmyadmin.net/pma/Config#AllowDeny_.28rules.29

AllowDeny consente di configurare l'accesso a phpMyAdmin in modo simile ad Apache. Se imposti esplicitamente l'ordine, concederà l'accesso solo agli utenti definiti nella sezione "regole". Nelle regole, la sezione limita gli utenti MySql che possono accedere utilizzando phpMyAdmin.

 $cfg['Servers'][$i]['AllowDeny']['order'] = 'explicit' $cfg['Servers'][$i]['AllowDeny']['rules'] = arrays('pma-user from all') 

Ora hai un accesso limitato all'utente chiamato pma-user in MySQL, puoi concedere un privilegio limitato a quell'utente.

 grant select on db_name.some_table to 'pma-user'@'app-server' 

Nelle versioni più recenti di phpMyAdmin è ansible impostare le autorizzazioni di accesso per i nomi utente + indirizzi IP all'interno del file config.inc.php di phpMyAdmin. Questo è un metodo molto migliore e più robusto per limitare l'accesso (tramite URL hard-coding e indirizzi IP nel httpd.conf di Apache).

Ecco un esempio completo di come passare alla white-list di tutti gli utenti (nessuno al di fuori di questo elenco sarà consentito l'accesso), e anche come limitare la root dell'utente al sistema locale e solo alla networking.

 $cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow'; $cfg['Servers'][$i]['AllowDeny']['rules'] = arrays( 'deny % from all', // deny everyone by default, then - 'allow % from 127.0.0.1', // allow all local users 'allow % from ::1', //'allow % from SERVER_ADDRESS', // allow all from server IP // allow user:root access from these locations (local network) 'allow root from localhost', 'allow root from 127.0.0.1', 'allow root from 10.0.0.0/8', 'allow root from 172.16.0.0/12', 'allow root from 192.168.0.0/16', 'allow root from ::1', // add more usernames and their IP (or IP ranges) here - ); 

Fonte: come installare e proteggere phpMyAdmin su localhost per Windows

Ciò offre restrizioni di accesso molto più dettagliate rispetto alle autorizzazioni URL di Apache o un file .htaccess in grado di fornire, a livello di nome utente MySQL.

Assicurati che l'utente con cui accedi, abbia il suo Host: MySQL Host: field impostato su 127.0.0.1 o ::1 , poiché phpMyAdmin e MySQL si trovano sullo stesso sistema.

Molto probabilmente, da qualche parte sul tuo webserver ci sarà una direttiva Alias ​​come questa;

 Alias /phpmyadmin "c:/wamp/apps/phpmyadmin3.1.3.1/" 

Nella mia configuration di wampserver / localhost, era in c: /wamp/alias/phpmyadmin.conf.

Basta cambiare la direttiva alias e dovresti essere a posto.

Un'altra soluzione è usare il file di configuration senza alcuna impostazione. La prima volta potresti wherer includere il tuo login / password di mysql root in modo che possa installare tutte le sue cose ma poi rimuoverlo.

$ cfg ['Server'] [$ i] ['auth_type'] = 'cookie';

$ cfg ['Server'] [$ i] ['host'] = 'localhost';

$ cfg ['Server'] [$ i] ['connect_type'] = 'tcp';

$ cfg ['Server'] [$ i] ['compress'] = falso;

$ cfg ['Server'] [$ i] ['extension'] = 'mysql';

Lasciandolo così senza alcun alias apache / lighhtpd ti presenterà solo uno schermo di accesso. inserisci la descrizione dell'immagine qui

È ansible accedere con root ma si consiglia di creare altri utenti e consentire solo l'accesso locale root. Ricorda inoltre di utilizzare password string, anche se brevi ma con maiuscole e numero di caratteri speciali. per esempio !34sy2rmbr! alias "easy 2 remember"

-EDIT: Una buona password ora un giorno è in realtà qualcosa di simile a parole che non hanno senso grammaticale ma puoi ricordare perché sono divertenti . O usare keepass per generare forti rand e avere un facile accesso a loro

Se stai usando un server Linux:

  • Usando SSH è ansible proibire l'accesso utente / password e accettare solo una chiave pubblica nel file authorized_keys
  • Usa lo stucco per connetterti al tuo server e apri un terminal remoto
  • Inoltra X11 e port localhost firefox / iceweasel sul desktop (in Windows hai bisogno del software Xming installato)
  • Ora hai protetto phpMyAdmin tramite ssh

Questo sistema è abbastanza sicuro / a portta di mano per i server domestici, di solito con tutte le porte bloccate di default. Devi solo inoltrare la port SSH (non utilizzare il numero 22).

Se ti piace Microsoft Terminal Server puoi persino impostare un tunnel SSH sul tuo computer e collegarlo in modo sicuro al tuo server web.

Con ssh tunneling è persino ansible inoltrare la port 3306 del server remoto a una port locale e connettersi utilizzando phpMyAdmin o MySQL Workbench locali.

Comprendo che questa opzione è eccessiva, ma è sicura quanto l'accesso alla tua chiave privata.

L'approccio più semplice sarebbe quello di modificare il webserver, molto probabilmente un'installazione di Apache2, la configuration e dare a phpmyadmin un nome diverso.

Un secondo approccio sarebbe quello di limitare gli indirizzi IP da cui phpmyadmin può accedere (ad esempio solo local local o localhost).

Il modo migliore per proteggere phpMyAdmin è la combinazione di tutti questi 4:

 1. Change phpMyAdmin URL 2. Restrict access to localhost only. 3. Connect through SSH and tunnel connection to a local port on your computer 4. Setup SSL to already encrypted SSH connection. (x2 security) 

Ecco come fare tutto questo: Ubuntu 16.4 + Apache 2 Setup Windows computer + PuTTY per connettere e tunnelare la connessione SSH ad una port locale:

 # Secure Web Serving of phpMyAdmin (change URL of phpMyAdmin): sudo nano /etc/apache2/conf-available/phpmyadmin.conf /etc/phpmyadmin/apache.conf Change: phpmyadmin URL by this line: Alias /newphpmyadminname /usr/share/phpmyadmin Add: AllowOverride All <Directory /usr/share/phpmyadmin> Options FollowSymLinks DirectoryIndex index.php AllowOverride Limit ... sudo systemctl restart apache2 sudo nano /usr/share/phpmyadmin/.htaccess deny from all allow from 127.0.0.1 alias phpmyadmin="sudo nano /usr/share/phpmyadmin/.htaccess" alias myip="echo ${SSH_CONNECTION%% *}" # Secure Web Access to phpMyAdmin: Make sure pma.yourdomain.com is added to Let's Encrypt SSL configuration: https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04 PuTTY => Source Port (local): <local_free_port> - Destination: 127.0.0.1:443 (OR localhost:443) - Local, Auto - Add C:\Windows\System32\drivers\etc Notepad - Run As Administrator - open: hosts 127.0.0.1 pma.yourdomain.com https://pma.yourdomain.com:<local_free_port>/newphpmyadminname/ (HTTPS OK, SSL VPN OK) https://localhost:<local_free_port>/newphpmyadminname/ (HTTPS ERROR, SSL VPN OK) # Check to make sure you are on SSH Tunnel 1. Windows - CMD: ping pma.yourdomain.com ping www.yourdomain.com # See PuTTY ports: netstat -ano |find /i "listening" 2. Test live: https://pma.yourdomain.com:<local_free_port>/newphpmyadminname/ 

Se sei in grado di fare tutto questo con successo,

 you now have your own url path for phpmyadmin, you denied all access to phpmyadmin except localhost, you connected to your server with SSH, you tunneled that connection to a port locally, you connected to phpmyadmin as if you are on your server, you have additional SSL conenction (HTTPS) to phpmyadmin in case something leaks or breaks. 

È ansible utilizzare il seguente command:

 $ grep "phpmyadmin" $path_to_access.log | grep -Po "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | sort | uniq | xargs -I% sudo iptables -A INPUT -s % -j DROP 

Spiegazione:

Assicurati che il tuo IP non sia elencato prima di eseguire il piping tramite iptables drop !!

Questo per prima cosa troverà tutte le linee in $ path_to_access.log che hanno phpmyadmin in loro,

quindi annullare l'indirizzo IP dall'inizio della row,

quindi ordinare e renderli unici,

quindi aggiungi una regola per rilasciarli in iptables

Di nuovo, basta modificare in echo % alla fine invece del command iptables per assicurarti che il tuo IP non sia lì. Non vietare inavvertitamente l'accesso al server!

limitazioni

Potrebbe essere necessario modificare la parte grep del command se si è su mac o su qualsiasi sistema che non ha grep -P. Non sono sicuro che tutti i sisthemes inizino con xargs, quindi potrebbe essere necessario installarli. È comunque molto utile se fai un sacco di cose.