Table of Contents
[HOWTO] phpmyadmin security
La única manera de securizar el phpmyadmin es NOUSARLO
Descripcion
De todos es sabido que phpmyadmin no es precisamente seguro… para ello he decidido crear este minidoc de como intentar “asegurarlo” al máximo posible.
Instalación
Simplemente hace falta descargar la ultima version y descomprimir: http://www.phpmyadmin.net/home_page/downloads.php
o por svn
svn checkout https://phpmyadmin.svn.sourceforge.net/svnroot/phpmyadmin/tags/STABLE/phpMyAdmin phpMyAdmin-stable
Configuracion
Configuracion en el apache
Según mi punto de vista, lo más seguro será que se use únicamente HTTPS para el acceso al programa.
Para ello, podemos generar un certificado ssl propio con openssl en el server, aquí pongo un ejemplo de como hacerlo;
cd /etc/http/conf mkdir CA cd CA openssl genrsa -des3 -out ca.key 2048 openssl req -new -x509 -days 3650 -key ca.key -out ca.crt openssl genrsa -out `hostname`.key 2048 openssl req -new -key `hostname`.key -out `hostname`.csr openssl ca -keyfile ca.key -cert ca.crt -out `hostname`.crt -infiles `hostname`.csr openssl x509 -req -in `hostname`.csr -out `hostname`.crt -sha1 -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 mv `hostname`.crt ../ssl.crt/ mv `hostname`.csr ../ssl.csr/ mv `hostname`.key ../ssl.key/
Ya digo que es un EJEMPLO.
Con esto se genera un certificado de CA propio en el servidor (logicamente, saltará el aviso de ssl en el navegador) y nos autofirmamos el certificado para apache.
Ahora hace falta configurar un vhost para usarlo, como ultimamente se suele hacer, podemos usar el vhost por defecto:
_default_.conf
Pongo también un ejemplo de configuración:
<VirtualHost *:80> ServerAdmin webmaster@servername DocumentRoot /var/www/html/ ServerName servername ServerAlias www.servername <Location /phpMyAdmin> Order deny,allow Deny from all </Location> RewriteEngine On RewriteRule ^phpMyAdmin https://servername/phpMyAdmin/ </VirtualHost> <VirtualHost *:443> ServerAdmin webmaster@servername DocumentRoot /var/www/html/ ServerName servername ServerAlias www.servername ErrorLog "|/usr/sbin/rotatelogs -l /var/log/httpd/_default_.error_log.%Y.%m.%d 86400" CustomLog "|/usr/sbin/rotatelogs -l /var/log/httpd/_default_.access_log.%Y.%m.%d 86400" combined SSLEngine On SSLCipherSuite HIGH:MEDIUM SSLProtocol all SSLCertificateFile conf/ssl.crt/servername.crt SSLCertificateKeyFile conf/ssl.key/servername.key SSLCACertificateFile conf/CA/ca.crt Alias /phpMyAdmin /var/www/html/phpMyAdmin <Location /phpMyAdmin> Order deny,allow Deny from all # IPs del cliente Allow From ip1 Allow From ip2 Allow From ipN </Location> <Location /phpMyAdmin/libraries> Order deny,allow Deny from all #localhost files Allow from localhost 127.0.0.1 ip_server_01 ip_server_02 ip_server_0N </Location> RewriteEngine On </VirtualHost>
Lo más destacable es prohibir el acceso sin https en el vhost :80 y el *Location con las ip's permitidas del cliente (y las nuestras para probar). También se recomienda denegar el acceso a la localización:
/phpMyAdmin/libraries
Que contiene rutinas peligrosas
Configuracion en el phpMyAdmin
La configuración del phpmyadmin se puede hacer via web o directamente en el fichero de configuración del mismo, yo pongo directamente la del fichero.
cd /path/to/phpMyAdmin vi config.inc.php
<?php $cfg[['blowfish_secret']] = 'qeALvWxMQSs9NXNxMVomGBxBXu2AHHvL3Gqmnmok'; /* YOU MUST FILL IN THIS FOR SECURINGAUTH! */ $i = 0; $i++; /* Authentication type */ $cfg[['Servers']][[$i]][['auth_type']] = 'cookie'; /* Server parameters */ $cfg[['Servers']][[$i]][['host']] = 'localhost'; $cfg[['Servers']][[$i]][['connect_type']] = 'socket'; $cfg[['Servers']][[$i]][['socket']] = '/var/lib/mysql/mysql.sock'; $cfg[['Servers']][[$i]][['compress']] = false; $cfg[['Servers']][[$i]][['extension']] = 'mysql'; /* User for advanced features */ // $cfg[['Servers']][[$i]][['controluser']] = 'pma'; // $cfg[['Servers']][[$i]][['controlpass']] = 'pmapass'; /* Advanced phpMyAdmin features */ // $cfg[['Servers']][[$i]][['pmadb']] = 'phpmyadmin'; // $cfg[['Servers']][[$i]][['bookmarktable']] = 'pma_bookmark'; // $cfg[['Servers']][[$i]][['relation']] = 'pma_relation'; // $cfg[['Servers']][[$i]][['table_info']] = 'pma_table_info'; // $cfg[['Servers']][[$i]][['table_coords']] = 'pma_table_coords'; // $cfg[['Servers']][[$i]][['pdf_pages']] = 'pma_pdf_pages'; // $cfg[['Servers']][[$i]][['column_info']] = 'pma_column_info'; // $cfg[['Servers']][[$i]][['history']] = 'pma_history'; // $cfg[['Servers']][[$i]][['designer_coords']] = 'pma_designer_coords'; // dodger SPECIAL CONFIG $cfg[['ForceSSL']] = true ; $cfg[['Servers']][[$i]][['AllowRoot']] = false ; $cfg[['Servers']][[$i]][['hide_db']] = '(test|mysql|information_schema)'; /* * Directories for saving/loading files from server */ $cfg[['UploadDir']] = //; $cfg[['SaveDir']] = //; ?>
A destacar de este fichero:
Parametro | valores | |||
---|---|---|---|---|
$cfg[['blowfish_secret']] | Aleatorio | Esta es la frase que usa como semilla para encriptar passwords en las cookies | ||
$cfg[['Servers']][[$i]][['auth_type']] = 'cookie'; | config, http, signon, or cookie | cookie permite autenticar a los clientes individualmente y usar los usuarios de mysql | ||
$cfg[['ForceSSL']] = true ; | true/false | Fuerza a usar ssl si queremos entrar al myadmin | ||
$cfg[['Servers']][[$i]][['AllowRoot']] = false ; | true/false | Deshabilitamos root | ||
$cfg[['Servers']][[$i]][['hide_db']] = '(test|mysql|information_schema)'; | nombres de bbdd | Se ocultan las bases de datos que queramos, sea cual sea el usuario que entra, es diferente de los permisos de cada uno |
Para más información acerca de la configuración de phpMyAdmin, está la wiki oficial.