SafeChildren Banner

Havoc Oracle Solaris Experts

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

No hay comentarios:

Publicar un comentario