Esta es una pequeña guía de instalación del servidor de base de datos PostgreSQL en Fedora 16. No pretende ser una guía exhaustiva, pero sí proporcionar una forma sencilla y fácil de instalar PostgreSQL de forma segura en Fedora 16.
Esta pequeña guía de instalación y configuración de PostgreSQL en Fedora 16 va a constar de 3 partes:
Instalación básica de PostgreSQL en Fedora 16
El proceso de instalación y configuración de PostgreSQL en Fedora 16 es muy similar al de Fedora 15 y anteriores, pero presenta ciertas diferencias en el arranque e inicialización del servicio: a pesar de que en Fedora 15 ya estaba presente systemd como sustituto de SysVinit y Upstart, ha sido en Fedora 16 cuando se han sustituido los scripts de SystemV para postgreSQL por el uso de systemd, como veremos posteriormente.
Para comenzar la instalación de PostgreSQL ejecutamos los siguientes comandos como un usuario con privilegios administrativo para instalar los paquetes necesarios del servidor, cliente, librerías y documentación:
yum install postgresql-server postgresql postgresql-libs postgresql-contrib postgresql-docs
Este comando nos ha instalado PostgreSQL 9.1.2, que es la última versión publicada en los repositorios oficiales de fedora.
Ahora, creamos el cluster y arrancamos el servicio ejecutando los siguientes comandos:
postgresql-setup initdb systemctl start postgresql.service systemctl status postgresql.service
El comando postgresql-setup initdb lleva a cabo la creación del cluster donde se almacenarán los archivos de configuración y bases de datos de la instancia de PostgreSQL que acabamos de iniciar. Por defecto se ubica en en /var/lib/pgsql/data.
El segundo comando (systemctl start postgresql.service) arranca la instancia del servidor de bases de datos PostgreSQL.
Estos dos comandos son los que han sustituido a los scripts de SystemV en Fedora 15 y anteriores. Su correspondencia en esos sistemas sería service postgresqld initdb y service postgresqld start.
El último comando (systemctl status postgresql.service) sirve para comprobar que PostgreSQL se ha instalado y se está ejecutando correctamente en el servidor. Su salida será de este tipo:
postgresql.service - PostgreSQL database server Loaded: loaded (/lib/systemd/system/postgresql.service; disabled) Active: active (running) since Mon, 30 Jan 2012 20:00:11 +0100; 17s ago Process: 15620 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS) Process: 15614 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS) Main PID: 15624 (postgres) CGroup: name=systemd:/system/postgresql.service ├ 15624 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432 ├ 15625 postgres: logger process ├ 15627 postgres: writer process ├ 15628 postgres: wal writer process ├ 15629 postgres: autovacuum launcher process └ 15630 postgres: stats collector process
En este momento ya está ejecutándose PosgreSQL como servidor de bases de datos en Fedora 16 escuchando en el puerto 5432. La instancia del servidor PostgreSQL es ejecutada por el usuario postgres que se crea con la instalación de la paquetería. La instalación por defecto también crea como usuario de PostgreSQL el usuario postgres con privilegios de administrador del servidor de bases de datos.
Para conectarnos a PostgreSQL utilizamos los siguientes comandos:
su - postgres psql
psql lanza el cliente de postgreSQL que nos permite gestionar, consultar, etc… el servidor PostgreSQL que acabamos de instalar. Por ejemplo, si deseamos obtener un listado de las bases de datos que tenemos en el servidor utilizamos el comando \l:
postgres=# CREATE USER jose WITH PASSWORD 'claveJose';
CREATE ROLE
postgres=# CREATE USER ana WITH PASSWORD 'claveAna';
CREATE ROLE
postgres=# CREATE DATABASE miBaseDeDatos;
CREATE DATABASE
postgres=# CREATE DATABASE basedatos1;
CREATE DATABASE
postgres=# GRANT ALL ON DATABASE basedatos1 TO ana;
GRANT
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------+----------+----------+-------------+-------------+-----------------------------
basedatos1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres +
| | | | | ana=CTc/postgres
mibasededatos | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres +
| | | | | miusuarioadmin=CTc/postgres
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
postgres=# SELECT * FROM pg_shadow;
usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valuntil | useconfig
----------------+----------+-------------+----------+-----------+---------+-------------------------------------+----------+-----------
postgres | 10 | t | t | t | t | md5586e8ed69b76aeb92c0e9e68d59edede | |
jose | 16387 | f | f | f | f | md52dfa8209753ae8f742dbcd6fd449136f | |
ana | 16388 | f | f | f | f | md55c5d5cd6877585633503c1bb36c2d866 | |
(3 rows)
postgres=#
Hasta aquí ya tenemos instalado y funcionando PostgreSQL en Fedora 16, escuchando en el puerto 5432. Por defecto permite solo conexiónes locales a través del usuario del sistema postgres.
Aumentando la seguridad en PostgreSQL
Al instalar los paquetes de postgreSQL se crea también en el sistema la cuenta postgres que se utilizará para ejecutar el servidor. Esta cuenta se crea sin contraseña por defecto. Asignamos una contraseña a postgres:
su - passwd postgres
Sucede lo mismo con el usuario postgres de PostgreSQL: es el usuario administrador, pero se crea sin contraseña. Procedemos a asignarle una desde el cliente psql:
postgres=# ALTER USER postgres WITH PASSWORD 'miContraseña'; ALTER ROLE postgres=# SELECT * FROM pg_shadow; usename | usesysid | usecreatedb | usesuper | usecatupd | userepl | passwd | valuntil | usecon fig ----------+----------+-------------+----------+-----------+---------+-------------------------------------+----------+------- ---- postgres | 10 | t | t | t | t | md5586e8ed69b76aeb92c0e9e68d59edede | | (1 row)
Acceso remoto en PostgreSQL
Como hemos indicado la configuración por defecto hace que PostgreSQL solo sea accesible localmente, y utilizando el puerto 5432.
postgres=# show port; port ------ 5432 (1 row) postgres=# show listen_addresses; listen_addresses ------------------ localhost (1 row) postgres=#
Para permitir el acceso remoto al servidor de PostgreSQL debemos modificar el parámetro listen_addresses del archivo /var/lib/pgsql/data/postgres.conf. Este parámetro sirve para especificar desde qué interfaz de red escuchará el servidor postgreSQL. :
Por defecto está configurado para escuchar conexiones locales:
listen_addresses = 'localhost'
Pero puede configurarse para que escuche en todos los interfaces de red sel servidor
listen_addresses = '*'
O incluso delimitar su uso a determinos interfaces de red del servidor:
listen_addresses = '192.168.0.10 200.168.0.15'
En nuestro caso vamos a configurar PostgreSQL para que escuche en todas las interfaces de redes.
Editamos el archivo:
vim /var/lib/pgsql/data/postgresql.conf
Y modificamos el valor del parámetro:
listen_addresses = '*'
A continuación, modificamos el archivo que define a qué bases de datos se pueden conectar los usuarios y desde dónde. Esta información se detalla en en el archivo /var/lib/pgsql/data/pg_hba.conf. Es una capa extra de seguridad complementaria a la gestión de privilegios de usuarios dentro del PostgreSQL (GRANT…).
El contenido del archivo es el siguiente:
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 127.0.0.1/32 ident
host all all ::1/128 ident
Sin entrar en detalle, las tres reglas que aparecen definen exclusivamente el acceso local, tanto socket como TCP/IP, a nuestro servidor PostgreSQL en Fedora 16.
La configuración de reglas es bastante sencilla, y permite desde limitar el acceso a una base de datos a un determinado usuario, desde una IP determinada, hasta permitir un acceso global desde cualquier IP:
- Acceso para todos los usuarios a todas las bases de datos desde cualquier dirección de red:
host all all 0.0.0.0/0 md5
- Acceso desde una determinada IP a todas las bases de datos y con cualquier usuario:
host all all 192.168.0.4/32 md5
- Acceso desde cualquier nodo de la red 192.168.0.0 a la base de datos basedatos1 con el usuario juan, y solo desde 192.168.0.10 con usuarioAdmin:
host basedatos1 juan 192.168.0.0/24 md5 host basedatos1 usuarioAdmin 192.168.0.10/32 md5
- Acceso con cualquier usuario a la base de datos otraBD desde la red 192.168.0.0/24 excepto con el usuario pedro:
host otraBD all 192.168.0.0/24 md5 host otraBD pedro 192.168.0.0/24 reject
En nuestro caso, vamos a permitir el acceso desde nuestra red LAN (192.168.0.0/24) a cualquier usuario, con dos excepciones:
- no se va a permitir conexiones con el usuario postgres por ser el usuario con privilegios administrativos en la instalación de PostgreSQL
- no se va a permitir ningún tipo de conexión desde la máquina con IP 192.168.0.44
Editamos el archivo /var/lib/pgsql/data/pg_hba.conf y agregamos las reglas, de forma que quede así:
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 127.0.0.1/32 ident
host all all ::1/128 ident
host all all 192.168.0.0/24 md5
host all postgres 192.168.0.0/24 reject
host all all 192.168.0.44/32 reject
Después de guardar los cambios, solo nos queda reinciar PostgreSQL y añadir la regla en el firewall que permita el acceso al puerto 5432 que es donde escucha por defecto PostgreSQL:
systemctl stop posgresql.service systemctl start postgresql.service iptables -A INPUT -p tcp --dport 5432 -j ACCEPT
Con esto ya estará funcionando nuestro servidor PostgreSQL en Fedora 16 con acceso remoto habilitado.
Como siempre, si tienes alguna consulta no dudes en preguntar.
No se si en Fedora 16 sigue siendo así, en Centos 5 si, el caso es que podrías añadir la regla de iptables al archivo
/etc/sysconfig/iptables
para que se aplique en el siguiente arranque.
Un saludo.
En Fedora 16 también puedes añadirla a ese archivo, pero tienes que tener en cuenta que ese archivo es el que genera system-config-firewall, de forma que si alguna vez utilizas esa herramienta gráfica te cargarás tu configuración particular.
Nunca he utilizado system-config-firewall pero quiero pensar que esta herramienta lo primero que hace es leer este archivo para cambiar las reglas, la verdad es que no lo he comprobado.
Pues lo cierto es que no lo hace: es curioso, pero sólo utiliza ese archivo para guardar los cambios que introduces, pero si introduces una regla nueva en el archivo o modificas una existente, cuando ejecutas system-config-firewall esos cambios no se reflejan
gracias amigo… me sirvio d mucho… esta muy exacto tu data