User Tools

Site Tools


securing_phpmyadmin

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.

securing_phpmyadmin.txt · Last modified: 2012/01/24 11:39 by dodger