Curso Linux Administracion
Curso Linux Administracion
Curso Linux Administracion
- CONCEPTOS BÁSICOS
Unidad 1.- Introducción
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.
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:
http://www.slackware.com/
http://www.debian.org
http://www.redhat.com/
http://www.opensuse.org/es/
http://www.knoppix.net/
http://www.ubuntu.com/
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.
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.
Ficheros y directorios
Curso.doc.gz
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).
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.
Una vez que hemos instalado correctamente Ubuntu, vamos a ver con mas
detenimiento el proceso de arranque y apagado del Sistema Operativo
Para cambiar el nivel de ejecución se utiliza el comando 'init'. Sólo el usuario root
tiene permitido cambiar entre los distintos runlevels.
# init 6
# init 0
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.
• Caracteres 8, 9, 10: igual que en el caso anterior, pero para los otros usuarios
del sistema. Es decir, solo permisos de lectura.
• 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 “–“
Y grabarla en un CD.
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:
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.
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.
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.
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.
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.
1) Tarjeta Grafica
2) Teclado
3) Ratón
• 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.
4) Monitor
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).
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.
1.1.- INTRODUCCIÓN
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.
Los paquetes básicos del sistema se pueden agrupar, de forma general en:
Podemos instalar los paquetes básicos del sistema mediante la orden siguiente:
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.
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.
/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.
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”
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.
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/ ./
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:
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).
Startx /usr/bin/X11/qvwm
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.
Update-alternatives x-window-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.
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.
/etc/INIT.d/xdm start
/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:
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.
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:
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:
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).
Una vez hayamos hecho esto, bastara con ejecutar los siguientes comandos para
disponer de dichas actualizaciones:
KDE
Los paquetes básicos de KDE están en el paquete kdebase. Este será, pues, el
primero que instalaremos:
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
Xsession
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
Bbkeys &
Backbox
Xresources
Xterm*reverseVideo: trae
Xmodmap
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:
Mediante los parámetros “-pk” xmod nos devolverá todo el contenido de l atabla de
conversión que se esta usando.
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:
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:
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.
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 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.
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.
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.
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.
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:
4
En Linux, un comando suele constar de 3 partes:
$ top –u usuario
En este caso, el nombre del comando es 'top', las opciones son '-u' y el
argumento es ‘usuario’.
Podemos ver los valores actuales de las variables de entorno de nuestro shell con
el comando env:
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.
$./comando
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.
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.
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
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.
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’
Pwd
El comando pwd muestra el directorio de trabajo actual. Veamos un ejemplo del
uso del comando 'pwd':
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$
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.
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.
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
12
Cp
El comando 'cp' copia ficheros y directorios. El formato de su llamada es el
siguiente:
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.
13
mv
El comando mv mueve/renombra ficheros o directorios. El formato de su llamada
es:
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.
Renombramos 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:
touch
El comando 'touch' se utiliza para modificar la fecha de creación de un archivo.
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:
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:
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.
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.
17
Veamos varios ejemplos de su utilización. Para obtener el tamaño ocupado por
nuestro directorio home:
df
El comando 'df' (disk free) muestra información sobre los sistemas de ficheros
montados en la máquina.
Si no se indica ningún fichero, 'df' muestra información sobre todos los sistemas
de ficheros montados en ese momento.
18
1.9.- CONFIGURACION DE SHELL
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.
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.
19
Según la imagen, cuando usuario inicie la sesión, se leerán por orden, los
siguientes archivos: /etc/profile y .profile.
Alias
Los alias permiten la sustitución de una cadena por una palabra cuando se usa
como la primera palabra de un comando simple.
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.
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
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
Hay una versión mejorada del editor, vim, que se recomienda instalar siempre
que sea posible.
$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
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.
CREACIÓN DE UN 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:
Puede que nos pida la contraseña del usuario para asegurar la identidad del
mismo.
2
ALMACENAMIENTO INTERNO DE USUARIOS: FICHEROS
PASSWD Y SHADOW
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 :
3
Vamos a ver esos campos tomando como ejemplo el último usuario que hemos
creado: alumno.
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.
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.
BLOQUEO DE UN USUARIO
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:
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:
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.
7
MODIFICAR UN USUARIO
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
usuario:x:1000:1000:Juan Perez:/home/juanperez:/bin/sh
9
3.2. GESTIÓN DE GRUPOS
10
Al igual que el fichero passwd, el fichero group también está dividido en campos
separados por ':'.
11
MÓDULO 3.- ADMINISTRACIÓN BÁSICA
Unidad 4.- Instalación y Gestión de Software
4.1.- INTRODUCCIÓ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.
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.
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:
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”
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.
Vamos instalar el paquete webmin con el comando dpkg. La utilidad del programa
webmin como herramienta de administracion la veremos mas adelante.
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.
COMPILACIÓN
Los pasos para compilar un programa GNU son muy sencillos, en general, basta
con ejecutar los siguientes comandos:
# ./configure
# make
# make install
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:
4.1.- INTRODUCCIÓN
Para saber qué procesos se están ejecutando en la terminal (tty) donde nos
encontramos (tty1) , podemos utilizar el comando ps:
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
o “-a”: nos muestra los procesos de todos los terminales del sistema.
$ 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.)
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.
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.
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.
5
o Ahora matamos todos los procesos de usuario:
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.
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):
$ 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
Entre las ventajas que supone tener instalada una red, pueden citarse las
siguientes:
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
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.
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 cuarta columna tenemos las direcciones ips de los clientes, con el puerto
cliente asociado. La linea:
Protocolos de comunicación
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.
195.76.40.2
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:
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.
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.
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
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):
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.
Aunque las máquinas trabajan con números, para nosotros es mucho más
amigable trabajar con nombres.
http://www.google.es
a. /etc/host.conf
Este fichero dice a su sistema cómo resolver los nombres de las máquinas
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
Herramientas de Red
1.- Ping
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
3.- IP
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.
Para instalar ssh vamos a utilizar la aplicación apt-get, instalando el paquete ssh:
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
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:
SERVIDOR SSH
1.1.- INTRODUCCIÓN
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:
Ahora que tenemos todo lo necesario, veamos las configuraciones del cliente y el
servidor.
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.
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:
1.2.- INSTALACIÓN
[trastero]
comment = Directorio home usuario
path = /home/usuario
read only = no
writable = yes
public = yes
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
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
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:
Como no podía ser de otra manera, configurar el apache no es más que modificar
ficheros y reiniciar servicios.
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.
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.
# /etc/init.d/proftpd reload
7.1.- INTRODUCCIÓN
7.2.- SMTP
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.
Lo siguiente que haremos será seleccionar el tipo de buzón que queremos que utilice
qmail. Principalmente disponemos de dos tipos de formato:
alias_empty="./Maildir"
# /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
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.
# /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
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
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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?
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.
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.
1. SELinux
2. GRSecurity
3. LIDS
1. SELinux
2. GRSecurity
3. LIDS
tegioz:dase3frbkbDbSJDB:1000:1000:,,,:/home/tegioz:/bin/bash
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 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.
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.
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.
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:
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).
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.
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.
Además de los permisos básicos que hemos visto anteriormente, existen tres
permisos especiales aplicables a los ficheros en Linux:
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.
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
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
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.
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.
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.
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.
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.
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:
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.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.
3.5.2.2. Partimage
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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
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
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.
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.
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
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.
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:
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.
− 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
En la imagen podemos ver como el primer ping tuvo éxito. Entonces añadimos la
siguiente regla:
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).
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.
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á.
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
--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".
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:
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).
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.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.
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.
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.
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.
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.
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.
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.
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.
GnuPG. Es una implementación libre del estándar PGP. Nos permite proteger
nuestros archivos y comunicaciones con un cifrado avanzado.
XProbe2. Es una herramienta que sirve para determinar el sistema operativo de una
máquina remota.
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.
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.
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.
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:
10