lunes, 30 de julio de 2007

SMF y Privilegios


Ha diferencia de las versiones anteriores de Solaris 6 y 7 donde para establecer privilegios teniamos que recurrir a software externo al sistema, como SUDO... y Solaris 8, 9 donde podiamos realizar este tipo de acciones con RBAC ya como parte del mismo. En Solaris 10 y OpenSolaris con la inclusión de SMF (Service Management Facility) la pespectiva cambia y podemos ser capaces de definir que usuario y que acciones puede realizar (parar, arrancar...) sobre un servicio del sistema que incluso levante un socket tcp/udp por debajo del puerto 1024 sin ser root.

En este ejemplo lo vamos a realizar con Apache2 gestionado como servicio a traves de SMF.

# svcs apache2
STATE STIME FMRI
disabled 19:12:02 svc:/network/http:apache2
# svcadm -v enable -s apache2
svc:/network/http:apache2 enabled.
# ps -aef | grep apache | grep -v grep
webservd 14836 14835 0 15:25:04 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 14837 14835 0 15:25:04 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 14839 14835 0 15:25:04 ? 0:00 /usr/apache2/bin/httpd -k start
root 14835 10895 0 15:25:03 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 14838 14835 0 15:25:04 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 14840 14835 0 15:25:04 ? 0:00 /usr/apache2/bin/httpd -k start
# ptree 14835
10895 zsched
14835 /usr/apache2/bin/httpd -k start
14836 /usr/apache2/bin/httpd -k start
14837 /usr/apache2/bin/httpd -k start
14838 /usr/apache2/bin/httpd -k start
14839 /usr/apache2/bin/httpd -k start
14840 /usr/apache2/bin/httpd -k start

Vemos como por defecto el proceso que realmente levanta el socket abierto en el puerto tcp 80 es iniciado como root y no tiene ningun tipo de privilegios.

# ppriv -S 14835
14835: /usr/apache2/bin/httpd -k start
flags =
E: zone
I: basic
P: zone
L: zone

Esto lo vamos a cambiar para el usuario webservd, asi:

# svcadm -v disable svc:/network/http:apache2
svc:/network/http:apache2 inhabilitado.
# svccfg -s apache2
svc:/network/http:apache2> setprop start/user = astring: webservd
svc:/network/http:apache2> setprop start/group = astring: webservd
svc:/network/http:apache2> setprop start/privileges = astring:
basic,!proc_session,!proc_info,!file_link_any,net_privaddr

svc:/network/http:apache2> setprop start/limit_privileges = astring: :default
svc:/network/http:apache2> setprop start/use_profile = boolean: false
svc:/network/http:apache2> setprop start/supp_groups = astring: :default
svc:/network/http:apache2> setprop start/working_directory = astring: :default
svc:/network/http:apache2> setprop start/project = astring: :default
svc:/network/http:apache2> setprop start/resource_pool = astring: :default
svc:/network/http:apache2> end
# svcprop -v -p start apache2
start/exec astring /lib/svc/method/http-apache2\ start
start/timeout_seconds count 60
start/type astring method
start/user astring webservd
start/group astring webservd
start/privileges astring
basic,!proc_session,!proc_info,!file_link_any,net_privaddr
start/limit_privileges astring :default
start/use_profile boolean false
start/supp_groups astring :default
start/working_directory astring :default
start/project astring :default
start/resource_pool astring :default
# svcadm -v refresh apache2
Action refresh set for svc:/network/http:apache2.
# svcadm -v enable -s apache2
svc:/network/http:apache2 habilitado.
# ps -fea|grep apache
webservd 3957 3953 0 19:21:13 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 3956 3953 1 19:21:13 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 3953 1 2 19:21:11 ? 0:01 /usr/apache2/bin/httpd -k start
webservd 3955 3953 1 19:21:13 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 3954 3953 0 19:21:13 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 3958 3953 0 19:21:13 ? 0:00 /usr/apache2/bin/httpd -k start
# netstat -an|grep -i listen
*.22 *.* 0 0 49152 0 LISTEN
*.111 *.* 0 0 49152 0 LISTEN
*.59597 *.* 0 0 49152 0 LISTEN
*.80 *.* 0 0 49152 0 LISTEN
*.22 *.* 0 0 49152 0 LISTEN
*.80 *.* 0 0 49152 0 LISTEN

Y teniendo en cuenta lo que significa cada privilegios, vemos los que le hemos asignado.

# ppriv -v -l proc_exec proc_fork net_privaddr
proc_exec
Allows a process to call execve().
proc_fork
Allows a process to call fork1()/forkall()/vfork()
Configuring the Apache2 Service 7
net_privaddr
Allows a process to bind to a privileged port number.
The privilege port numbers are 1-1023 (the traditional
UNIX privileged ports) as well as those ports marked as
"udp/tcp_extra_priv_ports" with the exception of the ports
reserved for use by NFS.
# ppriv -S 3953
3953: /usr/apache2/bin/httpd -k start
flags =
E: net_privaddr,proc_exec,proc_fork
I: net_privaddr,proc_exec,proc_fork
P: net_privaddr,proc_exec,proc_fork
L: all

Luego hemos conseguido que el usuario webservd sea capaz de arrancar y para el servicio apache2, levantando un socket en el puerto tcp 80 sin necesidad de cambiar la identidad a root en ningún momento.

Habilitar SAR


A diferencia de como podiamos habilitar este comando en versiones antiguas de Solaris (9 y anteriores), asi:

# vi /etc/init.d/perf
if [ -z "$_INIT_RUN_LEVEL" ]; then
set -- `/usr/bin/who -r`
_INIT_RUN_LEVEL="$7"
_INIT_RUN_NPREV="$8"
_INIT_PREV_LEVEL="$9"
fi

if [ $_INIT_RUN_LEVEL -ge 2 -a $_INIT_RUN_LEVEL -le 4 -a \
$_INIT_RUN_NPREV -eq 0 -a \( $_INIT_PREV_LEVEL = 1 -o \
$_INIT_PREV_LEVEL = S \) ]; then

/usr/bin/su sys -c "/usr/lib/sa/sadc /var/adm/sa/sa`date +%d`"
fi

Descomentando las lineas en negrita, y ejecutando este script:

# /etc/init.d/perf
# sar
10:43:26 unix restarts
Average 0 0 0 100
# uname -a
SunOS alfacar 5.9 Generic_118558-35 sun4u sparc SUNW,Ultra-5_10

Unicamente nos quedaría comprobar que todo queda listo en el cron.

# crontab -l sys
0 * * * 0-6 /usr/lib/sa/sa1
20,40 8-17 * * 1-5 /usr/lib/sa/sa1
5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A

En Solaris 10 y OpenSolaris, con la aparición de SMF (Service Management Facility) como gestor de los distintos procesos de arranque del sistema, manteniendo todavia compatibilidad con los clásicos niveles de ejecución (Run Levels), se realiza de forma diferente:

# sar
sar: can't open /var/adm/sa/sa30
No such file or directory
# svcs |grep sa
online 10:38:51 svc:/system/sac:default
# svcadm enable svc:/system/sar:default
# svcs |grep sar
online 10:43:58 svc:/system/sar:default
# sar
SunOS opensolaris 5.11 snv_57 i86pc 07/30/2007
10:43:58 %usr %sys %wio %idle
10:43:58 unix restarts
# uname -a
SunOS opensolaris 5.11 snv_57 i86pc i386 i86pc
# crontab -l sys
0 * * * 0-6 /usr/lib/sa/sa1
20,40 8-17 * * 1-5 /usr/lib/sa/sa1
5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A
# svcs | grep cron
online 11:00:11 svc:/system/cron:default
# svcadm restart svc:/system/cron:default
# tail -f /var/cron/log
! ******* CRON ABORTED ******** lun jul 30 11:02:55 2007
! *** cron started *** pid = 567 lun jul 30 11:02:55 2007

viernes, 27 de julio de 2007

Install Server en Solaris


Si alguna vez habeis tenido que instalar varias maquinas Sun con cualquiera de las distintas versiones de Solaris y unicamnete una de ellas disponia de unidad de CD-ROM, aqui os dejo un resumen rapido de como generar un Install Server a partir del cual instalar el resto de sistemas:

(Lo he verificado tanto con Solaris 8, como con Solaris 9 y en breve lo confirmare para Solaris 10 y OpenSolaris)

1.- Insertar el CD-ROM de instalacion de Solaris etiquetado Software 1 de 2
2.- Montarlo manualmente o automaticamente a través del demonio vold
3.- # mkdir /var/Solaris8
4.- # cd /cdrom/sol_8_sparc/s0/Solaris_8/Tools
5.- # ./setup_install_server /var/Solaris8
6.- Cuando termine este proceso, sacar el CD-ROM anterior e insertar el denominado Solaris Software 2 de 2
7.- Montarlo manualmente o automaticamente a través del demonio vold
8.- # cd /cdrom/sol_8_sparc_2/Solaris_8/Tools
9.- # ./add_to_install_server /var/Solaris8
10.- Cuando termine este proceso ya tenemos nuestro Install Server generado con la imagen de Solaris 8 que hemos creado en /var/Solaris8.

Ahora unicamente nos queda registrar los clientes que queremos instalar a traves de la red y arrancarlos adecuadamente a traves de la OBP.

(*) En el Install Server tenemos que declarar los clientes a instalar mediante este método.

1.- Dar de alta la MAC de la tarjeta de red a través de la cual vamos a instalar el Solaris cliente, en el fichero /etc/ethers del Servidor de esta instalación.
08:00:20:C2:36:68 sun-001
2.- Dar de alta la IP del Solaris cliente, en el fichero /etc/hosts del Servidor de este instalación.
10.73.130.15 sun-001
3.- Verificar la siguiente entrada en el ficero /etc/nsswitch.conf del Servidor de esta instalación:
bootparams: files
4.- Dar de alta (en el Servidor) el cliente teniendo en cuenta la plataforma de la maquina Sun (en este caso sun4u):
# cd /var/Solaris8/Solaris_8/Tools
# ./add_install_client sun-001 sun4u

(*) Una vez finalizado este proceso, encendemos la maquina Sun a instalar y una vez en la OBP, arrancamos de red:

ok boot net

jueves, 26 de julio de 2007

Hostname en Solaris


Seguro que en mas de una ocasión, tras el proceso de instalación de las distintas versiones de Solaris, habeis necesitado cambiar el hostname de vuestro sistema (cosa que no tiene nada que ver ni con los interfaces de red, ni con la resolución de nombres del mismo).

Aqui os dejo una guia rapida de como cambiarlo:

1.- Una vez localizado el mismo:

# hostname
pluton

2.- Teneis que cambiar el valor de este literal (pluton) en los siguientes ficheros:

/etc/hosts
/etc/hostname.xxx
(Siendo xxx el interface afectado)
/etc/nodename
/etc/net/ticotsord/hosts
/etc/net/ticots/hosts
/etc/net/ticlts/hosts

3.- Reiniciamos y listo.

# init 6

lunes, 23 de julio de 2007

USB & Solaris 10


Aqui os dejo un breve manual "paso a paso" acerca de como montar nuestra llave USB bajo Solaris:

1.- Pincha nuestro Pen Drive en el equipo PC.
2.- # mkdir /rmdisk
3.- # /etc/init.d/volmgt stop
4.- # /etc/init.d/volmgt start
5.- # mount | grep rmdisk

Si en este orden no ha funcionado, este otro metodo es infalible:

1.- # /etc/init.d/volmgt stop
2.- # iostat -En
3.- Pinchar la llave USB
4.- # mount -F pcfs /dev/dsk/c2t0d0p0:c /mnt
ó
# mount -F pcfs /dev/dsk/c1t0d0p0:c /mnt

martes, 17 de julio de 2007

Availability Suite


Tras la adquisición de StorageTek por parte de Sun Microsystems, en su política de desarrollar y contribuir a las comunidades de código abierto, Sun ha liberado la "Availability Suite" de StorageTek y ya es un proyecto mas dentro de OpenSolaris.

Es una magnifica noticia, tener la posibilidad de comprender como se implementan tecnologías como "Remote Mirror Copy" y "Point in Time Copy" basadas en Replicación TCP/IP algo fundamental en los proyectos de Consolidación y Respaldo de las grandes compañias.

HA Clusters


Otro punto fundamental en el Desarrollo de OpenSolaris basado en comunidades de código abierto, ha sido el reciente anuncio por parte de Sun Microsystem de liberar el código de su software de alta disponibilidad: Sun Cluster 3.X como proyecto bajo este modelo.

Es otra magnifica noticia, ya que actualmente existian proyectos similares (heartbeat, kimberlite, HA/FST) en esta misma direccion, pero sin la robustez, ni el numero de agentes disponibles para los distintos productos de mercado que podemos monitorizar con el mismo.

lunes, 16 de julio de 2007

Presentacion SVM / ZFS


En breve creare una entrada que contendrá las ultimas novedades "no incluidas" en la presentación que realizé sobre las distintas herramientas de gestión del Almacenamiento de OpenSolaris, en el OpenSolaris Day 2007.

Mientras, un pequeño avance:

1.- Hotspare en SVM (Solaris Volume Manager)
2.- Stripe en ZFS (Zettabyte File System)
3.- Hotspare en ZFS (Zettabyte File System)

Lo prometido es deuda, asi que aqui van las ultimas funcionalidades probadas en OpenSolaris:

1.- Partimos de la siguiente configuracion de "soft partitions":

bash-3.00# metastat -p
d70 -p /dev/rdsk/c0d0s6 -o 1843210 -b 204800
d69 -p /dev/rdsk/c0d0s6 -o 1638409 -b 204800
d68 -p /dev/rdsk/c0d0s6 -o 1433608 -b 204800
d67 -p /dev/rdsk/c0d0s6 -o 1228807 -b 204800
d66 -p /dev/rdsk/c0d0s6 -o 1024006 -b 204800
d65 -p /dev/rdsk/c0d0s6 -o 819205 -b 204800
d64 -p /dev/rdsk/c0d0s6 -o 614404 -b 204800
d63 -p /dev/rdsk/c0d0s6 -o 409603 -b 204800
d62 -p /dev/rdsk/c0d0s6 -o 204802 -b 204800
d61 -p /dev/rdsk/c0d0s6 -o 1 -b 204800

Realizamos un metadispositivo de tipo RAID 1 d50, con un pool hotspare denominado hspool01, asi:

bash-3.00# metainit hspool01 /dev/md/dsk/d63 /dev/md/dsk/d64
hspool01: Agrupación de repuestos en marcha configurada
bash-3.00# metainit d51 1 1 /dev/md/dsk/d61 -h hspool01
d51: Concatenación/reparto está configurado
bash-3.00# metainit d52 1 1 /dev/md/dsk/d62 -h hspool01
d52: Concatenación/reparto está configurado
bash-3.00# metainit d50 -m d51
d50: Duplicación configurada
bash-3.00# metattach d50 d52
d50: subduplicación d52 is attached
bash-3.00# metastat -p d50
d50 -m /dev/md/rdsk/d51 /dev/md/rdsk/d52 1
d51 1 1 /dev/md/rdsk/d61 -h hspool01
d61 -p /dev/rdsk/c0d0s6 -o 1 -b 204800
d52 1 1 /dev/md/rdsk/d62 -h hspool01
d62 -p /dev/rdsk/c0d0s6 -o 204802 -b 204800

bash-3.00# metastat -t d50
d50: Duplicación
Subduplicación 0: d51
Estado: Correcto Wed Jul 18 10:52:19 2007
Subduplicación 1: d52
Estado: Correcto Wed Jul 18 10:52:33 2007
Paso: 1
Opción de lectura: roundrobin (predeterminado)
Opción de escritura: parallel (predeterminado)
Tamaño: 204800 bloques (100 MB)

d51: Subduplicación de d50
Estado: Correcto Wed Jul 18 10:52:19 2007
Agrupación de repuestos en marcha: hspool01
Tamaño: 204800 bloques (100 MB)
Banda 0:
Dispositivo Iniciar Base datos Estado Reubic Repuesto en marcha Hora
d61 0 No Correcto No Wed Jul 18 10:52:00 2007

d61: Partición por software
Dispositivo: c0d0s6
Estado: Correcto
Tamaño: 204800 bloques (100 MB)
Dispositivo Bloque de in Base Reubic
c0d0s6 0 No Sí

Extens Bloque de inicio Número de bloques
0 1 204800

d52: Subduplicación de d50
Estado: Correcto Wed Jul 18 10:52:33 2007
Agrupación de repuestos en marcha: hspool01
Tamaño: 204800 bloques (100 MB)
Banda 0:
Dispositivo Iniciar Base datos Estado Reubic Repuesto en marcha Hora
d62 0 No Correcto No Wed Jul 18 10:52:08 2007

d62: Partición por software
Dispositivo: c0d0s6
Estado: Correcto
Tamaño: 204800 bloques (100 MB)
Dispositivo Bloque de in Base Reubic
c0d0s6 0 No Sí

Extens Bloque de inicio Número de bloques
0 204802 204800

Device Relocation Information:
Device Reloc Device ID
c0d0 Sí id1,cmdk@AVMware_Virtual_IDE_Hard_Drive=00000000000000000001

bash-3.00# metastat -t hspool01
hspool01: 2 hot spares
Dispositivo Estado Longit Reubic
d63 Disponible 204800 blocksNo Wed Jul 18 10:51:02 2007
d64 Disponible 204800 blocksNo Wed Jul 18 10:51:02 2007

Device Relocation Information:
Device Reloc Device ID
c0d0 Sí id1,cmdk@AVMware_Virtual_IDE_Hard_Drive=00000000000000000001

2.- Con la misma disposicion de las "soft particions" del punto anterior, generamos un pool ZFS denominado mypool resultante del Stripe creado entre el metadispositivo d63 y d64, asi:

bash-3.00# zpool create mypool /dev/md/dsk/d63 /dev/md/dsk/d64
bash-3.00# zpool status -v
conjunto: mypool
estado: ONLINE
limpiar: no se ha solicitado ninguna
config:

NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
/dev/md/dsk/d63 ONLINE 0 0 0
/dev/md/dsk/d64 ONLINE 0 0 0

errores: ningún error de datosconocido

3.- Y para terminar creamos otro pool ZFS denominado mypool2, resultado del RAIDz entre los metadispositivos d65, d66, d67 y d68 utilizando como hotspare a d69 y a d70, asi:

bash-3.00# zpool create mypool2 raidz /dev/md/dsk/d65 /dev/md/dsk/d66 /dev/md/dsk/d67 /dev/md/dsk/d68 spare /dev/md/dsk/d69 /dev/md/dsk/d70
bash-3.00# zpool status -v mypool2
conjunto: mypool2
estado: ONLINE
limpiar: no se ha solicitado ninguna
config:

NAME STATE READ WRITE CKSUM
mypool2 ONLINE 0 0 0
raidz1 ONLINE 0 0 0
/dev/md/dsk/d65 ONLINE 0 0 0
/dev/md/dsk/d66 ONLINE 0 0 0
/dev/md/dsk/d67 ONLINE 0 0 0
/dev/md/dsk/d68 ONLINE 0 0 0
spares
/dev/md/dsk/d69 AVAIL
/dev/md/dsk/d70 AVAIL

errores: ningún error de datosconocido

OpenSolaris Day 2007


El pasado Jueves 31 de Mayo del 2007 se celebraron en Madrid tanto el
OpenSolaris Day, como el OpenJava Day de los cuales podeis ver los siguientes documentos gráficos.

Personalmente dicho evento me permitió conocer en persona a los miembros de la comunidad que no conocía como a Alvaro Lopez Ortega, Pedro Gracia e Iban Nieto, ademas del recientemente incorporado Víctor de la Nuez.

Asistí junto con Daniel Rico y el lider de la comunidad Española David Galan, con los que he tenido el gusto de compartir buenas experiencias profesionales.

Ininicialmente Pedro Montarelo, director de Marketing de Sun Microsystems Iberica realizó la presentación del acto, junto con una introducción al proyecto OpenSparc y el impulso que esta generando en la comunidad.

También pude conocer personalmente a Jaime Cid, lider de la comunidad GlassFish, el cual participó a su vez en la mesa redonda junto con Alberto Roman (lider del proyecto OSSIM).

En fin, que fue una ocasión única por parte de Sun para apostar por el crecimiento y desarollo de las diferentes comunidades (OpenSolaris, OpenSparc, JavaHispano, GlassFish, OSSIM...) y que espero y deseo podamos repetirlo.

Ya estan disponibles para su descarga las presentaciones de cada uno de los talleres y ponencias que realizamos los miembros de la Comunidad Española:

Introduccion a Nexenta => Pedro Gracia
Solaris Containers y Resource Manager => Daniel Rico
Solaris Volume Manager y ZFS => Victor M Fernandez
Introduccion a Dtrace => Iban Nieto

es.opensolaris.org


Hola a todos, como miembro activo de la Comunidad Opensolaris en España SPOSUG, ya tenemos funcionando el portal en español de OpenSolaris, patrocinado por Sun Microsystems. Desde que en la comunidad española nos pusimos manos a la obra el proceso ha sido relativamente rápido. Ahora solo nos queda ir haciendo los ajustes en estas traducciones para ir incorporando los proyectos de los diferentes grupos de usuarios que esta en marcha dentro del mismo.

Queremos que este portal no sea sólo una referencia para España, sino que también lo sea en América Latina y en cualquier sitio dónde se hable español. Una vez abierto el portal comienza la verdadera tarea de unificación de todos los esfuerzos que existen dentro del mundo de OpenSolaris que hablan español.

Ah y no olvideis la lista de distribucion (ug-sposug@opensolaris.org.): http://mail.opensolaris.org/mailman/listinfo/ug-sposug y el canal dentro del IRC (#opensolaris-es): irc://irc.freenode.net/opensolaris-es