SafeChildren Banner

Havoc Oracle Solaris Experts

jueves, 28 de diciembre de 2006

:: OFF TOPIC :: Mi Scalextric :D

Este es mi nuevo circuito de Scalextric Digital con la nueva "Chicanne" montada en la bodega


Y esta es otra ;)

Y por último .... en funcionamiento con este video

xD

jueves, 21 de diciembre de 2006

Instalar Bind de forma segura en un CHROOT

Parte 1 - Para los impacientes

Aquí esta una versión creada para Solaris 9 compilado sin parametrización

Parte 2 - Para los que queremos aprender

La instalación de BIND sobre un CHROOT en Solaris 9 no difiere demasiado de instalaciones sobre otras plataformas UNIX.

He escrito un script que realiza gran parte de las tareas por nosotros. Tiene que estar instalado en un directorio con permisos de escritura y debe ser ejecutado como root.

#!/bin/bash
#####################################################################
## CREATE.STRUCTURE
##
## Autor
## Urko Benito
## Version
## 1.0
## Fecha
## 17.ABR.2007
## Descripcion
## - crea la estructura de archivos para la instalacion de un
## servidor DNS BIND sobre Solaris
## - utiliza el directorio base $CHROOT_BASE/dns.server para
## su directorio principal
##
## Revision 1.1 - 19.ABR.2007
## - Ajustes y creaciones para el blog
###################################################################

# variable base
CHROOT_BASE=/chroot
DNS_SERVER=${CHROOT_BASE}/dns.server
UMASK_BIN=$(which umask)
MKDIR_BIN=$(which mkdir)
LN_BIN=$(which ln)
ECHO_BIN=$(which echo)
GREP_BIN=$(which grep)
AWK_BIN=$(which awk)
USERADD_BIN=$(which useradd)
GROUPADD_BIN=$(which groupadd)
LDD_BIN=$(which ldd)
COPY_BIN=$(which cp)
FIND_BIN=$(which find)
XARGS_BIN=$(which xargs)
SORT_BIN=$(which sort)
UNIQ_BIN=$(which uniq)
LS_BIN=$(which ls)
SED_BIN=$(which sed)
MKNOD_BIN=$(which mknod)
ZONENAME_BIN=$(which zonename)

##########################################################
## configuracion instalcion BIND
##
## debemos tener una instalacion de bind ya en el servidor
## en la BIND_BASE=/usr/local/bind
##########################################################
BIND_BASE=/root/scripts/install-bind/bin/bind-9.4.0
BIND_BIN=${BIND_BASE}/bin
BIND_SBIN=${BIND_BASE}/sbin
NAMED_BIN=${BIND_SBIN}/named

##########################################################
## archivos temporales
##########################################################
OUTPUTFILETEMP=/tmp/ldd.output

###########################################################
## en SunOS tenemos que tener una estructura igual
## y existen las biblitoecas de kernel unidas a la plataforma
## por eso, debemos crear los mismo
###########################################################
IS_SUN=$(uname -s)
SUN_VERSION=$(uname -r)
IS_SUNOS=$(uname -s)
ZONENAME=$(${ZONENAME_BIN})

############################################################
## CONFIGURACION ACTIVA/NO
## Para Evitar que se haga uso sin configurar por lo menos
## lo del BIND-SOURCE
###########################################################

# message
function show_start_help {
# if [ -z ${BIND_BASE} ]; then
${ECHO_BIN}<###############################################################
## WARNING
###############################################################

No esta configurado el sistema, debes introducir la ubicacion
para BIND_BASE con la direccion de los binarios de BIND

###############################################################
## END
###############################################################

EOF_ECHO
}

# chroot - structure
function create_directory {
# mascara mas segura
${UMASK_BIN} ${UMASK_OPT}
# sistema general de archivos
${MKDIR_BIN} -p ${DNS_SERVER}/{dev,opt,usr,var,etc};
cd ${DNS_SERVER}
${MKDIR_BIN} -p ${DNS_SERVER}/usr/bin
${MKDIR_BIN} -p ${DNS_SERVER}/usr/sbin
${MKDIR_BIN} -p ${DNS_SERVER}/usr/lib
${MKDIR_BIN} -p ${DNS_SERVER}/usr/local
${LN_BIN} -s ./usr/bin ./bin
${LN_BIN} -s ./usr/sbin ./sbin
${LN_BIN} -s ./usr/lib ./lib
${MKDIR_BIN} -p ${DNS_SERVER}/var/{run,log,named}
# si es SunOS
if [ ${IS_SUN} = "SunOS" ]; then
SUN_TYPE=$(uname -i)
${MKDIR_BIN} -p ${DNS_SERVER}/platform/${SUN_TYPE}/lib
${MKDIR_BIN} -p ${DNS_SERVER}/usr/platform/${SUN_TYPE}/lib
else
${ECHO_BIN} "No SunOS"
fi

}

# create user
function create_dns_user {
# start
${ECHO_BIN} "Starting Creating User NAMED"

${GROUPADD_BIN} -g 6000 named
${USERADD_BIN} -g named -s /bin/false -c "BIND daemon" -d /dev/null -m named
${GREP_BIN} named /etc/passwd > ${DNS_SERVER}/etc/passwd
${GREP_BIN} named /etc/shadow > ${DNS_SERVER}/etc/shadow
${GREP_BIN} named /etc/group > ${DNS_SERVER}/etc/group
# flag seguridad (aunque con -d /dev/null ;) )
${ECHO_BIN} "named" > ${DNS_SERVER}/etc/ftpusers

# fin
${ECHO_BIN} "Finising Creating User NAMED"
}

# find required LD
function find_required_so {
# start
${ECHO_BIN} "Searching for SO files ... "

# evolution
# find bin/bind-9.4.0/*bin -type f -perm 755 -print|xargs ldd 2>/dev/null |grep "\=\>"|awk '{print $3}'|sort|uniq
# buscamos todos los binarios menos *.sh y aplicamos
${FIND_BIN} ${BIND_BASE} -type f -perm 755 -print | ${XARGS_BIN} ${LDD_BIN} 2>/dev/null | ${GREP_BIN} "\=\>" | ${AWK_B
IN} '{print $3}' | ${SORT_BIN} | ${UNIQ_BIN} > ${OUTPUTFILETEMP}

# y ahora las de SunOS
${FIND_BIN} ${BIND_BASE} -type f -perm 755 -print | \
${XARGS_BIN} ${LDD_BIN} 2>/dev/null | \
${GREP_BIN} -v "\=\>" | \
${GREP_BIN} -v "^${BIND_BASE}" | \
${AWK_BIN} '{print $1}' | ${SORT_BIN} | ${UNIQ_BIN} >> ${OUTPUTFILETEMP}

# fin
${ECHO_BIN} "Searching END"
}

# copy SO files to CHRoot
function copy_so_files {
# start
${ECHO_BIN} "Copy SO files ... "

while read source_file
do
${ECHO_BIN} "(1) ${COPY_BIN} ${source_file} to ${DNS_SERVER}${source_file}"
${COPY_BIN} ${source_file} ${DNS_SERVER}${source_file}
done < ${OUTPUTFILETEMP}

# despues de copiarlas, hacemos la busqueda de las que nos quedan
${FIND_BIN} ${BIND_BASE} -type f -name "lib*" -print | \
${XARGS_BIN} ${LDD_BIN} 2>/dev/null | \
${GREP_BIN} "\=\>" | \
${AWK_BIN} '{print $3}' | ${SORT_BIN} | ${UNIQ_BIN} > ${OUTPUTFILETEMP}
while read source_file
# volvemos a copiar
do
#${ECHO_BIN} "(2) ${COPY_BIN} ${source_file} to ${DNS_SERVER}${source_file}"
${COPY_BIN} ${source_file} ${DNS_SERVER}${source_file} 2>/dev/null
done < ${OUTPUTFILETEMP}
# copiamos LD.SO
${COPY_BIN} /lib/ld* ${DNS_SERVER}/lib/ 2>/dev/null
# copiamos el BIND
${COPY_BIN} -r ${BIND_BASE} ${DNS_SERVER}/usr/local/

# fin
${ECHO_BIN} "Copy END"
}

# creamos los dev necesarios
function create_devices {
# buscamos el device y lo creamos
# si esta en una zona y es SunOS entonces es como UNIX, sino, esta en DEVICES
DEVBASE=/devices/pseudo
if [ ${IS_SUNOS} = "SunOS" ]; then
if [ "${SUN_VERSION}" = "5.10" ]; then
if [ "${ZONENAME}" = "global" ]; then
DEVBASE=/devices/pseudo/*
else
DEVBASE=/dev/
fi
else
DEVBASE=/devices/pseudo/*
fi
else
DEVBASE=/dev/
fi

# info
${ECHO_BIN} "Configuring devices at ${DEVBASE}$1"

# base DEV
NODE=$(${LS_BIN} -l ${DEVBASE}$1|${AWK_BIN} '{print $5}'|${SED_BIN} s/\,//)
SINGLE=$(${LS_BIN} -l ${DEVBASE}$1|${AWK_BIN} '{print $6}')

# creamos el NODO
${MKNOD_BIN} ${DNS_SERVER}/dev/$1 c ${NODE} ${SINGLE}
}

# is solaris 10 at non global zone
function verify_sunos_10_zone {
if [ "${IS_SUNOS}" = "SunOS" ]; then
if [ "${SUN_VERSION}" = "5.10" ]; then
if [ "${ZONENAME}" = "global" ]; then
${ECHO_BIN} "Configuring System at ${IS_SUNOS} ${SUN_VERSION}"
else
${ECHO_BIN} "No Tiene Sentido Instalar un CHROOT en SunOS 5.10, porque tiene"
${ECHO_BIN} "soporte para zonas que hacen mejor uso de ello"
${ECHO_BIN} " "
${ECHO_BIN} "Puedes encontrar mas informacion aqui http://sunsolve.sun.com"

exit 1
fi
else
${ECHO_BIN} "Configuring System at ${IS_SUNOS} ${SUN_VERSION} / NON 5.10"
fi
else
${ECHO_BIN} "Configuring System at NON SunOS Version ... "
fi

}



# ---
#verify_sunos_10_zone
show_start_help

create_directory
create_dns_user
find_required_so
copy_so_files

create_devices null
create_devices tcp
create_devices udp
create_devices log
create_devices zero
create_devices syscon



Una vez ejecutado, ya sólo tenemos que configurar las entradas en nuestro /chroot/dns.server/etc/named.conf y /chroot/dns.server/var/named/



Urko

miércoles, 20 de diciembre de 2006

Instalar IPFilter Sobre Solaris 8/9

Introducción
 IPFilter es un módulo de traducción (NAT) o Filtrado (Firewall) capáz de ser cargado como un módulo de kernel o en el propio kernel.

Está diseñado para funcionar con SunOS 5.x (tanto en Solaris como SunOS 4.x) de una forma muy sencilla.


UPDATED: Si quieres, puedes ver Cómo Instalar y Configurar IPFilter en Solaris 10


Vamos a empezar con su instalación, para ello, vamos a proceder a descargar las aplicaciones necesarias IPFilter 4.1.16, además de el módulo PFIL. Una vez tenemos las aplicaciones, procederemos con los pasos para su instalación.

Parte 1 - Instalación de PFil

Para realizar la instalación según los parámetros por defecto, sólo debemos realizar los siguientes pasos

# uname -s
SunOS
# mkdir -p /tmp/ipfilter-pkg
# cd /tmp/ipfilter-pkg
# gzip -dc /export/home/blogger/pfil-2.1.11.tar.gz |tar xpf -
# mv pfil pfil-2.1.11
# cd pfil-2.1.11/
# make package
// -- mensajes de compilacion -- //
# pkgadd -d /tmp/pfil.pkg

The following packages are available:
1 pfil Packet Filtering Interface
(i386) 2.1.11,REV=23:22:20 12/20/06

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]:

// ---- mensajes instalación ---

Si nos fijamos en los pasos marcados en azul, hemos realizado algunos cambios. Creamos un directorio para poder compilar el paquete porque, por defecto, crea el paquete en el directorio /tmp/pfil por lo que no podemos descomprimirlo en /tmp.

Si hacemos caso al manual, podemos ver que la compilación de PFil sobre Solaris, no incluye ninguna modificación para SunCC cuando estamos sobre x86, por ello, hemos hecho algunos cambios. Hemos introducido una nueva variable llamada S32FLAGS=-native -fast. Tener en cuenta que esta modificación sólo es válida para el compilador SunCC, y cuando estemos compilando en una máquina igual a la de producción.

Aquí puedes encontrar la versión modificada de Makefile (si lo prefieres aqui tienes el patch)

Una vez instalado el paquete, debemos reiniciar la máquina para que la instalación de pfil se encuentre correctamente utilizando el siguiente comando

# ifconfig e1000g0 modlist
0 arp
1 ip
2 pfil
3 e1000g


Este comando muestra la lista de módulos instalados y si aparece PFIL, entonces, podemos continuar con la instalación de IPFilter.

Parte 2 - Instalación de IPFilter

Antes de continuar con la instalación, debemos realizar las siguiente comprobaciones.

  • No usar GNU Make
  • Si hemos compilado PFIL con SunCC IPFilter se debe compilar con SunCC

Una vez hemos realizado las comprobaciones necesarias, podemos proceder a compilar e instalar el paquete.

# gzip -dc /export/home/blogger/ip_fil4.1.15.tar.gz | tar xpf -
# cd ip_fil4.1.15/
# make solaris


Si todo ha ido bien, podemos realizar la instalación del paquete SunOS5/arquitectura y proceder a rebootar la máquina.

Parte 3 - Configuración Básica de IPF

Los archivos de configuración se encuentran en /etc/opt/ipf dentro de dos archivos ipf.conf y ipnat.conf.

Esta configuración, la comentaremos con más detalle en la siguiente actualización (ahora no tengo mucho tiempo)


Referencias

martes, 5 de diciembre de 2006

Instalar Solaris como Router (Parte II - Instalar IPFilter)

En la primera parte de Instalar Solaris como Router establecimos los requisitos mínimos para poder iniciar la configuración. Hasta aquí todo era muy sencillo, simplemente necesitabamos al menos dos tarjetas y establecer la variable de kernel ip_forwarding a 1 (si contamos con algún interface por DHCP), además dibujamos un esquema con la configuración final a crear.

Ahora bien, si queremos que nuestros clientes puedan hacer una conexión desde la lan hasta Internet, será necesario establecer una configuración NAT correcta. Esta utilidad nos la va a proporcionar IPFilter, puedes saber más en Qué es IPFilter y para que me Sirve.

lunes, 4 de diciembre de 2006

Instalar Solaris como Router (Parte I - Introducción)

No sabía muy bien como empezar a escribir el artículo, pero luego me dije "si lee esto es porque sabe que quiere un router, no?", así que vamos a obvier esos pequeños apartados donde hacemos mención de "Qué es un router, para qué sirve ... " y nos centramos un poco en "Cómo hacerlo".

Para hacer que Solaris enrute necesitamos pocas cosas, pero una de ellas es que tenga al menos dos tarjetas de red (DualHomed Host). Si Solaris detecta dos tarjetas de red durante el arranque establecerá la variable ip_forwarding a 1, indicando que está capacitado para hacer routing, podemos comprobarlo de la siguiente forma:

# ndd -get /dev/tcp ip_forwarding

Debemos tener en cuenta que si una de las tarjetas de red está en modo DHCP, la variable ip_forwarding no estará puesta a 1, sino a 0(desactivada), por ello, debemos poner el siguiente script en el arranque del sistema para forzar el valor así mismo, si nuestra tarjeta principal está configurada por DHCP, tendremos el problema de que nos resuelva el nombre de nuestro sistema, aquí tienes una solución "Cómo eliminar el "Unknown hostname" de Solaris"

Esta es la arquitectura que vamos a crear en nuestro Mini HowTo

Como hemos comentado antes, los requisitos mínmos para que Solaris haga de Router, son esencialmente, que tenga al menos dos tarjetas de Red (no tendría sentido enrutar sobre el mismo segmento de red, no?). A esto se llama Dual Homed Host (DHH). Como segundo requisito es que la variable ip_forwarding se encuentre establecida a 1.

Una vez establecido que los requisitos mínimos se cumplen, podemos comenzar a planificar la configuración basándonos en el gráfico adjunto.


Como vemos en la configuracion, queremos que nuestra máquina Sun (solaris9-sparc) haga de router entre nuestra red de usuarios (lan) y nuestro acceso a internet. También hemos incluido otra segunda red que puede hacer las veces de DMZ, esto es opcional. A todo esto, tenemos que unir un software capáz de hacer NATing ya que un Router por sí solo, sólo enruta.

Para poder establecer una comunicación desde nuestra red lan hacia internet, necesitamos que se produzca un soporte NAT, que nos lo proporciona IPFilter - IPNat

Continuaremos con la configuración de solaris en Instalar Solaris como Router (Parte II - Instalar IPFilter)



::OFF TOPIC:: Cena de Fin de Año

Este fin de semana nos hemos vuelto a reunir todos esos amigos que empezamos (allá por el 2000) la carrera de Ingeniería Informática de Sistemas en Zaragoza.

Como en otras ocasiones, todo comenzó con el mensaje por correo electrónico que nuestro amigo Roberto envió, y ... de ahí en adelante ... Txispas, Ton, Pablo y GariPues

Esta entrada es para felicitar a mis compañeros, y dar fe (cómo suena) de lo bien que nos/me lo pasamos.

A por la próxima!!! En mi casa

Un Saludo,
Urko

jueves, 30 de noviembre de 2006

Tunning de red para Solaris

Muchos de los parámetros que tiene configurado Solaris sobre la capa TCP/IP son algo escasos o ajustados, realizando algunas pequeñas modificaciones podemos obtener grandes rendimientos.

Para ello, crearemos un archivo llamado /etc/rc2.d/S99ndd con el siguiente conjunto de modificaciones, puedes descargarlo de aquí

# cat <<! >/etc/rc2.d/S99ndd

# tamaño máximo de ventana de congestión
# Según la relación: max_buf = 2 x cwnd_max
ndd -set /dev/tcp tcp_max_buf 4194304
ndd -set /dev/tcp tcp_cwnd_max 2097152

# aumentamos el tamaño de la ventana tcp
ndd -set /dev/tcp tcp_xmit_hiwat 65536
ndd -set /dev/tcp tcp_recv_hiwat 65536

# tiempo de espera antes de cerrar una conexion tcp
ndd -set /dev/tcp tcp_time_wait_interval 60000

# Ataque SYNC
ndd -set /dev/tcp tcp_ip_abort_cinterval 60000

# default: 480000
ndd -set /dev/tcp tcp_ip_abort_interval 60000

# default: 7200000
ndd -set /dev/tcp tcp_keepalive_interval 900000

# default: 1
ndd -set /dev/tcp tcp_slow_start_initial 2

# default: 1024
ndd -set /dev/tcp tcp_conn_req_max_q0 4096

# default: 128
ndd -set /dev/tcp tcp_conn_req_max_q 1024

# soporte para hacer de router
ndd -set /dev/tcp ip_forwarding 1

!

# chown root:sys /etc/rc2.d/S99ndd
# chmod 750 /etc/rc2.d/S99ndd

La variable ip_forwarding puede ser puesta a 0 si no queremos que nuestra máquina enrute paquetes, si esta variable no está puesta a 1, no será posible hacer NAT para utilizarla como Router.



Eliminar "Unknown Hostname" en Solaris cuando configuramos por DHCP el interface principal

Introducción
Updated: Esta entrada la escribí hace mucho tiempo y estaba pensada para Solaris 9, si quieres ver cómo se realiza el mismo proceso, pero en Solaris 10, tienes la actualización de Eliminar Unknow Hostname en Solaris 10


Si tenemos configurada nuestra salida a internet (external) en un interface que está sobre DHCP, entonces, Solaris intentará configurar el nombre de host a traves de este mismo. Esto supone que mi máquina Solaris quede con "unknown" como nombre de host.

Para solucionarlo, podemos hacer los siguientes pasos.

Asumimos que nuestro Sun tiene dos tarjetas de red, ce0 y ce1. La tarjeta ce0 está conectada a nuestro switch lan mediante una dirección estática y la tarjeta ce1 a nuestro modem ADSL mediante DHCP, según la siguiente imagen




Para ello vamos a empezar configurando los interfaces, y el nombre de nuestro host, topito

# echo "192.168.1.254 topito topito.example.com" >> /etc/hosts
# echo "topito" > /etc/nodename
# echo "topito" > /etc/hostname.ce0

Debemos crear una entrada de hostname.ce0 vacía para hacer que el DHCP carge una dirección IP válida, además de la entrada /etc/dhcp.ce1, que si está vacía contendrá los valores por defecto y si contiene datos serán las modificaciones de los mismos aplicados a este interface, en nuestro caso ce1

# touch /etc/hostname.ce1
# touch /etc/dhcp.ce1

Si no queremos que se nos asignen los parámetros por defecto, podemos utilizar estos modificadores:

  • wait TIEMPO_EN_SEGUNDOS por defecto son 30
  • primary si queremos que sea o no el interface primario

La configuración DHCP de Solaris está hecha, ahora sólo nos queda hacer que cada vez que nuestro sistema se inicie no intente resolver el nombre de host por DHCP y nos ponga "Unknown", para ello, utilizaremos este pequeño script que colocándolo en /etc/rc2.d hará que se nos asigne nuestro nombre

# cat <<! >/etc/init.d/set_hostname

#!/sbin/sh
#*********************************************
#
# Name: set_hostname
# SCCS Id: @(#)set_hostname 1.2 07/26/04
#
# Description:
# This file is a script for re-setting your hostname to the

# right value if you use DHCP (which has a habit of setting
# your hostname to "unknown" if you use a cable modem).
#
#
# Copyright © 2000-2004 by Rich Teer.
# All rights reserved.

#
#*********************************************

HOSTNAME=`cat /etc/nodename`
uname -S $HOSTNAME

!

# ln /etc/init.d/set_hostname /etc/rc2.d/set_hostname
# chown root:sys /etc/init.d/set_hostname
# chmod 750 /etc/init.d/set_hostname

En Solaris 10 las cosas cambian un poquito, este último paso podemos ignorarlo ya que basta con modificar un archivo de configuración para que sea el propio sistema quien se encarge de cargar el valor de /etc/nodename, para ello modificaremos el parámetro PARAM_REQUEST_LIST del archivo de configuración /etc/default/dhcpagent y eliminaremos el valor 12 de la lista, ya que este valor corresponde a hostname. (podemos obtener toda la información sobre los valores en el archivo)

  • PARAM_REQUEST_LIST=1,3,6,12,15,28,43
por
  • PARAM_REQUEST_LIST=1,3,6,15,28,43


Con esto tenemos ya configurado nuestra máquina Solaris para eliminar el molesto "Unknown", reiniciamos la máquina y listo!

Más información http://www.rite-group.com/rich/solaris_dhcp.html


Referencias


lunes, 27 de noviembre de 2006

Saludos y presentación

Hola mi nombre es Urko,

Durante mucho tiempo he estado leyendo blogs y por fin, me he decidido. No creaís que no me ha costado encontrar algo de tiempo para poder publicar diferentes cosas aunque con un entorno común Sun Solaris.

Si estás leyendo esto es que conoces (o te interesa) el Sistema Operativo de Sun, y bueno, aunque puede que a veces me pueda "ir un poco por ahí" intentaré hablar todo lo que pueda de Administración, Tunning, ... sobre este apasionante sistema operativo.

Bienvenido,

Urko Benito