Sei sulla pagina 1di 208

INTRODUCCIN

La interconexin entre mquinas y las comun icaciones de alta velocidad han


permitido que los recursos que se utilicen no estn e n el mismo sitio geogrfico del
usuario. UNIX ( y por supuesto GNU/Linux) es probablement e el mximo exponente
de esta filosofa, ya que desde su inicio ha fomen tado el compartir recursos y la
independencia de dispositivos.

Esta filosofa se ha plasmado en algo comn hoy en da, que son los servicios. Un
servicio es un recurso (que puede ser universal o no) y que permite bajo ciertas
condiciones obtener informacin, compartir datos o simplemente procesar la in formacin remotamente. Nuestro objetivo es an alizar los servicios que permiten el
funcionamiento de una red. Generalmente, dentro de esta red existir una mquina
(o varias, segn las configuraciones) que posibilitar el intercambio de informacin
entre las restantes.

Estas mquinas se denominan ser vidores y contienen un conjunto de programas que


permiten quela informacin est centralizada y sea fcilmente accesible. Estos
servicios propician la reduccin de costes y amplan la disponibilidad de la
informacin, pero se debe tener en cuenta que un se rvicio centralizado presenta inconvenientes, ya que puede quedar fuera de lnea y dejar sin servicio a todos los
usuarios.

Los servicios se pueden clasificar en dos tipos: de vinculacin ordenador-o r d e n a d o r o de


relacin hombre-ordenador. En el primer caso se trata deservicios requeridos por otros
ordenadores, mientras que en el segundo, s o n s e r v i c i o s r e q u e r i d o s p o r l o s u s u a r i o s
( a u n q u e h a y s e r v i c i o s q u e p u e d e n actuar en ambas categoras). Dentro del primer tipo
se encuentran servicios de nombres, como el domain name system ( D N S ) , e l s e r v i c i o d e
informacin de usuarios (NISYP), el directorio de informacin LDAP o los
s e r v i c i o s d e a l m a c e n a m i e n t o i n t e r m e d i o ( proxies).

Dentro de la segunda categora, se incluyen servicios de conexin interactiva y ejecucin remota


(SSH, telnet), transferencia de ficheros (FTP), intercambio de informacin a nivel de u s u a r i o ,
c o m o e l c o r r e o e l e c t r n i c o ( M T A , I M A P , P O P ) , news, W o r l d W i d e Web, W i k i y
archivos (NFS).Para mostrar la po sibilidades de GNU/LinuxDebian -FC6, se
d e s c r i b i r n c a d a u n d e e s t o s s e r v i c i o c o n u n a c o n f i g u r a cin mnima y operativa,
pero sin descuidar aspectos de seguridad y estab i l i d a d .

COMANDOS AVANZADOS UTILIZADOS EN LA ADMINISTRACIN DE SERVIDORES


ACERCA DE AWK

AWK, cuyo nombre deriva de la primera letra de los apellidos de sus autores Alfred Aho, Peter
Weinberger y Brian Kernighan, es un lenguaje de programacin que fue diseado con el objetivo
de procesar datos basados sobre texto y una de las primeras herramientas en aparecer en Unix.
Utiliza listas en un ndice ordenado por cadenas clave (listas asociativas) y expresiones regulares.
Es un lenguaje ampliamente utilizado para la programacin de guiones ejecutables pues aade
funcionalidad a las tuberas en los sistemas operativos tipo POSIX. Est incluido en las
instalaciones bsicas de prcticamente todas las distribuciones de GNU/Linux.

Estructura de los programas escritos en AWK.


El mandato awk utiliza un archivo o emisin de ordenes y un archivo o emisin de entrada. El
primero indica como procesar al segundo. El archivo de entrada es por lo general texto con algn
formato que puede ser un archivo o bien la salida de otro mandato.

La sintaxis general utilizada para el mandato awk sigue el siguiente patrn:


awk 'expresin-regular { orden }'

Cuando se utiliza el mandato awk, ste examina el archivo de entrada y ejecuta la orden cuando
encuentra la expresin regular especificada.

El siguiente modelo ejecutara la orden al inicio del programa y antes de que sean procesados los
datos del archivo de entrada:

awk 'BEGIN { orden }'

El siguiente modelo ejecutara la orden al final del programa y despus de que sean procesados
los datos del archivo de entrada:

awk 'BEGIN { orden }'

El siguiente modelo ejecutara la orden por cada una de las lneas del archivo de entrada:

awk '{ orden }'

PROCEDIMIENTOS

A continuacin se mostrarn ejemplos del uso de AWK.

El siguiente mandato especfica que al inicio se imprima en la salida la frase "Hola mundo" y
terminar el procesamiento.

awk 'BEGIN { print "Hola mundo"; exit }'

Lo anterior deber devolver una salida como la siguiente:

Hola mundo

Si se genera el archivo prueba.txt del siguiente modo:

echo -e "Columna1\tColumna2\tColumna3\tColumna4\n" > ejemplo.txt

Y se visualiza con el mandato cat:

cat ejemplo.txt

Devolver el siguiente contenido:

Columna1

Columna2

Columna3

Columna4

Si se utiliza el mandato awk para que solo muestre la columna 1 y la columna 3 del siguiente
modo:

awk '{ print $1, $3}' ejemplo.txt

La salida devolver lo siguiente:

Columna1 Columna3

Si se utiliza el mandato awk para que solo muestre la columna 3 y la columna 1, en ese orden, del
siguiente modo:
awk '{ print $3, $1}' ejemplo.txt

La salida devolver lo siguiente:

Columna3 Columna1

Si se aaden datos al archivo ejemplo.txt del siguiente modo:

echo

-e

"Dato1\tDato2\tDato3\tDato4\n"

>>

ejemplo.txt

echo

-e

"Dato5\tDato6\tDato7\tDato8\n"

>>

ejemplo.txt

echo -e "Dato9\tDato10\tDato11\tDato4\12" >> ejemplo.txt

Y se visualiza con el mandato cat:

cat ejemplo.txt

Devolver el siguiente contenido:

Columna1

Columna2

Columna3

Columna4

Dato1

Dato2

Dato3

Dato4

Dato5

Dato6

Dato7

Dato8

Dato9 Dato10 Dato11 Dato4

Si se utiliza nuevamente el mandato awk para que solo muestre la columna 1 y la columna 3 del
siguiente modo:

awk '{ print $1, $3}' ejemplo.txt

La salida devolver lo siguiente:

Columna1

Columna3

Dato1

Dato3

Dato5

Dato7

Dato9 Dato11

Si se utiliza el mandato awk del siguiente modo para que solo muestre solo la lnea cuya columna
contenga la expresin regular Dato5:

awk '/Dato5/ { print }' ejemplo.txt

La salida devolver lo siguiente:

Dato5 Dato6 Dato7 Dato8

Si se utiliza el mandato awk del siguiente modo para que solo muestre solo la lnea cuya columna
contenga la expresin regular Dato5, y adems solo las columnas 1 y 4:

awk '/Dato5/ { print $1, $4}' ejemplo.txt

La salida devolver lo siguiente:

Dato5 Dato8

Si se utiliza el mandato awk del siguiente modo para que muestre solo las lneas con ms de 35
caracteres en el archivo /etc/crontab:

awk 'length > 35' /etc/crontab

La salida devolver lo siguiente:

01

02

22

*
*

*
*

root
*

root
root

run-parts
run-parts
run-parts

/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

Si se utiliza el mandato awk del siguiente modo para que muestre solo las lneas con menos de 35
caracteres en el archivo /etc/crontab:

awk 'length < 35' /etc/crontab

La salida devolver lo siguiente:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts

Utiliza vi para crear el archivo usuario.txt:

vi usuario.txt

Ingrese el siguiente contenido:

Fulano
Calle

Algo
Mengana

Colonia

123
Perengana

Ciudad de Zutano, C.P. 123456

Para que el mandato awk reconozca cada lnea como un registro completo, en lugar de considerar
cada palabra como una columna, se utiliza 'BEGIN { FS="\n" ; RS=""}', donde el valor de FS
(Field Separator o separador de campo) se establece como un retorno de carro y el valor de RS
(Record Separator o separador de registro) se establece como una lnea vaca. Si utiliza el
siguiente mandato donde se establecen los valores mencionados para FS y RS y se pide se
impriman los valores de cada registro (cada lnea) separados por una coma y un espacio:

awk 'BEGIN { FS="\n"; RS="" } { print $1 ", " $2 ", " $3 ", " $4 }' usuario.txt

La salida devolver lo siguiente:

Fulano Algo, Calle Mengana 123, Colonia Perengana, Ciudad de Zutano, C.P.
123456

El mandato awk puede realizar conteo de lneas, palabras y caracteres. El siguiente mandato se
establece que el valor de w sea igual al nmero de campos (New Field o NF), c sea igual la
longitud de cada campo, y que se imprima el nmero de campos, el valor de w y el valor de c:

awk

'{

+=

END
"Campos:

NF;

{
"

NR

+=

length}

print

"\nPalabras:

"

w,

"\nCaracteres:

\
"

}'

usuario.txt

La salida devolver lo siguiente:

Campos:

Palabras:

12

Caracteres: 74

Genere el archivo numeros.txt con el siguiente contenido, donde las columnas sern separadas por
un tabulador:

9 10 11 12

El mandato awk puede realizar operaciones matemticas. el siguiente mandato establece que s es
igual a la suma del valor de los campos de la primera columna del archivo numeros.txt, e imprime
el valor de s:

awk '{ s += $1 } END { print s }' numeros.txt

La salida devolver lo siguiente (resultado de la suma de 1+5+9):

15

Si se hace lo mismo, pero con los valores de la columna 2:

awk '{ s += $2 } END { print s }' numeros.txt

La salida devolver lo siguiente (resultado de la suma de 2+6+10):

18

Para hacer conteo de frecuencia de palabras, Se establece que el valor para FS (Field Separator o
separador de lnea) sea igual a expresiones regulares que van desde la a a la z y desde la A a la Z,
se establece que el valor de la variable i es igual a 1 y menor al nmero de campos.

awk
{

'BEGIN
for

(i=1;

{
i<=NF;

FS="[^a-zA-Z]+"}
i++)

words[tolower($i)]++

\
}

END { for (i in words) print i, words[i] }' /etc/crontab

La salida devolver lo siguiente:

7
bin

run

etc

sbin

bash

weekly

daily

cron

usr

path

shell

parts

home

mailto

monthly

hourly

root 6

SED

Se trata de un editor de cadenas, que deriva directamente del comando ed, por lo cual es fcil de
aprender, una vez conocido el propio comando ed. Un editor de cadenas es usado para realizar
transformaciones de texto bsicas de una cadena de entrada (un archivo o la salida de un pipe). A
diferencia de otros editores comunes, sed hace solo una revisin sobre cada entrada, por lo cual
es mas eficiente, en especial lo es, cuando filtra texto que pasa por una unin pipe.

Cuando sed filtra un archivo, no altera su contenido, todos los cambios los realiza sobre la salida
que imprime. Sed despliega cada rengln automticamente y por ello p no se necesita despus del
comando de sustitucin (s, por ejemplo s/old/new/). Las comillas son indispensables pues existen
metacaracters de sed que tienen significado especial para el shell sobre el cual se ejecuta.

El comando sed tiene una limitacin que no se encuentra en ed: no maneja nmeros relativos de
rengln. En particular, + y - no son entendidos como expresiones para indicar nmeros de rengln,
por lo cual resulta imposible de retroceder a uno o mas renglones anteriores o hacer
direccionamientos relativos hacia adelante. Esto se debe a que una vez ledo un rengln, el
anterior se pierde para siempre; no hay manera de identificar el penltimo rengln.

En la lista de comandos puede existir cualquiera de los listados ms adelante. Cuando se hace uso
de uno solo, basta con encerrarlo entre comillas simples como sigue:

sed 's/old/new/' archivo

Pero en el caso de que necesitemos ejecutar varios comandos sobre un mismo archivo, es
necesario que estos se encuentren en diferentes lneas, por ejemplo:

sed 's/^/ /3q' archivo

No hay que olvidar que antes de escribir el primer comando, se deben abrir las comillas simples y
las mismas se deben cerrar despus de teclear el ltimo comando. Tambin es posible almacenar
los comandos dentro de un archivo y llamarlo a la hora de que se ejecute sed con el parmetro f. Por ejemplo:

sed -f cmdarchivo archivo_texto

Se pueden utilizar otros selectores o patrones antes de cada comando, por ejemplo:

sed '/patron/q' Imprime cada linea de archivo hasta encontrar aquella que contenga el patron
sed '/patron/d' Cancela todas las lineas que contengan el patron y no se imprimen

Incluso si se desea el resultado inverso a lo que realiza un comando, basta con agregar un '!' antes
del comando. Por ejemplo, para los dos ejemplos anteriores se prosigue como sigue:

sed '/patron/!q' No imprime c/lnea de archivo hasta encontrar aquella que contenga el patron
sed '/patron/!d' No cancela todas las lineas que contengan el patron y no se imprimen

Sintaxis
La sintaxis de sed es la siguiente

sed [-n] [-V] [--quiet] [--silent] [--version] [--help]


[-e script] [--expression=script]
[-f script-file] [--file=script-file]
[script-if-no-other-script]
[file...]
-----------------------------------------------------------------------------------------------V --version
Imprime la versin de sed y nota de copyright.
-h --help
Imprime un resumen de todas las opciones de sed.
-n --quiet --silent
Por defecto, sed imprime cada linea cuando termina de editarla. Esta opcin deshabilita la
impresin automtica y no se produce ninguna salida, excepto que se incluya el comando p.
-e script --expression=script
Agrega los comandos de la cadena script, encerrada entre comillas simples, a la lista de comandos
para ser ejecutados mientras se procesa la entrada.
-f script-file --file=script-file
Agrega los comandos contenidos en el archivo script para ser procesados sobre la entrada. Si
ninguno de los dos parmetros anteriores es utilizado, en cualquiera de sus formas, sed tomar
como comandos la primera expresin que no sea opcin de sed como argumento para ejecutar
como si fuera script.

Comandos
====================================================================
A continuacin se presenta una lista de comandos que se pueden utilizar para filtrar una entrada
con sed, as mismo se incluyen algunos ejemplos para una mayor comprensin.

10

** Sustitucin **
Su funcin es sustituir una cadena old por una nueva new en cada linea que procese. Su sintaxis
es la siguiente:
s/old/new/

Ejemplo:
sed 's/casa/carro/' contrato.txt Sustituye la cadena 'casa' por 'carro' en contrato.txt
sed 's/^/.-/' arch.txt Agrega la cadena '.-' al inicio de cada linea de arch.txt
sed 's/^/\
/' arch.txt Agrega un salto de linea al final de cada linea de arch.txt

Otro comando que puede ser til es y, el cual remplaza cada caracter procedente de old con el
caracter correspondiente proveniente de new. Aqui no se admiten rangos. Su sintaxis es:
y/old/new/

** Borrado **
Su funcin es borrar a la salida, las lineas que correspondan al patrn escrito. Su sintaxis es la
siguiente:
/patron/d

Ejemplo:
sed '/calvo/d' arch.txt Elimina las lineas que contienen la cadena 'calvo' en arch.txt
sed '/amor/!d' carta.txt Elimina las lineas que no tengan la palabra amor en carta.txt
sed '3d' forma.txt Elimina la linea 3 del archivo forma.txt

** Impresin **
Su funcin es imprimir la salida de sed. En realidad, sed imprime automticamente la entrada
filtrada, entonces si se agrega el comando p, cada linea de salida se imprimir doble. En caso de
que se agregue el parmetro -n a sed, pero se quiera imprimir la salida, se agrega el comando p.
Su sintaxis es la siguiente:
/patron/p

Ejemplo:
who | sed -n '/root/p' Imprime solamente las sesiones de root
who | sed '/root/p' Imprime dos veces cada sesion abierta de root
who | sed -n '2p' Imprime solamente la segunda sesion que se inici en el sistema

11

** Abandonar filtrado **
Otro comando til para imprimir una parte de la entrada es q. Este comando termina
inmediatamente las operaciones de sed, en base a la correspondencia del patrn con las lneas
que este procesando. Su sintaxis es la siguiente:
/patron/q

Ejemplo:
sed '3q' forma.txt Imprime hasta la linea 3 del archivo forma.txt
sed '/clavo/q' arch.txt Imprime desde la lnea 1 de arch.txt hasta encontrar aquella que contiene la
palabra 'clavo'.

** Insercin de texto **
Este comando inserta o agrega texto a cada lnea que procesa sed. El texto debe estar localizado
en las siguientes lineas que proceden despus del caracter '\'. Su sintaxis es la siguiente:

i \ y a\
[ texto a agregar ]

Ejemplo:
sed 'i \
.' oraciones.txt Agrega un punto final a cada linea de oraciones.txt
sed 'a \
' doble.txt Agrega un salto de linea al final de cada linea de doble.txt

** Guardar la entrada filtrada en un archivo **


Este comando permite salvar la entrada filtrada en otro archivo. Su sintaxis es la siguiente:
/patron/w archivo

Ejemplo:
sed '/pat/w patos.txt
/pat/!w otros.txt animales.txt
Guarda las lineas que concuerden con 'pat' en un archivo llamado patos.txt y los que no
concuerden en el archivo otros.txt
sed 's/UNIX/UNIX(TM)/gw u.out' libros.txt > salida.out

Almacena toda la salida en el archivo salida.out, pero las lneas que fueron modificadas, se
almacenan en u.out

12

Funciones
** Etiqueta **
Permite identificar una etiqueta label, si se realiza un cambio en la lnea actual. Esta es
especificada por ':' y seguida del nombre de la etiqueta. Su sintaxis es como sigue:

: label

** Grupo **
Indica un grupo de comandos, que inicia con un carcter '{' y termina con un '}'.

** Lectura de archivos **
Con el comando r, lee un archivo y agrega todo su contenido al final de cada lnea de entrada de
sed. Su sintaxis es:

nr archivo, donde n es el nmero de lnea donde pegar el texto de archivo.

** Listar lnea **
El comando es l y su funcin es hacer visibles todos los caracteres no imprimibles de cada lnea de
entrada.

** Linea actual **
Se puede imprimir el nmero de la lnea actual, si se agrega el comando '='. Su sintaxis es:
/patron/=

** Salto **

Permite saltar o ir a la lnea donde se encuentra una etiqueta label definida y continuar la ejecucin
de sed desde ese comando. Su sintaxis es:

b label

Conclusin sobre los usos de sed

En realidad sed tiene bastante utilidad como la comprobacin de condiciones, creacin de ciclos y
ramificaciones, retencin de lneas precedentes y muchos de los comandos de ed. Su uso es
similar al que se ha descrito en este manual, comandos sencillos de edicin y no tanto de
secuencias largas o complejas.

13

Sed es adecuado para manejar entradas arbitrariamente grandes de forma rpida, pero ofrece una
forma bastante reducida de memoria, puesto que al filtrar una siguiente lnea, ya no recuerda la
anterior, por lo que no se puede regresar a filtrar la anterior y tampoco proporciona recursos para
manipular nmeros. Solo es un editor de texto.

GREP

grep es una utilidad de la lnea de comandos escrita originalmente para ser usada con el sistema
operativo Unix. Usualmente, grep toma una expresin regular de la lnea de comandos, lee la
entrada estndar o una lista de archivos, e imprime las lneas que contengan coincidencias para la
expresin regular.
Su nombre deriva de un comando en el editor de texto ed que tiene la siguiente forma:
g/re/p

y significa hacer una bsqueda global para las lneas que encajen con la expresin regular
(regular expression en ingls), e imprimirlas. Hay varios argumentos que se pueden usar con grep
para modificar el comportamiento por defecto.

Existen otros retroacrnimos (incorrectos) para el nombre, entre ellos: General Regular Expression
Parser (analizador general de expresiones regulares), General Regular Expression Print (imprimir
expresin regular general), y Global Regular Expression Print (imprimir expresin regular global),
ste ltimo no tan lejano de la realidad.

Uso:
Cdigo:
grep [opciones] [expresin regular] [archivo]

Grep generalmente ejecuta alguna variante del algoritmo Boyer-Moore (para bsqueda de strings),
utilizando expresiones regulares para definir la consulta. Puede manejar archivos, directorios (y
subdirectorios), o la entrada estndar (stdin).
El programa es configurable por medio de opciones de invocacin, pudiendo (por ejemplo) mostrar
las lneas con aciertos, desaciertos, el contexto de la coincidencia, etc.
Parmetros comunes:

-nm

Las

lneas

concordantes

se

mostrarn

acompaadas

de

nm

lneas

anteriores y posteriores. Sin embargo, grep nunca mostrar cualquier lnea dada ms
de una vez.

14

-A nm , --after-context=NM Muestra nm lneas de contexto despus de las que


concuerden con el patrn.

-B nm , --before-context=NM Muestra nm lneas de contexto antes de las que


concuerden con el patrn.

-C, --context Equivalente a -2.

-V, --version Muestra el nmero de versin de grep en la

salida

estndar

de

errores. Este nmero de versin debera incluirse en todos los informes de fallos (vea
ms abajo).

-b, --byte-offset Muestra el desplazamiento en bytes desde el principio del fichero de


entrada antes de cada lnea de salida.

-c, --count Suprime la salida normal; en su lugar muestra el nmero de lneas


que concuerdan con el patrn para cada fichero de entrada. Con la opcin -v, -revert-match (vea ms abajo), muestra el nmero de lneas que no concuerden.

-E

patrn,--regexp=PATRN

Emplea

patrn

como

el

patrn;

til

para proteger patrones que comiencen con -.

-f fichero,--file=FICHERO Obtiene el patrn de fichero.

-h, --no-filename Suprime la impresin de los nombres de ficheros antes de las lneas
concordantes en la salida, cuando se busca en varios ficheros.

-i, --ignore-case No hace caso de si las letras son maysculas o minsculas ni en el patrn
ni en los ficheros de entrada.

-L, --files-without-match Suprime la salida normal; en su lugar muestra el nombre de cada


fichero de entrada donde no se encuentre ninguna concordancia y por lo tanto de cada
fichero que no producira ninguna salida. La bsqueda se detendr al llegar a la primera
concordancia.

-l, --files-with-matches Suprime la salida normal; en su lugar muestra el nombre de cada


fichero de entrada que producira alguna salida. La bsqueda se detendr en la primera
concordancia.

-n, --line-number Prefija cada lnea de salida con el nmero de lnea de su fichero de
entrada correspondiente.

-q, --quiet Silencioso; suprime la salida normal. La bsqueda finaliza en la primera


concordancia.

-s, --silent Suprime los mensajes de error sobre ficheros que no existen o no se pueden
leer.

-v, --revert-match Invierte el sentido de la concordancia, para seleccionar las lneas


donde no las hay.

-w, --word-regexp Selecciona solamente aquellas lneas que contienen concordancias que
forman palabras completas. La comprobacin consiste en que la cadena de caracteres

15

concordante debe estar al principio de la lnea o precedida por un carcter que no forme
parte de una palabra. De forma similar, debe estar o al final de la lnea o ser seguida por
un carcter no constituyente de palabra. Los caracteres que se consideran como parte
de palabras son letras, dgitos y el subrayado.

-x, --line-regexp Selecciona solamente aquellas concordancias que constan de toda la


lnea.

-y

-U, --binary Trata el(los) fichero(s) como binario(s). De forma predetermi- nada, bajo MS-

Sinnimo obsoleto de -i.

DOS y MS-Windows, grep intenta adivinar el tipo del fichero mirando los contenidos de
los primeros 32 kB ledos de l. Si grep decide que el fichero es de texto, quita los caracteres CR (retorno de carro) de los contenidos originales del fichero (para que las
expresiones regulares con ^ y $

funcionen correctamente). Al especificar -U

deshabilitamos este intento de adivinacin del tipo del fichero, haciendo que todos
se lean y pasen al mecanismo de concordancia tal cuales; si el fichero lo es de texto y
tiene al final de cada lnea el par de caracteres CR/LF, esto har que algunas expresiones
regulares fallen. Esta opcin slo tiene sentido en MS-DOS y MS-Windows.

-u, --unix-byte-offsets Informa de desplazamientos de bytes al estilo de Unix. Esta


opcin hace que grep muestre los desplazamientos de bytes como si el fichero fuera de
texto al estilo de Unix; o sea, sin los caracteres CR al final de cada lnea. Esto producir
resultados idnticos a ejecutar grep en un sistema Unix. Esta opcin no tiene efecto a
menos que se d tambin la opcin -b; slo tiene sentido en MS-DOS y MS-Windows.

-o, --only-matching Muestra slo la cadena buscada por el PATRON

Ejemplos:
Para mostrar todas las lneas que contienen la cadena tal en una lista de archivos (donde *
representa todos los archivos en el directorio actual):
Cdigo:
grep tal *

Para mostrar todas las lneas que no contengan la cadena tal, se usa -v:
Cdigo:
grep -v tal *

Para mostrar slo el nombre de tales archivos, se usa -l:

Cdigo:
grep -l tal *

16

Para mostrar slo el nombre de los archivos que no contienen la cadena, se usa -L:

Cdigo:
grep -L tal *

Para buscar recursivamente, no slo en los archivos del directorio actual sino tambin en los de
sus subdirectorios (donde "." representa el directorio actual), se usa -r:

Cdigo:

grep -r tal .

La

opcin

-r

puede

no

estar

disponible

en

todas

las

plataformas

Unix.

Para buscar todas las lneas que comienzan por Ahora y terminan con siempre seguido de
una cantidad arbitraria de espacio en blanco (ntese que el carcter ^ representa el inicio de la
lnea, as como $ representa el final):

Cdigo:
grep '^Ahora.*siempre *$'

Para hacer que grep lea de la entrada estndar, no se especifica archivo alguno. Por ejemplo,
como ps -ef lista todos los procesos actualmente en ejecucin, el siguiente comando imprime todos
los procesos que est ejecutando el usuario actual:

Cdigo:
ps -ef | grep $USER

o
Cdigo:
ps -efa | grep $USER

QU ES UNA EXPRESIN REGULAR?

Si le digo que una expresin regular es un metalenguaje para expresar el conjunto de palabras
aceptadas por los autmatas finitos, a menos que haya estudiado teora de autmatas puede que
no le diga mucho, pero si le digo que con una expresin regular puede encontrar todas las

17

direcciones de email que hay en un texto cualquiera de forma automtica puede que le empiece a
interesar.
Como definicin prctica podramos decir que una expresin regular es un buscador de patrones,
esto es, para cualquier patrn que defina (recuerde el ejemplo del email) la expresin regular
buscar todas las coincidencias.
Como puntualizacin habra que aadir que las expresiones regulares buscarn coincidencias por
lneas, esto es que la coincidencia de un patrn en el texto tiene que encontrarse en su totalidad en
la misma lnea.

Ej:
grep 'hola que tal' archivo
Buscar todos los 'hola que tal' (sin comillas) que aparezcan en el texto en la misma lnea, esto es:

Encontrar:
hola que tal ests hoy
Pero no encontrar:

hola
que tal ests hoy
2. Expresiones regulares

2.1. 'carcter'
La expresin regular ms sencilla que se puede crear es la compuesta por un carcter o por un
conjunto de carcteres (palabra).
Ej:
grep

'hola'

grep

'a'

archivo
archivo

Busca

'hola'

Busca

'a'

en
en

archivo
archivo

grep 'bienvenido al tutorial' archivo # Busca 'bienvenido al tutorial' en archivo

2.2. Barra invertida


En las expresiones regulares, las barras invertidas "\" normalmente quitan el significado especial de
algn carcter, aunque algunas veces se lo den, esto puede ser un poco complicado al principio
pero se acabar acostumbrando. Como norma general, cualquier carcter con un significado
especial que vea en este tutorial estar en la forma en la que tenga el significado especial, para
quitarle ese significado no tiene ms que quitarle la barra si la tiene o ponrsela si no la tiene.

Normalmente a los carcteres precedidos por barra invertida y que sin ella tendran significado
especial, se llaman escapados.

18

2.3. Punto
El carcter punto "." se sustituye en una expresin regular por cualquier carcter, excepto nueva
lnea.
Ejemplos:

echo 'a b' | grep -o '.'

grep encontrar como coincidencias: "a" y "b"

echo 'a b . ;' | grep -o '.'

grep encontrar como coincidencias: "a", "b", "." y ";".

echo 'a b . ;' | grep -o '\.'

grep slo encontrar como coincidencia: ".", ya que al escapar el patrn ha hecho que este pierda
su significado de cualquier carcter, a tener el significado de: el carcter punto.

quien=tu
echo 'en un'"$quien"' mi' | grep -o '..'

grep encontrar como coincidencias: "en", "un", "tu" y "mi"

echo ';:a una ala uno' | grep -o '..a'

grep encontrar como coincidencias: ";:a", "una", "ala", pero no "uno" ya que no coincide con el
patrn cualquier palabra de tres carcteres siendo el ltimo la "a"
Ntese que con palabra nos referimos a cualquier concatenacin de carcteres

echo 'vuela miedo fuera' | grep -o '..e.a'

grep encontrar como coincidencias: "vuela", "fuera", pero no "miedo" ya que aunque cumple la
parte del patrn "..e." no cumple lo de acabar en a.

echo 'Este tutorial de grep me gusta mucho' | grep -o '.e'

Al contrario de lo que se podra esperar no slo ha encontrado las coincidencias: "de" y "me".
El resultado es cuando menos extrao, si se ha usado la opcin -o como en este ejemplo se

19

obtendrn trozos de palabra, en concreto los trozos que concuerdan con el patrn, sin la opcin -o
y con el coloreado de grep activado se observar mejor y se podrn inferir las razones.

Lo que ha ocurrido ha sido porque la expresin regular buscaba patrones que coincidieran con ".e"
incluidos los que estuviesen dentro de otras palabras, entonces cmo buscamos nicamente por
las palabras que coincidan con ".e"?
Una posible solucin sera aadir espacios a los dos lados del patrn:

echo 'Este tutorial de grep me gusta mucho' | grep -o ' .e '

Esto solucionara el problema con esta cadena de texto, pero y si una de las palabras que
queremos encontrar con el patrn estn al principio o al final de la lnea?, en ese caso los espacios
seran un problema ya que pueden faltar. La solucin est en usar otro de los meta-caracteres de
las expresiones regulares: \<\>

2.4. \<\>
El metacarcter \<\> hace que todos los patrones dentro de l slo coincidan con palabras enteras,
esto es, palabras separadas entre s por espacios. Para este metacarcter los smbolos de
puntuacin (.,< etc...) no forman parte de la palabra.

echo 'Este tutorial de grep me gusta mucho' | grep -o '\<..\>'

grep encontrar como coincidencias: "de" y "me", ya que son las nicas palabras enteras que
coinciden con el patrn.

echo 'Ya hemos aprendido algunas cosas' | grep -o '\<....s\>'

grep encontrar como coincidencias: "hemos" y "cosas"

echo 'Ya hemos aprendido algunas cosas' | grep '\<.a\>'

grep encontrar como coincidencia: "Ya", sin embargo si no hubisemos puesto \<\> entonces el
patrn habra coincidido tambin con: " a", "na", "sa". La coincidencia con " a" es debida a que
como se explic antes, el punto es sustituido por cualquier carcter exceptuando nueva lnea.

echo '<>' | grep '<..'

grep encontrar como coincidencia: "<echo '<>' | grep '\<..'

20

grep encontrar como coincidencias: "Ya", "he", "ap", "al", "co", esto es, el principio de cada
palabra que encaje con el patrn. Por lo tanto \> har lo contrario. Vemoslo en un ejemplo.

echo '<>' | grep '..\>'

grep encontrar como coincidencias: "Ya", "os", "do", "as", "as", o lo que es lo mismo el final de las
palabras que encajan con el patrn.

2.5. * (Repitiendo patrones)


Todos los metacarcteres anteriores estn muy bien si sabe exctamente cuntos carcteres tiene
la palabra que quiere buscar, pero qu ocurre si no lo sabe?, pues que habr que usar el
metacarcter *, * repetir el patrn que le precede cero o ms veces.

echo '4 44 444 444 4444 44444' | grep '4*'

grep encontrar como coincidencias todos y cada uno de los nmeros que contengan cuatros.

echo '4 454 4554554 455545554 4555455545554 44444' | grep '4*'

grep encontrar como coincidencias todos y cada uno de los nmeros que contengan cuatros.

echo '4 454 4554554 455545554 4555455545554 44444' | grep '.*'

grep encontrar como coincidencias todos, ya que el punto se traduce como cualquier carcter y *
(repetido cero o ms veces).

echo '.* 44 58.* hhial' | grep '\.\*'

grep encontrar como coincidencias: ".*" debido a que los carcteres estn escapados.

echo '4 454 4554554 455545554 4555455545554 44444' | grep '\<4*\>'

grep encontrar como coincidencias slo los nmeros que contengan nicamente cuatros.
Pero hay que tener cuidado con *, ya que como dice la definicin "repetir el patrn que le precede
cero o ms veces."

Todava no ve el peligro?, vemoslo con un ejemplo.

21

echo -e "Lnea sin comentario\n#Lnea con comentario\nLnea sin comentario" | grep '#*'
echo -e interpreta "\n" como nueva lnea, es decir, sera como escribir la frase hasta "\n" darle al
retorno de carro (enter, nueva lnea) continuar escribiendo y repetir lo anterior

Con ste patrn debera encontrar las lneas que tengan algn comentario, o no? Como poda
esperar tras toda la preparacin anterior: no, pero lo importante es el por qu; esto ha ocurrido
porque como se mencion anteriormente * repeta el patrn anterior cero o ms veces, o lo que es
lo mismo, se buscaran todas las lneas tuvieran o no #.

Para solucionar este problema no habra ms que aadir otro # antes del que precede al *:
echo -e "Lnea sin comentario\n#Lnea con comentario\nLnea sin comentario" | grep '##*'
esto buscar todas las lneas que tengan uno o ms # debido a que el metacarcter slo se aplica
al patrn que le precede, esto es, el segundo #.

2.6. Rango de carcteres []


Gracias al metacarcter [], se pueden elegir diferentes carcteres a los cules aplicarles algn otro
patrn de sustitucin.

echo '5895 589435 539853 54849' | grep -o '[0123456789]*'

grep encontrara como coincidencias a todos los conjuntos numricos, ya que es lo que le hemos
indicado con el conjunto de carcteres encerrados entre corchetes.

echo 'hola hhaif aieo uuieo' | grep -o '\<[aeiou]*\>'

grep encontrara como coincidencias a todos los grupos de vocales: "aieo", "uuieo"

En estos casos tambin se pueden indicar rangos, por ejemplo, para que coincida con cualquier
nmero se puede poner de la siguiente manera: [0-9], ntese que se empieza en cero; para indicar
cualquier letra (del abecedario ingls) minscula se puede hacer [a-z], y maysculas: [A-Z],
tambin se pueden combinar: [a-zA-Z] coincidira con cualquier letra, mayscula o minscula.

echo 'hola hhaif AiEo uu66ieo' | grep -o '\<[A-Za-z]*\>'

grep encontrara como coincidencias todas las palabras que slo contengan letras alfabticas
(inglesas).

echo 'hola hhAIf AiEo uu66ieo' | grep -o '\<[AIa-z]*\>'

22

grep encontrara como coincidencias todas las palabras que slo contengan letras alfabticas
minsculas (cualquiera) y las letras maysculas A e I.

Al utilizarse el guin para indicar rangos, si queremos usarlo como carcter en el grupo debemos
ponerlo al principio o al final, y cualquier metacarcter debe ir escapado.

echo 'hola hh-AIf A-iEo u.u66ieo' | grep '[AIa-z\.-]*'

grep encontrara como coincidencias todas las palabras o subpalabras que slo contengan letras
alfabticas minsculas (cualquiera) y A e I, adems de los smbolos "." y "-".

echo 'hola hh-AIf A-iEo u.u66ieo' | grep -o '\<[AIa-z\.-]*\>'

En este caso, con la idea de que coincida cualquier palabra que contenga el conjunto antes
mencionado, se ha usado el metacarcter \<\>, pero el resultado no ha sido el esperado, y su
explicacin es que el metacarcter anterior sirve para coincidir con palabras que no contengan
smbolos de puntuacin o guiones.
Cabe destacar que existen conjuntos de carcteres POSIX definidos para aadir portabilidad, son
los siguientes:
[:alnum:]

Alfanumricos

[:alpha:]

Carcteres

alfabticos

[:upper:]

Carcteres

en

mayscula

[:lower:]

Carcteres

en

minscula

[:digit:]

Dgitos

[:print:] Carcteres imprimibles

Hay algunos ms, pero estos son los ms importantes. Ahora reescribiremos algunos ejemplos
anteriores usando estos conjuntos POSIX:

echo '5895 589435 539853 54849' | grep -o '[[:digit:]]*'


Ntese el uso del doble corchete.

echo 'hola hhaif AiEo uu66ieo' | grep -o '\<[[:alpha:]]*\>'

grep encontrara como coincidencias todas las palabras que slo contengan letras alfabticas
(inglesas).

23

Tambin se puede elegir el complementario de un conjunto, esto es, los carcteres que no estn
en el conjunto. Esto lo haremos con [^conjunto].

echo 'hola 6g hhaif 5345235 AiEo 66' | grep -o '\<[^[:alpha:]]*\>'

grep encontrar como coincidencias todas las palabras que no contengan letras alfabticas
(inglesas).

echo 'hola hh-AIf EEE5 A-iEo u.u66ieo' | grep -o '\<[^AIh-z]*\>'

grep encontrar como coincidencias todas las palabras que no contengan letras A, I, de h a z.

2.7. Parntesis \(\)


El metacarcter parntesis sirve para seleccionar un patrn al que le aplicaremos un metacarcter
modificador, por ejemplo *; tiene adems un par de carctersticas bastante interesantes que
veremos ms adelante.

echo 'holaholaholahola holahola adios' | grep -o '\(hola\)*'

grep encontrara como coincidencias todas las palabras que contengan repeticiones de la palabra

hola
echo 'holahelloholahola holahola adios' | grep -o '\<\(hola\)*\>'

grep encontrara como coincidencias todas las palabras que contengan nicamente repeticiones de
la palabra hola

Una de las caractersticas interesantes del parntesis que se mencion anteriormente es la de


recordar una coincidencia, esto es, el patrn guardar en un registro numrico (del 1 al 9), cada
coincidencia que haya coincidido con un patrn que se encuentre entre parntesis. Siendo \1 la
primera coincidencia recordada, \2 la siguiente, y as hasta el \9.

echo '6hola6 5hola4 4adios9 7adios7' | grep -o '\<\([0-9]\)[[:alpha:]]*\1\>'

grep encontrar como coincidencias cualquier palabra que empiece con un nmero y acabe con el
mismo nmero y entre los nmeros tenga letras.

echo 'NaN LOL Wow TypeT' | grep -o '\<\([[:upper:]]\)[[:alpha:]]*\1\>'

24

grep encontrar como coincidencias cualquier palabra que empiece con una letra mayscula y
acabe con la misma letra y entre las letras maysculas tenga letras.

echo '0990 5785 5775 6996 ' | grep -o '\([[:digit:]]\)\([[:digit:]]\)\2\1'

grep encontrar como coincidencias cualquier nmero capica de cuatro cifras.

La otra caracterstica interesante es la de poder elegir entre dos patrones distintos usando \| entre
los dos patrones:

echo 'ftp://asdfasf.com http://asfasdf.com' | grep -o '\(ftp\|http\)://[a-z]*\.com'

grep encontrar como coincidencias cualquier palabra que empiece con ftp o http y que contine
con un conjunto de letras minsculas y acabe en .com

echo 'ftp://ulises.hostalia.com/debian http://ftp.es.debian.org/debian/' | grep -o '\(ftp\|http\)://[a-z\.-\/]*'

grep encontrar como coincidencias cualquier palabra que empiece con ftp o http y que contine
con un conjunto de letras minsculas, puntos, y guiones.

echo 'Yes No S No' | grep -o '\(S\|Yes\)'

grep encontrar como coincidencias: "S" y "Yes".

echo '6hola6 9hola9 5jaja4 5haha5' | grep '\(6\|9\)[[:alpha:]]*\1'

grep encontrar como coincidencias cualquier palabra que empiece con 6 o 9 y que acabe con el
mismo nmero, con letras en medio.

2.8. Eligiendo el nmero de repeticiones \{\}


Con los metacarcteres \{\}, poniendo un nmero o dos entre las llaves se puede elegir el nmero
de veces que queremos que se repita un patrn.

echo '555 555555 555555 5555555 55 5555' | grep -o '\<5\{6\}\>'

grep encontrara las palabras formadas por exactamente seis cincos.

echo '555 555555 555555 5555555 55 5555' | grep '\<5\{3,6\}\>'

25

grep encontrar las palabras formadas por entre tres y seis cincos.

Tambin las podemos mezclar con otros metacarcteres


echo '555 asd#lha sdf 55hi5 555aASasd55 55 5555' | grep -o '.\{4,11\}'

grep encontrar como coincidencias cualquier palabra con entre 4 y 11 carcteres, el resultado
puede parecer raro, pero la explicacin es sencilla: el metacarcter "." significa cualquier carcter,
incluido el espacio, y grep tiende a buscar la palabra ms grande que se adapte al patrn.

As que para conseguir el efecto deseado:


echo '555 asd#lha sdf 55hi5 555aASasd55 55 5555' | grep o '[[:alnum:]#]\{4,11\}'

Por si lo estaba pensando, con \<\> y el punto tampoco conseguira el resultado que se buscaba,
ya que el punto seguira significando cualquier carcter incluido el espacio, comprubelo usted
mismo.

echo

'http://www.esdebian.org/que-haces

https://encrypted.google.com/'

grep

-o

'https\{0,1\}[[:alnum:]:\/_-.]*'

Como habr podido comprobar el metacarcter \{\} slo afecta al elemento ms cercano a l,
entonces, cmo aplicarselo a un grupo?. Fcil con \(\).

echo

'http://www.esdebian.org/que-haces

www.esdebian.org/que-haces'

grep

-o

'\(http://\)\{0,1\}[[:alnum:]\/_-.]*'

2.9. ^ $
Los ltimos metacarcteres de este tutorial son ^ y $, estos dos metacarcteres sirven para buscar
coincidencias al principio y al final de una lnea respectivamente.

echo 'hola hola hola' | grep '^hola'

grep slo coincidir con el primer hola, debido a que es el que est al principio de la lnea.

echo 'adios adios adios' | grep 'adios$'

grep slo coincidir con el ltimo adios, debido a que es el que est al final de la lnea.

26

echo -e "Este es el final del tutorial,\nesperamos que lo haya disfrutado y haya aprendido mucho
sobre las expresiones regulares.\nesDebian" | grep '^[[:alpha:]]*$'

TAIL

tail (que significa cola en ingls) es un programa de los sistemas tipo Unix, que muestra las ltimas
lneas de uno o ms archivos de texto.

tail imprimir por defecto a la salida estndar las ltimas diez lneas de sus datos de entrada. Tanto
las unidades de impresin (lneas, bloques, bytes) como su nmero pueden alterarse con opciones
de la lnea de comandos:

-n nmero: imprime el nmero indicado de lneas.

-c nmero: imprime el nmero indicado de bytes.

Si el nmero indicado en las opciones va precedido por un signo +, tail imprimir desde la ensima
unidad hasta el final del archivo. Por ejemplo, el comando

tail -c +175 archivo

Imprimir el contenido de archivo comenzando en el byte 175.

Usando una sintaxis ms vieja (que an se usa en Sun Solaris en lugar de la opcin -n), las ltimas
20 lneas y los ltimos 20 bytes de archivo se mostraran, respectivamente, con los comandos:

tail -20 archivo


tail -20c archivo

Esta sintaxis, sin embargo, se considera obsoleta y no sigue el estndar POSIX 1003.1-2001. Aun
si las versiones actuales la admiten, podra no funcionar cuando se usa con otras opciones (como f, vase la siguiente seccin).

Seguimiento de archivos
tail tiene una opcin especial, -f (del ingls follow, seguir), que permite hacer seguimiento a un
archivo. En lugar de mostrar las ltimas lneas y terminar, tail mostrar las ltimas lneas y seguir
leyendo del archivo; conforme se le aadan nuevas lneas, tail las imprimir. Esta funcin es
particularmente til para archivos de registro.
Para cerrar tail cuando est haciendo seguimiento, basta interrumpirlo con Ctrl+C.

27

Monitorizacin de Recursos del Sistema


La mayora del tiempo de un sysadmin (administrador de sistemas) se la pasa monitoreando.
Especialmente si estas a cargo de muchos servidores necesitas herramientas que te hagan la
tarea mas fcil; a continuacin comparto con ustedes herramientas que uso diariamente que me
facilitan mi trabajo.

Monitoreo de ancho de banda


Esto es muy importante, ya que al monitorear cuanto ancho de banda consume un servidor en
tiempo real podemos determinar cuales son sus horas pico y as optimizarlo. Para monitorear esto
recomiendo el programa iptraf. Con este programa podrn monitorear todo lo que esta sucediendo
en nuestra interface de red. Les adjunto algunas imgenes:

28

Monitoreo de consumo de CPU y Memoria


Otra de las tareas de un sysadmin es monitorear el consumo de CPU y Memoria (RAM y SWAP),
linux viene con el comando top. A mi en lo personal no me gusta, as que uso el programa htop.
Este programa es muy completo ya que nos detalla el consumo de CPU y Memoria por proceso,
as como el consumo general de los recursos del sistema. Es mucho ms amigable a comparacin
del top normal. Incluso conforme se va usando el procesador o los ncleos del procesador el
programa lo indica de una manera grfica tal como lo muestra la siguiente imagen que tome de
un servidor en produccin:

Monitoreo de consumo de disco duro


Cada cierto tiempo es necesario que entremos a revisar cuando espacio en disco hay libre en los
servidores que manejamos. Para saber el espacio en disco duro se ejecuta el comando df en
linux. A m en lo personal no me gusta, prefiero uno ms amigable as que utilizo uno llamado
discus. Este programa es que te indica cuanto espacio esta usado y cuando espacio hay libre, as
como los porcentajes de los mismos. Aqu les adjunto una foto con la comparacin del df con el
discus.

Monitoreo del I/O


Para que quede claro que es el I/O.

En computacin, entrada/salida, tambin abreviado E/S o I/O (del original en ingls input/output),
es la coleccin de interfaces que usan las distintas unidades funcionales (subsistemas) de un
sistema de procesamiento de informacin para comunicarse unas con otras, o las seales
(informacin) enviadas a travs de esas interfaces. Las entradas son las seales recibidas por la
unidad, mientras que las salidas son las seales enviadas por sta.

29

En trminos mas amigables es la entrada y salida de datos, que en realidad significa actividad del
disco duro. Entre mas sea la actividad de READ (lectura) y WRITE (escritura) mas alto va a ser el
I/O y por consiguiente mas lento se pondr el servidor. Por eso es que para servidores que van a
servir sitios con mucho trafico, recomiendan discos duros SCSI o SAS por su alto rendimiento a
comparacin de otros discos duros (como por ejemplo IDE o SATA) por consiguiente su I/O va a
ser menor y va a poder servir data mucho mas rpido.
Para monitorear el I/O yo utilizo la herramienta iotop (se necesita python 2.5 y un kernel 2.6.20
para que funcione) es una interfaz simple que indica que proceso esta escribiendo o leyendo en el
disco duro, tal como lo muestra la siguiente imagen:

Monitoreo de peticiones de DNS


Si administras un servidor de DNS, en alguna ocasin vas a querer saber cuantas peticiones tu
servidor de DNS tu servidor recibe. Para monitorear esto utilizo el programa dnstop con este se
puede monitorear cuantas peticiones esta teniendo tu servidor ya sea por clase de dominio .net
.org, direcciones ip, por dominio o por sub dominios.

Para ejecutarlo solo ejecutas el comando:


dnstop eth1
Tienes que especificar la interface en la cual quieres que escuche el programa. Presionando los
botones de 1 2 3 4 puedes ver los diferentes tipos de reportes que tiene.
Adjunto imagen del programa:

30

Monitoreo de trfico WEB


La mayora de nosotros estamos a cargo de un servidor que sirve paginas web, es muy importante
el monitoreo en tiempo real para saber que archivos estamos sirviendo, cuantas peticiones por
segundo estamos manejando y el trafico que estamos teniendo (en megas). El servidor web mas
usado es apache, yo utilizo la herramienta llamada apachetop.

Con este programa podemos monitorear que archivos servimos con mayor frecuencia, cuantos
bytes/kylobytes/megabytes servimos, cuantas peticiones por segundo, peticiones totales y un
promedio general de todo lo que sirve el apache.

Adjunto una imagen del apachetop corriendo en un servidor en produccin:

Monitoreo de puertos abiertos


Otra de las tareas de un sysadmin es estar al tanto de que puertos hay abiertos en un servidor.
Como lo dice la regla, si un servicio no te sirve, quitalo del sistema. Para monitorear puertos uso la
herramienta llamada nmap.

31

Con el comando:
nmap -v 127.0.0.1
Saque un listado de puertos abiertos en el servidor. Si su servidor tiene varias direcciones IP es
importante que hagan un escaneo de puertos a todos los IP.

Adjunto imagen del resultado que muestra nmap:

GESTIN DE GRUPOS Y USUARIO

1.1 Gestin de Usuarios


Una vez comprendida cmo cambiar los permisos a los usuarios del sistema, es necesario
complementarlo con la gestin de dichos usuarios.

Un administrador de sistemas necesitar crear, modificar, eliminar y gestionar usuarios y


grupos de usuarios a nivel global.

En Linux existe un archivo editable que contiene TODA la informacin acerca de los
usuarios creados en nuestro sistema. Lgicamente, su configuracin se encontrar en el
directorio de configuraciones: /etc
El archivo en cuestin se llama passwd y se localiza en /etc/passwd.
Gran parte de la seguridad de un sistema Linux, viene por el buen uso del archivo
/etc/passwd, ya que es objetivo primario para muchos ataques de crackers. (crackers !=
hackers).
En este archivo, existe una lnea que contiene toda la informacin propia por cada usuario
existente en la mquina, con una sintxis parecida a esta:

nombre:clave_encriptada:UID:GID:GECOS:directorio_inicial:intrprete

Ej.: alain:x:1000:1000:Alain Fernandez,,,:/home/alain:/bin/bash

32

Cada campo est separado por :. El campo nombre indica el alias con el que se loguea
el usuario en el sistema. Seguidamente est la clave encriptada aunque lo que todos
encontraris seguramente es una x.
Despus nos encontramos con el UID y GID, el primero es el identificador de usuario para
el sistema y el segundo el identificador de grupo primario al que el usuario pertenece,
puesto que un usuario puede pertenecer a muchos grupos.

GECOS es un campo opcional para guardar informacin. Normalmente contiene el nombre


completo del usuario. GECOS significa General Electric Comprehensive Operating System.
En este campo podemos poner lo que queramos ya que el sistema no lo usa para ninguna
gestin. Se puede omitir sin poner entre los : nada, quedando ::.

Posteriormente aparece el directorio inicial es donde empezar el usuario una vez


logueado, y seguidamente el interprete de comandos usar (bash, sh, tcsh).
Si en el campo intrprete encontramos /sbin/nologin es un usuario que no puede
loguearse, esto tiene sentido ya que el propio sistema tiene usuarios con privilegios para
dar servicios al sistema como pueden ser bin, daemon, adm
El usuario root siempre tiene como UID y como GID un 0, y cualquier usuario que lo tenga
tendr los mismos privilegios que l. Hay que recordar que un usuario slo puede tener un
UID, pero varios usuarios pueden tener el mismo UID.

PELIGRO: Algo totalmente desaconsejable, debido a que puede provocar agujeros de


seguridad importantes, es tener algn usuario con UID=0 distinto al root. Si esto ocurre, lo
ms seguro es que hayas sido atacado.

Normalmente el sistema guarda los UID bajos (por ejemplo por debajo de 500 o por debajo
de 1000) para los usuarios del propio sistema, los que necesita para los servicios que
ofrece (por ejemplo, si tienes un servidor de ftp lo normal es tener un usuario en el sistema
que se llame ftp), y los UID altos se utilizan para los usuarios normales.

PELIGRO: Si donde debiera aparecer la clave aparece ::, esto indica que no hay clave,
y por supuesto, no es nada bueno. Si aparece una x es que las claves o la clave de ese
usuario estn gestionadas en el archivo /etc/shadow ya que la mayora de los sistemas
usan claves en sombra.

33

Esto es debido a que /etc/passwd debe ser visible a todos, porque si no ciertos comandos
como puede ser ls dejaran de funcionar, y aunque la clave est encriptada no es bueno
que se encuentre a la vista por la existencia de programas de fuerza bruta que se dedican
a desencriptarlas (el famoso jhon deriper por ejemplo), y cualquier usuario con acceso a
nuestro sistema tendra las claves usando dichos programas.

En vez de esto se usa el fichero /etc/shadow, que slo es visible por root.
No es aconsejable jugar con esta informacin editanto y retocando directamente dichos
archivos. Para ello existen distintas herramientas que nos ayudarn a gestionar los
usuarios y grupos.

1.2 Aadiendo usuarios

Utilizaremos el comando adduser o useradd, desde nuestro interprete de comandos y


siendo administrador, root, para aadir usuarios.

Normalmente bastar con la orden adduser nombre_usuario para crear nuevos usuarios,
aunque su sintxis completa ser:
addusr [-c comentario] [-d home] [-e fecha] [-f dias] [-g grupo] [-G lista de grupos] [-m
[-k template] | -M] [-n] [-o] [-p passwd] [-r][-s shell] [-u uid] usuario
Podremos ahorrarnos muchas de las opciones, ya que, si no indicamos nada el home del
usuario se crear por defecto en /home/nombre_del_usuario, con la estructura del
/etc/skel.

Este, ser un usuario indefinido y no se bloquear por no usarse, tendr la shell por
defecto (normalmente bash), se le asignar un uid automaticamente y se crear un grupo
con el mismo nombre.
Normalmente usaremos la forma sencilla:
[debian:/home/alain]#

adduser

Adding

user

Adding
Adding
Creating
Copying

new
new

`pepito

group

user
home

pepito

`pepito

`pepito

(1001)
directory

files

from

Enter new UNIX password:

34

with

(1001)

group

`pepito

`/home/pepito

`/etc/skel

Si preferimos personalizar o forzar algn campo, utilizaremos la sintxis completa:


addusr [-c comentario] [-d home] [-e fecha] [-f dias] [-g grupo] [-G lista de grupos] [-m
[-k template] | -M] [-n] [-o] [-p passwd] [-r][-s shell] [-u uid] usuario

Donde:

[-c comentario]: Pondremos el comentario que queremos en el campo GECOS.

[-d home]: Directorio home (el de inicio) de la cuenta.

[-e fecha]: fecha en formato ao-mes-da en que la cuenta caduca y se bloquea.

[-f dias]: Nmero de das en los que la cuenta se bloquear si no se usa.

[-g grupo]: Nombre del grupo primario. Ojo el grupo debe ya existir.

[-G lista de grupos]: Listado de grupos al que el usuario pertenecer.

[-m [-k template] | -M] -m: Crea el directorio home de la cuenta si es que no existe ya. Con
-k usa el directorio template para crear el directorio home o sea que copia lo de template al
home, en caso contrario se copia /etc/skel. Si en vez de -m ponemos -M el directorio no es
creado.

[-n]: Aade un grupo con el mismo nombre que el usuario

[-o]: Permite crear usuarios con uid duplicada.

[-p passwd]: Aade el password al usuario.

[-r]: Se usa para crear un usuario del sistema.

[-s shell]: Indica que shell

[-u uid]: Indicamos que uid queremos.


Para saber ms

35

[alain@debian]$ man adduser


NOTA: Podemos modificar la estructura del /home del usuario, modificando el /etc/skell
del sistema.

1.3 Modificando usuarios


Como comentamos anteriormente, existen herramientas para evitar modificar el archivo
/etc/passwd a mano. El comando usermod nos permitir hacer estos cambios de esta
manera:

usermod [-c comentario] [-d home] [-e fecha] [-f dias] [-g grupo] [-G lista de grupos] [m] [-n] [-p passwd] [-s shell] [-u uid [-o] ] usuario [-L | -U] usuario

El significado de los parmetros es el mismo que en el anterior comando, as que no


necesitan explicacin, salvo dos nuevos:
-L

Bloquea

la

cuenta

de

usuario.
-U La desbloquea.

Cambiaremos por ejemplo una contrasea as:

[debian:/home/alain]# usermod -p nueva_clave pepito

Y bloquearemos la cuenta de pepito de estemodo:

[debian:/home/alain]# usermod -L pepito

Para saber ms

[alain@debian]$ oman usermod

NOTA: Un usuario puede cambiarse su propia contrasea utilizando la orden passwd. No


hace falta molestar al administrador del sistema para esto.

36

[alain@debian]$
Changing

passwd
password

for

alain

(current) UNIX password:


1.4 Eliminando usuarios:

Lleg el momento de eliminar usuarios que ya no pintan nada ennuestro sistema. Ya es


sabido por todos que es mucho ms fcil destruir que crear. En este caso bastar con
aplicar el comando deluser o userdel.

[debian:/home/alain]# deluser -R pepito

Con la opcin -R eliminar el directorio home del usuario; sin esta opcin se limitar a
eliminar nicamente la cuenta de usuario, dejando el home intacto.

[alain@debian]$ man deluser


1.5 Aadiendo nuevos grupos:

Ahora toca administrar los grupos de usuarios. Cada usuario pertenece como mnimo a un
grupo, (su grupo principal de usuario), aunque podr pertenecer a varios grupos ms.
Existen ciertos grupos del sistema, tales como grupo root, grupo bin y por lo general,
salvo raras excepciones, los usuarios nunca deben pertenecer a ninguno de esos grupos.

Para los grupos existe igualmente un archivo de configuracin /etc/group, al que por
supuesto debemos proteger y cuidar como hacemos con /etc/passwd.
El fichero de shadow para los grupos es /etc/gshadow, e igual que en los usuarios slo
es accesible por el root.
El formato de /etc/group es el siguiente:

nombre_grupo:clave:GID:lista de usuarios miembros

37

Aunque en el campo clave aparezca una x al igual que pasaba con /etc/passwd, no quiere
decir que cada grupo tenga una clave. Si miramos el archivo /etc/gshadow veremos que
casi todos los campos estn vacos, es decir, no existe ninguna clave.

Para aadir un grupo utilizaremos el comando addgroup o groupadd. Al igual que


anteriormente, existir el modo rpido y el modo personalizado.

Modo rpido:
[debian:/home/alain]# addgroup migrupo
Adding group `migrupo (GID 1002)
Hecho.

Modo personalizado:
groupadd [-g gid [-o]] [-r] [-f] [nombre del grupo]

Donde:
-g indica explcitamente el GID del grupo.
-o no obliga a que el identificador de grupo sea nico, cosa totalmente desaconsejable.
-r para crear un grupo del sistema.
-f hace que groupadd no de error si el grupo ya existe.

[alain@debian]$man groupadd
1.6 Modificando grupos:

Llegar el mometo de que surja la necesidad de modificar algn grupo existente.


Utilizaremos para ello el comando modgroup:

groupmod [-g gid [-o]] [-n group_name ] [nombre-del-grupo]


Vamos a cambiar el nombre del grupo tarde a grupo noche:

[debian:/home/alain]# groupmod -n tarde noche


groupadd noche

38

[alain@debian]$ man groupmod


1.7 Eliminando grupos:

Por ltimo, vamos a ver como se eliminan los grupos deusuarios que ya no necesitamos.
Utilizaremos para ello el comando groupdel o delgroup:
[debian:/home/alain]# groupdel noche
Para saber ms
[alain@debian]$ man groupdel
1.8 Cmo cambiar de propietario y grupo a nuestros ficheros:

Queda ahora conocer como hacer propietario de un archivo o directorio a un usuario, o


hacer que este fichero sea propiedad de un grupo.
Para ello existen los comandos chown y chgrp.
El primero cambia de propietario a un fichero existente de esta forma:
[chown] [usuario] [archivo]
Si por ejemplo tenemos un fichero llamado prueba.sh propiedad de alain:
[debian:/home/alain]#

ls

-l

|grep

prueba.sh

|grep

prueba.sh

-rw-rr 1 alain alain 2 2008-04-10 15:41 prueba.sh

y queremos que su propietario pase a ser root, haremos:


[debian:/home/alain]# chown root prueba.sh

Vemos el resultado
[debian:/home/alain]#

ls

-l

-rw-rr 1 root alain 2 2008-04-10 15:41 prueba.sh

Si queremos aplicar esto a directorios, simplemente aadiremos la opcin -R para que lo


haga de modo recursivo:
[chown] -R [usuario] [directorio]
Para saber ms
[alain@debian]$ man chown

Para cambiar de grupo a un fichero utilizaremos el comando chgrp de este modo:

39

[chgrp] [grupo] [archivo]


Si por ejemplo tenemos un fichero llamado prueba.sh perteneciente al grupo alain:
[debian:/home/alain]#

ls

-l

|grep

prueba.sh

|grep

prueba.sh

-rw-rr 1 root alain 2 2008-04-10 15:41 prueba.sh

y queremos que su grupo principal sea root, haremos:


[debian:/home/alain]# chgrp root prueba.sh

Vemos el resultado
[debian:/home/alain]#

ls

-l

-rw-rr 1 root root 2 2008-04-10 15:41 prueba.sh

Al igual que antes, aadiremos la opcin -R para que lo haga de modo recursivo:
[chgrp] -R [grupo] [directorio]
Para saber ms
[alain@debian]$ man chgrp

PERMISOS

1.1 Poltica de permisos en Linux

Linux es un sistema multiusuario, por lo que necesita de una poltica de permisos segura y
planificada para mantener el sistema seguro.
Un administrador de sistemas Linux debe prestar mucha atencin y planificar dicha poltica
de permisos para mantener su sistema seguro.
Podemos hacernos una primera idea de cmo se gestionan los permisos en Linux,
haciendo un ls -l desde nuestro intrprete de comandos:

40

[alain@debian]$

ls

-l

total

284

drwxr-xr-x

drwxr-xr-x

drwxr-xr-x

alain

drwxr-xr-x

alain

-rw-rr
drwxr-xr-x
drwx

alain

alain

root

alain
1
3

alain
alain

root

4096
4096

alain

2007-09-17

4096

alain

alain
alain

4096

15:48

Alain_LIVE
Beryl

15:05

15:07

2008-03-27
2008-04-07

2006r3

11:38

2007-12-14

2008-04-03

4096

17:38

2007-04-02

4096

16548

alain

2007-11-26

bin

CELIA-DSL.odt
14:03

15:02

COMOs
curso-ASL

-rw-rr 1 alain alain 9490 2008-04-07 13:44 Curso-ASOL.odt

Como vemos, cada lnea tiene un formato del estilo:

{T} {rwx} {rwx} {rwx} {N} {usuario} {grupo} {tamao} {fecha de creacin}{nombre}
1er campo T: Nos indica que tipo de archivo es:
- Si es un fichero normal
d Si es un directorio
c Especial de modo carcter (Dispositivo tty, impresora)
p Pipe
l Enlace simblico
2 Campo: {rwx}: Nos indica los permisos que tiene el propietario del archivo.
3 Campo {rwx}: Nos indica los permisos que tiene el grupo al que pertenece el archivo.
4 Campo {rwx}: Nos indica los permisos del resto de usuarios. (Otros)
5 Campo {N}: Es el nmero de archivos/directorios que contiene. Si es un fichero
aparecer 1, si se trata de un directorio aparecer como mnimo 2 (los directorios . y ..
ms los que contenga).
6 Campo {usuario}: Indica el nombre del usuario al que pertenece el archivo o directorio.
7 Campo {grupo}: Indica el nombre del grupo al que pertenece el archivo o directorio.
8 Campo {tamao}: Indica el tamao.
9 Campo {fecha}: Indica la fecha de creacin.
10 Campo {nombre}: Indica su nombre.
Los grupos de permisos se agrupan de 3 en 3: rwx, donde (r) significa permiso de lectura,
(w) permiso de escritura y (x) permisos de ejecucin.
Por lo tanto un fichero con esta apariencia:
rwx r-x
Significa que tendr permisos de lectura, escritura y ejecucin para el propietario, permisos
de lectura y ejecucin para el grupo, y ningn permiso para el resto.

41

PERMISOS SIGNIFICADO
rwx rwx rwx Permiso para todos (Muy poco seguro, para archivos sin importancia)
rwx r

Todos los permisos para el propietario y solo de lectura para el grupo.

r-x

Slo lectuta y ejecucin para el propietario.

Si nos fijamos en el directorio donde comentamos que estaban los binarios (ejecutables)
comunes para todos los usuarios del sistema, directorio /bin, y pedimos un listado con ls -l
observaremos que todos los binarios tienen una sintaxis como esta:

-rwxr-xr-x 1 root root 3518 2006-09-19 14:38 znew


Todos los binarios son propiedad del root, y el resto de usuarios (nosotros) nicamente
podemos leer su contenido y ejecutarlo, algo bastante lgico y seguro, no? Sera poco
serio si cualquier usuario pudiese modificar la funcionalidad de este comando.
Que pasara si a un archivo ejecutable del directorio /bin le disemos los siguientes
permisos:

-rwxr-xx 1 root root 3518 2006-09-19 14:38 znew


Un usuario cualquiera (excepto root) tericamente debera poder ejecutarlo, sin embargo,
necesita leerlo para interpretarlo (cosa que tiene prohibida), por lo tanto no se ejecutara.
Qu pasara en este otro caso?

-rwxr-xr 1 root root 3518 2006-09-19 14:38 znew


Como usuario normal podramos leer su contenido, pero tampoco podramos ejecutarlo, ya
que carece de permisos de ejecucin

1.2 Los permisos en decimal


1.3
Como ya hemos comentado, la operacin de administrar una poltica de seguridad en Linux
es una tarea fundamental para un administrador de sistemas.
La nica persona que puede cambiar los permisos de un archivo o directorio es su
propietario. No hace falta decir, que el root podr cambiar los permisos de cualquier otro
usuario del sistema.
Para calcular el valor de un permiso nos basaremos en la sumas de sus valores decimales
segn esta correspondencia:
r

Permiso

42

Valor
Decimal

Por lo tanto los posibles valores para un permiso sern:


Permisos

Valor

rwx

rw-

r-x

-wx

-w-

Lo anterior, aplicado a un fichero que agrupa los permisos en 3 grupos (propietario, grupo y
otros), resultara as.
rwx r-x
750
Por lo tanto,
PERMISO

VALOR

rwx rwx rwx

777

rwx r-x r

754

r-x r

540

Teniendo claro esto, ya podemos administrar permisos de forma sencilla utilizando el


comando chmod.

43

1.4 Cambiando permisos con chmod

Lo ms habitual es utilizar el comando chmod para administrar permisos, del siguiente


modo:
[chmod] [modo] [permisos] [fichero/s]
Como modo slo veremos el modo -R, para cambiar los permisos de un modo recursivo
dentro de los directorios.
[alain@debian]$ chmod -R 755 mi_directorio
[alain@debian]$ ls -l
[alain@debian]$
drwxr-xr-x 2 alain alain 4096 2007-07-13 13:57 mi_directorio

Otra manera de aadir o quitar permisos, ser utilizando estos modos:


a Indica que se aplicar a todos.(all)
u Indica que se aplicar al usuario.(user)
g Indica que se aplicar al grupo.(group)
o Indica que se aplicar a otros.(other)
+ Indica que se aade el permiso.
- Indica que se quita el permiso.
r Indica permiso de lectura.
w Indica permiso de escritura.
x Indica permiso de ejecucin.

La manera de aplicar este nuevo mtodo ser:


(A quin se aplica) +/ (Qu permisos aplica)
Aplicando lo anterior, resultaran estas posibles combinaciones:
a+r Permisos de lectura para todos.
+r Igual que antes, si no se indica nada se supone a.
og-x Quita permiso de ejecucin a todos menos al usuario.
u+rwx Da todos los permisos al usuario.
o-rwx Quita los permisos a los otros.

Aplicaremos -R (modo recursivo) cuando se trate de directorios:

44

[alain@debian]$ chmod -R o-rx mi_directorio


[alain@debian]$ ls -l
[alain@debian]$
drwxr-x 2 alain alain 4096 2007-07-13 13:57 mi_directorio

Con estos conceptos bsicos ya podremos administrar los permisos de los usuarios de
nuestros sistemas. El comando chmod tiene multiples opciones, recordad la existencia del
comando man para conocer ms:
[alain@debian]$ man chmod

TRABAJO CON QUOTAS

Sistemas Linux con gran cantidad de usuarios, como servidores de correo, servidores samba, etc.,
tarde o temprano tienen el problema de usuarios que almacenan demasiada informacin en sus
directorios de trabajo, pudiendo incluso en casos extremos llenar completamente discos duros
haciendo el sistema inservible.

Con el uso de cuotas de disco (disk quotas) es posible limitar la cantidad de espacio disponible
para cada usuario o de manera global para todos. En este manual de LinuxTotal.com.mx
conocers a fondo como implementar y administrar cuotas de disco para control de los usuarios.

Tipos de cuota

Por Bloques (blocks): Un bloque corresponde a 1 kb y una cuota por bloques correspondera al
total de bloques que un usuario puede utilizar en el sistema. Recuerda que los archivos se guardan
en bloques de disco. Asi un archivo de 100 bytes, ocupar un un bloque de 1kb en el disco duro.

Por Inodos (inodes): Un inodo o inode en ingls (Index Node) es un nmero que actua como
apuntador para el sistema de archivos de Linux y le indica en que bloques especficos del disco
duro se encuentran los datos de un archivo. Tambin el inodo en su referencia guarda informacin
sobre permisos, propietario, atributos, etc. Se podra ver en una analoga simple que un inodo es
como un nmero de serie nico para cada archivo del sistema y a travs de este nmero el sistema
recupera sus datos (bloques) y sus atributos (permisos, propietario, fechas, etc.).

En el caso de las cutoas, una cuota por inodos indicara el total de indos a los que el usuario tiene
derecho, casi representara el total de archivos que el usuario puede crear y digo "casi" porque los

45

usuarios podemos crear enlaces simblicos (ln -s) sobre archivos ya existentes que no aumentan
las cantidad de inodos. Pero por simplicidad puedes verlo como un 1 inodo = 1 archivo.

Lmites
Tanto las cuotas por bloques o por inodos, tienen lmites de uso y son de dos tipos:

HARD: (Duro) Cuando se establece (para bloques o inodos), es el lmite absoluto. El usuario no
podr exceder este lmite.

SOFT: (Suave) Este lmite (para bloques o inodos) que es siempre menor al HARD, puede ser
excedido por el usuario, pero ser constantemente advertido que el lmite de uso para bloques o
inodos ya ha sido excedido. Podra verse como un lmite de advertencia que le estar indicando al
usuario que su lmite ya se excedi y tome medidas.

Cuando se usa el lmite SOFT, dos situaciones pueden ocurrir. La primera es que NO se tenga
establecido un tiempo de gracia, y entonces el usuario podr seguir usando bloques o inodos hasta
llegar al lmite HARD que ser su lmite absoluto de uso.

La segunda situacin es que SI se tenga establecido el tiempo de gracia, que puede ser en das,
horas, minutos o segundos. En este caso, el usuario podr seguir usando bloques o inodos hasta
que termine el tiempo de graca o llegue al lmite HARD, cualquiera que ocurra primero.
El tiempo de gracias se puede establecer por usuario o globalmente y ms adelante veremos como
establecerlo.

Donde se implementan?
Las cuotas se establecen por filesystem o sistema de archivos, es decir, debes de decidir en donde
es ms conveniente instalar un sistema de cuotas, pero no hay ningn problema si se instala en
todos. Las cuotas pueden establecerse por usuario, por grupos o ambos. En el siguiente ejemplo:

#> mount
/dev/sda1 on /boot type ext3 (rw,noatime)
/dev/sda2 on / type ext3 (rw,noatime)
/dev/sda3 on /home type ext3 (rw,noatime)
none on /proc type proc (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

46

Lo anterior es un ejemplo tpico de un equipo Linux con varios sistemas de archivos (/boot, / y
/home). Como se sabe en /home es donde los usuarios tienen sus directorios de trabajo (HOME),
asi que solo en este sistema de archivos crearemos cuotas, en los otros dos no tiene caso.

Configuracin
Todo debe hacerse como root, y lo primero que haremos es editar el archivo "/etc/fstab" y
aadiremos "usrquota" o "grpquota", dependiendo si se desea cuotas por usuario o grupos, o
incluso ambas.

#> vi /etc/fstab
/dev/sda2 /

ext3

noatime

/dev/sda1 /boot

ext3

noatime

/dev/sda3 /home

ext3

noatime

....

(Aadimos en la cuarta columna el tipo de cuotas que deseamos)


/dev/sda2 /

ext3

noatime

/dev/sda1 /boot

ext3

noatime

/dev/sda3 /home

ext3

noatime,usrquota,grpquota

...
Algo similar a lo anterior deber tener tu archivo de configuracin, y como ya se indic solo
agregamos el soporte para cuotas en el sistema de archivos que nos interese. Lo anterior por si
solo, es obvio que no hace nada, habra que reiniciar el sistema para que se apliquen los cambios
pero realmente no es necesario, lo siguiente re-monta el sistema de archivos "/home":

#> mount -o remount /home


#> mount
/dev/sda1 on /boot type ext3 (rw,noatime)
/dev/sda2 on / type ext3 (rw,noatime)
/dev/sda3 on /home type ext3 (rw,noatime,usrquota,grpquota)
none on /proc type proc (rw)

El sistema de archivos "/home" esta listo ahora para soportar cuotas de disco. El siguiente paso es
verificar con el comando quotacheck por sistemas de archivos que soporten cuotas. Este comando
crea, verifica o repara el control de cuotas en los sistemas que lo soporten, en este caso creara el
soporte:

#> quotacheck -augmv

47

quotacheck: Scanning /dev/sda3 [/home] done


quotacheck: Cannot stat old user quota file: No existe el fichero o el directorio
quotacheck: Cannot stat old group quota file: No existe el fichero o el directorio
quotacheck: Cannot stat old user quota file: No existe el fichero o el directorio
quotacheck: Cannot stat old group quota file: No existe el fichero o el directorio
quotacheck: Checked 2539 directories and 35556 files
quotacheck: Old file not found.
quotacheck: Old file not found.

Los errores que enva es precisamente porque no exista un sistema de cuotas previo, es normal
que los enve. Cuando las cuotas esten en pleno uso, es conveniente ejecutar quotacheck
peridicamente para que verifique inconsistencias y se corrijan a tiempo. En cuanto a las opciones
estas indican lo siguiente:

a - all, es decir verifica todos los sistemas de archivos por cuotas.

u - user, verifica por soporte de cuotas para usuarios.

g - group, verifica por soporte de cuotas para grupos.

m - no-remount, evita que el sistema se remonte como de solo lectura.

v - verboso, reporta lo que hace conforme progresa, son los mensajes que salen a la
terminal.

Como ves, la opcin -a en este caso no era necesario puesto que solo tenemos "/home" con
cuotas, asi que el comando anterior tambin pudiera ser invocado de esta manera:

#> quotacheck -ugmv /home

Pues el sistema esta listo para manipular cuotas de usuario, esto lo podemos comprobar porque en
la raz del sistema de archivos soportado con cuotas deben existir los archivos "aquota.user" y
"aquota.group" que son binarios, no trates de modifiAlain o manipularlos:

#> cd /home
#> ls -l
total 72
-rw------- 1 root root

8192 2008-05-17 21:38 aquota.group

-rw------- 1 root root

8192 2008-05-17 21:38 aquota.user

drwx--x--x 4 user1 user1 4096 2008-05-12 16:13 user1/


drwx--x--x 4 user2 user2 4096 2008-05-12 16:13 user2/
drwx--x--x 3 user3 user3 4096 2008-05-05 12:01 user3/

48

drwx--x--x 3 user4 user4 4096 2008-05-05 12:01 user4/

(Obsrvese los dos archivos de control de cuotas, para usuarios y grupos)


Si se tuvieran ms sistemas de archivos con soporte para cuotas en la raz de cada uno estaran
estos archivos, o solo uno dependiendo lo que se pidi, usuarios, grupos o ambos. Por cierto, en
sistemas con kernel 2.2 o anterior se usaba la versin 1 de cuotas y sus archivos de control se
nombraban "quota.user" y "quota.group", del kernel 2.4 y posteriores con la versin 2 y 3, se utiliza
los mostrados anteriormente.

Ahora bien, lo anterior deja listo el sistema para el soporte de cuotas pero ests siguen sin ser
activadas se requiere activar el soporte de cuotas, para lo cual invocamos el comando quotaon:

#> quotaon -ugv /home


/dev/sda3 [/home]: group quotas turned on
/dev/sda3 [/home]: user quotas turned on

Activamos para "/home" cuotas de usuario y grupos. Cuando por alguna razn sea necesario
desactivar las cuotas, entonces utiliza la contraparte, que es el comando quotaoff:

#> quotaoff -v /home


/dev/sda3 [/home]: group quotas turned off
/dev/sda3 [/home]: user quotas turned off

Muy bien, hasta aqui ya tienes el sistema de archivos "/home" o el que hayas elegido (o todos)
para trabajar con soporte de cuotas para los usuarios y grupos, ahora veremos como aplicar estas
cuotas con los usuarios.

Aplicando la cuota a usuarios


Ahora hay que aplicar la cuota por usuario, aunque el sistema de archivos ya soporta cuotas y
estn habilitadas, por defecto ningn usuario tiene establecidas cuotas. Asi que para iniciar habr
que administrar cada usuario a travs del comando edquota, que abrir el editor de texto que se
tenga por defecto y mostrar lo siguiente:

#> edquota -u user1


Disk quotas for user user1 (uid 502):
Filesystem

blocks

/dev/sda3

56

soft

hard

inodes
14

49

soft
0

hard

Las columnas "blocks" e "inodes" son informativas, es decir nos indican la cantidad de bloques o
inodos utilizados actualmente por el usuario, y las que podemos editar son las columnas "soft" y
"hard" de cada caso. Como ya se explic en la primera parte de este artculo, se puede indicar
libremente cualquiera de los cuatro valores, es perfectamente posible establecer valores por
bloques, por inodos o ambos, solo recuerda que el lmite soft debe ser menor al hard.

Si se establece solo el hard, no habr advertencias previas y el usuario ya no podr guardar


archivos cuando se llegue al valor. Si se establece soft y hard, avisar cuando se rebase el lmite
soft y entrar en juego el periodo de gracia. Si se acaba el tiempo de gracias o se llega al har (lo
que sea primero) ya no se podrn crear ms archivos hasta que no se eliminen algunos de los que
se tengan actualmente.

Para modificar cuotas a nivel grupo, se usa el mismo comando pero con la opcin -g (edquota -g
ventas).

En el ejemplo previo se modifica la cuota del usuario "user1" en el sistema de archivos "/home" que
es el que se ha usado de ejemplo en este artculo de LinuxTotal.com.mx, el comportamiento por
default es modificar cuotas para ese usuario en todos los sistemas de archivos que tengan activo el
control de cuotas (quotaon). Si se desea control de cuotas para un filesystem en especfico
entonces se agrega la opcin -f:

#> edquota -u user1 -f /home


(solo aplica la cuota en el sistema de archivos indicado)

Verificando el uso de las cuotas


Como usuario administrador 'root' puedes ver el uso de cuotas de cualquier usuario, ya sea
individualmente o por medio de un reporte global.
Por usuario o individualmente se usa el comando quota, estando como "root":

#> quota -u user1


Disk quotas for user user1 (uid 502):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda3

56

70

100

14

Con usuarios que manejan cantidades muy grandes de cuota, es un poco dificil calcular en
trminos de megas o gigas el espacio usuado y los lmites de cuotas:

#> quota -u sergio

50

Disk quotas for user sergio (uid 500):


Filesystem blocks quota limit grace files quota limit grace
/dev/sda3 42578888

0 50000000

34895

Usando la opcin -s se mejora el informe:

#> quota -s -u sergon

Disk quotas for user sergon (uid 500):

Filesystem blocks quota limit grace files quota limit grace


/dev/sda3 41582M

0 48829M

34905

Como usuario individual del sistema, puedes observar tus cuotas con el mismo comando quota, sin
argumentos.

Ahora bien, si se desea un reporte global de las cuotas de todos los usuarios o por grupos, siendo
"root" utiliza el comando repquota:

#> repquota /home


*** Report for user quotas on device /dev/sda3
Block grace time: 7days; Inode grace time: 7days
Block limits
User

used

soft

File limits

hard grace

used soft hard grace

---------------------------------------------------------------------root

-- 184280

11

0 50000000

sergio

-- 42579852

34902

user1

--

56

70

100

user2

--

52

13

user3

--

28

user4

--

28

14

Con repquota es tambin posible utilizar la opcin -s para observar los tamaos en formato legible.
Si se usa la opcin -a (all) en vez del sistema de archivos "/home", el reporte ser para todos los
sistemas de archivos en el equipo que soporten cuotas. Asi mismo este reporte por defecto es por
usuarios, si se requiere que repquota reporte por grupos, aade entonces la opcin -g.

51

Obsrvese en la segunda lnea del reporte el tiempo de gracia (grace time), que es de 7 das tanto
para cuotas por bloque como para cuotas por archivos o inodos. Esto aplica para todos los
usuarios en global, como se aprecia en el listado que ninguno tiene establecido un tiempo de
gracia diferente al global.

Estableciendo el tiempo de gracia


A nivel global, un periodo de gracia para todos, utiliza la opcin -t del comando edquota, como en
el siguiente ejemplo, recuerda que debes ser "root":

#> edquota -t

Grace period before enforcing soft limits for users:

Time units may be: days, hours, minutes, or seconds


Filesystem

Block grace period

/dev/sda3

7days

Inode grace period


7days

7 das es el periodo por defecto, si lo cambias a digamos 12 horas, sera "12hours". El tiempo de
gracia puede ser distinto para el lmite soft por bloques o por inodos.

Por usuario especfico se realiza con la opcin -T del mismo comando e indicando el usuario:

#> edquota -u user1 -T


Times to enforce softlimit for user user1 (uid 502):
Time units may be: days, hours, minutes, or seconds
Filesystem
/dev/sda3

block grace
unset

inode grace
unset

Lo nico que hay que considerar es que los tiempos de gracias por usuario deben ser menores al
global. Y que este empieza a correr una vez que se ha llegado al lmite soft. Cuando esto suceda,
si entras a editar de nuevo el tiempo de gracia del usuario (edquota -u user -T) se reflejara en
segundos el tiempo que le queda, pudindolo aumentar de nuevo si eres "root". O dejarlo en cero y
entonces el global ser el que se utilice.

Fijar cuotas de manera global a todos los usuarios


En sistemas Linux con pocos usuarios, establecer las cuotas usuario por usuario no representa
ningn problema. Pero si hablamos por ejemplo de una universidad donde pudieran existir miles de
cuentas entonces si es un problema establecer cuentas individualmente. Realmente no existe una

52

manera "oficial" de establecer cuotas masivamente, sin embargo, no hay problema, usaremos un
pequeo script que te permitira realizarlo.

Establece la cuota que deseas globalmente en un solo usuario:

#> edquota -u user1


Disk quotas for user user1 (uid 502):
Filesystem

blocks

/dev/sda3

68

soft

hard

300

inodes

400

17

soft
0

hard
0

:wq

Veamos el reporte de cuotas con repquota:

[root@segolap ~]# repquota /home


*** Report for user quotas on device /dev/sda3
Block grace time: 7days; Inode grace time: 7days
Block limits
User

used

soft

File limits

hard grace

used soft hard grace

---------------------------------------------------------------------user1

--

68

300

400

17

user2

--

352

13

user3

--

28

user4

--

28

0
0

Solo el usuario "user1" tiene cuotas, las columnas de "grace" tendrn valores una vez que se
llegue al lmite soft o suave. Usaremos entonces la opcin -p (protptype) para hacer duplicados a
partir del ya establecido.

#> edquota -p user1 user2

Con lo anterior "copias" la informacin de lmites de cuotas del "user1" al "user2", no hay lmite de
cuantos usuarios puedes colocar como argumentos asi que lo siguiente es vlido:

#> edquota -p user1 user2 user3 user4

Prctico para unos cuantos usuarios pero intil si necesitamos duplicarlo en cientos de usuarios,
asi que hagamos un comando compuesto que nos extraiga los nombres de los usuarios, se puede
usar por ejemplo gawk para realizar lo anterior:

53

#> gawk -F: '$3 > 499 {print $1}' /etc/passwd


user1
user2
user3
user4

Usamos el separador ":" de campos (-F), e indicamos como accin que en el campo 3 ($3)
busquemos todos los UID mayores a 499 y que los imprima ({print $1}). Ahora solo tenemos que
usar este comando junto con edquota -p:

#> edquota -p user1 `gawk -F: '$3 > 499 {print $1}' /etc/passwd`

(Importante: nota el uso de acento grave que abarca al comando gawk, esto para que el shell lo
ejecute primero y el resultado sern los argumentos, uno o cientos de usuarios cuyo UID es mayor
a 499)

Haciendo uso de repquota de nuevo veamos que pas:

#> repquota /home


*** Report for user quotas on device /dev/sda3
Block grace time: 7days; Inode grace time: 7days
Block limits
User

used

soft

File limits

hard grace

used soft hard grace

---------------------------------------------------------------------user1

--

68

300

400

user2

--

352

300

400 7days

user3

--

28

300

400

user4

--

28

300

400

17

13

Primero, todos los usuarios tienen las mismas cuotas que el "user1" que fue el prototipo para los
dems y segundo se observa que el "usuario" que tiene 352 bloques utilizados al pasar el lmite
suave entro al periodo de gracia automticamente que el global es de 7 das. A partir del instante
que el lmite cambi de 0 a 300, comenz el periodo de gracia. Ahora solo podr crear ms
archivos durante 7 das o cuando llegue a 400, lo primero que ocurra, claro, asumiendo que no
borre archivos primeros para recuperar espacio.

54

Avisos de cuotas excedidas (warnquota)


Cuando un usuario llega al lmite suave o soft al crear o modificar un documento, algo como lo
siguiente aaprecer:

user2> ls -l > directorio.txt


sda3: warning, user block quota exceeded.

En este instante como el "user2" no ha llegado al lmite "hard" ni ha expirado el tiempo de gracia, el
sistema permite crear el archivo pero se le notifica con un warning.

Pero si lo que deseamos es notificar inmediatamente y via correo electrnico que un usuario llego
a su lmite, por ejemplo, un server de correo electrnico, un usuario que ha recibido spam y esta
saturando su cuenta, puede ser notificado que su couta esta llegando al lmite.

Para lo anterior usaremos el comando warnquota. Este comando simplemente invcalo desde la
lnea de comandos, sin argumentos, revisar los sistemas de archivos con cuotas activadas
(quotaon) y revisar todos los usuarios buscando quien ha excedido el lmite soft tanto por bloques
como por inodos, y a aquellos que lo hayan excedido les enviar un correo notifcandoles de lo
anterior.

Puedes agregar en cron una lnea como la siguiente para que warnquota haga su trabajo cada 12
horas:

#> vi /etc/crontab
...
0 0,12 * * * root /usr/sbin/warnquota
...
warnquota viene con los mensajes en ingls por defecto, el archivo de configuracin es
"/etc/warnquota.conf", es muy intuitivo y fcil de cambiar, personalzalo con los mensajes a espaol
para que sea ms fcil entender a tus usuarios que han excedido sus cuotas.

EDITORES DE TEXTO

Vi

Funcionamiento general

Al invocar este editor aparece en el monitor la pantalla de edicin. En ella aparece la posicin
del cursor resaltada, las lneas en blanco sealadas con el carcter ~ y en la parte inferior de la

55

pantalla aparece la lnea de estado, que muestra el nombre del fichero y el nmero de
caracteres que contiene.

Si se invoca el vi pasndole como parmetro el nombre de un fichero en la pantalla de edicin


aparecer su contenido. Cuando se invoca este editor con el nombre de un fichero que no
existe, se crea automticamente.

Existen dos modos de operacin en el vi:


Modo Edicin:
Para aadir texto al fichero
Modo Comando:

Para introducir rdenes que realizan funciones especficas del vi.


Cuando se edita un fichero con el vi, los cambios no se hacen directamente sobre el fichero.

En realidad, se aplican a una copia del fichero que el vi

crea en un espacio de memoria

temporal llamado buffer. La copia en disco del fichero se modifica slo cuando se graban los
contenidos del buffer.

Esto tiene sus ventajas y sus inconvenientes. Por un lado, significa que se puede salir de la
edicin de un fichero y descartar todos los cambios hechos durante una sesin, dejando la
copia de disco intacta. Por otro lado, se podra perder el contenido no grabado del buffer de
trabajo si el sistema cae.

Lo ms aconsejable es grabar el trabajo frecuentemente, especialmente cuando se hacen


cambios importantes. Para grabar el fichero que se est editando sin salir del vi , basta pulsar
en modo comando la orden :w

Para terminar la sesin caben varias posibilidades, siempre en modo comando:


:q
Salir cuando no se han hecho modificaciones
:q!
Salir y descartar los cambios
:wq
Salir y guardar los cambios

56

Importante: Hay que procurar no editar un fichero con varias copias del vi al mismo tiempo,
pues de este modo no se est seguro de cual es la copia que est realmente grabada en disco.

Modo Edicin:
Cuando se arranca el vi, siempre est en modo comando, por lo que antes de poder escribir
texto en el fichero se debe teclear uno de los comandos de entrada del vi , tales como
i (insert), para insertar texto en la posicin actual del cursor, o a (append) para insertar texto
despus de la posicin actual del cursor.

Para regresar la modo comando, basta con presionar Esc. Si en un momento determinado no
se sabe en qu modo se est, simplemente pulsando Esc se asegura uno de que est en
modo comando, y se podr continuar con el trabajo.

Modo Comando:
Cuando se abre un fichero con vi, se est en modo comando. En este modo se pueden
introducir comandos que implementan un amplio rango de funciones. Muchos de estos
comandos constan de una o dos letras y un nmero opcional relacionado con distintas
funciones.

Muchos comandos no requieren pulsar Return para que se ejecuten, pero todas las rdenes
que empiezan por dos puntos (:) requieren pulsar Return para que se ejecuten.

Principales comandos
Los principales comandos del vi, se encuentran clasificados en este manual segn su utilidad
durante la edicin de un documento.
1. Moverse por un fichero
2. Insertar texto
3. Cambiar texto
4. Deshacer cambios
5. Borrar texto
6. Copiar y mover texto
7. Comandos del ex
8. Bsqueda y reemplazo
9. Insercin de un fichero en otro
10. Edicin de mltiples ficheros

57

Los comandos del vi pueden ir precedidos de un contador que indica cuantas veces se debe repetir
la operacin.

Por ejemplo 3dd borra 3 lneas, 2dw borra 2 palabras, y 4x borra 4 caracteres.

Tambin se pueden usar contadores para los comandos de moverse por la pantalla, por ejemplo
3w o 2Ctrl-F Pulsando un "." se repite la ltima operacin realizada.
Por ejemplo, si se borra una la y la siguiente operacin es borrar una lnea, basta con pulsar ".".

Nota: Muchos de los comandos delvi

son case-sensitive, es decir, la misma orden tecleada en

maysculas o minsculas puede tener efectos totalmente distintos.

Moverse por un fichero

Cuando arrancamos el vi , el cursor esta en la esquina superior izquierda de la pantalla. En modo


comando, existen rdenes que nos permiten moverlo por toda la pantalla.
1. De carcter en carcter
o

Si el teclado esta provisto con las flechas, se pueden utilizar para mover el cursor
libremente por el texto editado hasta el momento.

Si se usa el vi

desde un terminal remoto, las flechas pueden no funcionar

correctamente, depende del emulador de terminal. En dicho caso las teclas usadas
son:
Izquierda:
h SpcBar
Derecha:
l BckSpc
Arriba:
k
Abajo:
j
2. De palabra en palabra
o

Pulsando w (word) nos movemos una palabra hacia la derecha.

Pulsando b (before) nos movemos una palabra hacia la izquierda.

3. Dentro de una lnea


o

Pulsando ^ nos movemos al comienzo de la lnea en la que est el cursor.

Pulsando $ nos movemos al final de la lnea actual.

Pulsando Return nos movemos al comienzo de la lnea siguiente.

58

4. Dentro de una pantalla


o

Pulsando H (high) nos movemos a la parte superior de la pantalla.

Pulsando L (low) nos movemos a la parte inferior de la pantalla.

Pulsando M (middle) nos movemos a la mitad de la pantalla

5. Av/Re Pgina
o

Pulsando Ctrl-F (forward) se avanza una pantalla, movindose el cursor a la


esquina superior izquierda de la nueva pantalla.

Pulsando Ctrl-D se avanza media pantalla.

Pulsando Ctrl-B (scroll backward) se retrocede una pantalla.

Pulsando Ctrl-U se retrocede media pantalla.

Insertar texto

vi proporciona muchos comandos para insertar texto, que nos hacen pasar del modo comando al
modo de edicin.
1. Aadir
o

Pulsando a (append) se inserta texto a la derecha del cursor.

Pulsando A se aade texto al final de la lnea en la que est el cursor.

2. Insertar
o

Pulsando i (insert) se inserta texto a la izquierda del cursor.

Pulsando I se inserta texto al principio de una lnea.

3. Insertar una lnea

Pulsando o (open) se inserta una lnea debajo de la posicin actual del cursor

Pulsando O se inserta una lnea encima de la actual posicin del cursor.

Cambiar texto

Cambiar texto implica sustituir una seccin de texto por otra. vi tiene varios modos de hacer esto,
dependiendo de lo que se desee cambiar.
1. Carcter por Caracter/es:
Substituir caracteres
Para substituir el carcter bajo el cursor por uno o mas caracteres, teclear s seguido del
nuevo texto y pulsar Esc cuando se acabe.
Reemplazar un carcter
Para reemplazar el carcter bajo el cursor por otro carcter, pulsar r, seguido por un unico
carcter, pues al pulsar una tecla el vi inmediatamente regresa a modo comando
Trasposicionar caracteres

59

Esto es util para fallos tales como escribir qeu en lugar de que. Colocando el cursor sobre
la primera letra a mover y pulsando xp, se intercambian las posiciones de ambos
caracteres.
2. Palabra por palabra/s
Palabra completa
Posicionar el cursor al principio de la palabra a ser reemplazada, teclear cw seguido de la
nueva palabra. Cuando se termine de modificar se pulsar Esc
Parte de una palabra
Colocar el cursor sobre la palabra, a la derecha de la parte a cambiar, y proceder como en
el caso anterior.
3. Lnea por lnea/s
Lnea completa
Poner el cursor en cualquier parte de la lnea y teclear cc. La lnea desaparece, dejando
una lnea en blanco para el nuevo texto, que puede ser de cualquier longitud. Para terminar
se pulsar Esc.
Parte de una lnea
Colocar el cursor a la derecha de la parte a modificar. Pulsar C, introducir la correccin y
pulsar Esc para terminar.
4. Partir/Unir lneas
Partir una lnea
Mover el cursor al espacio donde se quiere partir la lnea y teclear r (replace) seguido de
Return (se reemplazaria el espacio por un return sin afectar al texto)
Unir dos lneas
Colocar el cursor en la lnea superior y teclear J.

vi

Deshacer cambios

proporciona dos modos para deshacer los cambios hechos mientras no se ha grabado el

fichero a disco.

Deshacer el comando previo.


o

Pulsando u a continuacin del ltimo comando, se deshacen los cambios


producidos por la ejecucin del mismo.

Deshacer los cambios de una linea.


o

Pulsando U se deshacen todos los cambios que se han hecho sobre una
lnea. Este comando funciona slo si se permanece en dicha lnea.

60

Borrar texto

Caracteres
Para borrar un carcter, posicionar el cursor sobre el carcter a borrar y teclear x. El
comando x tambien borra el espacio ocupado por el carcter.
Para borrar el carcter anterior a la posicion del cursor pulsar X.
Palabras
Para borrar una palabra, posicionar el cursor al principio de la palabra y pulsar dw,
entonces se borrara la palabra y el espacio que sta ocupaba.
Para borrar parte de una palabra, hay que colocar el cursor a la derecha de la parte a
modificar, y teclear dw.
Lineas
Para borrar una lnea y el espacio que sta ocupa, basta con pulsar dd.
Para borrar todo lo que este a la derecha del cursor, basta con pulsar D.
Para borrar todo lo que este a la izquierda del mismo basta con pulsar d0.
Fichero
Para borrar desde la lnea actual hasta el final del fichero, basta con teclear dG.
Para borrar desde el principio del fichero hasta la lnea actual, basta teclear d1G.

Copiar y mover texto

De la misma manera que muchos procesadores de texto permiten copiar/pegar, o cortar/pegar


lneas de texto, el vi incluye tambin esta posibilidad, mediante los comandos yank /put y delete
/put , respectivamente.
1. Copiar y pegar
El procedimiento para copiar una ms lneas, es el siguiente:
o

Colocarse en la primera lnea a copiar.

Escribir el nmero de lneas que se desea copiar.

Teclear yy Y (comando yank ).

Colocarse en la lnea a donde se desean copiar

Teclear p P (comando pegar )

2. Cortar y pegar
El procedimiento para mover una varias lneas es el siguiente:
o

Colocarse en la primera lnea a cortar.

Escribir el nmero de lneas que se desea cortar.

Teclear dd (comando delete ).

Colocarse en la lnea a donde se desean pegar

Teclear p P (comando pegar )

3. Usar buffers con nombre

61

Para insertar repetidamente un grupo de lneas en varios lugares dentro de un documento,


se pueden copiar las lneas a un buffer con nombre. El procedimiento para dar nombre a
un buffer es el siguiente:
o

Colocarse en la primera lnea a copiar.

Teclear comillas dobles ( " ) seguido de la letra con que se desea nombrar el buffer
(Ej: "a )

A continuacin escribir el nmero de lneas que se desea copiar o cortar.

Teclear yy Y (comando yank ) dd (comando delete ).

Colocarse en la lnea donde se desean pegar.

Teclear comillas dobles seguidas por la letra del buffer cuyo contenido se desea
insertar y por p P (comando pegar).

Aviso: Entre la ejecucin de un yank

delete y un put , slo se pueden usar los comandos de

movimiento de cursor. Si se borrase o copiase cualquier otro texto antes de poner el nuevo texto
en su lugar, las lneas copiadas o borradas se perderan.
Si se necesita copiar o mover varios conjuntos de lneas distintos, se deben usar los buffers con
nombre, que slo se mantienen mientras no se salga del vi, o se le asigne explcitamente un nuevo
contenido

Comandos del ex

Cuando se trata de grandes bloques de texto, los comandos del ex son ms seguros que yank ,
delete y put del vi.
stes permiten especificar el rango de lneas a mover o copiar, as como la lnea anterior al punto
donde se insertarn las lneas.
Para conocer el rango de lneas, es necesario conocer el nmero de cada lnea:
Para visualizar los nmeros de lnea
:set nu
Para ocultar los nmeros de lnea
:set nonu
Conocidos los nmeros de las lneas que se van a copiar, las rdenes del editor ex disponibles
son:
1. Copiar lneas
El formato bsico del comando para copiar en el ex es el siguiente:
:#linea,#linea co #linea
2. Mover lneas
El formato bsico del comando para mover en el ex es el siguiente:
:#linea,#linea m #linea
3. Borrar lneas

62

El formato bsico del comando para borrar en el ex es el siguiente:


:#linea,#linea d
En todos los casos, los dos primeros nmeros de lnea especifican el rango de lneas a copiar ,
cortar o borrar, respectivamente, y el ltimo corresponde a la lnea anterior al punto de insercin.
Se pueden utilizar abreviaturas para especificar los rangos de lneas:
.
Denota la lnea actual
$
Denota el final del fichero

Bsqueda y remplazo
vi proporciona varios modos de encontrar un string de caracteres en el texto, as como de
reemplazarlo.

Un string es simplemente uno o ms caracteres en fila. Puede incluir letras, nmeros, signos de
puntuacin, caracteres especiales, espacios en blanco, tabulaciones o retornos de carro. Un string
puede ser una palabra gramatical o puede ser una parte de una palabra.

Para ir a una lnea determinada de un fichero abierto se tecleara:

#lineaG

(Ej. 6G)

Si no se indica un nmero de lnea se considerara la ltima del fichero.

Bsqueda
Para encontrar un string, hay que escribir una barra hacia la derecha (/) seguida por el string que
se desea buscar, y pulsar return.

El vi posiciona el cursor en la siguiente ocurrencia del string. Tecleando n se va a la siguiente


ocurrencia del string, y pulsando N a la anterior.

Si en lugar de una barra se escribiese una interrogacin (?), la bsqueda sera hacia atrs, y las
direcciones de las rdenes n y N se invertiran.
Normalmente las bsquedas son case-sensitive. Si se quiere que vi ignore maysculas y
minsculas durante la bsqueda, hay que teclear previamente:

:set ic
Para volver al cambio por defecto se tecleara:

63

:set noic

Ciertos caracteres especiales (/ & ! . ^ * $ \ ?) tienen un significado particular en el proceso de


bsqueda, y por lo tanto deben especificarse de un modo especial cuando estn incluidos en el
string a buscar, precedindolos por la barra hacia atrs (\).

Refinando la bsqueda
Se pueden realizar bsquedas ms precisas, marcando el string con indicadores de caractersticas
tales como:

Principio de lnea
Para intentar emparejar el comienzo de una lnea, hay que escribir antes del string
a buscar el carcter ^

Fin de lnea
Para emparejar el final de una lnea, hay que terminar el string a buscar por el
carcter $

Principio de palabra
Para emparejar el principio de una palabra, hay que teclear \<

Fin de palabra
Para emparejar el final de una palabra, hay que teclear \> al final del string.

Comodines
o

Para emparejar cualquier carcter, hay que teclear un punto en el string en


la posicin a emparejar. (igual que ? en los nombres de ficheros de MSDOS)

Para buscar caracteres alternativos en un string, se deben poner las


alternativas entre corchetes, por ejemplo:

[md]xxx encontrara los strings mxxx y dxxx

[d-m]xxx encontrara todos los strings que comiencen por cualquier


letra de la d a la m y sigan con xxx.

Para emparejar cero ms ocurrencias del ltimo carcter escrito, basta


aadir un * en el string.

Reemplazo
El procedimiento para reemplazar un string est es similar al de bsqueda arriba mencionado.
Todos los caracteres especiales de emparejamiento se pueden usar tambin en una
bsqueda+reemplazamiento.

64

La forma bsica de la orden es:

:g/string_buscado/s//string_cambiado/g

Se puede modificar el comando para parar la bsqueda y hacer que el vi pida confirmacin antes
de realizar el reemplazo, mediante la orden gc (consult), respondiendo y (s) o n (no).
Para terminar el proceso bastara con pulsar Ctrl-C

Insercin de un fichero en otro

vi permite insertar un fichero dentro del que se est editando, mediante la orden:
:#linea r nombre_fichero
Si no se especifica un nmero de lnea, se tomar la posicin actual del cursor

Edicin de mltiples ficheros

vi permite la edicin de varios ficheros simultneamente. Para ello se debe grabar el fichero
abierto (comando :w), y a continuacin escribir
:n nombre_nuevo_fich.
Para cambiarse de un fichero a otro habra que teclear
:n nombrefich
Para editar una serie de ficheros caben dos posibilidades:

Dar el nombre completo de todos los ficheros a editar:


vi nombre1 nombre2 nombre3

Utilizar caracteres comodn


vi nom*

Para copiar lneas de un fichero a otro, se deben seguir los siguientes pasos:
1. Editar el primer fichero
2. Salvar las lneas que se quieran con la orden yank.
3. Sin salir del vi, editar el fichero donde se van a insertar las lneas.
:n nuevofich
4. Usar la orden put como si se tratase del mismo fichero.

Recuperacin ante cadas del sistema

Si el sistema cae, el contenido del buffer donde se realizan las modificaciones se puede perder.

Se puede recuperar parte del trabajo realizado si se invoca el vi del siguiente modo:

vi -r nomfich

65

Donde nomfich es el fichero que se estaba editando en el momento en que se produjo la cada.

Cuando el sistema arranque de nuevo, enviar un mensaje indicando la recuperacin del fichero.

PROGRAMACIN EN BASH

1. Introduccin
1.1 Requisitos
Le ser til tener una cierta familiaridad con la lnea de comandos de GNU/Linux y con los
conceptos bsicos de la programacin. Aunque esto no es una introduccin a la programacin,
explica (o al menos lo intenta) muchos conceptos bsicos.

1.2 Usos de este documento


Este documento intenta ser til en las siguientes situaciones

Si tiene alguna idea de programacin y quiere empezar a programar algunos shell scripts.

Si tiene una idea vaga de programar en shell y quiere algn tipo de referencia.

Si quiere ver algunos scripts y comentarios para empezar a escribir los suyos propios.

Si est migrando desde DOS/Windows (o ya lo ha hecho) y quiere hacer procesos "por


lotes".

Si es un completo novato y lee todo COMO disponible.

2. Scripts muy sencillos


Este COMO tratar de darle algunos consejos sobre la programacin de shell scripts, basndose
profundamente en ejemplos.

En esta seccin encontrar varios scripts pequeos que esperanzadamente le ayudarn a


entender algunas tcnicas.

2.1 Tpico script `hola mundo'


#!/bin/bash
echo Hola Mundo

Este script tiene slo dos lneas. La primera le indica al sistema qu programa usar para ejecutar el
fichero.

La segunda lnea es la nica accin realizada por este script, que imprime 'Hola Mundo' en la
terminal.

66

Si le sale algo como ./hello.sh: Comando desconocido., probablemente la primera lnea,


'#!/bin/bash', est mal. Ejecute whereis bash, o vea 'encontrando el bash' para saber cmo debe
escribir esta lnea.

2.2 Un script de copia de seguridad muy simple


#!/bin/bash
tar -cZf /var/my-backup.tgz /home/yo/

En este script, en vez de imprimir un mensaje en la terminal, creamos un tar-ball del directorio
home de un usuario. Esto NO pretende ser un script til; ms tarde se ofrece un script de copia de
seguridad ms til.

3. Todo sobre redireccin


3.1 Teora y referencia rpida
Existen 3 descriptores de ficheros: stdin, stdout y stderr (std=estndar).
Bsicamente, usted puede:
1. redirigir stdout a un fichero
2. redirigir stderr a un fichero
3. redirigir stdout a stderr
4. redirigir stderr a stdout
5. redirigir stderr y stdout a un fichero
6. redirigir stderr y stdout a stdout
7. redirigir stderr y stdout a stderr

El nmero 1 'representa' a stdout, y 2 a stderr.

Una pequea nota para ver todo esto: con el comando less puede visualizar stdout (que
permanecer en el bfer) y stderr, que se imprimir en la pantalla, pero ser borrado si intenta leer
el bfer.

3.2 Ejemplo: stdout a un fichero


Esto har que la salida de un programa se escriba en un fichero.
ls -l > ls-l.txt

En este caso, se crear un fichero llamado 'ls-l.txt' que contendr lo que se vera en la pantalla si
escribiese el comando 'ls -l' y lo ejecutase.

67

3.3 Ejemplo: stderr a un fichero


Esto har que la salida stderr de un programa se escriba en un fichero.
grep da * 2> errores-de-grep.txt

En este caso, se crear un fichero llamado 'errores-de-grep.txt' que contendr la parte stderr de la
salida que dara el comando 'grep da *'.

3.4 Ejemplo: stdout a stderr


Esto har que la salida stdout de un programa se escriba en el mismo descriptor de fichero que
stderr.
grep da * 1>&2

En este caso, la parte stdout del comando se enva a stderr; puede observar eso de varias
maneras.

3.5 Ejemplo: stderr a stdout


Esto har que la salida stderr de un programa se escriba en el mismo descriptor de fichero que
stdout.
grep * 2>&1

En este caso, la parte stderr del comando se enva a stdout. Si hace una tubera con less, ver que
las lneas que normalmente 'desaparecen' (al ser escritas en stderr), ahora permanecen (porque
estn en el stdout).

3.6 Ejemplo: stderr y stdout a un fichero


Esto colocar toda la salida de un programa en un fichero. A veces, esto es conveniente en las
entradas del cron, si quiere que un comando se ejecute en absoluto silencio.
rm -f $(find / -name core) &> /dev/null

Esto (pensando en la entrada del cron) eliminar todo archivo llamado `core' en cualquier
directorio. Tenga en cuenta que tiene que estar muy seguro de lo que hace un comando si le va a
eliminar la salida.

4. Tuberas
Esta seccin explica de una manera muy sencilla y prctica cmo utilizar tuberas, y por qu
querra utilizarlas.

68

4.1 Qu son y por qu querr utilizarlas


Las tuberas le permiten utilizar (muy sencillo, insisto) la salida de un programa como la entrada de
otro.

4.2 Ejemplo: una tubera sencilla con sed


sta es una manera muy sencilla de utilizar tuberas.
ls -l | sed -e "s/[aeio]/u/g"

En este caso, ocurre lo siguiente: primero se ejecuta el comando ls -l, y luego su salida, en vez de
imprimirse en la pantalla, se enva (entuba) al programa sed, que imprime su salida
correspondiente.

4.3 Ejemplo: una alternativa a ls -l *.txt


Probablemente sta es una manera ms difcil de hacer un ls -l *.txt, pero se muestra para ilustrar
el funcionamiento de las tuberas, no para resolver ese dilema.
ls -l | grep "\.txt$"

En este caso, la salida del programa ls -l se enva al programa grep, que imprimir las lneas que
concuerden con la regex (expresin regular) "\.txt$".

5. Variables
Puede usar variables como en cualquier otro lenguaje de programacin. No existen tipos de datos.
Una variable de bash puede contener un nmero, un caracter o una cadena de caracteres.
No necesita declarar una variable. Se crear slo con asignarle un valor a su referencia.

5.1 Ejemplo: Hola Mundo! utilizando variables


#!/bin/bash
CAD="Hola Mundo!"
echo $CAD

La segunda lnea crea una variable llamada STR y le asigna la cadena "Hola Mundo!". Luego se
recupera el VALOR de esta variable ponindole un '$' al principio. Por favor, tenga en cuenta
(intntelo!) que si no usa el signo '$', la salida del programa ser diferente, y probablemente no
sea lo que usted quera.

5.2 Ejemplo: Un script de copia de seguridad muy simple (algo mejor)


#!/bin/bash
OF=/var/mi-backup-$(date +%Y%m%d).tgz

69

tar -cZf $OF /home/yo/

Este script introduce algo nuevo. Antes que nada, debera familiarizarse con la creacin y
asignacin de variable de la lnea 2. Fjese en la expresin '$(date +%Y%m%d)'. Si ejecuta el script
se dar cuenta de que ejecuta el comando que hay dentro de los parntesis, capturando su salida.

Tenga en cuenta que en este script, el fichero de salida ser distinto cada da, debido al formato
pasado al comando date (+%Y%m%d). Puede cambiar esto especificando un formato diferente.
Algunos ejemplos ms:
echo ls
echo $(ls)

5.3 Variables locales


Las variables locales pueden crearse utilizando la palabra clave local.
#!/bin/bash
HOLA=Hola
function hola {
local HOLA=Mundo
echo $HOLA
}
echo $HOLA
hola
echo $HOLA

Este ejemplo debera bastar para mostrarle el uso de una variable local.

6. Estructuras Condicionales
Las estructuras condicionales le permiten decidir si se realiza una accin o no; esta decisin se
toma evaluando una expresin.

6.1 Pura teora


Los condicionales tienen muchas formas. La ms bsica es: if expresin then sentencia donde
'sentencia' slo se ejecuta si 'expresin' se evala como verdadera. '2<1' es una expresin que se
evala falsa, mientras que '2>1' se evala verdadera.

Los condicionales tienen otras formas, como: if expresin then sentencia1 else sentencia2. Aqu
'sentencia1' se ejecuta si 'expresin' es verdadera. De otra manera se ejecuta 'sentencia2'.

70

Otra forma ms de condicional es: if expresin1 then sentencia1 else if expresin2 then
sentencia2 else sentencia3. En esta forma slo se aade "ELSE IF 'expresin2' THEN
'sentencia2'", que hace que sentencia2 se ejecute si expresin2 se evala verdadera. El resto es
como puede imaginarse (vanse las formas anteriores).
Unas palabras sobre la sintaxis:
La base de las construcciones 'if' es sta:
if [expresin];
then
cdigo si 'expresin' es verdadera.
fi

6.2 Ejemplo: Ejemplo bsico de condicional if .. then


#!/bin/bash
if [ "petete" = "petete" ]; then
echo expresin evaluada como verdadera
fi

El cdigo que se ejecutar si la expresin entre corchetes es verdadera se encuentra entre la


palabra 'then' y la palabra 'fi', que indica el final del cdigo ejecutado condicionalmente.

6.3 Ejemplo: Ejemplo bsico de condicional if .. then ... else


#!/bin/bash

if [ "petete" = "petete" ]; then

echo expresin evaluada como verdadera


else
echo expresin evaluada como falsa
fi

6.4 Ejemplo: Condicionales con variables


#!/bin/bash
T1="petete"
T2="peteto"
if [ "$T1" = "$T2" ]; then
echo expresin evaluada como verdadera
else
echo expresin evaluada como falsa
fi

71

6.5 Ejemplo: comprobando si existe un fichero


#!/bin/bash
FILE=~/.basrc
if [ -f $FILE ]; then
echo el fichero $FILE existe
else
echo fichero no encontrado
fi
if [ 'test -f $FILE']

7. Los bucles for, while y until


En esta seccin se encontrar con los bucles for, while y until.

El bucle for es distinto a los de otros lenguajes de programacin. Bsicamente, le permite iterar
sobre una serie de `palabras' contenidas dentro de una cadena.

El bucle while ejecuta un trozo de cdico si la expresin de control es verdadera, y slo se para
cuando es falsa (o se encuentra una interrupcin explcita dentro del cdigo en ejecucin).

El bucle until es casi idntico al bucle loop, excepto en que el cdigo se ejecuta mientras la
expresin de control se evale como falsa.

Si sospecha que while y until son demasiado parecidos, est en lo cierto.

7.1 Por ejemplo


#!/bin/bash
for i in $( ls ); do
echo item: $i
done

En la segunda lnea declaramos i como la variable que recibir los diferentes valores contenidos en
$( ls ).

La tercera lnea podra ser ms larga o podra haber ms lneas antes del done (4).
`done' (4) indica que el cdigo que ha utilizado el valor de $i ha acabado e $i puede tomar el nuevo
valor.

72

Este script no tiene mucho sentido, pero una manera ms til de usar el bucle for sera hacer que
concordasen slo ciertos ficheros en el ejemplo anterior.

7.2 for tipo-C


Fiesh sugiri aadir esta forma de bucle. Es un bucle for ms parecido al for de C/perl...
#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done

7.3 Ejemplo de while


#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo El contador es $CONTADOR
let CONTADOR=CONTADOR+1
done

Este script 'emula' la conocida (C, Pascal, perl, etc) estructura `for'.

7.4 Ejemplo de until


#!/bin/bash
CONTADOR=20
until [ $CONTADOR -lt 10 ]; do
echo CONTADOR $CONTADOR
let CONTADOR-=1
done

8. Funciones
Como en casi todo lenguaje de programacin, puede utilizar funciones para agrupar trozos de
cdigo de una manera ms lgica, o practicar el divino arte de la recursin.

Declarar una funcin es slo cuestin de escribir function mi_func { mi_cdigo }.

Llamar a la funcin es como llamar a otro programa, slo hay que escribir su nombre.

73

8.1 Ejemplo de funciones


#!/bin/bash
function salir {
exit
}
function hola {
echo Hola!
}
hola
salir
echo petete

Las lneas 2-4 contienen la funcin 'salir'. Las lneas 5-7 contienen la funcin 'hola'. Si no est
completamente seguro de lo que hace este script, por favor, prubelo!.

Tenga en cuenta que una funcin no necesita que sea declarada en un orden especfico.

Cuando ejecute el script se dar cuenta de que: primero se llama a la funcin 'hola', luego a la
funcin 'quit', y el programa nunca llega a la lnea 10.

8.2 Ejemplo de funciones con parmetros


#!/bin/bash
function salir {
exit
}
function e {
echo $1
}
e Hola
e Mundo
salir
echo petete

Este script es casi idntico al anterior. La diferencia principal es la funcin 'e'. Esta funcin imprime
el primer argumento que recibe. Los argumentos, dentro de las funciones, son tratados de la
misma manera que los argumentos suministrados al script.

74

9. Interfaces de usuario
9.1 Utilizando select para hacer mens sencillos
#!/bin/bash
OPCIONES="Hola Salir"
select opt in $OPCIONES; do
if [ "$opt" = "Salir" ]; then
echo done
exit
elif [ "$opt" = "Hola" ]; then
echo Hola Mundo
else
clear
echo opcin errnea
fi
done

Si ejecuta este script ver que es el sueo de un programador para hacer mens basados en texto.

Probablemente se dar cuenta de que es muy similar a la construccin 'for', slo que en vez de
iterar para cada 'palabra' en $OPCIONES, se lo pide al usuario.

9.2 Utilizando la lnea de comandos


#!/bin/bash
if [ -z "$1" ]; then
echo uso: $0 directorio
exit
fi
SRCD=$1
TGTD="/var/backups/"
OF=home-$(date +%Y%m%d).tgz
tar -cZf $TGTD$OF $SRCD

Lo que hace este script debera estar claro para usted. La expresin del primer condicional
comprueba si el programa ha recibido algn argumento ($1) y sale si no lo ha recibido,
mostrndole al usuario un pequeo mensaje de uso. El resto del script debera estar claro.

75

10. Miscelnea
10.1 Leyendo informacin del usuario
En muchas ocasiones, puede querer solicitar al usuario alguna informacin, y existen varias
maneras para hacer esto. sta es una de ellas:
#!/bin/bash
echo Por favor, introduzca su nombre
read NOMBRE
echo "Hola $NOMBRE!"

Como variante, se pueden obtener mltiples valores con read. Este ejemplo debera clarificarlo.
#!/bin/bash
echo Por favor, introduzca su nombre y primer apellido
read NO AP
echo "Hola $AP, $NO!"

10.2 Evaluacin aritmtica


Pruebe esto en la lnea de comandos (o en una shell):
echo 1 + 1

Si esperaba ver '2', quedar desilusionado. Qu hacer si quiere que BASH evale unos nmeros?
La solucin es sta:
echo $((1+1))

Esto producir una salida ms 'lgica'. Esto se hace para evaluar una expresin aritmtica.
Tambin puede hacerlo de esta manera:
echo $[1+1]

Si necesita usar fracciones, u otras matemticas, puede utilizar bc para evaluar expresiones
aritmticas.

Si ejecuta "echo $[3/4]" en la lnea de comandos, devolver 0, porque bash slo utiliza enteros en
sus respuestas. Si ejecuta "echo 3/4|bc -l", devolver 0.75.

10.3 Encontrando el bash


De un mensaje de mike (vea los agradecimientos):

Siempre usas #!/bin/bash .. a lo mejor quieres dar un ejemplo de cmo saber dnde encontrar el
bash.

76

`locate bash' es preferible, pero no todas las mquinas


tienen locate.
`find ./ -name bash' desde el directorio raz funcionar,
normalmente.
Sitios donde poder buscar:
ls -l /bin/bash
ls -l /sbin/bash
ls -l /usr/local/bin/bash
ls -l /usr/bin/bash
ls -l /usr/sbin/bash
ls -l /usr/local/sbin/bash

(no se me ocurre ningn otro directorio... lo he encontrado


la mayora de estos sitios en sistemas diferentes).
Tambin puedes probar 'which bash'.

10.4 Obteniendo el valor devuelto por un programa


En bash, el valor de retorno de un programa se guarda en una variable especial llamada $?.
Esto ilustra cmo capturar el valor de retorno de un programa. Supongo que el directorio dada no
existe. (Esto tambin es sugerencia de Mike).
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?

10.5 Capurando la salida de un comando


Este pequeo script muestra todas las tablas de todas las bases de datos (suponiendo que tenga
MySQL instalado). Considere tambin cambiar el comando 'mysql' para que use un nombre de
usuario y clave vlidos.
#!/bin/bash
DBS=`mysql -uroot -e"show databases"`
for b in $DBS ;
do
mysql -uroot -e"show tables from $b"
done

77

11. Tablas
11.1 Operadores de comparacin de cadenas
s1 = s2
s1 coincide con s2
s1 != s2
s1 no coincide con s2
s1 < s2
s1 es alfabticamente anterior a s2, con el locale actual
s1 > s2
s1 es alfabticamente posterior a s2, con el locale actual
-n s1
s1 no es nulo (contiene uno o ms caracteres)
-z s1
s1 es nulo
11.2 Ejemplo de comparacin de cadenas
Comparando dos cadenas
#!/bin/bash
S1='cadena'
S2='Cadena'
if [ $S1!=$S2 ];
then
echo "S1('$S1') no es igual a S2('$S2')"
fi
if [ $S1=$S1 ];
then
echo "S1('$S1') es igual a S1('$S1')"
fi

Cito aqu el consejo de un correo enviado por Andreas Beck, referido al uso de if [ $1 = $2 ].
Esto no es buena idea, porque si $S1 o $S2 son vacos, aparecer un parse error. Es mejor:
x$1=x$2 or "$1"="$2"

11.3 Operadores aritmticos


+ (adicin)
- (sustraccin)
* (producto)
/ (divisin)
% (mdulo)

78

11.4 Operadores relacionales aritmticos


-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ne (!=)

Los programadores de C tan slo tienen que corresponder el operador con su parntesis.

11.5 Comandos tiles


Esta seccin ha sido reescrita por Kees (vanse agradecimientos)

Algunos de estos comandos contienen lenguajes de programacin completos. Slo se explicarn


las bases de estos comandos. Para una descripcin ms detallada, eche un vistazo a las pginas
man de cada uno.

sed (editor de flujo)


Sed es un editor no interactivo. En vez de alterar un fichero moviendo el cursor por la pantalla, se
utiliza una serie de instrucciones de edicin de sed, y el nombre del fichero a editar. Tambin se
puede describir a sed como un filtro. Miremos algunos ejemplos:
$sed 's/a_sustituir/sustituto/g' /tmp/petete

Sed sustituye la cadena 'a_sustituir' por la cadena 'sustituto', leyendo del fichero /tmp/petete. El
resultado se enva a stdout (normalmente la consola), pero se puede aadir '> captura' al final de la
lnea de arriba para que sed enve la salida al fichero 'capture'.
$sed 12, 18d /tmp/petete

Sed muestra todas las lneas de /tmp/petete excepto la 12 y la 18. El fichero original no queda
alterado por este comando.

awk (manipulacin de bases de datos, extraccin y proceso de texto)

Existen muchas implementaciones del lenguaje de programacin AWK (los intrpretes ms


conocidos son gawk de GNU, y el 'nuevo awk' mawk). El principio es sencillo: AWK busca un
patrn, y por cada patrn de bsqueda que coincida, se realiza una accin.
Si tenemos un fichero /tmp/petete con las siguientes lneas:
"prueba123

79

prueba
pprruueebbaa"
y ejecutamos:
$awk '/prueba/ {print}' /tmp/petete

test123
test
El patrn que busca AWK es 'prueba' y la accin que realiza cuando encuentra una lnea en
/tmp/petete con la cadena 'prueba' es `print'.
$awk '/prueba/ {i=i+1} END {print i}' /tmp/petete

Cuando se utilizan muchos patrones, se puede reemplazar el texto entre comillas por '-f
fichero.awk', y poner todos los patrones y acciones en 'fichero.awk'.

grep (impresin de lneas que coinciden con un patrn de bsqueda)

Ya hemos visto ejemplos del comando grep en los captulos anteriores, que muestra las lneas que
concuerdan con un patrn. Pero grep puede hacer ms que eso.
$grep "busca esto" /var/log/messages -c

Se ha encontrado 12 veces la cadena "busca esto" en el fichero /var/log/messages.


[vale, este ejemplo es falso, el fichero /var/log/messages est alterado :-)]
wc (cuenta lneas, palabras y bytes)

En el siguiente ejemplo, vemos que la salida no es lo que esperbamos. El fichero petete utilizado
en este ejemplo contiene el texto siguiente:
$wc --words --lines --bytes /tmp/petete

2 5 41 /tmp/petete
Wc no tiene en cuenta el orden de los parmetros. Wc siempre los imprime en un orden estndar,
que es, como se puede ver: lneas, palabras, bytes y fichero.
sort (ordena lneas de ficheros de texto)
Esta vez, el fichero petete contiene el texto siguiente:
"b
c
a"
$sort /tmp/petete
Esto es lo que muestra la salida:

80

a
b
c
Los comandos no deberan ser tan fciles :-)
bc (un lenguaje de programacin de clculos matemticos)
Bc acepta clculos desde la lnea de comandos (entrada desde un fichero, pero no desde una
redireccin o una tubera), y tambin desde una interfaz de usuario. La siguiente demostracin
expone algunos de los comandos. Note que ejecuto bc con el parmetro -q para evitar el mensaje
de bienvenida.
$bc -q

1 == 5
0
0.05 == 0.05
1
5 != 5
0
2^8
256
sqrt(9)
3
while (i != 9) {
i = i + 1;
print i
}
123456789
quit
tput (inicializa una terminal o consulta la base de datos de terminfo)
Una pequea demostracin de las capacidades de tput:
$tput cup 10 4

La lnea de comandos aparece en (y10,x4).


$tput reset

Limpia la pantalla y la lnea de comandos aparece en (y1,x1). Observe que (y0,x0) es la esquina
superior izquierda.
$tput cols

81

80
Muestra el nmero de caracteres que caben en la direccin x.
Es muy recomendable familiarizarse con estos programas (al menos).
12. Ms scripts
12.1 Aplicando un comando a todos los ficheros de un directorio.
12.2 Ejemplo: Un script de copia de seguridad muy simple (algo mejor)

#!/bin/bash
ORIG="/home/"
DEST="/var/copias_de_seguridad/"
FICH=home-$(date +%Y%m%d).tgz
tar -cZf $DEST$FICH $ORIG

12.3 Re-nombrador de ficheros

#!/bin/sh
# renom: renombra mltiples ficheros de acuerdo con ciertas
# reglas
# escrito por Felix Hudson Enero - 2000

# primero comprueba los distintos 'modos' que tiene este


# programa
# si la primera ($1) condicin coincide, se ejecuta esa parte
# del programa y acaba

# comprueba la condicin de prefijo


if [ $1 = p ]; then

# ahora nos libramos de la variable de modo ($1) y ponemos $2


# de prefijo
prefijo=$2 ; shift ; shift

# una rpida comprobacin para ver si se especific algn


# fichero
# si no, hay cosas mejores que hacer que renombrar ficheros
# inexistentes!!
if [$1 = ]; then
echo "no se especificaron ficheros"

82

exit 0
fi

# este bucle for itera a lo largo de todos los ficheros que


# le hemos especificado al programa
# renombra cada uno de ellos
for fichero in $*
do
mv ${fichero} $prefijo$fichero
done

# ahora salimos del programa


exit 0
fi

# comprueba si es un renombramiento con sufijo


# el resto es casi idntico a la parte anterior
# lea los comentarios anteriores
if [ $1 = s ]; then
sufijo=$2 ; shift ; shift

if [$1 = ]; then
echo "no se especificaron ficheros"
exit 0
fi

for fichero in $*
do
mv ${fichero} $fichero$sufijo
done

exit 0
fi

# comprueba si es una sustitucin


if [ $1 = r ]; then

shift

83

# he includo esto para no daar ningn fichero si el


# usuario no especifica que se haga nada
# tan slo una medida de seguridad
if [ $# -lt 3 ] ; then
echo "uso: renom r [expresin] [sustituto] ficheros... "
exit 0
fi

# elimina el resto de informacin


VIEJO=$1 ; NUEVO=$2 ; shift ; shift

# este bucle for itera a lo largo de todos los ficheros que


# le hemos especificado al programa
# renombra cada fichero utilizando el programa 'sed'
# es un sencillo programa desde la lnea de comandos que
# analiza la entrada estndar y sustituye una expresin por
# una cadena dada
# aqu le pasamos el nombre del fichero (como entrada
# estndar)
for fichero in $*
do
nuevo=`echo ${fichero} | sed s/${VIEJO}/${NUEVO}/g`
mv ${fichero} $nuevo
done
exit 0
fi

# si se llega a esta parte es que no se le pas nada


# apropiado al programa, por lo que le decimos al usuario
# cmo hacerlo
echo "uso:"
echo " renom p [prefijo] ficheros.."
echo " renom s [sufijo] ficheros.."
echo " renom r [expresin] [sustituto] ficheros.."
exit 0

# hecho!

84

12.4 Re-nombrador de ficheros (sencillo)


#!/bin/bash
# renombra.sh
# renombrador de ficheros bsico

criterio=$1
expresion=$2
sustituto=$3

for i in $( ls *$criterio* );
do
orig=$i
dest=$(echo $i | sed -e "s/$expresion/$sustituto/")
mv $orig $dest
done

13. Cuando algo va mal (depuracin)


13.1 Maneras de llamar a BASH
Una buena idea es poner esto en la primera lnea:
#!/bin/bash -x

Esto producir informacin interesante.

SERVICIOS BSICOS
Resumen
Millones de hosts se encuentran conectados a Internet. Cmo se consigue mantener la pista de
todos ellos cuando pertenecen a tantos pases, redes y grupos administrativos distintos? Dos
piezas bsicas de infraestructura mantienen todo eso junto: el sistema de nombres de dominio
(DNS, del ingls Domain Name System), cuya funcin es saber quin es cada host, y el sistema de
enrutado de Internet, que se encarga de conocer cmo estn conectados. Este artculo hace
referencia a la porcin que supone el DNS en ese sistema.

Objetivos
Los objetivos de un servidor de nombres de dominio (DNS, del ingls Domain Name Service) son
dos:
1. Por una parte, traducir una direccin cannica en una direccin IP (del ingls, Internet
Protocol). Por ejemplo, linuxsilo.net es, a fecha de creacin del artculo, 66.79.182.201.

85

2. Por otra parte, traducir una direccin IP en una o varias direcciones cannicas. Es lo que
se conoce como traduccin inversa.
Haciendo un smil, el primer punto equivaldra a buscar en una agenda el nmero de telfono de
una persona, dado su nombre y apellidos, mientras que el segundo sera el proceso inverso: dado
un nmero de telfono averiguar a qu persona corresponde.

La correlacin entre una direccin IP y un nombre de dominio no tiene porqu ser nica. Esto es
debido a lo que se conocen como dominios virtuales. De hecho, es habitual que una direccin IP
equivalga a varios nombres de dominio. Por ejemplo, la direccin IP 66.79.182.201 es equivalente
a linuxsilo.net, www.linuxsilo.net, ftp.linuxsilo.net, pop3.linuxsilo.net y otros. Sin embargo, esto no
significa que la misma mquina (o host) 66.79.182.201 est ofreciendo todos esos servicios. Esto
es posible gracias a lo que se conoce como enrutamiento (del ingls, routing) de paquetes, pero no
viene al caso del artculo.

Introduccin
Qu es el DNS?
DNS es un sistema jerrquico con estructura de rbol. El inicio se escribe "." y se denomina raz, al
igual que en las estructuras de datos en rbol. Bajo la raz se hallan los dominios de ms alto nivel
(TLD, del ingls, Top Level Domain), cuyos ejemplos ms representativos son ORG, COM, EDU y
NET, si bien hay muchos ms. Del mismo modo que un rbol, tiene una raz y ramas que de ella
crecen. Si el lector est versado en ciencias de la computacin, reconocer el DNS como un rbol
de bsqueda y ser capaz de encontrar en l los nodos, nodos hoja y otros conceptos.

Cuando se busca una mquina, la consulta se ejecuta recursivamente en la jerarqua, empezando


por la raz. Si se desea encontrar la direccin IP de ftp.akane.linuxsilo.net., el servidor de nombres
(del ingls, nameserver) tiene que empezar a preguntar en algn sitio. Empieza mirando en su
cach. Si conoce la respuesta, pues la haba buscado anteriormente y guardado en dicha cach,
contestar directamente. Si no la sabe, entonces eliminar partes del nombre, empezando por la
izquierda, comprobando si sabe algo de akane.linuxsilo.net., luego de linuxsilo.net., luego net. y,
finalmente, de ".", del cual siempre se tiene informacin ya que se encuentra en uno de los ficheros
de configuracin en el disco duro.

A continuacin preguntar al servidor "." acerca de ftp.akane.linuxsilo.net. Dicho servidor "." no


sabr la contestacin, pero ayudar a nuestro servidor en su bsqueda dndole una referencia de
dnde seguir buscando. Estas referencias llevarn a nuestro servidor hasta el servidor de nombres
que conoce la respuesta.

86

As pues, empezando en "." encontramos los sucesivos servidores de nombres para cada nivel en
el nombre de dominio por referencia. Por supuesto, nuestro servidor de nombres guardar toda la
informacin obtenida a lo largo del proceso, a fin de no tener que preguntar de nuevo durante un
buen rato.

En el rbol anlogo, cada "." en el nombre es un salto a otra rama. Y cada parte entre los "." son
los nombres de los nodos particulares en el rbol. Se trepa el rbol tomando el nombre que
queremos (ftp.akane.linuxsilo.net) preguntando a la raz (".") o al servidor que sea padre desde la
raz hacia ftp.akane.linuxsilo.net acerca de los cuales tengamos informacin en la cach. Una vez
se alcanzan los lmites de la cach, se resuelve recursivamente preguntando a los servidores,
persiguiendo las referencias (ramas) hacia el nombre.

Otro concepto del cual no se habla tanto, pero que no es menos importante, es el dominio inaddr.arpa, que tambin se encuentra anidado como los dominios "normales". in-addr.arpa nos
permite hacernos con el nombre del host cuando tenemos su direccin. Merece la pena destacar
aqu que las direcciones IP estn escritas en orden inverso en el dominio in-addr.arpa. Si se tiene
la direccin de una mquina tal como 192.168.0.1, el servidor de nombres proceder del mismo
modo que con el ejemplo ftp.akane.linuxsilo.net.

Es decir, buscar los servidores arpa., luego los servidores in-addr.arpa., luego los 192.inaddr.arpa., luego los 168.192.in-addr.arpa. y, por ltimo, los servidores 0.168.192.in-addr.arpa. En
este ltimo encontrar el registro buscado: 1.0.168.192.in-addr.arpa.

Quin necesita el DNS?


El DNS define:
1. Un espacio de nombres jerrquico para los hosts y las direcciones IP.
2. Una tabla de hosts implementada como una base de datos distribuida.
3. Un traductor (del ingls, resolver) o librera de rutinas que permite realizar consultas a esa
base de datos.
4. Enrutamiento mejorado para el correo electrnico.
5. Un mecanismo para encontrar los servicios en una red.
6. Un protocolo para intercambiar informacin de nombres.

Para ser autnticos ciudadanos de Internet, los sitios necesitan el DNS. Mantener un fichero local
/etc/hosts con un mapeado de todos los hosts que los usuarios puedan querer contactar no es
factible.

87

Cada sitio mantiene una o varias piezas de la base de datos distribuida que posibilita el servicio
global del sistema DNS. Su pieza de la base de datos consiste en dos o ms ficheros de texto que
contienen registros para cada uno de los hosts. Cada registro es una sencilla lnea consistente en
un nombre (normalmente el nombre de un host), un tipo de registro y diversos valores o datos.

El DNS es un sistema cliente/servidor. Los servidores (de nombres) cargan los datos de sus
ficheros de DNS en memoria y los usan para responder las consultas tanto de los clientes de la red
interna como de los clientes y otros servidores en la red Internet. Todos sus hosts deberan ser
clientes del DNS, pero relativamente pocos necesitan ser servidores de DNS.

Si su organizacin es pequea (unos pocos hosts en una nica red), puede ejecutar un servidor en
uno de sus equipos o pedirle a su ISP (del ingls, Internet Services Provider) que le proporcione
ese servicio en su nombre. Un sitio de tamao medio con diversas subredes debera tener
mltiples servidores de DNS para reducir la latencia de las consultas y mejorar la productividad. Un
sistema muy grande puede dividir sus dominios de DNS en subdominios y usar algunos servidores
para cada subdominio.

Requerimientos y datos tcnicos


En este artculo se aprender a instalar y configurar BIND (del ingls, Berkeley Internet Name
Domain) sobre un sistema Linux. Se darn por supuestos ciertos conocimientos mnimos de redes
TCP/IP (del ingls, Transmission Control Protocol / Internet Protocol) y de administracin Linux o,
al menos, un conocimeinto bsico del funcionamiento de un sistema de este tipo. Estos son los
puntos que se tratarn y el software y hardware usado.
Software:
1. Debian GNU/Linux Sarge
2. Bind 9.2.4
3. DNS Utils
4. Bind Docs
Servicios:
1. Traduccin de nombres a direcciones IP.
2. Traduccin inversa (de direcciones IP a nombres).
3. Listas de control de acceso.
4. Servidores secundarios.
5. Transferencia segura de zonas entre servidores primarios y secundarios (y puertos).
6. Localizacin de servicios (registros SRV - RFC2052, del ingls, Request For Comments).
7. Respuestas parametrizadas en funcin del origen de la peticin (vistas).
8. Uso de la herramienta rndc.
9. Logs a medida.

88

Para este artculo se usar el FQDN (del ingls, Fully Qualified Domain Name) linuxsilo.net y los
servidores de nombres ns1.linuxsilo.net y ns2.linuxsilo.net. Un FQDN est formado por un host y
un nombre de dominio, incluyendo el dominio de ms alto nivel. Por ejemplo, www.linuxsilo.net es
un FQDN. www es el host, linuxsilo es el dominio de segundo nivel y net es el dominio de ms alto
nivel. Un FQDN siempre empieza con el nombre del host y continua subiendo directo al dominio de
ms alto nivel, por lo que ftp.akane.linuxsilo.net es tambin un FQDN. akane no es un FQDN.

Instalacin
De este tipo de software siempre es ms que recomendable tener la ltima versin, pues podemos
hallar en ella importantes errores y fallos de seguridad corregidos, as como nuevas
funcionalidades que faciliten nuestra tarea como administradores de sistemas. El proceso de
instalacin en una distribucin Debian de Linux es tan sencillo como ejecutar (como root, por
supuesto, del mismo modo que en el resto del artculo):
yum install bind

Dependiendo de la versin de Debian, el paquete Bind9 no estar disponible (por ejemplo, en


Potato se encuentra la versin 8), por lo que deberemos actualizar a una versin ms actual
(Woody o Sid en el momento de escribir este artculo) y proceder. La instalacin nos deja un Bind
con una configuracin bsica (en /etc/bind/) y funcionando, por lo que tan slo deberemos
configurarlo segn nuestras necesidades. Empezaremos por la traduccin de nombres a
direcciones IP.

El paquete Debian bind9 se instala con una configuracin ya funcional para la inmensa mayora de
los servidores terminales sin que sea necesaria la accin del usuario.
El fichero de configuracin named.conf del demonio (del ingls, daemon) named (nombre en el
sistema del demonio del servidor de nombres de dominio Bind) se encuentra en /etc/bind, de modo
que todos los ficheros estticos de configuracin relacionados con Bind estn en el mismo lugar.
Se recomienda encarecidamente no modificar esta configuracin, ms en un sistema GNU/Debian
Linux. De todos modos, si es necesario hacerlo, posiblemente la mejor manera sea usando un
enlace simblico a la localizacin que desee usarse.

Los ficheros de datos de las zonas para los servidores raz y las zonas de traduccin de
direcciones (del ingls, forward) y de traduccin inversa (del ingls, reverse) para el host local (del
ingls, localhost) se encuentran tambin en /etc/bind. El directorio de trabajo (del ingls, working
directory) de named es /var/cache/bind. Por lo tanto, cualesquiera ficheros temporales generados
por named, como los ficheros de la base de datos de las zonas que son secundarias para el
demonio, sern escritos en el sistema de ficheros de /var, que es a donde pertenecen. Para
conseguir que esto funcione, el named.conf proporcionado con la instalacin usa explcitamente

89

rutas absolutas (del ingls, fully-qualified o absolute pathnames) para referenciar los ficheros en
/etc/bind.

A diferencia de anteriores paquetes Debian de Bind, los ficheros named.conf y todos los db.* de la
instalacin se consideran ficheros de configuracin. Por ello, si tan slo se requiere una
configuracin "de cach" para un servidor que no ha de ser el autorizado (del ingls, authoritative)
de ningn dominio, se puede ejecutar la configuracin proporcionada tal cual. Si es necesario
cambiar opciones en el named.conf, o incluso referentes al init.d, puede hacerse sin compromiso,
pues las futuras actualizaciones respetarn dichos cambios, siguiendo la poltica de paquetes de
Debian.

Si bien el lector es libre para idear la estructura que ms le plazca para los servidores de los cuales
necesita ser el autorizado, se sugiere que todos los ficheros db para las zonas de las cuales se es
servidor primario (del ingls, master) estn en /etc/bind (quizs incluso en una estructura de
subdirectorios, dependiendo de la complejidad), y usar rutas absolutas en el fichero named.conf.
Cualesquiera zonas de las que se es servidor secundario (del ingls, secondary) deberan
configurarse en el named.conf como nombres de fichero sin ruta, de forma que los ficheros de
datos terminen crendose en /var/cache/bind. A lo largo del artculo se ilustrar este concepto para
una mejor comprensin.

Traduccin de nombres a direcciones IP


El primer paso es editar el fichero /etc/bind/named.conf.options, donde cambiaremos algunos de
los valores por defecto y aadiremos todo lo necesario para que nuestro dominio sea accesible
desde el exterior.

A menos que seamos un proveedor de servicios de internet, se nos habrn proporcionado una o
ms direcciones IP de servidores de nombres estables, que seguramente querremos usar como
redireccionadores (del ingls, forwarders), si bien no es imprescindible para conseguir los objetivos
bsicos de este artculo. Para ello deberemos descomentar el bloque casi al principio del fichero:
//

forwarders

// 0.0.0.0;
// };
Y dejarlo en algo como esto:
forwarders

66.79.160.3;
};

90

Donde las IPs son las correspondientes a nuestro ISP. Esta directiva le indica a nuestro servidor
que pase a otro servidor de nombres todas las peticiones para las cuales no es el autorizado o no
tiene la respuesta en cach. En el caso de no especifiAlain, se usarn los servidores raz de DNS.

Otras opciones interesantes de Bind (dentro de la directiva options y finalizadas en punto y coma)
son:
1. pid-file "/var/run/named.pid";, que definira la localizacin del fichero que contiene el PID
(del ingls, Process IDentificator) del demonio named,
2. stacksize 30M;, que determinara un tamao de pila de treinta megabytes,
3. datasize 20M;, que especificara un tamao mximo de memoria dedicado a almacenar
datos de veinte megabytes,
4. transfer-format many-servers;, que provocara la transferencia en paralelo de varias zonas
a los servidores secundarios, acelerando el proceso,
5. allow-transfer { slaves; };, que acotara globalmente las transferencias de zonas a los
servidores secundarios en la lista slaves (ver ms abajo el uso de listas de control de
acceso),
6. y version "DNS server";, que ocultara la versin de Bind que se est ejecutando, en aras a
una mayor seguridad del sistema.

Acto seguido se proceder a dar de alta las zonas para nuestros dominios. Si abrimos con un
editor de textos el /etc/bind/named.conf que viene por defecto con la instalacin encontramos cinco
zonas:

La raz (el punto)

localhost

127.in-addr.arpa

0.in-addr.arpa

255.in-addr.arpa

Mediante la primera damos a conocer los servidores raz a nuestro servidor de DNS, mientras que
con las otras cuatro nos hacemos cargo de la traduccin normal e inversa del localhost. A partir de
aqu, abrimos el fichero /etc/bind/named.conf.local y en l creamos la zona de nuestro dominio:
zone

"linuxsilo.net"

type

master;

file

"/etc/bind/db.linuxsilo.net";

allow-query

any;

};

allow-transfer

slaves;

};

};

91

El orden de las zonas es completamente irrelevante, pero se recomienda dejarlas en orden


alfabtico para una ms fcil localizacin en el futuro. Ntese que el nombre de la zona no termina
en "." (punto). Este es el cometido de los parmetros de cada zona:
1. type master; significa que el servidor de dominios es primario o maestro de la zona. Ms
adelante, al configurar servidores secundarios, se usar type slave;.
2. file "/etc/bind/db.linuxsilo.net"; es el fichero donde especificaremos la configuracin de esa
zona. Ntese que se usa una ruta absoluta, siguiendo la poltica de directorios de Debian.
El contenido de este fichero se especificar en breve.
3. allow-query { any; }; significa que se permiten consultas (del ingls, queries) externas a la
zona. Esto es algo til y necesario, a menos que se quiera ser muy paranoico con la
seguridad. Simplemente se ofrece de forma tcnicamente ordenada la informacin que es
pblicamente accesible.
4. allow-transfer { slaves; }; posibilita la transferencia automtica de esta configuracin a los
servidores secundarios de las zonas bajo nuestro control que se especifiquen en la lista
slaves. Se profundizar ms en el punto de transferencia de zonas.

Seguramente, el lector se habr percatado ya de que se han usado dos palabras especiales, any y
slaves, que requieren una mencin especial. Efectivamente, adems de hacer notar la sintaxis
similar a la del lenguaje de programacin C, con la que se debe ser extremamente cuidadoso, hay
dos comentarios extras que hacer:
1. any es una palabra reservada de la sintaxis de bind que significa "cualquier direccin IP",
como era lgico. Su uso es muy comn y necesario. Otras palabras reservadas
importantes son none, que significa "ningn host", localhost, que significa el host local
desde cualquiera de las interfaces del sistema, y localnets, que representa a todos los
hosts de las redes para las cuales el sistema tiene una interfaz.
2. slaves, en cambio, no es ninguna palabra reservada de bind, sino que corresponde al
concepto de lista de control de acceso (ACL, del ingls, Access Control List). Estas listas
de direcciones IP nos ahorran trabajo pues, de este modo, tan slo tenemos que
especificarlas una vez y, dado que les asginamos un identificador de grupo, podemos
referenciarlas de forma ms simple y rpida. Este es el cdigo de la ACL usada en el
ejemplo que, por supuesto, debe especificarse en algn lugar del documento antes de ser
usada:
acl

"slaves"

213.96.79.79;
};

El lector se habr dado cuenta en seguida de las grandes ventajas de usar estas listas, bien sea
porque la lista se use en varias zonas, bien porque tengamos ms de un servidor esclavo. Ntese

92

que en los identificadores de las ACL se diferencian maysculas y minsculas (en ingls, case
sensitive).

A continuacin se detalla el contenido del fichero de datos de la zona linuxsilo.net:


;
;

BIND

data

file

for

zone

linuxsilo.net

;
$TTL

604800

IN

SOA

linuxsilo.net.

2005052401 ;

hostmaster.linuxsilo.net.

Serial

10800 ;

Refresh

7200 ;

Retry

1296000 ;

yyyy/mm/dd/id
(3

hours)

(2

Expire

172800

hours)

(15

Negative

Cache

days)
TTL

(2

days)

IN

NS

ns1.linuxsilo.net.

IN

NS

ns2.linuxsilo.net.

IN

MX

20

mx1.linuxsilo.net.

IN

MX

30

mx2.linuxsilo.net.

IN

@
@

IN
IN

TXT "Linux
HINFO

LOC 39

34

Silo

"Intel
58

Pentium
2

38

Dot
IV"

Net"

"Debian

100m

10000m

Linux"
20m

100m

IN

66.79.182.201

ns1

IN

66.79.182.201

ns2

IN

213.96.79.79

mx1

IN

66.79.182.201

mx2

IN

213.96.79.79

www

IN

66.79.182.201

www2

IN

66.79.182.201

webmail

IN

ssh.tcp

SRV

smtp.tcp

SRV

http.tcp

SRV

http.tcp

SRV

https.tcp

SRV

pop3s.tcp

SRV

66.79.182.201

0
0

22
25

mx1.linuxsilo.net.

1
0

93

80
80

linuxsilo.net.

linuxsilo.net.
www2.linuxsilo.net.

443
995

linuxsilo.net.
mx1.linuxsilo.net.

*.tcp

SRV

*.udp SRV 0 0 0 .

Se comentan acto seguido todas y cada una de las directivas y opciones de estos ficheros de
configuracin (un punto y coma, ";", indica que todo lo que hay a su derecha es un comentario):
1. $TTL 604800: directiva obligatoria a partir de la versin 9 de Bind (RFC1035 y RFC2308),
indica el tiempo de vida (TTL, del ingls, Time To Live) de la informacin contenida en el
fichero. Es decir, el tiempo mximo de validez, tras el cual deber refrescarse o
actualizarse (para comprobar que no haya cambiado). Es lo que se conoce como cach
positiva/negativa (del ingls, positive/negative caching), como se especifica en el
RFC2308. Por defecto se usan segundos (604800 segundos equivale a siete das
exactos), pero pueden usarse tambin semanas ($TTL 1w), das ($TTL 7d), horas ($TTL
168h) y minutos ($TTL 10080m). Estas abreviaturas se usan asimismo en el registro SOA,
que se explica a continuacin.

Otra directiva interesante, aunque no se use en los ejemplos, es $INCLUDE <zone-file>,


que hace que named incluya otro fichero de zona en el lugar donde la directiva se usa.
Esto permite almacenar parmetros de configuracin comunes a varias subzonas en un
lugar separado del fichero de la zona principal.

2. @ IN SOA linuxsilo.net. hostmaster.linuxsilo.net.: el registro SOA (del ingls, Start Of


Authority) se encuentra siempre tras las directivas y proclama informacin relevante sobre
la autoridad de un dominio al servidor de nombres. Es siempre el primer recurso en un
fichero de zona. El smbolo "@" (arroba) equivale a la directiva $ORIGIN (o el nombre de la
zona si dicha directiva no se ha usado - caso ms frecuente) como espacio de nombres de
dominio definido por este registro. Este sera el esqueleto de este registro:

IN

SOA

<primary-name-server>

<hostmaster-email>

<serial-number>
<time-to-refresh>
<time-to-retry>
<time-to-expire>
<minimum-TTL>

El servidor de nombres primario que es el autorizado de este dominio se usa en <primaryname-server> y el correo electrnico de la persona a contactar acerca de este espacio de

94

nombres (del ingls, namespace) se sustituye en <hostmaster-email> (ntese que no tiene


porqu corresponder con una direccin del propio dominio).

El campo <serial-number> es un nmero que se incrementa cada vez que se modifica un


fichero de una zona, de forma que Bind se d cuenta de que tiene que recargar esta zona.
Se recomienda usar la fecha de modificacin en formato AAAAMMDD, donde AAAA es el
ao en formato de cuatro cifras, MM es el mes en dos cifras, y DD es el da de mes en dos
cifras, seguido de un nmero de dos cifras, empezando por el 01. De este modo se podrn
realizar hasta cien cambios por da.

El campo <time-to-refresh> le dice a los servidores secundarios (esclavos) cunto tiempo


deben esperar antes de preguntar a su servidor principal (maestro) si se ha hecho algn
cambio en la zona. El valor del campo <serial-number> es usado por los esclavos para
determinar

si

se

est

usando

informacin

anticuada

que

deba

actualizarse.

El campo <time-to-retry> especifica a los servidores esclavos el intervalo de tiempo a


esperar antes de solicitar una actualizacin en el caso de que el servidor de nombres
principal no est respondiendo. Si el servidor maestro no ha respondido a la peticin de
actualizacin antes de que expire el tiempo del campo <time-to-expire>, el esclavo dejar
de actuar como servidor el autorizado de ese espacio de nombres (zona)

El campo <minimum-TTL> solicita a otros servidores de dominio que almacenen en su


cach la informacin de esta zona durante al menos la cantidad de tiempo en l
especificada.

Ntese que el campo <primary-name-server> termina en un punto, que es obligatorio


poner, y que representa, segn lo explicado en el apartado introductorio del artculo, el
servidor de nombres raz.

Asimismo, este punto aparecer en todas las referencias explcitas al dominio a lo largo del
fichero. Cuando se configura un host o subdominio, por ejemplo ftp, se hace una referencia
implcita y Bind aade automticamente el dominio, que saca de la "@" del registro SOA.
En cualquier caso, es posible usar referencias implcitas o explcitas indistintamente.

3. NS ns1.linuxsilo.net. y NS ns2.linuxsilo.net.: indican los servidores de nombre que tienen


autoridad sobre el dominio. Ntese que la arroba nos ahorra tener que escribir el nombre
del dominio completo. De hecho, el prefijo, IN tambin es prescindible. Esta omisin es

95

posible gracias a que Bind toma las caractersticas omitidas del registro SOA anterior, es
decir, @ IN. Desde luego, ambas formas son correctas.

4. MX 20 ns1.linuxsilo.net.: se trata de un registro MX (del ingls, Mail eXchanger) e indica


dnde mandar el correo destinado a un espacio de nombres controlado por esta zona. El
dgito que sigue a la palabra MX representa la prioridad respecto a otros registros MX para
la zona, que se especificaran en posteriores lneas (MX 30 ns2.linuxsilo.net.), siguiendo el
mismo formato pero variando dicho dgito (incrementndolo a medida que pierdan prioridad
frente a anteriores registros). Es decir, cuanto ms bajo es el valor de preferencia, mayor
prioridad adquiere.

5. TXT "LinuxSilo.net DNS server": este es un registro a descriptivo, en texto plano (del
ingls, plain text), del servidor. Puede usarse libre y arbitrariamente para propsitos
diversos. Aparecer como resultado de una consulta sobre este tipo de registro hecha al
servidor de nombres sobre esta zona.

6. HINFO "Intel Pentium IV" "Debian Linux": otro registro, tambin a ttulo informativo y
totalmente opcional (del ingls, Host INFOrmation), cuyo propsito es informar sobre el
hardware y el sistema operativo, en este orden, delimitados por dobles comillas y
separados por un espacio o tabulador, de la mquina sobre la cual el servidor de nombres
se ejecuta. Tanto este tipo de registro (HINFO) como el anterior (TXT) pueden usarse en
cada uno de los subdominios (no nicamente en el dominio principal de la zona), como se
ver ms abajo.

7. LOC 39 34 58 N 2 38 2 E 100m 10000m 20m 100m: registro de localizacin geogrfica del


servidor, de nuevo opcional, que es usado por las herramientas de representacin grfica
de localizaciones de servidores, por ejemplo las de la asociacin CAIDA (del ingls,
Cooperative Association for Internet Data Analysis) y otras. Puede encontrarse informacin
sobre este tipo de registro en el RFC1876. Las coordenadas (latitud, longitud y dimetro
del objeto) se encuentran en formato WGS-84 (del ingls, World Geodetic System, del ao
1984). La localizacin usada en el artculo corresponde a Palma, Mallorca, Islas Baleares,
Espaa.

El formato a seguir es el siguiente: <owner><TTL><class> LOC ( d1 [m1 [s1]] {"N"|"S"} d2


[m2 [s2]] {"E"|"W"} alt["m"] [siz["m"] [hp["m"] [vp["m"]]]] ). Donde:

96

Parmetro Significado

Unidad Valores

Comentario

d1

Latitud
(grados)

0..90

Porcin en grados de la latitud

m1

Latitud
(minutos)

'

0..59

Porcin en minutos de la latitud.


Si se omite se toma por defecto
0'

s1

Latitud
(segundos)

"

0..59,999

Porcin en segundos de la
latitud. Si se omite se toma por
defecto 0"

N/S

Latitud
(hemisferio)

N/S

Hemisferio terrestre norte/sur

d2

Longitud
(grados)

0..180

Porcin en grados de la longitud

m2

Longitud
(minutos)

'

0..59

Porcin en minutos de la
longitud. Si se omite se toma
por defecto 0'

s2

Longitud
(segundos)

"

0..59,999

Porcin en segundos de la
longitud. Si se omite se toma
por defecto 0"

E/W

Longitud

E/W

Longitud E=este/W=oeste

alt

Altitud

-100000.00
42849672,95

siz

Tamao

0..90000000,00

Dimetro de la esfera que


contiene el punto indicado. Si se
omite se toma por defecto 1 m.

hp

Precisin
horizontal

0..90000000,00

Precisin horizontal en metros.


Si se omite se toma por defecto
10.000 m.

vp

recisin
vertical

0..90000000,00

Precisin vertical en metros. Si


se omite se toma por defecto 10
m.

..

Altitud con precisin de 0.01 m.

8. localhost A 127.0.0.1: registro que relaciona el host local con su IP de loopback.

9. linuxsilo.net. A 66.79.182.201: registro que relaciona el nombre de dominio de segundo


nivel (el "principal" de la zona) con la IP donde est hospedado. Este es el registro ms
usado, pues cualquier peticin a linuxsilo.net ser resuelta mediante este registro, se use
el protocolo de comunicaciones que se use (por ejemplo, http://linuxsilo.net).

10. ns1 A 66.79.182.201: a partir de aqu empieza la traduccin de subdominios del dominio
para el cual somos el autorizado: los dominios de tercer nivel y sucesivos. Fjese el lector

97

en que debe crearse un registro para cada uno, sin posibilidad de "agrupar" de ningn
modo. Asimismo, ntese que, al ser subdominios de la zona, se ha omitido el sufijo
linuxsilo.net., que se encuentra implcito debido a que no termina en "." (punto).

Es simplemente una cuestin de claridad y ahorro de espacio, pues las representaciones


en ambas zonas son - repetimos de nuevo - igualmente correctas. Otros registros similares
se citan, agrupados, a continuacin:

ns2 A

213.96.79.79

TXT "LinuxSilo.net
HINFO
www A

"Intel

secondary
Pentium

MMX"

nameserver"
"Debian

Linux"

66.79.182.201

pop3

66.79.182.201

smtp

66.79.182.201

ftp A

66.79.182.201

ts A

213.96.79.79

TXT "LinuxSilo.net
HINFO

"Intel

Team
Pentium

Speak
MMX"

"Debian

server"
Linux"

Dese cuenta el lector de que se han usado dos direcciones IP distintas, lo que indicara a
priori que, en realidad, todos estos hosts (dominios de tercer nivel) se encuentran tan slo
en dos mquinas distintas. Pero esto no tiene porqu ser cierto, pues podra tenerse una
misma IP pblica pero varias mquinas sirviendo los distintos puertos usados en estos
servicios, gracias a la accin de un router.

A propsito del concepto de alias (www, pop3, smtp y ftp son de hecho el mismo host)
existe una controvertida discusin sobre si es mejor usar el tipo de registro CNAME (del
ingls, Canonical NAME) o IN A. Muchos gurs de Bind recomiendan no usar registros
CNAME en absoluto, si bien esa discusin se escapa de los objetivos de este artculo.

En cualquier caso, es muy recomendable seguir la regla de que los registros MX, CNAME
y SOA nunca deben referenciar un registro CNAME, sino exclusivamente algo con un
registro tipo "A". Por lo tanto, no es aconsejable usar:
web

CNAME

www

Pero s sera correcto:


web

CNAME

98

ns

Tambin es seguro asumir que un CNAME no es un host adecuado para una direccin de
correo electrnico: webmaster@www.linuxsilo.net, sera incorrecta dada la configuracin
de arriba. La manera de evitar esto es usar registros "A" (y quizs algunos otros tambin,
como el registro MX) en su lugar. El autor de este artculo se decanta por el uso de IN A y
recomienda dicha prctica.

Traduccin inversa
En estos momentos, los programas son ya capaces de convertir los nombres en linuxsilo.net y
balearikus-party.org a direcciones a las cuales pueden conectarse. Pero tambin se requiere una
zona inversa, capaz de permitir al DNS convertir una direccin en un nombre. Este nombre es
usado por muchos servidores de diferentes clases (FTP, IRC, WWW y otros) para decidir si quieren
"hablar" con el cliente o no y, si es el caso, quizs incluso cunta prioridad se le debe asignar.

Para poder tener acceso completo a todos estos servicios en Internet es necesaria una zona
inversa.

En el fichero /etc/bind/named.conf hallamos varias zonas inversas que vienen por defecto con la
instalacin, justo debajo de dos lneas de comentario como estas:
//

be

authoritative

for

the

localhost

forward

and

reverse

zones,

and

for

// broadcast zones as per RFC 1912

Ah podemos encontrar la traduccin de zonas inversas para localhost, 127.in-addr.arpa, 0.inaddr.arpa y 255.in-addr.arpa, que no es necesario modificar para nada excepto en el primer caso.

Tras ellas deberemos aadir nuestra zona: 38.127.217.in-addr.arpa (recurdese que se escriben
en orden inverso, como se explica en el apartado introductorio de este artculo):
zone

"38.127.217.in-addr.arpa"

type

master;

file

"/etc/bind/db.217.127.38";

};

La sintaxis es idntica a la utilizada en las zonas de traduccin de nombres explicadas en el punto


anterior, y los comentarios anteriores mantienen su validez aqu. Pasemos a ver el contenido del
fichero /etc/bind/db.217.127.38:
;
;

BIND

reverse

data

file

for

zone

217.127.38

;
$TTL

604800

99

IN

SOA

linuxsilo.net.

hostmaster.linuxsilo.net.

2001081501 ;

Serial

10800 ;

Refresh

7200 ;

Retry

1296000 ;
172800

(3
(2

Expire
)

hours)
hours)

(15

Negative

Cache

days)
TTL

@ IN

(2

days)

NS ns1.linuxsilo.net.

NS ns2.linuxsilo.net.
156 IN PTR ns1.linuxsilo.net.

Este sera el aspecto de la zona inversa localhost, que deberemos modificar ligeramente a partir
del original:
;
;

BIND

data

file

for

local

loopback

interface

;
$TTL

604800

IN

SOA

localhost.

hostmaster.linuxsilo.net.

2001061501 ;

(
Serial

604800 ;

Refresh

86400 ;

Retry

2419200 ;

Expire

604800

Negative

Cache

TTL

IN NS ns1.linuxsilo.net.

1 IN PTR localhost.ns1.linuxsilo.net.
El mapeado inverso de la direccin del host local (127.0.0.1) nunca cambia, por lo que los tiempos
entre cambios son largos. Ntese el nmero de serie, que codifica la fecha: el fichero fue cambiado
por ltima vez durante el verano del 2001, fecha en que el servidor fue creado. Ntese asimismo
que slo el servidor maestro se lista en el dominio localhost. El valor de "@" aqu es 0.0.127.inaddr.arpa.

De nuevo, los conceptos son los mismos (la "@" - arroba - indica el dominio de la zona
linuxsilo.net., el "." - punto - del final hace referencia al servidor de nombres raz y el registro "SOA"
tiene exactamente la misma estructura y funcionalidad), excepto las dos ltimas lneas:
1. @ IN NS ns1.linuxsilo.net. y NS ns2.linuxsilo.net.: indican a qu servidores de nombres
debe preguntarse por la traduccin inversa de una direccin IP de esta zona.

100

2. 156 IN PTR ns1.linuxsilo.net.: este es el registro que se usar para devolver el nombre que
queremos que corresponda con la direccin IP que nos pertenece (cuidado al crear estos
registros, pues debe hacerse referencia exclusivamente a direcciones IP que sean de
nuestra propiedad o provocaramos un conflicto). En este caso se indica que la direccin
156 (implcitamente se le aade el sufijo .38.127.217.in-addr.arpa, lo que indica que se
trata de "nuestra" direccin IP 66.79.182.201) equivale al host ns1.linuxsilo.net.

Es obvio que aqu "falta informacin", pues la direccin IP 66.79.182.201 equivale, en


realidad,

ms

hosts,

tal

como

hemos

especificado

en

el

fichero

/etc/bind/db.linuxsilo.net. Esto es cierto, pero el autor es de la opinin de que es


redundante

156

aadir

lneas

IN

del

PTR

estilo:

ftp.linuxsilo.net.

156

IN

PTR

pop3.linuxsilo.net.

156

IN

PTR

smtp.linuxsilo.net.

156

IN

PTR

www.linuxsilo.net.

[..]

Es decir, se estima ms adecuado especificar un nico FQDN por IP. Por supuesto, si se
poseyera un rango de direcciones IP, por ejemplo de 66.79.182.201 a 217.127.38.160,
ambos inclusive, apareceran registros similares a los siguientes (variaran en funcin del
caso

concreto):

156

IN

157

IN

158

IN

159

IN

160

IN

PTR
PTR
PTR
PTR
PTR

ns1.linuxsilo.net.
ftp.linuxsilo.net.
smtp.linuxsilo.net.
ssh.linuxsilo.net.
www.linuxsilo.net.

Para este ejemplo, se deduce que la zona linuxsilo.net. est dividida en cinco mquinas
distintas, una para cada uno de los servicios mencionados (NS, FTP, SMTP, SSH y WWW,
respectivamente).
3.
Por qu la traduccin inversa no funciona? Hay una serie de "atenciones especiales" que prestar
en este punto que a menudo se pasan por alto al configurar un servidor de nombres de este tipo.
Se discuten a continuacin dos errores comunes en las traducciones inversas:
1. La zona inversa no ha sido delegada. Cuando se solicita un rango de direcciones IP y un
nombre de dominio a un proveedor de servicios, el nombre de dominio es generalmente

101

delegado por norma. Una delegacin es el servidor de nombres especfico que permite ir
saltando de un servidor de nombres a otro tal y como se explica en la seccin introductoria
de este artculo.

La zona inversa tambin debe ser delegada. Si se obtiene la red 217.127.38 con el dominio
linuxsilo.net a travs de un proveedor, es preciso que dicho proveedor aada un registro
NS para nuestra zona inversa as como para nuestra zona directa. Si se sigue la cadena
desde in-addr.arpa hacia arriba hasta llegar a nuestra red, probablemente se encontrar
una fractura en la cadena, muy probablemente a la altura de nuestro proveedor de
servicios. Habiendo encontrado el eslabn roto, contacte con su proveedor de servicios y
pdales que corrijan el error.

2. Su subred no pertenece a una clase definida. Este es un concepto ms avanzado, pero las
subredes sin clase (del ingls, classless subnet) son muy comunes en la actualidad y
probablemente tenga una si la suya es una empresa pequea.

Una subred sin clase es lo que consigue que Internet siga funcionando hoy en da. Hace
algunos aos se discuta mucho sobre la falta de direcciones IP. Los cerebros del IETF (del
ingls, Internet Engineering Task Force), que mantienen Internet funcionando, se
exprimieron la cabeza y hallaron la solucin al problema, aunque a cierto coste. El precio
es que se obtiene menos que una subred de tipo "C" y algunas cosas pueden dejar de
funcionar.

La primera parte del problema es que su ISP debe entender la tcnica utilizada. No todos
los pequeos proveedores de servicios tienen un conocimiento prctico de su
funcionamiento, por lo que quizs deba usted explicrselo y ser algo insistente (aunque
asegrese primero que lo entiende). Entonces, ellos debern preparar una zona inversa en
su servidor cuya correctitud puede ser examinada mediante la utilidad dig del paquete
dnsutils.

La segunda y ltima parte del problema es que usted debe entender la problemtica y su
solucin. Si no est seguro, haga aqu una pausa y busque ms informacin sobre ello.
Slo entonces, debera usted configurar su zona inversa para su red sin clase.

Pero hay an otra trampa oculta en este concepto. Los servidores de nombres de dominio
antiguos no sern capaces de seguir el registro CNAME en la cadena de traducciones y
errarn en la traduccin inversa de su mquina. Esto puede terminar en la asignacin de
una clase de acceso incorrecta por parte de un servicio, una denegacin de servicio o algo

102

a medio camino entre ambos. Si se encuentra en este caso, la nica solucin es que su
ISP inserte directamente su registro PTR directamente en su zona de red sin clase en lugar
de usar registros CNAME.
Algunos ISP ofrecen diversas alternativas para tratar este problema, como formularios web
que le permitirn introducir su mapa de registros de traduccin inversa, etc.

Servidores secundarios
Una vez se han configurado correctamente las zonas en el servidor principal (maestro), es
necesario preparar al menos un servidor secundario (esclavo), que proporcionar robustez y
fiabilidad. Si el servidor maestro cae los usuarios an sern capaces de obtener informacin del
esclavo acerca de las zonas que se representan.

El servidor esclavo debera estar lo ms lejos posible del maestro, debiendo ambos compartir la
menor cantidad posible de las siguientes caractersticas: suministro elctrico, red de rea local
(LAN, del ingls, Local Area Network), ISP, ciudad y pas. Si todas ellas son distintas entre el
maestro y el esclavo, entonces se tiene un servidor secundario realmente bueno.

Un servidor esclavo es simplemente un servidor de nombres que replica los ficheros de las zonas
de un maestro. Se configuran tal que as:
zone

"balearikus-party.org"

type

slave;

file

"sec.balearikus-party.org";

allow-query
masters

any;

66.79.182.201;

};
};

};

zone

"linuxsilo.net"

type

slave;

file

"sec.linuxsilo.net";

allow-query
masters

any;

66.79.182.201;

};
};

};
Ntese que la estructura es la misma que para el servidor primario, cambiando nicamente algunos
parmetros:
1. type slave;: indica que el servidor es esclavo para esta zona.
2. file "sec.balearikus-party.org"; y file "sec.linuxsilo.net";: como se ha explicado en la
introduccin del artculo, para seguir la poltica de directorios de Debian, los archivos
temporales de las zonas generados automticamente por el servidor secundario deben

103

guardarse en el directorio por defecto /var/cache/bind, por lo que tan slo se especifican
ficheros (sin ruta, o con ruta relativa implcita, que es lo mismo). Vase el punto siguiente
para ms informacin sobre el contenido de estos ficheros.
3. allow-query { any; };: mismo concepto que en el servidor primario.
4. masters { 66.79.182.201; };: define qu servidor es maestro para esta zona (de la cual,
recordemos, se es esclavo). Podra haberse usado una ACL aqu, de la misma manera que
se hace en el /etc/bind/named.conf del maestro, pero no se ha estimado oportuno pues
existe un nico maestro para ambas zonas. De todos modos, si el lector debe administrar
una red de servidores de nombres, donde el papel de maestro y esclavo es desempeado
a la vez por el mismo host en funcin de la zona, sera entonces muy conveniente crear
varias ACL, de forma que se facilite el mantenimiento y el control en la asignacin de
maestro y esclavos para cada zona.

Las dems opciones de configuracin se usaran de modo idntico al del servidor maestro, siempre
y cuando las condiciones sean las mismas. Es decir, se aplican las mismas directivas (por ejemplo,
options, en la cual incluiramos la opcin forwarders) y posibilidades.

Por ltimo, se desea destacar este apartado un aspecto que no debe pasarse por alto: las zonas
inversas, aunque especiales, tambin son zonas y deben transferirse del servidor primario a los
secundarios. En este momento, el que hasta ahora era servidor primario pasa a ser adems
servidor secundario, pues ns2.linuxsilo.net es maestro de su zona inversa (79.96.213.in-addr.arpa),
que transferir a ns1.linuxsilo.net, convirtindolo en esclavo nicamente para esa zona.

Del mismo modo, ns1.linuxsilo.net actuar como maestro de su zona inversa (38.127.217.inaddr.arpa), que transferir a ns2.linuxsilo.net al igual que vena ocurriendo con las zonas
balearikus-party.org y linuxsilo.net. A continuacin se presentan los cambios en los ficheros de
configuracin. En el named.conf de ns1.linuxsilo.net:
zone

"38.127.217.in-addr.arpa"

type

master;

file

"/etc/bind/db.217.127.38";

allow-transfer

slaves;

};

};

zone

"79.96.213.in-addr.arpa"

type

slave;

file
masters

"sec.db.213.96.79";
{

213.96.79.79;

};

104

};

Y en el named.conf de ns2.linuxsilo.net:
zone

"79.96.213.in-addr.arpa"

type

master;

file

"/etc/bind/db.213.96.79";

allow-transfer

66.79.182.201;

};

};

zone

"38.127.217.in-addr.arpa"

type

slave;

file

"sec.db.217.127.38";

masters

66.79.182.201;

};

};
El contenido de las zonas se mantendra exactamente igual. Tras estos cambios, en el directorio
/var/cache/bind de ns1.linuxsilo.net aparecera el fichero sec.db.213.96.79 y en el mismo directorio
de ns2.linuxsilo.net aparecera el fichero sec.db.217.127.38, todo gracias a la transferencia
automtica de zonas que pasa a verse a continuacin.

Transferencia segura de zonas


El lector se habr dado cuenta de que no se ha comentado nada de los ficheros sec.balearikusparty.org y sec.linuxsilo.net especificados en las directivas zone del servidor secundario. Esto es
debido a que usaremos un procedimiento que permitir que esos ficheros se creen de forma
automatizada a partir de los que creemos en el servidor primario, de forma que las tareas de
mantenimiento se facilitan enormemente.

Para ello, se debern haber utilizado, como se ha hecho en el ejemplo, las opciones allow-transfer
{ slaves; }; y masters { 66.79.182.201; }; en las zonas definidas en los ficheros /etc/bind/named.conf
de los servidores primario y secundario, respectivamente. Esto permitir que, realizados los
cambios deseados en el fichero /etc/bind/db.balearikus-party.org o /etc/bind/db.linuxsilo.net,
incluyendo el incremento del nmero de serie identificativo del registro SOA, y habindole
ordenado al servidor de nombres que recargue una, varias o todas las zonas, estos cambios se
reflejen

en

el

secundario

de

forma

que

se

generen

los

correspondientes

ficheros

/var/cache/bind/sec.balearikus-party.org y /var/cache/bind/sec.linuxsilo.net.

Para que esta transferencia de zonas se haga de forma segura y controlada, impondremos ciertas
restricciones en el /etc/bind/named.conf y generaremos claves que nos asegurarn la privacidad en
la comunicacin. Estas son las lneas que aadiremos en el /etc/bind/named.conf del servidor
primario (66.79.182.201 en el ejemplo):

105

controls
inet

{
127.0.0.1

allow

127.0.0.1;
}
keys

"2002052101.linuxsilo.net.tsigkey.";
};
};

server

213.96.79.79

keys

"2002052101.linuxsilo.net.tsigkey.";
};
};
Y estas las que aadiremos en el /etc/bind/named.conf del secundario:
controls
inet

{
127.0.0.1

allow

127.0.0.1;
}
keys

"2002052101.linuxsilo.net.tsigkey.";
};
};

server

66.79.182.201

keys

{
{

"2002052101.linuxsilo.net.tsigkey.";
};
};
Acto seguido se explica el significado de ambas directivas:
1. controls { inet 127.0.0.1 allow { 127.0.0.1; } keys { "2002052101.linuxsilo.net.tsigkey."; } };
es la directiva que cie el control sobre el servidor a travs de la clave
2002052101.linuxsilo.net.tsigkey. nicamente al host local. Es decir, deberemos habernos
conectado (habitualmente de forma remota mediante SSH) al servidor y, desde all,
ejecutar los comandos que controlan las acciones de Bind (normalmente mediante la
utilidad rndc, que se explicar ms adelante). De aqu se deduce que, tanto la
transferencia remota de zonas como el control sobre el servidor (recarga de zonas, parada,
arranque, etc.) se realiza a travs de esta clave cifrada. Adems, se deduce tambin que

106

mediante esta restriccin no ser posible controlar Bind remotamente, como ya se ha


dicho. Esta es la opcin por defecto y la que el autor de este artculo recomienda.

2. server 213.96.79.79 { keys { "2002052101.linuxsilo.net.tsigkey."; }; }; es una directiva que


indica al servidor cundo debe usarse la clave. Al usar esta clusula se obliga al servidor a
usar cierta clave cuando se comunique con una determinada direccin IP.

Para cada servidor es conveniente especificar una directiva server, especificando la


direccin IP de la otra mquina y el nombre de la clave a utilizar. En el ejemplo se usa la
misma clave para la comunicacin entre servidores y para el control del servidor desde el
host local - habiendo accedido por SSH - mediante la utilidad rndc

Ntese que, si se cambia la clave, la herramienta rndc puede dejar de funcionar correctamente. Al
realizar este proceso se recomienda para el servidor (rndc stop o /etc/init.d/bind9 stop), sustituir las
claves y arrancarlo de nuevo (/etc/init.d/bind9 start). Antes de explicar cmo crear una clave de
este tipo, veamos el verdadero porqu de su necesidad y los problemas que un fallo de seguridad
podra causar.

Acerca de los puertos, Bind usa el 53 TCP para las transferencias y el 53 UDP para las consultas.

QU ES UNA TSIG Y PARA QU SE NECESITA


El DNS trabaja sobre un modelo pregunta-respuesta. Si un cliente necesita informacin del DNS,
manda una peticin al servidor de DNS y ste le devuelve una respuesta. Hasta hace poco slo
era posible basarse en la direccin IP de origen para discernir si deba o no contestarse una
consulta. Pero esto no es precisamente "ideal".

La autenticacin basada nicamente en la direccin IP de origen se considera insegura. Las


transacciones firmadas (TSIG, del ingls, Transaction SIGnatures) aaden las firmas criptogrficas
como mtodo de autenticacin en una conversacin del DNS. Se usa una clave secreta compartida
para establecer la confianza entre las partes involucradas.

Las TSIG se usan para asegurar que la informacin del DNS que pretende provenir de cierto
servidor es realmente de ese servidor. Se usan principalmente para la autenticacin en la
transferencia de zonas entre el servidor de nombres primario y los secundarios. Se quiere asegurar
que los servidores secundarios no sern nunca engaados para que acepten una copia de una
zona para la cual es el autorizado de un impostor que escucha en la direccin IP del servidor
primario.

107

Las transacciones firmadas se definen en el RFC2845.

En el ejemplo anterior se ha usado la clave tsigkey.linuxsilo.net.20010922 para autenticar el trfico


del DNS entre los dos servidores, el primario (66.79.182.201) y el secundario (213.96.79.79).

CREACIN DE UNA CLAVE TSIG


En la instalacin por defecto del paquete Debian se facilita una clave TSIG previamente generada
y totalmente funcional. Pero es, desde luego, la misma para todo aquel que se instala ese paquete.
Por lo tanto, es ms que recomendable cambiarla. A continuacin se muestra cmo generar una
clave particular y cmo usarla para que la transferencia de zonas se haga de forma segura.

TSIG usa una clave secreta compartida que es incorporada a una dispersion (del ingls, hash)
MD5 de la informacin a ser firmada. Bind viene con una herramienta para crear este tipo de
claves, llamada dnssec-keygen, cuyos parmetros son numerosos (ejecute dnssec-keygen --help
para ver la lista completa y man dnssec-keygen para la pgina del man a propsito de esta
utilidad). Estos son los pasos a seguir para crear rpidamente una clave:
1. Mediante la ejecucin del comando dnssec-keygen -a HMAC-MD5 -b 512 -n HOST
2002052101.linuxsilo.net.tsigkey.

se

crea

una

clave

llamada

2002052101.linuxsilo.net.tsigkey. usando el algoritmo HMAC-MD5, de 512 bits (del ingls,


BInary digiT) y tipo HOST (que es precisamente el uso para el cual va destinada).

2. De los dos ficheros generados, K2002052101.linuxsilo.net.tsigkey.+157+30191.key y


K2002052101.linuxsilo.net.tsigkey.+157+30191.private, se usar slo el segundo. Se
aprovecha para mencionar que el formato de salida de los nombres de los ficheros
generados es Knnnn.+aaa+iiiii, donde nnnn es el nombre de la clave, aaa es la
representacin numrica del algoritmo e iiiii es la marca/huella del identificador de la clave
(del ingls, footprint).

Por supuesto, los nombres de cada clave generada deben ser nicos, es decir, dos claves
no deberan compartir jams el mismo nombre, de aqu el nombre tan inusual que se le ha
dado. La clave, propiamente dicha, es el conjunto de caracteres que se encuentra tras la
palabra Key: en la ltima lnea del fichero con sufijo .private.

3. El siguiente paso es editar el fichero /etc/bind/rndc.key y sustituir la clave que viene por
defecto por la que acaba de ser generada. Para ello, es suficiente con cambiar el nombre
de la clave por defecto de "rndc.key" al que le hemos dado al crearla, en este caso
2002052101.linuxsilo.net.tsigkey.. Por ltimo, hay que cambiar el valor del campo secret
por el valor de la clave generada que, como se acaba de decir ms arriba, se encuentra

108

tras la palabra Key: en la ltima lnea del fichero terminado en .private. En el caso de
ejemplo usado para el artculo, se ha generado la clave wlnQbRQM/76rol0xGkEdm [..]
MMlUFR7HpenQ==, pero el lector no debe tomar sta como una referencia, pues variar
en

cada

nueva

generacin.

Este

es

el

contenido

del

fichero

K2002052101.linuxsilo.net.tsigkey.+157+30191.private:

Private-key-format:

v1.2

Algorithm:
Key:

157
wlnQbRQM/76rol0xGkEdm

(HMAC_MD5)
[..]

MMlUFR7HpenQ==

Este es el contenido del fichero /etc/bind/rndc.key que viene por defecto con la instalacin
del

paquete

key

Debian:

"rndc-key"

algorithm

hmac-md5;

secret

"bsty5LYDsO8infm+n2JNsw==";

};

Y este es, finalmente, el fichero /etc/bind/rndc.key resultante del uso de la nueva clave:

key

"2002052101.linuxsilo.net.tsigkey."

algorithm
secret

{
hmac-md5;

"wlnQbRQM/76rol0xGkEdm

[..]

MMlUFR7HpenQ==";

};

Los dos ficheros creados al generar la clave, terminados en .key y .private, pueden ser eliminados
sin problemas. El lector, durante sus pruebas, se dar cuenta de que, si se omite el "." al final del
nombre de la clave, dnssec-keygen lo aadir automticamente, pudindose crear confusin
acerca de si el nombre que corresponde a la clave generada es con punto o sin punto al final.

Llegados a este punto, el autor recomienda usar el nombre tal y como se gener, aunque con una
simple prueba de ensayo-error (comprobar que se transfieren las zonas) se puede llegar fcilmente
a la solucin correcta.

Por ltimo, resaltar que una clave secreta es eso: secreta. Por lo tanto, es preciso que sea copiada
e instalada en ambos servidores de modo seguro. Adems, se recomienda encarecidamente
cambiar los permisos de los ficheros /etc/bind/named.conf y /etc/bind/rndc.key, tanto del servidor

109

primario como del secundario, a 600 (chmod 600 /etc/bind/named.conf y chmod 600
/etc/bind/rndc.key), de manera que sean nicamente accesibles por el usuario root.

La verificacin de una TSIG requiere la posibilidad de escribir un fichero temporalmente.


Asegrese de que named tiene permisos de escritura en su directorio por defecto (clusula
directory de la directiva options, que en Debian es, por defecto, /var/cache/bind/).

La implementacin de Microsoft de las TSIG no usa el algoritmo del RFC2845 (HMAC-MD5). El


GSS-TSIG de Microsoft no cumple el estndar y, consecuentemente, no interoperar
adecuadamente con Bind.

Ms informacin en los documentos RFC2535, RFC2845 y RFC2539

Comentarios sobre la actualizacin dinmica, la seguridad de las TSIG y las ACL

1. Es crtico que la clave sea guardada en secreto, lo que significa, por ejemplo, que:
a. named.conf y rndc.key no deben tener permisos de lectura para nadie que no sea
named o el usuario que ejecute rndc o nsupdate.
b. la clave no debe ser transmitida por emails, a menos que estn cifrados.
c.

cualquiera a quien le d esta clave es de confianza: por ello, dsela


exclusivamente a quienes la necesiten, y nunca a personas de las que desconfe.

d. debe considerar cambiar de clave cada cierto tiempo, despus de cambios en el


personal, o si se tienen sospechas de que se pueda haber comprometido el
secreto.

2. Si ambos hosts estn en la misma subred, es ms difcil monitorizar (del ingls, spoofing)
la direccin IP que hacerse con una copia de la clave (por ejemplo si los routers en
contacto con el exterior filtran IPs monitorizadas), de modo que una ACL de direcciones IP
sera ms efectiva.

3. Es igualmente vlido especificar una ACL o una clave TSIG. Por ejemplo allow-update {key
updater; updaters; };, que significara que tanto la TSIG como la ACL de direcciones IP son
vlidas para las actualizaciones.

4. No es posible requerir a la vez una TSIG y control de acceso por IP. Los desarrolladores
de Bind no creen que esto sea til, pues ellos se concentran en el control a nivel de usuario
ms que a nivel de host de cara a las actualizaciones dinmicas (de aqu el nfasis puesto

110

en la nueva poltica de actualizaciones que permite a los usuarios con direcciones IP


dinmicas actualizar sus registros en el DNS).
5. Las actualizaciones dinmicas no pueden aadir o eliminar dominios, tan slo registros de
esos dominios.

6. Un host cliente que quiera actualizar un servidor Bind nicamente necesita el binario
nsupdate y la clave apropiada. No se requieren otros binarios o libreras (del ingls,
libraries) adicionales.

7. nsupdate soporta el parmetro "-d" para tareas de depuracin (del ingls, debugging).

8. nsupdate tambin puede usar TCP (del ingls, Transmission Control Protocol) en lugar de
UDP (del ingls, User Datagram Protocol) para las actualizaciones (parmetro "-v"), lo que
proporciona un mejor rendimiento si son muchas las actualizaciones a realizar y mayor
seguridad ya que TCP es un protocolo orientado a conexin. Adems, una conexin TCP
tiene la posibilidad de ser dirigida (del ingls, piped) a travs de un canal (del ingls,
tunnel) SSH (del ingls, Secure SHell)para ms seguridad (encriptacin y control de
acceso).

9. La poltica de actualizaciones es una nueva caracterstica de Bind 9 que permite que las
actualizaciones se restrinjan a ciertos nombres especficos. Por ejemplo, para permitir que
un usuario de ADSL (del ingls, Asymmetric Digital Subscriber Line) o DHCP (del ingls,
Dynamic Host Configuration Protocol) pueda actualizar el nombre de su propio host (es
decir, aquellos a que cambian de direccin IP). Con esta poltica de actualizaciones, puede
configurarse una lista de claves por host y permitir a cada clave que actualice nicamente
el host o zona asociada.

Riesgos a los que expone un Bind inseguro


Es realmente necesario preocuparse tambin por el DNS? Bien, un DNS comprometido puede
exponerse a algunos riesgos interesantes:
1. Un atacante puede obtener informacin muy interesante si se permiten transferencias de
zonas: la lista completa de hosts y encaminadores (del ingls, routers) con sus direcciones
IP, nombres y, posiblemente, comentarios indicando su situacin, etc.

2. Denegacin de servicio (del ingls, Denial of service): si todos sus servidores de DNS
caen,
o

Su sitio web (del ingls, website) ya no es visible (los otros websites no pueden
traducir su direccin IP).

111

Los correos electrnicos ya no pueden ser enviados (algunos sitios en Internet con
los cuales se intercambia informacin a menudo habrn guardado en su cach los
registros de DNS, pero eso no durar ms que unos pocos das).

Un atacante podra inciar un falso servidor de DNS que finge ser el suyo y enva
informacin de DNS falsa a Internet acerca de su dominio. Es decir, prdida de
integridad - vese la siguiente seccin.

3. Prdida de integridad: si un atacante puede cambiar los datos del DNS o facilitar (mediante
spoofing) a otros sitios falsa informacin (esto se conoce como envenenamiento de DNS
(del ingls, DNS poisoning), la situacin se vuelve muy peliaguda:
o

Falsificar (del ingls, fake) su website, de manera que parezca el suyo, y capturar
las entradas de los usuarios que iban destinadas a su sitio, por lo que se estara
hablando de robar cualquier cosa, desde nombres de usuario (del ingls, logins) y
contraseas (en ingls, passwords) hasta nmeros de tarjetas de crdito.

Todo el correo podra ser redirigido a un servidor repetidor (del ingls, relay) que
podra copiar, cambiar o borrar correo antes de pasarlo a su sitio.

Si su cortafuegos (del ingls, firewall) o cualquier host accesible desde Internet usa
nombres de host de DNS (del ingls, DNS hostnames) para autenticarse o para
relaciones de confianza, stas pueden ser completamente comprometidas,
especialmente si un dbil filtro de paquetes es quien protege los servidores de
Internet y la Intranet. Imagine un proxy web configurado para permitir peticiones
proxy slo desde *.midominio.com. El atacante aade su host al dominio, por lo
que el proxy web pasa a permitir peticiones que provengan de l, permitiendo al
atacante acceso por HTTP a la Intranet. Imagine un administrador de sistemas que
usa SSH (gran invento criptogrfico), pero los hosts cortafuegos tienen un .shosts
confiando en admin.midominio.com, donde admin es la estacin de trabajo del
administrador. Si el atacante puede sustituir la entrada para admin.midominio.com
en el DNS, pasa a tener un acceso libre y sin necesidad de contrasea a los hosts
del cortafuegos.

El DNS se ha convertido en el objetivo favorito de los hackers, como prueban las herramientas
para realizar ataques automticos y los gusanos que usan los fallos del DNS que aparecieron
durante el invierno de 2001.

Entonces, qu medidas es necesario tomar?


Los riesgos de Bind pueden ser reducidos considerablemente con algunas medidas de prevencin:
1. Aislamiento de los recursos: use un servidor dedicado y asegurado para el DNS de
Internet, no lo comparta con otros servicios y, especialmente, no permita el acceso remoto

112

de usuario. Minimizar los servicios y usuarios significa reducir la cantidad de software


ejecutndose y, por lo tanto, la probabilidad de exponerse a ataques de red. La separacin
previene contra la posibilidad de que otros servicios o usuarios localicen debilidades en el
sistema y las usen para atacar a Bind.

2. Redundancia: instale un secundario en una conexin a Internet diferente (rama alejada de


su empresa, otro ISP, etc.). Si su sitio cae, al menos el resto de sitios no pensarn que
usted ha "dejado de existir", sino que tan slo creern que "no est disponible", por lo que,
por ejemplo, sus emails no se perdern sino que entrarn en una cola de espera
(tpicamente de hasta cuatro das).

3. Use la ltima versin.

4. Control del acceso: restrinja la transferencia de zonas para minimizar la cantidad de


informacin que est disponible en su red para los atacantes. Considere el uso de
transacciones firmadas. Considere restringir o no permitir las consultas recursivas.

5. Ejecute Bind con los mnimos privilegios: como usuario no root, con una umask muy
restrictiva (por ejemplo, 177).

6. Mayor aislacin de recursos: ejecute Bind en un entorno (del ingls, jail) chroot, de modo
que sea mucho ms difcil que un demonio Bind comprometido dae el sistema operativo o
comprometa otros servicios.

7. Configure Bind para que no informe de su versin. Algunas personas no creen en esta
medida, pues es "seguridad por ocultacin", pero entienda que, al menos, ayudar contra
jovencillos con scripts que rastrean la red buscando objetivos obvios. Defenderse de los
profesionales es otro asunto.

8. Deteccin: monitorice los logs buscando actividad inusual y cambios no autorizados en el


sistema mediante un analizador de integridad.

9. Mantngase continuamente al da de las novedades y asegrese que se le notifica la


salida de nuevos problemas de Bind en un tiempo razonable.

113

SERVIDORES RECURSIVOS Y NO RECURSIVOS

Los servidores de nombres pueden actuar recursivamente o no permitirla. Si un servidor no


recursivo tiene la respuesta a una peticin cacheada de una transaccin previa o es el autorizado
del dominio al cual la consulta pertenece, entonces proporciona la respuesta apropiada. De otro
modo, en lugar de devolver una contestacin real, devuelve una referencia al servidor autorizado
de otro dominio que sea ms capaz de saber la respuesta. Un cliente de un servidor no recursivo
debe estar preparado para aceptar referencias y actuar en consecuencia.

Aunque los servidores no recursivos puedan parecer perezosos, tienen habitualmente un buen
motivo para deshacerse del trabajo extra. Los servidores raz y los servidores de ms alto nivel son
todos no recursivos, pero es que 10.000 consultas por segundo bien son una excusa para serlo.
Un servidor recursivo devuelve nicamente respuestas reales o mensajes de error. Se encarga de
seguir las referencias por si mismo, descargando al cliente de esa tarea.

El procedimiento bsico para traducir una consulta es, esencialmente, el mismo; la nica diferencia
es que el servidor de nombres se preocupa de de hacerse cargo de las referencias en lugar de
devolverlas al cliente.

LOCALIZACIN DE SERVICIOS

Un registro SRV especifica la localizacin de los servicios ofrecidos por un dominio. Por ejemplo, el
registro SRV permite consultar un dominio remoto directamente y preguntarle por el nombre de su
servidor FTP. Hasta ahora, en la mayora de ocasiones, haba que probar suerte. Para contactar el
servidor FTP de un dominio remoto, uno esperaba que el administrador de sistemas de ese
dominio hubiese seguido el estndar (el gusto mejor dicho) actual y tuviese un CNAME para ftp en
su servidor de DNS.

Los registros SRV adquieren mucha importancia en este tipo de consultas y son realmente una
mejor manera para los administradores de sistemas de trasladar servicios y controlar su uso. Sin
embargo, deben ser solicitados y analizados explcitamente por los clientes, por lo que sus efectos
se irn viendo gradualmente a medida que pase el tiempo.

Los registros SRV se parecen a registros MX generalizados con campos que permiten al
administrador local guiar y balancear la carga de las conexiones provenientes del mundo exterior.
El formato es
servicio.proto.nombre [ttl] IN SRV pri wt puerto destino

114

Donde servicio es uno de los servicios definidos en la base de datos de nmeros asignada por la
IANA, proto puede ser tcp o udp, nombre es el dominio al cual el servicio hace referencia, pri es
una prioridad al estilo de los registros MX, wt es el peso usado para balancear la carga entre
diferentes servidores, puerto es el puerto en el cual el servicio escucha, y destino es el nombre de
host del servidor en el cual se provee ese servicio.

El registro A del destino habitualmente es devuelto de forma automtica junto a la respuesta


envada a una consulta SRV. Un valor "0" para el parmetro wt significa que no se realiza ningn
tipo especial de balanceo de carga. Un valor de "." para el destino significa que el servicio no se
ejecuta en ese sitio.

En la zona linuxsilo.net del ejemplo, adaptado del RFC2052 (donde se define SRV), se tiene lo
siguiente:
ftp.tcp

SRV

21 ftp.linuxsilo.net.

ssh.tcp

SRV

22 linuxsilo.net.

telnet.tcp

SRV

23 linuxsilo.net.

smtp.tcp

SRV

3/4

de

http.tcp

SRV

http.tcp

SRV

que

para

http.tcp.www

SRV

http.tcp.www

SRV

las

conexiones

al

25 smtp.linuxsilo.net.

principal,

al

funcionen

1/4

80 linuxsilo.net.

tanto

80 ns2.linuxsilo.net.

http://www.linuxsilo.net

como

secundario

http://linuxsilo.net
80 linuxsilo.net.

80 ns2.linuxsilo.net.

; servidor principal en el puerto 443, secundario - en caso de fallo - en otra mquina y otro puerto
https.tcp

SRV

https.tcp

SRV

1
2

https.tcp.www SRV

*.tcp
*.udp

SRV 0 0 0

443 linuxsilo.net.

SRV

ns2.linuxsilo.net.

SRV

443 linuxsilo.net.
4443

https.tcp.www SRV
pop3s.tcp

443 ns2.linuxsilo.net.

995 pop3.linuxsilo.net.

Este ejemplo ilustra el uso tanto el parmetro wt (del ingls, weigth) para HTTP como el parmetro
de prioridad para HTTPS. Ambos servidores HTTP sern usados, dividindose el trabajo entre

115

ellos. El servidor secundario ns2.linuxsilo.net slo ser usado para HTTPS cuando el principal no
est disponible. Todos los servicios no especificados estn excluidos. El hecho de que el demonio
de, por ejemplo, finger no aparezca en el DNS no signifia que no se est ejecutando, sino tan slo
que no se podr localizar ese servicio a travs de DNS.

Microsoft usa los registros SRV estndar en Windows 2000, pero los inserta en el sistema de DNS
de una manera incompatible e indocumentada.

TIPOS DE REGISTROS DEL DNS

Zona

Bsicos

Seguridad

Tipo

Nombre

Funcin

SOA

Start Of Authority

Define una zona representativa del DNS

NS

Name Server

Identifica los
subdominios

Direccin IPv4

Traduccin de nombre a direccin

AAAA

Direccin
original

A6

Direccin IPv6

Traduccin de nombre a direccin IPv6

PTR

Puntero

Traduccin de direccin a nombre

IPv6

servidores

de

zona,

delega

Actualmente obsoleto

DNAME Redireccin

Redireccin para las traducciones inversas IPv6

MX

Mail eXchanger

Controla el enrutado del correo

KEY

Clave pblica

Clave pblica para un nombre de DNS

NXT

Next

Se usa junto a DNSSEC para las respuestas


negativas

SIG

Signature

Zona autenticada/firmada

Opcionales CNAME Canonical Name

Nicks o alias para un dominio

LOC

Localizacin

Localizacin geogrfica y extensin

RP

Persona responsable

Especifica la persona de contacto de cada host

SRV

Servicios

Proporciona la localizacin de servicios conocidos

TXT

Texto

Comentarios o informacin sin cifrar

116

VISTAS

Las vistas (del ingls, views) son una nueva caracterstica de Bind 9 que permite mostrar a las
mquinas internas una visin distinta de la jerarqua de nombres de DNS de la que se ve desde el
exterior (se entiende "interior" y "exterior" respecto del router que da salida a la empresa a
Internet). Por ejemplo, le permite revelar todos los hosts a los usuarios internos pero restringir la
vista externa a unos pocos servidores de confianza.

O podra ofrecer los mismos hosts en ambas vistas pero proporcionar registros adicionales (o
diferentes) a los usuarios internos.

Este tipo de configuracin (llamada en ocasiones "DNS partido", del ingls "split DNS") se est
haciendo muy popular. En el pasado, se implementaba configurando servidores separados para las
versiones interna y externa de la realidad. Los clientes locales apuntaban a los servidores de
distribucin que contenan la versin interna de la zona, mientras que los registros NS de la zona
padre apuntaban a servidores que corran la versin externa.

La sentencia view de Bind 9 simplifica la configuracin permitiendo tener juntos ambos conjuntos
de datos en la misma copia de named. named busca correspondencias en listas de direcciones
para adivinar qu clientes deben recibir qu datos.

La sentencia view empaqueta un lista de acceso que controla quin ve la vista, algunas opciones
que se aplican a todas las zonas en la vista y, finalmente, las propias zonas. La sintaxis es:
view
match-clients

"nombre-de-la-vista"
{

address_match_list;

{
};

opcion-de-vista;

...

sentencia-de-zona;

...

};

La clusula match-clients controla quin puede ver la vista. Las vistas son procesadas en orden
secuencial, por lo que las ms restrictivas deben ir primero. Las zonas en distintas vistas pueden
tener el mismo nombre. Las vistas son una proposicin de todo o nada; si las usa, todas las
sentencias zone en su fichero named.conf deben aparecer dentro del contexto de una vista.

Este es el ejemplo para los dominios linuxsilo.net y balearikus-party.org, creado a partir de la


documentacin de Bind 9 que sigue el esquema de DNS partido descrito ms arriba. Las dos vistas
definen ambas zonas, pero con diferentes registros.

117

acl

"lan"

192.168.0.0/24;
};

//

View

for

all

computers

view

on

local

area

network

"internal"

match-clients

lan;

};

recursion

//

be

yes;

authoritative

//

for

broadcast

//

prime

the

the

localhost

forward

zones

server

and

as

with

per

knowledge

zone

reverse

zones,
RFC

of

the

root

"."

and

for
1912

servers

type

hint;

file

"/etc/bind/db.root";

};

//

Resto

de

zonas

inversas

zone

por

defecto

omitidas

"38.127.217.in-addr.arpa"

para

abreviar

type

master;

file

"/etc/bind/db.217.127.38";

allow-transfer

slaves;

};

};

zone

"79.96.213.in-addr.arpa"

type

slave;

file
masters

"sec.db.213.96.79";
{

213.96.79.79;

};

};

zone

"0.168.192.in-addr.arpa"

type

{
master;

file

"/etc/bind/db.192.168.0";

};

118

//

add

entries

for

zone

other

zones

below

here

"balearikus-party.org"

type

master;

file

"/etc/bind/db.balearikus-party.org.internal";

};

zone

"linuxsilo.net"

type

master;

file

"/etc/bind/db.linuxsilo.net.internal";

};

};

//

View

for

all

computers

view

outside

the

local

area

network

"external"

match-clients

any;

};

recursion

//

be

no;

authoritative

//

for

broadcast

//

prime

the

the

localhost

forward

zones

server

and

as

with

per

knowledge

zone

reverse

zones,
RFC

of

the

root

"."

and

for
1912

servers

type

hint;

file

"/etc/bind/db.root";

};

//

Resto

zone

de

zonas

inversas

por

defecto

omitidas

"38.127.217.in-addr.arpa"

abreviar

type

master;

file
allow-transfer

para

"/etc/bind/db.217.127.38";
{

slaves;

};

119

};

zone

"79.96.213.in-addr.arpa"

type

slave;

file

"sec.db.213.96.79";

masters

213.96.79.79;

};

};

//

add

entries

for

zone

other

zones

below

"balearikus-party.org"

here

type

master;

file

"/etc/bind/db.balearikus-party.org";

allow-query

any;

};

allow-transfer

slaves;

};

};

zone

"clan-bin.org"

type

master;

file

"/etc/bind/db.clan-bin.org";

allow-query

any;

};

allow-transfer

slaves;

};

};
};

La red local interna es 192.168.0.0, de aqu que se use una lista de acceso que engloba a
cualquier host que sea de esa red (red 192.168.0.0, mscara 255.255.255.0, especificada como
suma de unos binarios, es decir, 24). Esta nueva situacin nos lleva a precisar una nueva
definicin de zona inversa, la correspondiente a la red local 0.168.192.in-addr.arpa, que se muestra
a continuacin:
;
;

BIND

reverse

data

file

for

zone

192.168.0

;
$TTL
@

604800
IN

SOA

linuxsilo.net.

hostmaster.linuxsilo.net.

2001081501 ;

Serial

10800 ;

Refresh

7200 ;

Retry

1296000 ;

(3
(2

Expire

(15

120

hours)
hours)
days)

172800

Negative

Cache

TTL

(2

days)

@ IN NS ns1.linuxsilo.net.

1 IN PTR ns1.linuxsilo.net.
Ntese que, ahora, las zonas inversas, tanto las que se proporcionan con la instalacin por defecto
para el funcionamiento bsico como las definidas por el administrador, se reparten adecuadamente
entre ambas vistas. En cambio, las zonas directas son duplicadas, una ocurrencia para cada vista.
Por supuesto, los ficheros de zona apuntados contienen registros distintos, en consonancia con la
vista. Acto seguido se facilitan los registros de los ficheros de zonas directas internas (las externas
se mantienen igual, por lo que son vlidas las expuestas anteriormente en este artculo).
;
;

BIND

data

file

for

zone

balearikus-party.org,

internal

view

;
$TTL

604800

IN

SOA

balearikus-party.org.

2002051001 ;

Serial

10800 ;

Refresh

7200 ;

Retry

1296000 ;
)

(3

hours)

(15
Cache

IN

balearikus-party.org.

hours)

(2

Negative

balearikus-party.org.

NS

IN

days)
TTL(2

days)

ns1.linuxsilo.net.

MX

IN

ns1.linuxsilo.net.

balearikus-party.org.

127.0.0.1

IN

www IN

yyyy/mm/dd/id

Expire

172800

localhost

hostmaster.linuxsilo.net.

192.168.0.1

192.168.0.1

pop3

IN

192.168.0.1

smtp

IN

192.168.0.1

ftp IN

192.168.0.1

;
;

BIND

data

file

for

zone

linuxsilo.net,

internal

view

;
$TTL
@

604800
IN

SOA

linuxsilo.net.

121

hostmaster.linuxsilo.net.

2002051001 ;

Serial

10800 ;

Refresh

7200 ;

Retry

1296000 ;
172800

(3

hours)

(2

Expire
)

yyyy/mm/dd/id

hours)

(15

Negative

Cache

days)
TTL(2

NS

days)

ns1.linuxsilo.net.

MX

localhost

ns1.linuxsilo.net.

127.0.0.1

linuxsilo.net.

192.168.0.1

ns1

192.168.0.1

ns2

213.96.79.79

www

192.168.0.1

pop3

192.168.0.1

smtp

192.168.0.1

ftp

192.168.0.1

ts

213.96.79.79

akane

192.168.0.1

ranma

192.168.0.6

genma

192.168.0.5

kasumi

192.168.0.4

nabiki

213.96.79.79

primetime A 192.168.0.3

LA HERRAMIENTA RNDC

El comando rndc es una til herramienta para manipular named. La siguiente tabla muestra
algunas de las opciones que acepta. Los parmetros que provocan la creacin de ficheros lo harn
en el directorio especificado como home de named en el /etc/bind/named.conf (clusula directory,
cuyo valor por defecto es /var/cache/bind en Debian).
Comando

Funcin

help

Lista los opciones de rndc disponibles

status

Muestra el estado actual del named en ejecucin

122

trace

Incrementa el nivel de depuracin en 1

notrace

Desactiva la depuracin

dumpdb

Vuelca la base de datos de DNS a named_dump.db

stats

Vuelca estadsticas a named.stats

reload

Recarga named.conf y los ficheros de zonas

reload zona Recarga slo la zona especificada


restart

Reinicia named, vaciando la cach

querylog

Activa el seguimiento de las consultas entrantes

Rndc usa el puerto 953 UDP para el control remoto. Si se siguen las pautas mostradas en este
artculo, no es necesario que ese puerto sea accesible desde el exterior - configurarlo en el router pues el control se har siempre desde el host local y las transferencias de zonas se realizan por el
puerto 53 TCP

PERSONALIZACIN DE LOS LOGS

Los logs en Bind se configuran con la sentencia logging en el named.conf. Primero se definen
canales, que son los posibles destinos de los mensajes. Luego se les dice a varias categors de
mensajes que vayan a un canal particular.
Trmino

Significado

canal

Un lugar a donde los mensajes pueden ir: syslog, un fichero o /dev/null

categora

mdulo

lugar

Una clase de mensajes que Bind puede generar; por ejemplo, mensajes sobre
actualizaciones dinmicas o mensajes acerca de respuestas a consultas
El nombre del mdulo de origen que genera un mensaje
El nombre de un lugar syslog. DNS no tiene su propio destino, por lo que tendrn que
escogerse el estndar.

importancia Lo "malo" que es un mensaje de error; a lo que syslog se refiere como prioridad
Cuando se genera un mensaje, se le asigna una categora, un mdulo y una importancia en su
punto de origen. Despus es distribuido a todos los canales asociados con esa categora y mdulo.
Cada canal tiene un filtro de importancia que define qu nivel de importancia debe tener un

123

mensaje para pasar. Los canales que llevan al syslog tambin son filtrados de acuerdo a las reglas
del /etc/syslog.conf.

Este es el esqueleto de una sentencia logging:


logging

definicin_de_canal;
definicin_de_canal;
...
category

nombre_categora

nombre_canal;
nombre_canal;
...
};
};

Una definicin_de_canal es ligeramente diferente dependiendo de si el canal es un fichero o un


canal syslog. Se debe elegir file o syslog para cada canal; un canal no puede ser ambas cosas a la
vez.
channel
file

"nombre_del_canal"
ruta

[versions

nmvers

unlimited]

syslog

[size

sizespec];
facility;

severity

importancia;

print-category

yes

no;

print-severity

yes

no;

print-time

yes

no;

};

En un fichero, nmvers especifica cuntas versiones de copia de un fichero guardar, y sizespec


dice lo grandes que pueden llegar a ser esos ficheros (por ejemplo, 2048, 100k, 20m, 15g,
unlimited, default).

En el caso de syslog, facility especifica que nombre de lugar usar al guardar el mensaje. Puede ser
cualquiera de los estndar. En la prctica, slo daemon y de local0 a local7 son elecciones
razonables.

El resto de sentencias en una definicin de canal son opcionales. Importancia puede tomar los
valores (en orden descendente) critical, error, warning, notice, info o debug (con un nivel numrico

124

opcional, por ejemplo severity debug 3). El valor dynamic tambin es vlido y representa el nivel de
depuracin actual del servidor.

Las diversas opciones print aaden o suprimen prefijos del mensaje. El syslog incluye la fecha y
hora y el host de origen en cada mensaje guardado, pero no la importancia o la categora. En Bind
9, el fichero de origen (mdulo) que gener el mensaje tambin est disponible como opcin print.
Adquiere sentido entonces activar print-time slo para canales fichero, pues los registros del syslog
ponen la fecha y hora ellos solos.

A continuacin se listan los cuatro canales predefinidos por defecto, que debern ser suficiente
para la mayora de casos:
Nombre del canal Lo que hace
default_syslog

Manda importancia info al syslog con el destino daemon

default_debug

Guarda en el fichero named.run, importancia puesta a dynamic

default_stderr

Manda mensajes a la salida de error estndar de named, importancia info

null

Se descartan todos los mensajes

La configuracin de logging por defecto de Bind 9 es:


logging

category

default

default_syslog;
default_debug;
};
};

Debera echar un vistazo a los ficheros log cuando haga grandes cambios en Bind, y quizs
incrementar el nivel de depuracin. Entonces, reconfigrelo para preservar nicamente mensajes
importantes una vez named est estable. Algunos de los mensajes de log ms comunes se listan a
continuacin:

Lame server. Si recibe este mensaje acerca de una de sus zonas es que ha configurado
mal alguna cosa. El mensaje es relativamente poco importante si es sobre alguna zona en
Internet, pues significa que es problema de algn otro.

Bad referral. Este mensaje indica una descoordinacn en la comunicacin entre los
servidores de nombres de una zona.

125

Not authoritative for. Un servidor esclavo no es capaz de obtener informacin


representativa de una zona. Quizs est apuntando al maestro equivocado o quizs el
maestro ha tenido algn problema cargando esa zona.

Rejected zone. named rechaz esa zona porque contena errores.

No NS RRs found. El fichero de una zona no tiene registros NS tras el registro SOA. Podra
ser que no estn o que no empiezan con un tabulador o un espacio en blanco. En este
ltimo caso, los registros no se interpretan correctamente.

No default TTL set.. La mejor manera de establecer el TTL por defecto es con una clusula
$TTL al principio del fichero de la zona. Este mensaje de error indica que el $TTL no est
presente.

No root name server for class. Su servidor est teniendo problemas para encontrar los
servidores raz. Compruebe su fichero /etc/bind/db.root y la conexin a Internet de su
servidor.

Address already in use. El puerto en el que named quiere ejecutarse ya est siendo usado
por otro proceso, probablemente otra copia de named. Si no ve otra copia de named en
memoria, podra haberse colgado, dejando el socket de control de rndc abierto.

TAXONOMA DE UN SERVIDOR DE NOMBRES

Tipo de servidor

Descripcin

Ingls

Espaol

authoritative

autorizado

Un representante oficial de una zona.

master

maestro

El repositorio principal de los datos de una zona; lee los datos


de ficheros del disco.

slave

esclavo

Obtiene los datos del maestro.

stub

N/A

Parecido a un esclavo, pero slo copia los datos del servidor


de nombres (no los datos del equipo).

distribution

distribucin

Un servidor que slo es visible


(un "servidor oculto").

no autorizado

Responde una consulta a partir de su cach; desconoce si los


datos son an vlidos.

caching

reserva

Guarda los datos de consultas previas; habitualmente no


tiene zonas locales.

forwarder

redireccionador

Realiza consultas en nombre de muchos clientes; mantiene


una cach grande.

recursive

recursivo

Consulta en su nombre hasta que devuelve una respuesta o


un error.

nonauthoritative

(b)

126

(a)

desde dentro de un dominio

nonrecursive

Le pasa a otro servidor si no es capaz de responder a la


consulta.

no recursivo

a. Un servidor de distribucin puede ser visible por cualquiera que conozca su direccin IP.
b. Hablando estrictamente, "no autorizado" es un atributo de la respuesta a una consulta DNS, no
de un servidor.

Tipos de sentencias usadas en el named.conf


Sentencia

Descripcin

include

Interpola un fichero (p.e., claves de confianza accesibles slo por named).


Establece opciones globales de configuracin del servidor de nombres y valores por

options

defecto.

server

Especifica opciones preservidor.

key

Define informacin de autenticacin.

acl

Define listas de control de acceso.

zone

Define una zona de registro de recursos.

trusted-

Usa claves previamente configuradas.

keys
controls

Define canales utilizados para controlar el servidor de nombres con rndc.

logging

Especifica categoras de logs y sus destinos.

view

Define una vista de un espacio de nombres.

Ejemplo de personalizacin de logs


//

Definimos

//

syslog,

//

tres

canales

depuracin
luego

les

media

de
y

logs
mensajes

asignamos

de

categoras

logging
channel

(mensajes

importantes
carga
a

del

de

zonas)

cada

uno.
{

syslog_errors

syslog

{
local1;

severity

error;

};
channel

moderate_debug

127

severity

debug

3;

file

"debug.log";

//

print-time

yes;

print-category

//

nivel

el

imprimir

de

depuracin

fichero

actual

imprimir

yes; //

al

fecha

yes; //

print-severity

//

las

entradas

nombre
el

debug.log

de

nivel

del
la

de

log

categora
gravedad

};
channel

no_info_messages

syslog

local2;

severity

notice;

};
category

parser

syslog_errors;
default_syslog;
};
category

lame-servers

category

null;

}; //

load

No

guardar

category

este

tipo

en

no_info_messages;
default

default_syslog;
moderate_debug;
};
};

Tabla de caracteres especiales utilizados en los registros de recursos


Caracter Significado
;

Introduce un comentario

El nombre de dominio actual

()

Permite partir una sentencia en ms de una lnea

Comodn (slo en el nombre del campo).

Tabla de mecanismos de seguridad en el named.conf


Caracterstica Sentencias

Qu especifica

allow-query

options, zone Quin puede consultar la zona o servidor.

allow-transfer

options, zone Quin puede solicitar transferencias de zonas.

128

los

logs
};
{

allow-update

zone

Quin puede hacer actualizaciones dinmicas.

blackhole

options

Qu servidores deben ignorarse completamente.

bogus

server

Qu servidores no deben ser jams consultados.

acl

varios

Listas de control de acceso.

Tabla de categoras de logging en Bind 9


Categora

Qu incluye

default

Categors sin una asignacin explcita de canal.

general

Mensajes sin clasificar.

config

Anlisis y procesado de ficheros de configuracin.

queries/client

Un mensaje corto de log por cada consulta que el servidor recibe.

dnssec

Mensajes de DNSSEC.

lame-servers

Servidores que se supone que sirven una zona, pero no lo estn .

statistics

Estadsticas agrupadas del servidor de nombres.

panic

Errores fatales (duplicados en esta categora).

update

Mensajes sobre actualizaciones dinmicas.

ncache

Mensajes sobre cach negativa.

xfer-in

Transferencias de zonas que el servidor est recibiendo.

xfer-out

Transferencias de zonas que el servidor est enviando.

db/database

Mensajes sobre operaciones con bases de datos.

packet

Volcados de paquetes recibidos y enviados .

notify

Mensajes acerca del protocolo de notificaciones "zona modificada".

cname

Mensajes del tipo "...points to a CNAME".

security

Peticiones aprobadas/denegadas.

os

Problemas del sistema operativo.

(a)

(b)

129

insist

Comprobaciones de fallos de consistencia interna.

maintenance

Sucesos peridicos de mantenimiento.

load

Mensajes de carga de zonas.

response-checks Comentarios sobre paquetes de respuesta malformados o invlidos.


resolver

Traduccin de DNS, p.e., bsquedas recursivas para clientes.

network

Operaciones de red.

a. Bien la zona padre o bien la zona hija podran ser la culpable; es imposible determinarlo sin
investigarlo.
b. Obligatoriamente debe ser un canal simple.

CHROOT

Este apartado describe algunas precauciones extras relacionadas con la seguridad que puede
usted tomar al instalar BIND. Se explica cmo configurar BIND de manera que resida en una jaula
chroot, lo que significa que no pueda ver o acceder a ficheros fuera de su propio reducido rbol de
directorios. Tambin se explica cmo configurarlo para que se ejecute como un usuario diferente a
root.

La idea que hay detrs de un chroot es bastante sencilla: acotar el acceso que un individuo
malicioso pueda obtener explotando vulnerabilidades de BIND. Por esa misma razn es bueno
ejecutarlo como un usuario no root (en GNU/Debian Linux a partir de la versin 9.2.4-5). Cuando
se ejecuta BIND (o cualquier otro proceso) en una jaula chroot, el proceso simplemente es incapaz
de ver cualquier otra parte del sistema de ficheros que se encuentre fuera de la jaula.

Por ejemplo, en este apartado configuraremos BIND en modo chroot en el directorio /var/lib/named.
Entonces, para BIND, el contenido de este directorio ser la raz /. Nada fuera de este directorio le
ser accesible. Muy probablemente ya se ha encontrado usted ante una jaula chroot con
anterioridad, por ejemplo al acceder mediante FTP a un sistema pblico.

Este proceso debera considerarse un complemento de las precauciones de seguridad habituales


(ejecutar la ltima versin, usar listas de control de acceso, etc.), y nunca como una manera de
reemplazarlas.

130

Crear el usuario
Tal y como se menciona en la introduccin, no es una buena idea ejecutar BIND como root. Por
ello, antes de empezar, se crear un usuario separado para BIND. Ntese que nunca debera
usarse un usuario genrico existente del tipo nobody para este propsito. Este proceso es
realizado automticamente por el script de instalacin del paquete Debian, pero a continuacin se
resume el procedimiento manual para conseguirlo.

Es necesario aadir una lnea parecida a esta en el fichero /etc/passwd:


bind:x:103:103::/var/cache/bind:/bin/false

Y una similar a la siguiente en el fichero /etc/group:


bind:x:103:

En este ejemplo no slo vamos a ejecutar BIND como un usuario no root, sino que tambin lo
haremos en un entorno chroot (la instalacin por defecto en Debian nicamente cubre el primer
aspecto en la actualidad).

Estas lneas crean un usuario y un grupo llamados bind para BIND. El lector debe asegurarse de
que tanto el UID (del ingls, User Identifier) como el GID (del ingls, Group Identifier) son nicos en
su sistema (ambos 103 en este ejemplo). La consola se ha dejado en /bin/false porque este
usuario jams tendr necesidad de hacer un login.

Estructura de directorios

Acto seguido es necesario crear una estructura de directorios para la jaula chroot en la cual se
ejecutar BIND. Puede hacerse en cualquier lugar del sistema de ficheros; aquellos ms
paranoicos incluso querrn ponerlo en un volumen separado. Se usar /var/lib/named. Empiece
por crear la siguiente estructura de directorios:
/var/lib/
+---

named
+---

dev

+---

etc

+---

var
+---

run

+---

cache
+---

bind

131

+---

usr
+--- sbin

Mediante el comando mkdir podra crearse la mencionada estructura de directorios. Estos son los
comandos a ejecutar y sus parmetros:
#

mkdir

-p

/var/lib/named

cd

/var/lib/named

# mkdir -p dev etc/bind var/run var/cache/bind usr/sbin

Copiar los ficheros necesarios


Asumiendo que usted ya ha realizado una instalacin estndar de BIND 9 y que lo est usando,
tendr, por lo tanto, un fichero named.conf y diversos ficheros de zonas. Esos ficheros deben ser
movidos (o copiados, para mayor seguridad) dentro de la jaula chroot, de modo que BIND sea
capaz de encontrarlos. named.conf y los ficheros de zonas van dentro de /var/lib/named/etc/bind.
Por ejemplo:
#
#

cp

-p

cp

-a

/etc/bind/*
/var/cache/bind/*

/var/lib/named/etc/bind/
/var/lib/named/var/cache/bind/

# cp /usr/sbin/named /var/lib/named/usr/sbin/

Adems, ser preciso copiar tambin las librers que el ejecutable /usr/sbin/named necesita, que
pueden obtenerse ejecutando el comando ldd /usr/sbin/named. Con los siguientes comandos
crearemos los subdirectorios necesarios y copiaremos las librers:
#
#

cd
mkdir

/var/lib/named
-p

usr/lib

lib

cp

/usr/lib/liblwres.so.1

usr/lib/

cp

/usr/lib/libdns.so.5

usr/lib/

cp

/usr/lib/libcrypto.so.0.9.6

usr/lib/

cp

/usr/lib/libisccfg.so.0

usr/lib/

cp

/usr/lib/libisccc.so.0

usr/lib/

/usr/lib/libisc.so.4

usr/lib/

#
#
#

cp
cp

/lib/libnsl.so.1

cp

/lib/libpthread.so.0

lib/
lib/

cp

/lib/libc.so.6

lib/

cp

/lib/libdl.so.2

lib/

# cp /lib/ld-linux.so.2 lib/

BIND va a necesitar escribir dentro de los subdirectorios /var/lib/named/var/cache/bind y


/var/lib/named/var/run, en el primero para guardar las zonas de las cuales est actuando como

132

servidor esclavo y en el segundo para guardar informacin estadstica de su ejecucin. Por lo


tanto, es pertinente ejecutar las dos instrucciones siguientes:
#

chown

-R

bind:bind

/var/lib/named/var/cache/bind

# chown -R bind:bind /var/lib/named/var/run

Ficheros de sistema
Una vez que BIND est ejecutndose en la jaula chroot, no ser capaz de acceder a ficheros que
se encuentren fuera de la jaula de ningn modo. Sin embargo, necesita acceder a algunos ficheros
esenciales. Uno de los ficheros que necesita dentro de su jaula es /dev/null. Otros son /dev/zero y
/dev/random. Pueden usarse los siguientes comandos:
#

mknod

/var/lib/named/dev/null

mknod

/var/lib/named/dev/random

mknod

/var/lib/named/dev/zero

1
c

# chmod 666 /var/lib/named/dev/{null,random,zero}

Tambin ser necesario otro fichero en el directorio /etc dentro de la jaula. Es preciso copiar
/etc/localtime ah dentro de modo que BIND guarde los logs con fechas correctas. El siguiente
comando se resolvera el problema:
# cp /etc/localtime /var/lib/named/etc/

Logging
Normalmente, BIND guarda los logs a travs de syslogd, el demonio del sistema encargado de
guardar los logs. Sin embargo, este tipo de logging se lleva a cabo enviando las entradas del log a
un socket especial, /dev/log. Debido a que se encuentra fuera de la jaula, BIND no va a poder
usarlo. Afortunadamente, hay una solucin para este problema.

Todo lo que hay que hacer es aadir el parmetro -a /var/lib/named/dev/log a la lnea de comandos
que lanza el syslogd. En Debian, este script se encuentra en /etc/init.d/sysklogd. Debe buscar las
lneas siguientes:
#
#

Options
For

for
remote

start/restart
UDP

logging

#
SYSLOGD=""

Y cambiar la ltima de las lneas por esta:


SYSLOGD="-a /var/lib/named/dev/log"

133

the
use

daemons
SYSLOGD="-r"

Una vez reiniciado el demonio, debera ver un fichero en /var/lib/named/dev llamado log, tal que
as:
srw-rw-rw- 1 root root 0 Nov 28 14:22 log

Finalmente, remarcar que, en el caso de una actualizacin del paquete sysklogd, podran perderse
los cambios realizados en dicho script por una potencial sobreescritura del fichero existente. Por lo
tanto, se recomienda tener cuidado al actualizar.

Endureciendo los permisos

Antes de nada, sintase libre de restringir acceso en todo el directorio /var/lib/named nicamente al
usuario bind.
#

chown

bind:bind

/var/lib/named

# chmod 700 /var/lib/named

Si desea aumentar an ms las restricciones, en los sistemas Linux puede conseguirse la


inmutabilidad de algunos de los ficheros usando la herramienta chattr en los sistemas de ficheros
ext2 y ext3.
#

cd

/var/lib/named

# chattr +i etc etc/localtime var

Consulte la pgina del man para ms informacin: man chattr. Sera interesante poder hacer esto
mismo sobre el directorio dev pero, desgraciadamente, eso imposibilitara que el syslogd crease el
socket dev/log. Tambin puede elegir activar el bit de inmutabilidad en otros ficheros dentro de la
jaula, como los de las zonas primarias, en el caso de que no vayan a cambiar.

Instalacin
Si se desea realizar una instalacin a partir de los fuentes, se recomienda usar el paquete Debian
de fuentes bind9, disponible mediante el comando apt-get source bind9. Luego tan slo sera
necesario ejecutar un ./configure y un make o, ms fcil an, dpkg-buildpackage, que nos har los
dos pasos anteriores y nos dejar listos una serie de paquetes Debian que nos evitarn tener que
hacer un make install a mano.

Suponiendo que usted ya dispone de una instalacin de BIND 9 en su sistema, tan slo deber
modificar ligeramente el script de arranque del demonio para que use estos parmetros:
-u

bind,

que

le

indica

BIND

el

usuario

con

el

que

debe

ejecutarse.

-t /var/lib/named, que le dice a BIND que haga un chroot sobre s mismo dentro de la jaula que
se le ha preparado.

134

-c /etc/named.conf, que le dice a BIND dnde encontrar su fichero de configuracin dentro de la


jaula.

En Debian, es muy fcil cambiar el script de inicio de BIND, que encontrar en /etc/init.d/bind9,
para que acepte estas nuevas opciones. Tan slo debe buscar estas lneas:
#

for

chrooted

server:

"-u

nobody

-t

/var/lib/named"

OPTS=""

Y cambiar la ltima lnea por la siguiente:


OPTS="-u bind -t /var/lib/named -c etc/named.conf"

Cambie, por ltimo, el ejecutable que se llama desde ese script de /usr/sbin/named a
/var/lib/named/usr/sbin/named, de manera que sea el ejecutable de dentro de la jaula el que el
script llame y no el original.

Si su versin del paquete Debian de BIND9 es la 9.2.4-5 o superior, BIND se estar ejecutando
con el usuario bind y el UID/GID 103, por lo que puede saltarse los pasos referidos a la creacin
del usuario y el grupo y pasar directamente al enjaulamiento. Si la versin de su paquete es inferior
(en GNU/Debian Woody es la 9.2.4-4), entonces deber seguir todos los pasos.

Cambios en la configuracin
Deber usted tambin cambiar o aadir unas pocas opciones a su named.conf a fin de mantener
ciertos directorios en orden. En particular, debera aadir (o cambiar, si ya las tiene) las siguientes
directivas en la seccin de opciones:
directory

"/etc/bind";

pid-file

"/var/run/named.pid";

statistics-file "/var/run/named.stats";

Ya que este fichero va a ser ledo por el demonio named, todas las rutas van a ser, evidentemente,
relativas a la jaula chroot. En el momento de escribir esta parte del documento, BIND 9 no soporta
muchas de las estadsticas y ficheros de volcado que las versiones previas soportaban.

Presumiblemente, versiones posteriores s lo harn; si est ejecutando una de esas versiones,


quizs deba aadir algunas entradas adicionales para que BIND las escriba en el directorio /var/run
tambin.

135

Arrancando BIND
Ahora ya tan slo queda por hacer el paso ms elemental: arrancar de nuevo el demonio BIND.
Para ello, es preciso ejecutar el siguiente comando en una distribucin GNU/Debian Linux:
# /etc/init.d/bind start

Introduccion a DHCP#
DHCP (Dinamic Host Control Protocol)es un protocolo de red utilizado para asignar una serie de
configuraciones TCP/IP (direccion IP, nombre,dominio al que pertenece, routeador y servidor DNS)
a los equipos de una red de rea local LAN (Local Area Network).

Sin el uso de un servidor DHCP, cada direccin IP se tendria que configurar manualmente en cada
equipo y, si el equipo se mueve a otra subred, la IP del equipo seria diferente a la establecida
antes. El DHCP le permite al administrador supervisar y distribuir de forma centralizada las
direcciones IP necesarias y, automticamente, asignar y enviar una nueva IP si el equipo es
conectado en un lugar diferente de la red.

El protocolo DHCP incluye tres mtodos de asignacin de direcciones IP:

Asignacin manual: Asigna una direccin IP a un equipo determinado. Es mas


frecuentemente utilizado cuando se desea controlar la asignacion de direcciones IP a cada
equipo y asi evitar tambien , que se conecten equipos no identificados

Asignacin automtica: Asigna una direccin IP de forma permanente a un equipo. Se


suele utilizar cuando el nmero de equipos en la LAN no vara demasiado.

Asignacin dinmica: Este metodo hace uso de la reutilizacion de direcciones IP, tecnica
mediante la cual, el servidor dhcp reinicia las tarjetas de red cada cierto intervalo de
tiempo, asignando una nueva direccion IP a los equipos.

Requerimientos para la Instalacin de un DHCP


Procederemos a instalar nuestro servidor DHCP mediante la descarga de los siguientes paquetes
por lo que se recomienda que dichas descargas se hagan como root. Para ello teclearemos en
consola lo siguiente:
[localhost@localdomain ~]# yum install -y dhcp

Una vez que se halla descargado e instalado el dhcp, este creara su fichero de configuracion en la
siguiente ubicacin:
/etc/dhcpd.conf

136

Configuracion del fichero dhcpd.conf


El primer paso para configurar el servidor de DHCP sera editar el fichero dhcp.conf al cual le
aadiremos la informacin de nuestra LAN. El archivo de configuracin puede contener
tabulaciones o lneas en blanco adicionales para facilitar el formato. Las palabras clave no
distinguen entre maysculas y minsculas. Las lneas que empiezan con el simbolo numeral (#) se
consideran comentarios.

Consideremos el siguiente requirimiento:


Se requiere implementar un servidor DHCP que implemente los tres mtodos de asignacin de
direcciones IP. El servidor DHCP contara con dos tarejtas de red, las cuales tendran asignadas las
direcciones 192.168.1.5 y 192.168.2.5, el segmento de red sobre el cual actuara el servidor DHCP
es el 192.168.1.0, la submascara de red asignada sera la 255.255.255.0, asi mismo el servidor
DHCP servira como gateway el cual tendra asignada la misma direccion IP que el DHCP
(192.168.1.5), la direccion de broadcast asiganda sera la 192.168.1.255, el rango de direcciones IP
que asinara el servidor DHCP estar entre el rango de 192.168.1.7 192.168.1.100.
El diagrama de la red quedara de la siguiente manera

Parametros de configuracion
ignore client-updates
shared-network redLocal
subnet
netmask
option routers
option subnet-mask

Parametro que ignora las direcciones IP antes


asignadas
Parametro que describe las subredes que
compartiran la misma red fsica las cuales se
especifican dentro de esta declaracin
Segmento de subred sobre el cual actuara el dhcp
Mascara de red de la subred
Parametro que especifica mediante IP la ubicacin
del router
Mascara de red de la subred

137

option broadcast-address
option domain-name "tuDominio.com";

Parametro que especifica la IP de broadcast


Parametro que describe el nombre de tu dominio
Parametro que especifica mediante IP la ubicacin
option domain-name-servers
del DNS
Rango sobre el cual el DHCP asiganara direcciones
range
IP
Parametro que indica el tiempo entre cada nueva
default-lease-time
asignacion de IP a los equipos
Parametro que indica el tiempo de vigencia de la
max-lease-time
direccion IP para cada equipo
host nombreDeLaMaquina
Parametro que describe el nombre del equipo
Parametro que describe el nombre de la
option
host-name
computadora y el nombre de dominio asociado a la
"nombreDeLaMaquina.tuDominio.com"
misma
Parametro que describe la direccion MAC asociada
hardware ethernet
a la tarjeta ethernet del equipo
Parametro que describe la direccion IP destinada a
fixed-address
un equipo
Editaremos el fichero /etc/dhcpd.conf de tres maneras diferentes, esto con el fin de ejemplificar los
tres mtodos de asignacin de direcciones IP.

Asignacin manual
Abriremos una terminal y con la ayuda de vi editaremos el fichero dhcpd.conf
[localhost@localdomain ~]#vi /etc/dhcpd.conf
Una vez abierto el fichero deberemos aadir el siguiente contenido:
#
1. DHCP Server Configuration file.
2. see /usr/share/doc/dhcp/dhcpd.conf.sample
3.
ddns-update-style interim; ignore client-updates; shared-network redLocal{
subnet 192.168.2.0 netmask 255.255.255.0{ option routers 192.168.2.5; option subnet-mask
255.255.255.0; option broadcast-address 192.168.2.255; option domain-name "redLocal.com.";
option domain-name-servers 192.168.2.5;
}

host

maquina1{

00:1b:24:e2:d7:41;

option

host-name

fixed-address

"maquina1.redLocal.com";

192.168.2.10;

host

maquina2{

hardware
option

ethernet
host-name

"maquina2.redLocal.com"; hardware ethernet 00:2c:212:ef5:a7:13; fixed-address 192.168.2.11; } }}}


Lo hecho anteriormente hace que el servidor DHCP asigne a dos equipos de la red, las direcciones
IP que fueron anexadas en el fichero dhcp.conf .

138

Asignacin automatica
Abriremos una terminal y con la ayuda de vi editaremos el fichero dhcpd.conf
[localhost@localdomain ~]#vi /etc/dhcpd.conf
Una vez abierto el fichero deberemos aadir el siguiente contenido:
#
1. DHCP Server Configuration file.
2. see /usr/share/doc/dhcp/dhcpd.conf.sample
3.
ddns-update-style interim; ignore client-updates; shared-network factorcentos{ subnet 192.168.2.0
netmask 255.255.255.0{ option routers 192.168.2.5; option subnet-mask 255.255.255.0; option
broadcast-address 192.168.2.255; option domain-name "factorcentos.com.mx"; option domainname-servers 192.168.2.5; range 192.168.2.1 192.167.2.100; } }}}

Lo hecho anteriormente hace que el servidor DHCP asigne a dos equipos de la red, dos
direcciones IP aleatorias dentro del rango de 192.168.2.10 al 192.168.1.200

Asignacin dinamica
Abriremos una terminal y con la ayuda de vi editaremos el fichero dhcpd.conf
[localhost@localdomain ~]#vi /etc/dhcpd.conf
Una vez abierto el fichero deberemos aadir el siguiente contenido:
#
1. DHCP Server Configuration file.
2. see /usr/share/doc/dhcp/dhcpd.conf.sample

139

3. ddns-update-style interim; ignore client-updates; shared-network factorcentos{ subnet


192.168.2.0 netmask 255.255.255.0{ option routers 192.168.2.5; option subnet-mask
255.255.255.0;

option

broadcast-address

192.168.2.255;

option

domain-name

"factorcentos.com.mx"; option domain-name-servers 192.168.2.5; range 192.168.2.1


192.167.2.100; default-lease-time 21600; max-lease-time 43200; } }}}

Lo hecho anteriormente hace que el servidor DHCP asigne a dos equipos de la red, dos
direcciones IP aleatorias dentro del rango de 192.168.2.10 al 192.168.1.200 las cuales seran
renovadas cada cierto tiempo asignado de nuevo direcciones IP aleatorias dentro del rango de
192.168.2.10 al 192.168.1.200.

Levantando el servicio

Al terminar de editar todos los ficheros involucrados, solo bastar iniciar el servidor DHCP, el cual
podr inicializarse, detenerse o reinicializarse con el comando /etc/init.d de otra forma aadirlo
al arranque del sistema en un nivel o niveles de corrida en particular con el mandato chkconfig.

Para ejecutar por primera vez el servicio teclear en consola lo siguiente:


[localhost@localdomain ~]#/etc/init.d/dhcpd start
Para reiniciar el servicio:
[localhost@localdomain ~]#/etc/init.d/dhcpd restart
Para detener el servicio, utilice:
[localhost@localdomain ~]#/etc/init.d/dhcpd stop

140

DIRECTORIO CORPORATIVO (FREEIPA)

Instalacin FreeIPA en un mnimo de instalacin de CentOS


El objetivo es instalar FreeIPA que se utilizar como servidor de autenticacin y autorizacin de
Zimbra y Apache.

Entorno y Parmetro
El servidor IPA ser colocado dentro de una red local. En realidad, se debe colocar dentro de la red
en s, junto con otros servidores que no son accesibles desde Internet. Basado en esto se utilizarn
los siguientes parmetros:

La direccin IP del servidor FreeIPA ser 172.16.1.2/24.

El calificativo FQDN ser servidor.simulnet.com. Nota que este dominio sera el utilizado
por una intranet

El REALM de Kerberos ser SIMULNET.COM.

Para continuar con la instalcin del servidor es importante destacar que debe existir un servidor de
DNS instalado y configurado. Ambos servicios de DNS y FreeIPA pueden convivir en el mismo
servidor.

Instalacin de Software:
El primer paso es instalar el sistema operativo siendo recomendada cualquier distribucin de Linux
basada en Redhat. En nuestro caso lo haremos con CentOS:

yum install ipa-server bind bind-dyndb-ldap

Este comando instalar una gran cantidad de dependencias aproximadamente unos 190
megabytes de descarga.
Configuracin del Servidor:

Para comenzar el proceso de instalacin y configuracin debemos ejecutar el siguiente comando:

# ipa-server-install --help

Probando la instalacin:

kinit

Password for admin@SIMULNET.COM:

141

admin

El sistema les pedir la contrasea que fue introducida anteriormente en el proceso de instalacin.
Si todo sale bien pues simplemente saldrn al prompt de la consola.

Para chequear el ticket de Kerberos ejecutamos:

klist

Ticket

cache:

Default

Valid

FILE:/tmp/krb5cc_0

principal:

starting

admin@SIMULNET.COM

Expires

Service

principal

06/26/12 17:43:05 06/27/12 17:43:01 krbtgt/SIMULNET.COM@SIMULNET.COM

Si la salida del comando klist es semejante a esta entonces el servidor IPA est trabajando
correctamente.

SERVIDOR WEB APACHE

Arquitectura del servidor Apache


El servidor Apache es un software que esta estructurado en mdulos. La configuracin de cada
mdulo se hace mediante la configuracin de las directivas que estn contenidas dentro del
mdulo. Los mdulos del Apache se pueden clasificar en tres categoras:
Mdulos Base: Mdulo con las funciones bsicas del Apache
Mdulos Multiproceso: son los responsables de la unin con los puertos de la mquina,
acepando las peticiones y enviando a los hijos a atender a las peticiones
Mdulos Adicionales: Cualquier otro mdulo que le aada una funcionalidad al servidor.

Las funcionalidades ms elementales se encuentran en el mdulo base, siendo necesario un


mdulo multiproceso para manejar las peticiones. Se han diseado varios mdulos multiproceso
para cada uno de los sistemas operativos sobre los que se ejecuta el Apache, optimizando el
rendimiento y rapidez del cdigo.

El resto de funcionalidades del servidor se consiguen por medio de mdulos adicionales que se
pueden cargar. Para aadir un conjunto de utilidades al servidor, simplemente hay que aadirle un
mdulo, de forma que no es necesario volver a instalar el software.

142

Mdulos Base y Mdulos Multiproceso:


core: Funciones bsicas del Apache que estn siempre disponibles.
mpm_common: Coleccin de directivas que se implementan en ms de un mdulo multiproceso.
beos: Mdulo de multiproceso optimizado para BeOS.
leader: Variable experimental de MPM.
mpm_netware: Mdulo de multiproceso que implementa un servidor web optimizado para
Novell NetWare.
mpmt_os2: MPM hbrido, multiproceso y multihilo para OS/2 .
perchild: Mdulo multiproceso que permite a los procesos demonio servir las peticiones que se
asignan a distintos id de usuario.
prefork: Implementa un servidor sin hilos.
threadpool: Variante experimental del mdulo estndar de MPM .
mpm_winnt: Mdulo multiproceso optimizado para Windows NT.
worker: Mdulo multiproceso que implementa un hbrido multihilos y multiprocesos de servidor
Web.

Mdulos adicionales:
mod_access: proporciona control de acceso basndose en el nombre del host del cliente, su
direccin IP u otras caractersticas de la peticin del cliente.
mod_actions: este mdulo se utiliza para ejecutar Scripts CGI, basndose en el tipo de medio o el
mtodo de peticin.
mod_alias: proporcionado para mapear diferentes partes del sistema de ficheros del servidor en el
rbol de documentos del servidor, y para redireccin de URL's.
mod_asis: envo de ficheros que tienen sus propias cabeceras http.
mod_auth: autentificacin de usuario utilizando ficheros de texto.
mod_auth_anon: permite a usuarios annimos acceder a reas autentificadas.
mod_auth_dbm: proporciona autentificacin utilizando ficheros DBM.
mod_auth_digest: autentificacin de usuario utilizando MD5.
mod_auth_ldap: permite la utilizacin un directorio LDAP para almacenar la base de datos de
autentificacin.
mod_autoindex: muestra los contenidos de un directorio automticamente, parecido al comando
ls de Unix.
mod_cache: Cache de contenidos indexados por URI's.
mod_cern_meta: Semntica de etiquetas meta del CERN.
mod_cgi: Ejecucin de Scritps CGI.
mod_cgid: ejecucin de Scripts CGI utilizando un demonio CGI externo.
mod_charset_lite: para la especificacin del juego de caracteres de las traducciones.
mod_deflate: comprime el contenido antes de ser enviado al cliente.

143

mod_dir: Proporcionado para redirecciones y para servir los ficheros de listado de directorios.
mod_disk_cache: Cache para almacenar contenidos identificados por URI.
mod_echo: Un servidor simple de echo para ilustrar los mdulos del protocolo.
mod_env: modificacin del entorno que se envia a los scripts CGI y las pginas SSI.
mod_expires: Generacin de las cabeceras http Expires, de acuerdo de los criterios
especificados por el usuario.
mod_ext_filter: pasa el cuerpo de la respuesta a travs de un programa antes de envirsela
al cliente.
mod_file_cache: cachea una lista esttica de ficheros en memoria.
mod_headers: personalizacin de las peticiones HTTP y las cabeceras de las respuestas.
mod_imap: proceso de imgenes en el lado del servidor.
mod_include: Documentos HTML generados por el servidor (Server Side Includes).
mod_info: proporciona una visin comprensiva de la configuracin del servidor.
mod_isapi: Extensiones ISAPI en Apache para Windows.
mod_ldap: pool de conexiones LDAP y cacheo de resultados para la utilizacin de otros
mdulos LDAP.
mod_log_config: registro de las peticiones hechas al servidor.
mod_logio: registro del nmero de bytes recibidos y enviados en cada respuesta.
mod_mem_cache: Cache de contenidos identificados por URI.
mod_mime: asocia las extensiones de peticiones de los ficheros con el comportamiento del fichero
(manejadores y filtros) y contenido (tipos mime, idioma, juego de caracteres y codificacin).
mod_mime_magic: determina el tipo MIME de un fichero mirando unos pocos bytes del contenido.
mod_negotiation: se proporciona para la negociacin del contenido.
mod_proxy: servidor HTTP/1.1 proxy/gateway.
mod_proxy_connect: extensin de mod_proxy para la gestin de las peticiones CONNECT.
mod_proxy_ftp: soporte FTP para mod_proxy.
mod_proxy_http: soporte HTTP para el mdulo mod_proxy.
mod_rewrite: proporciona un motor de reescritura basado en reglas que rescribe las peticiones de
URL's al vuelo.
mod_setenvif: permite la configuracin de las variables de entorno basndose en las
caractersticas de la peticin.
mod_so: carga del cdigo ejecutable y los mdulos en al iniciar o reiniciar el servidor.
mod_speling: intenta corregir las URL mal puestas por los usuarios, ignorando las maysculas y
permitiendo hasta una falta.
mod_ssl: criptografa avanzada utilizando los protocolos Secure Sockets Layer y Transport
Layer Security.
mod_status: proporciona informacin en la actividad y rendimiento del servidor.
mod_suexec: permite a los scripts CGI ejecutarse con un nombre y grupo especfico.

144

mod_unique_id: proporciona variables de entorno y un identificador nico para cada peticin.


mod_userdir: directorios especficos para usuarios.
mod_usertrack: registro de actividad de un usuario en el sitio.
mod_vhost_alias: Proporcionado para configurar muchos servidores virtuales dinmicamente.

El fichero httpd.conf
El fichero httpd.conf es el fichero principal de configuracin del Apache, se encuentra dentro del
directorio Conf, en el directorio de instalacin del Apache.

En primer lugar hay que destacar que el fichero est dividido en tres secciones, que son:

1 Parmetros globales
2 Directivas de Funcionamiento
3 Host Virtuales

En el fichero se encuentran todos los parmetros de funcionamiento del Apache. Algunos


parmetros son generales para la instalacin y funcionamiento del Apache. Muchos otros de los
parmetros se pueden configurar independientes para un conjunto de directorios y/o ficheros.

En estos casos los parmetros se encuentran ubicados dentro de secciones donde se indica el
mbito de aplicacin del parmetro.

Las secciones ms importantes son:


<Directory> : Los parmetros que se encuentran dentro de esta seccin, slo se aplicarn a el
directorio especificado y a sus subdirectorios.

<DirectoryMatch>: Igual que Directory, pero acepta en el nombre del directorio expresiones
regulares.

<Files>: Los parmetros de configuracin proporcionan control de acceso de los ficheros por su
nombre.
<FilesMatch>: Igual que Files, pero acepta expresiones regulares en el nombre del fichero.
<Location>: Proporciona un control de acceso de los ficheros por medio de la URL
<LocationMatch>: Igual que Location, pero acepta expresiones regulares en el nombre del
fichero.

145

Algunas veces las directivas de funcionamiento de las secciones anteriores se pueden cruzar en
cuyo caso tienen el siguiente orden de preferencia:

1. <Directory> y .htaccess (.htaccess prevalece frente a <Directory>)


2. <DirectoryMatch> y <Directory>
3. <Files> y <FilesMatch>
4. <Location> y <LocationMatch>

Tambin hay que destacar, que el fichero contiene un montn de comentarios para su correcta
utilizacin, las lneas comentadas aparecen con el smbolo #.

Httpd.conf: Parmetros globales


Todos los parmetros que se establecen dentro de esta seccin son globales para el
funcionamiento del servidor, por lo que no admiten estar dentro de ninguna directiva.

ServerRoot: especifica la ubicacin del directorio raz donde se encuentra instalado el Apache, a
partir del cual se crea el rbol de directorios comentado anteriormente. Esta directiva no debera
cambiar a no ser que se mueva la carpeta de instalacin de apache a otro directorio. Se encuentra
disponible a travs del mdulo Core.

PidFile: ubicacin del fichero que contendr el nmero de identificacin del proceso cuando se
encienda el servidor. Se encuentra disponible a travs de varios mdulos beos, leader,
mpm_winnt, mpmt_os2, perchild, prefork, threadpool worker.

TimeOut: el valor se utiliza para configurar medido en segundos, tres parmetros:

1. El tiempo tal que puede tardar una peticin en ser recibida entera
2. La cantidad de tiempo que espera entre recepcin de paquetes TCP
3. La cantidad de tiempo entre ACK's en transmisiones TCP

Pasado este tiempo se produce un mensaje de error en el que se indica que se ha consumido el
tiempo mximo de espera. Establecer un valor muy pequeo puede dar lugar a que los usuarios
reciban este mensaje de error, y establecer un valor muy pequeo dar lugar a una sobrecarga de
la mquina. Se encuentra disponible a travs del mdulo Core.

KeepAlive: especifica si se utilizarn conexiones persistentes, es decir, que todas las peticiones
de un usuario se atendern con la misma conexin. Se encuentra disponible a travs del mdulo
Core.

146

MaxKeepAliveRequests: nmero mximo de conexiones persistentes. (nmero mximo de


usuarios concurrentes si KeepAlive esta en ON). Para establecer este parmetro, hay que tener en
cuenta el ancho de banda de salida de nuestro servidor, por el cual deber ser enviada toda la
informacin, si se establece un valor muy grande respecto al ancho de banda, el tiempo de
respuesta se ver incrementado para cada usuario. Se encuentra disponible a travs del mdulo
Core.

KeepAliveTimeout: tiempo que espera en segundos entre peticiones de un usuario, antes de


considerar que este ha terminado, y cerrar su conexin.

Si el valor es muy pequeo provocar que algunos usuarios no puedan visualizar la pgina debido
a que el nmero mximo de conexiones persistentes se ha superado, mientras que si se establece
un valor muy grande se estarn utilizando muchos recursos de la mquina. Se encuentra
disponible a travs del mdulo Core.

Listen: esta directiva permite especificar que puerto se utilizar para atender las peticiones.
Por defecto se utiliza el puerto 80 (www), tambin permite especificar que direcciones IP atender,
por defecto todas. Para atender dos direcciones IP distintas, con distintos puerto, se utilizara:

Listen 192.168.255.5:80
Listen 192.168.255.8:8080

Se encuentra disponible a travs de varios mdulos beos, leader, mpm_winnt, mpmt_os2,


perchild, prefork, threadpool worker

LoadModule: Directiva que sirve para cargar mdulos que incluyen distintas funcionalidades.
La sintaxis es:

LoadModule nombreModulo ubicacionFichero

Se encuentra disponible a travs del mdulo mod_so.

Httpd.conf: directivas de funcionamiento (1)


Esta es la seccin principal de configuracin del servidor, en ella podemos encontrar las siguientes
opciones:

ServerAdmin: especifica la direccin de correo electrnico del administrador, esta direccin


aparece en los mensajes de error, para permitir al usuario notificar un error al administrador.

147

No puede estar dentro de ninguna seccin. Se encuentra disponible a travs del mdulo Core.

ServerName: especifica el nombre y el puerto que el servidor utiliza para identificarse,


normalmente se determina automticamente, pero es recomendable especificarlo explcitamente
para que no haya problemas al iniciar el servidor. Si el servidor no tiene un nombre registrado en
las DNS, se recomienda poner su nmero IP. No puede estar dentro de ninguna seccin.

La sintaxis es:

ServerName direccionIP:Puerto Ejemplo: ServerName localhost:80

DocumentRoot: la carpeta raz que se ubica en el servidor, desde la que se servirn los
documentos. Por defecto, todas las peticiones, tendrn como raz esta carpeta, a no ser que se
utilicen alias. Por defecto, la carpeta raz es la carpeta Htdocs, que se encuentra en la carpeta de
instalacin del Apache. No puede estar dentro de ninguna seccin.

Si se cambia este directorio por otro, es muy importante que se ponga el nuevo valor, no solo en
esta lnea, sino tambin en la seccin <Directory> en la que se establecen los parmetros de
configuracin de este directorio.

Esta lnea empieza por " <Directory " seguido de la carpeta raz que originalmente hay en
DocumentRoot.

Se encuentra disponible a travs del mdulo Core.

DirectoryIndex: especifica el fichero por defecto que buscar en cada directorio, en caso de que
no se especifique ninguno. Por defecto es index.html. Es decir, que si por ejemplo se pone en el
navegador: www.simulnet.com el servidor por defecto servir:

www.simulnet.com/index.html

En esta directiva se pueden especificar ms de un fichero, la sintaxis es la siguiente:

DirectoryIndex fichero1 fichero2 fichero3

El orden con el que se especifica el nombre de fichero determinar la prioridad a la hora de decidir
que fichero es el que se muestra.

148

La directiva se puede encontrar fuera de cualquier seccin, dentro de una seccin o dentro de un
fichero .htaccess.

Se encuentra disponible a travs del mdulo mod_dir.

AccessFileName: es el nombre del fichero de configuracin que se buscar en cada una de los
directorios del servidor para conocer la configuracin del mismo. Este fichero permite configurar el
comportamiento de cada uno de los directorios individualmente. Para que esta configuracin
funcione, la directiva AllowOverride tiene que tener un valor que lo permita.

No puede estar dentro de ninguna seccin.

El nombre de fichero que se especifica por defecto es el del fichero ".htaccess".

Como medida de seguridad, la configuracin del Apache establece que no se muestre la existencia
de este fichero a ningn usuario, aunque este establecida la opcin de listado de directorios. Si se
decide cambiar al nombre, habr que redefinir la seguridad para que no se muestre el contenido
del nuevo fichero. Esto se hace en el fichero httpd.conf en una seccin File como la que se
presenta a continuacin en la que se establece que todos los ficheros que comiencen por .ht no se
mostrarn.

<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

Se encuentra disponible a travs del mdulo Core.

Httpd.conf: directivas de funcionamiento (2)


TypesConfig: especifica el nombre del fichero que contiene la lista de tipos mime que conoce el
servidor, y que determinar dependiendo de las extensiones para generar las cabeceras http. No
puede estar dentro de ninguna seccin.

Se encuentra disponible a travs del mdulo mod_mime.

DefaultType: tipo mime que se servir por defecto en caso de no conocer la extensin del fichero
que se est sirviendo. Por defecto, se indicar que se sirve texto plano, con el valor

149

text/plain. La directiva se puede encontrar fuera de cualquier seccin, dentro de una seccin o
dentro de un fichero .htaccess.

Sintaxis: DefaultType tipoMime

Se encuentra disponible a travs del mdulo Core.

HostnameLookups: se utiliza en los ficheros de registro. Por defecto cuando se produce un


acceso, se guarda simplemente su nmero IP, si esta directiva se encuentra en On, el servidor
buscar la correspondencia de ese nmero IP con su nombre, y almacenar el nombre.

Establecer esta configuracin en ON provocar que por lo menos se tenga que hacer una peticin
al servidor de nombres por cada una de las peticiones de usuario, por lo que el rendimiento de la
mquina se puede ver decrementado. Esta directiva se puede encontrar dentro de una seccin o
fuera de cualquier otra.

Se encuentra disponible a travs del mdulo Core.

ErrorLog: especifica la ubiacin del fichero que contiene el registro de errores, por defecto en la
carpeta logs. Esta directiva slo se puede encontrar fuera de cualquier seccin.

Se encuentra disponible a travs del mdulo Core.

LogLevel: especifica el tipo de mensajes que se guardaran en el fichero de registro de errores,


dependiendo de los valores especificados, se guardarn mas o menos. Esta directiva slo se
puede encontrar fuera de cualquier seccin.

Valor de ms a menos son: debug, info, notice, warn, error, crit, alert, emerg

Se encuentra disponible a travs del mdulo Core.

LogFormat: la directiva permite definir el formato que se utilizar para almacenar los registros. A
cada formato se le puede asignar un nombre, utilizndolo luego para crear distintos tipos de
ficheros de registro. Pueden existir varios logFormat distintos.

Sintaxis:

LogFormat "configuracinError" nombre

150

Esta directiva se encuentra fuera de cualquier seccin.

Se encuentra disponible a travs del mdulo mod_log_config.

CustomLog: la directiva se utiliza para especificar la ubicacin y el tipo de formato que se utilizar
en un fichero de registro. Pueden existir varios ficheros de registro distintos con configuraciones
distintas. Para hacer esto, simplemente hay que poner varias lneas customlog.

Sintaxis: CustomLog fichero formato

Esta directiva se encuentra fuera de cualquier seccin.

Se encuentra disponible a travs del mdulo mod_log_config.

ServerTokens: Esta directiva establece la informacin que se devuelve dentro de la cabecera http
que enva el servidor. Posibles valores de menor a mayor informacin son:
-Pord
-Min
-Os
-Full

Esta directiva se encuentra fuera de cualquier seccin.

Se encuentra disponible a travs del mdulo Core.

IndexOptions: Esta directiva controla la apariencia de la pgina que se mostrar a un usuario


cuando se pide la lista de ficheros de un directorio.

Sintaxis:

IndexOptions [+|-]opcion [[+|-]opcion] ... (Apache 1.3.3 en adelante)

Entre las opciones que se pueden poner, destaca:

FancyIndexing: que muestra los nombres de los ficheros, con iconos etc.
Se encuentra disponible a travs del mdulo mod_autoindex.

151

FoldersFirst: Hace que primero se muestren los directorios. Esta opcin slo se puede
establecer en el caso de que FancyIndexing este activa.
Esta directiva se puede encontrar dentro del fichero .htaccess, dentro de una seccin
<Directory> y fuera de cualquier otra.
Se encuentra disponible a travs del mdulo mod_autoindex.

Httpd.conf: directivas de funcionamiento (3)


AddIconByEncoding: Esta directiva permite asociar un icono a un tipo mime, de forma que
cuando la directiva fancyIndexing este activada, se mostrar al lado del fichero el icono
correspondiente.

Sintaxis:
AddIconByEncoding icon MIME-encoding

Ejemplo:

AddIconByEncoding/icons/compressed.gif x-compress
Esta directiva se puede encontrar dentro del fichero .htaccess, dentro de una seccin
<Directory> y fuera de cualquier otra.

Se encuentra disponible a travs del mdulo mod_autoindex.

AddIconByType: Esta directiva asocia un icono a un fichero dependiendo del un tipo mime, de
forma que cuando la directiva fancyIndexing este activada, se mostrar al lado del fichero el icono
correspondiente.

Sintaxis:

AddIconByType icon MIME-encoding

Ejemplo:
AddIconByType /icons/text.gif text/*

La diferencia entre AddIconByType y AddIconByEncoding reside en que mientras que en la


primera se determina el tipo mime basndose en la codificacin del fichero, mientras que
AddIconByType determina el tipo mime basndose en el nombre del fichero.

152

Ambas directivas se pueden encontrar dentro de el fichero .htaccess, dentro de una seccin
<Directory> o fuera de cualquier otra.

Se encuentra disponible a travs del mdulo mod_autoindex.

AddDescription: Esta directiva permite asociar una descripcin a un tipo de fichero, que se
mostrar al listar un directorio. Esta directiva se puede encontrar dentro del fichero .htaccess,
dentro de una seccin <Directory> o fuera de cualquier otra.

Sintaxis:
AddDescripcion cadena, fichero

Se encuentra disponible a travs del mdulo mod_autoindex.

AddDefaultCharset: Esta directiva define la codificacin de caracteres que se utilizar de forma


predeterminada para los documentos. Por defecto viene establecido el valor ISO 8859-1. Esta
directiva se puede encontrar dentro de cualquier seccin y en los ficheros .htaccess.

Se encuentra disponible a travs del mdulo Core.

ErrorDocument: Esta directiva establece el la configuracin del servidor para cuando se produce
un error. Se pueden establecer cuatro configuraciones distintas:

1. Sacar un texto de error


2. Redirigir a un fichero en el mismo directorio
3. Redirigir a un fichero en nuestro servidor
4. Redirigir a un fichero fuera de nuestro servidor
Hay que tener en cuenta que si el texto de error se envia a Internet Explorer, este tendr que tener
al menos 512 Bytes, porque sino Internet Explorer mostrar su propia pgina de error.

Sintaxis:

ErrorDocument NmeroError Accin

Esta directiva se puede encontrar tanto dentro del fichero .htaccess, dentro de la seccin
<Directory> o fuera de cualquier otra seccin.

153

Ejemplo:
ErrorDocument 404 /error404.html.

En caso de no encontrarse un fichero, se mostrar el fichero error404.html

Se encuentra disponible a travs del mdulo Core.

CacheRoot: establece el directorio donde se encontrarn los ficheros de la cache del Apache. Se
encuentra disponible a travs del mdulo mod_disk_cache

CacheSize: Tamao de la cache en Kilobytes.


Se encuentra disponible a travs del mdulo mod_disk_cache

CacheGcInterval: Establece cada cuantas horas se verificar el tamao de los ficheros de la


cache para comprobar si se corresponden con el tamao establecido dentro de CacheSize. El valor
acepta nmeros flotantes, por lo que se pueden establecer los intervalos en minutos. Cuanto
mayor sea el valor de esta directiva, ms posibilidades existirn que se sobrepase el valor
establecido en CacheSize.

Se encuentra disponible a travs del mdulo mod_disk_cache

CacheMaxExpire: mximo nmero de horas que los ficheros permanecern dentro de la cache.
Se encuentra disponible a travs del mdulo mod_cache

CacheLastModifiedFactor: Sirve para calcular la caducidad de un fichero en la cache, que ser el


de la hora de la ltima modificacin, multiplicado por este valor.
Se encuentra disponible a travs del mdulo mod_cache

CacheDefaultExpire: Nmero de horas por defecto a partir de las cuales un fichero caduca. Se
aplica en aquellos casos en los que no se puede determinar la hora de creacin del fichero. Todas
las directivas de la cach, deben encontrarse fuera de cualquier seccin. Esta directiva no se
puede encontrar dentro de ninguna seccin.
Se encuentra disponible a travs del mdulo mod_cache

CREACIN DE DIRECTORIOS VIRTUALES EN APACHE

Esta directiva slo se encuentra dentro del fichero de configuracin httpd.conf, y se trata aparte en
este captulo debido a su importancia.

154

Alias
Permite la definicin de directorios virtuales, un directorio virtual es un directorio que se encuentra
en un directorio distinto del que se mapea en la URL. El directorio virtual no se tiene porqu
encontrar dentro de rbol de directorios que se crea a partir de DocumentRoot, sino que se puede
encontrar en cualquier otra ubicacin, incluso se podra encontrar en otro servidor distinto.

Por ejemplo, cuando se escribe www.desarrolloweb.com/manual/php la carpeta php no se tiene


que encontrar necesariamente dentro de la carpeta manual, que a su vez esta dentro de la carpeta
raz Desarrolloweb, sino que puede estar en una ubicacin distinta, y fuera del rbol de
subdirectorios de la directiva DocumentRoot

Sintaxis:
Alias nombreFicticio ubicacionReal

Ejemplo:
Alias /manual/php "c:\php"
- el directorio php no se encuentra dentro del directorio manual dentro de la carpeta documentRoot,
sino en la carpeta c:\php.

Por defecto vienen creados dos redirecciones con Alias.


- Icons: para establecer la carpeta donde se encuentran los iconos que utilizar el Apache para
mostrar el contenido de los directorios, y
- Manual: que apunta a la carpeta donde est instalado el manual del Apache en caso de que se
hubiera elegido la opcin durante la instalacin.

AliasMatch
La utilidad de esta directiva es idntica a la de la directiva Alias, la nica diferencia es que mientras
Alias utiliza expresiones estndar regulares para especificar la URL que se va mapear.
Sintaxis:
AliasMatch Expresin regular ubicacin

Seguridad en Apache I
Cuando un servidor apache recibe una peticin de una pgina web, antes de devolver el resultado,
lleva a cabo varias acciones para verificar que la peticin esta autorizada. Las distintas acciones
que lleva a cabo para verificar la validez de la aplicacin, se pueden agrupar en tres tipos:
Autentificacin, Autorizacin y Control de Acceso.

155

La autentificacin es el proceso por el cual se verifica la identidad de una persona. De una forma
simple, este proceso se puede llevar a cabo mediante un nombre de usuario y una contrasea,
pero se pueden llegar a utilizar otros mtodos para validar la identidad de una persona, como
mediante el uso de certificados, tarjetas etc

En apache la autentificacin puede estar gestionada por distintos mdulos, dependiendo de la


forma de implementacin. Si decide llevarla a cabo gestionando ficheros con listas de usuarios y
contraseas (encriptadas), deber utilizar el mdulo mod_auth. Sin embargo, si decide llevarla a
cabo mediante base de datos, deber utilizar los mdulos mod_auth_dbm.

La autorizacin es el proceso por el cual se verifica que un usuario con una identidad conocida,
tiene acceso al recurso solicitado. Para llevar a cabo esta accin, se suelen utilizar listas de
permisos en las cuales se enumeran cada una de las acciones que puede realizar un usuario, o las
que no puede hacer. Normalmente, para simplificar la gestin de estos ficheros, los usuarios se
suelen unir en grupos proporcionando los permisos al grupo.
En apache la autorizacin a recursos es gestionada o bien mediante la directiva <directory> en el
fichero principal de configuracin, o bien mediante la configuracin de la carpeta a travs de
ficheros .htaccess.

El control de acceso es el proceso por el cual se verifica que la mquina desde la que se ha hecho
la peticin, tiene acceso al recurso. Los controles de acceso se utilizan para limitar y controlar las
mquinas que tienen acceso a un recurso independientemente del usuario que accede, ya que
estos controles se llevan a cabo antes de que se realice el proceso de autentificacin.

En apache, el control de acceso se puede llevar a cabo mediante las directivas <directory><files>y
<location>, o a travs del fichero de configuracin .htaccess para controlar una carpeta especifica.

En todo caso y para poder llevar a cabo la configuracin de las tres caractersticas aqu
enumeradas, autentificacin, autorizacin y control de acceso, es necesario tener la directiva
AllowOverride con el valor AuthConfig, para as permitir el uso de las distintas directivas de
autentificacin.

Autentificacin y autorizacin de usuarios en Apache. Mod_auth


Para configurar el servidor apache para que sea capaz de autentificar a los usuarios y verificar la
autorizacin del mismo al recurso solicitado, es necesario realizar las siguientes acciones:

1. Crear un fichero con usuarios


2. Crear un fichero con grupos (si es necesario)

156

3. Definir las directivas en el fichero de configuracin o mediante un fichero .htaccess

En los ficheros de usuarios de apache, en cada lnea se especifica un usuario, escribiendo el


nombre de usuario separado de dos puntos, seguido de la contrasea encriptada con MD5. En los
ficheros de grupos de apache, en cada lnea se especifica un grupo escribiendo el nombre del
grupo seguido de dos puntos, y a continuacin separado por espacios, los nombres de los
usuarios.

Es recomendable que tanto los ficheros de usuarios como los de grupos, se encuentren
almacenados fuera de los directorios publicados, para que de esta forma nadie pueda
descargarlos. Asimismo, solo el usuario root debera estar autorizado a escribir en l, mientras que
solo el usuario que ejecuta el servicio web, debera estar autorizado para leerlo.

El fichero de grupos se puede crear manualmente, pero el fichero con los usuarios es
recomendable crearlo mediante la utilidad htpasswd, que se encuentra en la carpeta con los
binarios de apache.

Para crear un fichero de usuario se utilizar la siguiente sintaxis:

htpasswd -c ruta/passwords usuario

El flag -c se utiliza para crear un fichero nuevo, por lo que slo se deber poner la primera vez que
se crea el fichero, sino lo borrar.
Los mdulos que intervienen en la autentificacin y autorizacin son los de core y mod_auth.

Las directivas de mod_auth necesarias para configurar la autenticacin y autorizacin son las
siguientes:
AuthUserFile: siver para especificar la ruta donde se almacenar el fichero de usuarios.
AuthGroupFile: sirve para especificar la ruta donde se almacenar el fichero de grupos. Las
directivas de core necesarias para complementar la configuracin del mdulo son:
AuthType: selecciona el tipo de autentificacin de usuarios que se utilizar para autentificar a un
usuario. Puede variar por directorio. Los valores posibles son Basic y Digest. Con Basic, la
transferencia de las claves se har sin cifrar, y con digest se harn cifradas.
AuthName: especifica un nombre del dominio para el cual se solicita el acceso, este nombre
figurar en la pantalla donde se pide la clave, y a su vez servir para que el cliente identifique la
contrasea que debe utilizar al enviar una peticin a un rea determinada.

157

Require: selecciona los usuarios que pueden acceder a un rea determinada, los usuarios se
pueden determinar a travs de nombres o grupos.

Proteger carpetas mediante usuarios en Apache


1. Crear un fichero de claves fuera de la parte pblica:
-htpasswd -c /ruta/passwords Alain
Al hacerlo, pedir que se introduzca la clave, y esta ser codificada, escribiendo el fichero.
2. Crear un nuevo fichero, en la misma ubicacin que "ruta", que se llamar "groups" en la que se
almacenarn los grupos, por ahora uno, para ello escribir la siguiente lnea y guardar el fichero:

usuariosAutenticados: Alain

De esta forma, debera tener un fichero que se llame passwords, y que contenga una lnea con los
datos del usuario Alain, y un fichero, con nombre groups, que contiene una lnea definiendo un
grupo llamado usuariosAutenticados, del que slo el usuario Alain forma parte.
3. Crear un fichero con el nombre .htaccess en la carpeta que se quiere proteger, y escribir las
siguientes lneas y guardar el fichero:

AuthType Basic
AuthName "ServidorPruebasAlain"
AuthUserFile /ruta/passwords
AuthGroupFile /ruta/groups
Require group usuariosAutenticados

La explicacin del contenido del fichero es la siguiente:


Con "AuthType Basic" se estar protegiendo la carpeta con autentificacin bsica, es decir que la
clave que el usuario introduzca, se transmitir sin cifrar por la web.

Con

"AuthName

"ServidorPruebasAlain"

se

asociar

esta

carpeta

con

el

dominio

"ServidorPruebasAlain", nombre con el que lo identificar el cliente.


Con "AuthUserFile /ruta/passwords" y "AuthGroupFile /ruta/groups" Se definir la ubicacin tanto
de los ficheros de usuarios como los ficheros de grupos y se almacenarn en la carpeta /ruta, con
nombres passwords y groups respectivamente.
Con "Require group usuariosAutenticados" se autorizar el acceso al contenido de esta carpeta a
todos los usuarios que forman parte del grupo de "usuariosAutenticados", por lo que en la prctica
se autorizar el acceso al contenido al usuario Alain.

158

En vez de realizar las autorizaciones a grupos completos, se puede autorizar a un usuario


determinado cambiando la ltima lnea por "Require user Alain", de esta forma slo se autorizar al
usuario Alain.

Se puede permitir el acceso a todos los usuarios identificados mediante la introduccin de la


siguiente directiva "Require valid-user". El hecho de que esta directiva este incluida en el fichero,
hace que las dems no tengan efecto.

Autentificacin y autorizacin de usuarios con Mysql y Apache. mod_auth_mysql


En captulos anteriores hemos explicado como controlar la autentificacin y la autorizacin de
usuarios con el mod_auth. Este mdulo tiene como caracterstica el que almacena los nombres de
usuario, las contraseas y los grupos en ficheros de texto que deben ser escritos y gestionados por
el administrador del sistema. Esta solucin es obviamente poco escalable, ya que en cuanto el
nmero de usuarios y de grupos es elevado, el gestionarlos y controlarlos puede ser un problema.

Por este motivo existe el mod_auth_mysql, este mdulo permite gestionar la autentificacin y
autorizacin, almacenando los usuarios y los grupos en tablas de Mysql, de forma que incluso se
pueden gestionar mediante un panel de control escrito en php.

Para utilizar el mdulo es necesario disponer de al menos una tabla donde se almacenen los
usuarios y otra donde se almacenen los grupos. Para ello se puede crear una tabla usuarios con
los campos, nombre y password, y otra tabla llamada grupos con los campos grupo, usuario,
almacenando una entrada por cada usuario que tenga un grupo.

La configuracin es la siguiente:
En primer lugar ser necesario establecer el servidor, el usuario y la contrasea de la conexin con
la base de datos, esto se har escribiendo la siguiente lnea en el fichero httpd.conf, y
reemplazando los valores por los correctos:

Auth_MySQL_Info <host> <user> <password>


Para configurar el mdulo ser necesario establecer los valores de las siguientes directivas del
mdulo:
Auth_MySQL_DB: nombre de la base de datos
Auth_MySQL_Password_Table: nombre de la base de datos que contiene los nombres de
usuario y las contraseas.
Auth_MySQL_Username_Field: nombre del campo de la tabla que contiene al usuario.
Auth_MySQL_Password_Field: nombre del campo de la tabla que contiene la contrasea del
usuario.

159

Auth_MySQL_Group_Table: nombre de la tabla que contiene los usuarios y los grupos a los
que pertenecen.
Auth_MySQL_Group_Field: nombre del campo de la tabla que contiene el nombre del grupo
Auth_MySQL_Empty_Passwords on/off para determinar si se aceptan usuarios con contraseas
vacias.
Auth_MySQL_Encryption_Types para especificar el tipo de encriptacin que se utilizar para
almacenar la clave del usuario dentro de la base de datos.
Auth_MySQL_Non_Persistent on/off para especificar si se desean utilizar conexiones persistentes.

Adems ser necesario establecer las siguientes directivas de core para su correcto
funcionamiento:

AuthName: con el nombre del dominio


AuthType: establecido a Basic
Una vez puesto en marcha, el funcionamiento es anlogo al mdulo mod_auth.

Control de acceso en Apache. Mod_access


Las directivas que proporciona este mdulo se pueden utilizar dentro de los elementos, y del
fichero de configuracin httpd.conf, o bien dentro de ficheros .htaccess ubicados dentro de las
carpetas.

Las directivas con las que cuenta el mdulo para permitir o denegar el acceso son:
Allow: controla los servidores que tendrn acceso al contenido, por ejemplo:
Allow from simulnet.com Permite el acceso desde simulnet.com
Allow from 192.168.0.1 Permite el acceso desde 192.168.0.1
Allow from 192.168 Permite el acceso desde todas las direcciones Ip que comienzan por 192.168
Allow from all Permitir todas
Deny: controla los servidores a los que se denegar el acceso, por ejemplo:
Deny from simulnet.com Deniega el acceso desde desarrolloweb.com
Deny from 192.168.0.1 Deniega el acceso desde 192.168.0.1
Deny from 192.168 Deniega el acceso desde todas las direcciones Ip que comienzan por 192.168
Deny from all Denegar todas
Order: determina el orden en el que se leern los permisos, por ejemplo para leer primero los
permitidos y luego los no permitidos se pondr "Allow,Deny" en este caso si un servidor esta en la
lista de permitidos, y en la de denegados, el acceso al mismo ser denegado, ya que la entrada
dentro de la opcin Deny sobrescribir la de la entrada Allow.

160

Hay que tener en cuenta que el uso de order junto con Allow from all Deny from all, permite
especificar configuraciones como, permitir desde una mquina x y denegar del resto, de una forma
muy sencilla.

Adicionalmente, mediante la directiva SetEnvIf del mdulo mod_setenvif, se pueden establecer


variables de entorno que determinen el funcionamiento de Allow o Deny de la misma forma que se
utilizan nmeros IP nombres de mquinas. Por ejemplo, utilizando

Allow from env=entrada permitir el acceso a todas las peticiones que tengan definida la variable
de entorno "entrada".

Controlar acceso dependiendo del navegador con Apache


Mediante el uso conjunto de las directivas Allow, Deny, Order y SetEnvIf se puede restringir el
acceso a un sitio dependiendo del tipo de navegador. Para realizarlo simplemente basta con crear
una variable de entorno dependiendo del tipo del navegador, y permitir el acceso a las peticiones
que cuenten con esta variable de entorno denegndoselo al resto.

Para ello la configuracin necesaria es la siguiente:

SetEnvId User-Agent googlebot entrar


Order Deny, Allow
Deny from all
Allow from env=entrar
En la primera lnea se especifica que se crear una variable de entorno llamada entrar cuando el
navegador sea el motor de indexacin de google.
En la segunda lnea se especifica el orden en el que se utilizar la lista de servidores, primero los
denegados y luego los permitidos.
En la cuarta lnea se especifica que se deniega el acceso a cualquier peticin
En la quinta lnea se especifica que se permite el acceso a las peticiones que tienen definida la
variable de entorno entrar.

En el caso de que entre el motor de indexacin de google, primero se leer la lnea en que se
deniegan todas las peticiones, para a continuacin leer la lnea en la lnea en la que se permite el
acceso desde las peticiones que tienen definida la variable entrar, como el navegador que lo hace
es el googlebot, esta variable estar definida y entrar.

161

En el caso en que la peticin sea realizada por cualquier otro navegador, primero se leer la lnea
en la que se deniegan las peticiones, y como no satisface la lnea en que lo permite, no entrar

20 trucos de seguridad para Apache


Del mismo modo debes tener en cuenta que algunas de estas recomendaciones pueden disminuir
el rendimiento de tu servidor dependiendo de tu configuracin y de las especificaciones del
sistema.

Primero, cerciorate de tener instalado los ltimos parches de seguridad


No tiene sentido poner una cerradura mas resistente a tu puerta si dejas la ventana abierta.Del
mismo modo si no tenemos los ultimos parches de seguridad instalado no tendra sentido continuar
con la optimizacin de seguridad.

Restringir acceso por IP


Si tienes un recurso al que deba solamente tener acceso alguna red, o IP en concreto puedes
configurarlo en Apache. Por ejemplo si deseas restringir el acceso a tu Intranet para permitir
solamente la red 176.16:

Order Deny,Allow
Deny from all
Allow from 176.16.0.0/16

o por IP:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

Oculta la versin y otra informacin delicada


Por defecto muchas instalaciones de Apache muestran el nmero de versin que est
funcionando, el sistema operativo y un informe de mdulos de Apache estn instalados en el
servidor. Los usuario maliciosos pueden utilizar esta informacin para atacar tu servidor. Hay dos
directivas que necesitas agregar, o corregir en tu archivo de httpd.conf:

ServerSignature Off
ServerTokens Prod
El ServerSignature aparece en la parte inferior de las pginas generadas por apache tales
como los famosos errores 404.

162

La directiva ServerTokens se utiliza para determinarse lo que pondr Apache en la cabecera de la


respuesta HTTP del servidor.

Apache debe funcionar bajo su propia cuenta y grupo de usuario


Algunas versiones de Apache corren bajo el usuario nobody, esto compromete mucho su
seguridad por lo tanto haz lo siguiente:

User apache
Group apache

Utiliza el mod_security
El mod_security es un mdulo estupendo de Apache escrito por Ivan Ristic, el autor de Apache
Security de O'Reilly.

Esta es una lista de cosas que puedes hacer con mod_security:


Filtracin simple
Filtracin basada en expresines regular
Validacin de codificacin de la URL
Validacin de codificacin Unicode
Auditing
Prevencin del ataque NULL Byte
Lmitar la memoria de subida
Enmascarar la identidad del servidor
Y ms

Deshabilitar cualquier mdulo innecesario


Apache viene por defecto instalado con un serie de mdulos.Debes echarle un vistazo a la
documentacin de Apache y ver para que sirve cada uno de ellos, y de esta manera te dars
cuenta de que hay algunos que no son tiles en tu servidor.

Busca en httpd.conf las lineas que contengan LoadModule. Para deshabilitar el mdulo debes
agregar un # al principio de la lnea, para que de esta forma pase a ser un comentario. Para buscar
los mdulos prueba con:

grep LoadModule httpd.conf

Aqu estn algunos mdulos que se instalan por defecto pero a menudo no son necesarios:
mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex.

163

Asegurarte de que los archivos a los que se accede son los deseados
No deseamos que se pueda acceder a los directorios que no tengan permisos para ello,
supongamos que el directorio raiz para nuestras webs es /web, la configuracin ptima deber ser
la siguiente:

Order Deny,Allow
Deny from all
Options None
AllowOverride None
Order Allow,Deny
Allow from all

Desactiva las opciones para explorar directorios


Esto lo puedes hacer con las opciones de directiva dentro de la etiqueta directorio tiene dos
posibles valores none o indexes.

Options -Indexes

Desactiva los includes del lado servidor


Esto tambin se hace con las opciones de directiva dentro de la etiqueta directorio tiene dos
posibles valores none o include.

Options -Includes

Desactiva la ejecucin de CGI


Si no necesitas la ejecucin de CGI por algn motivo en concreto desacrivalos se hace con las
opciones de directiva dentro de la etiqueta directorio tiene dos posibles valores none o ExecCGI.

Options -ExecCGI

No permitir que apache siga enlaces simblicos


De nuevo se configura con las opciones de directiva dentro de la etiqueta directorio tiene dos
posibles valores none o FollowSymLinks.

Options -FollowSymLinks

164

Desactivar todas las opciones


Si deseas desactivar el uso de todas las opciones simplemente:

Options None

Si solamente deseas desactivar algunas en concreto, separalas con un espacio en las opciones de
directiva:

Options -ExecCGI -FollowSymLinks -Indexes

Desactivar la ayuda para los archivos .htaccess


Esto esta ya hecho pero con la directiva AllowOverride. Cmbialo a none.

AllowOverride None

Otra opcin interesante sera bloquear la descarga de todos los archivos que comienzen con .ht
por ejemplo, se hara de la siguiente manera:

AccessFileName .httpdoverride
Order allow,deny
Deny from all
Satisfy All

Disminuye el valor mximo de tiempo de espera


Por el defecto el tiempo de espera es de 300 segundos. Puedes disminuirlo por seguridad para
prevenir ataques de esta manera:
Timeout 45

Limitar el tamao maximo de peticiones


Apache tiene varias directivas que permiten que limites el tamao de una peticin, esto puede ser
muy til.
Una buena manera de comenzar es con la directiva LimitRequestBody. Esta directiva esta fijada a
ilimitado por defecto. Si ests permitiendo uploads de archivos que no sean mayores a 1MB,
podras fijar este ajuste a algo parecido a esto:

LimitRequestBody 1048576

Si no ests permitiendo uploads de archivos puedes fijarlo incluso a un tamao ms pequeo.

165

Algunas

otras

directivas

mirar

son

LimitRequestFields,

LimitRequestFieldSize

LimitRequestLine.

Conclusin
Espero que estas recomendaciones os hayan sido tiles y recuerda que el uso que le tienes
que dar depende en gran medida de los recursos que necesitas y de las caracteristicas de tu
servidor, antes de hacer cualquier cambio si no estas seguro documntate y utiliza este artculo
unicamente como una referenca que te lleve a la solucin ms idonea.

PROXY PARA NAVEGACIN

Introduccin
Un servidor proxy-cache tiene bsicamente dos funciones, como proxy acta como intermediario
en una transaccin Web, el acepta la peticin del cliente, la procesa y luego reenva la solicitud al
servidor original, como servidor de cache almacena el contenido de las solicitudes de los clientes
para su posible uso de nuevo, cuando existe otra solicitud del mismo contenido el servidor
devuelve el contenido del cache, sin tener que contacta al servidor de nuevo.

Un servidor proxy-cache puede ser utilizado por las siguientes razones:


Usar menos ancho de banda de la conexin a Internet.
Reducir el tiempo de carga de las paginas Web.
Proteger los equipos de la red interna.
Prever que los usuarios acceden a sitios prohibidos.
Generar estadsticas del trafico de la red y por usuario.
Asegurar que solo usuarios autorizados pueden conectarse a Internet.

Squid
Squid es un programa de software libre que implementa un servidor proxy y un demonio para
cach de pginas web, publicado bajo licencia GPL. Tiene una amplia variedad de utilidades,
desde acelerar un Servidor Web, guardando en cach peticiones repetidas a DNS y otras
bsquedas para un grupo de usuarios que comparte recursos de la red, hasta cach de web,
adems de aadir seguridad filtrando el trfico. Est especialmente diseado para ejecutarse bajo
entornos tipo Unix.

Caractersticas de Squid
Squid proporciona un servicio de Proxy que soporta peticiones HTTP, HTTPS y FTP a equipos que
necesitan acceder a Internet y a su vez provee la funcionalidad de cach especializado en el cual

166

almacena de forma local las pginas consultadas recientemente por los usuarios. De esta forma,
incrementa la rapidez de acceso a los servidores de informacin Web y FTP que se encuentra
fuera de la red interna.

Proxy para SSL


Squid tambin es compatible con SSL (Secure Socket Layer) con lo que tambin acelera las
transacciones cifradas, y es capaz de ser configurado con amplios controles de acceso sobre las
peticiones de usuarios.

Jerarquas de cach
Squid puede formar parte de una jerarqua de caches. Diversos proxys trabajan conjuntamente
sirviendo las peticiones de las pginas. Un navegador solicita siempre las pginas a un slo proxy,
si este no tiene la pgina en la cach hace peticiones a sus hermanos, que si tampoco las tienen
las hacen a su/s padre/s. Estas peticiones se pueden hacer mediante dos protocolos: HTTP e
ICMP.

ICP, HTCP, CARP, cach digests


Squid sigue los protocolos ICP, HTCP, CARP y cach digests que tienen como objetivo permitir a
un proxy "preguntarle" a otros proxys cach si poseen almacenado un recurso determinado.

Cach transparente
Squid puede ser configurado para ser usado como proxy transparente de manera que las
conexiones son enrutadas dentro del proxy sin configuracin por parte del cliente, y habitualmente
sin que el propio cliente conozca de su existencia. De modo predefinido Squid utiliza el puerto 3128
para atender peticiones, sin embargo se puede especificar que lo haga en cualquier otro puerto
disponible o bien que lo haga en varios puertos disponibles a la vez.

WCCP
A partir de la versin 2.3 Squid implementa WCCP (Web Cache Control Protocol). Permite
interceptar y redirigir el trafico que recibe un router hacia uno o ms proxys cach, haciendo control
de la conectividad de los mismos. Adems permite que uno de los proxys cach designado pueda
determinar como distribuir el trfico redirigido a lo largo de todo el arreglo de proxys cach.

Control de acceso
Ofrece la posibilidad de establecer reglas de control de acceso. Esto permite establecer polticas
de acceso en forma centralizada, simplificando la administracin de una red.

167

Aceleracin de servidores HTTP


Cuando un usuario hace peticin hacia un objeto en Internet, este es almacenado en el cach, si
otro usuario hace peticin hacia el mismo objeto, y este no ha sufrido modificacin alguna desde
que lo accedi el usuario anterior, Squid mostrar el que ya se encuentra en el cach en lugar de
volver a descargarlo desde Internet. Esta funcin permite navegar rpidamente cuando los objetos
ya estn en el cach y adems optimiza enormemente la utilizacin del ancho de banda.

SNMP
Squid permite activar el protocolo SNMP, este proporciona un mtodo simple de administracin de
red, que permite supervisar, analizar y comunicar informacin de estado entre una gran variedad
de mquinas, pudiendo detectar problemas y proporcionar mensajes de estados.

Cach de resolucin DNS


Squid est compuesto tambin por el programa dnsserver, que se encarga de la bsqueda de
nombres de dominio. Cuando Squid se ejecuta, produce un nmero configurable de procesos
dnsserver, y cada uno de ellos realiza su propia bsqueda en DNS. De este modo, se reduce la
cantidad de tiempo que la cach debe esperar a estas bsquedas DNS.

Proxy-Cache en Squid
El proxy cach es una manera de guardar los objetos solicitados de Internet (por ejemplo, datos
como pginas web) disponibles va protocolos HTTP, FTP y en un sistema ms cercano al lugar
donde se piden. Los navegadores web pueden usar la cach local Squid como un servidor proxy
HTTP, reduciendo el tiempo de acceso as como el consumo de ancho de banda. Esto es muchas
veces til para los proveedores de servicios de Internet para incrementar la velocidad de sus
consumidores y para las redes de rea local que comparten la conexin a Internet.

Debido a que tambin es un proxy (es decir, se comporta como un cliente en lugar del cliente real),
puede proporcionar un cierto grado de anonimato y seguridad. Sin embargo, tambin puede
introducir problemas significativos de privacidad ya que puede registrar mucha informacin,
incluyendo las URL solicitadas junto con otra informacin adicional como la fecha de la peticin,
versin del navegador y del sistema operativo.

Un programa cliente (por ejemplo, un navegador) o bien tiene que especificar explcitamente el
servidor proxy que quiere utilizar (tpico para consumidores de ISP) o bien podra estar usando un
proxy sin ninguna configuracin extra. A este hecho se le denomina cach transparente, en el cual
todas las peticiones HTTP son interceptadas por squid y todas las respuestas guardadas en cach.
Esto ltimo es tpico en redes corporativas dentro de una red de acceso local y normalmente
incluye los problemas de privacidad mencionados previamente.

168

Squid tiene algunas caractersticas que pueden facilitar establecer conexiones annimas.
Caractersticas tales como eliminar o modificar campos determinados de la cabecera de peticiones
HTTP de los clientes. Esta poltica de eliminacin y alteracin de cabeceras se establece en la
configuracin de Squid. El usuario que solicita pginas a travs de una red que utiliza Squid de
forma transparente, normalmente no es consciente de este proceso o del registro de informacin
relacionada con el proceso.

Requerimientos de Hardware y Sistemas Operativos


Los requerimientos de Hardware de Squid son generalmente modestos, el parmetro mas
importante a ser tomado en cuanta en una instalacin de squid es la memoria. El no poseer
memoria suficiente causa una drstica degradacin en el rendimiento de los sistemas. Otro
aspecto importante es el espacio en disco, mas espacio significa mayor cantidad de objetos en
cache y menores bsquedas en Internet. Una interfaz de discos mas rpida es siempre
recomendada, por ejemplo siempre prefiera a discos SCSI a discos ata o sata.

El procesamiento no es una variable critica en el rendimiento de squid, aunque CPU mas rpidos
siempre son preferidos. Como squid utiliza una pequea cantidad de memoria por cada respuesta
de cache existe una relacin entre el espacio de la memoria y el cache de disco, como regla
general se puede utilizar que se necesitan 32 MB de memoria RAM por cada GB de cache de
disco, por lo cual un sistema con 1 GB de memoria puede almacenar 32 GB de cache sin afectar
su rendimiento.

Squid puede ser instalado en sistemas Linux, Unix, y Windows.

Instalacin de Squid en Centos


Para instalar en servidor Squid en Debian GNU/Linux se debe ejecutar desde una consola como
usuario root :

#yum install squid

Configuracin de Squid
El archivo de configuracin general de squid se llama squid.conf y se encuentra ubicado en
/etc/squid/squid.conf.

La configuracin de Squid es similar a la de los archivos Unix, cada lnea de configuracin


comienza con una directiva seguida de un valor o valores, squid ignora las lineas en blanco o las
que comienzan con el smbolo numeral #.

169

Ejemplos de Configuracin en squid


cache_log /squid/var/cache.log
# define the localhost ACL
acl Localhost src 127.0.0.1/32
connect_timeout 2 minutes
log_fqdn on

Algunas Directivas poseen un solo valor, por lo cual lineas repetidas harn que se tomen
solamente la ultima, en el siguiente ejemplo la segunda linea es la que es tomada como valor del
servidor:

connect timeout 2 minutes


connect timeout 1 hour

Controles de Acceso (ACL)


Los controles de acceso son la parte mas importante en la configuracin del servidor squid, estas
se utilizan para dar acceso a los usuarios y tambin para negarlo. Las ACL pueden usarse para
restringir o prevenir acceso a ciertos sitios o contenidos. Utilizan la siguiente sintaxis:

acl nombre_acl tipo_acl descripcin ...


acl nombre_acl tipo_acl "archivo_de_descripciones" ...

Cuando usamos un "archivo_de_descripciones", cada descripcin se corresponde con una lnea


del archivo.

Tipos de ACL
src
Especifica una direccin origen de una conexin en formato IP/mscara. Por ejemplo, utilizaremos
una acl de tipo src para especificar la red local:

acl red_local src 192.168.1.0/24

Tambin podemos especificar rangos de direcciones mediante una acl de tipo src:

acl jefes src 192.168.1.10-192.168.1.25/32

dst
Especifica una direccin destino de una conexin en formato IP/mscara.

170

acl google dst 216.239.0.0/24

Tambin podemos especificar hosts concretos mediante una acl de tipo dst:

acl google dst 216.239.59.104/32 216.239.39.104/32 216.239.57.104/32

Las definiciones son idnticas a las acl de tipo src salvo que se aplican al destino de las
conexiones, no al origen.

srcdomain y dstdomain
Estos tipos de acl especifican un nombre de dominio. En el caso de srcdomain es el dominio origen
y se determina por resolucin DNS inversa de la IP de la mquina, es decir, tendremos que tener
bien configurado el DNS de la red local.

En el caso de dstdomain el nombre del dominio se comprueba con el dominio que se haya
especificado en la peticin de pgina web.

Por ejemplo:
acl google_com dstdomain google.com

srcdom_regex y dstdom_regex
Especifican una expresin regular que verifican los dominio origen o destino. La expresin regular
hace distincin entre maysculas y minsculas salvo que incluyamos la opcin "-i" que evita dicha
distincin.

Ejemplo:
acl google_todos dstdom_regex -i google\..*

Observamos como al incluir "-i" estamos indicando que no haga distincin entre maysculas y
minsculas.

time
Este tipo de acl permite especificar una franja horaria concreta dentro de una semana.

La sintaxis es la siguiente:
acl nombre_acl_horaria time [das-abrev] [h1:m1-h2:m2]

Donde la abreviatura del da es:

171

S - Sunday (domingo)
M - Monday (lunes)
T - Tuesday (martes)
W - Wednesday (mircoles)
H - Thursday (jueves)
F - Friday (viernes)
A - Saturday (sbado)

Adems la primera hora especificada debe ser menor que la segunda, es decir:

h1:m1 tiene que ser menor que h2:m2

Ejemplo
acl horario_laboral time M T W H F 8:00-17:00

Estaramos especificando un horario de 8 a 17 y de lunes a viernes.

url_regex
Permite especificar expresiones regulares para comprobar una url completa, desde el http:// inicial.
Por ejemplo, vamos a establecer una acl que se verifique con todos los servidores cuyo nombre
sea adserver:

url_regex serv_publicidad ^http://adserver.*

En otro ejemplo podemos ver una acl que verifique las peticiones de archivos

mp3:
url_regex archivos_mp3 -i mp3$

referer_regex
Define una acl que se comprueba con el enlace que se ha pulsado para acceder a una
determinada pgina. Cada peticin de una pgina web incluye la direccin donde se ha pulsado
para acceder. Si escribimos la direccin en el navegador entonces estaremos haciendo una
peticin directa.

Por ejemplo vamos a establecer una acl para todas las pginas a las que hayamos accedido
pulsando en una ventana de bsqueda de google:

172

acl pincha_google referer_regex http://www.google.*

req_mime
Las acl de tipo req_mime se utilizan para comprobar el tipo de peticin mime que realiza un cliente,
y se puede utilizar para detectar ciertas descargas de archivos o ciertas peticiones en tneles
HTTP.

Esta acl slo comprueba las peticiones que realiza el cliente, no comprueba la respuesta del
servidor. Esto es importante para tener claro qu estamos haciendo y qu no.

Ejemplo

acl subida req_mime_type -i ^multipart/form-data$


acl javascript req_mime_type -i ^application/x-javascript$
acl estilos req_mime_type -i ^text/css$
acl audiompeg req_mime_type -i ^audio/mpeg$

rep_mime_type
Este tipo de acl se utiliza para verificar el tipo de respuesta recibida por el proxy. Este tipo de acl,
analiza una respuesta del servidor por lo que slo le afectas las reglas de respuesta como
http_reply_access y no las reglas http_access que se aplican a las peticiones.

Ejemplo:
acl javascript rep_mime_type -i ^application/x-javascript$
acl ejecutables rep_mime_type -i ^application/octet-stream$
acl audiompeg rep_mime_type -i ^audio/mpeg$

EJERCICIOS CON ACL

Ejercicio 1
Crear un archivo de configuracin para denegar el acceso a todos los equipos a la direccin
www.google.com

acl all src 0.0.0.0/0.0.0.0


acl no_permitido1 dstdomain www.google.com
acl localhost src 127.0.0.1
http_access deny no_permitido1 !localhost

173

En este ejemplo construimos la acl llamada localhost que representa el servidor proxy (direccin
loopback). Observe que en http_access se ha puesto !localhost para denegar el acceso a todos los
equipos de la red menos al equipo local. De esta manera el equipo en el que est instalado squid
puede acceder a la pgina www.google.com

Ejercicio 2
Crear un archivo de configuracin que deniegue el acceso a las direcciones www.google.com y
www.hotmail.com.

acl all src 0.0.0.0/0.0.0.0


acl localhost localhost src 127.0.0.1
acl no_permitido1 dstdomain www.google.com www.hotmail.com
http_access deny no_permitido1 !localhost

En este caso el archivo de configuracin es similar al caso anterior. Tan slo hay que poner
www.hotmail.com despus de www.google.com en la acl no_permitido1.

Ejercicio 3
Crear un archivo llamado no_permitidos, en la ruta /etc/squid que contenga las direcciones de los
tres siguientes dominios:

http://www.google.com
http://www.yahoo.com/
http://www.hotmail.com/

A continuacin crea un archivo de configuracin squid.conf que deniegue las conexiones a las
direcciones que se encuentran en el archivo no_permitidos.

acl all src 0.0.0.0/0.0.0.0


acl localhost src 127.0.0.1
acl no_permitido1 url_regex /etc/squid/no_permitidos
http_access deny no_permitido1 !localhost

Ejercicio 4
Se dispone de una red local con direccin 192.168.1.0 y mscara 255.255.255.0. Crear un archivo
de configuracin squid.conf que permita el acceso a Squid a todos los equipos de la red y no lo
permita a los restantes.

174

acl all src 0.0.0.0/0.0.0.0


acl todalared src 192.168.1.0/255.255.255.0
acl localhost src 127.0.0.1
http_access allow todalared
http_access deny all !localhost

Ejercicio 5
Se dispone de una red de rea local con direccin 192.168.1.0 y mscara 255.255.255.0. Se desea
permitir el acceso a Squid a los equipos con las IP que estn comprendidas en el rango
192.168.1.1 y 192.168.1.10 (ambas incluidas). Crea en el directorio /etc/squid3/ un archivo llamado
ip_permitidas que tenga estas direcciones (cada direccin en una lnea diferente). Con esta
configuracin para Squid se permite el acceso a Squid a todas estas direcciones y denegar el
acceso a las restantes.

acl all src 0.0.0.0/0.0.0.0


acl red_local src /etc/squid3/ip_permitidas
acl localhost src 127.0.0.1
http_access allow red_local
http_access deny all !localhost

Ejercicio 6
Impide la conexin a Internet a todos los equipos en horario de 18:00 a 21:00 horas.

acl all src 0.0.0.0/0.0.0.0


acl localhost src 127.0.0.1
acl horario time 18:00-21:00
http_access deny horario !localhost

Ejercicio 7
Niega las conexiones a todos los equipos en horario de 18:00 a 21:00 horas, pero slo los lunes,
martes y mircoles.

acl all src 0.0.0.0/0.0.0.0


acl horario time MTW 18:00-21:00
http_access deny horario !localhost

Ejercicio 8
Deniega el acceso a Squid al equipo con IP 192.168.1.5. Permite el resto de accesos a Squid.

175

acl all src 0.0.0.0/0.0.0.0


acl equipo5 src 192.168.1.5
http_access deny equipo5

Ejercicio 9
Deniega el acceso a Squid al equipo con IP 192.168.1.5 en horario de 18:00 a 21:00 horas.
Permite el resto de accesos a Squid.

acl all src 0.0.0.0/0.0.0.0


acl equipo5 src 192.168.1.5
acl horario 18:00-21:00
http_access deny equipo5 horario

Ejercicio10
Niega el acceso a Squid al equipo con IP 192.168.1.5 en horario de 18:00 a 21:00 horas. Para el
resto de equipos permitir el acceso slo en horario de 10:00 a 14:00 horas. Se supone que los
equipos pertenecen a la red 192.168.1.0 con mscara 255.255.255.0.

acl all src 0.0.0.0/0.0.0.0


acl red_local src 192.168.1.0/255.255.255.0.
acl equipo5 src 192.168.1.5
acl horario1 18:00-21:00
acl horario2 10:00-14:00
http_access deny equipo5 horario1
http_access allow red_local horario2
http_access allow equipo5

Ejercicio 11
En el archivo /etc/squid3/permitidos se tiene una lista de todas las direcciones IP de la red local. El
equipo10 tiene la direccin IP 192.168.1.10. Se permite el acceso a Internet al equipo10 de lunes a
mircoles de 9:00 a 14:00 horas. Tambin se permite el acceso a los equipos de la red local de
lunes a mircoles. Se prohibe el acceso en el resto de casos.

acl all src 0.0.0.0/0.0.0.0


acl localhost src 127.0.0.1
acl redlocal src /etc/squid/permitidos
acl equipo10 src 192.168.1.10
acl horario time MTWHF 9:00-14:00

176

acl horario2 time MTW


http_access allow equipo10 horario
http_access allow redlocal horario2
http_access allow localhost
http_access deny all

Ejercicio 12
Restringe el acceso a todo el contenido con extensin .mp3 a los equipos de la red.

acl all src 0.0.0.0/0.0.0.0


acl redlocal src 192.168.1.0/255.255.255.0
acl musica urlpath_regex \.mp3
http_access allow redlocal !musica
http_access deny all

AUTENTICACIN EN SQUID

Es muy til el poder establecer un sistema de autenticacin para poder acceder hacia Internet,
pues esto permite controlar quienes si y quienes no accedern a Internet sin importar desde que
mquina de la red local lo hagan. Ser de modo tal que tendremos un doble control, primero por
direccin IP y segundo por nombre de usuario y clave de acceso.

ELIGIENDO EL MDULO DE AUTENTICACIN

Se consideraran dos opciones de autenticacin una a travs de texto simple con claves de acceso
creadas con htpasswd o bien a travs de un servidor LDAP, lo cual constituye una solucin ms
robusta.

AUTENTICACIN SIMPLE

Squid puede utilizar el mdulo ncsa_auth, de la NCSA (National Center for Supercomputing
Applications), y que ya viene incluido como parte del paquete principal de Squid en la mayora de
las distribuciones actuales. Este mdulo provee una autenticacin muy sencilla a travs de un
archivo de texto simple cuyas claves de acceso fueron creadas con htpasswd.

177

Creacin del archivo de claves de acceso


Se requerir la creacin previa de un archivo que contendr los nombres de usuarios y sus
correspondientes claves de acceso (cifradas). El archivo puede localizarse en cualquier lugar del
sistema, con la nica condicin que sea asequible para el usuario squid.

Debe procederse a crear un archivo /etc/squid3/claves:

#touch /etc/squid/claves

Salvo que vaya a utilizarse un guin a travs del servidor web para administrar las claves de
acceso, como medida de seguridad, este archivo debe hacerse para que solo el usuario squid
pueda leerlo o escribirlo:

#chmod 600 /etc/squid/claves


#chown squid:squid /etc/squid/claves

A continuacin deberemos dar de alta las cuentas que sean necesarias, utilizando el mandato
htpasswd -mismo que viene incluido en el paquete de apache. Ejemplo:

#htpasswd /etc/squid/claves areyes

Lo anterior solicitar teclear una nueva clave de acceso para el usuario joseperez y confirmar
tecleando sta de nuevo. Repita con el resto de las cuentas que requiera dar de alta. Todas las
cuentas que se den de alta de este modo son independientes a las ya existentes en el sistema. Al
dar de alta una cuenta o cambiar una clave de acceso lo estar haciendo EXCLUSIVAMENTE para
el acceso al servidor Proxy. Las cuentas son independientes a las que se tengan existentes en el
sistema como seran shell, correo y Samba.

Parmetros en /etc/squid/squid.conf
Lo siguiente ser especificar que programa de autenticacin se utilizar.

Localice la seccin que corresponde a la etiqueta auth_param basic program.


Por defecto no est especificado programa alguno. Considerando que ncsa_auth se localiza en
/usr/lib/squid3/ncsa_auth, procederemos a aadir el siguiente parmetro:

auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/claves

178

/usr/lib/squid3/ncsa_auth corresponde a la localizacin de el programa para autenticar y


/etc/squid/claves al archivo que contiene las cuentas y sus claves de acceso.

Autenticacin a travs del mdulo LDAP


Considerando que se ha configurado exitosamente OpenLDAP como servidor de autenticacin,
solo basta definir el directorio y el servidor LDAP a utilizar.

La sintaxis utilizada para squid_ldap_auth es la siguiente:


#squid_ldap_auth -b "Directorio-o-DN-a-utilizar" servidor-ldap-autilizar

Ejemplo:
#squid_ldap_auth -b "cn=people,dc=su-dominio,dc=com" 127.0.0.1

Parmetros en /etc/squid/squid.conf
Se debe editar el archivo /etc/squid/squid.conf y se especificar el programa de autenticacin se
utilizar. Localice la seccin que corresponde a la etiqueta auth_param basic program. Por defecto
no est especificado programa alguno. Considerando que squid_ldap_auth se localiza en
/usr/lib/squid3/ncsa_auth, procederemos a aadir el siguiente parmetro:

auth_param basic program /usr/lib/squid/squid_ldap_auth -b


"cn=people,dc=su-dominio,dc=com" 127.0.0.1

Lo anterior conecta al directorio dc=su-red-local,dc=com en el servidor

LDAP en 127.0.0.1.

Listas y reglas de control de acceso


El siguiente paso corresponde a la definicin de una Lista de Control de Acceso. Especificaremos
una denominada passwd la cual se configurar para utilizar obligatoriamente la autenticacin para
poder acceder a Squid. Debe localizarse la seccin de Listas de Control de Acceso y aadirse la
siguiente lnea:

acl password proxy_auth REQUIRED

Habiendo hecho lo anterior, deberemos tener en la seccin de Listas de Control de Acceso algo
similar a lo siguiente:

Listas de Control de Accesos: autenticacin.

179

#
# Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl redlocal src 192.168.1.0/255.255.255.0
acl password proxy_auth REQUIRED

Procedemos entonces a modificar la regla de control de accesos que ya tenamos para permitir el
acceso a Internet. Donde antes tenamos lo siguiente:

http_access allow redlocal

Le aadimos passwd, la definicin de la Lista de Control de Acceso que requiere utilizar clave de
acceso, a nuestra regla actual, de modo que quede como mostramos a continuacin:

http_access allow redlocal password

Habiendo hecho lo anterior, la zona de reglas de control de acceso debera quedar de este modo:

Reglas de control de acceso: Acceso por clave de acceso.


#
# INSERT YOUR OWN RULE(S) HERE TO allow ACCESS FROM YOUR
CLIENTS
#
http_access allow localhost
http_access allow redlocal password
http_access deny all

SERVIDOR DE CORREO ZIMBRA

Que es Zimbra?
La Suite de Colaboracin Zimbra es un programa colaborativo creado por Zimbra Inc., fue
adquirida por Yahoo! Inc. en Septiembre de 2007 y posteriormente adquirida por VMWare,
haciendo un acuerdo de mantener sus estndares de Software Abierto. Posee tanto el componente
de servidor como su respectivo cliente.

180

Existen varias versiones de Zimbra disponibles: una versin soportada por la comunidad de
Software Abierto (Open Source), y otras con parte del cdigo cerrado y soportado comercialmente
que contiene algunas mejoras.

Al igual que el programa de correo electrnico Exchange, de Microsoft, Zimbra permite a los
empleados de oficina enviar, recibir, guardar y buscar los miles de mensajes procesados cada da.

El Servidor ZCS hace uso de proyectos Open Source existentes como ser: Postfix, MySQL,
OpenLDAP. Expone una interfaz de programacin de aplicaciones (API) SOAP para toda su
funcionalidad y acta tanto como un servidor IMAP y POP3.

El Cliente Web ZCS es una interfaz de colaboracin y administracin completa creada empleando
el Toolkit Zimbra Ajax. Soporta correos electrnicos y calendarios a travs de una impresionante
interfaz web Ajax, que provee tips de sus objetos, tems arrastrables, y mens que se expanden al
hacer clic derecho. Tambin incluye capacidades de bsqueda avanzada y permite relacionar
fechas.

El calendario compartido en grupo tambin esta incluido.

ZCS es compatible con clientes propietarios tales como Microsoft Outlook, Novell Evolution y
Apple Mail. Tambin provee soporte de sincronizacin nativo para muchos dispositivos mviles
(Nokia E-Series, Android, BlackBerry, Windows Mobile,etc).

Instalacin
A la hora de la instalacin el elemento ms importante a tener en cuenta es que Zimbra se instala
bajo la carpeta /opt si el almacenamiento de buzones e indexado se mantiene por defecto entonces
esta carpeta o particin asignada, debera ser la que ms espacio dedicado tenga.

Requerimientos
Los requerimientos de Zimbra Collaboration Suite son, en comparacin con otros productos
similares, bastante bajos. Para entornos de evaluacin (hasta50 cuentas) la siguiente configuracin
debera ser suficiente:
-CPU Intel/AMD de 32bits a 1.5 GHz o superior.
-1 GB de RAM.
-10 GB de espacio libre en disco para el software y los logs.
-Espacio adicional para el almacenamiento del correo y las bases de datos (depende del nmero
de cuentas y de la cuota de disco asignada a cada una)

181

Primero que todo nos vamos para nano /etc/hosts all colocaremos la ip de nuestro servidor, el
nombre del equipo, junto con el dominio y el host.

-Luego editaremos el archivo /etc/sysconfig/network donde colocaremos el nombre del servidor


ms el dominio.

-Antes de instalar Zimbra debemos detener el servicio de Postfix y evitar que arranque de nuevo,
para eso ejecutamos los comandos:

service postfix stop


chkconfig postfix off

-Instalacin de Dependencias:

nc (Netcat)

sudo

libidn

gmp

NPTL

libstdc++ (32 bits)

sysstat

sqlite

-Cuando se ejecuta el script de instalacin, este verifica que los paquetes de Zimbra a ser
instalados estn disponibles:

Zimbra Core: Instala las libreras, utilitarios y herramientas de monitoreo.

Zimbra LDAP: Instala OpenLDAP el cual provee una solucin opensource de servicio de
directorio.

Zimbra Store: Instala el servidor de buzones, incluyendo Jetty, el contenedor de Servlets


para el servidor de Zimbra.

Zimbra MTA: Instala el Postfix, Clamav, SpamAssasin y Amavis.

Zimbra SNMP: Instala el paquete SNMP para monitoreo.

Zimbra Logger: Instala las herramientas para syslog y reportes estadsticos.

Zimbra Spell: Instala el motor Aspell para revisin ortogrfica.

Zimbra Apache: Es instalado automticamente cuando Zimbra Spell es instalado.

La configuracin del servidor de Zimbra se realiza a travs de los mens presentados por el script
de instalacin. Este script muestra los valores de la configuracin por defecto. El men muestra
adems el nombre lgico del servidor y el dominio de correo. Estos valores pueden ser cambiados

182

segn se desee. Para instalaciones de servidor simple, la clave del administrador debe ser definida
que ser la utilizada posteriormente para acceder a la consola administrativa.

-Ahora nos vamos a registrar como usuario Zimbra ya que vamos a ver si los
servicios estn corriendo en buen estado.

su zimbra

-Y ejecutamos el comando zmcontrol status para poder ver los servicios.

zmcontrol status

Aqu nos sale el estado de cada uno de los servicios los cuales deben estar todos en Running.
A partir de aqu seleccionamos un navegador web y apuntamos hacia la direccin:
https://nombreserver:7071
Y listo ya tenemos instalado nuestro servidor de correo Zimbra.

Configurando la Autenticacin de Zimbra con FreeIPA:


Antes de hacer la configuracin externa es importante destacar que una que vez que se establece
que la autenticacin de Zimbra es externa, el admin creado en el proceso de instalacin queda
inutilizado y esto podra traernos problemas, para resolver esto debemos hacer lo siguiente:
# su -l zimbra
$ zmprov modifydomain simulnet.com zimbraAuthFallbackToLocal TRUE
$

-Prerequisitos
Lo primero es crear una cuenta en el directorio de FreeIPA que servir de enlace (bind) a la hora
de autenticar.

Configuracin

Paso 1:
Entrar en la consola administrativa de Zimbra: https://correo.simulnet.com:7071

183

Paso 2:
Una vez logueado con el usuario administrador, en la izquierda seleccionamos el dominio que
vamos a configurar, y finalmente hacemos click en: Configure Authentication.

Paso 3:
Seleccionar "External LDAP"
Escribimos el nombre del servidor de FreeIPA (servidor.simulnet.com)
En LDAP Filter, poner "(&(objectClass=inetOrgPerson)(objectClass=posixAccount)(uid=%u))" sin
las comillas
En LDAP Search Base, poner: "cn=users,cn=accounts,dc=example,dc=com" sin las comillas
Y finalmente click en Next.

184

Paso 4:
Marcamos el checkbox "Use DN/Password to bind to external server:" y poner el usuario que
creamos como prerequisito.
Click Next

Paso 5:

185

En este paso tenemos la posibilidad de verificar que la configuracin realizada es correcta y esta
funcionando.

Paso 6:
Si todo ha salido como debera, saldr un mensaje en verde indicando que el proceso de
autenticacin se ha completado satisfactoriamente.
Click next y finalmente click finish.

186

VIRTUALIZACIN

Mucha gente e pregunta como tener su propio Cloud, a ser posible opensource y que sea sencillo
de instalar. Una respuesta a esta pregunta es Openstack, aunque tenemos muchas otras opciones,
hoy vamos a desplegar Openstack con la ayuda de stackops, una distribucin Baremetal basada
en Ubuntu 10.04 que nos ayuda a instalar Openstack de manera ms sencilla e intuitiva que
hacerlo a mano. Destacar que la instalacin que vamos ha hacer es un entorno SingleNode, el ms
sencillo y no lo recomiendo para un entorno final, slo para familiarizarnos e ir poco a poco
probando a aumentar la complejidad.

QU ES OPENSTACK?

OpenStack es un proyecto de cdigo abierto procedentes de Rackspace y la NASA, con el objetivo


de establecer normas ms abiertas de la industria. OpenStack incluye un un proyecto de Compute
y Storage. StackOps es un scedaneo de OpenStack, es un asistente que nos ayudar a
desplegar OpenStack en tan slo unos minutos. Soluciones comerciales, con soporte tambin est
disponible.

Cosas a considerar para elegir una son el tipo de almacenamiento (por ejemplo, NFS o iSCSI SAN,
el almacenamiento local, almacenamiento distribuido), el hipervisor de apoyo, multi-alquiler, alta

187

disponibilidad, API, auto-servicio de panel de control, integracin de la facturacin, la medicin de


recursos, automatizacin, aislamiento de la red, concesin de licencias, la apertura a la
personalizacin, soporte comercial, asistencia para la integracin, etc.

Preparacin del Servidor


Vamos a preparar el servidor con las siguientes caracteristicas obtenidas en la pgina oficial de
Stackops, para un entorno SingleNode:

Server

Minimum

64
Controller/Network/Volume/Compute
Node

Recommended Configuration

Configuration
bits

2GB

of

x86
RAM*

1 x 30GB of SATA
disk
1 x 1Gb NIC

2
32GB

64
of

bits

x86

RAM

**

2 x 32GB of SAS/SATA/SSD
Raid

1.

2 x 2TB of SATA Raid 1. ***


2 x 1Gb NIC

* 2GB de RAM slo permite 1 instancia m1.small o 3 m1.tiny sin hacer swapping de memoria. Slo
para entornos de prueba.
** 32GB of RAM necesita 2 Quad-core CPU con Hyperthreading: 16 instancias de tipo m1.small por
servidor. Una regla aprximada es 2 x m1.small instancias por Core y 4GB de RAM por Core.
*** Como regla general, 2 TB de almacenamiento en el nodo Volumen reservados por nodo
aadido
-Despus de instalado el Nodo de Stackops abrimos nuestro navegador preferido e introduciremos
http://IP:8888 que anteriormente escribimos, o si no la recordamos en la pantalla del Ubuntu nos
mostrar la IP para gestionarlo, muy al estilo Baremetal de muchos appliance. Esta web interna
nos llevar a installer.stackops.org, deberemos crear una cuenta para entrar, es grtis. Es
important crearla, ya que seguramente despus de este curso en SingleNode, querremos hacer un
DualNode, MultiNode y quizs un Advanced.

Como podemos observar, el asistente nos muestra una topologia de como pueden ser los entornos
soportados por el Asistente de stackops, tenemos desde el ms bsico, hasta configuraciones
completamente estructuradas por servicio. Seleccionaremos en nuestro caso SingleNode y
pulsaremos Start Deployment.

-La primera pantalla del asistente nos mostrar que nuestro Hypervisor no soporta KVM, solo
QEMU, esto pasa por estar virtualizando el Ubuntu, instalandolo en una mquina fisica no

188

tendriamos este problema. Tambin he marcado el disco de 2TB que le otorgamos antes, slo a
modo informacin para que no se olvide.

-El siguiente paso nos mostrar algunos parmetros de nuestro sistema, DNS, hostname, CPU,
etc. Pulsaremos en Next.

189

-Este es el paso de Networking, cmo es un entorno sencillo, una tarjeta de red para todo es lo
ptimo, recordemos que en un entorno distribuido, Management y Public no estarn en la misma
tarjeta ni en el mismo rango de red. Pulsaremos Continue si estamos de acuerdo.

-El siguiente paso es el de Global Settings, viene marcado la interfaz web Horizon, aunque
experimental funciona de lujo. Si pulsamos en Advanced Mode, veremos lo siguiente.

-En la seccin de volume podremos utilizar el disco de 2TB que antes pusimos, seleccionaremos
/dev/sdb que es nuestro disco secundario. Podemos ver la parte avanzada tambin.

190

-Llego la hora de Compute, no podremos cambiar la parte de QEMU por la razn que explicamos
ms arriba. Podemos ver la seccin avanzada si queremos.

-Pasado este paso vamos revisando los valores por defecto que establece el instalador y si no
estamos de acuerdo con alguno simplmente lo modificamos.

Configurando el servidor
Empezamos por abrir un cliente SSH de nuestra eleccin donde introducimos la IP con la cual
configuramos nuestro servidor virtual. Por defecto, las credenciales para root es de password
stackops. Debermos cambiarla llegados a este punto.

Lo primero que haremos ser ver como podemos comprobar el estado bsico de nuestra
plataforma. Con el comando nova-manage podemos hacer muchas cosas.

191

Para

ello

debemos

movernos

al

directorio:

/var/lib/nova/bin

ejecutamos:

./nova-

manage service list

Con este comando comprobaremos que nuestros servicios bsicos para el funcionamiento del
Cloud estn funcionando.

El usuario por defecto de la Distribucin de Stackops usa Keystone para administrar los usuarios y
los tenants de la plataforma. Hay creados dos usuarios por defecto: admin con la contrasea
password y admin:password. Stackops no recomienda el usuario admin para trabajar como
usuario Cloud. Recomiendan el usuario demo con password password y demo:password para
las credenciales de EC2.

Si quiere administrar el proyecto con la API de EC2 u Openstack v1.1, necesitas ejecutar un script
que se encuentra en /var/lib/stackops/setenv.sh
Este script crear todo lo necesario para las variables de entorno. Puedes modificar el script con un
vi para cada usuario:
Para ejecutar dicho escript debemos hacer lo siguiente:
-controller:/var/lib/nova/bin# cd /var/lib/stackops/
-controller:/var/lib/stackops# source setenv.sh
-controller:/var/lib/stackops# env | grep 'NOVA' && env | grep 'EC2' && env | grep
'OS_' && env | grep 'AUTH_TOKEN'

ATENCIN, hay un Bug reconocido, para solucionarlo y no tener ms errores en el futuro por favor
ejecutar esta linea tambin:
1. root@nova-controller:/var/lib/stackops# export OS_AUTH_STRATEGY=keystone
Virtual Images, Llego el momento de la verdad, descargar una imagen para poder despus irnos a
la interfaz web y poder desplegar instancias con esta imagen. Para ello en el directorio
/var/lib/stackops ejecutamos ./pubXXXXX.sh donde este ltimo nombre corresponde al tipo de
imagen que podemos agregar a nuestra cloud.

Una vez descargada y aadida automticamente al repositorio de imgenes pasaremos al entorno


WEB.

La Interfaz Web, Horizon


Para ello introducimos en un navegador web la misma IP con la que hemos configurado el sistema
pero esta vez sin puerto, y un elegante formulario nos solicitar las credenciales que comentamos
anteriormente (admin o demo).

192

En la pantalla podemos ver dos pestaas bsicas, User Dashboard y System Panel que nos
muestra un resumen de nuestros recursos, Instancias levantadas, etc. Cuanto ms compute y
volume tengamos, ms recursos nos mostrar esta ventana.

La parte de servicios es un resumen en tiempo real de los servicios, asi como su estado, si
tuvieramos un entorno distribuido, nos gustar que esta ventana todo aparezca en verde.
En la parte de Images, podemos ver las imgenes que tenemos y borrarlas, en caso de que no
fueran necesarias. En nuestro caso las dejamos como estn.

En la parte de Tenants y Users podemos crear un Tenant como proyecto al que asignar diferentes
recursos, vCPU, vRAM, instancias, IP, etc, y luego aadir usuarios a ese Tenant o proyecto.

Creando una instancia


Lo primero que tenemos que hacer es crearnos un certificado para administrar la Instancia, en
Dashboard iremos a Keypairs y generaremos un certificado, tan sencillo como poner un nombre y
pulsar en Add Keypair.

Nos solicitar si queremos guardarlo, y pulsaremos Aceptar, debemos recordar donde lo


guardamos.

Iremos a la seccin Images de Dashboard y pulsaremos Launch, elegiremos un nombre para la


instancia y un tamao para ella, yo he seleccionado m1.small y de keypair nuestro certificado.
Ya ha empezado el despliegue de nuestra instancia, si pulsamos refresh, en unos segundos
veremos lo de la imagen de la derecha.

Si pulsamos VNC Console en el men de la derecha podremos ver nuestra instancia a nivel de
VNC, lo cual es siempre agradecido en caso de perder el .pem o para algunas gestiones bsicas.

Conectando a la Instancia
Firewall Rules, lo primero que tenemos que hacer es editar por SSH las reglas de firewall en este
caso default, tambin se puede por interfaz grfico, pero he preferido el entorno de consola en esta
siuacin.

Para ello ejecutamos:


root@nova-controller:/var/lib/stackops# euca-authorize default -P tcp -p 22 -s 0.0.0.0/0
root@nova-controller:/var/lib/stackops# euca-authorize default -P icmp -t -1:-1
Bien, para conectar a la instancia, no vamos a poder hacerlo con la IP actual 10.0.0.2 porque no es
una IP de nuestro rango, tenemos que crear una IP pblica.

193

Pulsaremos Allocate IP para obtener una IP del rango que pusimos en el asistente, cuando ya la
tengamos, imagen a la derecha, pulsaremos Associate to instance para asociarla a nuestra
instancia ya creada.

Seleccionaremos la Instancia a la que queremos conectar la IP y pulsamos Associate IP, despus


podremos ver el resumen de como ha quedado nuestra IP pblica y contra que instancia est
conectada.
Si volvemos al men Instances veremos que tambin vemos la IP pblica asociada a nuestra
Instancia.

Si ejecutamos un ping ya tenemos conectividad.

Ahora necesitaremos un cliente SSH de su preferencia con este cliente necesitamos utilizar el key
que exportamos anteriormente y si todo sale bien estaremos conectados a nuestra instancia.

Si volvemos a la pantalla de System Panel podemos ver un resumen de los recursos que nos
quedan asi como las instancias subidas.

Conclusiones

Openstack no es el futuro es el presente. Cualquier empresa de Hosting que se precie


est adoptando el modelo de negocio Cloud privada, Cloud Hibrida, y Pblica. Openstack
representa ya una cuota de mercado bastante grande y seguir creciendo con el paso de
los meses.

Stackops es una distribucin para hacernos el despliegue de Openstack ms llevadero.


Para cualquier consulta, soporte, o instalacin ms avanzada, por favor, dirigir los correos
a http://www.stackops.com/contact-us/

Ms informacin en http://openstack.org/ y en video en OpenStack Y

Monitoreo y Gestin

Nagios

Nagviz

Para el uso de Nagios y Nagviz vamos a utilizar una Distro basada en Centos 5 llamada FAN (Fully
Automated Nagios)

194

Requerimientos:
Requerimientos Mnimos

4 GB de Disco Duro libre

1 GB de RAM.

1 CPU de un core

Requerimientos Recomendados

20 GB o ms de espacio libre en disco esencialmente para /var. Necesarios para el


servidor de base de datos MySQL y los archivos rrd.

CPU de dos cores o Hiperhilado por cada CPU virtualizado.

2 GB of RAM.

Virtualizacin
FAN puede ser instalado en VMware ESX 3.5 or vSphere 4.1, pero no es recomendado para
grandes sitios (1000 hosts y 5000 servicios por ejemplo).

Instalacin
La instalacin de FAN es semejante a una instalacin estndar de CentOS. Es rpida e intuitiva.

FAN puede ser instalado en modo Standalone o modo distribuido en dependencia de las
exigencias.

Durante el proceso de instalacin se necesita configurar algunos parmetros como son:

Idioma

Tipo de Teclado

Particionamiento

Zona Horaria

Contrasea de root

Primera Conexin
Para poder accede a la nueva plataforma debemos asegurarnos que la configuracin de la red es
correcta.
Todas las herramientas de monitoreo estn instaladas y configuradas. Desde una computadora
con un navegador web de su preferencia abra la siguiente direccin: http://nombre_o_ip_server
El nombre de usuario y la contrasea por defecto de todos los aplicativos instalados es:
nagiosadmin/nagiosadmin

195

Configurando el Monitoreo Distribuido


Esta caracterstica est disponible desde la versin 2.1. Una arquitectura distribuida se basa en:

1 Servidor Central de Monitoreo.

1 Servidor de Base de Datos

Y varios agentes de monitoreo.

El servidor central consolida todos los datos recogidos de monitoreo y ofrece una interfaz de
usuario la cual ofrece la posibilidad de monitorear y gestionar el servidor central y los agentes de
monitoreo.

Los agentes de monitoreo envan los datos recogidos al servidor de base de datos. Este tipo de
configuracin permite la distribucin de los chequeos realizados en cualquier tipo de entorno.
Se requiere la instalacin mnima de 2 servidores FAN:

fan-database

fan-central, tambin puede ser considerado como un agente de monitoreo.

Pero se recomienda instalar 3 servidores FAN:

fan-database

fan-central

fan-poller

GLPI (GESTIONNAIRE LIBRE DE PARC INFORMATIQU)

GLPI es una solucin de software abierto (Open Source) para la gestin del inventario informtico y
de soporte tcnico (Help Desk). Es una aplicacin Web que ataca los principales problemas de

196

gestin del inventario informtico: La administracin de los recursos de hardware, software,


usuarios, suministros e incidencias.

Las principales funcionalidades de la aplicacin son:

Gestin de recursos informticos

Gestin de licencias de software

Gestin de consumibles

Base de conocimientos

Gestin de reservas

Soporte Tcnico

Automatizacin de inventario

El uso de este programa tiene sus ventajas:

Reduccin de costos

Optimizacin de recursos

Rigurosa gestin de licencias

Alta calidad

Usabilidad satisfactoria

Seguridad

La aplicacin est totalmente escrita en PHP y requiere de un servidor Apache con soporte para
PHP4 como mnimo, aunque se recomienda PHP5, as como una base de datos de MySQL 4.1.2.

Requisitos:
Apache.
PHP 4 o superior
MySQL 4.1.2 o superior

Instalacin
Descargar el fichero de instalacin desde la siguiente direccin:
http://www.glpi-project.org/

Descomprimir el fichero descargado en la carpeta raz del directorio virtual de nuestro servidor
WEB, se nos creara una carpeta llamada glpi, si queremos, la podemos renombrar, acceder a la
instalacin mediante un navegador WEB en la siguiente direccin:

http://localhost/glpi

197

Aqu se nos mostrar la pantalla de instalacin, en la que se nos solicita el idioma que queremos
usar en nuestro sistema.

Se contina con el asistente de Instalacin hasta finalizarlo.


En la ltima ventana del sistente se nos indica que la instalacin ha finalizado, y que se han creado
4 usuarios con los distintos niveles de acceso a la aplicacin, solo nos queda pulsar el botn
Utilizar GLPI, para entrar en la aplicacin.
Los usuarios creados por defectos son:

glpi/glpi

para la cuenta de Administrador.

tech/tech

para la cuenta de Tcnico.

normal/normal para la cuenta Normal.


post-only/post-only

para la cuenta postonly

Configuracin inicial de la aplicacin


Una vez en la ventana de acceso a GLPI, se nos solicitar un usuario y contrasea para poder
acceder, utilizaremos el usuario creado con mayores privilegios para administrar y configurar
nuestra aplicacin, as que usamos el usuario glpi.

Una vez dentro podemos ver los diferentes mens que tiene la aplicacin, los cuales los iremos
revisando uno a uno. Una de las primeras tareas que debemos hacer es editar el usuario glpi y
modificarlo, o crear uno nuevo con privilegios de Super-Admin y deshabilitar o borrar el usuario
glpi, En nuestro caso vamos a editar el usuario glpi, y modificarlo, Para ello nos vamos al men
Administracin y luego a Usuarios, entonces pulsamos sobre el usuario glpi.

Aqu editamos los datos del usuario glpi y ponemos los que creamos convenientes., de esta
manera el usuario del Super-Admin ser administrador en lugar de glpi, as mismo, tambin le
cambiaremos la contrasea, y editaremos sus datos, como son su direccin de correo electrnico y
su numero de telfono.

Una vez hechos los cambios pulsamos el botn Actualizar para que se graben.

Ya modificado o creado a nuestro Super-Admin, nos desconectaremos y volveremos a iniciar con


los datos del nuevo Super-Admin, en este caso iniciaremos con el usuario administrador.

Seguidamente hacemos lo mismo con el usuario tech, ya que tiene los mismos privilegios. Esto lo
hacemos para que no se nos vaya a colar alguien en nuestra aplicacin y nos cambie la
contrasea del Super-Admin, y borre al usuario tech, ya que de esa manera ya no podramos

198

acceder con dichos permisos a la aplicacin, ni crear un nuevo usuario con esos privilegios. Por lo
que solo nos quedara volver a instalar la aplicacin.

Para borrar el usuario tech, vamos al men Administracin y luego a Usuarios, aqu marcamos
la casilla a la izquierda del(os) usuario(s).
Customizacin de la Interfaz:
Nuestro siguiente paso ser customizar el aspecto grafico de la aplicacin, para lo que editaremos
los siguientes ficheros ubicados en la carpeta /glpi/pcis ubicada en la raz de nuestro servidor Web:

favicon.ico

fd_logo.png

haut_install.png

login_glpi.png

logo-glpi-login.png

CONFIGURACION

General:
Para acceder a la configuracin general del sistema, vamos al men Configuracin y luego a
General. Aqu tenemos varias pestaas, cada una de ellas con parmetros de configuracin,
iremos configurndolas de una en una segn los parmetros que se adecuan a nuestras
necesidades.

Configuracin general

Nivel de loggin: Aqu se configura que es lo que se guarda en el fichero de loggin.

Tiempo de conservacin de los logs, en das (0=infinito): Aqu se configura el tiempo


que deben conservarse los logs, con 30 es suficiente.

Huso horario: Aqu se configura el huso horario de nuestra ubicacin geogrfica.

Logs en ficheros (SQL, mail, cron...): Aqu se configura si se desea tener tambin Logs
de otros servicios, en nuestro caso diremos que NO.

Inventario

Umbral de alarma predeterminado para los cartuchos y consumibles: Cundo los


consumibles bajan por debajo del umbral indicado, se nos avisar, este valor depende de
la rapidez con la que se consumen los mismos, en este caso ponemos 2.

Campos automticos (marcados con *): Por Entidad

199

Fecha de inicio de ejercicio fiscal (da y mes): configuramos la fecha de inicio del
ejercicio fiscal, por defecto est el 31-01-2005.

Soporte

Asignar automticamente las incidencias al responsable tcnico: No

Conservar las incidencias al purgar un elemento del inventario: No

Programas visibles en Helpdesk por defecto: Si

Registrar las modificaciones de incidencias aadiendo el seguimiento: Si

Asunto predeterminado de los documentos relacionados con las incidencias: --

Alertas por email

Alertas sobre contratos (Valor predeterminado): --

Alertas sobre datos financieros (Valor predeterminado): --

Comprobar la presencia de actualizaciones

Comprobar la presencia de actualizaciones: Nunca

Direccin del Proxy: Si hay Proxy, configurarlo aqu si no hay dejar en blanco.

Puerto del Proxy: Si hay Proxy, configurarlo aqu si no hay dejar en blanco.

Usuario del Proxy: Si hay Proxy, configurarlo aqu si no hay dejar en blanco.

Contrasea del Proxy: Si hay Proxy, configurarlo aqu si no hay dejar en blanco.

Configuracin de la presentacin

Nmero de decimales para los importes: Aqu configuramos el nmero de decimales


para los importes monetarios, por defecto pone el 2.

Cantidad mxima de caracteres para cada elemento de la lista:

Cantidad de elementos a mostrar por pgina:

Intervalo para los horarios:

Lmite de horarios para la planificacin:

Visualiza apellido y nombre:

Personalizacin

Texto en la pgina de inicio: Aqu se configura el mensaje que se puede poner en la


ventana de inicio de sesin.

Enlace a la Ayuda del CAU: En esta casilla se puede poner un enlace a una pgina WEB
de ayuda para los usuarios.

Enlace a la Ayuda Central: En esta casilla se puede poner un enlace a una pgina WEB
de ayuda para los Usuarios con perfiles de tcnico y administrativos.

200

AJAX

Utilizar Ajax:

Comodn Ajax:

No utilizar Ajax si el nmero de elementos es inferior a (0=nunca):

Autocompletar campos de texto con Ajax:

Ajax - Cantidad mxima de elementos mostrados:

Personalizacin
Configuracin de la presentacin

Formato de fechas: En este desplegable se puede elegir el formato de fecha que


queremos utilizar.

Mostrar los ID GLPI:

Desplegar lista:

Utilizar para pestaas Siguiente/Anterior: Aqu se configura si se quieren utilizar las


pestaas para navegar por los elementos cuando esto son visualizados como ficha, es
decir avanzar, retroceder, inicio y final.

Cantidad de elementos a mostrar por pgina: Aqu se configura la cantidad mximas


por defecto de elementos que se pueden visualizar en pantalla.

Formato de Nmero: Aqu se configura el formato para la presentacin de valores


numricos.

Cantidad mxima de caracteres para las listas desplegables: Aqu se configura el


nmero mximo de caracteres que pueden haber en una lista desplegable, la cantidad por
defecto es suficiente, ya que una cantidad mayor mostrara listas demasiado anchas.

Cantidad de eventos de log que se mostrarn: Aqu se configuran el nmero de eventos


que queremos que se vean en el apartado de Logs.

Idioma predeterminado: Aqu se puede elegir el idioma para la interfaz de la aplicacin.

Soporte

Mostrar las incidencias nuevas al entrar en el sistema: Aqu se configura que cuando
un miembro de soporte inicia su sesin, en la ventana de bienvenida se le muestran las
nuevas incidencias que le han sido asignadas y las que an estn sin asignar.

Seguimiento privado por defecto: Esta casilla es para establecer si el seguimiento de las
incidencias son privados o pblicos, por defecto esta en NO, o sea seguimiento pblico.

Colores de las prioridades: Aqu se puede establecer el color identificativos para cada
prioridad de una incidencia, y as segn el color el tcnico de soporte puede ver que tan
urgente es una incidencia.

Mostrar primero las incidencias ms recientes: Aqu se indica que las incidencias que
se muestran primero sean las ms recientes.

201

Restringir la gestin manual de los elementos

Restringir la gestin de monitores:

Restringir la gestin de telfonos:

Restringir la gestin de perifricos:

Restringir la gestin de impresoras:

Modo OCSNG

Activar el modo OCSNG:

Identificacin

Insercin automtica de usuarios a partir de fuentes externas de autenticacin:

Preguntas frecuentes

Autorizar la consulta annima de las Preguntas Frecuentes:

CAU (Centro de Atencin a Usuarios)

Permitir las aperturas de incidencias annimas (helpdesk.html) :

El contenido de la incidencia es obligatorio:

Gateway de correo: tamao mximo de cada fichero adjunto (0 : sin lmite):

Ttulo de incidencia obligatorio:

La categora de la incidencia es obligatoria:

OPENNMS

Preparando el servidor
OpenNMS es una aplicacin que permite la administracin y el monitoreo de una red. Este
software permite hacer de manera muy automatizada, informes y grficas del uso de los recursos
tanto de la infraestructura de red como de los equipos clientes. Este software da una ventaja ya
que se administra va WEB lo cual hace de su uso algo mas ptimo y eficiente.

Caractersticas.
automatizado de la red.

Requerimientos.

202

Instalacin repositorio openNMS


Se descargo el repositorio de openNMS el cual tiene los paquetes requeridos para instalar todas
las dependencias necesarias.

La instalacin se realiza con yum es preferible a rpm, ya que este resuelve los paquetes y
dependencias que hagan falta a la hora de instalar el paquete.

Instalacin y configuracin de Postgresql


Se instalo Postgresql server y el cliente con yum install.

Se inicia el servicio y las bases de datos del Postgresql.

Para poderse conectar a las bases de datos, se configuran los permisos de Postgresql.
En la ruta /var/lib/pgsql/data/pg_hba.conf y el archivo debe quedar as.

Nota: se reinicia el servicio del Postgresql.

203

Instalacin Java Development Kit


Se descarga el archivo RPM.

Instalacin.

Instalacin openNMS
Anteriormente se instalaron los repositorios de openNMS siendo as como solo ejecutar un
comando el repositorio de openNMS resolver todos los paquetes que necesite para completar su
instalacin.

Descargara aproximadamente 500 MB

Configuracin de java
Con este comando se le indica al OpenNMS que tome los archivos que necesita del java.

Actualizacin de la base de datos de OpenNMS


Con el siguiente comando se instalan las bases de datos que utiliza el openNMS con las opciones:
-d: para actualizar la base de datos
-i: para insertar cualquier dato por defecto que pertenezca a la base de datos
-s: para crear o actualizar los procedimientos almacenados que openNMS utiliza para ciertos tipos
de acceso a Datos

204

Instalacin IPLIKE
IPLIKE es un programa compatible con Postgresql que proporciona una aplicacin para la
bsqueda eficiente y completa de direcciones IP. OpenNMS trae por defecto una versin de
IPLIKE pero es recomendable instalar la Nueva versin que tiene un mejor rendimiento.

Agregando una nueva regla al firewall


Lo que debemos hacer es agregar una regla para que el firewall permita el trfico de datos por el
puerto 8980 que es de openNMS en el archivo /etc/sysconfig/iptables de la siguiente manera:

Luego de editar el archivo reiniciamos el firewall con el comando service iptables restart.

Iniciamos los servicios


service opennms start : para iniciar el servicio openNMS

ERRORES

Si en la instalacion de IPLIKE no nos sale OK en la instalacin de base de datos, podemos


ejecutarlo manualmente con el comando.

205

/usr/sbin/install_iplike.sh -h

Interfaz web
Esta es la presentacion de nuestro openNMS funcionando, entramos a l copiando en la barra de
direcciones nuestra IP donde se aloja el servicio openNMS el puerto (8980) ejemplo:
192.168.10.60:8089/opennms y entramos con el usuario y contrasea que por defecto es admin,
admin.

OSSIM

Open Source Security Information Management por sus siglas (OSSIM) es una coleccin de
herramientas bajo la licencia GPL, diseadas para ayudar a los administradores de red en la
seguridad de las computadoras, deteccin de intrusos y prevencin.

Descripcin
El objetivo del proyecto ofrecer una herramienta que ayude a la administracion de eventos de
seguridad mediante un motor de correlacion y una coleccin detallada de herramientas open
source las cuales sirven al administrador para tener una vista de todos los aspectos relativos a la
seguridad en su infraestructura.
OSSIM a su vez provee una fuerte motor de correlacin, con detallados niveles, bajos, medianos y
altos de interfaces de visualizacin, como tambin reportes y herramientas de manejo de
incidentes.

206

La habilidad de actuar como un sistema de prevencin de intrusos basado en informacin


correlativa de cualquier fuente, resulta en una til herramienta de seguridad. Toda esta informacin
puede ser filtrada por red o sensor con el objetivo de proveer nicamente la informacin requerida
por un usuario especfico, permitiendo una buena granularidad en un ambiente de seguridad multi
usuario.

Componentes
Ossim est compuesto por los siguientes elementos de software:
Arpwatch, utilizado para deteccin de anomalas en direcciones MAC.
P0f, utilizado para la identificacin pasiva de OS.
Pads, utilizado para detectar anomalas en servicios.
Openvas, utilizado para la evaluacin y correlacin cruzada (Sistema de deteccin de intrusos vs
Escaner de Vulnerablidad)
Snort, utilizado como sistema de deteccin de intrusos (IDS) como tambin para la correlacin
cruzada con Nessus.
Spade, es un motor de deteccin de anomalas en paquetes. Utilizado para obtener conocimiento
de ataques sin firma.
Tcptrack, utilizado para conocer la informacin de las sesiones, lo cual puede conceder
informacin til relativa a los ataques.
Ntop, el mismo construye una impresionante base de datos con la informacin de la red, para la
deteccin de anomalas en el comportamiento.
Nagios, utilizado para monitorear la disponibilidad de los hosts y servicios.
nfSen, visor de flujos de red para la deteccin de anomalas de red
Osiris, es un sistema de deteccin de intrusos basado en host (HIDS).
Snare, colecciona los logs de sistemas Windows.
OSSEC, es un sistema de deteccin de intrusos basado en hosts
OSSIM tambin incluye herramientas desarrolladas especficamente para l, siendo el ms
importante un motor de correlacin con soporte de directivas lgicas e integridad de logs con
plugins.

207

Potrebbero piacerti anche