Introducción
Ya hemos visto
Cómo Instalar PostgreSQL en Solaris 10 utilizando los binarios que nos proporciona PostgreSQL, sin embargo, en esta ocasión vamos a ver
Cómo Instalar PostgreSQL 9.0 en OpenIndiana
Desde la página de PostgreSQL, podemos descargarnos la versión ya compilada para Solaris 10, sin embargo, esta versión no funciona sobre OpenSolaris y OpenIndiana.
Problemas con los binarios para Solaris 10 en OpenIndiana
El principal problema de los binarios compilados para Solaris reside en el uso de la biblioteca <libssl.so.0.9.7> y <libcrypto.so.0.9.7> que en OpenIndiana son </usr/lib/64/libcrypto.so.0.9.8> y </usr/lib/64/libssl.so.0.9.8>
Es decir, en OpenIndiana -OpenSolaris- tenemos una versión superior, y por lo tanto, cuando verificamos las dependencias del inario utilizando <ldd> vemos que no se encuentran:
# ldd postgres
libxslt.so.1 => /usr/lib/64/libxslt.so.1
libxml2.so.2 => /lib/64/libxml2.so.2
libpam.so.1 => /lib/64/libpam.so.1
libssl.so.0.9.7 => (file not found)
libcrypto.so.0.9.7 => (file not found)
libgss.so.1 => /usr/lib/64/libgss.so.1
libnsl.so.1 => /lib/64/libnsl.so.1
librt.so.1 => /lib/64/librt.so.1
libsocket.so.1 => /lib/64/libsocket.so.1
libm.so.2 => /lib/64/libm.so.2
libc.so.1 => /lib/64/libc.so.1
libz.so.1 => /lib/64/libz.so.1
libpthread.so.1 => /lib/64/libpthread.so.1
libmp.so.2 => /lib/64/libmp.so.2
libmd.so.1 => /lib/64/libmd.so.1
Pero ... que no cunda el pánico, que es un problema fácilmente solucionable. Tenemos tres opciones para ello, o instalamos la versión anterior de OpenSSL cosa que NO RECOMIENDO, o compilamos nuestra propia versión de PostgreSQL o ... podeis descargaros la versión compilada por mí, para
OpenIndiana x86 en 64bits de PostgreSQL 9.0.
Si os habéis decidido por la última opción -Instalar PostgreSQL desde el binario par a OpenIndiana-, entonces, podéis ignorar el paso de compilación pero debéis tener en cuenta lo siguiente:
- El binario debe ser instalado en </u01/app/postgres/9.0/db>
- Utilizaremos el role de <postgres> del sistema
- El <PGDATA> esta en </var/postgres/9.0/data>
Preparación del Entorno
Antes de poder compilar PostgreSQL 9.0 en OpenIndiana, debemos tener en cuenta que son necesarios algunos paquetes, para ello, deberemos instalarlos antes.
Aquí os dejo la lista de paquetes necesarios, para instalarlos, simplemente debemos ejecutar <pkg install _nombre_paquete_>
- sunstudio
- SUNWgmake
- SUNWbison
- SUNWgm4
- SUNWflexlex
Podemos comprobar si ya están instalados utilizando el comando <pkginfo>, por ejemplo
# pkginfo |grep flex
system SUNWflexlex Flex Lexer
system SUNWrsync rsync - faster, flexible replacement for rcp
# pkginfo |grep bison
system SUNWbison bison - A YACC Replacement
# pkginfo |grep gm4
system SUNWgm4 GNU m4
# pkginfo |grep gmake
system SUNWgmake gmake - GNU make
# pkginfo |grep sunstudio
application sunstudio12u1 Sun Studio 12 update 1
Compilar PostgreSQL 9.0
Para la compilación he utilizado los mismos parámetros que Bjorn Munch utiliza en la versión "oficial" que es posible descargar desde PostgreSQL.
Lo primero que haremos, será descargarnos el
fuente de
PostgreSQL desde su página oficial, en cualquiera de los dos formatos: tar.gz, tar.bz2
# export CC=cc
# export CFLAGS="-xO3 -xspace -Xa -xildoff -m64 -xc99=none -xCC -fast -native"
# export LDFLAGS="-R/usr/sfw/lib/64 -R/usr/lib/64"
# ./configure
--prefix=/u01/app/postgres/9.0/db
--exec-prefix=/u01/app/postgres/9.0/db
--bindir=/u01/app/postgres/9.0/db/bin/64
--libexecdir=/u01/app/postgres/9.0/db/bin/64
--sbindir=/u01/app/postgres/9.0/db/bin/64
--datadir=/u01/app/postgres/9.0/db/share
--sysconfdir=/u01/app/postgres/9.0/db/etc
--mandir=/u01/app/postgres/9.0/db/man
--libdir=/u01/app/postgres/9.0/db/lib/64
--includedir=/u01/app/postgres/9.0/db/include
--sharedstatedir=/var/postgres/9.0
--localstatedir=/var/postgres/9.0
--enable-nls
--docdir=/u01/app/postgres/9.0/db/doc
--with-system-tzdata=/usr/share/lib/zoneinfo
--with-python
--with-pam
--with-openssl
--with-libedit-preferred
--with-libxml
--with-libxslt
--with-gssapi
--enable-thread-safety
--enable-dtrace
--disable-integer-datetimes
--with-includes=/usr/include:/usr/sfw/include
--with-libs=/lib/64:/usr/lib/64:/usr/sfw/lib/64
# make
# make install
Configuración de PostgreSQL
A diferencia del post sobre
Cómo Instalar PostgreSQL 8.x en Solaris 10, en esta ocasión vamos a utilizar
roles para ejecutar el servicio.
Ahora si que estamos en disposición de poder hablar de esta forma de instalación, ya que hemos introducido los conceptos de
RBAC, Roles y Privilegios en post anteriores.
No es que la instalación de
PostgreSQL 8.x en Solaris 10 no estuviese bien, sino que no utilizaba todos los mecanismos que Solaris nos proporciona -a nivel de seguridad-, para que os hagáis una idea, si ejecutamos el comando <ppriv> sobre el proceso de
postgres ejecutado con un
usuario normal veremos cuáles son sus privilegios
$ svcs -p postgresql_84
STATE STIME FMRI
disabled mar_04 svc:/application/database/postgresql_84:default_32bit
online jul_06 svc:/application/database/postgresql_84:default_64bit
jul_06 3082 postgres
jul_06 3084 postgres
jul_06 3085 postgres
$ ppriv 3082
3082: /u01/app/postgres/8.4/db/bin/64/postgres -D /var/postgres/8.4/data
flags =
E: basic
I: basic
P: basic
L: basic,contract_event,contract_observer,file_chown,file_chown_self,file_dac_execute,file_dac_read,
file_dac_search,file_dac_write,file_owner,file_setid,ipc_dac_read,ipc_dac_write,ipc_owner,
net_bindmlp,net_icmpaccess,net_mac_aware,net_privaddr,net_rawaccess,proc_audit,
proc_chroot,proc_lock_memory,proc_owner,proc_setid,proc_taskid,sys_acct,sys_admin,
sys_audit,sys_ip_config,sys_mount,sys_nfs,sys_resource
Ahora, si ejecutamos el servicio postgres mediante <pg_ctl> y el role <postgres> veremos la diferencia de privilegios:
$ id
uid=90(postgres) gid=90(postgres)
$ pg_ctl start -l /var/log/postgres/server.log
server starting
$ ps -ef|grep postgre
postgres 794 1 1 09:39:22 pts/1 0:00 /u01/app/postgres/9.0/db/bin/64/postgres
postgres 799 794 0 09:39:22 ? 0:00 /u01/app/postgres/9.0/db/bin/64/postgres
$ ppriv 794
794: /u01/app/postgres/9.0/db/bin/64/postgres
flags = PRIV_PFEXEC
E: basic
I: basic
P: basic
L: all
Como podéis ver, la diferencia se encuentra en flags que ahora indica PRIV_PFEXEC ya que al ser un role, su shell es <pfexec> y, si es lanzado por el servicio SMF, es root quien lo lanza.
Además, si queríamos que un
usuario -persona- pudiese gestionar nuestro
PostgreSQL debíamos entregarle la contraseña de
root ya que sino, no podría operar con SMF. Si lo intentase, nos mostraría el siguiente error:
$ id
uid=101(postgres) gid=90(postgres)
$ /usr/sbin/svcadm disable svc:/application/database/postgresql_84:default_64bit
svcadm: svc:/application/database/postgresql_84:default_64bit: Permiso denegado.
Configuración de PostgreSQL en SMF
A continuación configuraremos nuestro servicio
postgres para que sea controlado mediante SMF, para ello, debemos descargar el
Manifest para Solaris SMF 10 PostgreSQL 9 y el
Method para Solaris SMF 10 PostgreSQL 9
# cd /lib/svc/method
# wget http://blog.sfchildren.com/blogger/openindiana/postgresql/9.0/smf/postgres_9
# chown root:bin postgres_9
# chmod 555 postgres_9
# mkdir -p /var/svc/manifest/application/database
# cd /var/svc/manifest/application/database
# wget http://blog.sfchildren.com/blogger/openindiana/postgresql/9.0/smf/postgresql_9.xml
# svccfg
svc:> validate postgresql_9.xml
svc:> import postgresql_9.xml
svc:> quit
# svcs -p postgresql_9
STATE STIME FMRI
disabled 9:29:24 svc:/application/database/postgresql_9:default_32bit
disabled 10:24:40 svc:/application/database/postgresql_9:default_64bit
Creación Estructura de PGDATA
Antes de poder iniciar
postgres debemos crear la estructura de almacenamiento necesaria, para ello, deberemos ejecutar el comando <initdb> con los parámetros oportunos. En nuestro caso, vamos a iniciar la estructura en formato <UTF-8> y lenguage <es_UTF8> y la opción <-W> para que nos solicite la
password que vamos a asignar al usuario
postgres de la base de datos
# mkdir -p /var/postgres/9.0/data
# chown -R postgres:postgres /var/postgres
# chmod 700 /var/postgres
# su - postgres
$ export PGDATA=/var/postgres/9.0/data
$ /u01/app/postgres/9.0/db/bin/64/initdb -E utf8 --locale=es.UTF-8 -U postgres -W
Project y Directorio de Logs
Al igual que hicimos con la Instalación de PostgreSQL en Solaris, debemos definir un
project y un directorio donde queremos escribir nuestro log. En nuestro caso, el
project será <group.postgres> y el directorio </var/log/postgres>
# projadd -c "Postgres Database" -G postgres group.postgres
# projmod -sK "process.max-sem-nsems=(priv,256,deny)" group.postgres
# projmod -sK "project.max-sem-ids=(priv,100,deny)" group.postgres
# projmod -sK "project.max-shm-ids=(priv,100,deny)" group.postgres
# projmod -sK "project.max-shm-memory=(priv,8G,deny)" group.postgres
# mkdir -p /var/log/postgres
# chown -R postgres:postgres /var/log/postgres
# chmod 700 /var/log/postgres
Inicio y Parada de PostgreSQL
Como siempre, vamos a utilizar el
framework de Solaris SMF para gestionar el inicio y parada de
PostgreSQL, sin embargo, en esta ocasión -a parte de poder utilizar
root- podemos utilizar el
role <postgres> para gestionarlo, por ejemplo:
$ id
uid=90(postgres) gid=90(postgres)
$ svcs -p postgresql_9
STATE STIME FMRI
disabled 9:29:24 svc:/application/database/postgresql_9:default_32bit
disabled 9:38:51 svc:/application/database/postgresql_9:default_64bit
$ pfexec /usr/sbin/svcadm enable svc:/application/database/postgresql_9:default_64bit
$ svcs -p postgresql_9
STATE STIME FMRI
disabled 9:29:24 svc:/application/database/postgresql_9:default_32bit
online 9:55:13 svc:/application/database/postgresql_9:default_64bit
9:55:13 817 postgres
9:55:13 819 postgres
9:55:13 820 postgres
9:55:13 821 postgres
9:55:13 822 postgres
$ ppriv 817
817: /u01/app/postgres/9.0/db/bin/64/postgres -D /var/postgres/9.0/data
flags =
E: basic
I: basic
P: basic
L: all
Otorgar privilegios de administración de PostgreSQL a un usuario
Como hemos comenteado, al utilizar
roles podemos
delegar privilegios de administración a un usuario
cualquiera sin que tengamos que proporciona la contraseña de
root.
Por ejemplo, vamos a crear un usuario
no privilegiado llamado <zooey> al cual, le vamos a otorgar permisos para poder administrar nuestro servicio
PostgreSQL asignándole el
role<postgres> y las autorizaciones <solaris.smf.value.postgres> y <solaris.smf.manage.postgres>
# useradd -g sysadmin -s /bin/bash -d /export/home/zooey -m -R postgres -A solaris.smf.manage.postgres,solaris.smf.value.postgres zooey
80 blocks
# passwd zooey
New Password:
Re-enter new Password:
passwd: password successfully changed for zooey
# su - zooey
OpenIndiana SunOS 5.11 oi_147 September 2010
zooey@openzooey:~$ roles
postgres
zooey@openzooey:~$ pfexec svcs -p postgresql_9
STATE STIME FMRI
disabled 9:29:24 svc:/application/database/postgresql_9:default_32bit
disabled 10:24:40 svc:/application/database/postgresql_9:default_64bit
zooey@openzooey:~$ pfexec /usr/sbin/svcadm enable svc:/application/database/postgresql_9:default_64bit
zooey@openzooey:~$ pfexec svcs -p postgresql_9
STATE STIME FMRI
disabled 9:29:24 svc:/application/database/postgresql_9:default_32bit
online 10:39:25 svc:/application/database/postgresql_9:default_64bit
10:39:24 1016 postgres
10:39:24 1018 postgres
10:39:24 1019 postgres
10:39:24 1020 postgres
10:39:24 1021 postgres
zooey@openzooey:~$ pfexec /usr/sbin/svcadm disable svc:/application/database/postgresql_9:default_64bit
zooey@openzooey:~$ pfexec svcs postgresql_9
STATE STIME FMRI
disabled 9:29:24 svc:/application/database/postgresql_9:default_32bit
disabled 10:43:51 svc:/application/database/postgresql_9:default_64bit
Conclusiones
En esta ocasión hemos utilizado muchos más mecanismos para gestionar el servicio de PostgreSQL y, hemos aprendido a utilizar los
roles como una herramienta muy potente y segura.
Aunque inicialmente la Instalación de PostgreSQL puede ser
de la forma tradicional -utilizando un usuario no privilegiado y root para gestionarlo- Solaris nos proporciona un entorno mucho más seguro y rico para ello.
Espero que con este ejemplo -completo- de instalación podáis ver la potencia de los roles, y como nos pueden ayudar en nuestro día a día.
Referencias