Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Seguridad en La BASE DE DATOS
Seguridad en La BASE DE DATOS
Seguridad en La BASE DE DATOS
ISSN: 1994-1536
rcci@uci.cu
Universidad de las Ciencias Informáticas
Cuba
Resumen: Los sistemas de base de datos son de gran uso, el cual va desde el uso de bases de datos ligeras, bases de
datos en tiempo real (en algunas ocasiones obtenida a partir de la optimización de bases de datos relacionales) y bases
de datos relacionales con potentes gestores como aplicación proveedora del servicio. En el mundo del software libre
existen gran cantidad de gestores de bases de datos, entre los que se encuentran mysql, berkeley db, sqlite y
postgresql. Este último con gran número de seguidores y de personas de gran nivel en el mundo del desarrollo libre
que contribuyen a su propósito. El presente trabajo tiene como objetivo principal mostrar mediante una investigación
los diferentes mecanismos para realizar la configuración de la seguridad para el gestor de base de datos Postgres..
Palabras clave: bases de datos; gestores de bases de datos; postgresql; sofware libre; seguridad informática
Abstract: The database systems are of great use, which ranges from the use of light databases, real-time databases
(some times obtained from the optimization of relational databases) and relational databases with powerful managers
as application service provider. In the free software world there are plenty of database managers, among which are
mysql, berkeley db, sqlite and postgresql. Postgresql with a large number of fans and high-level people in the world
of free development that contribute to its purpose. This paper's main objective is to show, through an investigation of
different mechanisms to perform the security configuration for PostgreSQL database manager.
Keywords: database; database managers; postgresql; software free; informatic security
1. Introducción
En la actualidad el mundo de la informática se encuentra en constante desarrollo, a su vez lo hace también la rama de
esta ciencia que se dedica a encontrar errores, huecos en el diseño e implementación de las soluciones informáticos
ganando acceso al activo más importante de todo sistema, los recursos, comprometiendo en estos los principio de
fiabilidad, disponibilidad e integridad.
Se define una base de datos como una serie de datos organizados y relacionados entre sí, los cuales son recolectados y
explotados por los sistemas de información de una empresa o negocio en particular.
Cada base de datos se compone de una o más tablas, cada tabla tiene una o más columnas y filas. Las columnas
guardan una parte de la información sobre cada elemento, cada fila de la tabla conforma un registro.
Los sistemas de base de datos son de gran uso, el cual va desde el uso de bases de datos ligeras, bases de datos en
tiempo real (en algunas ocasiones obtenida a partir de la optimización de bases de datos relacionales) y bases de datos
relacionales con potentes gestores como aplicación proveedora del servicio.
En el mundo del software libre existen gran cantidad de gestores de bases de datos, entre los que se encuentran
MySQL, Berkeley DB, SQLite y postgresql. Este último con gran número de seguidores y de personas de gran nivel
en el mundo del desarrollo libre que contribuyen a su desarrollo.
El siguiente trabajo está orientado a brindar una guía, un acercamiento a los mecanismos de seguridad que brinda este
gestor de bases de datos que va desde la autenticación, control de acceso como a la seguridad en las comunicaciones
entre clientes y servidor por medio de mecanismos de cifrado y descifrado usando protocolo SSL.
2. Desarrollo.
Consiste en asegurar los archivos de datos: bases de datos y configuración, mediante lo permisos definidos en el
sistema operativo. La instalación de postgres garantiza dichos permisos.
Su objetivo es determinar qué equipos están autorizados a acceder a sus datos. PostgreSQL utiliza el archivo
pg_hba.conf encontrado en /etc/postgresql/8.3/main/ para controlar el acceso de los clientes. Cuando una aplicación
cliente intenta conectarse a un servidor PostgreSQL le envía un nombre de usuario y de la base de datos.
Formato: [Tipo de conexión][database][usuario][IP][Netmask][Tipo de autenticación][opciones]
Tipos de conexiones.
local: es utilizada para las conexiones usando sockets de dominio UNIX. Sin un registro de este tipo las
conexiones de socket de dominio Unix no se permiten.
host: este registro coincide con los intentos de conexión realizados a través de TCP / IP con SSL o no.
hostssl: este registro coincide con los intentos de conexión realizados a través de TCP / IP pero sólo
cuando se realiza la conexión con el cifrado SSL. Para hacer uso de esta opción debe estar el servidor
integrado con soporte SSL. Además SSL debe estar habilitado en el momento de inicio del servidor
activando el parámetro de configuración SSL.
hostnossl: este tipo de registro es el opuesto al hostssl.
Tipos de autenticación.
trust: es el método menos seguro de todos. Este método de autenticación es útil en las máquinas de un solo
usuario donde la identidad se comprueba al proporcionar una contraseña de autenticación al sistema
operativo. No se debe utilizar para autenticar en un intento de conexión en una red insegura.
reject: es el método más seguro de todos. Cuando un cliente intenta conectarse desde un sistema de
autenticación por este método el intento de conexión se rechaza.
password: cuando se utiliza autenticación de contraseña el cliente tiene que demostrar su identidad
mediante la presentación de una contraseña válida. Tiene como principal desventaja que la contraseña
viaja por la red en texto plano.
crypt: se basa en la autenticación por contraseña encriptada. El servidor las encripta y las compara pero las
guarda en texto plano.
md5: este método está basado en la autenticación por contraseña encriptada con md5. La contraseña es
salvada en el servidor con este formato.
De esta forma se puede combinar todas las combinaciones que ofrece este fichero de configuración.
El propietario de una tabla tiene todos los privilegios de seleccionar, insertar, actualizar o eliminar filas dentro de esa
tabla, a menos que otorgan privilegios a otro usuario, usted es la única persona que puede tener acceso a esa tabla.
Se puede transferir la propiedad de una tabla a otro usuario utilizando el comando ALTER TABLE tabla OWNER TO
nuevo Propietario. Es necesario ser un superusuario PostgreSQL para transferir dicha propiedad.
Si se quiere que otros usuarios tengan acceso a las tablas es necesario conceder una o más privilegios. Por ejemplo si
desea que un usuario pueda seleccionar datos de una tabla se utiliza el siguiente comando:
Si se cambia de opinión puede negar los privilegios antes concedidos con el comando REVOKE:
Código Privilegio
a INSERT
r SELECT
w UPDATE
d DELETE
R RULES
x REFERENCES
t TRIGGERS
X EXECUTE
U USAGE
C CREATE
T TEMPORARY
* GRANT (puede conferir privilegios a otros usuarios)
arwdRxt Todos
Administración de usuarios.
Para crear un usuario se utiliza el comando CREATE USER.
CREATEDB / NOCREATEDB:
Permite al usuario crear nuevas bases de datos. Si utiliza NOCREATEDB se denega al usuario esta posibilidad. Si no
se especifica NOCREATEDB es la opción por defecto.
CREATEUSER / NOCREATEUSER:
Permite al usuario crear nuevos usuarios. Si utiliza NOCREATEUSER se denega al usuario esta posibilidad. Si no se
especifica NOCREATEUSER es la opción por defecto.
CREATEROLE / NOCREATEROLE:
Permite al usuario crear nuevos role. Si se utiliza NOCREATEROLE se deniega al usuario esta posibilidad. Si no se
especifica NOCREATEROLE es la opción por defecto.
groupname:
Nombre de un grupo ya existente en el que se desea insertar al usuario como un nuevo miembro.
Varios nombres de grupo pueden ser enumerados.
passsword:
Las dos últimas opciones son un tanto similares. Puede crear una contraseña inicial para un nuevo
usuario mediante la inclusión de la contraseña (encriptada o no). Si no se especifica una contraseña
cuando se crea un nuevo usuario y se está utilizando contraseñas para autenticar las conexiones de
clientes el usuario no podrá conectarse. Si se decide crear una contraseña encriptada (opción por
defecto) se almacenará de forma cifrada en la tabla de sistema pg_shadow.
expiration:
Define una fecha de caducidad de la contraseña. Si se omite esta opción la contraseña nunca caduca.
Ejemplo:
Administración de grupos.
Se pueden definir grupos de usuarios para una mejor administración de los usuarios. Cada grupo puede incluir a cero
o más usuarios. Cada usuario puede pertenecer a uno o más grupos. Al conceder o revocar privilegios de un objeto se
puede identificar a un usuario específico o un grupo de usuarios.
PUBLICA es un gropo virtual. No se puede agregar o eliminar miembros pero se puede asociar con privilegios
PUBLICA. Cada usuario es automáticamente un miembro de este grupo. Para crear nuevos grupos se utiliza la
sentencia CREATE GROUP.
CREATE GROUP group-name [[WITH] option [...]]
option := SYSID group-id-number
| USER username, ...
SYSID:
Ejemplo:
Editar el fichero /etc/postgresql/8.3/main/pg_hba.conf e insertar las siguientes líneas en la sesión IPv4 local
connections.
De esta forma se permitirá el acceso por tcp/ip encriptado a la bases de datos db_security como usuario postgres o
scada desde cualquier ordenador y método de autenticación md5. Se recomienda cambiar la subred con el objetivo de
filtrar los posibles hosts que se puedan conectar al gestor.
Con el cifrado del tráfico entre los clientes y el servidor evitamos que alguien pueda interceptar el tráfico de red y
conseguir los datos que viajan por la conexión. PostgreSQL soporta nativamente el uso de conexiones SSL para cifrar
las comunicaciones, el único requerimiento es tener OpenSSL instalado en el servidor.
# mkdir -m 0755 \
/etc/CA_local \
/etc/CA_local/private \
/etc/CA_local/certs \
/etc/CA_local/newcerts \
/etc/CA_local/crl
# cp /etc/ssl/openssl.cnf /etc/CA_local/openssl.local.cnf
# chmod 0600 /etc/CA_local/openssl.local.cnf
# touch /etc/CA_local/index.txt
# echo '01' > /etc/CA_local/serial
# echo '01' > /etc/CA_local/crlnumber
Crear un certificado CA que utilizaremos para firmar los certificados que usemos localmente en nuestro sistema.
# cd /etc/CA_local/
# openssl req -config openssl.local.cnf -new -x509 -extensions v3_ca \
-keyout private/local_ca.key -out certs/local_ca.crt -days 1825
Este último comando creará un certificado CA autofirmado con una validez de 5 años. Tenemos que definir una
contraseña para la llave privada CA (no olvidar esta contraseña ya que se necesitará cada vez que usemos el
certificado local CA) y rellenar algunos parámetros para el sistema.
Una vez realizado estos pasos se habrán creado dos ficheros en el sistema:
El fichero CRL (Certificate Revocation List) con la lista de certificados revocados por este CA se crea de la siguiente
forma:
Y se puede verificar:
Tenemos que generar una solicitud de certificado (server.csr) para generar un certificado que se pueda usar en nuestro
servidor. Para ello podemos utilizar los siguientes comandos:
# cd /etc/CA_local/
# openssl req -config openssl.local.cnf -new -nodes \
-keyout private/nuevoCertificado.key \
-out nuevoCertificado.csr -days 730
Con esto generamos la solicitud de certificado con una validez de 2 años, después de rellenar algunos parámetros de
nuestro sistema. Los parámetros a rellenar obligatoriamente son "Common Name" y "Email Address". "Common
Name" debería de tener el nombre de la máquina que va a estar utilizando el certificado y "Email Address" es la
dirección de contacto de vuestro sistema.
No es necesario introducir nada en los parámetros "challenge password" y "optional company name" del final. Hemos
utilizado el parámetro -nodes para no tener que proteger nuestra llave privada con una contraseña y no tener que
escribir una contraseña cada vez que arranquemos un servicio que use el certificado. Por ello es muy importante no
perder ó publicar el fichero con la llave privada.
# cd /etc/CA_local/
# openssl ca -config openssl.local.cnf -policy policy_anything \
-days 730 -out certs/nuevoCertificado.crt \
-infiles nuevoCertificado.csr
Tendremos que utilizar la contraseña que usamos cuando creamos el certificado CA para terminar de firmar nuestro
certificado.
Aseguramos mejor la clave privada del certificado. Este fichero es privado y no se debe de distribuir:
# cd /etc/CA_local/
# openssl x509 -in certs/nuevoCertificado.crt -noout -text
# cd /etc/CA_local/
# openssl verify -purpose sslserver -CAfile /etc/CA_local/certs/local_ca.crt \
/etc/CA_local/certs/nuevoCertificado.crt
# rm /etc/CA_local/nuevoCertificado.csr
/etc/CA_local/certs/local_ca.crt: Certificado CA local que puedes utilizar para firmar otros certificados.
ssl = on
Reiniciamos Postgres.
# /etc/init.d/postgresql-8.3 restart
Si durante la autenticación se muestra la siguiente línea nos indica que la conexión está cifrada vía SSL.
PostgreSQL crea por defecto a un superusuario llamado postgres que permitirá el acceso del módulo de Seguridad.
Todos los demás usuarios pueden ser creados por él. Para permitir el acceso de los demás módulos que necesiten de la
base de datos de Seguridad se creará un usuario scada con algunos permisos restringidos.
Nos autenticamos como usuario postgres en un terminal y ejecutamos la siguiente consulta con la contraseña y fecha
de expiración deseada:
El usuario SCADA no tendrá ningún tipo de permisos inicialmente. (Ver Actualizar permisos).
Actualizar permisos.
Se le dará permisos de tipo SELECT para todas las tablas al usuario scada.
Culminando la configuración.
Para que los cambios realizados tengan efecto es necesario reiniciar los servicios de postgres.
# /etc/init.d/postgresql-8.3 restart
A partir de la versión 8.4.0 de PostgreSQL también se pueden utilizar certificados digitales para autentificar a los
usuarios que se quieran conectar con el servidor.
Este tipo de autenticación se activa usando el método 'cert' en la opción método cuando se define el acceso en
pg_hba.conf. Si se usa este método de autenticación no se necesitará escribir ninguna clave de acceso pero se debe de
proveer un certificado valido.
El atributo CN (lo que se define en 'Common Name (eg, YOUR name):') del certificado es el atributo que se
comprueba para ver si corresponde con el usuario con el que se intenta conectar.
Lo primero que tenemos que hacer es crear un certificado para nuestro usuario ('Common Name (eg, YOUR name):
postgres') y firmarlo con nuestro certificado CA local. A continuación copiamos este certificado y la llave privada a
/home/postgresql/.postgresql/postgresql.crt y /home/postgresql/.postgresql/postgresql.key en el ordenador cliente.
Después es necesario que actualizar el fichero /etc/postgresql/8.3/main/pg_hba.conf con una línea similar a esta:
# /etc/init.d/postgresql-8.3 restart
Si no tuviésemos el certificado correcto instalado el sistema nos daría un error similar al que se obtiene cuando la
autenticación con certificado del ordenador cliente falla.
3. Conclusiones
Una vez alcanzado los objetivos trazados para esta investigación se puede arribar a las siguientes conclusiones:
Se dotó de un conocimiento a todos los lectores para la configuración del módulo de seguridad de
postgres.
4. Bibliografía
Alarcón Medina, José Manuel. Administración GGBD PostgreSQLseptiembre – octubre 2007. [Consultado: marzo
2010].
Alvarez, Sara. Sistema de gestores de base de datos. [En línea]. Desarrolloweb. [Consultado: 9 de marzo de 2010.]
Disponible en Internet: <http://www.desarrolloweb.com/articulos/sistemas-gestores-bases-datos.html>
Clasificación de Respaldos [En Línea] 2005 [Consultado: 2 diciembre 2009] Disponible en Internet:
http://www.osmosislatina.com/soporte/respaldos.htm
De la HorraDiaz, Abdelaziz. Desarrollo del subsistema de comunicación para el Módulo Base de Datos de Históricos
del proyecto SCADA Nacional. [Consultado: Enero de 2010].
Manual básico de cron [En Línea] [Consultado: 15 de febrero 2010] Disponible en Internet:
http://www.linuxtotal.com.mx/index.php?cont=info_admon_006
Portal en español sobre PostgreSQL. (22 de 03 de 2009). [Consultado: Enero de 2010], Disponible en
Internet:http://www.postgresql-es.org
PostgreSQL. [Consultado: Enero de 2010],Disponible en Internet:http://www.postgresql.org