AraDaen, sysadmin notes Blog sobre administración de sistemas operativos, análisis de nuevas tecnologías, diseño y desarrollo de software a medida (Java, .NET, Android) y otras noticias

HOWTO: Instalación de PostgreSQL en Fedora 16

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:

  1. Instalación básica de PostgreSQL en Fedora 16
  2. Mejoras de seguridad
  3. Configuracion de acceso remoto

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:

1
2
3
4
# 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:

  1. no se va a permitir conexiones con el usuario postgres por ser el usuario con privilegios administrativos en la instalación de PostgreSQL
  2. 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í:

1
2
3
4
5
6
7
# 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          md5host    all             postgres        192.168.0.0/24          rejecthost    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.

5 comments

  1. Cheli says:

    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.

    • Anonymous says:

      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.

      • Cheli says:

        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.

        • Anonymous says:

          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

  2. Llaker says:

    gracias amigo… me sirvio d mucho… esta muy exacto tu data

Leave a Reply

Your email address will not be published. Required fields are marked *