Sitemap

Como proteger las credenciales de acceso a BD?

4 min readApr 19, 2019

--

Protege el acceso a tu Base de Datos

Como parte del día a día, llegamos al punto en que trabajamos con bases de datos y debemos proteger nuestros datos, cumplir con las políticas de privacidad de información, protección de datos sensibles, etc, etc.

Para esto recorrí varios caminos de como proteger/asegurar las credenciales de acceso a BD. En este post describo algunos tips que me parecieron los más adecuados. Espero con sus sugerencias poder actualizar constantemente este post.

Tip 1

Crear passwords de más de 30 caracteres, con combinación de mayúsculas, minúsculas, números y caracteres especiales. Existen varios servicios para la generación de passwords, solo googlea “generate password”.

Tip 2

No utilizar la misma combinación de usuario y password para otro servicio.

Tip 3

  • Mover fuera del codigo fuente las credenciales de acceso a la base de datos, a un archivo independiente de configuración.
  • Dejar la administración y la seguridad de dicho archivo al administrador del sistema. De esa manera los desarrolladores no necesitan conocer los passwords de producción, y no hay registro de los mismos en el sistema de control de versiones.

A continuación se muestran dos ejemplos muy parecidos, para el almacenamiento de las credenciales de acceso a la BD, el primero para guardar dentro del directorio público y el segundo para guardar fuera del directorio público.

Ejemplo 1: para PHP-SQL

a. Creamos el archivo config.php donde se guardan las credenciales de acceso a la base de datos. Se suele guardar en una carpeta /inc o /include o /private o la que gustes.

<?php
//Credenciales de acceso a la base de datos
$servidor = 'Url_servidor';
$usuario = 'Usuario_BD';
$pass = 'contraseña_BD';
$bbdd = 'nombre_BD';
?>

b. Luego creamos un archivo para la conexíon a la base de datos. Ej. dbconnect.php, que se suele almacenar en la misma carpeta.

<?php
require_once('config.php');

$connection = mysql_connect($servidor, $usuario, $pass)
or die('Error: Database to host connection: '.mysql_error());

mysql_select_db($bbdd, $dbh)
or die('Error: Select database: '.mysql_error());
?>

c. Se establece los permisos:

644 - para archivos
755 - para carpetas

d. Listo! Cuando debamos realizar una instruccion SQL en la BD, solo incluimos el archivo “dbconnect.php” y usamos la variable $connection que ejecuta la conexión a la BD.

Nota: Para otros lenguajes de programación, se puede seguir el mismo modelo, aplicando la lógica de programación de cada lenguaje.

Ejemplo 2: para PHP-SQL

a. Creamos el archivo config.ini donde se guardan las credenciales de acceso a la base de datos. Se suele guardar en una carpeta “/localhost/private/” o el nombre que gustes, al mismo nivel de la carpeta “/localhost/public_html/”. Esta ubicación no es accesible a otros de manera externa y no tiene un URL al estar por encima de la carpeta root.

Get Carlos López’s stories in your inbox

Join Medium for free to get updates from this writer.

Colocamos el archivo en: “/localhost/private/config.ini”

[database]
servidor = 'Url_servidor'
usuario = 'Usuario_BD'
pass = 'contraseña_BD'
bbdd = 'nombre_BD'

Este es un formato de configuración “.ini”, el cual tiene soporte por PHP de forma nativa.

b. Luego creamos un archivo para la conexíon a la base de datos. Ej. dbconnect.php, que se suele almacenar en “/localhost/public_html/includes/dbconnect.php”

<?php
function db_connect() {

// Definimos la conexión como una variable estática, a fin de evitar que se conecte más de una vez
static $connection;

// Si la conexión aun no se ha establecido, intentamos conectarnos a la base de datos
if(!isset($connection)) {
// Cargamos la configuraciópn como un array. Utilizamoa la ubicación del archivo de configuración
$config = parse_ini_file('../private/config.ini');
$connection = mysqli_connect($config['servidor'],$config['usuario'],$config['pass'],$config['bbdd']);
}

// Si no se conecta correctamente, manejamos el error
if($connection === false) {
// Manejo de error - notificamos al administrador, creamos un archivo log, mostramos un error en pantalla, etc.
return mysqli_connect_error();
}
return $connection;
}

// Conexión a la base de datos
$connection = db_connect();

// Revisamosconexión
if ($connection->connect_error) {
die("Connection failed: " . $connection->connect_error);
}
?>

Parseamos los valores de config.ini en un array $config, desde la ubicación en el servidor “../private/config.ini”, que es una dirección que solo puede ser accesada por el localhost, y esta fuera del rango via un URL.

c. Se establece los permisos:

644 - para archivos
755 - para carpetas

d. Listo! Cuando debamos conectarnos a la BD solo incluimos el archivo “dbconnect.php”

<?php
require_once('./includes/dbconnect.php');
?>

y para los queries llamamos la variable $connection que ejecuta la conexión a la BD “dbconnect()”.

<?php 
$sql = "SELECT id, title, stitle, date, section, content FROM articles";
$result = $connection->query($sql);
?>

En ambos ejemplos, si tenemos un error de SQL o PHP, solo se mostrará los nombres de las variables y no los valores que guardan las credenciales de acceso a la BD.

Tip 4: En servidor ajeno

Si esta haciendo hosting en un servidor al que “solo” tiene acceso al webroot (directorio donde se aloja el web), y no existe acceso fuera de este, se puede colocar las credenciales de conexión a la BD en un archivo por separado y asegurar el archivo con .htaccess

<files mypasswdfile>
order allow,deny
deny from all
</files>

Tip 5

Configurar el servidor de base de datos para que solo acepte conexiones desde el IP del servidor web para ese usuario. Si el servidor de BD y el servidor web, se encuentran en el mismo equipo, mejor aún, podemos utilizar localhost :)

Tip 6

Ofuscar el password. No pondrá mucha defensa si alguien tiene acceso al archivo, pero por lo menos evitará que alguien lo vea de manera casual.

Gracias por leerme!!! Me gustaría escuchar tus comentarios y sugerencias para nutrir este post.

Si te gusto y te es útil compartelo! y dale un 👏 (en los iconos de la izquierda) para que más personas vean este artículo. Comparte el conocimiento en tus redes sociales!

--

--

Carlos López
Carlos López

Tech, finance and data science enthusiast