CONEXIÓN Y
ENCRIPTACION DE UNA
BASE DE DATOS PYTHON-
POSTGRESQL
Reporte
1 ÍNDICE
2 Cifrando la conexión a una base de datos PostgreSQL ......................................................................... 3
2.1 Requisitos ...................................................................................................................................... 3
2.1.1 Virtualización de CentOS....................................................................................................... 3
2.1.2 Instalación del servidor postgresql ....................................................................................... 7
2.1.3 Instalación de Python.......................................................................................................... 11
2.1.4 Instalación de PyGreSQL ..................................................................................................... 11
2.1.5 Instalación de pgAdmin....................................................................................................... 11
2.2 Creación de la base de datos ...................................................................................................... 12
2.3 Conectar con la base de datos localmente ................................................................................. 13
2.3.1 Conectar con la base de datos localmente ......................................................................... 13
2.3.2 Conectarse a la base de datos desde pgAdmin.................................................................. 13
2.3.3 Conexión a la base de datos desde Python......................................................................... 16
2.4 Programa de encriptación de usuario y contraseña ................................................................... 17
2.4.1 Ejecución del programa en el cliente .................................................................................. 17
2.4.2 Código del programa........................................................................................................... 20
2.4.3 Funcionamiento de la aplicación ........................................................................................ 23
3 Conclusiones ....................................................................................................................................... 24
2 CIFRANDO LA CONEXIÓN A UNA BASE DE DATOS POSTGRESQL
2.1 REQUISITOS
Para la realización de este proyecto, se necesitó instalar CentOS y posteriormente:
En CentOS:
Servidor postgresql
Python
PyGreSQL
En Windows:
pgAdmin III
2.1.1 Virtualización de CentOS
En VirtualBox clicamos en la pestaña “nueva”, y a continuación empezamos a crear nuestra maquina
virtual.
Asignamos la memoria RAM para la máquina virtual.
Hacemos clic en crear (disco duro virtual)
Elegimos VirtualBox Disc Image.
Elegimos reservado dinámicamente.
Finalmente elegimos la capacidad de almacenamiento que asignaremos a nuestra máquina virtual.
Hecho esto Podemos iniciar la virtualización de CentOS, podemos insertar el CD en la unidad lectora o
montar una unidad virtual.
Presionamos en Iniciar
Elegimos la opción de instalación, en la siguiente pantalla elegimos SKIP
A continuación seguimos las instrucciones de instalación, todo es en realidad muy sencillo e intuitivo.
2.1.2 Instalación del servidor postgresql
Para poder instalar el servidor postgresql e iniciar la base de datos se ejecutan en la terminal los siguientes
comandos en CentOS:
Instalar
# yum install postgresql postgresql-server
Inicializar la Base de datos
# service postgresql initdb
Iniciar daemon
# service postgresql start
Arrancar el daemon por defecto en los niveles de inicio 2,3, y 5.
# chkconfig --levels 235 postgresql on
2.1.2.1 Edicion de los archivos pg_hba.conf y postgresql.conf
Una vez instalado el servidor, debemos configurar los archivos pg_hba.conf y postgresql.conf.
Para modificar el archivo postgresql.conf nos logueamos como usuario postgres
# su –l postgres
Con el comando vin accedemos al archivo postgresql.conf
$ vin data/postgresql.conf
En el archivo buscamos el encabezado “Connections and Authentication”
Originalmente el atributo listen_addresses esta comentado, se debe descomentar y asignarle como valor
el simbolo asterisco (*), esto para que el servidor sea capaz de escuchar cualquier diección ip, se pueden
especificar tambien por separado las direcciones deseadas.
El otro valor que se debe modificar es el puerto, por defecto es el 5432, esta linea esta comentada
originalmente, por lo tanto la descomentamos.
Presionamos la tecla ESC para indicar que estamos listos para salir y tecleamos “ :wq “ para salir de la
edición del archivo guardando los cambios. Para que los cambios tengan efectos se debe reiniciar el
servicio postgresql
# service postgresql restart
Ahora abrimos el archivo pg_hba.conf
$ vin data/pg_hba.conf
Se nos mostrará en pantalla lo siguiente:
Aquí lo que se hace es especificar cuales hosts vamos a permitir se conecten al servidor en la red local. Y
se modifica el campo METHOD como md5 para cada una de las direcciones de la tabla. Para que los
cambios tengan efectos se debe reiniciar el servicio postgresql
# service postgresql restart
2.1.2.2 Configuración del cortafuegos
Para poder aceptar conexiones, un paso más es necesario. Vaya a Sistema> Administracion> Cortafuegos
De clic en la pestaña otros puertos, y presione el botón Añadir.
Se le presentara la ventana “Puerto y Protocolo”, aquí busque los puertos 5432 de tcp y udp y añádalos.
Después de clic en aplicar y reinicie el servicio postgresql desde consola.
2.1.3 Instalación de Python
Para instalar Python solo es necesario ejecutar el siguiente comando en consola:
# yum install Python
2.1.4 Instalación de PyGreSQL
Este paquete es necesario para poder conectar Python con la base de datos, para instalarlo solo se
ejecuta el comando:
# yum install PyGreSQL
2.1.5 Instalación de pgAdmin
pgAdmin es una plataforma de administración y desarrollo para PostGreSQL
En la siguiente dirección usted puede descargar pgAdmin III en su versión más reciente para Windows:
http://www.pgadmin.org/download/windows.php
2.2 CREACIÓN DE LA BASE DE DATOS
Despues de instalar postgresql, puede revisar el estado del servicio con:
# service postgres status
Si el servicio corre de manera correcta, ahora usted puede loguearse como usuario postgres:
# su –l postgres
Una vez logueado con el usuario postgres, usted puede crear nuevos usuarios o nuevas base de datos
Para crear un usuario solo necesita especificar el nombre del usuario y una contraseña:
$ createuser miUsuario –P
La terminal le pedirá establecer la contraseña correspondiente, se le preguntará si el usuario va a ser un
super usuario y si se le permite la creación de nuevos roles.
Para crear una base de datos se usa el siguiente comando:
$ createdb miBD –owner= dueñoDB
Se debe espeficicar el nombre de la nueva base de datos y que usuario sera el administrador de la
misma
2.3 CONECTAR CON LA BASE DE DATOS LOCALMENTE
2.3.1 Conectar con la base de datos localmente
Para conectarse localmente a la base de datos y desde la consola de postgresql, se usa el comando:
$ psql –U miUsuario –d miDB
Y de esta manera estará listo para empezar a modificar la base de datos agregando tablas, borrando
tablas o cualquiera que sea la operación a realizar.
2.3.2 Conectarse a la base de datos desde pgAdmin
Una vez que la dirección ip del host a conectarse se ha dado de alta, en pgAdmin haga clic en nueva
conexión.
En la ventana New Server Registration, llene los campos con los datos de la conexión y presiones OK
Si la conexión es exitosa la imagen anterior es un ejemplo de lo que puede aparecer, en caso de que la
conexión no se alcance a establecer, asegúrese de que:
- Su dirección este registrada en el archivo pg_hba.conf del servidor
- La configuración del cortafuegos en el servidor sea la adecuada
- Los datos ingresados sean los correctos
2.3.3 Conexión a la base de datos desde Python
La primera prueba que se realizó desde Python, se hizo desde consola.
En la terminal, ejecutar:
# python
La sentencia siguiente, sólo funcionará si realizó la instalación del PyGreSQL.
>>> from pg import DB
Y a continuación
>>> db = DB(‘nombre_bd’, ’ip_servidor’, puertoDeConexion, ‘ ’, ‘ ’, ‘usuario’, ‘contraseña’ )
En este punto, ya se pueden realizar consultas o hacer inserciones en las tablas de la base de datos.
2.4 PROGRAMA DE ENCRIPTACIÓN DE USUARIO Y CONTRASEÑA
El objetivo de este programa es conectar un cliente con una base de datos en otro host. El usuario debe
tener conocimiento de:
- El nombre de la base de datos
- La contraseña del usuario
- El dueño de la base de datos o usuario
- La dirección IP donde se encuentra alojada la base de datos
2.4.1 Ejecución del programa en el cliente
El archivo conecta.py contiene el código necesario para realizar una conexión a la base de datos.
En el cliente, ejecutar el archivo conecta.py
Se abrirá una terminal y se le pedirá identificarse, a continuación deberá especificar la dirección IP del
servidor y la base de datos a la cual quiere conectarse.
Si los datos ingresados son correctos se le presentará una pantalla, indicando que se ha conectado a la
base de datos exitosamente y como muestra, aparecerá en pantalla el resultado de una consulta.
Si al ingresar los datos en el cliente hubiera un error, ya sea una contraseña incorrecta, un usuario
invalido o una dirección IP no correspondiente se le mostrará un mensaje, indicando el fracaso de la
conexión.
2.4.2 Código del programa
#!/usr/bin/python # Indica la ubicacion del ejecutable de python en la maquina cliente
print ("Para conectarse al servidor debe identificarse...")
from pg import DB #Sentencia que importa la libreria DB para poder realizar la conexion.
userDesc='' #Variable que almacenara el nombre del usuario desencriptado
pasDes='' #Variable que almacenara el valor de la contraseña desencriptada
user='' #Variable que almacenara el nombre del usuario, de manera temporal
cont='' #Variable que almacenara el valor de la contraseña de la base de datos, de manera temporal
userEn='' #Variable que almacenara el nombre de usuario, pero encriptado
pasEn='' #Variable que almacenara la contraseña encriptada
ip='' #Variable que almacenara la direccion IP del servidor
nombreDB='' #Variable que almacenara el nombre de la base de datos
def cifraUser(userDesc): #Funcion que cifra lo que haya en 'user' y lo guarda en 'userEn'
for c in userDesc:
global userEn
userEn+=chr(ord(c)^83)
return userEn
def cifraPass(pasDes): #Funcion que cifra lo que haya en 'cont' y lo guarda en 'pasEn'
for c in pasDes:
global pasEn
pasEn+=chr(ord(c)^97)
return pasEn
def descifraUser(userEnc): #Funcion que descifra lo que hay en 'userEn' y lo guarda en 'userDesc'
for c in userEnc:
global userDesc
userDesc+=chr(ord(c)^83)
return userDesc
def descifraPass(passEnc): #Funcion que descifra lo que hay en 'PasEn' y lo guarda en 'pasDes'
for c in passEnc:
global pasDes
pasDes+=chr(ord(c)^97)
return pasDes
def captura(): #Funcion que pide al usuario ingresar los datos indicados
global user
global cont
global ip
user= raw_input('Teclee su usuario: ')
cont= raw_input('Teclee su password: ')
ip= raw_input('Teclee la direccion ip del servidor: ')
nombreDB= raw_input('Teclee el nombre de la base de datos a acceder: ')
captura() #Invocacion a la funcion captura() para obtener los datos iniciales
cifraUser(user) #Invocacion a la funcion cifraUser() para cifrar el valor de 'user'
cifraPass(cont) #Invocacion a la funcion cifraPas() para cifrar el valor de 'cont'
#Las siguientes lineas de codigo se encierran en un bloque try-except, para cachar las excepciones posibles
try:
db=DB( nombreBD,ip,5432,'','',descifraUser(userEn),descifraPass(pasEn)) #Se realiza la conexion, con los parametros indicados
print ('Conexion con el servidor exitosa!')
print ('')
x=db.query("SELECT *from canciones") #Realiza una consulta en la base de datos para demostrar la conexion exitosa
print x
print ("-------------------------------------")
except:
print ('La conexion con el servidor no pudo establecerse, por favor verifique sus datos')
raw_input()
2.4.3 Funcionamiento de la aplicación
El objetivo del programa es cifrar los datos que el usuario entrega, en este caso esto se logra aplicando un
XOR al valor que se desea cifrar. Se usan 3 funciones principalmente:
captura() Permite capturar los datos del usuario, desde teclado
cifraUser() Cifra el user que el usuario ha de ingresar
cifraPass() Cifra la contraseña que el usuario ingresa
DescifraUser() Desencripta el campo del usuario, para permitir la conexión a la base de datos
DescifraPass() Desencripta el campo de la contraseña
El usuario ejecuta el programa, el programa entonces pedirá al usuario que ingrese sus datos. Recibidos
los datos, el programa de manera interna aplicará un algoritmo de cifrado para el usuario y la contraseña
ingresados. Posteriormente aplicará el mismo algoritmo y desencriptará los datos, para realizar como
siguiente paso la conexión a la base de datos.
Establecida la conexión, se realiza una consulta internamente y se muestran los datos de una tabla
existente en la base de datos.
3 CONCLUSIONES
La seguridad de nuestra información es un aspecto muy importante a cuidar, el nivel de seguridad va
creciendo de acuerdo a la importancia de los datos que se trata de asegurar.
Las grandes empresas manejan una enorme cantidad de información que no pueden dejar de cuidar, pues
dependen de ella. Toda grande empresa, es decir, toda empresa debe tener en cuenta lo valiosa que es la
información que maneja dentro y fuera de sus instalaciones. Las infiltraciones en el sistema de una
empresa pueden tener repercusiones terribles, dependiendo de las intenciones que tenga el infiltrado.
Uno de los puntos más atacados son las Bases de Datos de las empresas, lo que se almacena en ellas es
un tesoro y también un peligro si no se le protege como debe ser. Es por ello que una manera de cuidar
toda esta información es la encriptación, existen varios métodos posibles de usarse.
En este trabajo usamos la encriptación de un usuario y la contraseña como punto de partida, puesto que
es muy dado que los infiltrados se hagan pasar por empleados de las empresas para robar información,
por supuesto siguen habiendo más y mejores maneras de lograr la aseguración de los datos de una
empresa, este fue solo un ejemplo.