SafeChildren Banner

Havoc Oracle Solaris Experts

jueves, 31 de marzo de 2011

Compilar OSSP UUID en OpenIndiana para PostgreSQL

Introducción
Aunque PostgreSQL tiene un tipo de datos UUID nativo, no existe implementación para la generación de los mismos. Por eso, es necesario utilizar una biblioteca que lo implemente, en nuestro caso OSSP-UUID.

Antes de Empezar
Lo cierto es que la Instalación de OSSP-UUID no comienza con buen pie, ya que la página oficial proporciona un servidor ftp para su descarga, pero ... no ha sido posible, así que he tenido que utilizar algún mirror para poder descargarlo.

Después de este pequeño contratiempo, ya podemos comenzar con la compilación, no exenta de problemillas, así que si no tenéis mucho tiempo y/o ganas, podéis utilizar la versión que he compilado tanto en 32bit como 64bits, aunque en la versión de 64bits no he incluido soporte para C++ ya que ha sido imposible.

Instalación desde el binario
Para aquellos que no tengáis tiempo, podéis instalar OSSP-UUID desde el binario descargando y descomprimiendo sobre el directorio </opt>
root@openzooey:/# cd /opt
root@openzooey:/opt# wget http://blog.sfchildren.com/blogger/postgres/ossp-uuid/openindiana/ossp-uuid-1.6.2-OpenIndiana-x86-32bit-64bit.tar.gz
...
root@openzooey:/opt# gzip -dc ossp-uuid-1.6.2-OpenIndiana-x86-32bit-64bit.tar.gz | tar xpf -
root@openzooey:/opt# rm ossp-uuid-1.6.2-OpenIndiana-x86-32bit-64bit.tar.gz
root@openzooey:/opt# cd ossp-uuid
root@openzooey:/opt/ossp-uuid# bin/64/uuid
2645be62-5b18-11e0-8701-8f5adc896ddd
root@openzooey:/opt/ossp-uuid# bin/uuid
2a08e9ca-5b18-11e0-9914-47107445423d
Instalación desde el código fuente
Para la instalación desde el código fuente, deberemos tener en cuenta que la compilación en 64bits no es posible realizarla utilizando el flag <--with-cxx> y debemos separar las bibliotecas de 64bits de las de 32bits utilizando <--bindir=> y <--libdir>.

Además, hay que hacer un ajuste para que nos enlace de forma correcta la biblioteca, utilizando CC="cc -m64" ya que libtool no lo pasa correctamente

Descargamos el Código Fuente
itily@openzooey:~$ wget http://www.mirrorservice.org/sites/ftp.ossp.org/pkg/lib/uuid/uuid-1.6.2.tar.gz
itily@openzooey:~$ gzip -dc uuid-1.6.2.tar.gz | tar xpf -
Compilación en 64bits
itily@openzooey:~$ cd uuid-1.6.2
itily@openzooey:~/uuid-1.6.2$ export CC="cc -m64"
itily@openzooey:~/uuid-1.6.2$ export CXX=cc
itily@openzooey:~/uuid-1.6.2$ export CFLAGS="-xO3 -xspace -Xa -xildoff -m64 -xc99=none -fast -native -xCC"
itily@openzooey:~/uuid-1.6.2$ export CXXFLAGS="-xO3 -xspace -Xa -xildoff -m64 -xc99=none -fast -native -xCC"
itily@openzooey:~/uuid-1.6.2$ ./configure \
     --prefix=/opt/ossp-uuid \
     --bindir=/opt/ossp-uuid/bin/64 \
     --libdir=/opt/ossp-uuid/lib/64

itily@openzooey:~/a/uuid-1.6.2$ pfexec make install
Compilación en 32bits
itily@openzooey:~/uuid-1.6.2$ export CC="cc"
itily@openzooey:~/uuid-1.6.2$ export CFLAGS="-xO3 -xspace -Xa -xildoff -m32 -xc99=none -xCC"
itily@openzooey:~/uuid-1.6.2$ export CXXFLAGS=$CFLAGS
itily@openzooey:~/uuid-1.6.2$ ./configure \
     --prefix=/opt/ossp-uuid \
     --bindir=/opt/ossp-uuid/bin \
     --libdir=/opt/ossp-uuid/lib

itily@openzooey:~/uuid-1.6.2$ pfexec make install
Comprobación de Funcionamiento
itily@openzooey:~$ /opt/ossp-uuid/bin/uuid -v 4 -n 4
2dadf532-fddf-4902-b89b-4354f208b882
441823a3-5f73-4a9e-be28-0ed394091f7f
926c0d16-99b4-4d72-b5c7-e91933a4818a
c3347042-de2b-4407-9ba5-03ea4ef5a984
itily@openzooey:~$ /opt/ossp-uuid/bin/64/uuid -v 4 -n 4
4376f895-750a-4eef-a865-f06a89baed61
0e4bf68c-7386-4329-9aaa-9e3c3cbc0672
cb5134d4-5cbb-401b-aa70-0edcce7f1a04
ccabcd16-3227-4b59-b0de-3bad19d988f9






Conclusion
Bueno, al principio parece un poco complicado, aunque, al final, no es más que una instalación normal y, como siempre, son los 64bits los que más problemas nos dan.

Ahora sólo nos queda compilar correctamente nuestro PostgreSQL 9 con Soporte par UUID e Instalarlo en OpenIndiana

Refrencias

domingo, 20 de marzo de 2011

Instalación de PostgreSQL 9.0.3 en OpenIndiana utilizando SMF y RBAC, Requisitos

Introducción
Ya hemos hablado varias veces de Cómo Instalar PosgreSQL en OpenIndiana y, también Cómo Actualizar PostgreSQL en OpenIndiana.

En esta ocasión, vamos a compilar PostgreSQL 9.0.3 en 64bits y, debido a las peticiones que tengo por parte de vosotros, también en 32bits.

Además, veremos todos los requisitos necesarios para poder gestionar PostgreSQL 9.0.3 en OpenIndiana utilizando Solaris SMF y, utilizar RBAC para su gestión.

Antes de comenzar
He visto que alguno de vosotros tenéis problemas con la forma de instalación de PostgreSQL sobre OpenIndiana, y, al parecer también con el role <postgres> o los pasos de compilación.

Todos los pasos de compilación de estos post se realizan sobre OpenIndiana 64bits utilizando para la instalación el formato de <Text Install> y siguiendo los pasos de Instalar OpenIndiana en VirtualBox Paso a Paso

Así mismo, os recomiendo -si no lo habéis hecho antes- leer el post sobre Actualización de PostgreSQL 9.0.2 64bits en OpenIndiana, donde explico los pasos de una forma más detallada.

Upgrade desde OpenSolaris
Si hemos hecho el <upgrade> desde OpenSolaris, tendremos el role <postgres> y las autorizaciones necesarias, si por el contrario hemos Instalado OpenIndiana directamente, no existirán y las deberemos crear.


Comprobación de las Autorizaciones
Debemos comprobar también que tenemos las autoriaciones necesarias para poder gestionar el servicio <postgresql_9> en nuestro sistema a través de Solaris SMF.
itily@openzooey:~$ pfexec  cat /etc/security/auth_attr|grep postgres
solaris.smf.manage.postgres:::Manage Postgres service states::
solaris.smf.value.postgres:::Change Postgres value properties::
Si no nos devuelve nada, entonces deberemos crearlo, para ello añadiremos las autorizaciones de la siguiente forma
root@openzooey:/# echo "solaris.smf.manage.postgres:::Manage Postgres service states::" >> /etc/security/auth_attr
root@openzooey:/# echo "solaris.smf.value.postgres:::Change Postgres value properties::" >> /etc/security/auth_attr

Verificación del Profile <Postgres Administration>
Por último, debemos comprobar que tenemos el <profile> de Administración de PostgreSQL definido en nuestro sistema, para ello, haremos
itily@openzooey:~$ pfexec cat /etc/security/prof_attr|grep Postgres
Postgres Administration::::auths=solaris.smf.manage.postgres,solaris.smf.value.postgres
Si no nos devuelve nada, deberemos crearlo de la siguiente manera:
root@openzooey:/# echo "Postgres Administration::::auths=solaris.smf.manage.postgres,solaris.smf.value.postgres" >> /etc/security/prof_attr
Comprobación del Role <postgres>
Debemos comprobar que nuestro sistema tiene el role <postgres> creado, sino, lo crearemos nosotros, para ello, simplemente buscaremos en la base de datos </etc/user_attr> y nos fijaremos en el valor de <type=> para comprobar que es un <role>, por ejemplo
itily@openzooey:~$ pfexec cat /etc/user_attr|grep postgres
postgres::::type=role;profiles=Postgres Administration,All
Llegado a este punto, debemos tener en cuenta que si no existe el <role> postgres, comprobaremos si es un usuario, ya que en OpenIndiana viene como Usuario y no como Role, para ello comprobaremos que existe en </etc/passwd>
root@openzooey:/# cat /etc/passwd |grep postgres
postgres:x:90:90:PostgreSQL Reserved UID:/:/usr/bin/pfksh
Como vemos, existe como usuario, pero no dispone del <profile> Postgres Aministration que necesitamos, así que vamos a añadirlo utilizando la opción "-P 'Postgres Administration'".

Si intentamos modificar el <profile> de un usuario utilizando el comando <rolemod> OpenIndiana nos contestará con un mensaje come este:
root@openzooey:/# rolemod -P 'Postgres Administration' postgres
UX: rolemod: ERROR: Users must be modified with ``usermod''.
Así que utilizaremos el comando <usermod> con la misma opción
root@openzooey:/# usermod -P "Postgres Administration" postgres
Comprobamos que tenemos asignado correctamente todo, y que las autorizaciones están definidas. Para ello, utilizaremos el comando <auth postgres> para las autorizaciones y <profiles postgres> para los profiles.
root@openzooey:~# profiles postgres
postgres:
          Postgres Administration
          Basic Solaris User
          All
root@openzooey:~# auths postgres
 solaris.admin.wusb.read,
 solaris.device.cdrw,
 solaris.device.mount.removable,
 solaris.mail.mailq,
 solaris.profmgr.read,
 solaris.smf.manage.postgres,
 solaris.smf.value.postgres
Ahora debemos dedicir si queremos seguir manteniendo el usuario, o por el contrario convertirlo a un Role y así, poder delegar las tareas de administración.

Mi recomendación es convertirlo a un role -si no lo es-, para ello, utilizaremos el comando <usermod> y la opción <-K type=role> para convertirlo, por ejemplo:
root@openzooey:/# usermod -K type=role postgres
root@openzooey:/# cat /etc/user_attr|grep postgres
postgres::::type=role;profiles=Postgres Administration
Configurar base de datos de <pfexec>
Por último, deberemos definir los comandos que el <profile> Postgres Administration puede ejecutar utilizando <pfexec>, para ello, deberemos de dar de alta.

Es muy importante que entendáis que estáis haciendo, para ello, os recomiendo leer la serie de artículos sobre Solaris RBAC y Modelo de Privilegios.

Con esto, ya tenemos la estructura para poder gestionar nuestro PostgreSQL con RBAC

Comprobación de la Arquitectura y Kernel
A continuación, vamos a comprobar que tipo de arquitectura tenemos: SPARC o x86 y sobre esta, qué tipo de kernel tenemos, de 32bit o 64bit.

Para verificar nuestra arquitectura, utilizaremos el comando <uname -a> por ejemplo:
itily@openzooey:~$ pfexec uname -a
SunOS openzooey 5.11 oi_148 i86pc i386 i86pc
Hay que tener en cuenta que el comando <uname> no nos va a decir si es o no una arquitectura de 64bits, ya que nos dirá <i386>. Esto es porque la diferencia de arquitectura es para SPARC o i386.

Para saber si nuestro kernel es de 32bit o 64bits, deberemos utilizar el comando <isainfo> con las opciones <-kv>, por ejemplo:
itily@openzooey:~$ pfexec isainfo -kv
64-bit amd64 kernel modules
Por lo tanto, ahora sabemos que estamos ejecutando OpenIndiana -o Solaris- sobre una plataforma x86 con un kernel de 64bit.
 
Instalación de PostgreSQL 9.0.3 desde Binarios
Ahora que ya sabemos qué arquitectura tenemos, y nuestro tipo de kernel, podemos seleccionar la versión de PostgreSQL 9.0.3 que deseemos.
Simplemente, descargaremos el binario que queramos (de 32bit o 64bit) y lo descomprimiremos en nuestro sistema, en </>
itily@openzooey:/# cd /
itily@openzooey:/# wget http://blog.sfchildren.com/blogger/postgres/9.0.3/openindiana/postgresql-9.0.3-x86-64bit-openindiana.tar.gz
itily@openzooey:/# gzip -dc postgresql-9.0.3-x86-64bit-openindiana.tar.gz | tar xvpf -
itily@openzooey:/# chown -R postgres:postgres /u01
itily@openzooey:/# chmod 750 /u01

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 y OpenIndiana SMF  PostgreSQL 9 y el Method para Solaris y OpenIndiana SMF 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
Conclusion
En esta ocasión hemos visto algunos puntos necesarios para la instalación de PostgreSQL en OpenIndiana.

Además, gracias a los comentarios y dudas, creo que en esta ocasión he intentado despejar esas "dudas" que os asaltan,

Espero que os ayude y, sobre todo, aclarar los pasos de instalación.


Referencias

jueves, 3 de marzo de 2011

Cómo saber el project de un proceso concreto

Introducción
En alguna ocasión hemos necesitado saber en que project se encuentra nuestro proceso de Solaris, para ello, simplemente utilizaremos la opción <-o> del comando <ps> que nos permite obtener el formato de salida que queramos.

Por ejemplo, para ver los procesos del usuario <appserver> mostrando su PID, Comando y Project utilizaremos el siguiente comando:
root@h1000:/# ps -fu appserver -o pid,args,project
  PID COMMAND                          PROJECT
 1672 /usr/jdk/instances/jdk1.6.0/bin  asengine.appserver

Referencias

martes, 1 de marzo de 2011

Tomcat sobre SMF y RBAC en OpenIndiana y Solaris

Introducción
Ya hemos hablado del uso de Roles y Privilegios en Solaris y cómo aplicarlos a Apache Tomcat para que nos permita iniciar el servicio utilizando un usuario no privilegiado en un puerto inferior a 1024. En nuestro caso de Noviembre 2010 hablábamos de Cómo configurar HTTPS en Apache Tomcat utilizando Roles y Privilegios.

Sin embargo, si queremos gestionar nuestro servicio utilizando Solaris SMF, deberemos hacer algunos cambios en el archivo manifest de Apache Tomcat.

Asignación de Privilegios
Sabemos que para poder utilizar un puerto privilegiado (<1024) con un usuario no privilegiado, deberemos otorgarle el privilegio <net_privaddr>, y eso es lo que hicimos en nuestro post sobre Configurar HTTPS en Apache Tomcat modificando los privilegios en el role <appserver>
# rolemod -K defaultpriv=basic,net_privaddr appserver
 Sin embargo, cuando ejecutamos el servicio utilizando Solaris SMF este privilegio no está "activo" debido a que en nuestro archivo "manifest" no hemos defenido que los tengan, y por lo tanto, sólo tendrá los privilegios "basic".

Modificar el Archivo Manifest
Para añadir los privilegios que deseamos, en nuestro caso <net_privaddr>, simplemente deberemos incluir la propiedad "privileges" en <method_credential>, por ejemplo,
<method_context project='appserver'>
    <method_credential
        user='appserver'
        group='appserver'
        privileges='basic,net_privaddr'/>
</method_context>
De esta forma, estamos indicando a SMF que asigne el privilegio <net_privaddr> además de los básicos, y por lo tanto, ahora si que podemos iniciar nuestro Tomcat utilizando <svcadm enable>

Algunos Privilegios Más
Recordar que si utilizamos < ! >, entonces, en vez de asignar estamos eliminando el privilegio, así que vamos a utilizarlo para evitar que "por alguna problema" puedan llegar a heredarlos, por lo tanto, nuestro parámetro "privileges" será el siguiente:
privileges='basic,!proc_session,!proc_info,!file_link_any,net_privaddr'
Añadimos Autorizaciones
Ahora vamos a unirlo al post de RBAC y Autorizaciones para Tomcat que escribí hace un tiempo, y veremos como podemos "encajar" todo en un mismo archivo manifest para utilizar: Autorizaciones y Privilegios

Nota: Es muy recomendable que echéis un vistazo al post de las autorizaciones, si no os acordáis ...

Por lo tanto, nuestra definición de Instancia quedará de la siguiente forma:
<instance name='default_64bits' enabled='false'>
 <method_context>
      <method_credential
          user='tomcat6'
          group='webrunner'
 privileges='basic,!proc_session,!proc_info,!file_link_any,net_privaddr'/>
 </method_context>
 <property_group name='tomcat_6' type='application'>
      <propval name='home' type='astring'
                value='/opt/www/tomcat6' />
      <propval name='jvmargs' type='astring'
                value='-d64 -Xms512m -Xmx512m' />
      <propval name='project' type='astring'
                value='tomcat6' />
      <propval name='java_home' type='astring'
                value='/usr/java' />
      <propval name='value_authorization' type='astring'
                        value='solaris.org.apache.smf.value.tomcat' />
 </property_group>
</instance>

Con esto ya tendríamos todo nuestro Apache Tomcat dentro de Solaris SMF y utilizando Autorizaciones. Podéis descargar el archivo manifest completo desde Manifest Tomcat Roles y Privilegios


Conclusiones
Aunque parece un poco lioso al principio, luego resulta muy sencillo y, a la larga, nos proporciona una gestión mucho más avanzada y simplificada.

Muchas veces os he recomendado el uso de Roles y Privilegios, pero, espero que con estos ejemplos "reales" podáis ver las ventajas que nos ofrece su uso.

Como siempre, vuestras sugerencias son bienvenidas :D


Referencias