Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.
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:
El siguiente modelo ejecutara la orden al final del programa y despus de que sean procesados
los datos del archivo de entrada:
El siguiente modelo ejecutara la orden por cada una de las lneas del archivo de entrada:
PROCEDIMIENTOS
El siguiente mandato especfica que al inicio se imprima en la salida la frase "Hola mundo" y
terminar el procesamiento.
Hola mundo
cat ejemplo.txt
Columna1
Columna2
Columna3
Columna4
Si se utiliza el mandato awk para que solo muestre la columna 1 y la columna 3 del siguiente
modo:
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
Columna3 Columna1
echo
-e
"Dato1\tDato2\tDato3\tDato4\n"
>>
ejemplo.txt
echo
-e
"Dato5\tDato6\tDato7\tDato8\n"
>>
ejemplo.txt
cat ejemplo.txt
Columna1
Columna2
Columna3
Columna4
Dato1
Dato2
Dato3
Dato4
Dato5
Dato6
Dato7
Dato8
Si se utiliza nuevamente el mandato awk para que solo muestre la columna 1 y la columna 3 del
siguiente modo:
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:
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:
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:
01
02
22
*
*
*
*
root
*
root
root
run-parts
run-parts
run-parts
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
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:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
vi usuario.txt
Fulano
Calle
Algo
Mengana
Colonia
123
Perengana
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
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}
"\nPalabras:
"
w,
"\nCaracteres:
\
"
}'
usuario.txt
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:
15
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)]++
\
}
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:
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:
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:
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
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
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:
** 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
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
salida
estndar
de
errores. Este nmero de versin debera incluirse en todos los informes de fallos (vea
ms abajo).
-E
patrn,--regexp=PATRN
Emplea
patrn
como
el
patrn;
til
-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.
-n, --line-number Prefija cada lnea de salida con el nmero de lnea de su fichero de
entrada correspondiente.
-s, --silent Suprime los mensajes de error sobre ficheros que no existen o no se pueden
leer.
-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.
-y
-U, --binary Trata el(los) fichero(s) como binario(s). De forma predetermi- nada, bajo MS-
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 $
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.
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 *
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
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
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:
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: ";: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
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.
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:
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.
grep encontrar como coincidencias: "de" y "me", ya que son las nicas palabras enteras que
coinciden con el patrn.
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.
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.
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.
grep encontrar como coincidencias todos y cada uno de los nmeros que contengan cuatros.
grep encontrar como coincidencias todos y cada uno de los nmeros que contengan cuatros.
grep encontrar como coincidencias todos, ya que el punto se traduce como cualquier carcter y *
(repetido cero o ms veces).
grep encontrar como coincidencias: ".*" debido a que los carcteres estn escapados.
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."
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 #.
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.
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.
grep encontrara como coincidencias todas las palabras que slo contengan letras alfabticas
(inglesas).
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.
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 "-".
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
Hay algunos ms, pero estos son los ms importantes. Ahora reescribiremos algunos ejemplos
anteriores usando estos conjuntos POSIX:
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].
grep encontrar como coincidencias todas las palabras que no contengan letras alfabticas
(inglesas).
grep encontrar como coincidencias todas las palabras que no contengan letras A, I, de h a z.
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
grep encontrar como coincidencias cualquier palabra que empiece con un nmero y acabe con el
mismo nmero y entre los nmeros tenga letras.
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.
La otra caracterstica interesante es la de poder elegir entre dos patrones distintos usando \| entre
los dos patrones:
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
grep encontrar como coincidencias cualquier palabra que empiece con ftp o http y que contine
con un conjunto de letras minsculas, puntos, y guiones.
grep encontrar como coincidencias cualquier palabra que empiece con 6 o 9 y que acabe con el
mismo nmero, con letras en medio.
25
grep encontrar las palabras formadas por entre tres y seis cincos.
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.
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.
grep slo coincidir con el primer hola, debido a que es el que est al principio de la lnea.
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:
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
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:
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
28
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:
30
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.
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.
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
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.
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.
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
34
with
(1001)
group
`pepito
`/home/pepito
`/etc/skel
Donde:
[-g grupo]: Nombre del grupo primario. Ojo el grupo debe ya existir.
[-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.
35
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
Bloquea
la
cuenta
de
usuario.
-U La desbloquea.
Para saber ms
36
[alain@debian]$
Changing
passwd
password
for
alain
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.
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:
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.
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:
38
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:
ls
-l
|grep
prueba.sh
|grep
prueba.sh
Vemos el resultado
[debian:/home/alain]#
ls
-l
39
ls
-l
|grep
prueba.sh
|grep
prueba.sh
Vemos el resultado
[debian:/home/alain]#
ls
-l
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
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
{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
r-x
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:
Permiso
42
Valor
Decimal
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
777
rwx r-x r
754
r-x r
540
43
44
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
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
....
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":
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:
47
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:
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:
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
48
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:
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:
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.
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.
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:
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:
50
0 50000000
34895
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:
used
soft
File limits
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.
#> edquota -t
/dev/sda3
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:
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.
52
manera "oficial" de establecer cuotas masivamente, sin embargo, no hay problema, usaremos un
pequeo script que te permitira realizarlo.
blocks
/dev/sda3
68
soft
hard
300
inodes
400
17
soft
0
hard
0
:wq
used
soft
File limits
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.
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:
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
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)
used
soft
File limits
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
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.
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.
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 ".".
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
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
58
5. Av/Re Pgina
o
Insertar texto
vi proporciona muchos comandos para insertar texto, que nos hacen pasar del modo comando al
modo de edicin.
1. Aadir
o
2. Insertar
o
Pulsando o (open) se inserta una lnea debajo de la posicin actual 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.
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.
2. Cortar y pegar
El procedimiento para mover una varias lneas es el siguiente:
o
61
Teclear comillas dobles ( " ) seguido de la letra con que se desea nombrar el buffer
(Ej: "a )
Teclear comillas dobles seguidas por la letra del buffer cuyo contenido se desea
insertar y por p P (comando pegar).
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
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.
#lineaG
(Ej. 6G)
Bsqueda
Para encontrar un string, hay que escribir una barra hacia la derecha (/) seguida por el string que
se desea buscar, y pulsar return.
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
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
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
: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
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
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:
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.
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.
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.
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
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.
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.
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
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 *'.
En este caso, la parte stdout del comando se enva a stderr; puede observar eso de varias
maneras.
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).
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
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.
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.
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.
69
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)
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.
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
71
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.
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.
Este script 'emula' la conocida (C, Pascal, perl, etc) estructura `for'.
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.
Llamar a la funcin es como llamar a otro programa, slo hay que escribir su nombre.
73
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.
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.
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!"
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.
Siempre usas #!/bin/bash .. a lo mejor quieres dar un ejemplo de cmo saber dnde encontrar el
bash.
76
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"
78
Los programadores de C tan slo tienen que corresponder el operador con su parntesis.
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.
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'.
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
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
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
#!/bin/sh
# renom: renombra mltiples ficheros de acuerdo con ciertas
# reglas
# escrito por Felix Hudson Enero - 2000
82
exit 0
fi
if [$1 = ]; then
echo "no se especificaron ficheros"
exit 0
fi
for fichero in $*
do
mv ${fichero} $fichero$sufijo
done
exit 0
fi
shift
83
# hecho!
84
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
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.
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.
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.
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
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.
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:
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
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).
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.
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
si
se
est
usando
informacin
anticuada
que
deba
actualizarse.
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.
95
posible gracias a que Bind toma las caractersticas omitidas del registro SOA anterior, es
decir, @ IN. Desde luego, ambas formas son correctas.
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.
96
Parmetro Significado
Unidad Valores
Comentario
d1
Latitud
(grados)
0..90
m1
Latitud
(minutos)
'
0..59
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
d2
Longitud
(grados)
0..180
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
hp
Precisin
horizontal
0..90000000,00
vp
recisin
vertical
0..90000000,00
..
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).
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
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
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";
};
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.
ms
hosts,
tal
como
hemos
especificado
en
el
fichero
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.
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
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.
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
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
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.
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.
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
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.
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.
112
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.
113
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.
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.
Zona
Bsicos
Seguridad
Tipo
Nombre
Funcin
SOA
Start Of Authority
NS
Name Server
Identifica los
subdominios
Direccin IPv4
AAAA
Direccin
original
A6
Direccin IPv6
PTR
Puntero
IPv6
servidores
de
zona,
delega
Actualmente obsoleto
DNAME Redireccin
MX
Mail eXchanger
KEY
Clave pblica
NXT
Next
SIG
Signature
Zona autenticada/firmada
LOC
Localizacin
RP
Persona responsable
SRV
Servicios
TXT
Texto
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.
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
status
122
trace
notrace
Desactiva la depuracin
dumpdb
stats
reload
querylog
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
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
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.
definicin_de_canal;
definicin_de_canal;
...
category
nombre_categora
nombre_canal;
nombre_canal;
...
};
};
"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 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
default_debug
default_stderr
null
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
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.
Tipo de servidor
Descripcin
Ingls
Espaol
authoritative
autorizado
master
maestro
slave
esclavo
stub
N/A
distribution
distribucin
no autorizado
caching
reserva
forwarder
redireccionador
recursive
recursivo
nonauthoritative
(b)
126
(a)
nonrecursive
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.
Descripcin
include
options
defecto.
server
key
acl
zone
trusted-
keys
controls
logging
view
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;
};
};
Introduce un comentario
()
Qu especifica
allow-query
allow-transfer
128
los
logs
};
{
allow-update
zone
blackhole
options
bogus
server
acl
varios
Qu incluye
default
general
config
queries/client
dnssec
Mensajes de DNSSEC.
lame-servers
statistics
panic
update
ncache
xfer-in
xfer-out
db/database
packet
notify
cname
security
Peticiones aprobadas/denegadas.
os
(a)
(b)
129
insist
maintenance
load
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.
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.
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
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/
132
chown
-R
bind:bind
/var/lib/named/var/cache/bind
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
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=""
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.
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
cd
/var/lib/named
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
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=""
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.
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.
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.
Una vez que se halla descargado e instalado el dhcp, este creara su fichero de configuracion en la
siguiente ubicacin:
/etc/dhcpd.conf
136
Parametros de configuracion
ignore client-updates
shared-network redLocal
subnet
netmask
option routers
option subnet-mask
137
option broadcast-address
option domain-name "tuDominio.com";
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
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
option
broadcast-address
192.168.2.255;
option
domain-name
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.
140
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:
El calificativo FQDN ser servidor.simulnet.com. Nota que este dominio sera el utilizado
por una intranet
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:
Este comando instalar una gran cantidad de dependencias aproximadamente unos 190
megabytes de descarga.
Configuracin del Servidor:
# ipa-server-install --help
Probando la instalacin:
kinit
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.
klist
Ticket
cache:
Default
Valid
FILE:/tmp/krb5cc_0
principal:
starting
admin@SIMULNET.COM
Expires
Service
principal
Si la salida del comando klist es semejante a esta entonces el servidor IPA est trabajando
correctamente.
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 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
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 estos casos los parmetros se encuentran ubicados dentro de secciones donde se indica el
mbito de aplicacin del parmetro.
<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:
Tambin hay que destacar, que el fichero contiene un montn de comentarios para su correcta
utilizacin, las lneas comentadas aparecen con el smbolo #.
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.
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
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
LoadModule: Directiva que sirve para cargar mdulos que incluyen distintas funcionalidades.
La sintaxis es:
147
No puede estar dentro de ninguna seccin. Se encuentra disponible a travs del mdulo Core.
La sintaxis es:
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.
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
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.
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.
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>
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.
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.
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.
Valor de ms a menos son: debug, info, notice, warn, error, crit, alert, emerg
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:
150
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.
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
Sintaxis:
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.
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.
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:
Ejemplo:
AddIconByType /icons/text.gif text/*
152
Ambas directivas se pueden encontrar dentro de el fichero .htaccess, dentro de una seccin
<Directory> o fuera de cualquier otra.
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
ErrorDocument: Esta directiva establece el la configuracin del servidor para cuando se produce
un error. Se pueden establecer cuatro configuraciones distintas:
Sintaxis:
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.
CacheRoot: establece el directorio donde se encontrarn los ficheros de la cache del Apache. 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
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
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.
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.
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
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.
156
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.
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.
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
Con
"AuthName
"ServidorPruebasAlain"
se
asociar
esta
carpeta
con
el
dominio
158
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:
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:
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.
Allow from env=entrada permitir el acceso a todas las peticiones que tengan definida la variable
de entorno "entrada".
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
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
ServerSignature Off
ServerTokens Prod
El ServerSignature aparece en la parte inferior de las pginas generadas por apache tales
como los famosos errores 404.
162
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.
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:
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
Options -Indexes
Options -Includes
Options -ExecCGI
Options -FollowSymLinks
164
Options None
Si solamente deseas desactivar algunas en concreto, separalas con un espacio en las opciones de
directiva:
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
LimitRequestBody 1048576
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.
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.
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.
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.
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
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.
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.
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.
Configuracin de Squid
El archivo de configuracin general de squid se llama squid.conf y se encuentra ubicado en
/etc/squid/squid.conf.
169
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:
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:
Tambin podemos especificar rangos de direcciones mediante una acl de tipo src:
dst
Especifica una direccin destino de una conexin en formato IP/mscara.
170
Tambin podemos especificar hosts concretos mediante una acl de tipo dst:
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]
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:
Ejemplo
acl horario_laboral time M T W H F 8:00-17:00
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:
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
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
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$
Ejercicio 1
Crear un archivo de configuracin para denegar el acceso a todos los equipos a la direccin
www.google.com
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.
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.
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
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.
Ejercicio 6
Impide la conexin a Internet a todos los equipos en horario de 18:00 a 21:00 horas.
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.
Ejercicio 8
Deniega el acceso a Squid al equipo con IP 192.168.1.5. Permite el resto de accesos a Squid.
175
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.
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.
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.
176
Ejercicio 12
Restringe el acceso a todo el contenido con extensin .mp3 a los equipos de la red.
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.
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
#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:
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:
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.
178
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:
LDAP en 127.0.0.1.
Habiendo hecho lo anterior, deberemos tener en la seccin de Listas de Control de Acceso algo
similar a lo siguiente:
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:
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:
Habiendo hecho lo anterior, la zona de reglas de control de acceso debera quedar de este modo:
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.
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.
-Antes de instalar Zimbra debemos detener el servicio de Postfix y evitar que arranque de nuevo,
para eso ejecutamos los comandos:
-Instalacin de Dependencias:
nc (Netcat)
sudo
libidn
gmp
NPTL
sysstat
sqlite
-Cuando se ejecuta el script de instalacin, este verifica que los paquetes de Zimbra a ser
instalados estn disponibles:
Zimbra LDAP: Instala OpenLDAP el cual provee una solucin opensource de servicio de
directorio.
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
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.
-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?
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
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.
* 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-
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.
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.
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.
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.
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
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
1 GB de RAM.
1 CPU de un core
Requerimientos Recomendados
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.
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
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-database
fan-central
fan-poller
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 de consumibles
Base de conocimientos
Gestin de reservas
Soporte Tcnico
Automatizacin de inventario
Reduccin de costos
Optimizacin de recursos
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.
glpi/glpi
tech/tech
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.
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
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
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
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
Personalizacin
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:
Personalizacin
Configuracin de la presentacin
Desplegar lista:
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
Modo OCSNG
Identificacin
Preguntas frecuentes
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
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.
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.
203
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.
Configuracin de java
Con este comando se le indica al OpenNMS que tome los archivos que necesita del java.
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.
Luego de editar el archivo reiniciamos el firewall con el comando service iptables restart.
ERRORES
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
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