You are on page 1of 220

MÓDULO 1.

- CONCEPTOS BÁSICOS
Unidad 1.- Introducción

1.1.- QUE ES LINUX

Se trata de un sistema operativo de 32 bits de libre distribución, desarrollado


originalmente por Linus Torvalds, un estudiante de la universidad finlandesa de
Helsinki, quien, en 1991, se abocó a la tarea de reemplazar a Minix, un clon de
Unix de pequeñas proporciones y finalidad académica desarrollado años antes por
Andrew Tannenbaun.

Linux es distribuido bajo la Licencia General Pública de GNU, lo cual significa que
puede ser distribuido, copiado y modificado gratuitamente, a condición de no
imponer ninguna restricción en sucesivas distribuciones. En pocas palabras: Linux
es un sistema operativo gratuito.

En sus origenes se trataba de un sistema operativo inacesible al publico en


general dada la dificultad en su instalacion y posterior puesta a punto. Hoy en dia
con la mejora del sistema de instalacion y de un entorno de ventanas mas
amigable se ha convertido en un sistema operativo asequible al publico en
general. Se puede hacer todo lo que se puede hacer con un sistema operativo
comercial (Microsoft, Mac OS X9 pero, tal y como hemos comentado antes, se
trata de un sistema operativo gratuito.

Licencia de distribución

En 1992, Linux Torvalds registro linux bajo licencia GNU GPL, es decir,
resgistrado como “Software Libre”. Que significa que un software sea libre? Que
sobre ese software tenemos la libertad de:

1.- Usar el programa con cualquier propósito.


2.- Estudiar cómo funciona el programa, y adaptarlo a sus necesidades. Es
necesario tener acceso al código fuente del software para poder estudiarlo.
3.- De distribuir copias.
4.- De mejorar el programa y hacer públicas las mejoras a otras personas.
Para mejorar un programa, es necesario tener acceso al código fuente.

Una empresa podra crear su propia distribucion y sacar beneficio economico de


ello, pero nunca explotarlo en exclusiva. Existen distribuciones de pago como Red
Hat frente a otras gratuitas como Ubuntu, distribucion que empleraremos durante
el curso

1.2.- DISTRIBUCIONES MÁS CONOCIDAS

Actualmente, existen muchas distribuciones diferentes basadas en GNU/Linux.


Las hay para toda clase de ordenadores y dispositivos electrónicos: ordenadores
portátiles o de sobremesa, pocketPC o PDA, puntos de acceso de redes wireless,
etc. La naturaleza del software libre permite esto: cualquiera puede coger el
código desarrollado hasta el momento y adaptarlo a sus propias necesidades. Es
un hecho que, cada vez más, empresas y usuarios eligen sistemas basados en
GNU/Linux por sus elevadas prestaciones y la cantidad de software disponible.

A continuación haremos una breve descripción de algunas de las distribuciones de


GNU/Linux::

o Slackware: una de las primeras distribuciones que aparecieron.Fue


creada por Patrick Volkerding y tuvo un gran éxito en sus primerosaños de
existencia.

http://www.slackware.com/

o Debian GNU/Linux: una de las primeras distribuciones de GNU/Linux que


aparecieron y aún siguen existiendo y evolucionado. El sistema de
paquetes nos permite diferenciar claramente el software libre del que no lo
es, permitiéndonos disponer de todo el sistema solamente con programas
de licencia Free Software. Está desarrollada por un grupo de colaboradores
distribuidos por todo el mundo y no cuenta con el respaldo de ninguna
empresa. Aunque es de las más estables y seguras que existen, su
sistema de instalación y configuración necesita de conocimientos previos.
Es la distribución Linux sin ánimo de lucro más popular del mundo.

http://www.debian.org

o RedHat Linux: junto con SuSE, es una de las distribuciones de mayor


popularidad. Está creada por una empresa de EUA, aportando software de
gran calidad. Tiene un entorno muy intuitivo que facilita mucho su
instalación y configuración.

http://www.redhat.com/

o SuSE Linux: aunque es una distribución creada bastante recientemente,


ha tenido una gran difusión. Está desarrollada por una empresa alemana,
aportando mucho software propietario de calidad. Es muy completa y fácil
de instalar y mantener, aunque enalgunos aspectos no se siguen algunos
de los estándares de la comunidad.

http://www.opensuse.org/es/

o Knoppix: distribución en un CD-live basada en Debian. Detecta


automáticamente todo tipo de hardware y aporta el último escritorio de
KDE y la suite OpenOffice.org. Muy útil para demostraciones y usuarios
noveles en el sistema.

http://www.knoppix.net/

o Ubuntu es una distribución GNU/Linux de tipo escritorio, basada en


Debian y patrocinada por Canonical Ltda, empresa cuyo dueño es el
sudafricano Mark Shuttleworth.

Ubuntu debe su nombre al movimiento homónimo encabezado por el


obispo Desmond Tutu y Edgar Granados, quienes ganaron el Premio Nobel
de la Paz en 1984 por sus luchas en contra del Apartheid en Sudáfrica.
Mark Shuttleworth, el mecenas del proyecto, es sudafricano y por lo tanto
se encontraba muy familiarizado con la corriente. Tras ver similitudes
entre los ideales de los proyectos GNU, Debian y en general con el
movimiento del software libre, decidió aprovechar la ocasión para difundir
los ideales de Ubuntu.

http://www.ubuntu.com/

Ubuntu es la distribucion que utilizaremos en el presente curso, por ser una de


las mas extendidas y populares del momento.
MÓDULO 1.- CONCEPTOS BÁSICOS
Unidad 2.- Arquitectura del Sistema Operativo

2.1.- Usuarios y grupos

Actualmente, la mayoría de los sistemas operativos existentes son multiusuario y


multitarea. Ello implica que más de un usuario puede trabajar en el sistema de
forma simultánea a otros, ejecutando una o más tareas a la vez. Por este motivo,
es muy importante que el mismo sistema operativo incorpore mecanismos para
manipular y controlar correctamente a los usuarios: el sistema de entrada e
identificación (login), los programas que puede ejecutar cada uno, mecanismos
de seguridad para proteger el hardware del ordenador, protección para los
ficheros de los usuarios, etc.

Los sistemas operativos basados en UNIX organizan toda esta información por
usuarios y grupos. Al entrar en el sistema, debemos identificarnos con un login y
una contraseña. El login suele ser un nombre que identifica de forma inequívoca
al usuario. En sistemas donde hay más que unos pocos usuarios, es importante
disponer de una buena política de nombres para poderlos identificar a todos de
forma clara. La contraseña debe ser una combinación de letras, números y
caracteres especiales. No debe estar formada por ninguna palabra de diccionario
o similares porque puede representar un problema de seguridad importante. El
sistema de contraseñas es de tipo unidireccional. Esto quiere decir que nuestra
contraseña no es almacenada como texto, sino que es cifrada y guardada tal
como es.

A continuación una imagen donde se muestra un inicio de sesión típico de linux,


accediendo desde consola de texto:

Tras introducir correctamente los datos de usuario y contraseña, se nos muestra


en pantalla el prompt ó simbolito $, donde introduciremos los comandos que
seran interpretados por el Shell de linux. Volveremos a ello posteriormente.
Cuando entramos en el sistema y escribimos nuestra contraseña, ésta es cifrada
y comparada con la que está almacenada. Si coinciden, la identificación es
positiva, si no coinciden, no hay identificación. Lo importante de todo este
sistema es que a partir del cifrado no podemos conseguir, de ninguna manera, la
clave original. Los programas que intentan romper las contraseñas de los
usuarios lo único que pueden hacer es cifrar palabras a partir de diccionarios (con
sistemas automáticos para derivarlas y buscar variantes) y probar si coinciden
con el cifrado de alguna de las contraseñas de usuario. Es por eso muy
importante elegir contraseñas dificiles de adivinar, lo mas largas posibles e
introdiciendo caracteres extraños.

En todos los usuarios linux existe un usuario especial, root, que tiene privilegios
especiales para poder administrar el sistema. Por lo tanto hay que ser muy
cuidadosos a la hora de escoger una contraseña para ese usuario. Tambien ser
recomienda utilizar esa cuenta solo cuando no quede mas remedio ya que un
error cometida con la misma puede tener consecuencias catastroficas.

De todas formas, la cuenta que creamos durante la instalación puede adquirir


privilegios especiales si precediendo a la ejecuccion de cualquier comando,
escribe el comando ‘sudo’. Lo veremos mas adelante.

Teniendo en cuenta esto, muchas distribuciones de linux de escritorio ya no


permiten establecer una contraseña para el usuario root durante el proceso de
instalacion. En vez de eso, se crea una cuenta de usuario un poco peculiar: sin
privilegios por defecto pero que puede conseguirlos cuando sea requerido por el
sistema, introduciendo la contraseña.

2.2.- Sistemas de ficheros en linux

Todo sistema operativo necesita guardar multitud de archivos: desde los de la


configuración del sistema, los de log, los de los usuarios, etc. En general, cada
operativo utiliza su propio sistema de ficheros, caracterizándolo en muchos
aspectos como pueden ser el rendimiento, la seguridad, la fiabilidad, etc.

GNU/Linux es capaz de leer/escribir archivos con cualquiera de los sistemas de


ficheros que actualmente existen, aunque para su propia raíz y directorios principales
es necesario un sistema de ficheros que le permita ciertas operaciones. Generalmente,
se suele utilizar el tipo ext2, ext3 o ReiserFS. El ext2 es el más típico y extendido. Su
rendimiento es bastante bueno, incorpora todo tipo de mecanismos de seguridad y
tunning y es muy fiable. ext3 es la evolución del mismo, incorporando una tecnología
llamada de journaling. Una de las principales ventajas de esta tecnología es que si
hay un corte en el suministro de energía y el ordenador se apaga sin cerrarse
adecuadamente, los sistemas de recuperación de ficheros son más efectivos. ReiserFS
es un nuevo tipo de sistema que incorpora nuevas tecnologías de diseño que le
permiten ser más rápido. En el proceso de instalación del sistema operativo se nos
preguntará cuál de estos tres queremos usar. Generalmente se suele utilizar ext2 o
ext3 por estar más probados que el ReiserFS.

Ficheros y directorios

Los conceptos de ficheros y directorios se utilizan de la misma forma que en otros


sistemas operativos como Windows. La diferencia más destacable entre Windows
y Linux es la barra de separación de directorio: En Windows utilizamos \ mientras
que en Linux se utiliza /.
El nombre de un fichero puede contener cualquier carácter, no obstante, existen
algunos caracteres que no son recomendables ya que el shell puede interpretarlo
de otra forma. Estos caracteres peligrosos incluyen espacios, signos de
puntuación, acentos, etc.
El carácter punto ‘.’ es equivalente a cualquier otro. Esto significa que podemos
tener un nombre de fichero que contenga varios puntos. Por ejemplo, un archivo
podria llamarse

Curso.doc.gz

En Linux, un fichero que comienza por un punto se considera un fichero oculto y


no se muestra, por defecto, en un listado usando el comando 'ls'.
Los ficheros ocultos se suelen utilizar para los archivos de configuracion que hay
en los directorios de los usuarios.

Linux diferencia entre mayúsculas y minúsculas. Por lo tanto, son distintos los
siguientes ficheros:

Curso.doc.gz
curso.doc.gz
Curso.doc.Gz

Estructura de directorios

Lo primero que debemos tener claro es que en linux, todo el sistema de ficheros
parte de una misma raíz, a la cual nos referiremos con el carácter “/ ”. Es el
origen de todo el sistema de ficheros y sólo existe una. Para organizar los ficheros
adecuadamente, el sistema proporciona lo que llamaremos directorios (o
carpetas), dentro de las cuales podemos poner archivos y más directorios. De
este modo conseguimos una organización jerárquica como la que vemos en la
siguiente figura:
Imagen cogida de:
http://geek2live.blogspot.com/2007/09/linux-file-structure.html

Una característica muy importante de todos los sistemas operativos basados en UNIX
es que todos los dispositivos del sistema se pueden tratar como si fueran ficheros.
Igualmente, cuando queramos acceder al contenido de un CD, disquete o cualquier
otro dispositivo de almacenamiento, deberemos montarlo en un directorio ya existente
en el sistema y navegaremos por él como si se tratara de una carpeta más (el uso de
diferentes unidades -A:,B:,C:,D:,. . . es un esquema existente únicamente en sistemas
operativos tipo WindowsTM).

Directorios de Sistema en Linux

Vamos a mostrar un listado de los principales directorios que encontramos en la


mayoria de los sistenmas linux junto a una explicación de uso:

o /bin: comandos básicos para todos los usuarios del sistema.


o /boot: archivos estáticos necesarios para el arranque del sistema.
o /dev: dispositivos del sistema.
o /etc: archivos de configuración del sistema y de las aplicaciones
instaladas en el mismo.
o /home: directorio para poner las carpetas home de los usuarios.
o /lib: librerías esenciales para el núcleo del sistema y módulos del mismo.
o /mnt: punto de montaje temporal para dispositivos.
o /proc: procesos y variables del núcleo del sistema.
o /root: directorio home para el root del sistema.
o /sbin: comandos especiales para el root del sistema.
o /tmp: archivos temporales. Según la distribución utilizada (o la
configuración que utilicemos) se borran al arrancar el sistema o cada
cierto período de tiempo.
o /usr: segunda estructura jerárquica, utilizada para almacenar todo el
software instalado en el sistema.
o /var: directorio para los spoolers de impresión, ficheros de log, etc.

Es muy recomendable conservar y no eliminar ninguno de estos directorios (o los


que por defecto nos crea la distribución que utilizamos), ya que son básicos para
el buen funcionamiento del sistema. Generalmente, los procesos de instalación de
nuevas aplicaciones necesitan que exista la organización dada y muchos de los
archivos de configuración de los programas deben estar en determinados
directorios. Lo que sí que podemos hacer sin ningún tipo de restricción es crear
nuevos directorios en la raíz del sistema o en cualquier otra carpeta

Cuando entramos en el sistema, es usual que el login nos sitúe en nuestro


directorio home.

Para movernos por la estructura de directorios debemos utilizar los comandos


para listar contenidos y cambiar de carpeta. Si queremos ver lo que hay en el
directorio donde estamos situados, podemos listar los contenidos utilizando el
comando ls.
En la imagen, el comando ls nos ha devuelto tres entradas “visibles”. Pero
además, en todos los directorios existen dos entradas ocultas: “.” y “..”. El
punto es la referencia al directorio actual, mientras que los dos puntos seguidos
hacen referencia al directorio inmediatamente superior (en el árbol de jerarquías)
al actual. Naturalmente, cuando estamos situados en la raíz del sistema de
ficheros, la entrada “..” no existirá porque nos encontramos en el nivel superior.
Para ver tambien las entradas ocultas, pasaremos el parametro “-a” al comando
ls:

Para cambiar de directorio podemos utilizar el comando cd. Si no le pasamos


ningún parámetro, por defecto nos situará en nuestro directorio home. Lo
podemos comprobar con el comando pwd, que nos devuelve la ruta completa del
directorio donde nos encontramos:

En la imagen se puede ver que el directorio donde nos encontramos nada mas
iniciar la sesión es el home del usuario, en nuestro caso /home/usuario.

Generalmente, se le suele indicar dónde queremos ir,pasándolo de forma


absoluta o relativa. De forma relativa significa que partiremos del directorio
donde estamos en el momento de ejecutar el comando. Por ejemplo, si estamos
en el directorio /home/usuario/correo y queremos llegar al directorio home
podemos hacerlo de dos formas:

o Relativa. Ejecutando cd ../../../home

o Absoluta. Ejecutando cd /home


MÓDULO 1.- CONCEPTOS BÁSICOS
Unidad 3.- Arranque y parada del Sistema

Una vez que hemos instalado correctamente Ubuntu, vamos a ver con mas
detenimiento el proceso de arranque y apagado del Sistema Operativo

3.1.- NIVELES DE EJECUCIÓN (RUNLEVELS). DESCRIPCIÓN

Un sistema Linux siempre se encuentra funcionando dentro de un nivel de


ejecución. Un nivel de ejecución (runlevel) define el modo de ejecución del
sistema. En la siguiente tabla vemos una breve descripción de cada uno de los
niveles:

Nivel de Ejecución Estado del Sistema


0 Proceso de apagado del sistema. Se
detienen todos los procesos activos
1 Modo de administración. El sistema
crea un shell con los privilegios del
superusuario sin solicitar nombre de
usuario o contraseña
2 Modo de funcionamiento normal sin
algunos servicios de red.
3 Generalmente No se utiliza
4 Generalmente No se utiliza
5 Sistema en modo multiusuario.
Servicios de red activados. Inicia
Automáticamente X Window y se
permite hacer login gráfico.

6 Proceso de reinicio del sistema. Es


idéntico al runlevel 0 con la excepción
de que no apaga la máquina, sino que
la reinicia.

Como usuario “root”, podemos visualizar el runlevel actual de la máquina usando


el comando 'runlevel'
3.2.- CAMBIAR EL NIVEL DE EJECUCIÓN

Para cambiar el nivel de ejecución se utiliza el comando 'init'. Sólo el usuario root
tiene permitido cambiar entre los distintos runlevels.

Por ejemplo, para reiniciar el equipo, ejecutaremos el siguiente comando:

# init 6

Para apagar la máquina se utiliza el comando 'shutdown' (este comando solo


puede ser ejecutado por el usuario root). Entonces, para apagar o reiniciar puede
usar:

#shutdown –h now (apaga la máquina)


#shutdown –r now (reinicia la máquina)

Tambien podríamos apaga la maquina con el comando init:

# init 0

Generalmente, todas las distribuciones admiten que la pulsación Ctrl+Alt+Supr


desde la consola inicie el proceso de apagado o reinicio del sistema.
MÓDULO 1.- CONCEPTOS BÁSICOS
Unidad 4.- Permisos
Cada fichero o directorio en Linux tiene asociado un usuario propietario, un grupo
y unos permisos. Cuando un usuario crea un fichero, automaticamente se
convierte en su propietario aunque esto se puede modificar posteriormente.

Los permisos sobre un fichero o directorio en linux estan definidos en base a tres
grupos de personas diferentes:
o Usuario propietario: es el propietario del fichero o directorio.
o grupo: comprende los usuarios que están en el mismo grupo del fichero o
directorio.
o Resto: el resto de los usuarios del sistema, que no sean el usuario
propietario ni pertenezcan al grupo.

Cada uno de estos grupos puede tener tres tipos de permisos sobre el archivo o
directorio:
o Lectura: Para ficheros, este permiso permite leer el contenido del mismo.
Para directorios, el permiso permite listar el contenido del directorio.
o Escritura: Aplicado a ficheros, este permiso permite escribir contenido en
el archivo.Para directorios, el permiso permite crear y borrar ficheros
dentro del directorio.
o ejecución: Aplicado a ficheros, el permiso permite ejecutar el programa
almacenadoen el archivo. Usado en directorios, este permiso permite
acceder al contenido de los ficherosalmacenados dentro del directorio.

Si ejecutamos el comando ‘ls –l’, se nos muestra un listado de archivos o


directorios con sus permisos correspondientes:

El comando nos devuelve la informacion por columnas. La tercera columna nos


devuelve el propietario del fichero (usuario), la cuarta columna el nombre del
grupo (cursolinux) y la octava columna indica el nombre de archivo o directorio
(agenda.txt). Pero nos vamos a centrar en la primera columna: diez caracteres
que nos indican los permisos del fichero de la siguiente manera:

• Carácter 1: esta entrada nos indica si es un fichero o un directorio. En caso de


ser un fichero, aparece el carácter “-”, mientras que por los directorios aparece
una “d”. En nuestro caso, agenda.txt se trata de un fichero.

• Caracteres 2, 3, 4: nos indican, respectivamente, los permisos de lectura,


escritura y ejecución para el propietario del fichero. En caso de no tener el
permiso correspondiente activado, encontramos el carácter “-” y si no “r”, “w” o
“x”. En nuestro caso, el usuario tiene permisos de lectura y escritura pero no de
ejecucción.

• Caracteres 5, 6, 7: estos caracteres tienen exactamente el mismo significado


que anteriormente, pero hacen referencia a los permisos concedidos a los
usuarios del grupo al que pertenece el fichero. En nuestro caso, los usuarios que
pertenezcan al grupo cursolinux tienen permisos de lectura pero no de escritura
ni ejecucción.

• Caracteres 8, 9, 10: igual que en el caso anterior, pero para los otros usuarios
del sistema. Es decir, solo permisos de lectura.

Para cambiar los permisos de un determinado archivo podemos utilizar el


comando chmod. Debemos tener en cuenta que sólo el propietario del archivo (o
el root ) puede cambiar estos permisos, ya que si no, el mecanismo no tendría
ningún sentido. Podemos utilizar este comando de muchas maneras diferentes,
pero la mas intuitiva y sencilla es la siguiente:

• Indicando, primero, si nos referimos a los permisos del usuario, grupo o al resto
con las letras “u”, “g” u “o” respectivamente.
Seguidamente, debemos añadir un “+” o “-” según si queremos añadir o eliminar
el atributo, que indicaremos con “r”, “w”, “x”. Además, podemos hacer todas las
combinaciones posibles, refiriéndonos a más de un permiso y/o usuarios. Por
ejemplo, si queremoa asignar al grupo cursolinux permisos de escritura:

Para dejarlo como estaba, igual pero cambiando el signo “+” por “–“

Para cambiar el propietario de un fichero existe el comando chown, que sólo


puede utilizar el root por razones de seguridad. Para cambiar el grupo de un
determinado archivo, se puede utilizar el comando chgrp. Como podemos
suponer, cuando un usuario crea un nuevo archivo, el sistema pone como
propietario al usuario que lo ha creado y lo da como perteneciente al grupo
primario del mismo usuario.

Me conecto como root y me ubico en el directorio del usuario para cambiar el


owner del usuario:
Ahora cambio el grupo con el comando chgrp:
MÓDULO 1.- CONCEPTOS BÁSICOS
Unidad 5.- Instalacion de Ubuntu 8.0.4

Vamos a ver por encima el proceso de instalación de una distribución Ubuntu.

Los requisitos minimos para la instalacion de Ubuntu en un PC son los siguientes:


o CPU: Intel Pentium III o AMD Athlon a 600 MHz o superior
o RAM: 384 MB para ejecutar el LiveCD O 256 MB para ejecutar el instalador
solo o mas
o Disco Duro de 3 GB o mas
o Tajeta de Red y Conexion a Internet: Para la instalacion De Los Paquetes
de idiomas (Sin los Paquetes de idiomas la mayor parte de las aplicaciones
o programas estan en Ingles)
o Tarjeta Grafica: Minimo de 2 MB de Video o 32 MB Con Aceleracion 3D
Para ejecutar el Compiz Fusion
o Opcional:Tajeta de sonido

Si nuestro equipo cumple con los requisitos el siguiente paso es la obtencion de


un disco de instalacion de Ubuntu. Tenemos dos opciones:

o Descargarse una imagen ISO de la pagina oficial de ubuntu:


http://www.ubuntu.com/getubuntu/download

Y grabarla en un CD.

o Solicitar una copia gratuita en la siguiente dirección:


https://shipit.ubuntu.com/

Tarda unas semanas pero el CD acaba llegando. Si tenemos prisa es mejor


descargarla de la web.

Una vez tengamos el cd, hay que arrancar su ordenador desde el CD. Al arrancar,
aparecerá una pantalla en la que nos da la opción de seleccionar nuestro idioma.
Una vez hecho nos presenta la pantalla de bienvenida:
Seleccionamos en esta pantalla la primera opción si deseamos ejecutar el entorno
de Ubuntu corriendo desde el CD-Rom o si tenemos claro que queremos hacer la
instalación en el disco seleccionaremos la segunda opción.
Las instalacion consta de los siguientes pasos:

o Paso 1: Elegir el idioma. Si en la pantalla de bienvenida eligió el español,


simplemente pulse adelante («Siguiente» o «Forward»), en otro caso
seleccione «Español» en la lista, y continúe

o Paso 2: Elegir la zona horaria. Simplemente pulse sobre su zona para


acercar el mapa y después sobre la ciudad concreta representativa de su
huso horario. Por ejemplo, en el caso del huso peninsular en España
habría que pulsar sobre el país y luego sobre Madrid
o Paso 3: Elegir el tipo de teclado. Si todo va bien y no tiene un teclado
fuera de lo común sino un teclado español estándar, debería estar ya
seleccionado (teclado «Spain»). Cerciórese de que esto es así escribiendo
en la caja de texto que hay en la parte inferior, pulsando algunas teclas
específicas del español, como la «ñ» y algunos símbolos habituales como
el euro.

o Paso 4: Se trata de indicar dónde se debe instalar Ubuntu. Existen tres


opciones:

o Formatear todo el disco duro. Elija ésta si desea borrarlo todo y


usar el disco duro por defecto como único para Ubuntu.
Es la opción más fácil y menos problemática.

o Espacio libre contiguo. Ubuntu usará un trozo de espacio libre del


disco duro para instalarse. Ésta es la opción más recomendable si
desea conservar su antiguo sistema operativo o alguna partición
con sus datos. Es una opción muy habitual para aquéllos que
desean seguir también con un primer o segundo sistema operativo
como Windows o Mac OS.

o Particionamiento manual. Con esta opción, podrá especificar cómo


serán las particiones de forma más específica. Ésta no es la mejor
opción si nunca se ha hecho una partición o se ha instalado Linux
antes.

o Paso 5: En este paso de la instalación le preguntará sus datos: su nombre


real y su nombre o apodo de usuario.

o Paso 6 En la pantalla siguiente, se muestra un resumen de las elecciones


que ha hecho hasta ahora.
Si esta de acuerdo pulse «Siguiente» para comenzar a copiar los archivos de
Ubuntu al disco duro.

Si durante el proceso de instalación tenemos conexión a internet, el


programa de instalación se conectará y descargará los paquetes necesarios
para dejar nuestra instalación de Ubuntu completamente en nuestro idioma.

Paso 7 Si todo se instaló correctamente, al final la instalación le preguntará si


desea reiniciar, sacando el CD-ROM de la unidad. Tras el siguiente inicio, ya
tendriamos nuestro sistema instalado.
MÓDULO 2.- X-WINDOW
Unidad 1.- Arquitectura X-Window
1.1.- ¿QUE ES X-WINDOW?

X-window es una arquitectura de ventanas diseñada a mediados de los ochenta para


poder disponer de un entorno grafico en estaciones de trabajo. A diferencia de otros
entornos de ventanas, la arquitectura X-window se diseño para ser independiente de
plataforma, de manera que se pudiera instalar en cualquier ordenador que corriera
un sistema tipo UNIX.

Aunque la arquitectura de ventanas X-Window ha tenido una dilatada historia en la


que se han utilizado diferentes tipos de licencias, varias implementaciones y muchos
equipos de desarrollo diferentes, actualmente se utiliza, mayoritariamente, la
implementación que ha desarrollado el proyecto XFree86 Inc., llamada XFree86. Esta
implementación se distribuye con licencia open source, que aunque no es
exactamente igual que la GPL o sus variantes, tiene características parecidas que
permiten acceder a su código fuente, sus predistribución, etc. Por este motivo, en la
mayoría de distribuciones de GNU/Linux (y cada vez mas en otros sistemas
operativos -como Mac Os X-) se incorpora esta implementación de X-Window.

X-Window esta diseñado como una arquitectura cliente/servidor. Este tipo de


arquitectura significa que el software está estructurado en dos partes totalmente
independientes (cliente y servidor) que se comunican a partir de un enlace de
comunicación. Aunque esto implica que el diseño y codificación es un poco más
compleja, esta arquitectura proporciona una flexibilidad total en el sentido que
cliente y servidor pueden estar ubicados en diferentes sitios y utilizando diferentes
plataformas y/o sistemas operativos. Además, podemos aprovechar muchísimo más
un mismo cliente, ya que este podrá dar servicio a más de un servidor a la vez. De
esta forma, los ordenadores servidores pueden trabajar con un entorno grafico y los
recursos del cliente. Naturalmente, esta arquitectura también nos permite trabajar
con X-Window de forma local en la maquina donde esta situado el cliente, aunque no
es indispensable.

Los componentes de los que esta compuesto X-Window son: cliente, servidor y
enlace de comunicación. Cliente y servidor están diseñados para ser independientes
de plataforma y, en el caso del enlace de comunicación, para ser independiente del
protocolo de red.

De este modo, podemos utilizar X-Window en cualquier tipo de escenario; por


ejemplo, podríamos tener el servidor instalado en un ordenador con Windows,
conectándose a un cliente con GNU/Linux y utilizar como canal de comunicación
Internet (protocolo Ipv4). Aunque la configuración de cada uno de estos
componentes (sobre todo el cliente) si que depende, en cierto modo, de la
plataforma donde esta instalado, el enlace de comunicación nos permite aislar los
componentes, dándoles un lenguaje propio para su entendimiento.

Este enlace utiliza un protocolo propio denominado XDMCP (X Display Manager


Control Control Protocol), que esta en un nivel superior al de la red de comunicación
utilizada (por eso es independiente de red).
En esta arquitectura, el servidor esta ideado para recoger los eventos que se
producen por los dispositivos de entrada como el teclado, el ratón, etc. Y enviarlos al
cliente. El cliente procesa estos eventos y responde al cliente, que muestra los
resultados en los dispositivos de salida (generalmente el monitor).

Aunque la primera impresión que puede sugerirnos este diseño es que el tiempo de
respuesta debe ser muy lento, el protocolo XDMCP esta especialmente diseñado para
proporcionar un enlace rápido entre cliente y servidor, de forma que se pueda
trabajar realmente de forma interactiva. En los únicos escenarios en que podemos
notar este inconveniente es en conexiones remotas utilizando redes de
comunicaciones lentas.

En resumen, pues, las principales características y funciones de cada uno de los


componentes de X-Window son las siguientes:

Gestión de diferentes servidores simultáneamente


Cliente Dependiente de plataforma
Procesamiento de las aplicaciones
Control del display del usuario
Servidor Independiente de plataforma
Procesamiento de los dispositivos de entrada
Diseñado para poder trabajar interactivamente
Enlace Pensado para minimizar el trafico de red
Transparente (independiente de red)

A medida que las tarjetas graficas han ido evolucionando, cada vez más aplicaciones
y juegos necesitan de un procesamiento en 2D o 3D más rápido.

Si bien la arquitectura de ventanas X-Window aporta muchas ventajas, cuando


queremos utilizar este tipo de aplicaciones el diseño cliente/servidor no es el más
adecuado, ya que no aprovechamos las funciones de procesamiento 2D y 3D
extremadamente rápido de las tarjetas graficas instaladas en el servidor. Para
solucionar este problema, a partir de 1998 apareció una tecnología llamada DRI
(Direct Rendering Infrastructure), que permite aprovechar los chips de
procesamiento de las tarjetas para ahorrar trabajo al cliente X-Window. De esta
forma, continuamos teniendo todas las ventajas de X-Window aprovechando los
elementos específicos de las tarjetas graficas.
A diferencia de otros sistemas operativos donde el entorno grafico esta íntimamente
integrado con el resto de funciones, la arquitectura X-Window es totalmente
independiente del operativo y no nos limita a ningún GUI (Grafic User Interface)
determinado. De hecho, la arquitectura solo nos proporciona herramientas graficas
de bajo nivel para manipular la salida del monitor.

Estas herramientas están incluidas en la librería Xlib y principalmente son funciones


para crear y manipular ventanas, operaciones con fuentes de caracteres, detección
de eventos de usuario y operaciones graficas. Con estas funciones poder dotar a
nuestra aplicaciones del look and feel que queramos, crear nuevos GUI,… de hecho,
esto supuso un trabajo adicional para los primeros desarrolladores de aplicaciones en
X-Window, ya que además de programar la aplicación tenían que desarrollar sus
propias librerías para la creación de menús, iconos, etc.

A medida que X-Window fue creciendo, fueron apareciendo lo que llamamos toolkits,
que son librerías generalmente implementadas con Xlib y que proporcionan un GUI
particular. De esta manera, al diseñar una aplicación podemos utilizar alguno de
estos toolkits que ya proporcionan las herramientas estándar para crear menús,
botones, gestionar los cut and paste,… y centrarnos en programar la aplicación en si.
El no marcar ningún look and feel ha sido otra de las claves del éxito de la
arquitectura X-Window, ya que cada fabricante o desarrollador de software ha podido
diseñarse uno propio, marcando la diferencia con los demás.

Aunque existen muchos toolkits diferentes, en la siguiente figura podemos ver


alguno de los más populares que se han utilizado a lo largo de la historia de X-
window:
El Window Manager es un servidor especial de X-Window que se encarga de
gestionar todas las ventanas, los escritorios, las pantallas virtuales, etc.
Naturalmente, todas las aplicaciones pueden funcionar con cualquier window
manager, ya que este solo se encarga de gestionar la ventana donde esta ubicado el
programa. Aunque la programación de un window manager es muy diferente que la
de una aplicación, también se suelen utilizar toolkits particulares que proporcionan
un look and feel determinado. Actualmente existen decenas de window managers
diferentes (wmaker, sawmill, olvwm,…), siendo el mismo usuario quien puede elegir
el que mas le guste.

Otro tipo de software muy relacionado con X-window es el que se encarga de


proporcionar un entorno integrado para las aplicaciones, el escritorio, las
herramientas de administración del sistema, etc. Los más populares que existen
actualmente son el KDE (the K Desktop Environment) y el GNOME (GNU Object
Model Environment). Los dos proporcionan un toolkit particular, un entorno de
escritorio con muchísima funcionalidades y configuraciones diferentes y una lista de
aplicaciones integradas que cada vez va creciendo más. La mayoría de distribuciones
de GNU/Linux y UNIX proporcionan herramientas y software propio de gran calidad
que ayudan en gran medida al usuario para configurar en sistema y el mismo
escritorio. Los dos pueden funcionar con cualquier window manager que cumpla con
una serie de características básicas. En la siguiente figura podemos ver el aspecto de
los dos:
Finalmente, otro tipo de aplicación que se utiliza en X-Window es el Session
Manager, que son una serie de programas que permiten guardar la configuración de
una determinada sesión de usuario para que al arrancar de nuevo X-Window se
carguen las aplicaciones que tengo configuradas. Generalmente, en los entornos
integrados ya se incorporan estas herramientas de forma automática; si no,
podemos recurrir al que la misma infraestructura de X-Window proporciona: el xsm

2.2.- CONFIGURACIÓN

Actualmente, las versiones de la implementación XFree86 que más se utilizan son las
4.X, cuya configuración veremos en esta sección. Si bien la mayoría de tarjetas
graficas del mercado ya están soportadas, es posible que desde el momento de
aparición en el mercado de una nueva tarjeta hasta que se da soporte en X-Window
pasen unas semanas o unos pocos meses. De todos modos, cada vez más, los
mismos fabricantes están dando soporte a GNU/Linux y, en algunos casos ya están
proporcionando sus propios drivers para este sistema operativo. Aun así, antes de
comprar una nueva tarjeta grafica, siempre es recomendable comprobar si esta
disponible algún tipo de driver para la distribución que estemos utilizando.
Para instalar XFree86 en nuestro ordenador lo primero que deberemos hacer es
bajarnos los paquetes que contienen las herramientas básicas y el software para el
cliente y el servidor. Generalmente, estos paquetes se suelen denominar xfree86-
common, xfree86server, etc. Y llevan implícitos varias dependencias de fuentes y
algunas utilidades básicas para el manejo de X-Window.

Una vez instalados estos paquetes, debemos configurar adecuadamente los


dispositivos de los que disponemos para poder arrancar correctamente el cliente y
servidor X-Window.

Según la distribución que utilicemos, se hace uso de uno u otro programa o, en


algunos casos, con la misma instalación de los paquetes ya se lanaza una pequeña
aplicación de configuración. No obstante, esta configuración siempre debe contener
unos determinados pasos, que detallamos a continuación clasificados según el
dispositivo que hay que configurar:

1) Tarjeta Grafica

• Driver: las diferentes familias de tarjetas graficas llevan unos


microprocesadores específicos y utilizan unas funciones determinadas
para realizar sus operaciones. Por esta razón, debemos indicar el driver
adecuado para nuestra tarjeta, si no lo sabemos, podemos instalar algún
tipo de aplicación para la detección de hardware automático; si utilizamos,
por ejemplo, el Discovery, podemos saber que driver necesita nuestra
tarjeta con el comando “Discovery –xdriver video”.

• Identificador: el identificador de la tarjeta puede ser cualquier nombre con


el que queremos referirnos a nuestra tarjeta. Este identificador es
utilizado internamente para poder referenciar adecuadamente las tarjetas
que tenemos instaladas en el sistema

• Cantidad de memoria: según la cantidad de memoria de la tarjeta,


podremos inicializar los gráficos con más o menos resolución y con
profundidades de color más o menos elevadas. Aunque no es
imprescindible indicar esta cantidad (el sistema lo detecta
automáticamente) si que es recomendable especificarla en la
configuración

• Utilización del framebuffer del núcleo: el framebuffer del núcleo es un


driver especial de Linux que permite realizar algunas operaciones sobre X-
Window. Aunque su utilización no es obligatoria, generalmente se utiliza
para que el servidor de X-Window se pueda comunicar directamente con
el núcleo del sistema. De todos modos, si nos diera algún problema,
siempre podemos desactivarla.

2) Teclado

• Regla XKB: para que el servidor de X-Window pueda manejar


correctamente el teclado, necesita saber que reglas aplicar sobre el. Para
la mayoría de teclados estándar de los PC, se utiliza la regla “xfree86” y
para las estaciones de trabajo Sun, se suele utilizar la regla “sun”.
• Modelo de teclado: el modelo de teclado generalmente se suele identificar
a partir del número de teclas que tiene. Los teclados de los PC estándar
que tienen las teclas de menú y logo suelen tener 104 teclas (los
identificamos con el nombre de “pc104”). Los teclados que no llevan estas
teclas se identifican como de 101 teclas (“pc101”).

• Keyboard layout: en esta sección debemos identificar el país del teclado


con su referencia ISO 3166. en el caso de España es “es”, para Francia
“fr”, etc.

• Keyboard options: opción para personalizar algunas de las teclas del


teclado.

3) Ratón

• Puerto: el puerto del ratón es la conexión que utiliza para comunicarse


con el ordenador. Cuando compramos el ratón, siempre se indica si es de
tipo PS/2, serie, etc. En caso de que sea tipo PS/2, el puerto será
/dev/psaux, para los ratones seri el puerto será /dev/ttyS0 (COM1),
/dev/ttyS1 (COM2) y consecutivamente.

• Tipo: para especificar el tipo del ratón, se suele proporcionar una lista de
la que debemos escoger el que mas se ajuste a nuestro modelo y
fabricante. Generalmente, sabiendo el modelo del ratón ya podremos
escoger adecuadamente la opción que le corresponde.

• Emulación de 3 botones: en el caso de que nuestro ratón solo tenga dos


botones, se proporciona la posibilidad de emular el tercero (el del medio)
apretando los dos simultáneamente. Si nuestro ratón no tiene el botón del
centro, es recomendable activar esta opción porque algunos programas de
X-Window necesitan que el ratón tenga 3 botones.

4) Monitor

• Identificador: igual que en el caso de la tarjeta grafica, la identificación del


monitor sirve para que el sistema lo pueda referenciar internamente. Le
podemos poner el nombre que queramos.

• Monitor tipo LCD: en la mayoría de procesos de configuración se nos


preguntara si nuestro monitor es de tipo LCD (pantalla TFT). Es
importante responder correctamente a esta pregunta porque el manejo de
un tipo u otro de monitor varía considerablemente.

• Características: en la configuración de características se preguntara las


resoluciones máximas que puede obtener nuestro monitor, la frecuencia
de refresco, etc. Aunque según el programa utilizado para configurar X-
Window se plantearan más o menos preguntas de este estilo, es
importante tener a mano la información del monitor y contestar
adecuadamente para poder aprovechar al máximo las características del
mismo.
• Resoluciones disponibles: en este paso debemos señalar que resoluciones
queremos poder mostrar en nuestro monitor cuando iniciemos X-Window.
También es habitual que se nos pregunte la profundidad de color que
queremos utilizar por defecto; lo mas recomendable es utilizar una alta
(16 o 24 bits) para poder ver nítidamente todos los colores.

Una vez contestadas estas preguntas, que pueden ser más o menos según el
programa que utilicemos, toda la configuración se guarda en l fichero
/etc/X11/XF86Config-4.

Este fichero esta organizado en las diferentes secciones que hemos ido viendo y,
recurriendo a su manual, veremos que tenemos muchísimas mas posibilidades que
nos dan una flexibilidad total para configurar de la forma como queramos nuestras
X-Window. Para probar si realmente funcionan, podemos ejecutar “x”, con lo cual
debería aparecernos una pantalla con cuadros blancos y negros muy pequeños y el
puntero del ratón como una X (para salir de la misma podemos utilizar CTRL + ALT +
BACKSPACE).

Si tenemos instalado algún Windows manager, lo mas habitual para arrancar X-


Window es utilizar alguno de los Shell scripts xinit o startx. Estos se encargan de
lanzar el Windows manager configurado y realizan algunas otras acciones necesarias
para inicializar correctamente X-Window. Una vez tenemos la pantalla en modo
grafico, podemos cambiar la resolución de la misma con las teclas CTRL+ALT++ Y
CTRL+ALT+-, o volver a las consolas de texto con CTRL+ALT+F1, CTRL+ALT+F2,
etc. (con CTRL+ALTF7 volveríamos a la grafica).

Otra característica importante en la configuración de X-Window es la de la


configuración de los Xwrappers. Los Xwrappers nos permiten controlar que usuarios
pueden iniciar una sesión con X-Window. En el fichero /etc/X11/Xwrapper.config se
encuentra la directiva “allowed users”, con la cual especificamos quien esta
autorizado para arrancar X-Window con los valores:
• “console”: cualquier usuario que este en una consola local puede iniciar X-
Window.
• “rootonly”: solo el root puede iniciar X-Window.
• “anybody”: cualquier usuario del sistema puede iniciar X-Window (aunque no
este conectado localmente).

Esto es muy útil, sobre todo, al administrar un servidor en el que generalmente no


se permite que los usuarios trabajen con el entrono grafico por el gasto de recursos
que ello supone.

2.3.- X DISPLAY MANAGER

En la sección anterior hemos visto como configurar X-Window de forma local. Tal
como hemos ido comentando a lo largo del capitulo, la arquitectura de ventanas X-
Window nos permite que cliente y servidor estén instalados en diferentes
ordenadores.

Para configurar nuestro ordenador de modo que realice las funciones de un cliente X-
Window, debemos instalar algún tipo de X display manager. Estos programas abren
un puerto de comunicaciones con el cual los clientes se pueden comunicar con el
cliente y trabajar con X-Window de forma remota. Aunque existen muchos
programas de este tipo, uno de los primeros que apareció, y en el que se basan
muchos otros, es el xdm.

Los X display manager pueden actuar tanto de forma local como remota. Entre otras
funciones, lo que hacen es mostrar una pantalla (en el entorno grafico) para que el
usuario se identifique con su login y contraseña. Funcionan como cualquier otro
daemon del sistema, de forma que su inicio y parada se puede configurar como
queramos (utilizando los niveles de ejecución que el sistema proporciona).

Debemos tener en cuenta que si lo configuramos para que funcione de forma local,
al arrancar el sistema nos encontraremos con la pantalla de identificaron grafica y no
las consolas a las que estábamos acostumbrados (aunque continúan estando
disponibles). Con esta configuración ya no podremos utilizar starx o xinit para
inicializar X-Window, ya que por defecto estarán ejecutándose.

Cuando instalemos xdm, todos sus ficheros de configuración se dejaran en el


directorio /etc/X11/xdm. Vamos a repasar que contiene cada uno de estos ficheros:

Xdm-config Localización de los archivos de configuración de xdm.


Xdm.options Opciones globales de configuración.
Xaccess Definición de los equipos remotos a los que dejamos
acceder.
Xservers Servidores locales de xdm.
Xresources Configuración de la pantalla de login: colores, fuentes,
tamaño, etc.
Xsetup Script que se ejecutara cuando se arranque xdm.
Xstartup Script que se ejecutara cuando un usuario entre en
XWindow. Se suelen poner acciones relacionadas con el
xdm.
Sesión Script que se ejecutara al entrar en una sesión de
usuario. Se suelen poner acciones especiales para los
usuarios, aunque también se suele llamar a la ejecución
del fichero /etc/X11/Xsession.
Xreset Script que se ejecutara al acabar una sesión de usuario.

La configuración de los servidores locales la encontramos en el fichero Xservers. Si


quisiéramos desactivar el servidor local, podríamos comentar todas las líneas de este
archivo. De este modo, aunque tuviéramos instalado un cliente de X-Window, por
defecto no se iniciaría en la maquina local. Si por el contrario quisiéramos instalar
más de uno, podríamos editar el fichero y añadir directivas como las que siguen:

:0 local /usr/X11R6/bin/X :0 vt7


:1 local /usr/X11R6/bin/X :1 vt8

Estas dos directivas indican que queremos 2 instancias de X-Window, una en la


consola 7 (“vt7”) y la otra en la 8 (“vt8”), accesibles con CTRL+ALT+F7 y
CTRL+ALT+F8 respectivamente. Fijémonos como cada directiva incluye un “:0” o
“:1”, que hacen referencia a la instancia de X-Window que manejan. Por defecto,
siempre se utiliza la 0, pero al querer más de un servidor local debemos
reverenciarlo de esta forma. Al final de cada una de estas líneas podríamos añadir
parámetros especiales para cada servidor de X-Window (en “man X” encontramos
todos los posibles), como la profundidad de color que queremos para cada uno, la
resolución de la pantalla, etc. De esta manera, podríamos trabajar con diferentes
sesiones de X-Window abiertas tal como hacíamos con las consolas.

Generalmente, la configuración por defecto de xdm no permite conexiones remotas


por razones de seguridad. Si quisiéramos activar estas conexiones, podríamos editar
el fichero Xaccess y, utilizando la sintaxis que se nos indica, añadir los servidores a
los que permitimos dar este servicio. También deberíamos comentar la línea
“DisplayManager. requestPort: 0” del fichero xdm-config, que por defecto inutiliza
todas las conexiones que se reciben. Una vez realizados estos cambios, reiniciando el
daemon de xdm, el cliente ya estaría preparado para servir X-Window a cualquier
servidor que se lo pidiera.

Para las maquinas donde solo queremos instalar el servidor de X-Window,


deberíamos instalar X-Window tal como veíamos en el apartado anterior y utilizar el
comando “X –query IP”, donde la IP debería ser la del cliente. Del mismo modo que
cuando teníamos mas de un servidor X-Window en una maquina local, si en la
maquina ya tuviéramos otra instancia de X-Window ejecutándose, deberíamos
utilizar “X –query IP :1” para la segunda instancia, “:2”, para la tercera y
consecutivamente.
MÓDULO 2.- X-WINDOW
Unidad 2.- Taller de X-Window

1.1.- INTRODUCCIÓN

En este taller aprenderemos a instalar, configurar y personalizar este sistema. Pero


no se pretende hacer un repaso exhaustivo de todo el sistema, pues esta tarea seria
probablemente inabordable por muy distintas razones. Se pretende sentar las bases
para que cada uno sea capaz de configurar su propio sistema en función de la tarjeta
grafica de la que disponga, de sus gustos y de sus preferencias. Al finaliza el taller,
deberíamos ser capaces de instalar un entorno X, y de saber sacar partido a sus
increíble potencia.

Vamos a dejar temporalmente de lado la versión de ubuntu y vamos a partir de una


distribución debian, sin entorno de ventanas instalados, que nos va a permitir mayor
flexibilidad a la hora de jugar con los diferentes entornos gráficos.

1.2.- INSTALACIÓN DEL SISTEMA BÁSICO

Como ya se ha dicho, el X-Window System es un sistema muy complejo que integra


muchísimas librerías y aplicaciones, algunas de las cuales son fundamentales para su
funcionamiento, aunque la mayoría solo deben ser instaladas si, por nuestras
necesidades, precisamos de ellas. Esta es una de las razones por las que, en Debian,
el sistema viene distribuido en muchos paquetes distintos, de los que solo
instalaremos aquellos que sean necesarios.

Distintas estrategias para la instalación de los paquetes

Debido a que la interdependencia entre los distintos paquetes es muy fuerte,


podemos aprovechar este hecho para que sea el mismo sistema de gestión de
paquetes el que instale todos aquellos que considere necesarios para el correcto
funcionamiento de una aplicación de alto nivel, entre los cuales se encontraran,
obviamente, todos los paquetes básicos del sistema. Así pues, podríamos utilizar
dselect o apt-get para instalar una de estas aplicaciones. Pero esto no es una buena
estrategia, ya que implica la perdida del control de los paquetes que estamos
instalando y además puede implicar la omisión de algunos paquetes esenciales, de
los que, por el motivo que sea, no se hay hecho referencia durante el calculo de
dependencias.

Por este motivo, se recomienda la construcción del sistema paso a paso, para ir
comprendiendo que paquetes se están instalando en cada momento, y el porque.

Instalación de paquetes básicos

Los paquetes básicos del sistema se pueden agrupar, de forma general en:

• core: paquetes esenciales e imprescindibles para el correcto funcionamiento


del sistema (x-window-system-core).
• System: paquetes esenciales cuya presencia es altamente recomendable (x-
window-system).
• Fonts: paquetes de fuentes, algunos de ellos imprescindibles para disponer, al
menos, de un tipo de fuentes en el entorno
• Utils: paquetes de programas que correrán sobre el sistema grafico. Son, en
el fondo, los que dan la razón de existencia del sistema.
• Libs: paquetes de librerías del entorno grafico, los cuales proporcionan
funciones a otros programas.

Podemos instalar los paquetes básicos del sistema mediante la orden siguiente:

apt-get install x-window-system

con ello se calcularan las dependencias entre paquetes y se nos informara de que
debe instalarse alrededor de una treintena de paquetes. Para proceder, se nos pide
la confirmación, a la cual contestaremos afirmativamente.

Durante la ejecución del script de configuración del paquete x-server-common, se


nos preguntara si queremos que sea debconf quien configure los wrappers. La opción
más sencilla y práctica es permitir que la configuración se haga de forma automática,
y seguir adelante.

El script de configuración de Server-xfree86 nos situara en la interfaz de


configuración del servidor. Lo primero que se nos pregunta es si deseamos que se
ejecute un test de autodetección del driver que debe cargarse para nuestra tarjeta.
Es buena opción contestar afirmativamente a esta pregunta, ya que si el test falla o
detecta más de una posibilidad, nos dará accesos a la pantalla de selección de
drivers.

Si debemos seleccionar el driver manualmente, en primer lugar hay que leer la


documentación de la tarjeta grafica; si no disponemos de ella, también podemos
utilizar el comando 1spci para informarnos de cómo esta ha sido detectada por el
kernel (generalmente la ultima línea de retorno). Una vez dispongamos de esta
información, nos dirigiremos a http://xfree86.org/current/status.html para
informarnos de cual es el driver que debemos cargar. Con esto nos situamos en la
pantalla siguiente.

En ésta se nos pedirá si deseamos que sea debconf quien nos guíe en la
configuración del archivo /etc/X11/XF85Config-4, que es el archivo fundamental de
configuración del servidor. No es mala idea contestar afirmativamente, y, al final,
comprobar si la configuración resultante es valida o no.

En primer lugar se nos pregunta se queremos usar el kernel framebuffer device


interface, y se nos sugiere que lo hagamos; en principio, contestaremos
afirmativamente, pero teniendo muy presente que esto es una fuente potencial de
problemas, de manera que, una vez hayamos finalizado la configuración, si al
intentar arrancar el servidor algo va mal, deberemos estar atentos al contenido de la
línea, y probar si con el valor “false” funciona:

/etc/X11/XF86Config-4
Section “device”
Identifier “Generic Video Card”
Option “UseFBDev” “true”
Lo siguiente que configure el mismo script es el teclado. Por lo general, y en especial
sobre la plataforma PC, la sugerencia de utilizar el tipo xfree86 debe funcionar
correctamente, aunque en las pantallas posteriores terminaremos de ajustar su
funcionamiento. En la siguiente pantalla contestaremos que tipo de teclado es el que
tenemos; por lo general pc105 debe funcionar correctamente.

Ha llegado el momento de seleccionar el idioma del teclado. En este campo


entraremos es; en cuanto al campo de variación idiomática, puede entrarse en
mismo valor anterior, pero es recomendable dejarlo en blanco, ya que si se entra el
valor es, esta directiva también se convierte en una fuente potencial de errores. Si
mas adelante, y en el cado de que hayamos rellenado el campo de variación
idiomática, al parar el servidor se visualiza, entre otras líneas, las siguientes:

The XKEYBOARD keymap compiler (xkbcomp) reports:


Error: no symbols named “es” in the include file “es”
Exiting
Abandoning symbols file “default”
Errors from xkbcomp are not fatal to the X server

O si no podemos utilizar ciertos caracteres como puede ser “|”, deberemos comentar
la directiva de variante idiomática en el archive principal de configuración:

/etc/X11/XF86Config-4

Section “ImputDevice”
Identifier “Generic Keyboard”
# Option “XkbVariant” “es”

El campo siguiente, referente a la personalización del teclado, se deja en blanco si no


se tiene ningún propósito al respecto. Con esto habremos terminado con la
configuración del teclado y pasaremos a la configuración del ratón.

Para ello, en primer lugar, se nos pide en que puerto esta ubicado (actualmente, la
mayoría de ellos en /dev/psaux, la primero opción). A continuación se nos pregunta
de que tipo de ratón disponemos (nuevamente, la primero opción, PS/2, suele ser la
mas habitual). Terminada la configuración del ratón, entramos en la configuración de
la pantalla.

En primer lugar se nos pregunta si disponemos de una pantalla tipo LCD. Acto
seguido se nos pedirá en que grado de dificultad queremos entrar los parámetros
referentes a nuestro monitor. La forma más simple (Simple) solo nos pedirá el
tamaño del monitor, mientras que en la más compleja (Advanced) se nos pedirá las
frecuencias de refresco horizontales y verticales del monitor, entre otros.
Seguidamente se nos preguntara con qué resoluciones queremos trabajar y, en
función de los parámetros que hayamos entrado en el apartado anterior, se nos
harán distintas sugerencias. A continuación se nos pedirá cual será la resolución de
color que se usara por defecto al arrancar el servidor (actualmente la mayoría de
tarjetas soportan, sin Nunkun problema, resoluciones de 24 bits). Con esto
habremos terminado la configuración del servidor.

Inicialización del servidor


Ha llegado el momento de comprobar si el fichero de configuración del servidor es
correcto, y en consecuencia el servidor arranca como es debido. Para ello basta con
ejecutar el comando startx.

Si todo funciona correctamente, al cabo de unos momentos nuestra pantalla


adquirirá un fondo mallado de colores grisáceos, y en el centro de la pantalla
aparecerá un aspa. Hemos dado un gran paso adelante, pues configurar el servidor
para que arranque es lo mas difícil del entorno X. ahora sólo es cuestión de tiempo
para terminar dando al entorno el aspecto que deseamos. Mediante el ratón
podemos mover el aspa, y pulsando los botones del medio e izquierdo, podemos
explorar un poco las posibilidades de este entorno grafico un tanto rudimentario.
Para salir de el y continuar con la configuración del sistema, hay que pulsar el botón
izquierdo del ratón, situarnos sobre Exit opción Yes, really quit, o simplemente pulsar
la combinación de teclas CTRL-ALT-BackSpace.

Si por el contrario, al cabo de unos momentos retornamos a la consola alfanumérica,


es que el servidor no ha podido arrancar adecuadamente. Ha llegado el momento de
estudiar detenidamente el fichero de Log (/var/log/XFree86.0.log) e intentar detectar
las posibles fuentes de errores. Los mas comunes suelen ser: mala elección del
driver que hay que cargar (si el proceso de selección lo hemos dejado en manos del
script, deberemos consultar la pagina antes mencionada para asegurarnos de que el
driver que el script ha escogido es el correcto), poner la directiva UseFBDev a trae,
cuando debe estar en false, usar resoluciones o frecuencias de refresco mas altas de
las que la tarjeta puede soportar, etc.

Otra posibilidad es que, aun estando soportada la tarjeta por el Xfree86 Project,
puede que el paquete que estemos usando no la soporte. Frente a esta situación, se
sugiere que se incorpore la siguiente línea en el fichero /etc/apt/sources.list:

Deb http.//people.debian.org/blade/Woody/i386/ ./

Y que, tras ejecutar el comando apt-get update, se vuelva a ejecutar el comando de


instalación del X-Window-System (apt-get install X-Window-System). Con esto
acudiremos a una pagina no oficial para obtener los paquetes de versiones mas
actualizadas del sistema X-Window, y en ellos, probablemente, ya se de soporte a
nuestra tarjeta.

Con todo esto, hay que destacar que la correcta configuración de una tarjeta de
video puede llegar a ser una tarea verdaderamente difícil. Para ello, acudiremos a
buscadores donde entraremos palabras clave referentes a nuestra tarjeta junto con
“X” o “Linux” para ver si encontramos documentación al respecto.
Llegados a este punto, mediante el comando siguiente evitaremos que cada vez que
arranquemos el ordenador entremos en el modo grafico:

Rm /etc/rc2.d/S99xdm

Esto nos será útil mientras no tengamos configurado totalmente este entorno. Una
vez terminado, ya será cada usuario el que decidirá si quiere o no, que al arrancar el
ordenador se entre en el modo grafico. Para hacerlo, solo habrá que volver a crear el
enlace simbólico que hemos borrado con el comando anterior:

Cd /etc/rc2.d
Ln –s ../init.d/xdm S99xdm
El fichero de log

Aunque el arranque del servidor haya resultado exitoso, no por ello debemos dejar
de analizar el contenido del fichero principal de Log del sistema X,
/var/log/XFree86.0.log, ya que esto nos ayudara a depurar fallos y errores menores
que no han interrumpido el arranque del servidor, pero si que hacen bajar su
rendimiento.

Algunos ejemplos típicos pueden ser: eliminar la línea del fichero de configuración
que hace referencia a las fuentes cirílicas, si nunca las vamos a utilizar, ya que ni tan
siquiera las hemos instalado; eliminar de este mismo fichero todo lo que hace
referencia al Generic Mouse, pues lo hace incompatible con el que hemos
configurado nosotros, etc.

El servidor de fuentes

El sistema grafico en si no lleva asociado ningún tipo de base de datos acerca de las
fuentes disponibles, pues esto no entra en el dominio de sus funciones. Esta es la
tarea del servidor de fuentes xfs (/usr/bin/X11/xfs), así, cualquier programa cliente
podrá usar las fuentes disponibles, que se arrancan automáticamente al lanzar el
servidor X en forma de deamon. Existen multitud de paquetes para agregar más
fuentes al conjunto que hemos instalado por defecto.

Una aplicación que puede ser útil para conocer que fuentes tenemos instaladas y que
aspecto tienen es xfontsel. Se trata de una aplicación escrita mediante librerías de
athena (como el resto de los xbase-clients, grupo al cual pertenece xfontsel). En la
cual, mediante menús desplegables se seleccionan las opciones disponibles de
configuración de las fuentes y nos muestra algunos caracteres de ejemplo. Para
conoce los caracteres de una fuente se puede usar la aplicación xfd.

Así pues, una vez sepamos que fuente queremos utilizar para un determinado
programa, podemos lanzarlo desde una xterm con el argumento “-fn” seguido de la
descripción de la fuente (otros programas pueden usar nombres distintos para este
argumento). Un ejemplo puede ser:

Xterm –fn –misc-fixed-medium-r-normal—20-140-100-100-c-100-iso8859-1 &

1.3.- WINDOW MANAGERS

Los window managers son programas clientes (en realidad se los llama meta-
clientes) encargados de gestionar las distintas ventanas que corren sobre el entorno
grafico y de su presentación, así como de lanzar otros clientes (aplicaciones). A estas
alturas, ya tenemos un Windows manager instalado, el twm, ya que una instalación
completa de un sistema X requiere como mínimo de un Windows manager, aunque
este no forme parte del servidor, que corra sobre el. Como ya hemos visto, el twm
es muy rudimentario, puede ser, pues, que nos interese instalar algunos mas
complejos, como puede ser Window-Maker, BlackBox, qvwm, etc. Vamos pues a
instalar algunos de ellos y a probarlos. El objetivo final, siguiendo la filosofía GNU, es
que cada usuario termine usando el software que prefiera. Así pues, se deja que, una
vez conocidos algunos wiindow managers existentes, sea el propio lector quien
decida cual va a usar. Obviamente, es posible tener más de un Windows manager
instalado, aunque solo se pueda hacer correr uno por sesión. (Sin embargo, si que
podemos, como ejemplo de la flexibilidad del sistema X, tener dos Windows manager
corriendo en un mismo ordenador, cada uno en un terminal distinto).

En primer lugar instalaremos, a modo de ejemplo, el qvwm. Se trata, como veremos


al lanzarlo, de un Windows manager que simula un entorno que probablemente nos
sea conocido. Para hacerlo, basta con ejecutar la instrucción:

Apt-get install qvwm

En este momento ya tenemos dos Windows managers instalados: el twm y el qvwm.


Para hacer correr uno u otro bastara con indicar la ruta completa de ubicación del
Windows manager que deseamos utilizar después del comando startx (recordemos
que el comando whereis nos puede ser muy útil a la hora de buscar la ubicación de
un fichero). Así pues, para hacer correr el Windows manager que acabamos de
instalar, bastara con ejecutar:

Startx /usr/bin/X11/qvwm

Para utilizar el twm se debería haber especificado su ruta completa de la forma


siguiente:

Startx /usr/bin/X11/twm

Tener que especificar cada vez que Windows manager deseamos utilizar, una vez
nos hayamos decidido por uno en concreto, puede ser un tanto pesado. Para
especificar que Windows manager debe usarse en caso de que después del comando
startx no se especifique ninguno en concreto, crearemos el archivo .xsession en el
directorio raíz del usuario con el contenido siguiente, en el caso de que quisiéramos
que el window manager por defecto fuese el twm, por ejemplo:

/ .xsession
Exec twm

Si quisiéramos que fuese qvwm el Windows manager por defecto, bastaría con
cambiar twm por qvwm. La ejecución de los distintos procesos que implican el
arranque del entorno grafico, así como los ficheros de configuración que se van
leyendo durante este proceso, están fuertemente determinados. Así pues, creando el
fichero anterior, lo que hemos hecho es editar uno de los últimos ficheros (los que
residen en el directorio raíz del usuario) que se leen antes de entrar en el entorno
grafico. Este fichero, por tanto, nos permite modificar algunos aspectos de los que se
han determinado por defecto dentro del sistema y que están definidos en los ficheros
residentes en /etc/X11 y sus subdirectorios.

Para finalizar esta sección instalaremos un Windows manager muy utilizado en el


mundo GNU/Linux, que se caracteriza por su versatilidad y su escaso consumo de
recursos: el WindowMaker:

Apt-get install wmaker

Hemos instalado ya tres Windows managers, y seguramente instalaremos mas.


Aparte del método anteriormente descrito para preestablecer cual queremos ejecutar
por defecto, podemos utilizar el menú del comando update.alternatives para
establecerlo:

Update-alternatives x-window-manager

1.4.- X SESSION MANAGER

Los session managers son programas que pueden hacerse correr sobre una sesión
grafica y que nos permitirán establecer y modificar para metros de esta. Xms es el
session manager que viene por defecto con la instalación que hemos hecho del
servidor grafico. Podemos lanzarlo desde un terminal X (para lanzar una xterm,
pulsaremos el botón del medio del ratón y seleccionaremos
Programs/Xshells/Xterm), mediante el comando xsm.

Una vez lanzado xsm mediante Checkpoint, podemos guardar la configuración de la


sesión actual (esencialmente referente a las aplicaciones que tengamos corriendo),
gestionar los procesos que están corriendo mediante client List, consultar el log de la
sesion o cerrar la sesion guardando la configuración actual.

Aparte de xsm, existen otros session managers. Estos acostumbran a ser una parte
más de los desktop managers, y están tan integrados en ellos que a veces resulta
difícil reconocer sus acciones. Un ejemplo típico es la pregunta que se nos formula
acerca de si deseamos guardar la sesión al cerrar KDE.

1.5.- X DISPLAY MANAGER

Al finalizar la instalación del Xserver, sugeríamos que se eliminara el enlace


simbólico /etc/rc2.d/S99xdm para evitar que al volver a arrancar el sistema al entrar
al runlevel 2 se ejecutase xdm, acrónimo de X display manager. Este es el display
manager que el paquete X-Window-System instala por defecto. Los display
managers son los programas encargados de gestionar quien, desde donde, y como
puede entrar un usuario al entorno grafico. Para lanzarlo, lo haremos como con
cualquier otro daemon:

/etc/INIT.d/xdm start

Para pararlo, tambien utilizaremos el mismo procedimiento que seguiríamos para


detener cualquier otro daemon, con la salvedad de que debemos pulsar la
combinación de teclas CTRL+ALT+F1, para salir del entorno grafico y situarnos en la
tty1, por ejemplo, en vez de utilizar la combinación que se usa para cambiar de ttys
en entornos alfanuméricos:

/etc/INIT.d/xdm stop

Como hemos comprobado, el display manager nos pide un login y un password, los
mismos que utilizamos para acceder al sistema por las ttys, si no es que hemos
impuesto alguna restricción. Tras validarnos, entramos en el modo grafico del mismo
modo como lo hacíamos mediante el comando startx. La diferencia radica en que,
cuando terminemos la sesión grafica, el servidor no se parara, si no que continúa
corriendo el xdm.
Unos de los inconvenientes de xdm es que no nos permite seleccionar con que
Windows manager queremos trabajar. Pero existen otros display managers, como
pueden ser wdm (de WindowMaker), gmd (del proyecto GNOME), o kdm (del
proyecto KDE), que si que lo permiten.

Podemos instalar el wdm, para ver su aspecto, y conocer otro display manager:

Apt-get install wdm

Al ejecutarse el script de post instalación, se nos preguntara que display manager


queremos usar, xdm, que ya teníamos instalado, o wdm. Seleccionaremos este
último, para que se cree el enlace necesario para que se lance wdm como display
manager durante el proceso de arranque del sistema (si existe el fichero
/etc/rc2.d/S99xdm, es mejor borrarlo para evitar mensajes de warning al arrancar el
sistema). Si no queremos que se arranque automáticamente ningún display manager
al arrancar el sistema, bastara con eliminar los enlaces necesarios, es decir, el
fichero /etc/rc2.d/wdm. El archivo /etc/X11/default-display-manager marca el
display manager que se usa por defecto.

Una vez arrancada una sesión X desde el display manager, es decir, una vez
hayamos lanzado el pertinente Windows maker, puede ser interesante ejecutar el
comando potree para ver las relación de dependencias entre los distintos procesos
que están corriendo en este momento, junto con la información que nos aportara la
línea ps aux.

1.6.- DESKTOP MANAGERS

La aparición de distintos toolkits, así como el desarrollo de diversos proyectos que


desarrollaban o usaban librerías del entorno grafico, hizo aparecer proyectos que
buscasen la unificación de todos estos esfuerzos. Fue entonces cuando apareció un
concepto nuevo en el entorno X: el de desktop manager. Los desktop managers son
proyectos que pretenden sentar las bases para la unificaron y estandarización, tanto
de presentación como de políticas de programación y de desarrollo de aplicaciones.
Uno de los primeros en aparecer fue el CDE (Common Desktop Manager), aunque
actualmente los dos proyectos mas destacados en este sentido son: GNOME y KDE, a
los cuales, dado su alto grado de implementación y de desarrollo, dedicaremos una
subsección respectivamente. Pero antes podemos nombra otros desktop managers,
como pueden ser: GNUStep, ROX, GTK+Xfce o UDE.

GNOME

GNOME es un proyecto que forma parte de GNU, que se caracteriza por no necesitar
estrictamente de un Windows manager en concreto, aunque se recomienda que se
use alguno que garantice su correcto funcionamiento (a GNOME compliant Windows
manager) como puede ser: IceWM o Sawfish. Aun así, para respetar las preferencias
y la libertad del usuario, GNOME, en su control panel dispone siempre de un
Windows manager selector, que nos permite escoge que Windows manager
queremos usar. GNOME esta basado en Gtk toolkit, las propias librerías desarrolladas
dentro del proyecto, conocidas como gnome-libs especifiques.
Como todos los desktop managers, GNOME dispone de su propio panel, de su gestor
de archivos Nautilus y de su control panel: GNOME Control Panel.

Para hacer una instalación básica de GNOME, instalaremos el paquete siguiente junto
con todas sus dependencias:

Apt-get instad Nome-sesión

Tal como se ha dicho, aunque GNOME no exija el uso de ningún Windows manager
determinado, se recomienda que este sea GNOME-compliant Windows manager.
Vamos pues a instalar Sawfish, que fue desarrollado estrictamente para cumplir este
requisito. Instalemos el paquete y todas sus dependencias:

Apt-get install sawfish-gnome

Tenemos, pues, otro Windows maker instalado. Detendremos el display manager y


volveremos a lanzarlo para que este nuevo Windows maker se integre en el (GNOME
también tiene su propio display manager, gdm, que podemos instalar si lo
deseamos). Ahora tenemos dos posibilidades para conseguir nuestro objetivo: hacer
correr GNOME. La primera es arrancar Sawfish, desde el display manager o mediante
startx y, una vez dentro, lanzar gnome-session desde un terminal X, o bien operar
de modo inverso, es decir, arrancar GNOME por los mismos procedimientos que
Sawfish, y luego lanzar sawfish desde un terminal X. se recomienda proceder de la
ultima forma si queremos que la próxima vez que arranquemos GNOME se ejecute
Sawfish (será el propio sesión manager de GNOME el encargado de realizar y
registrar los cambios necesarios para que esto ocurra).

Una vez familiarizados un poco con GNOME, lo que podemos hacer es instalar
algunos paquetes que nos pueden ser útiles, en concreto gnome-help y gnome-
terminal, el primero nos ofrece una interfaz donde podremos leer mans, ficheros de
texto en un entorno grafico, y el segundo instala el xterm propio de GNOME.

Una aplicación que dará un aspecto mucho más amigable a GNOME será Nautilus,
concebido, en principio, como un gestor de ficheros, pero que además nos permitir
configurar el desktop. Para su correcto funcionamiento, Nautilus necesita de Mozilla
M18 y de GNOME Helix. Por tanto, los paquetes que habrá que instalar serán los
siguientes: Nautilus-suggested, para hacer la instalación de Nautilus y mozilla, para
hacer una instalación completa del navegador (en cuanto a su configuración,
podemos instalar las fuentes True Type, y podemos poner en auto el sound
daemon’s dsp wrapper).

GNOME es un proyecto en constante desarrollo y que ofrece multitud de


aplicaciones. Por eso, una vez instalado su sistema básico, sugerimos al lector que
visite su página http://www.gnome.org y que sea el mismo el que explore, descubra
y decida cual de ellas pueden ser de su interés para instalárselas. La sola ejecución
de la línea siguiente nos puede dar una idea e la magnitud del proyecto:

Apt-cache search gnome

Debian Woody integra la versión 1.4 de GNOME. Estando ya disponible la versión


2.2, proponemos modificar el contenido de /etc/apt/sorces.list añadiendo las líneas
siguientes, para poder actualizar o instalar de raíz los paquetes de esta versión
“debianizados”:
#GNOME2
Deb
http://ftp.acc.umu.se/mirror/mirrors.evilgeniuses.org.uk/debian/backports/woody
gnome2.2/
Deb-src
http://ftp.acc.umu.se/mirror/mirrors.evilgeniuses.org.uk/debian/backports/woody
gnome2.2/

Una vez hayamos hecho esto, bastara con ejecutar los siguientes comandos para
disponer de dichas actualizaciones:

Apt-get update apt-get install gnome

KDE

KDE, a diferencia de GNOME, si que necesita de un window manager concreto, se


trata de kwm, basado en Qt toolkit y en las propias kdelibs. También dispone de su
launcher panel: kpanel, de su propio gestor de archivos: Konquest y de su utilidad
de configuración: Control Panel. Obviamente, KDE puede estar instalado en el mismo
sistema donde hayamos instalado GNOME, e incluso hay aplicaciones pertenecientes
a un desktop manager que pueden correr en el otro. Además, KDE también tiene su
propio display manager (kdm) junto con muchísimas mas aplicaciones. Nuevamente
se recomienda al lector una visita a su pagina para conocer sus posibilidades:
http://www.kde.org, y la pagina encargada de integrar KDE en Debian
http://people.debian.org/ccheney/. Asimismo, podemos ejecutar la línea siguiente
para ver la integración de KDE en Debian:

Apt-cache search kde

Los paquetes básicos de KDE están en el paquete kdebase. Este será, pues, el
primero que instalaremos:

Apt-get install kdebase

Nuevamente deberemos reinicializar nuestro Windows manager para tener acceso al


desktop manager recién instalado. Una vez hecho esto, podemos proceder a instalar
el gestor de archivos, paquete konquest. Mediante el paquete kde-i18-es podemos
instalar los ficheros necesarios para que KDE trabaje en castellano.

A partir de este punto, ya será cada usuario el que instalara los distintos paquetes
del proyecto que le sean de interés.

Por lo que a versiones se refiere, Debian Woody integra la versión 2. para disponer
de versiones mas recientes, hay que recurrir a paquetes no oficiales. Si se desea
tener acceso a estos paquetes, podemos añadir la línea siguiente a
/etc/apt/sources.list y actualizar la base de datos mediante el comando apt-get
update:

#KDE3
Deb http://people.debian.org/schoepf/kde3/woody ./
Tal como y hacíamos, para preestablecer el window maker por defecto, utilizaremos
el menú del comando update-alternatives para seleccionar el session manager:

Update-alternatives x-session-manager

1.7.- PERSONALIZACIÓN DE ALGUNOS ASPECTOS

El diseño del entorno grafico X responde al ambicioso objetivo de sacar el máximo


rendimiento del hardware disponible, usando el mínimo de sus recursos, y ofrecer la
máxima flexibilidad posible. La estructura de servidor cliente en que se basa este
sistema hace posible que estos objetivos sean una realidad, y las aparentes
dificultades con las que se encuentra el usuario novel desaparecen rápidamente con
un poco de practica para permitir que afloren las múltiples ventajas que ofrece este
diseño. En esta sección solo se pretende dar una somera idea de la potencia de este
sistema, la cual se pone plenamente de manifiesto cuando se trabaja en red, aunque
queda un poco ensombrecida cuando se trabaja en un sistema stand alone como
sobre el que se desarrolla todo este curso. De todas formas se introducen algunos
conceptos que pueden ser de utilidad cuando se entra a trabajar en red.

Personalización de aspectos locales

En general los archivos de configuración se hallan en el directorio /etc/X11/ o en


algunos de sus subdirectorios. De forma personalizada, cada usuario puede redefinir
los parámetros de configuración y añadir nuevos creando o editando en su directorio
de home los ficheros que llevan el mismo nombre que los de configuración general
pero precedidos de un “.”. Se podrán redefinir o establecer todos aquellos
parámetros que no requieran de permisos de superusuario, ya que los archivos de
home se procesan después de los de configuración general, y los parámetros
siempre tomaran el último valor que se les asigne.

Xsession

/etc/X11/Xsession es un script que se ejecuta al entrar en una sesión de usuario.

Este script es el que gobierna todo el proceso de arranque de la sesión hasta que
podemos empezar a trabajar, y también es el encargado de gestionar los mensajes
de errores que se puedan producir durante este proceso, los cuales se registran en
$HOME/.xsession-errors

En $HOME/.session es donde personalizaremos el arranque para un usuario en


particular. Así pues, si deseamos que el Windows manager sea blackbox, y que se
arranque automáticamente bbkeys en background al iniciar sesión, este contendrá
las siguientes líneas:

Bbkeys &
Backbox

Xresources

En el archivo $HOME/.Xresources personalizaremos el aspecto de las distintas


aplicaciones. La sintaxis esapplication*parameter:value. Así pues, si quisiéramos
invertir los colores de la aplicación xterm, añadiríamos la línea siguiente en el
fichero:

Xterm*reverseVideo: trae

El comando xrdb es el encargado de gestionar la base de datos de Xresources.


Mediante “xrdb –query” podemos conocer todas las propiedades establecidas y su
valor, y mediante el parámetro “-display” obtendremos un listado de todos los
parámetros que acepta el comando. Si a este le pasamos como parámetro la
ubicación de un fichero, leerá de el todas las definiciones de parámetros.

Xmodmap

El servidor grafico usa la tabla de códigos de caracteres para hacer la conversión de


señales provenientes del teclado (Server-independent) a símbolos del sistema
(Server-dependent)

La tabla de conversión que hay que usar ha sido seleccionada durante el proceso de
configuración del teclado, pero el comando xmodmap nos permite modificar su
contenido. Un ejemplo de su uso puede ser el siguiente:

Xmosmap –e “keycode 127 = Delete”


Xmosmap –e “keycode 22 = Backspace”

Mediante los parámetros “-pk” xmod nos devolverá todo el contenido de l atabla de
conversión que se esta usando.

Personalización de aspectos de red

Los aspectos aquí presentados también son de interés para un sistema stand alone,
ya que, como todo el sistema operativo, el sistema X usa siempre un diseño
orientado a red.

$DISPLAY

La variable $DISPLAY sirve para indicar al cliente con que servidor debe
comunicarse. Su sintaxis es la siguiente: hostname:display number.screen Lumber.
Así pues, si hubiésemos definido otro terminal grafico al sistema X, añadiendo la
línea siguiente a /etc/X11/xdm/Xservers:

:1 local /usr/X11R6/bin/X vt8

Podríamos lanzar una aplicación grafica desde un xterm d un terminal grafico a otro
definiendo la variable adecuadamente. Por todo lo cual, si quisiéramos lanzar xeyes
desde el primer terminal grafico, vía xterm, y “displayarlo” en el segundo,
procederíamos de la forma siguiente:

Set DISPLAY :0.1; export DISPLAY


Xeyes &

Si entramos en una sesión grafica, abrimos un xterm, cambiamos de usuario


mediante el comando su y probamos a lanzar una aplicación grafica se nos devolverá
un mensaje de error indicándonos que no se puede establecer conexión con el
servidor. Una estrategia para evitar este problema e utilizar el comando con el
parámetro “-p“ para que se exporte todo el conjunto de variables de entorno, y
evitar así que el servidor rechace nuestra petición de conexión. Esta practica puede
ser muy útil para lanzar programas de configuración que necesitan permisos de root,
ya que nos evitara tener que entrar en el entorno grafico como root (practica no muy
recomendable, y que, aunque por defecto se permita, en muchas ocasiones se
restringe manualmente).

Xhost y xauth

El comando xhost permite establecer que equipos pueden acceder al servidor grafico
de forma remota, es decir, que maquinas cliente pueden lanzar una aplicación para
ser “desplayada” en el servidor. Su sintaxis es la siguiente: xhost +hostname. Si no
se especifica ningún hostname, cualquier maquina podrá lanzar aplicaciones sobre el
servidor. Por defecto, no se permite la conexión desde ningún equipo remoto.

El comando xauth sirve para determinar que usuarios pueden lanzar aplicaciones
sobre el servidor grafico. Así pues, mediante la combinación de estos dos comandos
podremos establecer una política de seguridad de acceso al servidor X bastante
razonable.

1.8.- CONFIGURACIÓN DE IMPRESORAS

La tarea de configurar impresoras se puede ver facilitada a partir del entorno grafico.
Existen multitud de aplicaciones para configurar el sistema de impresión nativo
(basado en lpd como servidor y lpr como cliente), y otras que sustituyen este
sistema por uno propio, comúnmente también basado en al estructura cliente
servidor. En esta sección presentaremos dos de esas herramientas: CUPS y LPRng,
ambos con su sistema propio de servidor de impresión.

Para la instalación de LPRng hay que instalar necesariamente el paquete lprng. El


paquete que contiene la GUI es de configuración del fichero /etc/printcap basado en
LPRng es lprngtool. Obviamente, para hacer modificaciones en dicho fichero de
configuración, habrá que ejecutar el comando lprngtool con privilegios de root.
Adicionalmente, se recomienda instalar el paquete printop, que aporta una interfaz
grafica para todo el sistema de impresión, y el paquete lprng-doc, el cual contiene
toda la documentación de este sistema de impresión.

Para instalar CUPS (Common Linux Printing System) habrá que instalar el paquete
del servidor de impresión, cupsys; y se recomienda instalar, junto a esta paquete, el
de clientes de impresión, paquete cpusys-client. También se puede instalar el
paquete cupsys-bsd para disponer de los comandos habituales en el sistema de
impresión de BSD. Pro lo que se refiere a drivers, los paquetes cupsys-driver-
gimpprint y cupsomatic-ppd, aportan gran numero de ellos junto con numerosas
algoritmos de procesamiento de imagen, definición de tamaños de papel, etc.
MÓDULO 3.- ADMINISTRACIÓN BÁSICA
Unidad 1.- Shell

1.1.- PRESENTACIÓN

Una vez se haya iniciado el sistema operativo, tendremos que acceder al sistema
utilizando nuestro nombre y contraseña. El login (entrada al sistema) se puede
realizar a través de una de las consolas de texto o a mediante el sistema gráfico
X Window:

Si lo hacemos desde una consola de texto, una vez que hayamos hecho login, ya
estaremos en el Shell.

Si hemos accedido al sistema de forma gráfica, tendremos que abrir un emulador


de terminal para acceder al shell. Para abrir un emulador de terminal en KDE o
GNOME, buscaremos el icono en la barra de tareas:

Por otra parte, es posible pasar de X Window a una consola virtual del sistema
pulsando Ctrl+Alt+Fx (siendo x de 1,2,3,4,5 ó 6). Por ejemplo, si pulsamos
Ctrl+Alt+F2:

1
Para volver a la consola grafica solo tenemos que pulstar Ctrl+Alt+F7.

El aspecto del emulador de terminal de Gnome es el siguiente:

Nota: Recordad que siempre que se pueda, se evitará le uso de la cuenta root
para no correr el riesgo de dañar el sistema.

2
1.2.- INTRODUCCIÓN AL SHELL

El shell es el programa que recoge las líneas de comandos del usuario, las
interpreta y las ejecuta. Los shells actuales tienen características más parecidas a
un lenguaje de programación que a un simple ejecutor de comandos. El shell por
defecto de Linux se llama bash aunque puede cambiar a otros fácilmente.

Para un usuario normal de linux puede que no sea relevante el manejo del shell
pero todo buen administrador de sistemas linux deberia conocerlo a fondo.

Las distribuciones actuales incorporan potentes utilidades graficas para la


administración del equipo, pero es necesario conocer cómo funcionan
internamente si se desea exprimir todas las funcionalidades Además, hay que
tener en cuenta que no siempre dispondremos de estas herramientas y, en estos
casos, será de gran ayuda el manejo del shell.

Para el que este acostumbrado al entorno grafico, el aprendizaje del shell puede
resultar un poco duro al principio ya que hasta que no se coge la soltura
suficiente, se pierde productividad con respecto al uso de herramientas gráficas.
Pero a medida que se profundiza, veremos que supera a las herramientas graficas
en uso y posibilidades.

En linux todos los programas guarden su configuración en un archivo de texto.


Configurar un programa consistirá en editar este fichero para conseguir el
funcionamiento requerido. Esta forma de trabajar tiene varias ventajas:

o Configuración localizada: habitualmente, todos los programas guardan su


fichero deconfiguración global en el directorio /etc. Esto nos permite tener
localizada en un único directorio toda la información de configuración de la
máquina.

o Fácil actualización: Cuando actualizamos versiones de un programa,


normalmente no hay que tocar el archivo de configuración.

o Front-end: los ficheros de configuración utilizan un lenguaje muy sencillo.


Esto facilita lacreación de pequeños programas de configuración
(generalmente gráficos) que generan, deforma cómoda, estos ficheros de
configuración.

Generalmente, lo que suelen hacer las aplicaciones graficas es modificar los


archivos de configuracion y volver a lanzar el programa correspondiente con los
nuevos cambios.

Como acabamos de ver, el manejo de ficheros de texto en Linux es muy


importante. Esta importancia se refleja en las herramientas para el manejo de
texto, que son muy numerosas y versátiles.

1.3.- PRIMEROS COMANDOS

La primera impresión es que el manejo del shell de UNIX es similar al manejo de


MS-DOS aunque ha medida que avancemos en su manejo, veremos que el shell
de Linux es mas potente.

3
Cuando abrimos una terminal como un usuario sin privilegios, lo primero que nos
aparece es el simbolo $ o prompt. El prompt nos indica que el sistema está
preparado para recibir un comando. A veces viene precedido por el nombre de
usuario@nombre de maquina.

En la imagen:

o Nombre de usuario: usuario


o Nombre de Maquina: usuario-desktop

Si el usuario tiene privilegios especiales, el prompt cambia a ‘#’

Para ejecutar un comando en Linux, escribimos el nombre del comando y


pulsamos enter. Por ejemplo, el comando hostname nos devuelve el nombre de
la maquina:

4
En Linux, un comando suele constar de 3 partes:

1. Nombre del comando: Indica a la máquina el programa que queremos


ejecutar.

2. Parametros Modifican el comportamiento por defecto del comando.


Habitualmente, las opciones van precedidas de uno o dos guiones.

3. Argumentos: Indican sobre qué elementos actúa el comando.

Por ejemplo, en el siguiente caso:

$ top –u usuario

En este caso, el nombre del comando es 'top', las opciones son '-u' y el
argumento es ‘usuario’.

1.4.- LA VARIABLE DE ENTORNO PATH

Las variables de entorno son parejas de valores almacenados en el espacio de


entorno del shell. Este espacio puede ser leído por cualquier programa invocado
por la shell y por lo tanto contiene mucha configuración de programas.

Podemos ver los valores actuales de las variables de entorno de nuestro shell con
el comando env:

Cada variable de entorno tiene un significado, por ejemplo:

o USER: Es el nombre de usuario en el sistema


o HOME: El directorio donde iniciara la sesión el usuario
o TERM: El nombre de la terminal del usuario. Se usa para determinar las
características de la terminal

Pero nos vamos a centrar en la variable PATH. Para ejecutar un comando


tendremos que escribir su nombre y el sistema buscará el comando en los
directorios que aparecen en la variable PATH, por orden. Si lo encuentra lo
ejecutará, si no dará un error

Para ver el contenido de una variable podemos utilizar el comando echo () “echo”
se utiliza para escribir en el terminal):

5
El resultado son los directorios (separados por el carácter ‘:’) en los que el
sistema buscará las órdenes que introduzcamos.

Por ejemplo, si ejecutamos el comando “ls” (proporciona la lista de ficheros del


directorio actual), no nos devolvera error porque el comando se encuentra en el
directorio /bin y este esta dentro de path.

Nota: El comando whereis nos devuelve la ubicación de un comando.

Si intentamos ejecutar un comando que no está en ninguno de los directorios del


path nos devolvera error:

Si queremos ejecutar un comando que esta en el directorio en el que nos


encontramos sin que lo busque en el PATH, tenemos que hacer la llamada del
comando precedido por “./”:

$./comando

1.5.- OBTENER AYUDA PARA EJECUTARCOMANDOS

Si algo caracteriza a Linux, es la cantidad de comandos que tiene. Es


practicamente imposible conocer el nombre de todos y mucho menos su
funcionamiento. Menos mal que linux incorpora un sistema de ayuda muy
completo y eso es lo que vamos a ver a continuación.

Tenemos varias maneras de obtener ayuda sobre la ejecucion de un comando,


pero nos vamos a centrar en dos que, a mi juicio, son las mas interesantes: la
ayuda proporcionada por el comando, las paginas man (manual):

Ayuda del propio Comando

Si a un comando en linux le pasamos el parametro –help, nos devolvera


instrucciones de uso del mismo:

6
Se puede ver en la figura que hemos añadido al final del comando “| more”

Esto es porque el comando 'ls' posee una ayuda tan extensa que no cabe en una
unica pantalla. “| more” muestra una pantalla de la ayuda cada vez, pudiendo
avanzar pulsando la barra espaciadora. Cuando ya no quede texto por visualizar,
volveremos al prompt del sistema.

Podeis probar a ejecutarlo sin la coletilla “| more” para ver el resultado.

Otro de los sistemas estándar de ayuda que nos proporciona un sistema UNIX son
las llamadas páginas'man' o páginas del manual. Estas páginas proporcionan
información sobre comandos, ficheros claves,funciones C y otras características
del sistema. Habitualmente se llama con 'man palabra_a_buscar' donde
palabra_a_buscar es el nombre del comando que nos interesa.

Por ejemplo, si ejecutamos ‘$man ls’:

7
Utilizaremos las siguientes teclas dentro de una página del manual:
o Flecha abajo o j Baja una línea.
o Flecha arriba o k Sube una línea.
o Barra espaciadora Avanza una pantalla.
o / Busca una cadena de texto dentro de la página. Escribiremos la barra
seguida del texto a buscar.
o n Nos muestra la siguiente cadena que concuerde con el patrón buscado
usando /.
o q Salir de la página.

Además de la ayuda en línea y las páginas man y las páginas info, podremos
obtener ayuda a través delos documentos que acompañan a los paquetes de
software. Estos archivos estarán localizados habitualmente en /usr/doc o
/usr/share/doc. El comando ‘whereis’ nos facilita la localización.

1.6.- COMODINES

Un comodín es un carácter con un significado especial que el shell sustituye antes


de ejecutarlo. Los comodines permiten escribir expresiones extensas con pocos
caracteres. La sustitución del carácter comodín por una cadena depende del texto
con el que concuerde el carácter.

Existen muchos comodines dentro de lo que se viene a llamar expresiones


regulares pero nosotros vamos a ver principalmente dos:

o *: Concuerda con cualquier cadena, incluida la cadena nula. Por ejemplo:


‘$ ls *.txt’ mostrara todos los archivos con extension txt:

8
o ?: Concuerda con cualquier carácter. Por ejemplo: ‘$ls ??????.txt’,
mostrata todos los archivos cuyo nombre tiene 6 caracterers y extension
.txt.

A pesar que el archivo notas tiene extension txt, solo tiene cinco caracteres por lo
que no aparece en el resultado.

1.7.- COMANDOS BÁSICOS

Estudiaremos primero los comandos básicos para el manejo de archivos y


directorios: ls, pwd, cd, cp, mv, rm, mkdir, touch, cat y more.

Ls
El comando 'ls' lista un conjunto de ficheros, el contenido de un directorio, el
contenido de un árbol de directorios o cualquier combinación de los anteriores. El
comando 'ls' equivale al comando 'dir' del sistema operativo MS-DOS. El formato
de su llamada es: ls [OPCIONES]... [FICHERO]...

Las opciones más importantes del comando 'ls' son las siguientes:
o -al : Muestra también los ficheros ocultos (los que comienzan por .).
o -l : Muestra información extendida (tamaño, propietario, fecha de creación,
etc.).
o -R: Muestra los directorios de forma recursiva, es decir, va expandiendo el
árbol de directorios hasta llegar a las hojas.
o -F: indica si es un fichero, un directorio, etc aádiendole un carácter especial al
final del nombre. Por ejemplo, un directorio lo indicaría añadiendole al nombre el
carácter “/”.

9
Podemos ver mas opciones pasando el parametro ‘--help’ ó con el comando
‘man’

En la imagen vemos, entre otros, el resultado de pasarle el parametro ‘-l’


Concretamente, en la quinta columna se nos muestra el tamaño del fichero.
Resulta complicado interpretar el tamaño cuando éste es grande. Paraestos
casos, podemos utilizar la opción -h y el tamaño se nos mostrará de forma más
útil al usuario.

Pwd
El comando pwd muestra el directorio de trabajo actual. Veamos un ejemplo del
uso del comando 'pwd':

Vemos en estos ejemplos, que estamos utilizando un prompt en el que a parte


del carácter '$', aparece el nombre de usuario y de maquina. Este prompt se
puede configurar para mostrar cualquier información: el directorio actual, la hora,
el usuario, etc. Esto se hace asignando un valor a la variable de entorno PS1 que
define como es el prompt.

Como vemos en la imagen, el valor de la variable PS1 contiene:


o \u El nombre del usuario
o @ El carácter @
o \h El nombre de maquina (host)
o \w el carácter ~
o $ El carácter $

La contrabarra ‘\’ indica al sistema que tiene que coger el valor de la variable que
tiene a continuacion. Si no tuvieramos “\”, el prompt seria literalmente:

u@h:w$

Podemos cambiar el prompt en cualquier momento sin mas que asignarle un


valor a la variable PS1. Veamoslo en la siguiente imagen:

10
cd
El comando 'cd' nos permite cambiar el directorio actual, usando para ello
nombres absolutos o relativos.Su funcionamiento es equivalente al comando 'cd'
de MS-DOS/Windows.

Si ejecutamos el comando sin pasarle parametros nos devuelve a nuestro


directorio inicial de trabajo (Definido por la variable de entorno HOME):

Conviene recordar en este momento el significado de los ficheros especiales '.' y


'..'. El fichero con el nombre '.' representa el directorio actual.

Como hemos podido ver en el ejemplo, realizar un 'cd .' no modifica el directorio
de trabajo actual.

Por otra parte, el fichero con nombre '..' representa el directorio padre al actual.
Si hacemos un cd a '..', ascenderemos al directorio padre del actual. Veamos un
ejemplo:

11
mkdir
El comando 'mkdir' nos permite crear directorios. Si los directorios que estamos
intentado crear ya existen, el comando 'mkdir' no hace nada.

El formato de la llamada lo podemos ver en la ayuda del comando:

La opción más importante del comando 'mkdir’ es ‘-p’, si el directorio padre del
directorio que queremos crear no existe, también se crea

En el siguiente ejemplo crearemos un único directorio

Podemos crear varios directorios en una sola llamada a 'mkdir':

Y por ultimo, un ejemplo del uso del parametro ‘-p’:

12
Cp
El comando 'cp' copia ficheros y directorios. El formato de su llamada es el
siguiente:

cp [Opciones]... Fuente Destino


cp [Opciones]... Fuente... DIRECTORIO

Donde:
o FUENTE: son los ficheros o directorios que se desean copiar. Cuando
se copian múltiplesficheros, el destino debe ser obligatoriamente un
directorio.
o DESTINO: es el nombre del fichero destino al que se copia.
o DIRECTORIO: es el nombre del directorio destino al que se copia.

Las opciones más importantes del comando 'cp' son:


o -f, --force: Sobreescribe los ficheros de destino sin avisar.
o -i, --interactive: Pregunta antes de sobreescribir los ficheros de
destino.
o -R, --recursive: Copia subdirectorios de forma recursiva.

En el siguiente ejemplo, copiaremos un fichero en un directorio:

Y en el siguiente ejemplo, haremos una copia del archivo agenda.txt:

13
mv
El comando mv mueve/renombra ficheros o directorios. El formato de su llamada
es:

mv [OPCIONES]... FUENTE DESTINO


mv [OPCIONES]... FUENTE... DIRECTORIO

Donde:
o FUENTE: son los ficheros o directorios que se desean mover. Cuando
se mueven múltiples ficheros, el destino debe ser obligatoriamente un
directorio.
o DESTINO: es el nombre del fichero destino al que se mueve.
o DIRECTORIO: es el nombre del directorio destino al que se mueve.

Las opciones más importantes del comando 'mv' son:


o -f, --force Sobreescribe los ficheros de destino sin avisar.
o -i, --interactive Pregunta antes de sobreescribir los ficheros de
destino.

Renombramos un directorio:

Movemos unos archivos a un directorio:

14
rm

El comando 'rm' elimina uno o varios ficheros. Conviene recordar que, en UNIX,
no se puede recuperar un fichero una vez borrado. El formato de su llamada es:
rm [OPCIONES]... FICHERO...

Donde FICHERO Son los ficheros a borrar y las opciones más importantes del
comando 'mv' son:

o -f, --force No pide confirmación para borrar ficheros.


o -i, --interactive Pide confirmación para borrar ficheros.
o -r, -R, --recursive Elimina el contenido de los directorios
recursivamente, es decir, elimina un directorio y todo lo que tenga
almacenado.

Vamos a los ejemplos. Primero borraremos un archivo con el parametro –i para


que el sistema nos pida confirmacion:

Ahora vamos a borrar un directorio y todo su contenido:

touch
El comando 'touch' se utiliza para modificar la fecha de creación de un archivo.

No obstante, es habitual el uso de 'touch' para crear un archivo vacío. El formato


de la llamada es:

touch [OPCIONES]... FICHERO...

Si lo utilizamos para crear ficheros vacíos, no hace falta utilizar ninguna opción.
Veamos un ejemplo:

15
Ahora vamos a modificar la fecha de creacion de un archivo:

Nota: El comando date muestra la fecha actual del sistema.

cat
El comando 'cat' muestra por la salida estándar (generalmente el terminal) el
contenido de un archivo. Su uso habitual es mostrar el contenido de pequeños
archivos de texto o concatenar el contenido de varios archivos en uno. El formato
de su llamada es:

cat [OPCIONES] [FICHERO]...


Generalmente, 'cat' se utiliza sin opciones. Veamos un ejemplo de su utilización:

More
La función del comando ‘more’ es similar a la del comando ‘cat’:mostrar por la
salida estándar el contenido de un archivo pero mostrándolo dividido en páginas.

16
Cuando el tamaño de un archivo es superior al de la terminal desde el que
estamos es mas adecuado el uso del comando more que el del comando cat.

Para pasar de página se usa la barra espaciadora.

1.8.- COMANDOS PARA CONTROLAR EL USO DEL DISCO

Veremos los comandos du y df para controlar el espacio ocupado en los discos del
sistema.

du
El comando (disk usage) 'du' nos muestra el tamaño ocupado por cada fichero. Si
se le pasa como argumento un directorio, mostrará recursivamente el tamaño de
todos los ficheros que contiene.

El formato de su llamada es:


du [OPCION]... [FICHERO]...

Las opciones más habituales son:


o -h, --human-readable Imprime los tamaños de forma más legible para
las personas
o -s, --summarize Muestra el total para cada argumento.

17
Veamos varios ejemplos de su utilización. Para obtener el tamaño ocupado por
nuestro directorio home:

Hemos calculado de cuatro formas distintas el tamaño del directorio home. En la


última hemos utilizado el carácter ~ para identificar el directorio home. Cuando el
shell se encuentra éste, lo sustituye por el home de usuario.

Obtengamos ahora el tamaño de todos los ficheros en el directorio raíz del


usuario:

df
El comando 'df' (disk free) muestra información sobre los sistemas de ficheros
montados en la máquina.

El formato de su llamada es:


df [OPCIONES]... [FICHERO]...

Si no se indica ningún fichero, 'df' muestra información sobre todos los sistemas
de ficheros montados en ese momento.

Las opciones más habituales son:


o -h, --human-readable Imprime los tamaños de forma más legible para
el usuario.

Veamos un ejemplo de su utilización:

18
1.9.- CONFIGURACION DE SHELL

Aunque en sus funciones básicas, todos los shell disponibles se comportan de


forma similar, es cuando entramos en características avanzadas como la
programación, cuando aparecen diferencias entre unos y otros.

Para UNIX existe una variedad importante de shells. Entre los más conocidos se
encuentran el bash, el ksh y csh . El shell más extendido en linux es Bash.

Scripts de Inicio
Cuando un usuario hace login en una máquina UNIX, el sistema lee la información
contenida en diversos archivos de configuración del shell.

Primero se carga el archivo /etc/profile, común para todos los usuarios.

Aunque el contenido del fichero os parece ahora ininteligible, fijaros que hay un
punto donde se define al prompt del usuario: # si es el usuario root y $ para el
resto.

Despues busca en el home del usuario el archivo ~/.bash_profile. Si no existe el


~/.bash_profile, busca el ~/.bash_login y si tampoco existe este, se leeria el
~/.profile.

Cuando un usuario abandona su cuenta, el shell lee el fichero ~/.bash_logout.


En este fichero podremos colocar los comandos que deseamos ejecutar al
terminar la sesión.

19
Según la imagen, cuando usuario inicie la sesión, se leerán por orden, los
siguientes archivos: /etc/profile y .profile.

Cuando se cierre la sesión, se leerá el archivo .bash_logout

Alias
Los alias permiten la sustitución de una cadena por una palabra cuando se usa
como la primera palabra de un comando simple.

La lista de los alias almacenados por el shell se puede consultar usando el


comando alias:

20
Para definir un alias, usaremos la siguiente llamada 'alias nombre=valor'. Por
ejemplo, para crear un alias para el comando ls:

Un alias así definido se pierde al salir del shell donde se ha definido. Si queremos
utilizar un alias siempre que se inicie un shell debemos añadir la línea de la
definición a uno de los archivos de inicio del shell. En nuestro caso, habria que
añadirlo al archivo ~/.profile. o al archivo /etc/profile si queremos que sea para
todos los usuarios.

1.10.- ENLACES SIMBÓLICOS

Si conoce el sistema operativo Windows, probablemente ya conoce el concepto de


“acceso directo”. En Linux, también hay accesos directos, denominados enlaces
simbolicos. Básicamente, cuando enlazamos un fichero o directorio “a” con otro
fichero o directorio “b”, cada acceso a “b” se convierte en un acceso “a”. Esta
característica es interesante pues permite que podamos acceder aun mismo
fichero destino desde varios puntos del árbol de directorios.

La orden que se utiliza para crear un enlace es ln:


ln -s ARCHIVO-ORIGEN ARCHIVO-ENLACE

A continuacion vemos un ejemplo:

Los enlaces simbólicos son fácilmente reconocibles con la orden “ls –l”, ya que el
campo de permisos comienza por l, y en el campo del nombre del fichero aparece
una flecha y el fichero al que apunta.

21
MÓDULO 3.- ADMINISTRACIÓN BÁSICA
Unidad 2.- Editores

1.1.- PRESENTACIÓN

Como ya hemos visto, la configuración de los programas en linux esta guardada


en archivos de texto. También se usan archivos de texto en los scripts de
arranque, código fuente... etc

Por ello, resulta imprescindible manejar con cierta soltura los editores que nos
ofrece la plataforma. Un editor que siempre nos vamos a encontrar en cualquier
plataforma linux es el ‘vi’. Es un poco complicado de manejar al principio y por
ello han ido surgiendo con los años otros mas intuitivos como ‘pico’, ‘nano’, ‘joe’,
etc.

También tenemos editores de textos gráficos en Linux. Los más interesantes los
podemos encontrar integrados dentro de los entornos GNOME y KDE.

Pero nos vamos a centrar en el vi que, tal y como hemos comentado, estará
disponible en todas las plataformas.

1.2.- VI

La curva de aprendizaje de Vi es bastante pronunciada ya que su funcionamiento


no sigue los cánones de las aplicaciones actuales pero, una vez que se domina,
todas las tareas de edición se realizan con mucha eficiencia. Aunque se adopte
otro editor para el uso diario, conviene conocer los comandos básicos de Vi dado
que, por su pequeño tamaño, suele ser el editor que se incluye en los discos de
rescate.

Hay una versión mejorada del editor, vim, que se recomienda instalar siempre
que sea posible.

Para ejecutar este editor escribiremos en la consola:

$vi
Vi tiene tres modos de trabajo.
o Modo comandos: las entradas del usuario se interpretan como
comandos. Es el modo por defecto cuando iniciamos el programa.
o Modo inserción: todo lo que introduzca el usuario se interpreta como
texto para el fichero. Se entra en el modo inserción pulsando algun
comando de inserción y se sale de nuevo al modo comandos con la tecla
‘esc’
o Modo ex: este modo se utiliza principalmente para salir de vi o salvar el
fichero. Para entrar en el modo ex, debemos estar en el modo comando y
pulsar la tecla ‘:’ y a continuación las correspondientes a la acción que
queramos realizar. Entre las más comunes están:
o :w nombrefichero Salva el fichero que estamos editando con el
nombre “nombrefichero”.
o :wq Salva el fichero y Sale de vi.
o :q! Sale de vi sin salvar.
o :sh Ejecuta un shell sin salir del editor.
MÓDULO 3.- ADMINISTRACIÓN BÁSICA
Unidad 3.- Gestión de Usuarios y Grupos

3.1.- GESTIÓN DE USUARIOS

Linux es un sistema operativo multiusuario y debido a esta característica, todos


los accesos al sistema se deben realizar usando una cuenta de usuario. Aunque
generalmente un usuario es una persona física, esto no siempre es así ya que
algunos servicios utilizan una cuenta de usuario para ejecutarse.

Cuando se crea una cuenta de usuario, también llamado dar de alta al usuario, el
administrador, o en su defecto el sistema, le asigna un identificador UID (User
Identification number). Este UID es un número entero que la máquina utiliza
internamente, para identificar a los usuarios.

Un grupo es un conjunto de usuarios con algún elemento en común. Cada usuario


debe pertenecer, al menos, a un grupo. Un grupo puede contener a varios
usuarios aunque se puede dar el caso de que exista un grupo al que no pertenece
ningún usuario. Además, la organización por grupos permite al administrador
asignar permisos sin necesidad de hacerlo a cada usuario individualmente.

Cuando se crea un usuario en linux automáticamente se crea un grupo con el


mismo nombre, al que pertenece el usuario desde el principio

CREACIÓN DE UN USUARIO

El proceso de creación de un usuario. Internamente, la creación de un usuario


implica los siguientes pasos:
a) Asignar un username (nombre de usuario) y un grupo (principal) o
grupos (secundarios) a los que va a pertenecer el nuevo usuario.
b) Almacenar esta información en los archivos /etc/passwd y
/etc/group.
c) Asignarle una contraseña al nuevo usuario.
d) Modificar la cuenta mediante una serie de modificadores.
e) Crear el directorio home del usuario. Generalmente será
/home/usuario.
f) Copiar los archivos de sistema básicos al directorio creado.
g) Cambiar los permisos del directorio y todo su contenido al nuevo
usuario.
h) Dar de alta el usuario en otros servicios del sistema: Impresoras,
cuotas de disco, etc.
i) Probar la cuenta creada.

Aunque es posible realizar todos estos pasos manualmente, esto no es lo normal.


Lo habitual será utilizar el comando ‘useradd’ o alguna herramienta gráfica en X
Window.

Los comandos useradd, userdel y usermod nos permiten, respectivamente, crear,


borrar y modificar cuentas de usuario.

Sólo un usuario con privilegios como el root puede crear cuentas de usuario.

1
A continuación veremos la creación de un usuario y su posterior asignación de
contraseña:

Como ya vimos en temas anteriores, con el usuario creado por defecto en la


instalación, también podemos realizar tareas que requieren privilegios (como la
creación de un usuario) anteponiendo el comando ‘sudo’ al comando que
queramos ejecutar. Por ejemplo, para crear un usuario:

usuario@usuario-desktop:~$ sudo adduser alumno


passwd:

Puede que nos pida la contraseña del usuario para asegurar la identidad del
mismo.

El usuario root puede cambiar la contraseña de cualquier otro usuario del


sistema, sin embargo un usuario sólo puede cambiar la contraseña de él mismo.
El comando 'passwd' no muestra en pantalla las contraseñas a medida que se
teclean.

También podemos crear una cuenta de usuario utilizando el comando ‘adduser’,


mucho más completo, que crea el directorio home del usuario, incluye un
asistente y permite introducir más información del usuario en el momento de su
creación:

2
ALMACENAMIENTO INTERNO DE USUARIOS: FICHEROS
PASSWD Y SHADOW

Toda la información sobre los usuarios de un sistema se encuentra almacenada


en el fichero /etc/password, donde aparece un listado de todos los usuarios del
sistema:

El archivo passwd contiene una línea por cada usuario dado de alta en el sistema.
Y cada linea esta compùesta de unos campos separados por :

• Username: nombre asignado al usuario. (alumno)


• Password: contraseña cifrada del usuario. Si en este campo aparece
una 'x', eso indica que el sistema está utilizando shadow password. Ésta
es una técnica que permite aumentar la seguridad y que veremos a
continuación.
• UID: identificador numérico del usuario. No pueden existir dos
usuarios en el sistema con el mismo UID.
• GID: identificador numérico del grupo primario al que pertenece el
usuario. Un usuario puede pertenecer a varios grupos pero sólo éste se
considerará como primario.
• GECOS: este campo suele contener el nombre completo del usuario
junto con otra información que se considere de interés. El usuario puede
cambiar el contenido de este campo haciendo uso del comando 'chfn'.
• Directorio home: directorio de trabajo del usuario. Habitualmente
estará localizado en /home/nombre_del_usuario.
• Shell: indica el intérprete de comandos (shell) que utilizará el usuario
en su trabajo. El usuario puede cambiar su shell haciendo uso del
comando 'chsh'.

3
Vamos a ver esos campos tomando como ejemplo el último usuario que hemos
creado: alumno.

El username es alumno y su password es 'x' lo que nos indica que se están


usando 'shadow passwords'. También podemos deducir que el UID y GID. es
1001. El campo GCOS o nombre del usuario es Alumno Apellido.

Podemos ver también que el directorio home de usuario es /home/alumno y que


está utilizando el shell bash cuyo ejecutable se encuentra localizado en /bin/bash.

El archivo /etc/passwd debe tener permisos de lectura para todos los usuarios del
sistema. En apariencia, esto no parece ser un problema dado que las claves se
guardan cifradas. En la realidad, esto no es así debido al sistema que emplea
UNIX para el cifrado de claves.

Cuando un usuario crea un password, el sistema lo encripta utilizando una


función de una sola vía y lo almacena en el fichero passwd. La utilización de una
función de una vía nos asegura que, desde la contraseña cifrada, no es posible
recuperar la original.

Cuando un usuario hace login, el sistema cifra la clave introducida utilizando la


misma función y la compara con la almacenada en el fichero passwd. Si las claves
coinciden, se le permite el acceso. Tenemos entonces un fichero con unas
contraseñas almacenadas cifradas de las que no se pueden obtener las originales.
¿Cuál es el problema entonces?. El problema proviene del hecho de que, al igual
que en el proceso de login, el sistema comprueba si la contraseña coincide con
alguna almacenada, la misma operación la puede realizar un atacante.

Existen programas que comprueban sistemáticamente miles de claves sobre un


archivo passwd. Esta técnica se denomina "ataque por fuerza bruta" y,
generalmente, es bastante efectiva ya que los usuarios, y algunas veces el propio
administrador, eligen claves muy sencillas de descifrar como sus nombres, ciudad
de nacimiento, etc.

Para solventar este problema se desarrolló el sistema de shadow passwords. La


idea consiste en extraer el campo de la clave del fichero passwd y trasladarlo a
un fichero /etc/shadow donde sólo el administrador tenga permisos de lectura.
Cuando se estén utilizando shadow passwords, en el archivo /etc/passwd
aparecerá, en vez de la contraseña cifrada, el carácter 'x'.

El archivo /etc/shadow de nuestro sistema tendría un aspecto similar al siguiente:

4
Como se puede observar, el formato del archivo /etc/shadow es similar al del
archivo /etc/passwd. Los campos importantes son el primero y el segundo. En el
primero se guarda el nombre del usuario y el segundo almacena, ahora sí, la
contraseña cifrada. En este caso, podemos ver la contraseña cifrada del usuario
root. Si el usuario root no tuviera una contraseña asignada, como ocurre por
defecto en la instalación de ubuntu, en el campo de la contraseña aparecerá un
signo de admiración invertida “!”.

Puesto que este fichero sólo tiene permisos de lectura para el superusuario, un
atacante, actuando como un usuario sin privilegios, no puede acceder a las
contraseñas cifradas.

En los usarios, que en el segundo campo aparece un *, no van a poder iniciar la


sesión. Generalmente se trata de usuarios utilizados por programas para
ejecutarse en el sistema.

BLOQUEO DE UN USUARIO

En ocasiones, sabemos que algún usuario de nuestro sistema dejará de usarlo


durante un período largo de tiempo. Como medida de seguridad, convendrá
bloquear la cuenta para que no se pueda utilizar hasta que el usuario legítimo
vuelva a hacer uso del sistema.

Para bloquear una cuenta, usaremos el comando passwd -l. Por ejemplo, para
bloquear la cuenta del usuario alumno:

5
Si nos fijamos ahora en la línea correspondiente al usuario en el archivo
/etc/shadow:

Vemos que en el segundo campo aparece el carácter “!”, es como si el usuario no


tuviera contraseña asignada. De hecho, si intentamos iniciar la sesión con el
usuario nos dará un error de contraseña incorrecta:

6
Para desbloquear la cuenta usaremos el comando, passwd, pero pasándole el
parámetro –u, tal y como viene reflejado en la siguiente imagen:

Y ya podríamos iniciar la sesión con ese usuario.

ELIMINACIÓN DE UN USUARIO

Cuando estemos seguros de que un usuario ha dejado de hacer uso del sistema
de forma definitiva, deberemos borrar la cuenta. Es una buena costumbre avisar
al usuario antes del borrado de su cuenta por si desea salvar la información de su
directorio home.

Para eliminar una cuenta usaremos el comando ‘userdel’. Si además queremos


eliminar también la información de su directorio home, su cola de correo, etc., Le
añadiremos el parámetro ‘-r’

7
MODIFICAR UN USUARIO

Para modificar la configuración de un usuario tenemos el comando usermod:

Por ejemplo, vamos a asignar al usuario ‘usuario’ el nombre Juan Perez, el home
/home/juanperez y la shell /bin/sh:

8
Antes del comando:

usuario:x:1000:1000:Usuario,,,:/home/usuario:/bin/bash

Y después de ejecutar el comando:

usuario:x:1000:1000:Juan Perez:/home/juanperez:/bin/sh

9
3.2. GESTIÓN DE GRUPOS

Análogamente al archivo /etc/passwd para almacenar los usuarios, existe el


archivo /etc/group donde se guardan los grupos. Este archivo tiene un contenido
similar al siguiente:

10
Al igual que el fichero passwd, el fichero group también está dividido en campos
separados por ':'.

La interpretación de los campos es la siguiente:


o Nombre: nombre del grupo.
o Clave de acceso: en sistemas Linux, esta clave no se utiliza y
siempre tendrá el valor 'x'.
o GID: identificador numérico del grupo. Este número es el que
realmente utiliza el sistema en sus operaciones internas.
o Usuario: lista de usuarios adscritos al grupo. Si hay más de un
usuario, se separarán por comas.

La gestión de grupos se realiza de forma similar a la gestión de usuarios.


Usaremos los comandos groupadd, groupdel y groupmod para crear, eliminar y
modificar grupos respectivamente.

El uso de los comandos es muy sencillo:

1º.- Creamos el grupo CursoLinux:

root@usuario-desktop:~# groupadd CursoLinux

root@usuario-desktop:~# cat /etc/group


....
....
CursoLinux:x:1001:

2º.- Cambiamos el nombre al grupo:

root@usuario-desktop:~# groupmod -n CursoUbuntu CursoLinux

root@usuario-desktop:~# cat /etc/group


....
....
CursoUbuntu:x:1001:

3º.- Borramos el grupo:

root@usuario-desktop:~# groupdel CursoUbuntu

11
MÓDULO 3.- ADMINISTRACIÓN BÁSICA
Unidad 4.- Instalación y Gestión de Software

4.1.- INTRODUCCIÓN

La instalación de aplicaciones en Sistemas Operativos de Microsoft siempre ha


sido muy intuitiva: Se trataba de encontrar el ejecutable en la fuente de
instalación y hacer doble click con el ratón.

En Linux la cosa no está tan sencilla; aunque se ha mejorado mucho con los
años. Al principio, cuando un administrador de Linux tenía que instalar algo,
primero tenía que buscar los programas en código fuente, compilarlos y
finalmente instalarlos, cuidando de que no se produjese un conflicto con alguna
aplicación ya instalada.

La instalación desde las fuentes aún se sigue usando hoy en día, ya que ofrece
muchas más posibilidades de personalizar una instalación, aunque puede resultar
compleja para usuarios sin muchos conocimientos.

Con la creación de los sistemas de paquetes (DEB en ubuntu), la situación ha


cambiado radicalmente. Un paquete es un archivo que contiene una o varias
aplicaciones junto con información relativa a esas aplicaciones.

El proceso de instalación puede ser tan sencillo como seleccionar el paquete de


instalación en un menú, mientras que un programa se lo descarga
automáticamente de un CD o Internet, comprueba las dependencias y la instala
en nuestro sistema. Siendo la instalación aún más sencilla que en Sistemas de
Microsoft.

Cada distribución Linux presenta su propio sistemas de paquetes (por ejemplo


rpm en RedHat y .deb en debian) siendo ubuntu (debian) una de las que dispone
de más paquetes, facilitando el trabajo en este entorno.

Es muy común en Linux que una aplicación dependa de otras, ya sea mediante la
línea de comandos o utilizando librerías. Esta relación provoca, especialmente en
aplicaciones grandes, que instalar un programa nos obligue a instalar otros
muchos de los que depende. Este problema se agrava cuando la aplicación no
sólo depende de otras, sino que también depende de una determinada versión de
otra aplicación. El problema de las dependencias entre aplicaciones ha sido, en
parte, solucionado con el uso de paquetes.

Una ventaja importante de usar software en paquetes, consiste en la gestión de


las actualizaciones. Por ejemplo, si estamos ejecutando un servidor web y
queremos actualizarlo a una versión más nueva, automáticamente el sistema se
encarga de detener el servicio, actualizar el software y volver a arrancar el
servidor sin necesidad de que el administrador intervenga.

Aparte del sistema de gestión de paquetes en ubuntu, veremos también como


instalar una aplicación desde código fuente. El código fuente se suele distribuir en
formato tar.gz, es decir, simplemente comprimido y sin información extra de
ningún tipo.
4.2.- .MANIPULACIÓN DE PAQUETES EN UBUNTU

Los paquetes de software utilizados por la distribución Debian se reconocen por la


extensión .deb.

Para la gestión de los paquetes en Debian existen dos tipos de herramientas:

o De bajo nivel: El único programa que encontramos aquí es dpkg, el


instalador de paquetes individuales .deb. Su único objetivo es instalar,
actualizar, eliminar un solo paquete. El aspecto negativo de esta
herramienta es que no resuelve dependencias: si intentamos instalar un
programa que depende de otros, no lo instalará.

o De alto nivel: En esta categoría encontramos más programas, algunos de


ellos para X Window. Estos gestores si resuelven las dependencias, de tal
manera que si intentamos instalar un programa que dependa de otros,
primero instalará los otros y luego el que nosotros pedimos,
automáticamente. Ejemplos de este tipo de programas :
o Apt
o Dselect
o Aptitude
o Synaptic

Apt, dselect y aptitude son programas de texto para la consola mientras que
Synaptic funciona bajo X Window.

Fichero sources.list
La función del fichero /etc/apt/sources.list es almacenar la lista de fuentes (en
inglés, sources) desde donde descargar o copiar los paquetes .deb. Estas fuentes
pueden ser de dos tipos:

o URL: direcciones http, ftp o directorios locales.


o CD-ROM: los CD-ROM de la distribución Debian.

Existen dos útiles comandos para modificar este fichero. Por ejemplo, si
queremos introducir un CD-ROM como una fuente donde buscar paquetes,
debemos ejecutar la orden:

# apt-cdrom add
A continuación el sistema nos pedirá que insertemos el CD y actualizará la
información de sources.list relativa a él.
Sin embargo, ya que sources.list es un fichero de texto, podemos editarlo (vi,
nano, emacs,…) e introducir nosotros mismos los fuentes de paquetes.

Apt
Antes de instalar un paquete, lo primero que tenemos que hacer es actualizar el
listado de paquetes disponibles con el comando: “#apt-get update”

Este comando consulta el listado de paquetes disponibles en los repositorios del


archivo /etc/apt/sources.list para asegurarnos que instalamos la ultima versión.
Para instalar un paquete, primero tenemos que conocer el nombre de un paquete.
Para eso tenemos el comando apt-cache que consulta en la base de datos
disponibles (actualizada si hemos ejecutado previamente el comando ‘apt-get
update’):

Para poder manipular paquetes mediante APT necesitamos conocer el nombre de


dicho paquete. Para esto podemos usar los comandos apt-cache que buscan en
la base de datos de paquetes disponibles:
De entre todas las opciones disponibles destacamos dos:
o apt-cache search <nombre> Busca en la lista de paquetes disponibles
para instalar, áquellos que están relacionados con <nombre>.
o apt-cache show <paquete> Muestra información sobre el paquete
especificado.

Veamos un ejemplo de utilización de estas órdenes para buscar el paquete


correspondiente al reproductor multimedia vlc.

Empezamos buscando la palabra “vlc” en la base de datos, ya que por ahora es lo


único que sabemos pues el nombre concreto del paquete puede ser otro:

De entre todos los que aparecen, nos interesa el siguiente:

vlc - multimedia player and streamer

Vamos a ver con más detalle el contenido del paquete:


Como podemos ver, este era el paquete pues proporciona reproductor multimedia, como
indica el campo ! Description" .
Una vez que ya sabemos que queremos instalar, podemos usar los comandos
apt-get. No tenemos que preocuparnos de problemas de dependencias ya que
apt es lo suficientemente inteligente como para gestionarlas (podemos ver las
dependencias del paquete vlc en la línea ‘Depends’).

De entre todos los parámetros que podemos pasar al comando destacan los
siguientes:
o apt-get install <paquete1> <paquete2> … Instala los paquetes cuyo
nombre le indiquemos.
o apt-get remove <paquete1> <paquete2> … Borra los paquetes que le
indicamos. No elimina los ficheros de configuración.
o apt-get –purge remove <paquete1> <paquete2>.. Borra el paquete
completamente, incluyendo los ficheros de configuración.
o apt-get update Como ya hemos visto, utiliza las fuentes definidas en
sources.list parabuscar paquetes nuevos.
o apt-get upgrade Actualiza aquellos programas de los que existen nuevas
versiones.
o apt-get dist-upgrade Nos permite actualizarnos de distribución

Vamos a ver lo sencillo que es instalar un programa en linux con el comando vlc:
Conviene observar la cantidad de paquetes extras que se van a instalar a parte
del propio vlc. Si no se instalara alguno de estos paquetes vlc no funcionaria
correctamente, por suerte no tenemos que ir buscando de forma artesanal todos
los paquetes necesarios ya que el programa apt-get lo hace por nosotros.

Una vez instalado, podemos acceder al programa desde nuestro escritorio


Gnome:
Dpkg
La utilización de esta herramienta sólo esta recomendada cuando nos
encontremos con paquetes Debian sueltos ya que este programa no resuelve
dependencias:

Las opciones más interesantes del comando dpkg:

o dpkg –i <nombre-paquete>.deb Instala un paquete .deb.


o dpkg --remove <nombre-paquete> Desinstala un paquete. No borra
los ficheros de configuración.
o dpkg --purge remove <nombre-paquete> Desinstala un paquete
borrando también los ficheros de configuración.
Se pueden consultar más opciones sobre dpkg en su página man ó pasando el
parametro –help

Vamos instalar el paquete webmin con el comando dpkg. La utilidad del programa
webmin como herramienta de administracion la veremos mas adelante.

Nos descargamos el paquete desde la pagina web oficial del programa:


http://www.webmin.com:
Una vez descargado el programa, abrimos una terminal y nos situamos en el
directorio donde se ha descargado el programa:

Nos ha dado error en la instalación porque depende de unos paquetes que no


están instalados. Ahora tendríamos que buscar cada uno de los paquetes e
instalarlos uno a uno para poder instalar el paquete webmin. Por suerte contamos
con la herramienta apt-get para instalarlos. (no tenemos que buscarlos porque la
instalación fallida del webmin nos ha devuelto el nombre de los paquetes):

# apt-get install libnet-ssleay-perl libauthen-pam-perl apt-show-versions libio-


pty-perl libapt-pkg-perl

(el paquete libapt-pkg-perl es necesario para instalar apt-show-versions)

Una vez instalados, lo volvemos a intentar, esta vez de forma exitosa:


4.3.- INSTALACIÓN DE SOFTWARE DESDE LOS FUENTES

Aunque pueda parecer lo contrario, hay veces que es más interesante instalar
una aplicación compilándola desde sus fuentes en vez de utilizar un paquete deb.
Estas situaciones podrían ser:
o El programa que necesitamos no esta disponible como paquete .deb.
o El paquete es muy antiguo. Por ejemplo, cuando se descubre un fallo de
seguridad en un programa, el parche se hace primero para el codigo
fuente y posteriormente en el paquete.
o Compilación a medida: En realidad un paquete es una compilacion hecha
de un codigo fuente. Cuando se compila un programa, se presenta varias
opciones y puede que el paquete disponible no haya sido compilado con la
opcion que nosotros nos interesa.

Para compilar el código fuente de un programa necesitaremos el compilador del


lenguaje en el que esté escrito. En Linux, los lenguajes más utilizados son C y
C++, por lo tanto, tendremos que instalar el compilador'gcc'. Además del
compilador, también será necesario instalar el programa make, que es el que
realmente llamará a gcc.

La mayoría de los programas distribuidos en código fuente se presentan con la


extensión .tar.gz, también conocido como tarball). Un fichero .tar.gz es un
conjunto de ficheros empaquetados por el programa 'tar' y comprimidos usando
'gzip'. El equivalente de un .tar.gz en el entorno Windows sería cualquier tipo de
fichero comprimido como zip o rar.

Una vez descomprimido el código fuente procedemos a su compilación.

COMPILACIÓN

Generalmente, todo el software para Linux se compila siguiendo las directrices


marcadas por el proyecto GNU. Todos los programas GNU se compilan de la
misma forma en todos los sistemas para los que están disponibles. Esta
homogeneidad proporciona una gran facilidad a la hora de compilar el instalar
este tipo de programas.

Los pasos para compilar un programa GNU son muy sencillos, en general, basta
con ejecutar los siguientes comandos:
# ./configure
# make
# make install

o 'configure' es un script que adapta el código fuente a las características


de nuestro sistema. Además, también comprueba que esté instalado todo
el software y librerías de los que depende la aplicación que deseamos
instalar. Si faltase algún elemento necesario, nos informaría y cancelaría el
proceso.

o 'make' inicia el proceso de compilación. Se mostrará por el terminal gran


cantidad de información a medida que se van compilando los ficheros. La
duración de la compilación dependerá del tamaño de la aplicación yde las
capacidades de nuestra máquina como velocidad, memoria, etc.

o 'make install' realiza la copia de los programas ya compilados de la


aplicación a sus directorios definitivos con /bin, /usr/bin, etc. Este paso se
debe realizar como 'root' ya que es el único usuario que tiene permisos de
escritura en esos directorios.

Vamos a verlo mucho más claro con el siguiente ejemplo, instalando el servidor
web Apache desde sus fuentes. Primero nos descargamos de su página web la
versión 2.0 de apache:

Una vez descargado el archivo httpd-2.0.63.tar.gz, lo primero que debemos hacer


es descomprimirlo primero con el comando gzip y desempaquetarlo después con
el comando tar:

Tenemos un directorio dentro del cual ejecutaremos los comandos de


compilación:
Tal y como hemos visto antes, es necesario el lenguaje de programación gcc para
compilar los programas. Pero si vamos a compilar muchos programas, existe un
paquete de compilación muy completo que nos instalar todo lo necesario, se trata
del paquete:

build-essential - Lista informativa de paquetes esenciales para poder compilar

Una vez instalado el paquete, el programa configure se ejecuta sin incidencias


Make
Y make install

Tendríamos el programa apache compilado e instalado. Mas adelante veremos un


poco más sobre este servidor web.
MÓDULO 3.- ADMINISTRACIÓN BÁSICA

Unidad 5.- Procesos

4.1.- INTRODUCCIÓN

Linux es un sistema operativo multitarea, es decir, puede ejectiar varios


programas a la vez. Un proceso no es más que un programa o aplicación que se
encuentra cargado en la memoria y en proceso de ejecución.

Aunque nuestro ordenador sólo disponga de una CPU, el sistema operativo se


encarga de repartir el tiempo de procesamiento de la misma para que varios
procesos puedan ir realizando sus operaciones, dando la sensación de que se
están ejecutando todos a la vez.

Cada proceso tiene un numero de indetificació PID (Process IDentification).

A pesar de lo citado en el primer párrafo, programa y proceso no es lo mismo.


Podemos tener un mismo programa ejectutándose varias veces y cada programa
tendra un PID asociado que será diferente, es decir, un programa puede abarcar
varios procesos.

Para saber qué procesos se están ejecutando en la terminal (tty) donde nos
encontramos (tty1) , podemos utilizar el comando ps:

En la imagen tenemos dos programas ejecutandose sh (shell de acceso al


sistema) y el propio comando ps que hemos ejecutado y cada uno de ellos tiene
un proceso asociado. Si lanzamos de nuevo un programa sh:

Vemos que seguimos teniendo dos programas pero tres procesos. El programa sh
tiene asociado dos procesos (PIDs 5725 y 5745).

1
4.2.- PARÁMETROS DEL PROCESO

A continuación vamos a ver algunos parámetros interesantes que le podemos


pasar al proceso.

o “u”. Nos muestra un poco más de información, incluyendo el usuario que


está ejecutando los procesos:

o “-a”: nos muestra los procesos de todos los terminales del sistema.

Del resultado del comando obtenemos la siguiente información:


o En la consola tty1 se están ejecutando dos programas, sh y ps, con
sus respectivos procesos.
o En la consola tty2, se están ejecutando dos programas, vi y bash,
con sus respectivos procesos.
o En la consola tty3, se están ejecutando dos programas, top y bash,
con sus respectivos procesos.
o En la consola tty4 se están ejecutando cuatro programas: bash
crontab, sh y editor, con sus respectivos procesos.

(Nota: Los parámetros se pueden juntar en una misma llamada al comando y


conseguir sumar las funcionalidades del mismo. Por ejemplo, is ejecutamos

$ ps –au

2
Obtenemos todos los procesos que se están ejecutando desde la consola con
información mas detallada, incluyendo el usuario que está ejecutando el proceso.)

o “-l”: enseña información extendida para cada proceso, como el tiempo de


CPU que ha utilizado, el terminal donde se ejecuta, etc.

En la segunda columna (Status) también podemos ver el estado del proceso.


Aunque el sistema tenga muchos procesos ejecutándose en un mismo instante de
tiempo, ello no implica que todos necesiten tiempo de CPU constantemente. Por
ejemplo, cuando un servidor de páginas web no tiene ninguna petición, no es
necesario que haga absolutamente ninguna operación. Aunque esté en memoria
preparado para ejecutarse al recibir una petición, es mejor que no pase en ningún
momento por la CPU, ya que ésta puede utilizarse para otros procesos que sí que
la necesitan. Internamente, el sistema operativo tiene implementados una serie
de mecanismos muy eficaces para gestionar toda esta clase de operaciones. De
este modo, un proceso puede estar en los siguientes estados (mostrados con el
carácter correspondiente):

o “-e” Muestra todos los procesos que se estan ejecutando en el sistema,


incluyendo los procesos internos del sistema. Esto es util para los
administradores del sistema porque, a parte de figurar los procesos que
ejecutan los usuarios desde consola, aparecen los servicios de sistema que
siempre es interesante controlar:

3
La columna TTY nos indica desde donde se esta ejecutando el proceso:
o tty: Si se está ejecutando desde consola
o pts: Si se está ejecutando desde terminal remoto.
o ¿: Generalmente asociado a procesos internos del sistema.

Otro comando muy útil es el top, que nos informa de forma interactiva de los
procesos del sistema, del estado de utilización de la CPU, la memoria utilizada y
libre, la RAM que utiliza cada proceso, etc.

Este programa es muy indicado cuando el sistema no responde adecuadamente o


notamos alguna disfunción extraña, ya que nos permite localizar rápidamente qué
proceso está afectando negativamente al rendimiento del sistema.

Hemos visto comandos que muestran información sobre el estado de los procesos
pero, que pasa si uno de los procesos esta consumiendo todos los recursos de la
maquina ó simplemente se ha quedado colgado? Podemos terminar el proceso
con el comando kill. El comando kill nos permite enviar señales a los procesos
que nos interese. En general, todos los programas se diseñan para que puedan
recibir este tipo de señales. De este modo, según el tipo de señal recibido saben
que deben realizar unas operaciones u otras. Para obligar a un proceso a que
termine o pause su ejecución, le pasamos el parametro -15, indicándole al
proceso que queremos que termine, de modo que al recibir la señal deberá
guardar todo lo necesario y acabar su ejecución.

4
En la imagen se ve que hemos finalizado un proceso top (PID=5315). Si el
programa no termina en el tiempo estimado, podemos forzar un cierre pasándole
el parámetro -9. Pero en este caso perderíamos la información que el programa
no hubiera guardado.

killall sirve para referirnos al nombre de varios procesos a la vez en lugar de


referenciarlos por su PID y, de esta forma, enviarles una señal a todos a la vez.

Con el comando skill también podemos enviar señales a los procesos, pero con
una sintaxis diferente. Por ejemplo, si queremos detener todas las ejecuciones de
un determinado usuario, podríamos utilizar “skill -STOP -u nombreLogin”, con lo
que todos los procesos de dicho usuario se pararían.

Por ejemplo, en la siguiente pantalla, el usuario “root” va a detener todos los


procesos iniciados por “usuario”:

o Primero mostramos los procesos de consola, para localizar los de


“usuario”. En la columna “STAT” podemos ver el estado del proceso: (S:
en espera)

5
o Ahora matamos todos los procesos de usuario:

Ahora el estado de los procesos a pasado a T (detenido).

Pero podemos volver a iniciar aquellos procesos que lo permitan con el parámetro
CONT:

La columna “STAT” nos muestra con el valor “S” los procesos que han podido ser
iniciados de nuevo.

Cuando estamos ejecutando algún programa en una consola y queremos pasarle


la señal de TERM, podemos utilizar la combinación de teclas CTRL+C. Con
CTRL+Z podemos pausar un programa y revivirlo con fg.

Otra manera de ver los procesos es por su jerarquía. Igual que en el sistema de
ficheros, los procesos siguen una cierta jerarquía de padres a hijos. Todo proceso
debe ser lanzado a partir de otro, sea el propio intérprete de comandos, el
entorno gráfico, etc., de manera que se crea una relación de padres a hijos. Con
el comando pstree podemos ver esta jerarquía de forma gráfica. Si lo
ejecutamos, veremos cómo el padre de todos los procesos es uno llamado init. A
partir de éste parten todos los demás, que a la vez pueden tener más hijos. Esta
estructura jerárquica es muy útil, ya que, por ejemplo, matando a un proceso

6
padre que contiene muchos otros hijos, también matamos a todos sus hijos.
También nos puede servir para identificar de dónde parten ciertos procesos, etc.
Si no le pasamos ningún parámetro al comando, por defecto compacta todos los
procesos con un mismo nombre para no mostrar una estructura demasiado
grande, aunque esto también es configurable a partir de sus parámetros.

Todos los procesos del sistema tienen una cierta prioridad. Como decíamos antes,
esta prioridad indica el tiempo de CPU que se le dejará al proceso. Cuanto más
prioritario sea el proceso, más tiempo de ejecución tendrá respecto a los otros. El
rango de prioridades va desde el –20 al 19, de mayor a menor. Para lanzar un
proceso con una determinada prioridad, podemos utilizar el comando nice.

Por ejemplo:

$ nice –n 10 vi

Lanzará el proceso vi (editor de texto) con prioridad 10. Con el comando top
podemos ver la prioridad de cada proceso (tercera columna):

Si queremos dar una prioridad diferente a un proceso que ya esté en ejecución,


podemos utilizar renice. Sólo el root puede utilizar el rango de prioridades
negativas; así, el sistema se asegura de que el root cuente siempre con la
posibilidad de ejecutar procesos más rápidamente que los usuarios. Por defecto,
la prioridad con que se ejecutan los programas es la 0.

Ahora cambiamos la prioridad del proceso vi a 5, utilizando el usuario root:

$ renice -5 p 5427
5427: old priority 10, new priority 5

7
MÓDULO 4.- ADMINISTRACIÓN DE REDES
Unidad 1.- Configuración de la Red de Linux

1.1.- INTRODUCCION

Una red informatica permite la comuicacion de equipos informaticos entre si con


la finalidad de compartir informacion y recursos.

Entre las ventajas que supone tener instalada una red, pueden citarse las
siguientes:

- Se facilita la comunicación entre los usuarios.


- Se reducen los gastos de hardware y software.
- Nos permiten crear grupos de trabajo ubicados en lugares geográficos
distintos.
- Nos permiten establecer políticas de acceso sobre nuestros datos.
- Podemos realizar copias o backups de una forma cómoda y rápida.
- Se facilitan las tareas de administración, no siendo necesaria la presencia
física del técnico.
- Nos permiten múltiples formas de acceso a nuestros datos.

Hoy en dia, no se entiende el uso de un ordenador que no este accediendo a una


red. Ya sea en la empresa accediendo a recursos necesarios para desempeñar el
trabajo ó desde casa accediendo a internet a traves del adsl.

Vamos a ver con mas detalle las redes informaticas abordandolo desde el sistema
operativo Linux, configuracion de la red e instalacion de servicios de red.

Linux en la red

Linux es básicamente un sistema operativo de red. Desde si creación se diseño


para tal fin, soporta multitud de protocolos de comunicación y hardware de red
existente.

Existen un gran número de aplicaciones de red de libre distribución, es decir


gratis, que nos permiten desde navegar a través de Internet y enviar y recibir
correo electrónico, hasta resolver nombres de dominio, o servir contenido web a
todo el mundo

Modelo cliente-Servidor

Tal y como indica su nombre, en este modelo existen dos elementos principales:
el cliente y el servidor. El funcionamiento es muy sencillo: el servidor se sitúa a la
espera de que uno o más clientes soliciten sus servicios. A partir de ese momento
se establece una comunicación entre ambos.

Cuando instalamos un programa o servicio de red, estos permanecen a la espera


de conexión en lo que se denomina “puertos”. Por ejemplo un servidor web
suele “escuchar” en el puerto 80.
Pero a este servicio pueden acceder multitud de clientes. Como diferenciar una
conexión de otra? Los clientes a su vez tienen unos puertos asignados asi, a la
hora de responder al cliente, el servidor sabra donde enviar la respuesta.

Vamos a verlo con un ejemplo:

La herramienta netstat sirve, entre otras cosas, para mostrar las conexiones
cliente-servidor en un equipo (la veremos mas adelante).

El parámetro “| grep :25” sirve para filtrar las líneas que contengan “:25”, es
decir, queremos mostrar solo las conexiones para enviar correo electrónico.

En la tercera columna tenemos la ip del servidor, 195.76.40.2, escuchando en el


puerto 25 (puerto del servidor).

En la cuarta columna tenemos las direcciones ips de los clientes, con el puerto
cliente asociado. La linea:

tcp 0 0 195.76.40.2:25 195.55.135.254:32255 TIME_WAIT

Nos dice que un cliente con dirección IP 195.55.135.254, se ha conectado al


puerto 25 del servidor 195.76.40.2, utilizando como puerto cliente 32255.

En otras líneas vemos que la parte servidor coincide (195.76.40.2:25) pero


cambia la parte cliente (195.76.40.10:49019, direccion IP:Puerto Cliente)

Protocolos de comunicación

Para comunicar diferentes máquinas tenemos que acordar la forma en que lo


vamos a hacer. Al conjunto de normas para la transmisión de mensajes en una
red se le llama protocolo de red. Nosotros vamos a trabajar sobre el protocolo
tcp/ip, al ser el mas extendido. En el caso que nos ocupa destacaremos los
siguientes:

- IP: Es el responsable de que los paquetes que mandamos desde un sitio


lleguen a su destino. Se encarga del enrutamiento de los paquetes de
información.
- TCP y UDP: Son dos protocolos que necesitan de IP para transmitirse.
TCP se encarga de transmitir información de forma segura, asegurándose
de que el mensaje llega y se encarga de retransmitirlo en caso de que
surja algún problema. UDP, al contrario, se limita a enviar el paquete
(aquí llamado datagrama), sin preocuparse si llega a su destino (se trata
de un protocolo no orientado a conexión). Aunque parezca ilógico, UDP es
necesario para cierto tipo de tareas, sobre todo aquellas que requieren
mucho ancho de banda (videos...), ya que al no comprobar si ha llegado el
paquete transmite mucha menos información y la comunicación es mas
agil.

- ICMP: Son mensajes de control de la red. Este protocolo se utiliza para


mandar mensajes especiales, tales como para ver si una máquina se
encuentra conectada, si su reloj está sincronizado, y para mandar algunos
mensajes de error.

Dirección IP, mascara de subred y puerta de enlace

Una dirección IP (en la versión actual ipv4 (aunque ipv6 ya se encuentra bastante
avanzado)) está formada por cuatro números enteros, cada uno de ellos de un
byte y separados por un punto.

Dirección IP decimal (Cuatro números enteros):

195.76.40.2

La misma Dirección IP pero expresada en binario (Cuatro Bytes):

11000011. 01001100. 00101000.00000010


Los usuarios utilizamos el formato decimal que lo manejamos mejor mientras que
los ordenadores trabajan en formato binario.

Cada equipo podrá comunicarse directamente con otro (sin intermediarios como
routers) siempre que estén en la misma red. Para determinar si dos equipos se
encuentran en la misma red esta el concepto de mascara de subred:

La máscara de subred es una secuencia de 32 bits, dentro de los cuales aquellos


que tengan el valor 1 identifican la red, y los que tengan valor 0 identifican los
hosts.

Por ejemplo:
La mascara 255.255.255. aplicada a la dirección IP 195.76.40.2, nos dicen que el
numero de red de ese equipo es 195.76.40 mientras que el numoero de hosts es
el 2.

195.76.40.2: -> 11000011. 01001100. 00101000. 00000010


255.255.255.0 -> 11111111.11111111. 11111111.. 00000000
------------------------------------------- -------------
-
Red Host

Es decir, el equipo con dirección IP podrá comunicarse directamente con todos los
equipos cuya dirección IP empiece por 195.76.40 y tengan mascara de red
255.255.255.0.
Para comunicarse con equipos que no están dentro de nuestra red, lo hará a
través de un dispositivo enrutador (router). La puerta de enlace predeterminada
de un dispositivo es la dirección IP del router por defecto, a través del cual nos
vamos a comunicar con otras subredes.

1.2.- CONFIGURACIÓN DE LA RED

Cuando nos conectamos a una red de cualquier tipo, lo hacemos mediante un


hardware especial. Así, podemos utilizar módems, tarjetas Ethernet, cables de
puerto paralelo, dispositivos inalámbricos, etc.

Cada uno de estos elementos que utilizamos se llama 'interfaz de red', y puede
haber varios en una misma máquina.

Linux, para tratar con cada dispositivo, asigna un nombre a cada interfaz de red.
Este nombre dependerá del tipo de hardware con el que tratemos. Básicamente
cada interfaz tiene un nombre y un número, que diferenciará a dos o más
dispositivos del mismo tipo. Imaginemos, por ejemplo, un equipo que dispusiese
de un módem, dos tarjetas ethernet y una tarjeta inalámbrica de red. Los
identificativos de estos dispositivos serían ser los siguientes:
- ppp0: módem
- eth0: primer dispositivo ethernet
- eth1: segundo dispositivo ethernet
- ath0: dispositivo inalámbrico

Por norma general, los nombres de los dispositivos suelen respetarse,


identificándose de una forma homogénea (eth, por ejemplo, para tarjetas
ethernet, o ppp para conexiones punto a punto). En otros casos, estos nombres
no son estándar, como sería el caso de las tarjetas de red inalámbricas. En
nuestro caso, nuestro dispositivo ha quedado identificado como ath0, pero de
haber existido otro dispositivo de otro fabricante podría haber adoptado otro
nombre, como wlan0, por ejemplo. Adicionalmente, hay una interfaz adicional
llamada 'loopback', que se usa para referirse a la misma máquina en la que nos
encontramos. Suele reconocerse por el identificativo 'lo'.

Configuración de la tarjeta de red

Partimos de la base que nuestro Sistema Operativo Linux Ubuntu ha reconocido


he instalado nuestro dispositivo de red en el proceso de instalación, cosa que
sucederá si nuestra tarjeta no es muy extravagante

Principalmente hay dos formas de asignar una dirección IP a una tarjeta: en


modo grafico o añadiéndola manualmente a un archivo de texto. Vamos a
configurarla en modo grafico y luego veremos como queda el archivo de
configuración de red, que en Ubuntu es /etc/network/interfaces

Veamos primero el aspecto que presenta este archivo antes de configurar una
dirección IP:
Ahora vamos a configurar la red desde X-window (Gnome):

Figura: Herramienta configuracion de red

Lo normal es que hayamos iniciado la sesión con un usuario no root, para


configurar la red tenemos que desbloquear la herramienta introduciendo nuestra
contraseña de red:
Editamos las propiedades de la conexión cableada:

E introducimos la dirección IP, mascara de subred y puerta de enlace


predeterminado:
Le damos a Aceptar y vemos en el archivo de texto cómo ha quedado la
configuración del interfaz eth0.

La línea “auto eth0” indica que la tarjeta de red se activará automáticamente al


iniciarse el sistema.

Si la configuración de red la hubiéramos hecho modificando directamente el


fichero de texto, para activar los cambios tenemos que reiniciar el servicio de red:

También podríamos haber asignado la dirección IP y máscara de red escribiendo


el siguiente comando:

# ifconfig eth0 192.168.10.241 netmask 255.255.255.0

La pega de este comando es que los cambios se pierden en el siguiente reinicio.


Con el comando ifconfig también se puede ver la configuración de red actual, si
no le pasamos ningún parámetro:
La puerta de enlace predeterminada no se puede asignar con el comando ifconfig,
para eso tenemos el comando route:

Al contrario que con el comando ifconfig, el resultado de este comando se guarda


permanentemente. Si escribimos el comando route sin pasarle parámetros nos
muestra información de rutas existentes en el sistema:

Otros archivos de configuracion de red:

1. Nombre de host

Gran parte de las aplicaciones de red que tengamos instaladas asumirán que
nuestra máquina tiene asignado un nombre. Por tanto, lo siguiente que
realizaremos será establecer el nombre de nuestra máquina. Generalmente, este
paso se realiza durante la instalación de nuestra distribución, aunque aquí
comentaremos cómo hacerlo de forma manual.

El comando utilizado para dicha tarea es 'hostname'. Si lo ejecutamos sin pasarle


ningún parámetro nos devolverá el nombre actual de la máquina (como podemos
ver en la captura). Para cambiar el nombre bastará con invocar a 'hostname'
seguido del nuevo nombre de nuestra máquina.

El nombre de la máquina se almacena de forma permanente en el archivo


/etc/hostname
2. Resolución de nombres

Aunque las máquinas trabajan con números, para nosotros es mucho más
amigable trabajar con nombres.

Por ejemplo, cuando nosotros accedemos a la pagina web de google, escribimos


en nuestro navegador:

http://www.google.es

El ordenador internamente está traduciendo ese nombre por su dirección ip en


números (209.85.229.99 en formato decimal). A este proceso de traducción se le
llama resolución de nombres.

La configuración de la resolución de nombres en Linux es gestionada por los


ficheros /etc/host.conf, /etc/hosts y /etc/resolv.conf.

a. /etc/host.conf
Este fichero dice a su sistema cómo resolver los nombres de las máquinas

Éste indicaría la forma en que se realizarán las consultas (primero al fichero


hosts, antes de realizar peticiones a los servidores DNS), y que se permiten
direcciones con múltiples IPs.

b. /etc/hosts
El fichero hosts es una tabla estática de nombres con su correspondiente
dirección IP. Su sintaxis es muy simple:

nombre_de_máquina dirección_IP

Aunque a gran escala no sean una buena opción, por lo complicado de mantener
y distribuir los datos actualizados, pueden resultarnos de utilidad debido a su
comodidad y sencillez, en una red pequeña o un pequeño grupo de equipos.
c. /etc/resolv.conf
En este fichero definiremos los servidores de nombres externos DNS. La sintaxis
del fichero es la siguiente:
nameserver IP_SERVIDOR
nameserver IP_SERVIDOR

En este fichero ubicaremos las direcciones de los servidores de nombres que


existan en nuestra empresa, o bien, los que nos proporcione nuestro proveedor
de servicios de internet (ISP), en el caso de que no dispongamos de ellos.

Herramientas de Red

1.- Ping

Podemos verificar el correcto funcionamiento de nuestra interfaz de red con la


utilidad 'ping'. Primero intentaremos alcanzar una dirección local, luego una
externa, y finalmente un nombre, comprobando de esta forma que también la
resolución funciona correctamente.

En la captura podemos ver como todas las pruebas han sido satisfactorias, ya que
todos los paquetes han llegado a su destino. De no suceder así, deberíamos
comprobar paso a paso nuestra configuración, ya que es posible que hayamos
cometido algún error.
2.- netstat

La utilidad netstat nos proporciona información en tiempo real de las conexiones


que están siendo gestionadas por el sistema. También nos proporciona
estadísticas de tráfico, tablas de enrutamiento, etc.

Es una herramienta muy útil que merece la pena conocer a fondo.

3.- IP

La herramienta ip es una utilidad capaz de realizar múltiples tareas. Nos permite


configurar nuestra interfaz de red (todo lo visto anteriormente puede realizarse
con ip), manipular el enrutamiento, identificar dispositivos, etc. Se recomienda
una lectura detallada de sus páginas man
MÓDULO 4.- ADMINISTRACIÓN DE REDES
Unidad 2.- Servidor SSH

1.1.- INTRODUCCIÓN

Para poder administrar un servidor Linux lo primero que tenemos que hacer es
poder conectarnos a él. Bien directamente desde la propia terminal de acceso o,
en la mayoría de los casos, de forma remota.

Inicialmente la conexión remota se hacia a través de un servidor Telnet, el


problema es que el trafico de red en este tipo de conexiones no viaja cifrado con
lo que cualquiera que estuviera “escuchando” en la red podría obtener los datos
de usuario y contraseña y, por tanto, el posterior acceso al sistema.

Para evitar esto se desarrollo el SSH (Secure Shell) es un programa de login


remoto que permite una transmisión segura de cualquier tipo de datos:
passwords, inicios de sesión, ficheros, sesiones gráficas remotas, comandos de
administración, etc. Su seguridad se debe al uso de criptografía fuerte de manera
que toda la comunicación es encriptada y autentificada de forma transparente
para el usuario. Para el usuario la forma de utilizar este servicio de red es similar
que con el Telnet solo que la comunicación es mucho mas segura.

1.2.- INSTALACIÓN DE SSH (SERVIDOR Y CLIENTE)

Para instalar ssh vamos a utilizar la aplicación apt-get, instalando el paquete ssh:

ssh - Secure shell client and server (transitional package)

Que contiene todo lo necesario: parte cliente y servidor:

Tenemos instaladas tanto la parte cliente como la parte servidor. Primero vamos
a ver cómo conectarnos a otro servidor Ssh y luego cómo configurar la parte
servidor.
CLIENTE SSH

Nos conectamos a un servidor con el comando ssh a través de una terminal.

Existen gran cantidad de parámetros y opciones para conectarnos a un servidor


ssh.

La primera vez que nos conectamos a un servidor, nos muestra el fingerprint del
mismo y pide confirmación para conectarnos. El fingerprint es una huella
identificativa de cada servidor que sirve para comprobar si el servidor al que nos
conectamos es quien “dice ser”. Las siguientes veces que nos conectemos no nos
volverá a preguntar a no ser que el fingerprint del servidor haya cambiado. Esta
información la guarda en el archivo oculto .ssh/know_hosts ubicado en el home
de cada usuario:

Una vez establecida la conexión, dispondremos de una shell remota en la que


podremos realizar nuestras tareas de administración habituales, con la
tranquilidad que nos proporcionan las comunicaciones encriptadas.
Existen también clientes ssh para conectarse desde equipos windows, el más
famosos es putty. Se puede descargar desde su página oficial y es gratis:

SERVIDOR SSH

Como la mayoría de los programas, se puede hacer cambios en la configuración


del servicio editando un fichero y reiniciando el servicio asociado.

Los ficheros de configuración de ssh se encuentran en /etc/ssh, de los cuales,


sshd_config será el encargado de la configuración del servidor. En este fichero
podremos configurar diversos parámetros del servidor, como el puerto en el que
escuchará el demonio, el tipo de autenticación que usaremos, si permitiremos o
no que el usuario root se conecte al servicio, etc. Podemos obtener una
información mucho más detallada en la página del manual (man sshd_config).

Existen dos versiones del protocolo SSH: 1 y 2, siendo altamente recomendable


utilizar sólo la versión 2, mucho más segura. En la imagen se ve que este
servidor sólo permite la version 2 del protocolo:
Protocol 2

Si hacemos cualquier cambio en este archivo, tenemos que reiniciar el servicio


para que se apliquen los cambios:

1.3.- TRANSFERENCIA DE FICHEROS CON SSH

Otra utilidad de SSH es la transferencia de ficheros segura. En muchas ocasiones


deseamos transferir una información sensible, que no debería ser leída por
terceras personas o caer en manos ajenas. SSH nos puede ayudar en esto, ya
que mediante el comando scp, nos permite copiar un fichero a un destino remoto
a través de un canal seguro, sometido a fuerte encriptación.

La sintaxis del comando scp es:


$ scp fichero usuario@maquina:/ruta/de/destino

En la siguiente imagen vemos un ejemplo:

Además de estas utilidades, SSH también nos ofrece la posibilidad de crear


túneles seguros cifrados, muy útiles para asegurar otros protocolos,
redireccionamiento de puertos, etc.
MÓDULO 4.- ADMINISTRACIÓN DE REDES
Unidad 3.- Servidor de Archivos NFS

1.1.- INTRODUCCIÓN

En entornos corporativos basados en Sistemas Operativos Microsoft tenemos,


entro otros, el rol del servidor de archivos: Un servidor guarda la informacion en
sus unidades logicas y las comparte para que esten accesibles al resto de usuario
de la red.

En linux tenemos algo similar con el sistema de ficheros de red (NFS - Network
File System) que nos permite hacer uso de unidadescompartidas por sistemas
remotos.

1.2.- INSTALACIÓN

Una vez, para instalar recurrimos a la herramienta apt-get. Tenemos que instalar
dos paquetes:

o nfs-common: Soporte necesario tanto para el cliente como para el


servidor
o nfs-user-server: Nos aporta lo necesario para montar un servidor
NFS sin necesidad de soporte en el núcleo.

Como podemos observar en la figura, el paquete portmap se encuentra entre las


dependencias de nfsuser-server. Portmap es necesario para realizar RPCs
(Remote Procedure Calls) al sistema, por lo que será necesario que esté instalado
y ejecutándose antes de lanzar el servidor NFS.

Ahora que tenemos todo lo necesario, veamos las configuraciones del cliente y el
servidor.

1.3.- PARTE SERVIDOR

La configuración de nuestro servidor se realiza en el fichero /etc/exports. En él


decidiremos qué deseamos compartir y a quien. Vamos a compartir el archivo
/home/usuario:
Compartimos el directorio /home/usuario para todos los equipos dentro de la red
192.168.10.0 con permisos de lectura escritura.

Una vez modificado el archivo de configuración, reiniciamos el servicio:

Nuestros clientes ya pueden hacer uso de nuestro recurso compartido. Esta


configuración que hemos empleado es un caso extremadamente sencillo. Puede
encontrar mucha más información sobre el archivo /etc/exports en la página del
manual 'man exports'.

1.4.- PARTE CLIENTE

Hacer uso de un recurso compartido mediante NFS es sencillo. Lo haremos con


comando mount, comando que se utiliza para montar cualquier dispositivo:
cdrom, disquete ó carpeta nfs. Hay que tener en cuenta que solo el usuario root
puede montar volumenes nfs.

Una vez montado, trabajaremos con esa ruta como si se tratase de una ruta
local, y NFS se encargará de trabajar bajo los telones, resultando un proceso
transparente para al usuario.

En la figura hemos hecho lo siguiente:


1. Comprobar las unidades montadas en nuestro sistema con el
comando ‘df –k’
2. Crear el directorio fisico /mnt/NFS_HomeUsuario, sobre el que
montaremos la unidad NFS. Se podria montar sobre cualquier
directorio pero es costumbre hacerlo sobre subdirectorios creados
bajo /mnt
3. Montar la unidad NFS sobre /mnt/NFS_HomeUsuario
4. Comprobar con el comando ‘df –k’ que aparece una nueva unidad
montada
5. Ver el contenido de esa nueva unidad montada.
MÓDULO 4.- ADMINISTRACIÓN DE REDES
Unidad 4.- Samba

1.1.- INTEGRACIÓN DE REDES EN WINDOWS (SMB)

Hemos visto en el anterior anterior (Servidor NFS) como compartir archivos entre
servidores linux. Tambien es posible intercambiar archivos con Sistemas
Operativos Microsoft a traves del Servicio Samba.

Samba otorga a Linux el soporte para el protocolo Session Message Block (SMB),
también llamado NetBIOS o LanManager. El protocolo SMB es usado por los
sistemas operativos de Microsoft para compartir discos e impresoras. Usando el
paquete de herramientas Samba, creado por Andrew Tridgell, las máquinas UNIX
(incluyendo Linux) pueden compartir discos e impresoras con servidores
Windows. Entre las cosas que podemos realizar con samba, destacaremos las
siguientes:

o Compartir una unidad de Linux con máquinas Windows.


o Compartir una unidad de Windows con máquinas Linux.
o Compartir una impresora de Linux con máquinas Windows.
o Compartir una impresora de Windows con máquinas Linux.

1.2.- INSTALACIÓN

Como siempre, la haremos utilizando el comando apt-get. Tenemos que instalar


los siguiente paquetes:

o samba: Parte servidor, para compartir recursos


o smbclient: Parte cliente, para acceder a
o smbfs: Comandos samba para montar y desmontar recursos.
1.3.- PARTE SERVIDOR: COMPARTIENDO UN DIRECTORIO EN
UNA RED WINDOWS

Para configurar samba tenemos que hacer modificaciones sobre un fichero,


/etc/samba/smb.conf.
De entre todas las opciones, algunos interesantes son:
o Netbios name. Nombre netbios que le asignaremos a nuestra máquina.
(SambaServer)
o workgroup Grupo de trabajo al que perteneceremos dentro de entorno
de red. (CursoLinux)
o Server string. Similar al al campo descripción del entorno de red de
Microsoft (Servidor Samba para curso de linux).
o encrypt passwords. Para utilizar contraseñas cifradas.

Vamos a compartir el directorio /home/usuario con el nombre ‘trastero’,


añadiendo las siguientes líneas al archivo de configuración:

[trastero]
comment = Directorio home usuario
path = /home/usuario
read only = no
writable = yes
public = yes

Y reiniciando después el servicio asociado:

Ahora vamos a acceder desde un equipo Windows a esa carpeta a través del
entorno de red:
1.4.- PARTE CLIENTE: ACCEDER A UN DIRECTORIO DE UNA
RED WINDOWS

Tenemos tres formas de acceder a un recurso disponible en un servidor windows:


o montando el recurso compartido con el comando ‘mount’,
o accediendo directamente al recurso compartido con el comando smbclient
o De forma similar a como lo haríamos en Windows a través del entorno de
red

MONTANDO EL RECURSO COMPARTIDO

Ejecutando el siguiente comando:


# mount //SambaServer/trastero /mnt/SMB_HomeUsuario/ -t smbfs -o
username=usuario,password=clave

De esta forma trabajaríamos sobre el recurso compartido como si se tratase de una


ruta local.

SMBCLIENT

Además de esta cómoda interfaz, siempre podemos hacer uso del potente
comando smbclient para acceder a los recursos. La siguiente captura muestra un
ejemplo de ello:
XSMBROWSER

Instalamos el paquete con la utilidad apt-get


Ejecutamos la aplicación para ver su funcionamiento:
MÓDULO 4.- ADMINISTRACIÓN DE REDES
Unidad 5.- Servidor Web Apache

1.1.- SERVICIO DE PUBLICACIÓN WEB (HTTP)

Montar un servidor web en Linux es una tarea extremadamente sencilla. En este


punto veremos cómo instalar nuestro servidor web, aprenderemos a iniciarlo y
detenerlo, así como algunos aspectos básicos de su configuración.

El servidor web que hemos elegido es apache. Apache es un servidor HTTP de


código abierto que implementa el protocolo HTTP/1.1. Es el servidor web más
utilizado en Internet (se estima que el 70% de los sitios existentes son servidos
por él).

La instalación del servidor web apache en Debian es muy sencilla. Lo primero que
debemos decidir serála versión que deseamos utilizar: 1.3, 2.0 ó 2.2. En nuestro
caso, nos hemos decantado por la versión 2.0 que es la que tenemos disponible a
traves del repositorio apt-get:

La instalación en ambos casos sería descargando el código fuente y compilando


tal y como vimos en un tema anterior del curso.

Instalamos apache2 con el comando apt-get:


apache2 - Next generation, scalable, extendable web server

Una vez terminada la instalación, se inicia automáticamente y ya podemos


acceder a la pagina web que nos deja la instalación para comprobar que funciona:
También podríamos haber comprobado que el equipo está escuchando el puerto
80 con el comando netstat, visto en otros temas:

1.2.- ARCHIVOS DE CONFIGURACIÓN DE APACHE2

Como no podía ser de otra manera, configurar el apache no es más que modificar
ficheros y reiniciar servicios.

El apache2 queda instalado por defecto en el directorio /etc/apache2. Si


quisiéramos instalarlo en otro directorio tendríamos que compilarlo desde el
código fuente. Dentro de este directorio tenemos lo siguiente:

o Apache2.conf: Es el archivo principal de configuración de apache. Cada


vez que iniciamos el apache, lee este archivo para cargar su configuracion.
o httpd.conf. Archivo pensado para añadir nuevas configuraciones como
virtual hosts, directorios virtuales..etc. Inicialmente se encuentra vacio y
es llamado desde el archivo apache2.conf (Include
/etc/apache2/httpd.conf) con lo que tambien se carga su contenido al
iniciar el apache.
o envvars. Archivo que recoge las variables de entorno por defecto que
carga el apache.
o mods-available: Las funcionalidades de apache vienen recogidas en
modulos que hay que habilitar. En este directorio se encuentran las
disponiles:
o mods-enabled: Los módulos que están habilitados. En realidad se trata
de enlaces simbólicos a los archivos del directorio mods-available. Si
queremos habilitar un módulo, bastaría con crear aquí los vínculos
correspondientes.

o sites-available. Podemos tener varios sitios web en un unico servidor


web apache. En este directorio se encuentran los sitios webs disponibles.

o sites-enabled. De todos los sitios disponibles, aquellos que están activados. Al


igual que con los módulos, se trata de enlaces simbólicos.

1.3. PEQUEÑAS CONFIGURACIONES APACHE

Vamos a ver un poco por encima algunas tareas básicas de configuración. Para
ampliar información disponemos de una amplia documentación en la url:
http://httpd.apache.org/docs/2.0/
Cada vez que hagamos un cambio tendremos que reiniciar el apache para que se
apliquen los cambios. El script de arranque de apache se encuentra, al igual que
el de otros muchos servicios, en el directorio init.d. Aparte de reiniciar el apache
se pueden hacer mas cosas.

Cambiar puerto en el que está escuchando


Por defecto el apache escucha en el puerto 80. Esto lo podemos cambiar en el
archivo /etc/apache2/ports.conf:

Modificamos para que escuche en el puerto 8080:

Reiniciamos el apache ( # /etc/init.d/apache2 restart) y comprobamos que está


escuchando en el puerto 8080:
Cambiar DocumentRoot por defecto
El DocumentRoot es el directorio donde el servidor web apache buscara las
paginas html que debera mostrar cuando reciba peticiones. Cada sitio web tiene
su DocumentRoot y por defecto, tras la instalación, solo hay un sitio habilitado:

Y dentro de este archivo viene definido el DocumentRoot del sitio en la línea:


DocumentRoot /var/www/

Vamos a modificarlo por el directorio raiz del usuario:


Reiniciamos de nuevo el servicio y vemos que el navegador muestra el contenido
del directorio /home/usuario:

Cambiar archivo de inicio


La página “It works!” que muestra por defecto tras la instalación, corresponde al
archivo /var/www/index.html.

La página por defecto viene definida por el valor de la variable DirectoryIndex que
se definiría para cada sitio y dentro de este, en cada directorio si fuera preciso. Si
definimos la página de inicio en el DocumentRoot, quedará definida la misma
página para todos los directorios del sitio, a no ser que especifiquemos una
diferente.

Vamos a configurar la página diario.txt dentro del directorio /home/usuario como


página de inicio por defecto del sitio:

Después de reiniciar el apache, si accedemos al servidor web la página por


defecto que muestra es diario.txt:
Añadir Alias
Vamos a dejar la configuracion tal y como viene de origen: El DocumentRoot
volverá a ser /var/www y el DirectoryIndex index.html:

Comprobamos que la página de inicio vuelve a ser ‘It Works!’:

Vamos a configurar un alias de tal manera que, cuando alguien ponga en el


navegador la dirección http://192.168.10.241:8080/usuario/, nos carge la página
diario.txt ubicada en el directorio /home/usuario.

Se trata de añadir al archivo del sitio, después de la definición del DocumentRoot,


las siguientes líneas:

Alias /usuario/ /home/usuario/


<Directory /home/usuario/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
DirectoryIndex diario.txt
Order allow,deny
allow from all
</Directory>

El archivo de configuración quedaría como sigue:

Reiniciando el apache obtendríamos los resultados deseados. Nos fijamos en las


url de las dos siguientes imágenes y el contenido de los navegadores:
Como hemos podido observar, montar un servidor web es una tarea sencilla en
nuestro sistema Linux. Por ello, no debemos pensar que apache es un producto
simple. Se trata de un servidor web cuya configuración es controlada por cientos
de directivas, que admite módulos dinámicos para ampliar sus funcionalidades
(php, perl, ssl, etc), y cuyo estudio podría abarcar más de un libro.

Para conocer el software en profundidad se recomienda consultar la


documentación oficial de apache.
MÓDULO 4.- ADMINISTRACIÓN DE REDES
Unidad 6.- Servidor FTP (Servicio de Transferencia de
Ficheros)
El servicio de transferencia de ficheros (FTP) es una herramienta sencilla pero
potente, que nos permite enviar ficheros de una máquina a otra a través de una red.
Se trata de un protocolo inseguro (que en muchos casos está siendo reemplazado
por ssh), pero de gran popularidad y eficacia.

Existen numerosas implementaciones en Linux de servidores ftp, entre los que


podemos destacar proftpd, vsftpd, pureftp, etc. En nuestro ejemplo vamos a instalar
uno de ellos, proftpd. Para ello procederemos como en los casos anteriores, haciendo
uso de la herramienta apt-get.

proftpd - versatile, virtual-hosting FTP daemon – binaries

Durante la instalación nos da la opción de instalar el programa como inetd o como


servidor independiente, esto simplemente afecta a la hora de hacer modificaciones
cuando hay que reiniciar el servicio. Como inetd habría que reiniciar el daemon inetd
y como servidor independiente, crearía un daemon para proftpd que es el que habría
que reiniciar. Dejamos la opción de servidor independiente:
Una vez hecho esto, tendremos nuestro servidor ftp instalado e iniciado.

Ahora vamos a comprobar que todo el proceso se ha realizado correctamente:

o Primero comprobamos que el servidor esta escuchando en el puerto 21


(puerto tcp asociado por defecto al ftp)

o Conectandonos al servidor con el cliente ftp que viene por defecto en el


sistema La siguiente imagen muestra el proceso de conexión.

Nota: Localhost hace referencia al interface loopbak Io (127.0.0.1) y se suele utilizar


para probar servicios. Si ejecutamos el comando ‘ifconfig’ observamos el interfaz:
Por defecto, proftpd permite conectarse a todos los usuarios del sistema, aunque no
aceptará conexiones anónimas. Si deseamos hacer uso de ellas, por ejemplo, para
poner a disposición de los usuarios de nuestra red una serie de ficheros,
necesitaremos activarlas en el fichero de configuración de proftpd
(/etc/proftpd/proftpd.conf).

En él encontraremos una configuración que nos permitirá aceptar este tipo de


conexiones, y que sólo tendremos que descomentar para poner en funcionamiento.
Una vez guardado el fichero de configuración, ejecutaremos

# /etc/init.d/proftpd reload

para que proftpd lea su fichero de configuración de nuevo. Además de activar el


acceso anónimo al servidor, podemos restringir operaciones sobre determinados
recursos o usuarios del mismo, configurar puerto y dirección de escucha, etc.
MÓDULO 4.- ADMINISTRACIÓN DE REDES
Unidad 7.- Servidor de Correo Electrónico

7.1.- INTRODUCCIÓN

En este apartado veremos cómo ofrecer servicios de correo electrónico desde


nuestra máquina Linux. Estudiaremos cómo poner en marcha un servidor SMTP, así
como establecer mecanismos para que nuestro correo sea accesible por nuestros
usuarios, como POP e IMAP.

7.2.- SMTP

El protocolo simple de transferencia de correo (SMTP) es un protocolo utilizado para


el intercambio de mensajes de correo electrónico entre computadoras (también entre
otros dispositivos, como teléfonos móviles o PDAs).

En este punto analizaremos cómo poner en marcha en nuestra máquina este


servicio. Para ello, haremos uso de alguna de las multiples implementaciones
existentes, entre las que podemos destacar sendmail, qmail, postfix, exim, etc.

Nosotros haremos uso de qmail, ya que combina excelentes cualidades, como


sencillez, potencia y una gran seguridad. Antes de proceder a su instalación,
necesitaremos los paquetes ucspi-tcp y daemontools instalados. Adicionalmente,
necesitaremos instalar el paquete procmail, un potente procesador de correo que es
una dependencia de nuestro agente smtp, qmail. Una vez estén todos en
funcionamiento, procederemos con la instalación de qmail.

Tendremos que de compilar el paquete qmail nosotros mismos. Esto no debe


suponer preocupación alguna, ya que los desarrolladores de Debian hacen lo posible
para facilitarnos al máximo la tarea.

Por desgracia no tenemos el paquete de qmail para descargar desde los repositorios
de ubuntu (archivo /etc/apt/sources.list). Esta es una buena ocasión para estudiar
otras alternativas de instalación a los repositorios de apt-get. Veremos que la
instalacion resulta mucho mas complicada pero que con tesón todo se consigue.

Como Ubuntu es en realidad na versión debian, nos descargaremos el paquete


directamente de la web de debian, http://packages.debian.org/sid/all/qmail-
src/download/, para instalarlo posteriormente con el comando dpkg:
Esto instalará las fuentes de qmail en nuestro sistema. Para compilarlas e instalar los
binarios en nuestro sistema, bastará con ejecutar posteriormente el comando 'build-
qmail', como nos indica la figura siguiente. Con esto empezará el proceso de
compilación y construcción del paquete.

Pero el proceso de compilación nos devuelve un error:

Porque nos falta el comando po2debconf. Nos lo descargamos desde


http://launchpadlibrarian.net/8106609/po-debconf_1.0.9_all.deb y lo intentamos
instalar, pero este a su vez nos exige el paquete po-debconf que, por suerte, si está
disponible en el repositorio apt-get.

Una vez instalado el paquete po-debconf, volvemos a intentar compilar el paquete


con el comando build-qmail, esta vez con mejores resultados:
Una vez haya finalizado el proceso lanzado con build-qmail, el paquete estará
instalado. Con esto habrá concluido la instalación.

El siguiente paso será proceder con la configuración. Los ficheros de configuración de


qmail se encuentran en /var/qmail/control. La tabla siguiente muestra todos los que
pueden existir así como su uso.
Nombre de fichero Por defecto Usado por Finalidad
badmailfrom ninguno qmail-smtpd From: en lista negra
bouncefrom MAILER-DAEMON qmail-send nombre de usuario del remitente de la
devolución
bouncehost me qmail-send nombre de máquina del remitente de la
devolución
concurrencylocal 10 qmail-send máximo simultáneo de entregas locales
concurrencyremote 20 qmail-send máximo simultáneo de entregas
remotas
defaultdomain me qmail-inject nombre dominio predeterminado
defaulthost me qmail-inject nombre máquina predeterminado
databytes 0 qmail-smtpd máximo número de bytes en el
mensaje (0=sin límite)
doublebouncehost me qmail-send nombre de máquina del remitente de
devolución doble
doublebounceto postmaster qmail-send usuario que recibirá las dobles
devoluciones
envnoathost me qmail-send dominio predeterminado para
direcciones sin arroba
helohost me qmail-remote nombre de máquina usado en la orden
SMTP HELO
idhost me qmail-inject nombre de máquina para Message-ID's
localiphost me qmail-smtpd nombre que sustituye a la dirección IP
local
locals me qmail-send dominios que entregamos localmente
me FQDN del sistema varios predeterminado para varios ficheros de
control
morercpthosts ninguno qmail-smtpd base de datos secundaria para
rcpthosts
percenthack ninguno qmail-send dominios que pueden usar % en el
relay (retransmisión)
plusdomain me qmail-inject dominio por el que se sustituye el +
anexado
qmqpservers ninguno qmail-qmqpc direcciones IP de los servidores QMQP
queuelifetime 604800 qmail-send segundos que un mensaje puede
permanecer en la cola
rcpthosts ninguno qmail-smtpd dominios para los que aceptamos
correo
smtpgreeting me qmail-smtpd mensaje de saludo SMTP
smtproutes ninguno qmail-remote rutas SMTP artificiales
timeoutconnect 60 qmail-remote segundos que se esperará una conexión
SMTP
timeoutremote 1200 qmail-remote segundos que se esperará a un servidor
remoto
timeoutsmtpd 1200 qmail-smtpd segundos que se esperará a un cliente
SMTP
virtualdomains ninguno qmail-send usuarios y dominios virtuales
Como podemos observar, el fichero más importante es 'me', ya que gran parte del
resto toman su valor de él. El fichero me, como nos muestra la tabla, contiene el
nombre de dominio que gestionará nuestro servidor. Es importante señalar que
qmail no hace uso del fichero /etc/hosts, por lo que el nombre de dominio que
utilicemos tendrá que poder ser resuelto a través de los servidores DNS que
hayamos configurado en el fichero /etc/resolv.conf.

Podemos añadir nuestro nombre de dominio cualificado con el siguiente comando:

# cat manualderedes.com > /var/qmail/control/me

Lo siguiente que haremos será seleccionar el tipo de buzón que queremos que utilice
qmail. Principalmente disponemos de dos tipos de formato:

1. mbox: El mas utilizado porque lo soportan mas clientes.


2. maildir. El mas fiable aunque lo soportan menos clientes.

La configuración del formato de buzón que deseamos utilizar se encuentra en el


script de inicio del servicio, localizado en /etc/init.d/qmail. En nuestro caso haremos
uso de buzones de tipo Maildir. Para ello descomentaremos la línea

alias_empty="./Maildir"

en el fichero que acabamos de mencionar, y dejamos el resto de formatos de buzón


comentados. Una vez hecho esto, la configuración queda concluida y nuestro
demonio está listo para ser lanzado. Podemos iniciar el servicio a través del script
que acabamos de mencionar, de la siguiente forma:

# /etc/init.d/qmail start

Para detenerlo, haremos uso del parámetro stop. Si deseamos que se inicie junto con
el sistema de forma automática, deberemos crear un enlace simbólico en el
directorio de nuestro nivel de arranque por defecto (el 2, en Debian).

A partir de este momento, podremos enviar correos al mundo exterior haciendo uso
de nuestro propio MTA (Mail Transport Agent), sin necesidad de utilizar el que nos
suele facilitar nuestro proveedor de servicios de Internet. Además, podemos enviar
correo a los usuarios de la máquina que deseemos, o recibir correos desde el exterior
y entregarlos en su buzón correspondiente (para esto último será necesario que el
registro mx de nuestro dominio apuntase a nuestro servidor). Para hacer estas
entregas, lo único que necesitamos es crear previamente el buzón del usuario,
mediante el comando maildirmake, que incorpora qmail.

# maildirmake /home/prueba/Maildir
# chown prueba.prueba /home/prueba/Maildir –R

A partir de este momento, qmail entregará cualquier correo destinado a


prueba@manualderedes.com al buzón que acabamos de crear. El cambio de
propietario que hemos realizado es imprescindible, ya que qmail nunca entregará un
correo a buzón cuyo dueño sea el usuario root.
7.3.- POP

En el punto anterior hemos visto el protocolo que se encarga de intercambiar los


mensajes de correo electrónico. Ahora veremos otro mecanismo por el cual nuestros
usuarios podrán acceder a sus buzones, de una forma remota y sencilla.

El primer protocolo que veremos será POP (Post Office Protocol). Este protocolo se
encarga de gestionar el acceso de los usuarios a su buzón y la recogida de sus
mensajes. Es un método simple, pero eficaz, y con diferencia el más extendido a
través de Internet. Su principal ventaja es que haciendo uso de POP, todos nuestros
mensajes quedarán almacenados localmente y podremos leerlos sin necesidad de
conexión.

Qmail trae incorporado un servidor POP, aunque por defecto no se lanza junto con el
servicio SMTP. Para activarlo, editaremos el fichero de inicio /etc/init.d/qmail, y
descomentaremos las líneas que aparecen comentadas en las secciones start y stop
del script, tras el comentario "# Uncomment the following lines to automatically start
the pop3 server". La siguiente imagen nos muestra dichas líneas.

Una vez hayan sido descomentadas, bastará con reiniciar el servicio smtp, y el
servidor POP se situará a la escucha en el puerto 110, a la espera de posibles
clientes.
7.4.- IMAP

El protocolo IMAP es otro mecanismo por el cual los usuarios pueden acceder a sus
respectivos buzones. Entre las principales diferencias existentes entre POP e IMAP,
podemos destacar que este último almacena los mensajes en el servidor, lo que lo
convierte en un protocolo muy interesante si accedemos a nuestro correo desde
diferentes puntos. Además, nos permite disponer de diferentes carpetas en el
servidor, para organizar nuestros mensajes de forma permanente, lo cual facilita su
acceso y lectura..

Existen numerosas implementaciones de servidores IMAP para Linux, entre las que
podemos destacar Cyrus y Courier. A continuación vamos a proceder a la instalación
del paquete courier-imap.

La instalación es sumamente sencilla. Tan sólo tendremos que ejecutar como


superusuario el siguiente comando:

# apt-get install courier-imap

Ya tenemos nuestro servicio IMAP instalado. Para iniciarlo teclearemos:

# /etc/init.d/courier-imap start

De esta forma nuestro demonio IMAP se situará a la escucha en el puerto 143 (por
defecto), esperando las conexiones de posibles clientes.
MÓDULO 4.- ADMINISTRACIÓN DE REDES
Unidad 8.- WEBMIN

Webmin es una de las mejores herramientas de administración remota para Linux,


escrita primariamente en Perl, fácil de usar y de instalar. Se pueden asignar
diferentes "usuarios" (webmin guarda internamente nombres de usuarios y
contraseñas) variando los niveles de acceso.

Funciona en la mayoría de plataformas de Linux y en una variedad de otras


plataformas UNIX. Lo más importante es que hace el sistema accesible a personas
no técnicas, que tienen que administrar sistemas de tal forma que no tengas que
proporcionarles cuentas reales en el servidor. Por defecto, Webmin corre en el puerto
10000 y se debería filtrar con el cortafuegos.

En lo referente al tema que estamos tratando, Webmin dispone de módulos para


gestionar prácticamente la totalidad de los servicios que hemos estudiado, así como
configurar otros parámetros de red importantes. Se trata de una herramienta muy
completa, que puede facilitarnos nuestras labores de administración haciendo uso de
una sencilla interfaz.

En Debian, podemos instalarla haciendo uso de apt-get:


# apt-get install webmin

Una vez instalado, ya podemos conectarnos al webmin a traves de un navegador a


traves de la dirección https://<ip_servidor>:10000
La primera vez que nos conectemos el navegador nos pedirá que aceptemos como
valido el certificado que viene con el webmin y no esta reconocido por ninguna
entidad emisora de certificados.

Con el webmin podemos realizar prácticamente cualquier tareas de administración y


de forma muy cómoda como, por ejemplo, crear un usuario del sistema:

Y configurar cualquier programa siempre que exista un módulo de webmin creado


para ello. Por ejemplo, podríamos descargarnos un módulo para administrar el
servidor web apache: (Webmin/Webmin Configuration/Webmin Modules/Standard
module from www.webmin.com)
Una vez descargado e instalado el módulo, veremos que ofrece multitud de opciones
de configuración:

Hay que asegurarse de controlar bien los accesos al webmin ya que, como hemos
visto, es una herramienta muy potente
MÓDULO 5.- SEGURIDAD EN LINUX
Unidad 1.- Introducción

1.1. ¿NECESITAMOS REALMENTE ASEGURAR NUESTROS


SISTEMAS LINUX?

Linux es un sistema multiusuario real, es decir, puede haber varios usuarios distintos
trabajando a la vez en él, por lo que el sistema tiene la obligación de proteger a unos
usuarios frente a otros y protegerse a sí mismo de ellos. Aunque podemos emplear
un sistema Linux como una estación de trabajo aislada, lo habitual es que se
encuentre conectado a la red, y en la mayoría de casos, ofreciendo algún servicio a
un número mayor o menor de usuarios. El sistema operativo, por tanto, deberá
garantizar la fiabilidad, disponibilidad y confidencialidad de estos servicios.

Con la generalización de las conexiones a Internet y el rápido desarrollo del


software, la seguridad se está convirtiendo en una cuestión cada vez más
importante. Ahora, la seguridad es un requisito básico, ya que la red global es
insegura por definición. Mientras sus datos estén almacenados en un soporte
informático, mientras sus datos vayan desde un sistema a otro, pueden pasar por
ciertos puntos proporcionando a otros usuarios la posibilidad de interceptarlos, e
incluso alterar la información contenida. Incluso algún usuario de su sistema puede
modificar datos de forma maliciosa para hacer algo que nos pueda resultar
perjudicial.

El campo de la seguridad informática crece por instantes. Esto viene motivado por
que a diario aparecen nuevas vulnerabilidades de software, nuevos métodos para
conseguir accesos indebidos o comprometer el funcionamiento de la red, nuevas
aplicaciones que exploten vulnerabilidades existentes, etc. Esto nos obliga a estar
actualizados permanentemente para no ser sorprendidos ante un nuevo problema
detectado.

1.2. ¿SON SEGUROS NUESTROS SISTEMAS?

Lo primero que debemos asimilar sobre la seguridad informática es que ningún


sistema es completamente seguro. El único seguro es aquel que no está conectado a
la red, apagado y encerrado bajo llave.

Una vez comprendido esto, partiremos de que nuestra misión consistirá en dificultar
lo máximo posible que alguien pueda comprometer nuestros sistemas. Cabe destacar
que un atacante experimentado con el tiempo suficiente se hará con nuestro sistema
sin ninguna duda.

Hemos de tener en cuenta que existe una relación inversa entre seguridad y
funcionalidad. Para cada situación tendremos que decidir donde se encuentra el
equilibrio entre la facilidad de uso de nuestro sistema y su seguridad. En todos los
entornos no existen las mismas necesidades de seguridad, ni los mismos aspectos de
ésta a cubrir.
1.3. PARTICULARIDADES DE LINUX

Las fuentes del núcleo de Linux son abiertas. Cualquiera puede obtenerlas,
analizarlas y modificarlas. Este modelo de desarrollo abierto, que siguen tanto Linux
como la mayoría de las aplicaciones que se ejecutan sobre él, conduce a altos niveles
de seguridad. Es cierto que cualquiera puede acceder al código fuente para encontrar
las debilidades, pero no es menos cierto que el tiempo que tarda en aparecer la
solución para cualquier debilidad se mide más fácilmente en horas que en días.

Gracias a esto, Linux es conocido por su alto nivel de estabilidad que parte del propio
núcleo del sistema operativo.
MÓDULO 5.- SEGURIDAD EN LINUX
Unidad 2.- Seguridad física del sistema

2.1. INTRODUCCIÓN

Por lo general, en la mayoría de empresas e instituciones, el aspecto de la seguridad


física siempre queda relegado a un segundo plano. Algunas de estas organizaciones
destinan ciertos recursos (casi siempre no los suficientes) a proteger sus equipos de
posibles ataques externos, pero ignoran por completo el gran riesgo que supone una
mala (o nula) política de seguridad interna.

En este tema hablaremos de algunas situaciones de riesgo relacionadas con la


seguridad física de nuestros sistemas, centrándonos en qué medida podrían afectar a
nuestras máquinas Linux, y cómo poder prevenirlas en la medida de lo posible. Se
tratará de exponer los peligros y posibles soluciones de forma secuencial, para ir
observando de qué posibilidades dispondrá un atacante en el campo de la seguridad
física para hacerse con nuestros sistemas, observando cual podría ser paso a paso su
plan de ataque.

2.2. ACCESO FÍSICO AL SISTEMA

2.2.1. Acceso al hardware de la máquina

La posibilidad de acceder físicamente a nuestro sistema Linux inutiliza prácticamente


todas las medidas de seguridad que hayamos aplicado sobre él. Consideremos que
de poco nos servirá disponer de una autentificación de usuarios, un gran cortafuegos
y nuestro flamante sistema de detección de intrusos, si alguien no autorizado puede
acercarse hasta nuestro servidor, abrir la cpu con total impunidad y llevarse uno de
nuestros discos duros. Ha violado todos nuestros esquemas de seguridad sin
necesidad de pulsar una sola tecla.

Este problema no sólo concierne al sistema operativo Linux, sino que es aplicable a
cualquier otro. Para prevenirlo disponemos de multitud de sistemas de control de
acceso al lugar donde se encuentren instalados nuestros sistemas, desde la
tradicional “llave” que nos abre la puerta en cuestión, hasta sofisticados sistemas
analizadores de voz y retina.

2.2.2. Controlando los dispositivos de arranque

Volvamos al caso del punto anterior en el que un posible atacante tenga acceso físico
al sistema objetivo. Incluso sin llegar al caso extremo de desmontar la máquina, una
persona con acceso a ella podría detenerla, o lo que podría ser peor, iniciarla con
otro sistema operativo para luego montar los discos manualmente y obtener o
modificar la información que desease. Esto no tendría porqué llamar la atención en
exceso, como sería el caso de “secuestrar” nuestro preciado disco duro, y podría ser
incluso más efectivo, ya que el atacante quizá no haya hecho saltar ninguna alarma
ante los descuidados encargados de la seguridad.
Veamos un ejemplo real de esta situación. Tomaremos como requisitos iniciales una
máquina con el sistema operativo Linux instalado (entre otros) a la cual tenemos
acceso físico, y cuya secuencia de arranque en la BIOS sea CDROM, IDE (estas
condiciones son bastante usuales). Nos ponemos en el papel de este posible
atacante, para así poder descubrir el daño que podría causarnos y quizá cómo
protegernos de él.

En primer lugar reiniciaremos la máquina insertando por ejemplo, una distribución


Linux “live-cd”, como Ubuntu 8. Nos valdría cualquier otra, y no tendría que ser
necesariamente una distribución “live”. El primer disco de instalación de cualquier
distribución valdría igualmente para nuestros propósitos.

Una vez que hayamos arrancado con el disco de Ubuntu, lo primero que haremos es
averiguar en qué partición o particiones se encuentra el sistema Linux que queremos
atacar. Podemos utilizar el comando dmesg para averiguar los dispositivos ide que se
han detectado durante la carga del núcleo en memoria. Una vez que conozcamos el
dispositivo (supongamos que se trata de hda), mediante el comando fdisk
analizaremos las particiones que contiene en busca de alguna de tipo Linux native.

Como podemos observar en la captura, la partición sda1 es una partición Linux


nativa. Ahora procederemos a montarla como lo haríamos normalmente en nuestro
sistema Linux habitual para comprobar si en ella está contenido el sistema de
ficheros raíz (/) del sistema que estamos atacando.
Como podemos observar haciendo un listado del contenido del punto de montaje,
parece que hemos acertado en nuestro primer intento. Una vez llegados a este
punto, podemos modificar lo que deseemos como si fuésemos el administrador de
dicho sistema.
Una vez hayamos montado la partición, actuaremos de una forma u otra según sean
nuestras intenciones. Imaginemos, por ejemplo, que deseamos hacernos con el
control de la cuenta de superusuario, estableciendo una nueva contraseña a nuestro
antojo, para posteriormente instalar un posible sniffer, o una puerta trasera. Para
ello, estableceremos el directorio raíz del sistema al punto donde montamos la
partición sda1. Este proceso lo llevaremos a cabo con el comando chroot. Una vez
hayamos realizado esto, dispondremos de una shell de superusuario en el sistema
que queríamos atacar.

Ahora podemos ejecutar cualquier comando, como si hubiésemos iniciado sesión de


forma legítima en el sistema atacado como el superusuario. Hagamos la prueba e
intentemos cambiar su clave de acceso. Esto podemos hacerlo mediante el comando
passwd.
La clave ha sido actualizada correctamente. En lugar de haber modificado la
contraseña del administrador, podríamos habernos decantado por modificar el
contenido de la web de la empresa. Tan sólo necesitaríamos encontrar el directorio
donde se alberguen las páginas y realizar las modificaciones que considerásemos
oportunas.

Además de realizar modificaciones podríamos eliminar información, o lo que podría


ser más interesante para el atacante, robarla. Una forma muy sencilla podría ser
conectando cualquier dispositivo USB de almacenamiento a la máquina en cuestión.
De igual forma que habíamos montado la partición que contenía al sistema atacado,
montaríamos la unidad USB y copiaríamos los datos necesarios.
El impacto del ataque no tiene límites.

Asimismo, si los discos duros de la máquina hubiesen sido IDE en lugar de SCSI, el
proceso no hubiese tenido mayor complicación que cambiar el nombre del dispositivo
en los comandos utilizados: generalmente hda/b/c en lugar de sda/b/c.

Como hemos podido comprobar, de una forma extremadamente sencilla hemos


podido cambiar la contraseña del superusuario y modificar el contenido del servidor
web de la empresa. Sin tener unos conocimientos profundos de la materia, hemos
dejado sin acceso al administrador de forma temporal, y hemos modificado el
contenido de su sitio web corporativo.

Para tratar de evitar este tipo de situaciones hemos de controlar siempre la


secuencia de arranque de nuestras máquinas, impidiendo que sea posible iniciar
desde disqueteras y unidades de cdrom, y establecer contraseñas para acceder a la
BIOS del sistema, de forma que un usuario malintencionado no pueda activar dichos
dispositivos. Pese a esto, un atacante con el tiempo y recursos suficientes podría
resetear las claves que gobiernen la BIOS, quizá simplemente intercambiando un
jumper de posición en la placa base.

2.2.3. Protegiendo el gestor de arranque

Una vez que la máquina ha sido configurada para que arranque desde el disco duro
únicamente, el gestor de arranque toma el control. El gestor de arranque es una
herramienta muy flexible que nos permite iniciar el sistema operativo (o elegir entre
varios que tengamos instalados). Puede estar situado en el MBR de la unidad o al
inicio de una partición concreta. Esta flexibilidad en ocasiones es peligrosa. Por
ejemplo, durante el inicio del sistema es posible pasarle parámetros al gestor de
arranque. Uno de los parámetros (probablemente el más peligroso) que acepta LILO
es “single”. Si iniciamos el sistema pasándole este parámetro, este se inicia en modo
monousuario, y la mayoría de distribuciones nos ofrecerán una shell de superusuario
sin solicitarnos contraseña. Para evitar sorpresas de este tipo veremos cómo
asegurar dos de los gestores más utilizados en entornos Linux, LILO y Grub.

2.2.3.1. Asegurando LILO


Comenzaremos diciendo que el gestor de arranque LILO es un gestor de arranque
antiguo que no viene con la version de Ubuntu que estamos utilizando para la
realización de este manual.

Para evitar que cualquier usuario malintencionado pueda pasarle parámetros a LILO
en tiempo de arranque, disponemos de la opción “restricted”. Si la utilizamos
dentro de la definición de una imagen, el gestor nos solicitará una contraseña si
deseamos incluir algún modificador al iniciar el sistema. Esta contraseña la
definiremos con la opción “password”. En la captura se muestra una configuración
típica de LILO que ilustra estos conceptos.

Una vez que hayamos configurado adecuadamente LILO deberemos cargarlo de


nuevo, bien en el Master Boot Record o al inicio de la partición deseada. Una vez
finalizado el proceso, es importante que verifiquemos que tan sólo el superusuario
puede leer y escribir dicho fichero, ya que, de no ser así cualquier usuario del
sistema podría ver la contraseña (no cifrada).
2.2.3.2. Asegurando Grub
Grub es más potente que LILO, y su funcionamiento es ligeramente diferente. Una
de las cosas que podría constituir un agujero de seguridad es que el usuario puede
hacer demasiadas cosas desde GRUB, ya que GRUB permite que se modifique la
configuración y que se ejecuten órdenes arbitrarias en el arranque.

Por ejemplo, el usuario puede incluso leer el archivo `/etc/passwd' desde la interfaz
de la línea de órdenes usando la orden cat, de modo que es necesario suprimir todas
las operaciones interactivas. GRUB admite una contraseña, de forma que solo los
administradores puedan iniciar las operaciones interactivas, es decir, editar entradas
de menú y entrar en la interfaz de la línea de órdenes.

Para utilizar esta opción, necesitamos ejecutar la orden “password” en el archivo de


configuración. A continuación veremos una captura del archivo de configuración de
GRUB, menu.lst.

Si se especifica esta línea (password), GRUB deshabilita cualquier control interactivo


hasta que se pulse la tecla p y se introduzca la contraseña correcta. La opción “--
md5” le dice a GRUB que la contraseña tiene formato MD5. Si se omite, GRUB asume
que se encuentra en texto plano.

Podemos encriptar nuestra contraseña con la orden md5crypt. La siguiente captura


nos muestra un ejemplo del proceso, al ejecutar el comando grub.
Una vez hayamos obtenido la versión encriptada de nuestra clave (en este caso era
“prueba”) la introduciremos en el archivo menu.lst como ilustraba la captura
anterior. Es importante también en este caso que sólo el superusuario pueda leer y
escribir dicho archivo porque, pese a que la contraseña se encuentra encriptada, de
caer en malas manos podría ser sometido a ataques de fuerza bruta.

Como hemos visto, una mala configuración del gestor de arranque podría otorgar a
una persona con acceso físico a la máquina una shell de superusuario, Debido a esto
es importante que mantengamos protegido nuestro gestor favorito, y comprobemos
que los archivos de configuración correspondientes sólo son accesibles por el
administrador.

2.3. PROTEGIENDO NUESTRO HARDWARE

Cuando hablamos de seguridad rápidamente nos viene a la mente el concepto de


red, Internet, hacker, cracker, etc. Y puede que no estemos equivocados. Pero la
realidad es que la seguridad no sólo abarca estos conceptos. En muchos casos,
aparecen grandes problemas porque se ha quemado la fuente de alimentación de
uno de nuestros servidores (¿posible denegación de servicio?), o porque un disco
duro nos ha dejado para siempre.

Las consecuencias son las mismas que si un experimentado pirata hubiese penetrado
nuestros cortafuegos, adquirido privilegios en nuestros sistemas y luego, nos hubiese
destruido todos los datos. Y la pregunta es, ¿teníamos previsto qué podía pasar?

Cuando se produzca la negación de servicio no podremos alegar que fue un fallo de


hardware y nuestras defensas de red funcionaron a la perfección. Y aunque
dispongamos de copias de seguridad, restaurarlas puede llevarnos algún. Para luchar
con estos fallos eventuales del hardware por fallos de fabricación o por la larga vida
de los mismos, podemos utilizar redundancia donde sea posible, como por ejemplo
en cajas con doble fuente de alimentación, o más importante aún, en discos duros
implementando sistemas raid por hardware.

También sería interesante disponer de generadores autónomos, como SAIs, para


posibles cortes de luz que podrían acabar corrompiendo alguno de nuestros sistemas
de ficheros.
Otro factor importante en los daños que pueda sufrir nuestro hardware es la
temperatura. Un calor o frío excesivos pueden dañar nuestras máquinas.

Además de lo mencionado hasta ahora, no debemos olvidar a la naturaleza como


origen destructivo de nuestras máquinas. Un rayo, una inundación, o quizá un
incendio podrían acabar también con nuestra empresa..

2.4. PROTEGIENDO NUESTROS DATOS

Con total seguridad, y por muy costoso que sea el hardware del que dispone nuestra
empresa, su bien más preciado son los datos. Para evitar la pérdida de ellos, es muy
importante, además de proteger nuestro hardware en la medida de lo posible, que
tengamos una política de copias de seguridad muy eficiente.

No debemos estar tranquilos únicamente porque sigamos exhaustivamente nuestra


política de copias. Además de llevar a cabo la ardua labor de realizarlas, tenemos
que tomar la precaución de almacenarlas en un lugar seguro que, por supuesto, se
encuentre en una ubicación geográfica diferente a las máquinas que deseamos
salvaguardar.
MÓDULO 5.- SEGURIDAD EN LINUX
Unidad 3.- Seguridad lógica del sistema

3.1. INTRODUCCIÓN

En este tema trataremos con los mecanismos que nos ofrece Linux para asegurar al
máximo nuestra máquina, desde un punto de vista lógico.

3.2. SEGURIDAD EN EL NÚCLEO

En la actualidad existen numerosos proyectos amparados en la licencia GPL que


pretenden dotar al núcleo Linux de características adicionales de seguridad,
estableciendo una barrera adicional de protección en el sistema. Entre ellos
podríamos destacar:

1. SELinux
2. GRSecurity
3. LIDS

Dependiendo de nuestras necesidades puede ser muy recomendable que hagamos


uso de alguno de ellos. Se distribuyen en forma de parche para el núcleo, por lo que
deberemos descargar las fuentes del kernel y aplicar dichos parches sobre ellas. Una
vez hayamos finalizado, compilaremos de la misma forma que procedemos
habitualmente e instalaremos el núcleo recién compilado, para posteriormente
configurar las nuevas opciones a nuestra medida.

A continuación vamos a comentar brevemente los parches que acabamos de


nombrar.

1. SELinux

Su nombre real es Security-Enhaced Linux. Se trata de un conjunto de


modificaciones para el núcleo de Linux y utilidades desarrolladas por la Agencia
Nacional de Seguridad norteamericana. Su objetivo es mostrar a la comunidad Linux
la importancia de los “controles de acceso obligatorios” (Mandatory Access Control),
y cómo pueden ser aplicados a Linux.

Estas modificaciones establecen políticas de control de acceso obligatorias que


otorgan a los programas de usuario y servicios del sistema, los mínimos privilegios
que precisan para ejecutarse. Trabajando de esta forma reducimos (o incluso
eliminamos) el daño que podrían causar estas aplicaciones en el caso que fuesen
comprometidas, por ejemplo, por posibles desbordamientos de buffer o errores en la
configuración. Este mecanismo de protección opera independientemente de los
utilizados por Linux tradicionalmente, ignorando por ejemplo el concepto de super-
usuario (root).
La seguridad de un sistema Linux no modificado (sin aplicar SELinux) depende del
correcto funcionamiento del núcleo, todas las aplicaciones con ciertos privilegios y
cada una de sus configuraciones. Cualquier problema en alguna de estas áreas
podría comprometer todo el sistema. Por el contrario, la seguridad de un sistema con
las modificaciones SELinux aplicadas depende únicamente del núcleo y la
configuración de sus políticas de seguridad. En este caso, cualquier problema con el
funcionamiento de un demonio, por ejemplo, podría comprometer tan sólo la
seguridad de dicha aplicación y sus ficheros, pero nunca al sistema completo ni a
otras aplicaciones.

2. GRSecurity

GRSecurity es un conjunto de parches (distribuidos en un único fichero) para el


núcleo de Linux cuyo objetivo es mejorar la seguridad de un sistema Linux.

GRSecurity no es un servicio de seguridad adicional que necesitemos ejecutar


periódicamente (como Tripwire o AIDE), ni un módulo del kernel como el sistema
netfilter para filtrado de paquetes (veremos todo esto más adelante). GRSecurity
realiza su trabajo modificando el núcleo físicamente, para gestionar los procesos de
una forma más segura y restringida.

3. LIDS

LIDS hace referencia a Linux Intrusion Defence System.

LIDS es un parche para el núcleo de Linux y un conjunto de herramientas


administrativas que mejoran la seguridad del kernel implementando controles de
acceso obligatorios (MAC). Cuando se encuentra en funcionamiento, incluso el
superusuario (root) puede tener denegado el acceso a ficheros, las operaciones de
administración de red, e incluso la capacidad de utilizar cualquier dispositivo. Con
LIDS podemos definir qué programas podrán acceder a determinados ficheros,
ocultar algunos procesos sensibles, recibir alertas de seguridad a través de la red,
etc. En la actualidad, LIDS soporta los núcleos de las series 2.4 y 2.6. Al igual que
los proyectos anteriores, LIDS está liberado bajo la licencia GPL.

3.3. AUTENTICACIÓN DE USUARIOS

3.3.1. Autenticación tradicional

En un sistema Linux cada usuario posee un nombre de entrada al sistema o login y


una clave o password; ambos datos se almacenaban tradicionalmente en el fichero
/etc/passwd. Este archivo contiene una línea por usuario, donde se indica la
información necesaria para que los usuarios puedan conectar al sistema y trabajar
en él. Un ejemplo de entrada sería la siguiente:

tegioz:dase3frbkbDbSJDB:1000:1000:,,,:/home/tegioz:/bin/bash

Como podemos observar, el segundo campo que aparece contiene la contraseña


encriptada del usuario. Para cifrar las claves de acceso de sus usuarios, el sistema
operativo emplea un criptosistema irreversible que utiliza la función estándar de C
crypt. Pero, si el sistema es irreversible, ¿cómo puede un usuario conectarse al
sistema? El proceso es sencillo: el usuario introduce su contraseña, y el sistema le
aplica la función crypt mencionada anteriormente. Una vez aplicado el algoritmo de
cifrado compara el resultado obtenido con el almacenado en el campo password del
fichero de contraseñas. Si ambos coinciden el usuario puede ingresar en el sistema.

Este sistema de autenticación presenta serios problemas. El archivo /etc/passwd


debe ser legible por cualquier usuario para el correcto funcionamiento del sistema, y
por tanto, cualquier usuario podría obtener las contraseñas de todos los usuarios.

En principio podríamos pensar que la situación tampoco es tan grave. A fin de


cuentas las claves aparecen encriptadas. A diferencia de lo que mucha gente cree,
no es posible descifrar una contraseña. Sin embargo, sí es posible (al igual que lo
hace el sistema) elegir palabras al azar (o con cierto sentido) y realizar
comprobaciones masivas, hasta dar con la palabra de paso buscada. En el mercado
existen numerosos programas que realizan esta tarea de forma automática, haciendo
uso incluso de diccionarios predefinidos.

Este tipo de ataque es conocido como “ataque de fuerza bruta”. Podemos luchar
contra ellos de dos formas totalmente compatibles entre sí. La primera sería utilizar
contraseñas con un cierto grado de complejidad.

En todo caso debemos evitar claves que sean palabras de diccionarios, o pequeñas
derivaciones de estas. Pero esto no nos garantiza una seguridad absoluta, sino quizá
algo más de tiempo. Hemos de tener en cuenta que existen aplicaciones que
comenzarán a probar todas las combinaciones posibles de caracteres numéricos,
alfanuméricos y símbolos. Es sólo cuestión de tiempo que descifren nuestras
passwords. Una clave débil puede suponer una puerta de acceso a nuestros sistemas
y entrañar un gran peligro.

Otra medida contra este tipo de ataques sería utilizar “shadow passwords”. La idea
básica de este mecanismo es impedir que los usuarios sin privilegios puedan leer el
fichero donde se encuentran las claves cifradas; en el punto anterior hemos
comentado que el fichero /etc/passwd debe tener permiso de lectura para todo el
mundo si queremos que el sistema opere de forma correcta.

En equipos que hagan uso de shadow passwords, este fichero sigue siendo legible
por todos los usuarios, pero en lugar de aparecer la contraseña cifrada aparece una x
en su lugar, carácter que indica a determinados programas (como /bin/login) que
han de buscar las claves en /etc/shadow. Este archivo, a diferencia de /etc/passwd,
tan sólo puede ser leído por el usuario root.

A continuación veremos una captura que muestra una entrada típica en los archivos
/etc/passwd y /etc/shadow en un sistema que utiliza shadow passwords.
En la actualidad, casi todas las distribuciones Linux hacen uso de shadow passwords de
forma predeterminada.

3.3.2. PAM

PAM no es un modelo de autenticación en sí, sino que se trata de un mecanismo que


proporciona una interfaz entre las aplicaciones de usuario y diferentes métodos de
autenticación.

Normalmente, cada programa que requiera un control de acceso tiene su forma


particular de realizar la autenticación. En algunas distribuciones, muchos de esos
programas son configurados para usar un proceso de autenticación centralizado
llamado Pluggable Authentication Modules (PAM).

PAM utiliza una arquitectura conectable y modular, que otorga al administrador del
sistema una gran flexibilidad al establecer las políticas de autenticación para el
sistema.

En la mayoría de los casos, el archivo de configuración por defecto PAM para una
aplicación tipo PAM es suficiente. Sin embargo, algunas veces es necesario modificar
el archivo de configuración. Debido a que un error en la configuración de PAM puede
comprometer la seguridad del sistema, es importante comprender la estructura de
estos archivos antes de hacer cualquier modificación.
Algunas de las ventajas que nos ofrece PAM son:
o Un esquema de autenticación común que se puede usar con una gran
variedad de aplicaciones.
o Permite gran flexibilidad y control de la autenticación para el administrador
del sistema y el desarrollador de la aplicación.
o Los desarrolladores de aplicaciones no necesitan desarrollar su programa para
usar un determinado esquema de autenticación. En su lugar, pueden
concentrarse puramente en los detalles de su programa.

El directorio /etc/pam.d/ contiene los archivos de configuración de PAM para cada


aplicación tipo PAM. En versiones antiguas de PAM se utilizaba /etc/pam.conf, pero
este archivo ya no se utiliza y pam.conf solamente es leído si el directorio
/etc/pam.d/ no existe.

Las aplicaciones tipo PAM o servicios tienen un archivo dentro del directorio
/etc/pam.d/. Cada uno de estos archivos es llamado después del servicio para el cual
controla el acceso.

Depende del programa tipo PAM definir el nombre de su servicio e instalar su archivo
de configuración en el directorio /etc/pam.d/. Por ejemplo, el programa login define
su nombre de servicio como /etc/pam.d/login.

Al igual que el caso de las shadow passwords, PAM viene de serie en la mayoría de
distribuciones Linux actuales, y nos permite centralizar la autenticación de nuestros
programas, garantizándonos una forma cómoda de mantenerla, y fácilmente
modificable para que haga uso de otros sistemas de autenticación nuevos, sin
necesidad de que las diferentes aplicaciones que lo utilizan sean rescritas.

3.4. EL SISTEMA DE FICHEROS

En un sistema Linux todo son archivos: desde la memoria física del equipo hasta el
ratón, pasando por el teclado, discos duros, impresoras o terminales. Esta filosofía
de diseño es uno de los factores que más éxito y potencia proporciona a Linux, y en
el general a todos los sistemas UNIX, pero a su vez uno de los que más peligros
entraña: un simple error en un permiso puede permitir a un usuario modificar todo
un disco duro o leer los datos tecleados desde una terminal. Debido a esto es vital
una correcta utilización de los permisos, atributos y otros controles sobre el sistema
de ficheros para la seguridad de un sistema.

En Linux tenemos disponibles una serie de sistemas de ficheros, cada uno de los
cuales presenta diferentes grados de madurez, y diversas cualidades explotables en
diferentes entornos (optimizados para trabajar con ficheros pequeños, grandes, etc).
Entre ellos destacan EXT2 (sistema de ficheros tradicional de Linux), EXT3 (sucesor
del anterior, con soporte de journaling), XFS, REISERFS, etc. Nosotros utilizaremos
EXT3 en nuestros ejemplos, ya que es el más maduro de todos, pese a ser el que
peor rendimiento nos ofrece en la mayoría de situaciones.

3.4.1. Permisos de ficheros

La correcta gestión de los permisos de ficheros es vital para la seguridad de nuestro


sistema Linux. Un error en los permisos asignados a determinados ficheros podría
comprometer por completo la seguridad de nuestra máquina. En este apartado
describiremos los permisos que podemos establecer en un sistema Linux.

Cada fichero o directorio en Linux tiene unos determinados permisos de acceso.


Existen tres tipos de permisos:
o permiso de lectura
o permiso de escritura
o permiso de ejecución

Estos permisos pueden ser aplicados sobre tres grupos de usuarios:


o el propietario del fichero
o el grupo al que el propietario pertenece
o el resto de usuarios

Esto se representa en Linux con 9 bits de información (3 tipos de permisos x 3


categorías de usuarios), cada uno de los cuales puede estar activado o desactivado,
según el permiso esté concedido o denegado.

3.4.1.1. Notación de los permisos de ficheros

Cuando hablamos de notación de los permisos de ficheros debemos tener presente la


existencia de dos categorías que pasamos a describir seguidamente.

A) Representación simbólica
Esta representación es la que observamos normalmente cuando realizamos un
listado completo de un directorio. Consiste en una cadena de diez caracteres. El
primero de ellos indica el tipo de archivo. Los nueve restantes corresponden a los
permisos: los tres primeros hacen alusión a los permisos del propietario sobre el
fichero en cuestión, los tres siguientes al grupo del propietario, y los tres últimos al
resto de usuarios del sistema. A continuación veremos una ilustración de esto:

Tomemos el ejemplo del listado del fichero /bin/ls (-rwxr-xr-x).

o El primer carácter nos indica, el tipo de fichero. Puede ser un guión '-' si se trata
de un fichero regular, el carácter 'd' si se trata de un directorio, una 'l' si se trata de
un enlace, etc.
o Los tres siguientes caracteres nos indican los permisos del dueño del archivo. En
este caso rwx.
o Los caracteres de las posiciones cuatro a la seis (centrales) corresponden a los
permisos
o aplicados al grupo del propietario (r-x).
o Finalmente, los tres últimos caracteres detallan los permisos aplicables sobre el
resto de
o usuarios del sistema (r-x).

Los caracteres utilizados tienen el siguiente significado:


r - Permiso de lectura concedido
w - Permiso de escritura concedido
x - Permiso de ejecución concedido

Si el lugar de estos caracteres aparece un guión significa que dicho permiso está
denegado.

Algunos ejemplos:
rwxr-xr-x
o Se trata de un fichero regular.
o El propietario tiene concedidos todos los permisos sobre el fichero.
o El grupo del propietario puede leer y ejecutar el archivo, pero no modificar su
contenido.
o El resto de usuarios también pueden leer y ejecutar el archivo, pero al igual
que los miembros del grupo, no puede modificarlo.

dr-x------
o Se trata de un directorio.
o El propietario tiene permisos de lectura y ejecución sobre el fichero.
o Los miembros del grupo y el resto de usuarios del sistema no poseen ningún
permiso sobre él.

B) Representación numérica
Además de la representación simbólica que acabamos de ver, existe otra forma de
referirnos a los permisos aplicables a un fichero. Esta representación consta de tres
cifras octales, cada una de las cuales corresponde al propietario del fichero, al grupo,
y al resto de usuarios respectivamente. A continuación vamos a ver una tabla que
nos relaciona la representación simbólica con la numérica, indicando su significado
en casa caso.

Dígito octal Simbólico Significado


0 --- Denegados todos los tipos de acceso
1 --x Permiso para ejecutar el fichero
2 -w- Permiso para escribir en el fichero
3 -wx Permisos para escribir en el fichero y ejecutarlo
4 r-- Permiso para leer el fichero
5 r-x Permiso para leer y ejecutar el fichero
6 rw- Permiso para leer el fichero y escribir en él
7 rwx Todos los permisos concedidos

Ahora que conocemos las equivalencias entre las dos representaciones, vamos a ver
algunos ejemplos.

644
o Propietario: permiso para leer y escribir
o Grupo: permiso de lectura
o Otros: permiso de lectura

755
o Propietario: permiso de lectura, escritura y ejecución
o Grupo: permiso de lectura y ejecución
o Otros: permiso de lectura y ejecución
3.4.1.2. Diferencias entre los permisos aplicados sobre ficheros o directorios

Hemos de aclarar que los permisos vistos hasta el momento (lectura, escritura y
ejecución) tendrán un significado diferente dependiendo de que sean aplicados sobre
un fichero o un directorio. En la tabla siguiente veremos las diferencias entre ambos.

Permiso Sobre un fichero Sobre un directorio


Lectura El contenido del fichero El usuario puede listar el
puede ser leído contenido del directorio

Escritura El usuario puede modificar El usuario o proceso puede


el contenido del fichero cambiar el contenido del
directorio: por ejemplo,
crear o borrar un fichero
en él, o renombrarlo

Ejecución El fichero puede ser El usuario o proceso puede


ejecutado acceder al directorio en
cuestión (aunque no listar
su contenido)

3.4.1.3. Permisos especiales

Además de los permisos básicos que hemos visto anteriormente, existen tres
permisos especiales aplicables a los ficheros en Linux:

SUID o setuid: cambia el identificativo del usuario durante la ejecución. Si el bit


setuid está activado, cuando el fichero es ejecutado por algún usuario, el proceso
tendrá los mismos privilegios que el propietario del fichero ejecutado. Sólo tiene
sentido aplicarlo sobre un fichero.

SGID o setgid: cambia el identificativo del grupo durante la ejecución. Este caso es
igual que el anterior, salvo que el proceso hereda los privilegios del grupo del
propietario. Al igual que en el caso anterior, aplicar este tipo de permiso sólo tiene
sentido sobre un fichero.

Bit Sticky. Es aplicable a directorios. Si está activado, cualquier usuario puede


escribir en dicho directorio, aunque no puede modificar o eliminar cosas de otros
usuarios. Un ejemplo de directorio con este tipo de permiso aplicado sería /tmp.

La representación numérica de estos permisos sería:


Dígito octal Significado
0 Ningún permiso especial activado
1 Bit sticky (pegajoso) activado
2 Bit setgid activado
3 Bit sticky y setgid activados
4 Bit setuid activado
5 Bit sticky y setuid activados
6 Bits setuid y setgid activados
7 Bits setuid, setgid y sticky activados
Este bit se añadiría en primera posición a los tres que establecían los permisos
básicos, quedando así cuatro dígitos octales para la representación de permisos de
ficheros.

Su representación simbólica sería: SUID

SUID
Si se encuentra activado, el carácter del permiso de ejecución del propietario será
una 's', en lugar de la 'x' que vimos. Si el propietario no tuviese otorgado el permiso
de ejecución sobre ese fichero, el carácter 's' aparecería en mayúsculas 'S'.

Ejemplos:
o rws------ El bit SUID está activado y el propietario tiene permiso de ejecución
o r-S------ El bit SUID está activado, pero el propietario no tiene permisos de
ejecución

SGID
Si se encuentra activado, el carácter del permiso de ejecución del grupo será una 's',
en lugar de la 'x'. Si el grupo no tuviese otorgado el permiso de ejecución sobre ese
fichero, el carácter 's' aparecería en mayúsculas 'S'.

Ejemplos:
o rwxrws--- El bit SGID está activado y el grupo tiene permisos de ejecución
o rwxr-S--- El bit SGID está activado, pero el grupo no tiene asignados
permisos de ejecución

Sticky
Si se encuentra activado, el carácter del permiso de ejecución del resto de usuarios
del sistema será una 't', en lugar de la 'x'. Si el resto de usuarios no tuviesen
otorgado el permiso de ejecución sobre ese directorio, el carácter 't' aparecería en
mayúsculas 'T'.

Ejemplos:
o rwxrwxrwt both others execute and sticky bit are set
o rwxrwxr-T sticky bit is set, but others execute is not set

El papel que juegan estos permisos especiales en la seguridad es muy importante.


Cualquier sistema Linux tiene un cierto número de ejecutables setuidados. Cada uno
de ellos, se ejecuta con los privilegios de quien lo creó, que por lo general será el
usuario root. Esto implica que cualquier usuario tenga la capacidad de lanzar
procesos que escapen total o parcialmente al control del sistema operativo. Un mal
funcionamiento en alguna de estas tareas podría causar daños irreparables al
sistema, o conceder a un posible atacante una shell con todos los privilegios.

Para evitar en la medida de lo posible estos problemas debemos minimizar el


número de comandos que se ejecuten con los bits SUID y SGID activados. En
muchos casos esto no será posible, ya que determinados ficheros precisan de estos
bits para realizar su imprescindible tarea de una forma correcta.
Un ejemplo de esto sería el comando passwd. Mediante él, cualquier usuario del
sistema puede modificar su contraseña. Sin embargo, cualquier usuario del sistema
no tendrá permisos de escritura sobre los ficheros de claves del sistema
(probablemente ni de lectura). Debido a esto se hace necesario un comando que se
ejecute con el nivel de privilegios suficiente para realizar esta tarea de una forma
correcta. Sin embargo, existen otros ejecutables de una importancia menos vital.
Deberíamos tratar de neutralizar estos bits (SUID y SGID) de todos aquellos ficheros
que consideremos que no lo precisan para realizar tareas importantes en el sistema.
Una forma de encontrar archivos con estos permisos, podría ser mediante el
comando find.

Ejemplo:
# find / \( -perm -4000 -o -perm -2000 \) -type f –print

Añadir alguna tarea al cron que realizase esta actividad por nosotros sería muy
interesante, ya que el estado de los ficheros puede cambiar y es importante que
tengamos controlados a aquellos que se ejecuten con cierto nivel de privilegios.

Como hemos comentado, ejecutar una aplicación con privilegios elevados supone un
gran riesgo. Debemos extraer pues que, además de tomar todas las precauciones
posibles con los permisos de los ficheros del sistema, debemos emplear sólo la
cuenta de superusuario cuando sea absolutamente imprescindible.
3.4.1.4. Comandos

Los comandos utilizados para gestionar los permisos y propietario de un fichero, bien
sea haciendo uso de la metodología simbólica o de la numérica son chmod y chown
respectivamente. Podemos encontrar más información al respecto en las páginas del
manual de chmod y chown (man chmod).

Para finalizar este apartado, veremos una captura realizada de la "Linux Security
Quick Reference Guide". En ella se muestran algunos ficheros importantes del
sistema sobre los que deberíamos prestar una especial atención, en lo que a
permisos se refiere.
3.4.2. Atributos de ficheros

En el sistema de ficheros ext2 (Second Extended File System) de Linux (y ext3)


existen ciertos atributos para los ficheros que pueden ayudar a incrementar la
seguridad de nuestro sistema. Estos atributos son los siguientes:
A Actualizaciones asíncronas
S Actualizaciones síncronas
a Solo añadir
c Fichero comprimido
i Fichero inmutable
d Sin backup (dump)
s Borrado seguro
u Fichero imborrable

Algunos de estos atributos son muy importantes desde el punto de vista de la


seguridad. Por ejemplo, el atributo 'a' al ser aplicado sobre un fichero sólo permite
que éste se abra para añadir datos, nunca para eliminarlos. Este atributo sólo puede
ser aplicado por el usuario root. Un ejemplo de conjunto de ficheros que deberían
tener aplicado este atributo serían los ficheros de log del sistema.

Otros atributos a destacar serían:


s: realiza un borrado seguro de un fichero, tratando de dificultar una posterior
recuperación. Utiliza un sistema de relleno de ceros.
i: inmutable. Un fichero con este flag activo no puede ser modificado de
ninguna forma, ni siquiera para añadir información. Puede resultar muy
interesante para determinados ficheros de configuración del sistema.
S: actualizaciones síncronas. Fuerza al sistema a escribir los cambios a disco
de estos archivos inmediatamente. Aunque no es habitual, en determinadas
circunstancias es posible perder información de ficheros de registro en caso
de un corte de luz, o un fallo del sistema, que aún no haya sido escrita
físicamente en los discos duros.

La gestión de atributos de ficheros en Linux se realiza con los comandos lsattr y


chattr. A continuación veremos algunos ejemplos. Más información en las páginas del
manual (man) de estos comandos.
3.4.3. Listas de control de acceso (ACL)

Las listas de control de acceso nos proporcionan mucha más flexibilidad a la hora de
gestionar los permisos de un fichero que el sistema tradicional. Mientras que con
este último sólo podíamos especificar permisos para tres grupos de usuarios
(propietario, grupo y otros), con las listas de control de acceso podremos asignar
permisos a usuarios o grupos concretos. Por ejemplo, podríamos asignar permiso de
lectura a dos usuarios sobre un archivo sin necesidad de añadirlos a un mismo
grupo.

Para poder hacer uso de las ACL, lo primero que debemos hacer es verificar si
tenemos el soporte necesario en el kernel. Si utilizamos un núcleo de la serie 2.4
deberemos parchear nuestras fuentes antes de poder seleccionar el soporte. En los
núcleos pertenecientes a la rama 2.6 ya viene incluido por defecto, y tan sólo
tendremos que activar la opción y recompilar.

Una vez que tengamos el soporte activado, necesitaremos instalar en nuestro


sistema las utilidades ACL. o bien, si utilizamos DEBIAN podemos hacer un simple:
apt-get install acl

Ya tenemos todo lo necesario para hacer uso de las listas de control de acceso.
Ahora comentaremos los comandos para interactuar con ellas, y veremos un ejemplo
sencillo que muestre su funcionamiento. Los comandos utilizados para gestionar las
ACL son dos: getfacl, para obtener la lista, y setfacl, para realizar modificaciones en
ella. Obtengamos primero la lista de control de acceso de un fichero: por ejemplo
lilo.conf. La siguiente captura ilustra el proceso.

Ahora que ya sabemos cómo obtener la lista, probaremos a modificarla.


Independientemente de los permisos que tenga el archivo, vamos a otorgar a los
usuarios mail y news control total (rwx) sobre el archivo en cuestión. Realizaremos
esta operación con el comando setfacl.
De nuevo obtenemos la lista de control de acceso para cerciorarnos de que todo ha
ido como esperábamos. El símbolo + que aparece junto al listado de permisos del
fichero nos indica que existen permisos controlados por la ACL que no están
reflejados en el listado tradicional.

Como hemos podido comprobar, las listas de control de acceso nos permiten definir
de una forma mucho más precisa y flexible los permisos a determinados ficheros del
sistema. Adicionalmente hemos de revisar el sistema en busca de ficheros
importantes en los que aparezca el símbolo +, ya que en su ACL podrían existir
permisos ocultos que supusiesen un riesgo para la seguridad de nuestras máquinas.
Podríamos incluso automatizar esta tarea en un guión shell script y añadirla al cron,
para que se ejecutase de forma periódica.

Para profundizar más en este aspecto, no dude en consultar las páginas del manual
de los comandos getfacl y setfacl.

3.4.4. Almacenamiento seguro

En algunas ocasiones puede resultarnos interesante almacenar cierta información de


forma que ninguna otra persona pueda acceder a ella. Aunque en un sistema Linux
cada usuario cuenta con sus propios archivos y no puede acceder a los de otros
usuarios, el administrador puede acceder a todos los archivos, y puede que no
queramos permitir ni ese acceso. También puede darse el caso en el que alguien no
autorizado obtenga privilegios de root si puede acceder físicamente a la máquina.

Para solucionar esto, podemos inclinarnos por la encriptación que nos proporciona
GnuPG. GnuPG es un completo reemplazo libre para PGP, y nos ofrece todo lo
necesario para firmar y encriptar datos. A continuación mostramos una sesión que
nos muestra un ejemplo de funcionamiento de GnuPG encriptando un archivo.
De esta forma, en caso de que nuestro archivo sea interceptado por alguien no
autorizado, no podrá acceder a su contenido.

Numerosos clientes de correo tienen soporte para PGP/GnuPG, facilitando el firmado


digital de documentos, así como su encriptación, sin necesidad de recurrir a la línea
de comandos.

3.4.5. Borrado seguro

La posibilidad de eliminar un fichero de forma segura del sistema es algo vital.


Imaginemos por un instante que tenemos información confidencial en un archivo del
sistema. Como somos conscientes de que esa información no debería ser vista por
nadie, la encriptamos como vimos en el punto anterior y eliminamos el fichero sin
encriptar. Pero, ¿que sucedería si alguien recuperase ese archivo eliminado? Es algo
totalmente factible, y nuestra fuerte encriptación perdería su utilidad.

Una forma de intentar solucionar esto podría ser utilizando el atributo de fichero de
borrado seguro (s). Este sistema no es fiable del todo, y lo único que hará es
retrasar al atacante en sus propósitos. Otra opción sería utilizar herramientas
especializadas, como wipe. Wipe realiza un borrado seguro de ficheros,
sobrescribiendo con patrones especiales de datos repetidamente los ficheros que
serán eliminados, y forzando los cambios a disco (con fsync).
En el lado opuesto, la recuperación de ficheros eliminados, podríamos destacar el
conjunto de utilidades 'The Coroner Toolkit', que nos permitiría recuperar
información eliminada de un sistema de ficheros, de una forma relativamente
sencilla. Hay que destacar que entre este conjunto de utilidades se encuentra el
comando 'srm', que al igual que 'wipe' nos permitiría un borrado seguro de ficheros.

3.4.6. Protegiendo la integridad del sistema de ficheros

Utilizando software destinado a verificar la integridad del sistema de ficheros además


de comprobar los permisos de los ficheros, podríamos controlar otros aspectos, como
modificaciones en el contenido de ficheros, propietario, etc. Podemos destacar dos
aplicaciones que se encargan de realizar esta tarea: Tripwire y Aide.

3.4.6.1. Tripwire Y AIDE

Comentaremos juntos ambos programas debido a su similitud (AIDE se desarrolló a


partir de Tripwire). Su misión es asegurar la integridad de los ficheros del sistema.

Su funcionamiento básicamente es el siguiente:

o Una vez instalado el software, se generará una base de datos con la


información de todos los ficheros que deseemos monitorizar (los
seleccionaremos en la configuración). Hemos de tener en cuenta que ha de
ser lo primero que tenemos que hacer una vez tengamos instalado el sistema
operativo. De poco nos servirá hacerlo en una máquina que lleve conectada a
la red cinco años.

o Periódicamente se realizaran comprobaciones del sistema, contrastándolas


con la información almacenada en la base de datos, y posteriormente
generando informes con los resultados. Si realizásemos alguna modificación
sobre el sistema, no tendríamos más que actualizar la base de datos inicial
para que en sucesivas comprobaciones del sistema se hiciese uso de ellas,
evitando así falsas alarmas.

o Ambos paquetes pueden verificar el contenido de un archivo, su tamaño, su


propietario, sus permisos, etc. Por tanto, en caso de que un atacante
modificase algún archivo importante de nuestro sistema el informe que
generaría el gestor de integridad delataría su acto, y nosotros tomaríamos las
medidas oportunas. Según esto, podríamos calificar a AIDE y Tripwire como
sistemas de detección de intrusos.

o Como diferencias entre ambos podríamos señalar que Tripwire dispone de


algunas características adicionales, entre las que podríamos destacar la
posibilidad de firmar la base de datos criptográficamente. Ambos son buenos
sistemas de control de integridad de ficheros, y se recomienda
encarecidamente su uso.
3.5.- ASEGURANDO LOS DATOS

En este apartado veremos el aspecto lógico de la conservación de los datos: las


copias de seguridad, así como la posibilidad de emular un sistema raid por hardware,
haciendo uso del sistema operativo Linux.

3.5.1. Implantando RAID por software

Montar un sistema raid por software puede ser una alternativa eficiente y bastante
económica.

Para poder montar un sistema RAID por software necesitamos habilitar el soporte de
RAID en el núcleo. La siguiente captura ilustra las opciones necesarias a seleccionar:

Hemos de señalar que podemos configurar el soporte en el núcleo tanto de forma


estática, como dinámica (módulo), aunque si deseamos arrancar desde un
dispositivo raid deberemos incluirlo estáticamente en el núcleo.

Una vez hayamos configurado y compilado el núcleo, necesitaremos el paquete de


herramientas ‘raidtools’, con las que creamos el raid a nuestra medida. En nuestro
caso, haciendo uso de Debían sería simplemente 'apt-get install raidtools2'. En este
punto, ahora que hemos instalado nuestro nuevo núcleo y las herramientas
necesarias reiniciaremos la máquina para ver si el driver md (encargado de gestionar
el raid) se inicia correctamente. Una vez se haya cargado el driver, podremos hacer
uso de los dispositivos /dev/mdX, que representan conjuntos raid.
El montaje del sistema raid se hace a nivel de partición, las cuales se recomiendan
sean exactamente iguales en tamaño, ya que de lo contrario el rendimiento del array
podría disminuir sensiblemente. Para aprovechar las funcionalidades de un sistema
raid (de cualquier nivel) es imprescindible que dichas particiones se encuentren en
unidades físicas diferentes.

A continuación detallaremos los niveles raid más utilizados:

o Nivel 0: Consiste en crear un dispositivo con el tamaño de las particiones que


lo componen. Supone una mejora en el rendimiento.

o Nivel 1: Consiste en almacenar la información por duplicado. Supone una


mejora en la seguridad de los datos, ya que ante el fallo de uno de las
particiones del raid, el sistema dispondría de al menos una copia de los datos,
continuando así en funcionamiento y sin haberse producido pérdidas de
información.

o Nivel 5: En todas ellas se guardan datos e información de paridad para poder


reconstruir el sistema en caso de fallo. Se necesitan tres o más particiones.

Como podemos observar, desde el punto de vista de la seguridad, los niveles que
nos resultan más interesantes son el uno y el cinco. A continuación veremos cómo
configurar un raid de nivel uno.

Antes de crear el raid hemos de crear dos particiones, y asignarles como tipo de
partición fd (Linux Raid Auto), para que el sistema las detecte automáticamente.
Supongamos que estas particiones son hda1 y hdb1. La configuración del raid se
almacena en el archivo /etc/raidtab. En nuestro caso tendría el siguiente aspecto.

Como podemos observar en el fichero, hemos definido que queremos un raid de nivel
1, asignado al dispositivo /dev/md0, formado por dos discos (nr-raid-disks) y que no
tiene discos de repuesto o sobrantes (nr-spare-disks). Adicionalmente, hemos
especificado cuales serán las dos particiones que compondrán el raid.

Una vez hecho esto, crearemos el raid mediante el comando mkraid, que leerá la
configuración del archivo anterior. El comando sería # mkraid /dev/md0. Una vez
hecho esto, ya habremos finalizado el proceso, y podremos tratar al dispositivo md0
como una partición más, formateándola con el sistema de ficheros que deseemos. A
partir de este momento, todos los archivos que escribamos en el sistema de ficheros
creados estarán sometidos al raid. Si por algún motivo, alguno de nuestros discos
fallase, no habría pérdida de información, asegurando de esta forma nuestros datos.

3.5.2. Copias de seguridad

Realizar copias de seguridad de nuestros sistemas es una tarea obligatoria. Es muy


recomendable que dichas copias de seguridad se encuentren ubicadas en un lugar
geográfico distinto al de los sistemas. De esta forma, en caso de catástrofe
podremos recurrir a ellas.

A continuación veremos un par de herramientas a la hora de realizar copias de


seguridad en Linux.

3.5.2.1. Tar

Tar es una herramienta muy potente y de sencillo manejo que nos permite
empaquetar un fichero (o directorio) o conjuntos de ellos en uno sólo.
Adicionalmente, nos permite comprimir el archivo resultante, reduciendo así su
espacio.

Pese a no ser una herramienta nueva, tar es una de las utilidades para realizar
copias de seguridad más utilizadas. A continuación, veremos un ejemplo de uso de
tar, primero empaquetando un directorio completo y comprimiéndolo, y
posteriormente extrayendo su contenido. Hemos de señalar que tar permite extraer
no sólo el contenido íntegro del paquete, sino tambien determinados ficheros.
Para sacar el máximo provecho a la potencia y flexibilidad de tar, podríamos realizar
shell scripts que automatizasen el proceso de salvaguarda y añadirlos al cron,
volcando el resultado a una unidad destinada a ello.

Para más información consulte la página man de tar.

3.5.2.2. Partimage

Partimage nos permite realizar una imagen de una partición completa. Su


funcionamiento es similar a la aplicación comercial Norton Ghost. Imaginemos que
hemos montado un servidor Linux. Una vez que lo tenemos completamente
operativo realizaríamos una imagen con partimage y la pondríamos a salvo. Si nos
encontrásemos ante cualquier problema podríamos restaurar la máquina en cuestión
de minutos. Además de proteger los datos de una posible pérdida, disminuiríamos
sensiblemente el tiempo de respuesta para restaurar nuestros sistemas, aumentando
de esta forma la disponibilidad de los mismos. Esta imagen realizada podría ser de
utilidad en otras situaciones, como por ejemplo, que tuviésemos que montar un
sistema idéntico en otra de las oficinas de nuestra empresa.

Conviene destacar que para realizar la imagen de una partición esta ha de estar
desmontada. Debido a esto, cuando nos dispongamos a realizar una imagen, es
recomendable que iniciemos el sistema con una distribución live-cd que disponga de
la utilidad. Partimage nos permite también elegir algún sistema de compresión para
nuestra imagen, como gunzip o bzip2. Dependiendo del sistema elegido la imagen
tardará más o menos tiempo en realizarse, disminuyendo o aumentando su tamaño
respectivamente. En las siguientes capturas veremos una sesión de partimage
realizando una imagen.
El proceso de restaurado es muy similar. Tan sólo tendríamos que indicarle a
partimage el fichero que contiene la imagen y la partición donde queremos
restaurarla.
Partimage puede leer gran cantidad de sistemas de ficheros (ext2, ext3, reiserfs, xfs,
jfs, fat32, ntfs, etc), y permite realizar/restaurar imágenes de particiones a través de
la red, haciendo uso del demonio partimaged. Haciendo uso de éste podríamos
realizar imágenes de los sistemas de ficheros de los usuarios de nuestra red en un
lugar centralizado, pudiendo restaurarse de igual forma si fuese necesario.

3.6.-AUDITORIA DEL SISTEMA

Un aspecto muy importante de la seguridad de nuestros sistemas son los ficheros de


registro o log. En ellos habitualmente aparece información de vital importancia, como
accesos al sistema completamente detallados, intentos de conexiones, uso de los
servicios que ofrezcamos, posibles errores del sistema, etc. Debido al carácter de
esta información debemos conocer a fondo los ficheros utilizados por el sistema para
registrar estas actividades, métodos para protegerlos de posibles atacantes, y lo que
es más importante, revisarlos periódicamente en busca de cualquier actividad que
pueda parecernos sospechosa. Realizar esto puede evitarnos muchos dolores de
cabeza, ya que tendremos la opción de anticiparnos a muchos de los ataques que
podamos recibir, descubrir los métodos utilizados por un posible atacante para violar
nuestros sistemas, etc.

La mayoría de las distribuciones Linux suelen utilizar el demonio syslogd para


registrar la actividad del sistema. Aunque syslog es el más extendido, existen
alternativas como syslogd-ng (next generation) o metalog. El demonio syslogd recibe
información de los diferentes programas del sistema o del núcleo, y los almacena
convenientemente en ficheros dependiendo de su criticidad. Puede incluso registrar
la actividad de la máquina en ubicaciones remotas, dificultando así su posible
alteración. La configuración del demonio syslogd se encuentra en el fichero
/etc/syslogd.conf. La siguiente captura ilustra una configuración típica.
Como podemos observar en la captura, en cada regla del archivo podemos distinguir
dos campos: uno de selección y otro de acción. El campo de selección a su vez está
dividido en dos partes, separadas entre sí por un punto. La primera indica el servicio
que envía el mensaje, mientras que la segunda indica la prioridad. En el campo de
acción indicamos la ubicación donde queremos que se almacenen los registros, que
puede ser local o remota (comenzará con @).

3.6.1. Algunos ficheros de log importantes

A continuación veremos un listado de los ficheros de registro más comunes en un


sistema Linux. Como hemos comentado anteriormente, estas ubicaciones son
totalmente configurables, por lo que es posible que estos archivos tengan nombres
diferentes en algunas máquinas, o se encarguen de registrar otra información del
sistema diferente a la que mencionaremos ahora.

Por norma general, estos archivos se encontrarán en /var/log.


o syslog.- Almacena información relacionada con la seguridad de la máquina,
como accesos al sistema o intentos de conexión. Se trata de un fichero de
texto plano.
o messages.- Almacena datos informativos de ciertos programas,
generalmente de baja o media importancia, tales como mensajes de
arranque, etc. También se trata de un fichero de texto plano, que podemos
visualizar con cat, por ejemplo.
o kern.log.- Almacena información enviada por el núcleo del sistema. Útil para
detectar problemas en el mismo. Es un fichero de texto plano.
o mail.*.- Registra información del servicio de correo de nuestra máquina, en
caso de que lo tengamos activo. Generalmente, estos registros se encuentran
divididos en varios archivos (mail.log, mail.err, mail.warn, mail.info).
o wtmp.- Registra cada conexión y desconexión del sistema. Se trata de un
fichero binario, por lo que para visualizar su contenido haremos uso del
comando last.
o utmp.- Registra la información de los usuarios conectados en un momento
determinado. Al igual que el archivo wtmp, se encuentra en formato binario,
por lo que para acceder a su contenido utilizaremos herramientas como last
(last -f /var/log/utmp) o who (w también nos serviría).
o astlog.- Se trata de un fichero binario que almacena la fecha y hora del
último ingreso al sistema de cada usuario. Podemos visualizar esta
información con el comando who.
o faillog.- Su cometido es similar al de lastlog, salvo que en este caso se
almacena el último intento fallido de conexión al sistema de cada usuario.
o btmp.- Realiza la misma función que faillog. Podemos visualizar su contenido
con la herramienta 'last'.
o auth.log.- En este fichero se registran las ejecuciones de la orden su, así
como las conexiones al sistema. Se trata de un fichero de texto plano.
o debug.- En este archivo se registra información de depuración de los
programas que se ejecutan en el sistema. Al igual que en el caso anterior, se
trata de un archivo de texto plano.

Ahora que conocemos algunos de los ficheros de log del sistema más importante,
sería interesante aplicar lo aprendido en el apartado de los atributos sobre los
ficheros de registro del sistema, para asegurar su integridad y confidencialidad.
MÓDULO 5.- SEGURIDAD EN LINUX
Unidad 4.- Seguridad de la subred

4.1. CONSIDERACIONES GENERALES

En esta unidad trataremos el tema de la seguridad en el aspecto de la red.


Conoceremos algunos de los ataques más frecuentes, así como mecanismos para
detectarlos y protegernos de ellos. La mayoría de los ataques existentes en la
actualidad provienen de la red (tanto desde nuestra red interna como de Internet).

Algunos consejos importantes para mantener nuestra red segura:

o Debemos ejecutar tan sólo los servicios que sean imprescindibles. Muchas
distribuciones por defecto instalan multitud de servicios que no se adaptan a
las necesidades de casi ningún grupo de usuarios. Estos servicios son posibles
puntos de acceso ilegítimo a nuestros sistemas, por lo que mientras menor
sea su número más tranquilos estaremos. Un buen lugar para empezar a
buscar sería en el directorio del runlevel por defecto que utilice nuestro
sistema Linux. En la instalación por defecto de DEBIAN, este directorio sería
/etc/rc2.d. En él encontraríamos enlaces simbólicos a los diferentes servicios
(en /etc/init.d) que queremos iniciar de forma automática al arrancar el
sistema. Es importante que sólo dejemos activos aquellos que vayan a sernos
de utilidad. Aunque no se trate de ningún servicio, y siguiendo la misma
política, debemos eliminar del sistema cualquier paquete que no vayamos a
utilizar.

o Debemos mantener siempre actualizados los paquetes que proporcionen


algún servicio (en general, sería conveniente hacerlo con todos los paquetes),
para solucionar cualquier posible vulnerabilidad que haya sido descubierta. De
igual forma, es importante que revisemos la lista de cambios del kernel, para
que procedamos a actualizarlo en caso de que dicha actualización implique
una mejora de seguridad o un posible bug.

o Debemos utilizar protocolos seguros para realizar conexiones a nuestros


sistemas. Es muy importante hacer uso de software como OpenSSH para
establecer conexiones remotas, en lugar del telnet convencional, así como de
scp (parte de ssh), en lugar de ftp en caso de que sea posible. Si por algún
motivo no quisiésemos desprendernos de nuestros protocolos tradicionales,
debemos utilizar variantes seguras de todos ellos, tales como telnet-ssl. Ssh
nos permite además de establecer conexiones remotas seguras, crear túneles
seguros para que viajen por ellos protocolos inseguros por naturaleza, como
pop o imap.

o Podemos monitorizar y restringir servicios a través de TCP wrappers. Cuando


tenemos un servicio gestionado por inetd (superservidor de internet),
podemos hacer uso de los envoltorios TCP. De esta forma, antes de trasladar
la petición al servicio en cuestión, comprobaremos si la máquina que solicita
la conexión está autorizada a hacerlo. Estos permisos se controlan en los
ficheros /etc/hosts.allow y /etc/hosts.deny. Para hacer uso de tcp wrappers
basta con modificar la línea del servicio deseado en /etc/inetd.conf de esta
forma.

(sin tcp wrappers)


telnet stream tcp nowait root /usr/bin/in.telnetd

(con tcp wrappers)


telnet stream tcp nowait root /usr/sbin/tcpd /usr/bin/in.telnetd

Reiniciando el servicio inetd aplicaríamos los cambios realizados.

o Debemos ejecutar los demonios en entornos enjaulados (chroot) cuando


estos nos lo permitan. Ejecutar un demonio en chroot significa lanzarlo en un
entorno restringido donde se encuentran todas las librerías y programas
necesarios para que realice su función. De esta forma, si por algún motivo un
atacante haciendo uso de algún fallo en el servicio consiguiese una shell a
través de él, se encontraría en un entorno en el que apenas puede causar
daños de importancia. Numerosos servicios como apache, bind, postfix, etc,
permiten ser lanzados "en una jaula".

4.2. CONFIGURANDO EL NÚCLEO

Linux tiene la gran ventaja de tener disponible el código fuente del núcleo; en
realidad, Linux propiamente dicho es sólo el núcleo. Esto nos permite la posibilidad
de crear núcleos a medida de nuestras necesidades. Y parte de nuestras necesidades
será la mejora de la seguridad.

Como el núcleo controla las características de red de su sistema, es importante que


el núcleo tenga las opciones que garanticen la seguridad y que el propio núcleo no
pueda ser comprometido. Para prevenir algunos de los últimos ataques de red, debe
intentar mantener una versión del núcleo actualizada.

A continuación veremos algunas opciones del núcleo interesantes desde el punto de


vista de la seguridad de la subred.

• IP: Drop source routed frames (CONFIG_IP_NOSR)


Esta opción debería estar activada. Source routed frames contienen la ruta completa
de sus destinos dentro del paquete. Esto significa que los enrutadores a través de los
que circula el paquete no necesitan inspeccionarlo, y sólo lo reenvían. Esto podría
ocasionar que los datos que entren a su sistema puedan ser un exploit potencial.

• IP: Firewalling (CONFIG_IP_FIREWALL)


Esta opción es necesaria si va a configurar su máquina como un cortafuegos, hacer
enmascaramiento o desea proteger su estación de trabajo con línea telefónica de que
alguien entre a través de su interfaz PPP. Con esta opción activa podremos usar el
filtrado de paquetes en el propio núcleo del sistema, decidiendo el tráfico que llega o
sale de nuestro equipo.

• IP: forwarding/gatewaying (CONFIG_IP_FORWARD)


Si activa reenvío IP (IP forwarding), su sistema Linux esencialmente se convierte en
un encaminador (router). Si su máquina está en una red, podría estar enviando
datos de una red a otra, y quizás saltándose un cortafuegos que esté puesto allí para
evitar que esto suceda. A los usuarios con un puesto aislado y conexión telefónica les
interesará desactivar esta característica. Otros usuarios deberían pensar en las
implicaciones de seguridad de hacer esto en su caso concreto. Las máquinas que
actúen como cortafuegos tendrán que activar esta característica y usarla junto al
software cortafuegos. Puede activar y desactivar el reenvío IP (IP forwarding)
dinámicamente usando el siguiente comando:

root# echo 1 > /proc/sys/net/ipv4/ip_fordward

y desactivarlo con el comando:

root# echo 1 > /proc/sys/net/ipv4/ip_fordward

Ese fichero (y muchos otros ficheros de /proc) aparecerá con longitud cero, pero en
realidad no es un fichero en el sentido clásico, sino que son datos guardados en
memoria.

• IP: firewall packet logging (CONFIG_IP_FIREWALL_VERBOSE)


Esta opción le suministra información sobre los paquetes que su cortafuegos recibe,
como
remitente, destinatario, puerto, etc. Así podremos rastrear los orígenes de los
posibles intentos de ataque.

• IP: always defragment (CONFIG_IP_ALWAYS_DEFRAG)


Generalmente esta opción está desactivada, pero si está construyendo un host
cortafuegos o para enmascaramiento, deberá activarla. Cuando se envían paquetes
de un host a otro, no siempre se envían como simples paquetes de datos, sino que
se fragmentan en varios trozos. El problema es que los números de puerto sólo se
almacenan en el primer fragmento. Esto significa que alguien puede insertar
información en el resto de los paquetes para su conexión que se supone que no
deberían estar allí.

• IP: syn cookies (CONFIG_SYN_COOKIES)


El ataque SYN es un ataque de denegación de servicio (denial of service, DoS) que
consume todos los recursos de su máquina forzando un reinicio.

4.3. ATAQUES REMOTOS

4.3.1. Escaneo de puertos

Una de las primeras acciones que un posible atacante realizará contra nosotros será
un escaneo de puertos (portscan). De él extraerá información sobre los servicios que
ofrecemos en las máquinas de nuestra red, el sistema operativo que están corriendo,
etc. Analizando que puertos están abiertos en un sistema, e investigando sobre las
versiones de los diferentes servicios, el atacante podrá buscar fallos de seguridad
para penetrar a través de ellos. Por tanto, cada servicio que ofrezcamos es una
puerta potencial de entrada a nuestras máquinas.

A continuación veremos un escaneo simple con la herramienta nmap.


Nmap es el mejor programa de escaneado de puertos que existe actualmente.
Incorpora bastantes más funcionalidades, como detectar el sistema operativo
remoto, realizar identificación RPC y barridos de pings. Nmap puede realizar
prácticamente todos los tipos de escaneados utilizados o implementados por otros
programas. Implementa desde un método sencillo de conexión TCP completa (una
negociación inicial de tres fases y el cierre de la conexión), varios modos silenciosos
utilizando paquetes IP planos, e incluso un escaneado por rebote de ftp.
4.3.2. Negaciones de servicio (DOS)

Los ataques que anulan la capacidad de un sistema de utilizar los recursos de una
red se denominan normalmente ataques de denegación de servicio (DOS - Denial of
Service). Los ataques DOS se utilizan normalmente para abusar de ciertos
ciudadanos de Internet, para detener el tráfico y el comercio en las sedes web de
ciertas empresas o para evitar la presencia en la red de ciertas máquinas que un
atacante puede querer suplantar.

Existen multitud de ataques de denegación de servicio, entre los que podemos


destacar:

− Ataques de denegación de servicio al núcleo


− Ataques de denegación de servicio a demonios concretos (http, ftp, smtp,
etc)
− Inundaciones ICMP, SYN, UDP
− Ataques distribuidos de denegación de servicio (ddos)
− Ataques por agotamiento de recursos locales

En general, podemos decir que los ataques de denegación de servicio (dos y ddos)
son situaciones desastrosas. No se basan en la existencia de ningún programa
erróneo, por lo que cualquier sistema es objetivo potencial de este tipo de ataques.
Se trata simplemente de un acaparativo de recursos entre el objetivo y el atacante.
No es posible detenerlo, sino tan sólo mitigar sus efectos.

Para tratar de evitar en la medida de lo posible que esto suceda, no debemos


olvidar:
− Mantener nuestro núcleo al día, actualizándolo cada vez que la nueva
versión incorpore
correcciones de fallos de seguridad.
− Mantener actualizadas nuestras aplicaciones, especialmente los demonios
encargados de gestionar los servicios que ofrecemos.
− Establecer límites en las aplicaciones (conexiones, peticiones, etc)
− Permitir sólo el tráfico que sea necesario, denegando por defecto todo.
− Establecer restricciones mediante limits.conf
− Establecer cuotas de uso de disco siempre que sea posible
− Establecer un control avanzado del tráfico mediante el núcleo

4.3.3. Sniffing

Los analizadores de paquete son herramientas muy utilizadas una vez que han
conseguido acceder a nuestros sistemas, ya que una vez dentro y con la ayuda de
alguno de estos programas, pueden mejorar su nivel de acceso si consiguen capturar
nombres de usuarios y contraseñas de otros sistemas. Estas herramientas son, sin
duda, las más utilizadas para comprometer sistemas.

Entre las numerosas aplicaciones que existen para este propósito podemos destacar
el paquete dsniff, que nos facilita el filtrado del tráfico, para mostrarnos
directamente los datos que probablemente busquemos, como correos electrónicos,
contraseñas y nombres de usuario, urls, etc., y ethereal, una analizador de tráfico
muy potente que nos permite visualizar las tramas en tiempo real. En el último tema
se detallan algunas de estas herramientas, y otras que no mencionamos aquí, como
tcpdump, el padre de todos los sniffers.

Una forma de dificultar esta sencilla obtención de información sería empleando en


nuestra red switches, en lugar de concentradores. Los switchs trabajan de forma
diferente a los hubs, enviando la información únicamente a su destinatario, por lo
que aunque un usuario establezca su interfaz en modo promiscuo, tan sólo recibirá la
información que vaya destinada a él. Pero como hemos visto en otras situaciones,
esto sólo dificultará la labor del atacante, sin obstruirla por completo. Este podría
recurrir a otra técnica, como el falseamiento ARP para hacer creer a su víctima que
la dirección física del gateway, por ejemplo, ha cambiado y ahora es él. De está
forma (previa activación del reenvío de paquetes en su núcleo) toda la información
que la víctima enviase a través de la puerta de enlace, pasaría ahora a través del
atacante, pudiendo capturarla fácilmente. Existen aplicaciones muy potentes, como
ettercap, que nos permiten realizar esto de una forma muy sencilla.
Como podemos observar, capturar tráfico es una de las vías más interesantes para
obtener información sensible. Por ello, la mejor forma de evitar este tipo de
situaciones es no transmitiendo datos de importancia en claro, ni haciendo uso de
protocolos que permitan autenticación no encriptada, como telnet o ftp. En lugar de
ello, debemos utilizar alternativas más seguras como ssh, que nos proporcionan
seguridad a través de una fuerte encriptación, o envoltorios seguros como stunnel,
que nos ofrecen la posibilidad de cifrar protocolos inseguros por naturaleza.

4.4. SISTEMAS DE DETECCIÓN DE INTRUSOS

Un IDS o Sistema de Detección de Intrusiones es una herramienta de seguridad que


intenta detectar o monitorizar los eventos ocurridos en un determinado sistema
informático o red informática en busca de intentos de comprometer la seguridad de
dicho sistema.

− Los IDS buscan patrones previamente definidos que impliquen cualquier


tipo de actividad sospechosa o maliciosa sobre nuestra red o host.
− Los IDS aportan a nuestra seguridad una capacidad de prevención y de
alerta anticipada ante cualquier actividad sospechosa. No están diseñados
para detener un ataque, aunque sí pueden generar ciertos tipos de respuesta
ante éstos.

− Los IDS aumentan la seguridad de nuestro sistema, vigilan el tráfico de


nuestra red, examinan los paquetes analizándolos en busca de datos
sospechosos y detectan las primeras fases de cualquier ataque como pueden
ser el análisis de nuestra red, barrido de puertos, etc. Podemos clasificarlos
básicamente en dos tipos:

− Sistemas de detección de intrusos de host (o máquina)


Protegen a un único equipo. Monitorizan gran cantidad de eventos, analizando
actividades con una gran precisión determinando de esta manera qué
procesos y usuarios se involucran en una acción. Recaban información del
sistema para su posterior análisis, intentando encontrar cualquier indicio de
actividad sospechosa.

− Sistemas de detección de intrusos de red Protege un sistema basado en


red. Actúan sobre una red capturando y analizando paquetes de red, es decir,
son sniffers del tráfico de red. Luego analizan los paquetes capturados,
buscando patrones que supongan algún tipo de ataque. Analizan el tráfico de
red, normalmente, en tiempo real. No sólo trabajan a nivel TCP/IP, también lo
pueden hacer a nivel de aplicación.

Algunos de los sistemas de detección de intrusos existentes tienen la capacidad


incluso de emprender acciones en caso de detección de un posible ataque (lo que
puede resultar peligroso en el caso de falsos positivos), mientras que otros se limitan
a registrar todo posible indicio de ataque.

Entre los sistemas de detección de intrusos disponibles en el mercado para Linux,


debemos destacar Snort.
Snort es un IDS o Sistema de detección de intrusiones basado en red (NIDS).
Implementa un motor de detección de ataques y barrido de puertos que permite
registrar, alertar y responder ante cualquier anomalía previamente definida como
patrones que corresponden a ataques, barridos, intentos de aprovechar alguna
vulnerabilidad, análisis de protocolos, etc conocidos. Todo esto en tiempo real.

Snort está disponible bajo licencia GPL, gratuito y funciona bajo plataformas
UNIX/Linux (también bajo Windows). Es uno de los más usados y dispone de una
gran cantidad de filtros o patrones ya predefinidos, así como actualizaciones
constantes ante casos de ataques, barridos o vulnerabilidades que vayan siendo
detectadas a través de los distintos boletines de seguridad.

Este IDS implementa un lenguaje de creación de reglas flexibles, potente y sencillo.


Durante su instalación ya nos provee de cientos de filtros o reglas para backdoor,
ddos, finger, ftp, ataques web, CGI, escaneos Nmap...

Puede funcionar como sniffer (podemos ver en consola y en tiempo real qué ocurre
en nuestra red, todo nuestro tráfico), registro de paquetes (permite guardar en un
archivo los logs para su posterior análisis, un análisis offline) o como un IDS normal
(en este caso NIDS).

Revisar los registros del sistema de detección de intrusos puede ser una tarea muy
laboriosa (sobre todo por la posible aparición de falsos positivos), pero que debemos
realizar, ya que de lo contrario el IDS perderá toda su eficacia y funcionalidad. No
debemos olvidar que una alerta a tiempo puede evitarnos sufrir los efectos de un
ataque importante.

4.5. CORTAFUEGOS

Podemos decir que un cortafuegos es un sistema o grupo de sistemas que hace


cumplir una política de control de acceso entre dos redes. De una forma más clara,
podemos definir un cortafuegos como cualquier sistema utilizado para separar, en lo
que a seguridad se refiere, una máquina o subred del resto, protegiéndola así de
servicios y protocolos que desde el exterior puedan suponer una amenaza a la
seguridad.

En este apartado introduciremos algunos conceptos básicos sobre cortafuegos, y


sobre los distintos mecanismos que nos ofrece el sistema operativo Linux para
implementarlos en nuestra red.

4.5.1. Componentes de un cortafuegos

En todo cortafuegos existen tres componentes básicos para los que debemos implementar
mecanismos: el filtrado de paquetes, los proxies de aplicación y la monitorización y
detección de actividad sospechosa.
4.5.1.1. El filtrado de paquetes

El funcionamiento del filtrado de paquetes es muy sencillo. Básicamente consiste en


analizar la cabecera de cada paquete y aceptarlo o rechazarlo según unas reglas
predefinidas que hayamos establecido.

En las versiones 2.4 del kernel de Linux, el sistema netfilter y la herramienta iptables
se encargan de realizar esta tarea (anteriormente lo hacían ipfwadm e ipchains, en
los núcleos de las series 2.0 y 2.2, respectivamente). En el apartado siguiente lo
comentaremos con mayor profundidad.

Veamos la siguiente tabla de reglas sencilla:

Origen Destino Servicio Acción

192.168.0.0 * 80 (HTTP), 21 Aceptar


(FTP)
192.168.0.25 192.168.20.20 22 (SSH) Aceptar

192.168.1.0 * * Denegar

Según esta tabla de reglas, nuestro cortafuegos permitiría ser atravesado por
paquetes provenientes de la red 192.168.0.0 cuyo puerto de destino fuese el 80 o el
21, así como paquetes cuya dirección de origen fuese 192.168.0.25 y destino
192.168.20.20, haciendo uso del puerto 22 (una posible administración remota?), y
denegaría cualquier paquete cuya dirección de origen fuese 192.168.1.0.

¿Qué sucedería, por ejemplo, si llegase algún paquete que no coincidiese con
ninguna de nuestras reglas? En ese caso entraría en juego la política por defecto. En
la mayoría de los casos es recomendable una política de denegación por defecto, es
decir, denegar todo excepto lo que esté explícitamente permitido. Aunque en muchas
situaciones nos encontramos con cortafuegos que permiten todo el tráfico excepto
parte que desean limitar.

Uno de los principales puntos débiles del filtrado de paquetes es que únicamente se
basan en los datos de paquete para tomar decisiones. No comprenden que
información transmite el paquete, ni si realmente se trata del tipo de transmisión
que parece ser. Por tanto, no pueden determinar la validez de su contenido.

Imaginemos que en nuestra empresa únicamente disponemos de acceso a la red a


través del puerto 80 (únicamente nos permiten acceder a contenido web), pero
nosotros deseamos conectarnos de forma remota a nuestra casa con ssh para ojear
cómo están nuestras máquinas. Si el administrador tan sólo hubiese instalado un
sistema de filtrado de paquetes, no tendríamos más que situar nuestro servicio ssh
en el puerto 80, en lugar del 22 por defecto, y podríamos conectarnos sin ningún
problema. De igual forma, una vez establecida esta conexión, mediante la
maravillosa redirección de puertos que nos ofrece ssh podríamos acceder a cualquier
otro servicio.
Una forma de ayudar al sistema de filtrado de paquetes, y evitar muchas de estas
situaciones es a través de proxies de aplicación. A continuación veremos como
funcionan.

4.5.1.2. El proxy de aplicación

Además del filtrado de paquetes, es habitual que los cortafuegos utilicen aplicaciones
para reenviar o bloquear conexiones a servicios como http, ftp, telnet, etc. A estas
aplicaciones capaces de filtrar conexiones a servicios determinados se les denomina
proxies, mientras que la máquina donde se ejecutan se llama pasarela de aplicación.

Los proxies poseen una serie de ventajas de cara a incrementar nuestra seguridad.
En primer lugar, permiten únicamente la utilización de servicios para los que exista
un proxy. La segunda ventaja es que en el filtrado podemos basarnos en algo más
que en la cabecera de los paquetes, lo que hace posible, por ejemplo, tener filtrado
el servicio FTP con órdenes restringidas, de forma que nadie subiese archivos a
nuestro servidor. También podemos evitar problemas como el que señalamos en el
punto anterior de la conexión ssh a nuestra casa. En este caso, el proxy detectaría
que aunque el tráfico circula por el puerto correspondiente al servicio web, no
corresponde a una conversación en el protocolo HTTP válida, y la descartaría. Por
supuesto seguiría siendo posible saltarnos esta barrera de seguridad, tunelando esta
vez nuestra conexión a través de HTTP. De esta forma, el proxy de aplicación
pensaría que se trata de simples peticiones http estándar, y no sospecharía de
nuestro tráfico. La herramienta libre httptunnel nos permite hacer esto con mucha
comodidad.

Aunque hemos visto que nuestro cortafuegos aún es vulnerable en algunos aspectos,
con la puesta en marcha de los proxies de aplicación lo hemos hecho más robusto y
seguro ante la gran mayoría de atacantes.

Quizá una de las mayores desventajas de este mecanismo es que no existen proxies
para todos los protocolos de red que conocemos, lo que hace que en muchos casos
no podamos hacer uso de ellos.

4.5.1.3. Monitorización

Monitorizar la actividad de nuestro cortafuegos es algo vital para la seguridad de


nuestros sistemas. Con ella obtendremos información valiosa de posibles intentos de
ataque, datos de los atacantes, posibles puntos débiles en nuestros firewalls, etc.

Como veremos en el punto siguiente, iptables nos permite registrar la actividad que
deseemos en cualquiera de sus reglas, de una forma intuitiva, para que
posteriormente puedan ser revisadas cómodamente por el administrador.

4.5.2. Netfilter e iptables

En Linux, el filtrado de paquetes está programado en el núcleo (bien como módulo o


estáticamente), y se llama netfilter. Adicionalmente disponemos de la herramienta
iptables para interactuar con las reglas cuanto necesitemos. Entre las principales
características de netfilter, podemos destacar:
− Filtrado de paquetes "stateless" en las versiones 4 y 6 de IP.
− Filtrado de paquetes "statefull" en IP v4.
− Nos permite realizar todas los tipos de traducciones de direcciones de red y
puertos
(NAT/NAPT).
− Esta estructurado de una forma escalable y flexible.
− Dispone de un gran número de plugins que incrementan sus funcionalidades.
− Manejo avanzado de paquetes.

Para poder hacer uso del filtrado de paquetes, deberemos previamente habilitar el
soporte en el núcleo, bien sea estáticamente o a través de módulos.
Una vez que hayamos añadido el soporte a nuestro kernel, podremos comenzar con
el filtrado de paquetes. Como vimos anteriormente, la herramienta iptables se
comunica con el núcleo y le dice qué paquetes filtrar. De esta forma controlaremos el
filtrado de paquetes. Iptables inserta y elimina reglas de la tabla de filtrado del
núcleo. Esto quiere decir que cualquier cosa que establezca se perderá cuando se
inicie. Puede hacer "permanentes" estas reglas de dos formas:

− Haciendo uso de las herramientas iptables-save e iptables-restore.


− Escribiendo un script que se lance al inicio del sistema con las reglas que desea.

Nosotros utilizaremos el último método.

4.5.2.1. Cómo pasan los paquetes por los filtros

El núcleo empieza con tres listas de reglas en la tabla de filtros. Llamaremos a estas
listas cadenas. Se llaman INPUT, OUTPUT y FORWARD.
Los tres círculos de la figura representan las tres cadenas que mencionamos arriba.
Cuando un paquete alcanza un círculo en el diagrama, se examina esa cadena para
decidir la suerte del paquete. Si la cadena dice que hay que descartar (DROP) el
paquete, se destruye ahí mismo, pero si la cadena dice que hay que aceptarlo
(ACCEPT), continúa su camino por el diagrama.

Como hemos visto, una cadena es una lista de reglas. Cada regla dice "si el paquete
se parece a esto, entonces esto otro es lo que hay que hacer con él". Si la regla no
se ajusta al paquete se consulta la siguiente regla en la lista. Al final, si no hay más
reglas por consultar, el núcleo mira la política de la cadena para decidir qué hacer.
En un sistema consciente de la seguridad, esta política suele decirle al núcleo que
descarte (DROP) el paquete.

Resumiendo, el proceso de la figura sería el siguiente:

− Cuando llega un paquete (digamos, por la tarjeta ethernet) el núcleo mira primero
su destino.Este proceso se conoce como enrutamiento.
− Si está destinado a esa misma máquina, el paquete entra en el diagrama hacia la
cadena
INPUT. Si pasa de aquí, cualquier proceso que esté esperando el paquete lo recibirá.
− En caso de que nuestra máquina no sea el destinatario, si el núcleo no tiene las
capacidades de reenvío activadas, o no sabe hacia donde reenviar el paquete, lo
descartará. Si está activado el reenvío, y el paquete está destinado a otra interfaz de
red (de existir otra), entonces el paquete pasa directamente a la cadena FORWARD
de nuestro diagrama. En ese punto, si es aceptado, saldrá de la máquina.
− Por otro lado, los paquetes que envíen programas que se ejecuten en nuestra
máquina pasarán directamente por la cadena OUTPUT. Si son aceptados, continuarán
su camino hasta su destino.
4.5.2.2. Manejo de iptables

Con iptables se pueden realizar muchas operaciones. A continuación vamos a


detallar algunas de las operaciones que se pueden hacer sobre cadenas.
− Crear una nueva cadena (-N)
− Borrar una cadena vacía (-X)
− Cambiar la política de una cadena de uso interno (-P)
− Listar las reglas de una cadena (-L)
− Vaciar de reglas una cadena (-F)
− Poner a cero los contadores de paquetes y bytes de todas las reglas de una
cadena (-Z)

Con iptables también podemos manipular las reglas de una cadena:


− Añadir una nueva regla a una cadena (-A)
− Insertar una nueva regla en alguna posición de la cadena (-I)
− Mover una regla a otra posición dentro de una cadena (-R)
− Borrar una regla de un sitio en particular de una cadena (-D)
− Borrar la primera regla que coincida con los parámetros dados en una
cadena (-D)

Para mayor información, se puede consultar la página man de iptables.


A continuación, veremos algunos ejemplos de manipulación de reglas haciendo uso
de algunas de las operaciones que hemos visto. Además aprenderemos algunos
métodos para ser más específicos a la hora de realizar el filtrado de paquetes, y de
esta forma crear reglas más exactas que se ajusten a nuestras necesidades:

A) Operaciones sobre una sola regla


La manipulación de reglas será una de las tareas más habituales que realicemos. Lo
más común es que usemos las órdenes de agregar (-A) y eliminar (-D).

Cada regla específica, un conjunto de condiciones que debe cumplir el paquete, y


qué hacer si se ajusta a ella (un objetivo). Por ejemplo, podríamos querer descartar
todos los paquetes ICMP que viniesen de la dirección IP 127.0.0.1. Nuestro objetivo
será por tanto DROP. La siguiente captura ilustra el proceso.

En la imagen podemos ver como el primer ping tuvo éxito. Entonces añadimos la
siguiente regla:

iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP

Descripción. Añadimos (-A) a la cadena "INPUT", una regla que especifica que los
paquetes que vengan de 127.0.0.1 (-s 127.0.0.1) con protocolo ICMP (-p icmp) sean
descartados (-j DROP).

Una vez añadida la regla probamos de nuevo a hacer el ping y observamos como el
paquete no llega a su destino (100% packet loss). Ahora podemos eliminar la regla
de dos formas: mediante su número (sabemos que es la 1 porque es la única que
hay), o repitiendo la orden, pero en lugar de utilizar "-A" (añadir), haciendo uso de
"-D" (eliminar). De existir varias reglas idénticas sólo se borraría la primera.
Podemos observar en la imagen como la regla ha desaparecido de la cadena
predefinida INPUT. Como hemos comentado, iptables nos permite añadir nuevas
cadenas definidas por nosotros. Pues bien, estas pueden sernos de mucha utilidad a
la hora de especificar un objetivo, ya que iptables nos permite establecer como
objetivo de una regla otra cadena. Una vez que se hayan recorrido todas las reglas
de la nueva cadena objetivo sin que exista coincidencia con el paquete en cuestión,
se retorna de nuevo el control a la cadena que la invocó.

Además de los objetivos DROP (denegar) y ACCEPT (aceptar), existen otros dos que
vienen de serie con el sistema: RETURN Y QUEUE.

RETURN tiene el mismo efecto que si hubiésemos llegado al final de la cadena como
comentamos en el párrafo anterior (si la regla estaba en una cadena de las que hay
por defecto se ejecutaría la política de la cadena).

QUEUE es un objetivo especial que pasa el paquete a una cola destinada al


procesamiento en espacio de usuario. Es decir, con el objetivo QUEUE podemos
enviar los paquetes que filtremos a otra aplicación que designemos para que sean
procesados (un detector de intrusos quizá).

B) Especificaciones de filtrado
Hasta ahora hemos usado "-p" para especificar el protocolo, y "-s" para la dirección
de origen. Pero podemos usar otras opciones para especificar las características de
los paquetes.

Direcciones IP de origen y destino


Las direcciones IP de origen (-s,--source,--src) y destino (-d,--destination,--dst) se
pueden especificar de varias maneras. La más común sería utilizar el nombre
completo, tal como "localhost" o "www.google.com". Otra forma sería especificando
directamente las direcciones IP de estas máquinas.

Además de especificar direcciones de hosts concretos, podemos describir grupos de


direcciones, como 195.85.38.0/24 o 195.85.38.0/255.255.255.0. Ambas especifican
cualquier dirección IP entre 195.85.38.0
y 195.85.38.255.

Especificar una inversión


Podemos negar en cualquier momento cualquier indicador, precediéndolo con el
símbolo "!". Por ejemplo, -s ! localhost coincidiría con cualquier paquete que no
venga de localhost.
Especificar el protocolo
Se puede especificar el protocolo con el especificador "-p" o "--protocol". El protocolo
puede ser un número (si conoce los valores numéricos) o un nombre en el caso
especial de TCP, UDP, ICMP. No importa si lo ponemos en mayúsculas o minúsculas.
El nombre del protocolo puede ir precedido de un símbolo de admiración "!", para
invertirlo, de manera que "-p ! TCP" especifica paquetes que no sean TCP.

Especificar la interfaz
Las opciones "-i" (--in-interface) o "-o" (--out-interface) especifican el nombre de la
interfaz de red con la que coincidir. Una interfaz es el dispositivo físico por el que
entra (-i) o sale (-o) un paquete. Con el comando ifconfig podemos obtener una lista
de las interfaces de red que tenemos "levantadas" en nuestro sistema. Los paquetes
que pasan por la cadena INPUT no tienen interfaz de salida, con lo que nunca se
activará una regla de esta cadena que use "-o". De forma similar, los paquetes que
atraviesan OUTPUT no tienen interfaz de entrada, de manera que ninguna regla que
use "-i" en esta cadena funcionará.

C) Extensiones a iptables: nuevas coincidencias y objetivos


Iptables es extensible, lo que quiere decir que se pueden extender tanto el núcleo
como la herramienta iptables para proporcionar nuevas características.

Extensiones TCP
Las extensiones TCP se cargan de forma automática si se especifica "-p tcp". Esto
nos proporcionaría las siguientes opciones:

--tcp-flags

Nos permite filtrar dependiendo de que ciertos indicadores TCP estén activos o no.
A veces puede sernos útil permitir conexiones TCP en una dirección, pero no en la
otra. Por ejemplo, puede que quiera permitir conexiones a un servidor www externo,
pero no desde ese mismo servidor. La solución del inexperto sería bloquear los
paquetes TCP que salgan del servidor. Desafortunadamente, las conexiones TCP
precisan que los paquetes fluyan en ambas direcciones para poder funcionar. La
solución sería bloquear sólo los paquetes que pretendan establecer una conexión.
Estos reciben el nombre de paquetes SYN (SYN activo y ACK y FIN inactivos).
Rechazando estos paquetes podemos detener intentos de conexión en su inicio.

--source-port,--sport

Nos permite especificar un puerto o rango de puertos. Estos pueden estar


representados por su nombre tal como aparecen en /etc/services o de forma
numérica. Al igual que con las otras opciones, podemos utilizar la negación.

--destination-port,--dport

Igual que el caso anterior, salvo que en este el puerto por el que filtramos es el de
destino en lugar del puerto origen.
Extensiones UDP
Nos proporcionan las opciones --source-port y --destination-port que vimos en las
extensiones TCP. Al igual que en el caso anterior, se cargan de forma automática al
invocar a "-p udp".
Extensiones ICMP
Nos proporciona una opción nueva, que se carga al especificar "-p icmp".
--icmp-type

Nos permite elegir el tipo de paquete icmp de que se trata. Podemos ver una lista de
los tipos icmp disponibles utilizando "-p icmp --help".

Otras extensiones de coincidencia


Además de las extensiones que hemos visto existen otras, aunque para poder hacer
uso de ellas tendremos que haber cargado su módulo correspondiente. De ellas
podemos destacar las siguientes:

Mac

Este módulo debe ser especificado de forma explícita con "-m mac" o "--match mac".
Se utiliza para coincidencias en las direcciones físicas (mac) de los paquetes
entrantes, y por tanto sólo son útiles para los paquetes que pasan por las cadenas
PREROUTING (no hemos mencionado su significado, ya que corresponde al sistema
NAT que no tiene cabida en nuestro texto) e INPUT. Proporciona sólo una opción:

--mac-source. Especifica la dirección por la que queremos filtrar, en formato


hexadecimal
separando los elementos por ":". Además de las coincidencias con direcciones MAC,
existen otras interesantes como "limit", útil para restringir la tasa de coincidencias de
una regla, "owner", útil para restringir paquetes creados localmente, etc.

Nuevos objetivos
Además de los objetivos existentes por defecto, podemos hacer uso de otros
extendidos, siempre que hayamos compilado los módulos necesarios. Los más
importantes son:
LOG

Este módulo nos permite registrar coincidencias en cada una de las reglas en la que
lo establezcamos. Nos proporciona estas opciones adicionales:

--log-level: seguido de un número o nombre de nivel. Estos niveles coinciden con los
utilizados por el demonio syslogd (consulte la página del manual de syslog.conf para
más información).

--log-prefix: seguido de una cadena de hasta treinta caracteres, que corresponden a


un texto que se añadirá ante cada registro, permitiendo que sean identificados
unívocamente, y fácilmente reconocibles.

REJECT
Este módulo tiene el mismo efecto que DROP, excepto que al remitente se le envía
un mensaje de error ICMP "port unreachable".

4.5.3. Firewall Builder

Es una herramienta gráfica de configuración y gestión de cortafuegos gratuita muy


potente, que dispone de compiladores de reglas para diversos sistemas de
cortafuegos. En la actualidad soporta iptables, ipfilter, OpenBSD PF y Cisco PIX.
Puede generar ficheros de configuración para cualquiera de estos cortafuegos a partir
de una misma configuración a través de la interfaz gráfica, lo que puede sernos de
gran utilidad en el caso de que migremos de cortafuegos.

El uso de esta herramienta no es necesario para poner en marcha nuestro


cortafuegos. Pero hemos de tener en cuenta que en cuanto tengamos montado un
cortafuegos medianamente complejo tendremos decenas (incluso cientos) de reglas,
y su mantenimiento puede ser complejo, pueden darse casos de solapamiento entre
algunas, etc. Por tanto, disponer de una herramienta gráfica de esta calidad puede
ser vital para controlar sus cortafuegos de una forma eficiente y productiva.

4.5.4. Shorewall

Se trata de otra herramienta de utilidad para configurar netfilter de una forma más
cómoda. A diferencia de firewall builder, shorewall sólo gestiona la configuración de
netfilter/iptables, y no dispone de soporte para otros cortafuegos.

Shorewall gestiona la configuración de iptables en archivos de configuración propios,


más cómodos de trabajar que las tradicionales reglas escritas a mano. Además
dispone de ficheros de configuración predeterminados para distintas situaciones,
facilitando así la puesta en marcha de su cortafuegos a un usuario inexperto.

Indistintamente del sistema que elijamos para gestionar nuestro cortafuegos, es muy
importante que conozcamos el comando iptables y sus posibilidades, ya que puede
ser necesario que nos enfrentemos a algún problema que requiera modificar algo a
mano, o la escritura de una nueva regla, y no tengamos a nuestro alcance nuestra
querida herramienta que tanto nos alivia el trabajo a diario.

4.6. SEGURIDAD EN REDES INALÁMBRICAS

Actualmente, es posible equipar nuestras máquinas con tarjetas de red inalámbricas


que se comuniquen con puntos de acceso (AP - Access points). Los puntos de acceso
son dispositivos hardware que son capaces de conectar múltiples nodos inalámbricos
a una red de cable existente, o incluso a un acceso telefónico. Estos sistemas pueden
trabajar de dos modos: haciendo NAT (network address translation) o actuando
como puentes (bridges). Su funcionalidad es lo suficientemente amplia como para
poder configurarlos de acuerdo a nuestras necesidades. También es posible
configurar las redes inalámbricas en modo ad-hoc, en el cual todas las máquinas
hablan de igual a igual, sin necesidad de un punto de acceso.

Las redes inalámbricas nos proporcionan una gran comodidad a la hora de ponerlas
en marcha, ya que nos ahorramos el proceso de cableado, instalación de switchs,
etc. Además otorgan a nuestros usuarios cierta movilidad a la hora de acceder a los
recursos de red, permitiendo accesos desde cualquier parte de nuestra oficina, por
ejemplo, llevando nuestro equipo portátil a cuestas (o quizá un pocket pc). Pero
todas estas ventajas tenían que provocar algún problema en la seguridad de
nuestros sistemas. En estas redes, no existe la limitación física de tener que estar
conectado mediante cables a nuestra red para formar parte de ella, sino que
cualquier posible atacante no tiene más que acercarse lo suficiente al punto de
acceso para situarse en una posición privilegiada de ataque, y comenzar a capturar
nuestro tráfico como si de una red de cable convencional se tratara. La información
de la red comienza a peligrar.

Una de las barreras más simples que podemos interponer para evitar que cualquier
usuario se conecte a nuestra red es filtrar los equipos que tienen permiso para ello a
través de su dirección física. De esta forma evitaremos que alguien que pasee cerca
de nuestro entorno se encuentre directamente en nuestra red sin necesidad de
haberse molestado. Esta medida es sencilla, y hasta cierto punto bastante débil, ya
que bastaría con que un posible atacante conociese alguna de las direcciones MAC
autorizadas para sustituirla por la suya. Realizar esto en Linux es muy sencillo, a
través del comando ifconfig, o mediante la utilidad macchanger.

Otra forma de proteger nuestra red inalámbrica sería haciendo uso del algoritmo
WEP (gíreles equivalent privacy). Este protocolo utiliza RC4, un potente algoritmo
que cifra todas las comunicaciones existentes entre los clientes y el punto de acceso.
Debemos configurar nuestros puntos de acceso para que hagan uso de WEP, y
generar una clave de cifrado aleatoria. Posteriormente tendremos que programas los
clientes para que hagan uso igualmente de WEP, con la clave que generamos
anteriormente.

Aunque supone una medida de seguridad interesante, existen aplicaciones capaces


de analizar el tráfico capturado, y obtener la clave a partir de dicho análisis. Una
aplicación muy interesante para cometer esta tarea sería airsnort. Tiene una interfaz
gráfica de fácil manejo, y es capaz de obtener la clave WEP de una red tras analizar
de cinco a diez millones de paquetes (en una red con un trafico medio puede
suponer unas cinco horas).
Para evitar los riesgos que suponen las redes inalámbricas, lo mejor es implementar
nuestras propias medidas de seguridad y obviar las que nos ofrece el protocolo
802.11. La mejor forma de conseguir esto sería hacer que nuestra red inalámbrica se
encontrase en un segmento totalmente aislado y permitir únicamente comunicarse
con ella a través de una VPN.

Existen numerosas implementaciones VPN para nuestros sistemas Linux, como


IPSec, PPTP, etc, además de crear túneles seguros sobre canales SSH o SSL.
MÓDULO 5.- SEGURIDAD EN LINUX
Unidad 5.- Algunas herramientas importantes

5.1. HERRAMIENTAS ÚTILES EN EL CAMPO DE LA SEGURIDAD Y


LAS REDES

A continuación vamos a comentar algunas herramientas que nos serán de gran


ayuda para investigar en el campo de la seguridad de redes, y conocer cómo y de
qué protegernos ante eventuales ataques. La mayoría de estas herramientas son de
libre distribución, por lo que no deberíamos tener problemas en encontrarlas, y en la
mayoría de los casos vendrán incluidas en los CDS de nuestra distribución Linux.
Otras por el contrario son herramientas comerciales que deberemos pagar
previamente para hacer uso de ellas. De igual forma las comentaremos para que
sepamos de su existencia y sus utilidades.

Muchas de estas herramientas pueden ser utilizadas para realizar daños a otros
sistemas/redes, lo cuál quedaría bajo su única y exclusiva responsabilidad. Nuestro
objetivo es conocer los límites de los ataques a redes, las herramientas utilizadas por
los atacantes, para conocer cómo defendernos y descubrir posibles fallos en nuestros
sistemas. Pasando de ese punto se encontrará sólo.

5.2.- Herramientas libres

Nmap. Es una herramienta libre diseñada para explorar y realizar auditorías de


seguridad en una red de computadoras. Fue diseñada para explorar rápidamente
grandes redes, aunque también funciona bien sobre un solo ordenador. Nmap usa
los paquetes IP para determinar qué ordenadores están disponibles en la red, qué
servicios (puertos) están ofreciendo, qué sistemas operativos (y que versión) están
corriendo, qué tipo de filtros o muros de seguridad se esta usando, y docenas de
otras características. Nmap corre sobre la mayoría de las plataformas, tanto en la
versión gráfica como en la de líneas de comando. Nmap es un programa gratuito,
con el código fuente disponible, que cumple con la licencia GNU GPL.

1
Nessus. Es el detector de vulnerabilidades "Open Source" más popular. Nos permite
realizar escaneos remotos en busca de posibles fallos sobre una máquina o red
completa. Es posible ejecutarlo casi sobre cualquier sistema UNIX. Está basado en
plugins, lo que hace que incrementar sus funcionalidades sea una tarea
relativamente sencilla. Dispone de una interfaz gráfica basada en gtk, que nos
permite generar informes en diferentes formatos, como HTML, XML, LaTeX, texto
plano, etc. Además de realizar miles de comprobaciones sobre posibles fallos de
seguridad, nos sugiere posibles soluciones a los problemas encontrados.

2
Ethereal. Es un analizador de protocolos de red libre para sistemas Unix y Windows.
Nos permite "esnifar" datos de una red en tiempo real, o de un archivo de captura
almacenado en disco. Podemos examinar interactivamente la información capturada,
viendo detalladamente cada paquete. Ethereal es una herramienta muy potente,
incluyendo un lenguaje para filtrar la información que nos interese, y la habilidad de
mostrar el flujo reconstruido de una sesión TCP. Incluye una versión de texto
llamada tethereal.

3
Snort. Es un completo sistema de detección de intrusos de red capaz de realizar
análisis de tráfico en tiempo real y registrar lo que deseemos. Puede realizar análisis
de protocolos, búsqueda/identificación de contenido, y ser utilizado para detectar
una gran variedad de ataques y pruebas, como buffer overflows, escaneos
indetectables de puertos (stealth port scans), ataques a CGI, pruebas de SMB,
intentos de reconocimiento de sistemas operativos (OS fingerprinting), y mucho
más. Snort utiliza un lenguaje flexible basado en reglas para seleccionar el tráfico
que debe recolectar o dejar pasar, y un motor de detección modular.

Netcat. La navaja suiza para redes. Una utilidad simple pero potente, que lee y
escribe datos a través de conexiones de red usando los protocolos TCP o UDP. Es una
herramienta rica en características, útil para depurar y explorar, ya que puede crear
casi cualquier tipo de conexión que podamos necesitar.
TCPDump. El sniffer clásico para monitorización de redes y adquisición de
información. Tcpdump es un analizador de paquetes de red basado en texto. Puede
ser utilizado para mostrar los encabezados de los paquetes en una interfaz de red
que cumplan la expresión de búsqueda que especifiquemos. Podemos hacer uso de

4
esta herramienta para rastrear problemas en la red o para monitorizar actividades de
la misma. Existe una versión para windows, llamada Windump. Tcpdump es la fuente
de las bibliotecas de capturas de paquetes Libpcap y Winpcap que son utilizadas por
nmap (más adelante hablaremos de ella) y muchas otras utilidades.

Hping2. Se trata de una herramienta similar al tradicional ping, pero con


características añadidas. Hping2 ensambla y envía paquetes ICMP/UDP/TCP hechos a
medida, mostrándonos las respuestas. También dispone de un modo traceroute
bastante útil, y soporta fragmentación IP. Esta herramienta es particularmente útil al
tratar de utilizar funciones como las de traceroute/ping, o analizar hosts detrás de un
cortafuegos, que generalmente bloqueará los intentos realizados por las
herramientas tradicionales.

Dsniff. Es un conjunto de poderosas herramientas de gran utilidad para obtener


información del tráfico de la red. Este popular y bien diseñado set escrito por Dug
Song incluye las utilidades: dniff, filesnarf, mailsnarf, msgsnarf, urlsnarf y webspy,
para monitorizar pasivamente la red en busca de datos interesantes (contraseñas,
emails, archivos, urls). Adicionalmente incluye las herramientas arpspoof, dnsspoof y
macof, que nos facilitarán la interceptación de información en entornos
"switcheados". Sshmitm y webmitm implementan ataques del tipo man-in-the-
middle hacia sesiones redirigidas de ssh y https abusando de relaciones débiles en
sistemas con una infraestructura de llaves públicas.

Ettercap. Es un sniffer para redes de área local basadas en ethernet que tiene la
habilidad de capturar tráfico incluso en redes que hacen uso de switchs en lugar de

5
concentradores. También nos permite la inyección de datos en una conexión
establecida y filtrado al vuelo, manteniendo la conexión sincronizada.

Whisker/Libwhisker. Se trata de un escaneador de vulnerabilidades CGI. Nos


permite poner a prueba servidores web en busca de fallos de seguridad conocidos,
particularmente la presencia de sciprts/programas que utilicen CGI. Libwhisker es
una biblioteca para perl que nos permite crear escáneres de HTTP a medida.

John the Ripper. Es un crackeador de contraseñas muy rápido, disponible para la


mayoría de sistemas UNIX, DOS, Windows, BeOS y OpenVMS. Su utilidad principal
es detectar claves de Unix débiles.

OpenSSH/SSH. Nos permite acceder de forma segura a ordenadores remotos. SSH


(secure shell) es una aplicación que nos permite logarnos en una máquina remota y
ejecutar comandos en ella. Nos permite establecer una conexión cifrada y segura
entre dos máquinas sobre una red insegura. Podemos incluso utilizar ssh para crear
un túnel sobre el que viajen otros protocolos inseguros por naturaleza.

Sam Spade. Herramienta de consulta de redes de distribución gratuita. Sam Spade


nos provee de una interfaz gráfica de usuario consistente y de una implementación
de varias tareas de investigación de red útiles. Incluye herramientas como ping,
nslookup, whois, dig, traceroute, finger, explorador de web, transferencia de zonas
DNS, comprobación del estado del "relay" en servidores SMTP, etc.

6
Tripwire. Es una herramienta que verifica la integridad de nuestro sistema de
archivos. Como vimos al principio del manual, tripwire ayuda a los administradores
de un sistema a monitorizar los cambios que puedan sufrir un conjunto de archivos,
así como sus propiedades y atributos, de una forma sencilla y periódica. De esta
forma es posible detectar problemas (indicios de ataque, por ejemplo) antes de que
los daños sean irreversibles. Cabe destacar que sólo la versión para Linux se
distribuye de forma libre y
gratuita.

Nikto. Es un escaner de servidores web que busca más de dos mil archivos/CGIs
potencialmente peligrosos, así como posibles fallos en más de dos cientos servidores.
Utiliza la biblioteca Libwhisker, aunque generalmente se actualiza con más frecuencia
que el mismo Whisker.

Kismet. Se trata de un poderoso sniffer para redes inalámbricas (802.11b). Es capaz


de "esnifar" utilizando la mayoría de las placas inalámbricas disponibles.

Netfilter. Como recordaremos del tema anterior, netfilter es el sistema de filtrado


de paquetes que utilizan los kernels Linux en versiones 2.3.15 o posteriores. Soporta
filtrado de paquetes stateless o statefull, NAT (Network Address Translation),
modificación de paquetes (packet mangling). Se gestiona a través de la herramienta
iptables.

Traceroute/ping/telnet/whois. Aunque existen multitud de herramientas de alta


tecnología que nos son de gran ayuda en temas relacionados con la seguridad, no
podemos olvidar lo básico. Es muy importante familiarizarnos con estas
herramientas, ya que están presentes en la mayoría de sistemas y pueden
resultarnos extremadamente útiles.

Sara. Es una herramienta de evaluación de vulnerabilidades derivada del infame


escáner SATAN. Se actualiza con bastante frecuencia.

7
Airsnort. Es una herramienta que nos permite recuperar las llaves de cifrado WEP
de una red inalámbrica. Opera pasivamente las transmisiones, computando la llave
de cifrado cuando un número suficiente de paquetes han sido recolectados.

NBTScan. Es un programa que escanea redes IP en busca de información de


nombres de NetBIOS. Envía pedidos de "status" de NetBIOS a cada dirección en un
rango provisto por el usuario y lista la información recibida de una forma clara. Por
cada máquina que responde se lista su dirección, nombre NetBIOS, nombre de
usuario son sesión iniciada en la máquina y dirección MAC.

GnuPG. Es una implementación libre del estándar PGP. Nos permite proteger
nuestros archivos y comunicaciones con un cifrado avanzado.

Firewalk. Se trata de una versión avanzada del tradicional comando traceroute, de


gran utilidad cuando existen cortafuegos intermedios. Utiliza el campo TTL (tiempo
de vida) de la cabecera IP para desempeñar su función.

XProbe2. Es una herramienta que sirve para determinar el sistema operativo de una
máquina remota.

NGrep. Muestra y busca paquetes según un patrón que determinemos. Intenta


proveer al usuario de la mayoría de características comunes del comando "grep" de
GNU, aplicándolas a la capa de red del modelo de referencia OSI. Actualmente
reconoce TCP, UDP, e ICMP sobre ethernet, PPP, SLIP e interfaces nulas.

THC-Amap. Es un escáner nuevo pero poderoso que prueba cada puerto intentando
identificar aplicaciones y servicios en lugar de confiar en un mapeo de puertos
estático.

OpenSSL. La más célebre biblioteca de cifrado para SSL/TLS. El proyecto OpenSSL


es un esfuerzo para desarrollar un conjunto de herramientas robusto, de nivel
comercial, completo en características y libre, implementando los protocolos SSL
v2/v3 (Secure sockets layer) y TLS (transport layer security), así como también una
biblioteca de cifrado de propósito general potente. El proyecto es administrado por
una comunidad de voluntarios a lo ancho del mundo que utilizan Internet para
comunicarse, planear y desarrollar el set de herramientas OpenSSL y su
documentación relacionada.

NTop. Es un monitor de uso de tráfico de red. Muestra el uso de la red de una forma
similar a como lo hace el comando top por procesos. En modo interactivo muestra el
estado de la red en una terminal de usuario. En modo web actúa como un servidor
web (que por defecto escucha en el puerto 3000), volcando en HTML el estado de la
red. Es una herramienta muy interesante para tener controlada la actividad de
nuestra red de una forma muy cómoda.

Nemesis. Nos permite inyectar paquetes de una forma simple. El proyecto Nemesis
está diseñado para ser una pila de IP portable y basada en línea de comandos para
UNIX/Linux. El set está separado por protocolos.

LSOF (List Open Files). Esta herramienta forense y de diagnóstico específica de Unix
lista información acerca de cualquier archivo abierto por procesos que estén
actualmente ejecutándose en el sistema. También puede listar sockets de
comunicaciones abiertos por cada proceso.

8
Hunt. Una herramienta muy versátil, que nos permite tanto "esnifar" en conexiones
como "introducirnos" en ella alterando las comunicaciones. Hunt puede observar
varias conexiones TCP, entrometerse en ellas o incluso resetearlas. Fue diseñado
para ser utilizado sobre ethernet y dispone de mecanismos para trabajar en redes
con switches.

Honeyd. Nuestra honeynet personal. Honeyd es un pequeño demonio que crea


máquinas virtuales en una red. Estas máquinas pueden ser configuradas para
ejecutar servicios arbitrarios, y su personalidad TCP puede ser adaptada para que
parezcan estar ejecutando ciertas versiones de sistemas operativos. Honeyd permite
que un host alegue tener múltiples direcciones en una LAN para la simulación de red.
Cualquier tipo de servicio en la máquina virtual puede ser simulado de acuerdo a un
archivo de configuración simple.

Stunnel. Es una envoltura criptográfica SSL de propósito general. Está diseñado


para trabajar como una envoltura de cifrado SSL entre un cliente remoto y un
servidor local. Puede ser utilizado para agregarle funcionalidad SSL a protocolos
normalmente inseguros como POP3 e IMAP, sin la necesidad de realizar cambios en
la aplicación. Negocia una conexión SSL utilizando la biblioteca de OpenSSL o la
SSLeay.

Fragroute, la peor pesadilla de los sistemas de detección de intrusos. Fragroute


intercepta, modifica y reescribe el tráfico de salida de una máquina. Entre sus
características, se encuentra un lenguaje de reglas simple para retrasar, duplicar,
descartar, fragmentar, superponer, imprimir, reordenar, segmentar, especificar
source-routing y otras operaciones más en todos los paquetes salientes destinados a
una máquina en particular, con un mínimo soporte de comportamiento aleatorio o
probabilístico. Esta herramienta fue escrita de buena fe para ayudar en el ensayo de
sistemas de detección de intrusión, firewalls, y comportamiento básico de
implementaciones de TCP/IP.

SPIKE Proxy. Es un proxy HTTP libre de utilidad para encontrar fallos de seguridad
en sitios web. Soporta detección de inyección de SQL automatizada, uso de fuerza
bruta en formularios de entrada, detección de sobrecarga y detección de acceso a
directorios que debieran estar fuera de los límites del sitio web.

THC-Hydra. Es un cracker de sistemas de autenticación en red paralelizado. Nos


permite realizar ataques por diccionario rápidos a sistemas de identificación por red,
incluyendo FTP, POP3, IMAP, NetBIOS, telnet, HTTP Auth, LDAP, NNTP, VNC, ICQ,
Socks5, PCNFS, y algunos más. Además incluye soporte SSL para aquellos protocolos
que lo utilicen.

5.3. Herramientas comerciales

Saint. Se trata de un detector de vulnerabilidades. Es muy cómodo de usar y nos


ofrece adaptar el escaneo hasta encajar completamente con nuestras necesidades.
Saint solía ser un producto libre tiempo atrás. Únicamente funciona sobre sistemas
UNIX.

9
5.4. Otras herramientas de interés
Estas herramientas, de las cuales la mayoría son de libre distribución, también
podrían sernos de gran utilidad:

• TCP Wrappers: Un mecanismo de control de acceso y registro clásico basado en IP.


• LibNet: Una API (toolkit) de alto nivel permitiendo al programador de aplicaciones
construir e inyectar paquetes de red.
• IpTraf: Software para el monitoreo de redes de IP.
• Fping: Un programa para el escaneo con ping en paralelo.
• Bastille: Un script de fortalecimiento de seguridad Para Linux, Max Os X, y HP-UX.
• TCPTraceroute: Una implementación de traceroute que utiliza paquetes de TCP.
• Shadow Security Scanner: Una herramienta de evaluación de seguridad no-libre.
• LIDS: Un sistema de detección/defensa de intrusiones para el kernel Linux.
• etherape: Un monitor de red gráfico para Unix basado en etherman.
• dig: Una útil herramienta de consulta de DNS que viene de la mano con Bind.
• Crack / Cracklib: El clásico cracker de passwords locales de Alec Muffett.
• cheops / cheops-ng: Nos provee de una interfaz simple a muchas utilidades de red,
mapea redes locales o remotas e identifica los sistemas operativos de las máquinas.
• Visual Route: Obtiene información de traceroute/whois y la grafica sobre un mapa
del mundo.
• The Coroner's Toolkit (TCT): Una colección de herramientas orientadas tanto a la
recolección como al análisis de información forense en un sistema Unix.
• tcpreplay: una herramienta para reproducir archivos guardados con tcpdump o con
snoop a velocidades arbitrarias.
• arpwatch: Se mantiente al tanto de las equivalencias entre direcciones ethernet e
IP y puede detectar ciertos trabajos sucios.

10

You might also like