Linus LPIC2 PDF
Linus LPIC2 PDF
Los exámenes LPI 201 y LPI 202 son los dos exámenes que permiten obtener la certificación LPIC-
2 "Advanced Level Linux Professional". Este programa de certificación del Linux Professional Institute está
cada vez másreconocido por las empresas de selección, que ven en esta certificación un requisito para la
contratación o el acceso a un puesto de administrador.
Los exámenes LPI 201 y 202 demuestran a los profesionales que usted domina la administración avanzada
de un sistema Linux de cualquier distribución: califican las competencias prácticas en términos de
administración de redes de pequeño o mediano tamaño (administración de servicios de red comunes, gestión
de la seguridad de red y de las comunicaciones...).
Para ayudarle a preparar eficazmente esta certificación, este libro cubretodos los objetivos oficiales de la
última versión del examen (implantada en julio de 2012) tanto desde un punto de vista teórico como
práctico. Ha sido originalmente redactado por un profesional formador y consultor, certificado en Linux. De
este modo, el saber pedagógico y técnico del autor conducen a una aproximación clara y visual, de un nivel
técnico muy alto.
Capítulo a capítulo, podrá validar sus conocimientos teóricos, con la ayuda de múltiples preguntas-
respuestas (110 en total) que ponen de relieve tanto los elementos fundamentales como las características
específicas de los conceptos tratados.
Cada capítulo finaliza con unos trabajos prácticos (32 en total) en los que puede medir su autonomía.
Estas operaciones concretas, más allá incluso de los objetivos marcados para el examen, le permitirán
construir una primera experiencia significativa y adquirir verdaderas competencias técnicas en situaciones
reales.
A este dominio de práctica y de conocimientos, se añade la preparación específica para la certificación: podrá
acceder gratuitamente a 1 examen en blanco en línea, para que pueda practicar en condiciones parecidas a
las de la prueba.
Sébastien BOBILLIER
Después de haber sido Administrador de Sistemas y Redes, Sébastien Bobillier evoluciona durante muchos
años en el mundo de la formación. Hoy en día, es Consultor Formador en Global Knowledge, y se ha
convertido en un especialista de sistemas Linux, que acompaña regularmente a los candidatos a la
certificación LPI. Este libro es el fruto de toda su experiencia en esta materia.
Preparación para la Certificación LINUX LPIC-2 exámenes
LPI 201 y LPI 202
Los exámenes LPI 201 y LPI 202 son los dos exámenes que permiten obtener la certificación LPIC-
2 "Advanced Level Linux Professional". Este programa de certificación del Linux Professional Institute está cada
vez más reconocido por las empresas de selección que ven en esta certificación un requerimiento para la
contratación o para el acceso a un puesto de administrador.
Los exámenes LPI 201 y 202 demuestran a los profesionales que usted domina la administración avanzada de
un sistema Linux de cualquier distribución: califican las competencias prácticas en términos de administración
de redes de pequeño o mediano tamaño (administración de servicios de red comunes, gestión de la seguridad y
de las comunicaciones...).
Para ayudarle a preparar eficazmente esta certificación, este libro cubre los objetivos oficiales cuya lista se
proporciona en el anexo. Se divide en 12 capítulos organizados de la siguiente manera:
Una definición de los objetivos que se alcanzarán: permite exponer de forma precisa las
competencias adquiridas cuando finalice el capítulo.
Una parte de conocimientos teóricos: permite definir los términos y conceptos tratados y
esquematizar en forma de hilo conductor los distintos puntos que se deben asimilar.
Los trabajos prácticos: permiten ilustrar de forma precisa algunas partes del capítulo y
también proporcionan los medios para medir su autonomía. Estas operaciones concretas, más
allá de los propios objetivos fijados para el examen, le permitirán obtener una primera
experiencia significativa y adquirir verdaderas habilidades técnicas como si se tratase de
situaciones reales.
En la preparación específica para el examen, puede acceder gratuitamente a 1 examen en blanco en línea en la
dirección [Link] para entrenarse en condiciones muy parecidas a las de la prueba. En este sitio
web, cada pregunta se ha escrito inspirándose en la certificación y, para cada una de ellas, las respuestas están
lo suficientemente comentadas para controlar e identificar sus últimas lagunas.
La certificación LPI
1. Interés de la certificación
El universo Open Source rebosa de personas con habilidades dispares y con fundamentos más o
menos sólidos. Hay gran cantidad de gurús por Internet y los trabajos de algunos aficionados son exagerados,
quizá superiores a los que realizan los empleados expertos en la materia.
Las empresas podrían estar encantadas con esta masa de conocimiento disponible y quizás incluso contratar
con menor coste a estos usuarios apasionados. El problema es que a menudo estos conocimientos se
adquieren de forma autodidacta, sin seguir ninguna metodología y frecuentemente fuera de cualquier marco
profesional, lo que impide a los candidatos aportar documentación de sus servicios en el ámbito empresarial.
Por otro lado, el aprendizaje autodidacta no se realiza por amor al software, y los usuarios aficionados a
menudo tienen una visión fragmentada y sesgada de la materia, centrada en sus intereses personales.
Los programas de certificación tienen por objetivo validar unas habilidades, independientemente del curso
universitario o escolar. Sirven para validar un nivel concreto y, en lo concerniente a la certificación LPI, para
verificar que el candidato tiene una visión transversal de la materia, sin carencias manifiestas en ninguno de los
temas tratados.
El programa de certificación LPI está reconocido por una gran cantidad de fabricantes y profesionales del sector
como IBM, Novell, Intel o HP. Además, es un requisito para otros programas de certificación como Ubuntu o
suministrado por otros editores como Suse. Hasta la fecha, hay más de 85.000 certificados LPI en el mundo,
con más de 250.000 exámenes realizados.
a. Nivel 1
El nivel 1 de la certificación LPI se obtiene aprobando los dos exámenes LPI 101 y 102. Califica un
conocimiento básico (lo que no significa que sea fácil) de los sistemas Linux, de los comandos básicos y del
shell. Estas habilidades se pueden considerar como un requisito en el progreso serio en la administración de
sistemas Linux. La adquisición de las competencias correspondientes a la certificación LPI Nivel 1 no conduce
a la total autonomía en la materia, pero sí a un buen nivel de confort en la ejecución de las tareas
enmarcadas.
b. Nivel 2
El nivel 2 de la certificación LPI se obtiene aprobando los dos exámenes LPI 201 y 202. Califica un
conocimiento práctico de la administración de redes de tamaño pequeño o mediano y de la administración de
los servicios de red corrientes. También evalúa la gestión de la seguridad de la red y de las comunicaciones.
Un administrador de sistemas certificado con LPI nivel 2 es autónomo administrando su red y sus equipos.
c. Nivel 3
El nivel 3 de la certificación LPI se obtiene aprobando el examen LPI 301, al que se le pueden añadir cinco
exámenes de especialización numerados del 302 al 306 que tratan los entornos mixtos, la seguridad, la alta
disponibilidad y la virtualización, las tecnologías de Internet y, por último, la mensajería. La certificación LPI
nivel 3 se presenta como el máximo nivel de certificaciones Linux.
4. Presentarse al examen
Presentarse al examen de una certificación LPI deja a menudo un amargo sabor de boca. El nivel de dificultad
de las preguntas parece inalcanzable. A menudo se llega a pensar que esta certificación es injusta, porque no
califica realmente una habilidad sino más bien la capacidad de aprender de memoria el manual de comandos de
Linux. Naturalmente, esta proeza no está al alcance de los seres humanos en la vida real, hay que buscar en
otro sitio la clave del éxito.
Como en todas las preguntas de opción múltiple, en caso de duda primero debemos eliminar las respuestas
extravagantes; la respuesta correcta a menudo se encuentra en una lista reducida de dos o tres alternativas.
Además, hay que recordar que la certificación LPI se basa por un lado en los conocimientos teóricos y, por otro
lado y sobre todo, en unas competencias prácticas adquiridas sobre los sistemas Linux. En principio un
candidato se instruye, pasa unos cuantos años administrando sistemas en producción y se presenta a la
certificación para demostrar que ha asimilado los conocimientos técnicos. Es evidente que no todos siguen este
proceso y, para muchos, incluyendo el mercado laboral europeo, la certificación es vista en gran medida como
una manera de conseguir el empleo que aportará la experiencia real. Esta ecuación aparentemente irresoluble
puede resolverse, y este libro está aquí para ayudar. Simplemente, no es suficiente con haber realizado todos
los ejercicios y trabajos prácticos, sino que también será necesario haberlos asimilado. Es decir, hay que
entender los conceptos subyacentes, el interés de los comandos usados y ser capaz de emplearlos fuera del
contexto de los ejercicios.
Si no se tiene a mano una infraestructura Linux en producción para entrenarse, un buen método es leer este
libro y realizar los trabajos prácticos que se encuentran al final de cada capítulo. Al principio se sentirá tranquilo
al ver que todo funciona correctamente (si se siguen escrupulosamente las instrucciones, todos los ejercicios
funcionan). De hecho, es muy importante no desanimarse: la certificación LPI exige que uno se sienta muy
cómodo con todos los conceptos y comandos. Una lectura desmotivada y el aprendizaje de comandos
permitidos sin convicción y sin comprenderlos no bastará. Una vez tranquilizado por haber hecho bien los
ejercicios, se puede volver a leer, profundizar en los puntos oscuros y animarse a probar alternativas a los
ejercicios. En los trabajos prácticos se dejan abiertas muchas posibilidades, el lector es libre de realizarlas.
Hoy en día los exámenes LPI siempre están en inglés. Se recomienda tener un buen nivel de inglés técnico.
Sobre este libro
1. La información técnica
Este libro está dirigido principalmente a la preparación para la certificación LPI. Por lo tanto su contenido técnico
se orienta en esta dirección. Algunos detalles funcionales o ciertos comandos expuestos han caído un poco en
desuso, aunque la certificación LPI exige su conocimiento.
La certificación LPI nivel 2 califica que los candidatos dispongan de un excelente conocimiento práctico de los
sistemas Linux y de los servicios de aplicación más comunes. Las preguntas a veces son con trampa,
precisamente para comprobar que el candidato posee experiencia administrando sistemas en una determinada
materia y que ya se ha encontrado con situaciones particulares al margen del funcionamiento diario "cuando
todo va bien". De este modo, aquí encontrará las explicaciones, los conocimientos y en la medida de lo posible
muchos trucos que una extensa práctica debería aportar.
Por supuesto, la información sobre los comandos y aplicaciones Linux son de dominio público y ampliamente
disponibles, no sólo por el manual en línea. Las sintaxis de los comandos expuestos aquí sólo son las opciones
realmente importantes: ya sea porque son de uso común en producción o porque los objetivos específicos de la
certificación LPI los considera particularmente importantes. Por lo tanto el candidato puede, al menos
inicialmente, centrarse en el conocimiento de lo esencial.
Los trabajos prácticos propuestos se basan en un entorno mixto compuesto por dos servidores y una estación
de trabajo Linux. El primero de los servidores tendrá instalada una distribución Debian y el otro una distribución
CentOS, que tiene como ventaja su proximidad con los sistemas Red Hat, siendo mucho más fácil de obtener.
La estación de trabajo se instalará con una distribución Ubuntu.
Durante un ejercicio sobre cómo instalar un gestor de arranque se utilizará puntualmente un live CD de la
distribución DSL (Damn Small Linux).
Las máquinas tendrán como nombre de host alfa, para el servidor Debian, y beta, para el servidor CentOS. La
estación de trabajo con Ubuntu se llamará estacion. Las direcciones IP deberán acogerse a su plan de
direccionamiento y son irrelevantes para la realización de los ejercicios, aunque deberán ser coherentes. Las
direcciones utilizadas para los trabajos prácticos serán [Link] para el servidor alfa, [Link]
para el servidor beta, y una dirección cualquiera de la misma subred para la estación de trabajo. Se deberá
reemplazar estas direcciones por las que se haya elegido.
El entorno de trabajo es virtualizado para permitir un montaje fácil de una maqueta realista sin tener que
desplegar una cantidad considerable de hardware. Además, la virtualización tiene la ventaja de que permite
realizar operaciones pesadas de almacenamiento a un menor coste. El software de virtualización elegido es
VirtualBox OSE, que tiene la ventaja de estar disponible de forma gratuita y de poderse instalar tanto en
equipos Windows como en equipos Linux. La adaptación a cualquier otro software de virtualización no debería
presentar ningún tipo de dificultad añadida.
Si se desea trabajar en un entorno real los trabajos prácticos se pueden adaptar muy fácilmente con tres
equipos, teniendo en uno de ellos dos tarjetas de red, un switch y algunos cables de red. En este caso se
necesitarán algunos discos duros adicionales.
Sea cual sea el entorno elegido se necesitará acceso a Internet para la realización de la mayor parte de los
ejercicios.
Preparación de los trabajos prácticos
Los trabajos prácticos se han realizado con la versión 4.1.12 de VirtualBox, con la versión Squeeze (6) de
Debian, con la versión 6 de CentOS y con la versión Precise Pangolin (12.04) de Ubuntu. El uso de versiones
distintas no debería interferir en la realización de los ejercicios.
A menudo se recomienda elegir las versiones de 32 bits de los sistemas (i386) para trabajar en un
entorno virtualizado.
a. Elementos necesarios
Desde la interfaz de VirtualBox, haga clic en Nueva para iniciar el asistente de creación de
máquinas virtuales.
En la pantalla Memoria, regule el Tamaño de memoria base a 128 MB como mínimo. Este
valor tiene que ser suficiente para una instalación sin interfaz gráfica. Si opta por instalar un
servidor X deberá aumentar la memoria en consecuencia.
En la pantalla Tipo de archivo de unidad de disco duro, conserve la opción por defecto.
En la pantalla Ubicación del archivo y tamaño, deje la opción por defecto. El tamaño de 8 GB
mostrado no se ocupará realmente en su disco duro.
En la pantalla Resumen, haga clic en Crear y una vez más en Crear para finalizar la creación
de la máquina virtual.
Haga clic en la pantalla de la máquina virtual iniciada para que se capturen el ratón y el
teclado.
En la pantalla Elija la distribución del teclado, deje seleccionada la opción por defecto
(Español).
En la pantalla siguiente Particionado de discos, elija Todos los ficheros en una partición
(recomendado para novatos).
En la pantalla Configurar el gestor de paquetes, elija una réplica cualquiera como Réplica de
Debian.
a. Elementos necesarios
Desde la interfaz de VirtualBox, haga clic en Nueva para iniciar el asistente de creación de
máquinas virtuales.
En la pantalla Memoria, regule el Tamaño de memoria base a al menos 768 MB. Si no puede
asignar tanta memoria a su máquina virtual, puede optar por una versión más antigua de
CentOS. La versión 5 se puede instalar con 256 MB de memoria base. La instalación de la
versión 6 con una cantidad 26de memoria demasiado pequeña desemboca en una instalación
degradada de un sistema operativo inutilizable..
En la pantalla Tipo de archivo de unidad de disco duro, conserve la opción por defecto.
En la pantalla Almacenamiento en unidad de disco duro físico, deje la opción por defecto.
En la pantalla Ubicación del archivo y tamaño, deje la opción por defecto. El tamaño que se
muestra de 8 GB no se ocupará realmente en su disco duro.
En la pantalla Resumen, haga clic en Crear y una vez más en Crear para finalizar la creación
de la máquina virtual.
En la pantalla Disc found, seleccione Skip para evitar la comprobación del disco duro.
En la ventana Advertencia del dispositivo de almacenamiento, elija Sí, descarte todos los
datos.
En la pantalla siguiente, escriba beta como nombre del host y haga clic en Configure la red.
En la pantalla de selección del huso horario, desactive El reloj de sistema utiliza UTC y
seleccione su huso horario.
En la pantalla de elección del tipo de instalación, seleccione Usar todo el espacio. Acepte el
aviso de escritura de modificaciones en el disco.
Después del reinicio del sistema, haga clic en Al frente en la pantalla de bienvenida.
En la pantalla Crear Usuario, cree una cuenta para el usuario usuario con la
contraseñapassword.
a. Elementos necesarios
Desde la interfaz de VirtualBox, haga clic en Nueva para iniciar el asistente de creación de
máquinas virtuales.
En la pantalla Memoria, regule el Tamaño de memoria base a 512 MB. Si su sistema anfitrión
no puede proporcionar tanta memoria puede disminuir este valor y elegir otro sistema que
consuma menos recursos como xubuntu.
En la pantalla Tipo de archivo de unidad de disco duro, deje los valores por defecto.
En la pantalla Almacenamiento en unidad de disco duro fésico, deje la opción por defecto.
En la pantalla Ubicación del archivo y tamaño, conserve las opciones por defecto. El tamaño
que se muestra de 8 GB no se ocupará realmente en su disco duro.
En la pantalla Resumen, haga clic en Crear y una vez más en Crear para finalizar la creación
de la máquina virtual.
Haga clic en la pantalla de la máquina virtual iniciada para capturar el ratón y el teclado.
En la pantalla Tipo de instalación, seleccione Borrar disco e instalar Ubuntu y haga clic
enContinuar.
En la estación de trabajo Ubuntu, haga clic en el icono de conexiones de red (en la barra de
tareas superior, a la derecha). Elija Editar las conexiones.
En la pestaña Ajustes de IPv4, elija el Método: Manual. Añada una dirección IP con una
dirección de su rango de direcciones. Utilice su puerta de enlace predeterminada y utilice el
servidor DNS de su proveedor de servicios de Internet. Valide su configuración haciendo clic
enGuardar.
Si fuera necesario, haga clic en el icono de gestión de red para elegir la conexión Fija eth0.
La cuenta root está desactivada por defecto en los sistemas Ubuntu. Todos los comandos
que requieren permisos de administrador deberán ser precedidos por el comando sudo.
En la ventana de elección del nuevo disco, seleccione Crear nuevo disco y acepte las
elecciones por defecto.
Cada máquina virtual dispone de un conjunto de cuatro tarjetas de red de las cuales sólo la primera está
activa. Agregar una tarjeta de red es tan fácil como activar una de las tarjetas que ya vienen preinstaladas.
1. Requisitos
Los conocimientos adquiridos con la certificación LPI nivel 1, en particular:
Tener nociones básicas acerca de los sistemas de archivos y de las tablas de inodos.
2. Objetivos
Al finalizar del capítulo será capaz de:
Configurar un automontaje.
Archivar datos.
El sistema de archivos sirve para organizar un espacio de almacenamiento bruto, como una partición de disco
para almacenar datos. Aunque normalmente se dice que se va a dar formato a un espacio de
almacenamiento, en los entornos Linux se dice que se va a crear un sistema de archivos.
El término sistema de archivos viene del vocablo inglés filesystem. Usaremos el término "sistema de archivos"
cuando se trate de un sistema de archivos añadido a un periférico de almacenamiento único o para designar
el espacio de almacenamiento organizado, esté compuesto por uno o por muchos sistemas de archivos.
Existen muchos tipos de sistemas de archivos de los cuales los más comunes en entornos Linux son ext,
reiserfs y xfs. Su estudio es necesario para obtener la certificación LPI.
ext
ext es el sistema de archivos histórico de los sistemas Linux. El formato original está en desuso y
actualmente se considera a ext2 la versión base de ext. Permite un tamaño máximo de archivos de 2 TB y un
tamaño de volumen máximo de 32 TB. ext2 ya no se despliega por defecto en los sistemas operativos
modernos pero sigue estando disponible de forma universal. Gestiona fechas de archivos hasta el año 2038.
ext3 es una evolución de ext2 a la que se le añadió un registro de transacciones. Cada operación de escritura
se guarda en el registro, lo que permite limitar las operaciones de validación a solo los elementos modificados
desde la última validación realizada. Los tamaños máximos de archivos y volúmenes son los mismos que los
de ext2. La gestión de fechas de archivos también es hasta el año 2038.
ext4, disponible desde octubre de 2008, aporta rendimientos superiores a sus predecesores. Los
tamaños máximos se amplían hasta llegar a 16 TB para los archivos y 1 EB para los volúmenes. La asignación
de espacio se realiza mediante extents, que son bloques de datos contiguos que permiten, asignando por
adelantado espacio al disco, limitar espectacularmente la fragmentación de archivos. Para asegurarse no
estar limitado para la gestión de fechas, la fecha límite de un archivo se sitúa en el año 2514.
reiserfs
reiserfs es un sistema de archivos con registro que para algunas operaciones tiene un rendimiento
ligeramente mejor que ext3. reiserfs se creó como competencia de ext. Antiguo sistema de archivos por
defecto de las distribuciones Suse, reiserfs ahora está en vías de desaparecer. Se le suele reprochar según
las condiciones de uso una cierta fragilidad o una falta de rendimiento global.
xfs
xfs es el sistema de archivos histórico de los servidores unix IRIX. Fue puesto bajo licencia GPL en el año
2000. Su buen rendimiento así como su compatibilidad con espacios de almacenamiento muy grandes (8
exabytes de tamaño máximo contra los 16 y 32 terabytes para reiserfs y ext3) lo convierten en un sistema de
archivos interesante.
Un sistema de archivos normal tiene como objetivo habilitar el uso de un espacio de almacenamiento físico
para un usuario o una aplicación. Sin embargo, en los sistemas Linux hay sistemas de archivos virtuales que
sólo están presentes en memoria sin ocupar espacio en disco. Los sistemas de archivos virtuales que hay que
dominar para la certificación LPI son proc y sys.
proc
El sistema de archivos virtual proc, generalmente montado en el directorio /proc, permite la visualización de
los elementos del sistema relacionados con la gestión de procesos por parte del núcleo. Además, proc
muestra algunos datos sobre el hardware del sistema.
A continuación se observan los datos técnicos relacionados con el procesador en uso. Se puede observar por
ejemplo la velocidad real del reloj en el momento de la ejecución del comando, lo que demuestra la buena gestión de
la energía en un sistema poco usado.
sys
usuario@alfa:~$ cat /proc/cpuinfo
processor :0 El
vendor_id : GenuineIntel sistema
cpu family :6 de
model : 42 archivos
model name : Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz
stepping :7
cpu MHz : 3294.845
cache size : 6144 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level :5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr
pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx
lm constant_tsc up pni monitor ssse3 lahf_lm
bogomips : 6429.86
clflush size : 64
power management:
virtual sys, generalmente montado en el directorio /sys, permite visualizar elementos de sistema relacionados
con los periféricos.
Hay muchos pseudoarchivos de /proc y /sys que tienen su contenido limitado a un solo carácter. En este caso 0
indica que el disco sda no se puede conectar en caliente.
El administrador crea los sistemas de archivos en espacios de almacenamiento sin tratar, tradicionalmente
particiones de disco. A partir de este momento se revisarán ocasionalmente por el administrador o a
intervalos regulares por el sistema. La creación de sistemas de archivos se realiza tradicionalmente con el
comando mkfs.
-t tipo Especificación del tipo de sistema de archivos que se creará. Valores que
debemos saber: ext2, ext3, ext4, reiserfs, xfs.
dispositivo Archivo especial de bloque que designa el dispositivo donde se creará el
sistema de archivos.
Aunque
fsck: opciones y parámetros
el
-t tipo Tipo de sistema de archivos que se comprobará. comando
fsck
dispositivo Archivo especial de bloque que designa el dispositivo en el que se permite
encuentra el sistema de archivos que se desea revisar.
comprobar los sistemas de archivos xfs, se recomienda utilizar los comandos específicos xfs_check y
xfs_repair.
Las sintaxis mostradas a continuación para los comandos mkfs y fsck son universales y deben funcionar. No
obstante, hay que saber que estos comandos invocan en realidad a otros subprogramas (mkfs.ext2 por
ejemplo para mkfs -t ext2), y que además hay otros comandos específicos que producirán el mismo resultado
(mke2fs es otra alternativa a mkfs -t ext2). La mayor parte de las preguntas de la certificación LPI usan esta
sintaxis común.
Al contrario que con el comando fsck, e2fsck funciona por defecto en modo interactivo. Para
un funcionamiento en modo no interactivo tiene que recibir como parámetro la opción -p. De
este modo revisa automáticamente el sistema de archivos sin necesitar la intervención del
usuario.
El comando mke2fs permite crear directamente sistemas de archivos ext. El formato utilizado por defecto es
ext2, aunque la opción -j (journal) permite la creación de estructuras de un sistema de archivos ext3.
mke2fs dispositivo
mke2fs -j dispositivo
Donde dispositivo representa el archivo especial en modo de bloques que identifica el periférico en el que se
desea crear el sistema de archivos.
g. Consulta y modificación de sistemas de archivos ext
El comando tune2fs permite visualizar los parámetros de un sistema de archivos ext y, si se desea,
modificar algunos de ellos.
tune2fs -l dispositivo
Donde dispositivo representa el archivo especial en modo de bloques que identifica el periférico en el que se
encuentra el sistema de archivos que queremos consultar.
Se puede observar que el valor has_journal figura en la sección Filesystem features, lo que indica que se trata de
un sistema de archivos de tipo ext3. Un sistema de archivos de tipo ext4 se caracteriza por la mención de
huge_file.
Las utilidades dumpe2fs, debugfs o debugreiserfs permiten obtener más información de bajo
nivel sobre los sistemas de archivos. Su conocimiento en detalle no se requiere para la
certificación LPI.
tune2fs -j dispositivo
Donde dispositivo representa el archivo especial de bloque que identifica el periférico en el que se
encuentra el sistema de archivos que queremos modificar.
Les options activées sont celles correspondant aux nouvelles fonctions apportées par ext4.
Algunos parámetros de los sistemas de archivos se pueden modificar después de su creación. Entre estos
parámetros, algunos van tomando cada vez más importancia en los sistemas Linux modernos y simplificarán
(posiblemente) las operaciones de montaje. Estos parámetrosson laetiqueta o label y el uuid. Ambos
permiten montar sistemas de archivos locales sin tener que identificarlos por su archivo de bloque especial,
/dev/sdb1 por ejemplo. Aunque esta evolución no se ve necesariamente como un progreso o una
simplificación por parte de todos, su generalización así como su presencia en los exámenes LPI la convierten
en un apartado de obligado estudio.
Tal y como su nombre indica, la etiqueta (label en inglés) es un nombre que se asigna al sistema de archivos
para identificarlo de forma natural. La etiqueta tiene que ser facilitada por el administrador bien cuando se
crea el sistema de archivos o bien después mediante un comando de tunning. Los sistemas inspirados en Red
Hat son los principales usuarios de etiquetas.
El UUID (Universally Unique Identifier), como sucede con la etiqueta, permite asociar a un periférico de
almacenamiento un identificador en vez de usar el archivo de bloque especial (/dev/sdb1 por ejemplo). La
diferencia con la etiqueta es que la asignación del uuid es automática cuando se crea el sistema de archivos.
Sin embargo, se puede modificar posteriormente con los comandos de tunning de los sistemas de archivos.
Cada vez más distribuciones generalizan el uso del uuid. Éste es el caso en particular de las distribuciones
ubuntu.
Si no se sabe cómo determinar el UUID de un nuevo sistema no hay por qué preocuparse, generalmente se
crea de forma aleatoria y su tamaño (128 bits) es garantía de su unicidad (probable).
En la
Modificación de un uuid en un sistema de archivos previamente creado tabla
tune2fs -U uuid Asignación del UUID uuid al dispositivo de
dispositivo almacenamiento dispositivo.
anterior dispositivo representa el archivo especial de bloque que representa al dispositivo que alberga el
sistema de archivos que se va a modificar, por ejemplo /dev/sda3.
No hay que confundirse sobre el uso que hay que hacer del swap. En un funcionamiento normal, un servidor o
una estación de trabajo Linux no debería usar el swap. La gran época del swap se dio cuando la memoria
tenía un coste tan caro que era necesario encontrar para el servidor un compromiso entre el coste del
sistema y el rendimiento que podía obtener. Hoy en día el coste relativamente bajo de la memoria hace que
un sistema no tenga que recurrir tan a menudo al mecanismo del swap. Sólo sucede en casos de un consumo
en exceso accidental de memoria. El swap es por lo tanto un tipo de memoria de repuesto que evita el
cuelgue de un servidor gestionando el balance entre las necesidades de memoria y los recursos disponibles.
La cantidad de memoria dedicada al swap depende a menudo del autor, la fuente y la época. Es difícil, cuando
se está instalando de forma manual un sistema, tomar una decisión serena. Hay cierto consenso en torno a
valores comprendidos entre una y dos veces el tamaño de la memoria RAM. De todos modos, las instalaciones
por defecto de las distribuciones generalmente proponen la creación automática de un espacio de swap. Para
una instalación a medida, los valores comunes (de una a dos veces la memoria RAM) son perfectamente
aceptables y en caso de duda, como el espacio en disco es todavía más barato, lo mejor es
sobredimensionar.
El swap se puede optimizar tanto en cantidad como en calidad. Puede suceder que durante la instalación se
haya decidido un tamaño de swap demasiado pequeño: por ejemplo, cuando se instala en un servidor una
aplicación que exige una cantidad de RAM y un swap diez veces superior a los existentes.
Además, el espacio de intercambio puede trasladarse a un disco más rápido: una SAN o una bahía de disco
más moderna y por lo tanto más rápida que en el que está instalado el sistema, con lo que el uso del swap
podría ser más rápido en estos sistemas de almacenamiento.
Por estas razones puede ser útil crear un nuevo espacio de swap que se añadirá o substituirá al espacio
inicial.
Se puede crear el swap desde varios espacios de almacenamiento pudiendo ser particiones o archivos. Como
nos interesa que el núcleo acceda directa y exclusivamente al swap, es preferible en términos de rendimiento
usar particiones en lugar de archivos de intercambio, ya que el sistema de archivos representa un
intermediario adicional para acceder al almacenamiento físico.
Si el swap se ubica en una partición, ésta tiene que crearse de tipo 82 con una herramienta de particionado
adecuada (fdisk Linux, por ejemplo). Si está en un archivo, tiene que estar siempre disponible en un sistema
de archivos montado a perpetuidad.
Para poder usar el espacio de swap, hay que prepararlo. Para ello hay que hacer como cuando se crea un
sistema de archivos en un espacio de almacenamiento sin tratar. Esta preparación se realiza
mediante el comando mkswap, y puede aplicarse tanto a una partición como a un archivo de tamaño
determinado.
mkswap espacio_de_almacenamiento
Donde espacio_de_almacenamiento representa la ubicación física del espacio de swap cuya denominación
puede realizarse de distintos modos:
/ruta/archivo Estructura el archivo para que pueda usarse como espacio de swap.
Una vez que el espacio de swap ha sido creado, se tiene que dejar disponible al núcleo mediante el
comando swapon. Entonces el sistema ya será capaz de realizar intercambios desde el nuevo espacio creado.
swapon espacio_de_almacenamiento
Si desea que el sistema deje de usar un espacio de swap, hay que indicárselo con el comandoswapoff.
swapoff espacio_de_almacenamiento
Donde espacio_de_almacenamiento representa la ubicación física del espacio de swap cuya denominación
puede realizarse de distintos modos:
El conjunto de espacios de swap usados, así como su naturaleza (archivo o partición), se pueden
visualizar mediante el comando swapon explicado anteriormente.
swapon -s
El comando indica la partición o el archivo usado, el tamaño reservado y la cantidad de swap usado.
Otra
alfa:~# swapon -s
Filename Type Size Used Priority
/dev/sda5 partition 409616 0 -1
visualización de swap
También se puede visualizar la configuración del swap consultando el contenido del archivo swaps del sistema de
archivos virtual /proc.
a. Montaje y desmontaje
El comando umount realiza la operación inversa. Acepta como argumento el punto de montaje o el periférico
físico que se desmontará.
Las
comando mount: opciones y parámetros
opciones
tipo_fs Opcional: tipo de sistema de archivos que se desea montar. más
comunes
opciones Opcional: opciones de montaje.
son ro (sólo lectura), sync (escrituras síncronas sin pasar por una caché en memoria) y loop (montaje de
datos de archivos en lugar del sistema de archivos).
El montaje de un sistema de archivos con la opción sync permite substituir el uso de la caché
por escrituras directas a disco y, de este modo, hacer más fiables las operaciones de
escritura. El comando sync permite vaciar puntualmente la caché de un sistema de archivos que
no se haya montado con esta opción de montaje.
Las
comando umount: opciones y parámetros
opciones
opciones Opcional: opciones de desmontaje. más
comunes
dispositivo Opcional si el punto de montaje se ha definido: el periférico que son -
se desea desmontar. f (force:
punto_de_montaje Opcional si el periférico se ha definido: el directorio que sirve de forzar el
punto de montaje que queremos liberar.
desmontaje) y -l (lazy: desmontaje perezoso que se hará efectivo cuando todos los recursos utilizados por el
montaje hayan sido liberados).
El desmontaje de un sistema de archivos es necesario para realizar su revisión mediante el comando e2fsck.
Por definición, el sistema de archivos montado en / no se puede desmontar debido a que está siempre
ocupado. Se puede forzar la comprobación antes del montaje cuando arranca el sistema desde el
comando shutdown.
shutdown -F -r now
El comando mount sin argumentos permite visualizar los sistemas de archivos montados.
Además, cada montaje con éxito genera su línea correspondiente en el archivo /etc/mtab. La visualización
del archivo /proc/mounts devuelve la misma información.
c. Archivo fstab
El archivo /etc/fstab permite definir los sistemas de archivos o los espacios de swap que se montarán
automáticamente en el arranque. De forma opcional también permite definir sistemas de archivos que es
posible que se monten, como por ejemplo los periféricos extraíbles. La sintaxis del comando mount invocado
puntualmente se simplificará bastante.
El archivo /etc/fstab tiene que tener en cada línea el conjunto de elementos necesarios para el montaje de
un sistema de archivos. Estos elementos son el punto de montaje, la definición del espacio de
almacenamiento y las opciones de montaje. Para los espacios de swap la definición del punto de montaje no
es aplicable.
El archivo /etc/fstab se compone de una línea por cada sistema de archivos que se montará. A su vez, cada
línea se compone de seis campos obligatorios.
Ejemplo
Archivo /etc/fstab: formato de las líneas de definición de montaje de
Número Campo Definición archivo
de /etc/fstab
campo en
Ubuntu
1 fs Sistema de archivos, definido por su archivo especial
de bloque, su etiqueta o su uuid. Observe
que los
2 puntodemontaje Punto de montaje. discos se
3 tipo Tipo de sistema de archivos. Obligatoriamente swap
para swap, auto o tipo real de sistema de archivos en
caso contrario.
a. El comando tar
El comando tar, de uso universal en los entornos Linux, se tiene que conocer con detalle. Su riqueza funcional
puede impresionar, pero aunque el comando tar presenta muchas opciones, las que realmente se usan en la
mayoría de los casos son menos de una decena.
Aunque
Comando tar: opciones y parámetros
no sea
acción -c Crea un archivo de recopilación. Por lo tanto, será obligado,
necesario indicar con un último parámetro el directorio a es
partir del cual se creará el archivo.
costumbre ponerle una extensión ".tar" a los archivos de recopilación tar, seguido de una extensión
relacionada con el modo de compresión ".gz" o ".bzip2".
En caso de usar del comando tar para crear copias de seguridad, se redirigirá el archivo de copia de
seguridad a un periférico extraíble o a un espacio de almacenamiento remoto.
A:~# ls
ejemplo
A:~# # nota: creación del archivo
A:~# tar czf [Link] ejemplo
A:~# ls
[Link] ejemplo
A:~# # nota: destrucción del directorio
A:~# rm -r ejemplo
A:~# ls
[Link]
A:~# # nota: restauración del archivo
A:~# tar xzf [Link]
A:~# ls
[Link] ejemplo
A:~#
Si el comando tar se emplea para crear un archivo en cinta magnética y no sobre disco se
recomienda no utilizar ningún tipo de compresión. El formato comprimido impediría una
recuperación parcial de los datos en caso de deterioro de la cinta.
b. El comando cpio
El comando cpio, cuyo uso tiende a desaparecer en los entornos Linux, permite realizar archivos de
recopilación no comprimidos a partir de un conjunto de archivos y directorios.
cpio tiene un uso particularmente poco intuitivo y generalmente no se usa, salvo en casos específicos. El
problema de cpio es que este comando no permite que se le definan los elementos de los que se quiere
generar una copia de seguridad por parámetro tal y como se hace con el comando tar. Hay que indicarle
estos elementos en forma de lista de archivos por su entrada estándar. Del mismo modo, todas las
operaciones en salida se realizan por redirección de la salida estándar. El comando cpio ha sobrevivido a
pesar de estas desventajas de otro tiempo, y lo ha hecho gracias a estas limitaciones sintácticas: la lista de
archivos de los que se desea guardar una copia de seguridad se proporciona casi siempre mediante una
redirección del resultado del comando find. Sin embargo, sabemos desde el nivel 1 de la certificación LPI que
el comando find es capaz de realizar búsquedas extremadamente precisas a partir de muchos criterios. Por lo
tanto, es en aquellos casos donde queramos realizar copias de seguridad muy selectivas en los que se
utilizará cpio.
Ejemplo
Comando cpio: opciones y parámetros
de uso
directorio El directorio base a partir del que se realiza la búsqueda. del
comando
criterio Criterios de búsqueda según la sintaxis del comando find. cpio
opciones - Modo copy-out. Indica que se está en modo de creación del Aunque
o archivo de recopilación. Si se usa, no se pueden usar las
es
opciones i y t.
imprescindible saber usar el comando tar de forma natural, no sucede lo mismo con cpio, no se puede recordar de
forma razonable la sintaxis de este comando.
A:~# ls
ejemplo
A:~# # nota: creación del archivo
A:~# find ejemplo -print | cpio -o > [Link]
1 block
A:~# ls
[Link] ejemplo
A:~# # nota: destrucción del directorio ejemplo
A:~# rm -rf ejemplo
A:~# # nota: restauración del archivo
A:~# cpio -i < [Link]
1 block
A:~# ls
[Link] ejemplo
A:~#
Las utilidades dump y restore permiten realizar copias de seguridad incrementales y la restauración de un
sistema de archivos entero.
En este
ejemplo, 0 es el nivel de la copia de seguridad (0 para copia de seguridad completa, n para cada número de
incremento); la opción -f indica el archivo de destino de la copia de seguridad y finalmente el último parámetro
es el archivo de bloque especial del sistema de archivos que se desea guardar.
restauración (y no otra operación como una comparación, por ejemplo); v permite que el comando sea un
poco más locuaz y f anuncia el archivo de copia de seguridad a restaurar. La restauración de archivos se
realiza en el directorio actual.
Las utilidades xfsdump y xfsrestore permiten realizar copias de seguridad incrementales y restauraciones de
un sistema de archivos xfs entero. Las características del sistema de archivos xfs que se desea guardar
pueden mostrarse por el comando xfs_info según se necesite.
La
opción -
root@alfa:/mnt# xfsdump -f cs /dev/sdb2 f
xfsdump: using file dump (drive_simple) strategy anuncia
xfsdump: version 3.0.4 (dump format 3.0) - Running single-threaded el
archivo
============================ dump label dialog =============================
de
destino
please enter label for this dump session (timeout in 300 sec) -> label-session
session label entered: "label-session" de la
copia de
---------------------------- end dialog -----------------------------
xfsdump: WARNING: most recent level 0 dump was interrupted, but not resuming
that dump since resume (-R) option not specified
xfsdump: level 0 dump of alfa:/mnt/web
xfsdump: dump date: Sun Sep 30 [Link] 2012
xfsdump: session id: 023ee21-b2a2-5deb-a901-aa43889ef9ee2
xfsdump: session label: "label-session"
xfsdump: ino map phrase 1: constructing initial dump list
xfsdump: ino map phrase 2: skipping (no pruning necessary)
xfsdump: ino map phrase 3: skipping (only one dump stream)
xfsdump: ino map construction complete
xfsdump: estimated dump size: 35401 bytes
please enter label for media in drive 0 (timeout in 300 sec) -> label-media
media label entered: "label-media"
---------------------------- end dialog -----------------------------
seguridad, cs es el archivo objetivo, y sdb2 el sistema de archivos que hay que guardar.
La
opción -
root@alfa:/mnt# xfsrestore -f cs web f
xfsrestore: using file dump (drive_simple) strategy anuncia
xfsrestore: version 3.0.4 (dump format 3.0) - Running single-threaded el
xfsrestore: searching media for dump
archivo
xfsrestore: examining media file 0
que
xfsrestore: dump description:
xfsrestore: hostname: alfa
xfsrestore: mount point: /mnt/web
xfsrestore: volume: /dev/sdb2
xfsrestore: session time: Sun Sep 30 [Link] 2012
xfsrestore: level: 0
xfsrestore: session label: "label-session"
xfsrestore: media label: "label-media"
xfsrestore: file system id:
xfsrestore: session id: 023ee21-b2a2-5deb-a901-aa43889ef9ee2
xfsrestore: media id:
xfsrestore: using online session inventory
xfsrestore: searching media for directory dump
xfsrestore: reading directories
xfsrestore: 1 directories and 4 entries processed
xfsrestore: directory post-processing
xfsrestore: restoring non-directory files
xfsrestore: restore complete: 0 seconds elapsed
xfsrestore: Restore Status: SUCCESS
root@alfa:/mnt#
a. AMANDA
AMANDA (Advanced Maryland Automatic Network Disk Archiver) es una solución de copias de seguridad creada
inicialmente por la universidad de Maryland con licencia BSD. Disponible con licencia libre (gratuita) o comercial,
AMANDA permite hacer copias de seguridad de forma local o en red, en discos o en cintas, de los datos de
sistemas Linux/Unix o Windows.
b. Bacula
Bacula es un programa con licencia GPL que permite crear copias de seguridad de forma local o en red, en
discos o en cintas, de los datos de sistemas Linux/Unix o Windows.
c. BackupPC
BackupPC es un programa con licencia GPL que permite crear copias de seguridad de forma local o en red, en
discos o en cintas, de los datos de sistemas Linux/Unix o Windows.
La mayoría de los grandes fabricantes de software de copia de seguridad soportan, a menudo de forma
opcional, la creación de copias de seguridad de sistemas Linux. Por ello, habrá que instalar en cada sistema
un agente de copia de seguridad que permitirá enviar los datos al servidor de copias de seguridad.
El comando de copia bloque a bloque dd permite realizar copias de bajo nivel de un periférico. Se utiliza
especialmente para la duplicación de discos duros, pero también para la creación de imágenes binarias de
periféricos de almacenamiento.
Utilización
Comando dd: opciones y parámetros
del
entrada El archivo que se copiará. Generalmente un archivo especial de comando
bloque. dd para
una copia
salida El archivo destino de la copia, puede ser un archivo especial de de disco
bloque o un archivo normal. duro
tamaño_del_bloque Opcional. Determina el tamaño de los bloques que se copiarán. Copia del
número_de_bloques Opcional. El número de bloques que se desea copiar. Si se disco sdb
omite el parámetro la copia se detiene cuando ya no quedan al disco
más bloques para copiar. sdc.
El archivo iso generado se puede grabar con cualquier programa de grabación o se puede usar en una máquina
virtual.
Borrado físico de todos los bloques de una memoria usb visto como el dispositivo sdd. Atención, los datos no se
podrán recuperar por ningún medio sencillo. ¡No debe equivocarse de disco!
Comando dd utilizado para crear un espacio de swap o generar grandes archivos para pruebas de copia.
root@servidor# dd if=/dev/zero of=/home/usuario/archivovacío bs=1024 count=100000
root@servidor#
Los archivos iso son imágenes binarias de cdrom o dvdrom. Las imágenes iso se pueden montar con el
comando mount, se pueden grabar con cualquier software de grabación y se pueden usar en máquinas
virtuales que las interpretan como unidades de cdrom. Puede ser útil generar imágenes iso a partir de una
estructura de directorios. Para ello, podemos usar el comandomkisofs.
Ejemplo
Comando mkisofs: opciones y parámetros
de uso
-J Opcional: genera registros Joliet además de la estructura de nombres del
iso9660. Mejora la compatibilidad con los sistemas Windows.
comando mkisofs
El archivo iso generado puede grabarse directamente con cualquier software de grabación.
pedro@ubuntu:~/Temp$ ls
data
pedro@ubuntu:~/Temp$ mkisofs -o [Link] data
I: -input-charset not specified, using utf-8 (detected in locale settings)
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 8192
Path table size(bytes): 50
Max brk space used 23000
178 extents written (0 MB)
pedro@ubuntu:~/Temp$ ls
[Link] data
pedro@ubuntu:~/Temp$ file [Link]
[Link]: ISO 9660 CD-ROM filesystem data ’CDROM ’
pedro@ubuntu:~/Temp$
mkisofs es el nombre histórico del comando que permite crear archivos iso. Sin embargo, este
comando se ha renombrado recientemente a genisoimage, y mkisofs está presente en las
distribuciones recientes en forma de enlace simbólico a genisoimage.
La imagen iso generada es un archivo único en principio inaccesible si no se usa un software apropiado. De
hecho, se puede montar el archivo de imagen como si de un periférico cualquiera se tratara.
Donde archivo_de_imagen representa la imagen iso que se montará y punto_de_montaje el directorio que la
albergará. La opción loop es imprescindible para el montaje de un archivo de imagen.
En el marco de las estrategias de conservación de datos, puede ser útil replicar los datos de un servidor a
otro, ya sea para garantizar la disponibilidad geográfica de datos idénticos o para prevenir un posible fallo de
un disco duro o de un servidor. El comando rsync cumple esta tarea a la perfección.
rsync ofrece muchos modos de funcionamiento, pero el más común en el marco de la sincronización de datos
es el de disponer de un servicio rsync en un servidor y planificar sincronizaciones regulares desde las
máquinas que contienen los datos que hay que replicar.
Para necesidades puntuales, el comando rsync puede usarse localmente para sincronizar dos
estructuras de directorios. Su sintaxis es entonces equivalente a la del comando cp.
La configuración se realiza mediante dos archivos: el archivo /etc/default/rsync que se deberá modificar y el
archivo /etc/[Link] que se tendrá que crear.
RSYNC_ENABLE=true
uid = usuario
read only = false
[instancia]
path = directorio
Después
Archivo /etc/[Link]: directivas y parámetros
de
usuario La cuenta de usuario que se utilizará para realizar las escrituras en
el servidor.
/etc/init.d/rsync restart
La sincronización se realizará bajo demanda o mediante una tarea planificada con el comandorsync.
Si la sincronización de datos tiene que hacerse en un entorno hostil, se puede recurrir a SSH para el
transporte de datos. En este modo de funcionamiento el daemon rsync no se ejecuta en el servidor y el
ejecutable se inicia sobre la marcha por SSH para cada conexión entrante.
Ejemplo
rsync con ssh: opciones y parámetros
de
-a Modo archivo: replica los datos de modo idéntico, conservando
especialmente los permisos y los propietarios.
sincronización segura
El comando rsync permite crear una réplica entre discos de distintos sistemas con bajo coste.
Sólo tratamos los RAID gestionados por software por el núcleo de Linux. Para un servidor en
producción, es probable que el RAID esté gestionado por una controladora hardware. En este
caso, la controladora presentará unidades lógicas (LUN) que se verán como particiones normales y
para el sistema es indiferente si la controladora trabaja en RAID o no.
a. RAID 0
RAID 0 tiene como único objetivo la rapidez de acceso a los datos y no gestiona de modo alguno la tolerancia
a los fallos. Es muy importante saber que en RAID 0 el fallo de cualquiera de los elementos provoca la pérdida
total de los volúmenes utilizados. El principio de RAID 0 es repartir los datos escritos en bloques y escribir los
bloques al mismo tiempo en los discos físicos que componen el volumen RAID.
El espacio utilizable en un volumen RAID 0 es igual a la suma de los espacios de disco utilizados.
b. RAID 1
RAID 1, al contrario que RAID 0, no busca en ningún caso mejorar el rendimiento, sino únicamente asegurar
los datos. En RAID 1, cada bloque de datos se duplica y se escriben tantas copias como discos hay en el
volumen RAID. De este modo, si un disco falla, los datos siguen estando disponibles.
c. RAID 5
RAID 5 reúne las ventajas de RAID 0 y de RAID 1. Hay que disponer de al menos 3 discos para configurarlo.
Cuando se produce una operación de escritura en un volumen RAID 5, los bloques de datos se escriben
usando todos los discos del volumen, a excepción de un bloque de paridad en un disco que se deduce a partir
de los bloques de datos con un XOR ("o exclusivo"). En caso de fallo de un disco, los bloques de datos que
faltan se recalculan realizando una operación XOR de todos los bloques restantes, datos y paridad.
El espacio explotable en un volumen RAID 5 es igual a la suma de los espacios de disco usados menos uno y
menos un posible disco de reserva (spare).
2. Configuración de RAID
Los volúmenes RAID se configuran bastante fácilmente mediante el comando mdadm. Hay que disponer de
varios espacios de almacenamiento, discos duros enteros o particiones, determinar el nivel de RAID deseado
y elegir el nombre o el número del volumen que se desea crear.
El comando mdadm tiene su configuración, especialmente el orden de escaneo de todas las particiones
encontradas en /proc/partitions, en su archivo de configuración /etc/mdadm/[Link]. Generalmente no es
necesario modificar la configuración por defecto.
Ejemplo
Creación de un volumen con mdadm: opciones y parámetros
de la
acción -C: crea un volumen RAID. creación
de un
-S: desactiva un volumen y libera los recursos. volumen
RAID 1
volumen El archivo de bloque que se creará para representar el nuevo
en Debian
volumen. A menudo es /dev/mdx, pero puede tener un nombre
cualquiera. Se usan
nivel Valor del nivel de RAID, generalmente 0, 1 o 5. los dos
discos
número_de_discos Número de espacios de almacenamiento que se van a usar, duros
seguido de los archivos de bloque que representarán a estos /dev/sdb
espacios. y
/dev/sdc
almacenes Periféricos de almacenamiento separados por espacios e
para crear
identificados por su archivo especial de bloque.
el
volumen
RAID1
Es también el comando mdadm el que nos permitirá conocer el estado y la naturaleza de un volumen RAID
desconocido.
mdadm -D volumen
Donde volumen es el archivo especial de dispositivo de bloque que representa el volumen RAID.
Es importante conocer y utilizar los comandos de diagnóstico para una buena administración y documentación del
almacenamiento.
El
# mdadm -D /dev/md0
A:~# mdadm -D /dev/md0
/dev/md0:
Version : 00.90
Creation Time : Wed Jan 13 [Link] 2010
Raid Level : raid5
Array Size : 4194176 (4.00 GiB 4.29 GB)
Used Dev Size : 2097088 (2048.28 MiB 2147.42 MB)
Raid Devices : 3
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent
Layout : left-symmetric
Chunk Size : 64K
Rebuild Status : 90% complete
archivo /proc/mdstat también proporciona información sobre el estado de los discos RAID en un
sistema Linux.
El archivo mdstat proporciona una visualización resumida de los volúmenes RAID y de los discos que lo componen.
Personalities : [raid0]
md0 : active raid0 sdb[1] sda[0]
4194176 blocks 64k chunks
Una vez que se han creado los volúmenes con el comando mdadm, éstos se identifican por sus
respectivos archivos de bloque especiales y soportarán la creación de un sistema de archivos así como el
montaje, ya sea manual o invocado desde el archivo /etc/fstab.
Logical Volume Manager
El sistema de particionamiento tradicional de los discos impone ciertas restricciones tales como un
número máximo de 4 particiones o el carácter obligatoriamente contiguo del espacio particionado. Aunque existe
un gran número de utilidades que permiten redimensionar particiones sobre la marcha, no se puede extender
una partición con espacio no contiguo, por ejemplo con otra unidad de disco duro. Para superar estas
limitaciones la mayoría de los creadores de sistemas operativos han creado sistemas de administración de
espacios de disco más o menos propietarios, como los discos dinámicos para Windows o los volúmenes NSS de
Novell. Para los sistemas Linux la solución se llama Logical Volume Manager (administrador de volúmenes
lógicos). Los volúmenes lógicos permiten crear un número ilimitado de volúmenes y extenderlos a voluntad,
incluso a partir de espacios de almacenamiento que se encuentran en discos y controladoras distintos.
Es costumbre conservar los términos ingleses cuando se habla de elementos LVM, lo que ayudará
especialmente a recordar de manera sencilla los comandos de uso. Algunos términos, como los Logical Volumes
que admiten una traducción fácil y natural, se seguirán llamando en su forma inglesa.
Una arquitectura LVM se compone de PV (Physical Volumes), de VG (Volume Groups) y de LV (Logical Volumes).
Un volumen lógico es el equivalente funcional de una partición tradicional, se identifica por un archivo especial
de bloque y albergará generalmente un sistema de archivos para ser montado.
Los Logical Volumes se componen de bloques de datos, extraídos en una capa de abstracción llamada Volume
Group, que a su vez se alimenta de los espacios de almacenamiento brutos (discos o particiones) llamados
Physical Volumes.
En una arquitectura LVM basada en varios volúmenes físicos el fallo en cualquiera de ellos
provocará que todos los volúmenes lógicos que dependen de él queden fuera de servicio. Por
tanto, es conveniente crear sólo volúmenes físicos para volúmenes con tolerancia a fallos como los
que están en RAID, ya sea software o hardware.
2. Comandos LVM
Los comandos de administración del LVM se construyen con un prefijo que determina el objeto que se desea
administrar junto a un sufijo que es la acción administrativa que se quiere realizar.
prefijo sufijo
a. Creación de elementos
Se comenzará creando los PV (physical volumes) a partir de espacios de almacenamiento. Pueden ser discos
enteros o particiones tradicionales, cuyo tipo deberá modificarse a 8e. Cabe decir que la construcción de un
PV a partir de particiones tradicionales se reserva generalmente a pruebas y que un uso en producción para
volúmenes de datos se basa casi siempre en discos enteros.
pvcreate dispositivo
Donde dispositivo representa el archivo especial de bloque que alberga el volumen físico, ya sea disco o
partición.
El grupo
vgcreate: opciones y parámetros
de
nombre_vg Nombre del grupo de volúmenes. Valor a su elección.
volúmenes creado de este modo aparecerá como un directorio, con el nombre del grupo de volúmenes
creado, directamente en /dev. Atención, este directorio sólo aparecerá realmente cuando se haya creado un
primer volumen lógico a partir del grupo de volúmenes.
Los volúmenes lógicos se crean con el comando lvcreate. Se pueden crear tantos volúmenes lógicos como se
deseen siempre y cuando quede espacio disponible en el Volume Group.
El
lvcreate: opciones y parámetros
volumen
tamaño Tamaño del volumen lógico. Es un valor numérico seguido directamente lógico
de la unidad. creado
nombre_lv Nombre del volumen lógico. Valor a su elección. de este
modo
nombre_vg Nombre del grupo de volúmenes a partir del cual se creará el volumen
lógico.
aparecerá como un archivo especial de bloque en el directorio que tiene el nombre de su grupo de volúmenes
en /dev. Éste será el archivo especial que se usará para las operaciones de montaje.
Las arquitecturas LVM son a menudo desconcertantes, dado que hay que realizar un gran número de
operaciones para realizar la creación de un volumen lógico. Además, aunque uno se figure bastante bien lo
que puede ser un volumen físico, la naturaleza abstracta del grupo de volúmenes dificulta su comprensión.
Por estas razones, es esencial hacerse una idea precisa del conjunto de elementos utilizados en una
arquitectura LVM y documentarlos a conciencia. Por suerte, las herramientas de diagnóstico del LVM son
precisas y permiten en cada fase comprobar que las operaciones se hayan desarrollado correctamente.
La información detallada de todos los volúmenes físicos presentes en un sistema se muestra mediante
el comando pvdisplay. Si prefiere obtener información más resumida, puede probar conpvs.
Es importante identificar los volúmenes físicos con el comando pvdisplay. La utilidad fdisk indicaría un disco sin
tabla de particiones y daría a entender que es un disco virgen.
Ejemplo
de uso
A:~# pvdisplay del
"/dev/sdb" is a new physical volume of "2,00 GB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 2,00 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID UHSnwO-EKMh-QbDn-1qj0-f7Az-KKkx-3XcyZz
A:~#
comando pvs
A:~# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 -- 2,00G 2,00G
A:~#
La visualización de los detalles de los grupos de volúmenes permite conocer el tamaño total disponible en los
mismos.
A:~# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 1 0 0 wz--n- 2,00G 2,00G
A:~#
La información detallada de todos los volúmenes lógicos presentes en el sistema se muestra mediante
el comando lvdisplay. Para obtener información más resumida, pruebe con lvs.
Ejemplo
de uso
A:~# lvdisplay del
--- Logical volume ---
LV Name /dev/vg1/data1
VG Name vg1
LV UUID Ll7105-aLpz-axKC-Hcuq-pPSq-QZaK-8h5PLC
LV Write Access read/write
LV Status available
# open 0
LV Size 400,00 MB
Current LE 100
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
A:~#
comando lvs
A:~# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
data1 vg1 -wi-a- 400,00M
A:~#
c. Extensión de volúmenes lógicos
Una de las principales ventajas de los volúmenes lógicos es la manera tan sencilla de extenderlos.
Hemos visto que un volumen lógico se constituye de Logical Extents proporcionados por un objeto
Volume Group. Por lo tanto, es fácil extender el Logical Volume con estos Logical Extents. Dicho de otro modo,
si queda espacio libre sin asignar en el grupo de volúmenes, se puede agregar a un volumen lógico ya
creado. En caso contrario será necesario extender el Volume Group con anterioridad añadiendo uno o varios
Physical Volumes.
La extensión de un Volume Group se realiza a partir de Physical Volume(s) con el comandovgextend. Los
Physical Volumes se crean como se ha explicado anteriormente mediante el comando pvcreate.
dispositivo_pv Archivo especial de bloque que alberga el o los PV que nutrirán el VG.
lvextend -L tamaño lv
d. Reducción de un LV
Es posible aplicar reducciones a los elementos LVM, aunque este tipo de operaciones siempre es delicado y
hay que dominarlo para su realización.
La reducción de un volumen lógico ser realiza con el comando lvreduce. Los Logical Extent se retiran cuando
se ejecuta el comando y todos los datos que alberga se perderán. Se deberá tomar todas las precauciones
para evitar pérdidas de datos.
Reducción de un LV
lvreduce -L tamaño lv
Reducción de un VG
vgreduce vg pv
Una vez que se han creado los Logical Volumes, para usarlos hay que crearles un sistema de archivos. Se ha
de tener bien claro que, desde un punto de vista funcional, los volúmenes lógicos son totalmente
equivalentes a las particiones tradicionales creadas directamente con fdisk y de tipo Linux. El enfoque será
idéntico al que se usará en particiones tradicionales, excepto el archivo especial de bloque que será el del
Logical Volume.
Los volúmenes lógicos aceptan la creación de sistemas de archivos como las particiones tradicionales. Observe el
archivo especial de bloque bajo el que se identifica el volumen lógico.
De igual
modo,
A:~# mke2fs -j /dev/vg1/lv99 para
mke2fs 1.41.3 (12-Oct-2008) hacer
Etiqueta del sistema de ficheros= uso de
Tipo de SO: Linux
este
Tamaño del bloque=4096 (bitácora=2)
sistema
Tamaño del fragmento=4096 (bitácora=2)
Stride=0 blocks, Stripe width=0 blocks de
131072 nodos-i, 524288 bloques archivos
26214 bloques (5.00%) reservados para el superusuario tendrá
Primer bloque de datos=0 que
Número máximo de bloques del sistema de ficheros=536870912 montar
16 bloque de grupos el
32768 bloques por grupo, 32768 fragmentos por grupo volumen
8192 nodos-i por grupo lógico,
Respaldo del superbloque guardado en los bloques: ya sea
32768, 98304, 163840, 229376, 294912 de
forma
Escribiendo las tablas de nodos-i: hecho manual
Creating journal (16384 blocks): hecho o
Escribiendo superbloques y la información contable del sistema de
ficheros: hecho
La naturaleza flexible y evolutiva del LVM hace que sea perfectamente capaz de almacenar grandes
volúmenes de datos. Sin embargo, un problema recurrente surge al generar copias de seguridad de estos
volúmenes de datos. En efecto, el tiempo necesario para la copia de seguridad impide a menudo que se
realicen operaciones en línea. La solución está en la funcionalidad snapshot (instantánea) disponible en las
arquitecturas LVM.
Se realiza la snapshot del volumen lógico que se desea copiar cuando éste se ha montado y está en uso.
Posteriormente, se efectúa la copia de seguridad a partir de la snapshot del volumen lógico que se ha
generado del momento exacto en que se realizó. Hay que comprender que una snapshot no es una
herramienta de copia de seguridad como tal, sino un medio que se utiliza en la estrategia de copias de
seguridad.
Realización de la snapshot
Las snapshots se generan con el comando lvcreate. Una snapshot es por lo tanto un volumen lógico entero
separado del original, que se podrá montar y usar cuando se necesite.
Hay que determinar el tamaño de la snapshot en su creación. El volumen lógico de snapshot sólo
almacena físicamente las diferencias entre el volumen de producción (del que se ha generado la snapshot) y
el volumen de snapshot. Si no se producen escrituras en el volumen en producción, el consumo de espacio
para la snapshot será casi nulo. Si todos los datos se modifican en el volumen de producción, la snapshot
explotará físicamente un espacio en disco del orden del espacio del volumen de datos en el momento en que
se realizó la snapshot. El espacio usado por la snapshot puede controlarse mediante el comando lvdisplay.
Ejemplo
lvcreate para snapshots: opciones y parámetros
de
-L tamaño Tamaño de la snapshot que se creará. creación
de
-s Opción que indica que se crea una snapshot de volumen lógico,
y no un volumen lógico normal.
snapshots
Ejemplo
de
A:/mnt# lvcreate -L 1G -s -n clicclac /dev/vg1/data1
Logical volume "clicclac" created
A:/mnt#
En el ejemplo mostrado a continuación, no se han modificado los datos en el volumen de origen entre el lvcreate -s
y el lvdisplay. Por tanto, se observa que el valor de "Allocated to snapshot" es 0%.
En este
segundo
A:/mnt# lvdisplay /dev/vg1/clicclac
--- Logical volume --- ejemplo
LV Name /dev/vg1/clicclac se han
VG Name vg1 añadido
LV UUID xyakf0-2zMf-B3qG-S9gT-KTqw-ZJI3-W06GWi datos al
LV Write Access read/write volumen
LV snapshot status active destination for /dev/vg1/data1 de
LV Status available
origen,
# open 0
LV Size 1,49 GB
Current LE 381
COW-table size 1,00 GB
COW-table LE 256
Allocated to snapshot 0,00%
Snapshot chunk size 4,00 KB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
A:/mnt#
obligando al sistema a conservar dos versiones: los datos de la snapshot, disponibles para la copia de seguridad, y
los datos nuevos escritos en el disco y asignados al volumen en producción. El valor de "Allocated to snapshot" es
ahora 1,45 %.
Desde el punto de vista del LVM, no hay que hacer nada más. Los datos están disponibles, fijados en el
momento en que se creó la snapshot, y se puede generar una copia de seguridad por cualquier tipo de medio
habitual.
En este ejemplo, se monta el volumen lógico de la snapshot en un directorio /mnt/clicclac, y se crea un archivo tar
comprimido de los datos que se almacenará en un dispositivo USB.
1. Preguntas
1 ¿Por qué es necesario crear un sistema de archivos para utilizar un espacio de almacenamiento en un
disco?
2 ¿Cuánto espacio de disco pueden llegar a ocupar los sistemas de archivos virtuales o pseudosistemas de
archivos?
3 Los UUID sirven para identificar formalmente un sistema de archivos. ¿Qué o quién garantiza su
unicidad?
5 ¿Por qué es difícil comprobar la coherencia del sistema de archivos raíz montado en /?
7 ¿Por qué las opciones de compresión del comando tar deben estar reservadas a las copias de seguridad
en disco?
8 ¿Se requiere que el cdrom esté montado en la copia de un cdrom con el comando dd para la realización
de una imagen iso?
2. Respuestas
1 ¿Por qué es necesario crear un sistema de archivos para utilizar un espacio de almacenamiento en un
disco?
Porque el sistema de archivos es el que permite organizar el espacio de almacenamiento. Sin él, una partición o
un volumen lógico es tan sólo una serie de bytes sin sentido alguno. El sistema de archivos gestiona los
nombres de los archivos y la ubicación física de los espacios de almacenamiento. Una cinta magnética es un
ejemplo de espacio de almacenamiento sin sistema de archivos: los datos están contiguos forzosamente y no
es posible modificar un archivo. Hay que borrarla y reescribirla.
2 ¿Cuánto espacio de disco pueden llegar a ocupar los sistemas de archivos virtuales o pseudosistemas de
archivos?
Ninguno. Como su nombre indica, los sistemas de archivos virtuales no existen físicamente. Habitan en
memoria y se montan en un directorio del sistema de archivos real.
3 Los UUID sirven para identificar formalmente un sistema de archivos. ¿Qué o quién garantiza su
unicidad?
El azar. El UUID es, cada vez en más sistemas, la forma natural de identificar un sistema de archivos. Aunque
los UUID puedan modificarse a voluntad del administrador, generalmente se asignan de forma automática en
la creación de los sistemas de archivos y la aleatoriedad de 128 bits es su única garantía de unicidad.
Con una escritura asíncrona: los datos escritos en disco se registran en primer lugar en memoria para más
tarde escribirse en el disco. Este modo de funcionamiento, utilizado por defecto en el marco de un montaje
normal, no está exento de riesgos. Los datos se consideran guardados de forma segura por parte de las
aplicaciones y del usuario. En el caso de corte de la corriente eléctrica, los datos que estén en memoria
pendientes de grabarse en el disco se perderán.
5 ¿Por qué es difícil comprobar la coherencia del sistema de archivos raíz montado en /?
Porque los comandos de comprobación se ejecutan con sistemas de archivos desmontados. El sistema de
archivos raíz contiene un gran número de programas en ejecución en un sistema activo y, a menudo, los
propios comandos de comprobación. Por lo tanto es imposible desmontarlo porque los programas que están en
ejecución impiden la realización de esta operación. La solución consiste en forzar la comprobación en el reinicio,
antes de que se monte el sistema de archivos. Se puede provocar esta comprobación de dos modos:
modificando el contador de comprobación periódica con el comando e2fsck o bien forzando la comprobación con
el comando shutdown y su opción -F.
El comando lsdev, como otros muchos comandos, busca la información que necesita en los archivos de los
pseudosistemas de archivos (/proc/interrupts, /proc/ioports, y /proc/dma). Esto ilustra hasta qué punto es
importante y útil la información que albergan los pseudosistemas de archivos.
7 ¿Por qué las opciones de compresión del comando tar deben estar reservadas a las copias de seguridad
en disco?
Porque la compresión de datos hace que sean más difíciles de usar en caso de pérdida parcial. Las cintas
magnéticas que se usaban tradicionalmente con el comando tar presentaban a menudo zonas de
magnetización débil que las exponían a pérdidas parciales. Sin embargo, en estas circunstancias, la ausencia
de compresión limitaba la pérdida a solamente los archivos albergados en estas zonas débiles.
8 ¿Se requiere que el cdrom esté montado en la copia de un cdrom con el comando dd para la realización
de una imagen iso?
No. El sistema de archivos tiene que montarse si hay que copiar archivos concretos. Como el comando dd
copia bloques de datos sin comprender su contenido, manipulando directamente el hardware y no los archivos,
no es necesario montar el cdrom para realizar una imagen.
Tres como mínimo. Dos para los datos y un tercero para la paridad. Si se incluye un disco de recambio (spare)
en la configuración, este mínimo pasa a ser de cuatro: dos discos de datos, un disco de paridad y un disco
preparado para reemplazar a otro disco que falle.
Depende. Desde un punto de vista funcional ninguna: los dos tendrán un sistema de archivos y se montarán
en un directorio. Sin embargo, solamente se podrá agrandar el volumen lógico cuando sea necesario (mediante
el comando lvextend). No obstante, este cambio de tamaño no modificará el sistema de archivos, que deberá
reorganizarse mediante un comando de redimensionamiento del sistema de archivos (resize2fs).
Trabajos prácticos
Comandos útiles
cat
chmod
dd
file
mkswap
swapon
Operaciones
4. Estructurar el archivo para que el núcleo pueda usarlo como espacio de swap.
Comprobación:
b.
Comandos útiles
cat
swapon
Operaciones
c.
Hacer
alfa:~# swapon -s
Filename Type Size Used Priority
/dev/sda5 partition 369452 588 -1
/swap file 524280 0 -2
alfa:~# cat /proc/swaps
Filename Type Size Used Priority
/dev/sda5 partition 369452 588 -1
/swap file 524280 0 -2
alfa:~#
referencia en fstab
Comandos útiles
cat
reboot
shutdown
swapon
vi
Operaciones
1. Añadir en el archivo fstab una línea que haga referencia al nuevo espacio de
swap.
2. Reiniciar el sistema.
2.
alfa:~# cat /proc/swaps
Filename Type Size Used Priority
/dev/sda5 partition 369452 0 -1
/swap file 524280 0 -2
alfa:~#
Añada dos discos duros virtuales SATA de 2 GB en la máquina alfa según el procedimiento visto en la
introducción. Estos discos deberán ser vistos por el sistema como /dev/sdb y /dev/sdc.
En el servidor alfa, instale las herramientas de gestión RAID mediante el comando siguiente:
Comandos útiles
dmesg
ls
Operaciones
1. En el directorio /dev, listar todos los elementos que empiecen por hd o sd.
2. Consultar el "ring buffer" del núcleo para comprobar que los discos se han
reconocido en el arranque del núcleo.
3. Identificar el disco de sistema (que tiene que estar particionado) y los dos discos
añadidos.
c.
alfa:~# cd /dev
alfa:/dev# ls [hs]d*
sda sda1 sda2 sda5 sdb sdc
alfa:/dev#
Comandos útiles
cat
ls
mdadm
Operaciones
2. Comprobar la presencia del disco RAID creado por dos medios distintos.
3.
alfa:/dev# ls /dev/md0
/dev/md0
alfa:/dev# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdc[1] sdb[0]
4194176 blocks 64k chunks
En el servidor alfa, instale las herramientas de administración LVM mediante el comando siguiente:
b.
Comandos útiles
lvcreate
lvdisplay
pvcreate
pvdisplay
vgcreate
vgdisplay
Operaciones
Comprobación:
alfa:/dev# pvdisplay
"/dev/md0" is a new physical volume of "4,00 GB"
--- NEW Physical volume ---
PV Name /dev/md0
VG Name
PV Size 4,00 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID mBhGL1-i7oD-tc1k-7VX3-CQ1r-Q0AT-jAEgtj
alfa:/dev#
Comprobación:
alfa:/dev# vgdisplay
--- Volume group ---
VG Name volgrp
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 4,00 GB
PE Size 4,00 MB
Total PE 1023
Alloc PE / Size 0/0
Free PE / Size 1023 / 4,00 GB
VG UUID Dw1Qm8-BHeq-jNXN-uXVK-eaMF-gzA1-B7QwX8
alfa:/dev#
Comprobación:
c.
alfa:/dev# lvdisplay
--- Logical volume ---
LV Name /dev/volgrp/documentos
VG Name volgrp
LV UUID xIYS6m-mq88-13br-wbp7-sp5B-iN2b-wA1GEk
LV Write Access read/write
LV Status available
# open 0
LV Size 1,00 GB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
alfa:/dev#
Comandos útiles
mke2fs
tune2fs
Operaciones
Cambiamos a ext3:
Comprobación:
d.
Comandos útiles
cat
mkdir
mount
umount
Operaciones
2. Comprobar el resultado.
3. Desmontarlo.
4. Añadir una línea al archivo fstab para que su sistema de archivos se monte
automáticamente al arrancar el sistema.
alfa:/dev# mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/mapper/volgrp-documentos on /documentos type ext3 (ro)
alfa:/dev#
alfa:/dev# cat /proc/mounts
rootfs / rootfs rw 0 0
none /sys sysfs rw,nosuid,nodev,noexec 0 0
none /proc proc rw,nosuid,nodev,noexec 0 0
udev /dev tmpfs rw,size=10240k,mode=755 0 0
/dev/sda1 / ext3 rw,errors=remount-ro,data=ordered 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,nosuid,noexec,gid=5,mode=620 0 0
/dev/mapper/volgrp-documentos /documentos ext3 ro,errors=continue,data=
ordered 0 0
alfa:/dev#
alfa:/dev# cat /etc/mtab
/dev/sda1 / ext3 rw,errors=remount-ro 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
udev /dev tmpfs rw,mode=0755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
/dev/mapper/volgrp-documentos /documentos ext3 ro 0 0
alfa:/dev#
Archivo
/etc/fstab modificado:
Comprobación:
4.
alfa:/dev# mount -a
a. Ampliación del LV
Comandos útiles
df
lvdisplay
lvextend
Operaciones
alfa:/dev# df -h
S. ficheros Tamaño Usado Disp Uso% Montado en
/dev/sda1 7,6G 1,3G 6,0G 17% /
tmpfs 62M 0 62M 0% /lib/init/rw
udev 10M 616K 9,4M 7% /dev
tmpfs 62M 0 62M 0% /dev/shm
/dev/mapper/volgrp-documentos
1008M 34M 924M 4% /documentos
alfa:/dev#
alfa:/dev# lvdisplay
--- Logical volume ---
LV Name /dev/volgrp/documentos
VG Name volgrp
LV UUID xIYS6m-mq88-13br-wbp7-sp5B-iN2b-wA1GEk
LV Write Access read/write
LV Status available
# open 1
LV Size 3,00 GB
Current LE 768
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
alfa:/dev#
El
volumen lógico ha pasado a ser de 3 GB, pero el sistema de archivos montado, prisionero de su
estructura, queda fijo a su tamaño original.
Comandos útiles
e2fsck
mount
resize2fs
umount
Operaciones
2. Comprobar su integridad.
alfa:/dev#
Montaje y comprobación del tamaño:
1. Requisitos
Los conocimientos adquiridos en la certificación LPI nivel 1, especialmente:
Edición de archivos.
2. Objetivos
Cuando termine este capítulo usted será capaz de:
Para empezar, hay que saber que un sistema Linux siempre está en algún nivel de ejecución, sea cual sea su
actividad, ya se trate de un servidor apache que está respondiendo a una petición o un servidor nuevo todavía
en su caja. La gestión de los niveles de ejecución consistirá en determinar cuál debe ser el comportamiento del
sistema cuando éste entra en un nivel concreto.
Para simplificar, un nivel de ejecución es un nivel funcional en el que se ha determinado la lista de servicios
que se arrancan o se detienen. Cuando un sistema entra en un nivel de ejecución, siempre consulta si hay
que arrancar o parar servicios.
Nivel 0
El más simple: el sistema está detenido. Atención, esto no significa que no tenga que configurarse,
todavía tiene que gestionar lo que sucede cuando el sistema entra en el nivel 0, es decir, cuáles son los
servicios que se deben parar cuando se para físicamente una máquina.
El nivel 1 o monousuario
Un nivel un poco singular: está reservado para las operaciones de mantenimiento y solamente permite una
conexión, la de la cuenta root. Además, la mayor parte de los servicios están detenidos en este nivel, lo que
significa que el sistema tiene una actividad mínima. Esto es perfecto para el administrador que desea realizar
operaciones de mantenimiento sin interferir con producción.
El nivel 2
En la mayoría de los sistemas, este nivel no se utiliza. Se deja a disposición del administrador que
podrá establecer a partir de este nivel un modo de funcionamiento particular con solamente algunos servicios
iniciados.
En los sistemas Debian y derivados (Ubuntu por ejemplo) este nivel es, en cambio, el nivel funcional por
defecto.
El nivel 3
En la mayor parte de los sistemas el nivel 3 es funcional, es decir, que todos los servicios están iniciados, pero
no se dispone de interfaz gráfica.
El nivel 4
En la mayoría de los sistemas este nivel no se utiliza. Se deja a disposición del administrador que podrá
establecer a partir de este nivel un modo de funcionamiento particular con solamente algunos servicios
iniciados.
El nivel 5
En la mayor parte de los sistemas el nivel 5 es funcional, es decir, que todos los servicios están iniciados y la
interfaz gráfica está disponible.
En los sistemas Debian y derivados (Ubuntu por ejemplo) este nivel, en general, no se utiliza.
El nivel 6
Temporal por definición, el nivel 6 es el de un sistema que está reiniciando. La configuración del nivel 6
consistirá en determinar qué servicios tienen que detenerse para el reinicio del sistema. Después del reinicio
se aplicará un nuevo nivel de ejecución (en general el nivel por defecto) y se iniciarán los servicios asociados
a este nivel.
En la inmensa mayoría de los casos, es la definición inicial de los niveles de ejecución la que se usa. Es decir,
que el autor de la distribución (Ubuntu, Mandriva, Red Hat, etc.) elije lo que se debe activar en cada uno de
los niveles de ejecución. El administrador de sistemas se conforma con esta decisión.
Sin embargo, puede darse el caso que el administrador de sistemas prefiera gestionar él mismo la
configuración de los niveles de ejecución. Entonces puede elegir a qué nivel funcional corresponde cada uno
de los niveles de ejecución y cuáles son los servicios asociados. A cada nivel de ejecución le corresponde
entonces un conjunto de servicios.
Si se miran los procesos en ejecución en el sistema, el proceso init se encuentra en primera posición. Tiene un
PPID bastante particular (0) y es el padre de bastantes otros procesos.
Los procesos
Este
proceso
[root@beta ~]# ps -ef | head es el
UID PID PPID C STIME TTY TIME CMD primero
root 1 0 0 09:07 ? [Link] init [5] que se
root 2 1 0 09:07 ? [Link] [migration/0]
ejecuta
root 3 1 0 09:07 ? [Link] [ksoftirqd/0]
en el
root 4 1 0 09:07 ? [Link] [watchdog/0]
root 5 1 0 09:07 ? [Link] [events/0]
root 6 1 0 09:07 ? [Link] [khelper]
root 7 1 0 09:07 ? [Link] [kthread]
root 10 7 0 09:07 ? [Link] [kblockd/0]
root 11 7 0 09:07 ? [Link] [kacpid]
[root@beta ~]#
arranque del kernel. Tiene evidentemente un rol privilegiado y su comportamiento se rige por un archivo de
configuración: /etc/inittab.
b. El archivo inittab
Según las distribuciones, el archivo /etc/inittab tiene contenidos muy distintos, pero su estructura es
siempre la misma.
identificador:nivel:modo_acción:comando
Modos
Archivo /etc/inittab: estructura de una línea de definición
de acción
identificador Cadena alfanumérica de uno o dos caracteres. Identifica la línea. No
hay más restricciones salvo evitar tener dos líneas con el mismo
identificador.
nivel El o los niveles de ejecución (en cifras) para los cuales la línea es
adecuada.
comunes:
initdefault: siendo un poco particular, initdefault no rige la forma en la que el comando del
cuarto campo se ejecutará. Además, cuando el modo de acción es initdefault, el cuarto
campo está vacío. initdefault sólo sirve para definir el nivel de ejecución por defecto del
sistema.
sysinit: sirve para ejecutar scripts en la inicialización del sistema, independientemente del
nivel de ejecución. Por esta razón sysinit no admite ningún valor en el segundo campo.
wait: ejecuta el comando del cuarto campo (a menudo un script) y espera el final de esta
ejecución para pasar a las siguientes líneas del archivo inittab.
respawn: ejecuta el comando del cuarto campo y deja el proceso ejecutándose en segundo
plano. A continuación, pasa a las siguientes líneas del archivo inittab. Si el proceso llamado
por el comando se detiene, init lo volverá a iniciar automáticamente.
i[Link]initdefault:
si::sysinit:/etc/rc.d/[Link]
l[Link]wait:/etc/rc.d/rc 0
l[Link]wait:/etc/rc.d/rc 1
l[Link]wait:/etc/rc.d/rc 2
l[Link]wait:/etc/rc.d/rc 3
l[Link]wait:/etc/rc.d/rc 4
l[Link]wait:/etc/rc.d/rc 5
l[Link]wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
[Link]respawn:/sbin/mingetty tty1
[Link]respawn:/sbin/mingetty tty2
[Link]respawn:/sbin/mingetty tty3
[Link]respawn:/sbin/mingetty tty4
[Link]respawn:/sbin/mingetty tty5
[Link]respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon
En un sistema Linux los servicios se ejecutan mediante scripts normalizados que responden como mínimo a
dos condiciones:
Se encuentran todos dentro del directorio /etc/init.d (o están disponibles en esta ubicación
en forma de enlace simbólico).
Admiten los parámetros start y stop para la ejecución y la parada del servicio.
/etc/init.d/nombre acción
El
Gestión de servicios: parámetros
acción start o stop para arrancar o parar el servicio. status también es una
opción comúnmente soportada que indica el estado del servicio.
comando service, cuando está disponible, puede considerarse como la forma recomendada de
administrar servicios, ya que inicia el servicio liberándolo tanto como le es posible del entorno (pwd y
variables). De este modo el servicio se inicia en un entorno más neutro.
#!/bin/bash
case $1 in
start)
# comando de inicio del servicio
;;
stop)
# comando de parada del servicio
;;
esac
Si se examina el archivo /etc/inittab, hay en su interior una sección que contiene 7 líneas, una por cada nivel
de ejecución, con un script como comando: /etc/init.d/rc en modo wait. No se explicará detalladamente el
funcionamiento de este script, simplemente conviene recordar que inicia la ejecución de cada archivo del
directorio /etc/rcn.d (siendo n el número del nivel de ejecución), con el parámetro start si la primera letra del
nombre del archivo es una S y con el parámetro stop si la primera letra del nombre del archivo es una K.
Cada uno de los archivos de /etc/rcn.d es un enlace simbólico a un script de inicio de servicio de/etc/init.d y
esta construcción permite determinar qué servicios deben iniciarse o pararse en cada uno de los niveles de
ejecución.
Según la distribución, puede ser que los scripts rc y los directorios rcn.d se ubiquen en sitios
distintos. La coherencia se asegura mediante la gestión correcta de las rutas en los scripts de
sistema y la creación de enlaces simbólicos cuando proceda.
Estos enlaces pueden crearse manualmente con el comando ln, o de forma más fiable con el
comando update-rc.d.
Estos enlaces deben crearse en cada uno de los niveles de ejecución posibles.
cd /etc/rcx.d
ln -s ../init.d/servicio Cnnservicio
runlevel
telinit nivel
El cambio en caliente del nivel de ejecución sólo debería realizarse en un sistema del que se conozca la
configuración.
alfa:~# runlevel
N2
alfa:~# telinit 3
alfa:~#
alfa:~# runlevel
N3
alfa:~#
También se puede definir el nivel de ejecución al que se desea cambiar en el kernel como
parámetro en su carga. Por tanto, la elección del nivel de ejecución puede entonces
realizarse desde el gestor de arranque simplemente colocando el nivel deseado en la línea de
carga del kernel.
Los comandos update-rc.d y chkconfig permiten liberarse de la gestión apremiante de los enlaces de
llamadas de servicios según los niveles de ejecución. Ambos comandos no están disponibles en todos los
sistemas y puede ser que la creación manual de enlaces sea la única solución funcional. En todo caso, es
pedagógicamente interesante comprobar la acción de estos comandos en los enlaces ubicados en los
directorios /etc/rcn.d.
Donde servicio representa el nombre del servicio presente en el directorio /etc/init.d. El parámetro
defaults implica que el servicio se iniciará en los niveles funcionales por defecto y se detendrá en los niveles
no funcionales (0 para la parada de sistema, 1 para el modo mantenimiento y 6 para una máquina que está
reiniciando).
El comando chkconfig permite tanto la creación de enlaces como la visualización de los servicios según el nivel de
ejecución.
Ejemplo
de uso
[root@beta ~]# ls /etc/rc5.d/*nfs del
ls: /etc/rc5.d/*nfs: No such file or directory
[root@beta ~]# chkconfig --add nfs
[root@beta ~]# ls /etc/rc5.d/*nfs
/etc/rc5.d/K20nfs
[root@beta ~]# chkconfig --list nfs
nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@beta ~]#
comando update-rc.d
alfa:/etc/init.d# ls /etc/rc2.d/*cron
ls: no se puede acceder a /etc/rc2.d/*cron: No existe el fichero o el directorio
alfa:/etc/init.d# update-rc.d cron defaults
Adding system startup for /etc/init.d/cron ...
/etc/rc0.d/K20cron -> ../init.d/cron
/etc/rc1.d/K20cron -> ../init.d/cron
/etc/rc6.d/K20cron -> ../init.d/cron
/etc/rc2.d/S20cron -> ../init.d/cron
/etc/rc3.d/S20cron -> ../init.d/cron
/etc/rc4.d/S20cron -> ../init.d/cron
/etc/rc5.d/S20cron -> ../init.d/cron
alfa:/etc/init.d# ls /etc/rc2.d/*cron
/etc/rc2.d/S20cron
alfa:/etc/init.d#
Una vez que todos los scripts relacionados con el nivel de ejecución se han ejecutado, un último
script: [Link] se ejecuta.
#!/bin/sh -e
#
# [Link]
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0
Jugando con los enlaces contenidos en los directorios rcn.d y reemplazando la K de la primera letra por una S o
viceversa se provoca, para un nivel de ejecución determinado, el arranque o la parada del servicio. De este
modo, si un servicio determinado se invoca por un enlace K en el nivel 3 y un enlace S en nivel 4, el
administrador podrá elegir arrancando su sistema en uno de estos dos niveles el nivel funcional del sistema.
Se puede pedir cuál es la importancia del número de orden situado detrás de la S o la K. Los scripts se tratan
en el orden en el que el shell los muestra y concretamente son los caracteres alfanuméricos del nombre del
enlace los que determinan el orden de ejecución o parada de los scripts. La única restricción para la asignación
de este número es por lo tanto el momento en el que el script debe ejecutarse. Si un servicio depende de otro,
el script que se tiene que ejecutar detrás deberá tener un número de orden superior al primero.
El gestor de arranque es un pequeño programa que se encuentra generalmente en el MBR (Master Boot Record)
y cuya función es la de provocar la carga del kernel. Para ello hay que conocer la ubicación del archivo del
kernel (incluyendo su partición) y la partición que se montará en /, la raíz del sistema de archivos.
Aunque hay varios programas que cumplen esta función, GRUB (GRand Unified Boot loader) es el que se
encuentra hoy en día en la práctica totalidad de distribuciones Linux. El gestor de arranque más
extendido antes de GRUB era LILO (LInux LOader). LILO mostraba sus cuatro letras en el arranque y según el
avance de su carga. Con ello se podía saber, en caso de error, hasta dónde había podido llegar el sistema.
GRUB hoy en día se despliega generalmente en su versión 2, pero ya que los fundamentos base de GRUB 1 (de
hecho, 0.99) siguen siendo importantes, el conocimiento de ambas versiones es necesario para obtener la
certificación LPI.
a. Configuración de GRUB 1
GRUB lee su configuración en el archivo /boot/grub/[Link]. Para arrancar el kernel, este archivo hace
referencia a algunos elementos. Según el sistema, la configuración principal puede realizarse también en
el archivo /boot/grub/[Link]. El archivo [Link] entonces es solo un enlace a este archivo.
title título
root partición_kernel
kernel /ruta/kernel ro root=partición_raíz opciones
initrd/ruta/imagen_módulos
Ejemplo
Archivo /boot/grub/[Link]
de
título Como GRUB ofrece al usuario varios kernels para que elija uno de [Link]
ellos, la sección título sirve para identificar el kernel que se va a en
cargar. ubuntu
10.04
partición_kernel La partición que alberga el kernel, en formato (hdx,y)
donde xrepresenta el número de disco duro e y el número de la Observe
partición. La numeración comienza con el cero. que los
La
directiva
default 0 default
timeout 10 en el
archivo
title Ubuntu 9.10, kernel 2.6.31-16-generic
de
kernel /boot/vmlinuz-2.6.31-16-generic root=UUID=52200c0b-aee8-4ae0-9492
-1f488051e4a3 ro quiet splash
initrd /boot/[Link]-2.6.31-16-generic
quiet
configuración de GRUB indica el kernel que se cargará si el usuario no realiza ninguna acción. El timeout indica
al cabo de cuánto tiempo cargar el kernel por defecto.
La opción ro para el montaje de la partición raíz (la que se montará en barra) permite ejecutar las
herramientas de diagnóstico sin que se dañe durante la fase de inicio en caso de fallo del sistema de
archivos. La opción quiet impide que el kernel sea demasiado locuaz en el arranque.
Si fuera necesario, el comando rdev permite comprobar cuál es la partición montada en /. Históricamente,
este comando también permitía en las arquitecturas i386 parchear una imagen de kernel escribiendo los
valores específicos que representaban la partición adecuada. Este comando no debería usarse salvo en
última instancia.
alfa:~# rdev
/dev/sda1 /
alfa:~#
b. Configuración de GRUB 2
Las opciones modificables por parte del usuario (visualización del menú, tiempos de espera de arranque, etc.)
se centralizan en el archivo /etc/default/grub. Los datos de este archivo se integrarán entonces en el
archivo [Link] generado por los comandos.
Como
se
root@alfa:/boot/grub# update-grub puede
Generating [Link]...
Found linux image: /boot/vmlinuz-2.6.32-5-686
Found initrd image: /boot/[Link]-2.6.32-5-686
done
root@alfa:/boot/grub#
observar, el comando realiza la búsqueda de todos los elementos arrancables para integrarlos en el archivo
de configuración.
c. Funcionamiento de GRUB
GRUB propone en el arranque la carga del kernel del sistema Linux. Si coexisten varias versiones del kernel,
GRUB ofrecerá simplemente la lista de los kernels que se pueden cargar. Esta lista se muestra a partir de un
conjunto de declaraciones de kernels o sistemas arrancables en el archivo/boot/grub/[Link] para la
versión 1 o /boot/grub/[Link] para la versión 2. Para el usuario, basta con esperar unos segundos para
empezar la carga del kernel declarado por defecto en el archivo [Link], o bien seleccionar con las flechas de
dirección y la tecla [Enter] el kernel que desea cargar.
Si no se dispone de entradas que se puedan modificar en GRUB (en caso de pérdida del archivo [Link], por
ejemplo) se puede indicar directamente al gestor de arranque el conjunto de elementos necesarios. Bastará
con que durante el periodo de temporizado se pulse la tecla c para abrir una consola interactiva.
A continuación, hay que introducir una a una todas las líneas que gestionan la carga del kernel, como si
estuvieran configuradas de manera normal en el archivo /boot/grub/[Link].
No es
necesario decir que este proceso requiere un conocimiento preciso del esquema de partición del sistema, así
como los nombres de los archivos de kernel y de las imágenes. La adquisición de estos elementos no será un
problema si se es capaz de arrancar de una forma u otra, pero será más complicado en caso contrario. En
estas condiciones, la recuperación de estos elementos se deberá realizar a través de un tercero, como con un
live cd por ejemplo.
3. Reinstalación de GRUB
El comando grub-install reinstala GRUB en un sistema con mucha facilidad. En cambio, este método no
siempre es eficaz y funciona perfectamente en caliente, justo después de un borrado accidental del gestor de
arranque, por ejemplo.
grub-install dispositivo
Donde dispositivo representa el disco en el que GRUB deberá instalarse. El periférico se representa con su
archivo de bloques especial.
La solución más fiable para reinstalar un gestor de arranque GRUB en un sistema que no puede arrancar
consiste en cargar en el ordenador un live cd y realizar la reinstalación de GRUB desde el mismo. La
distribución que se elija para el live cd importa poco, Knoppix o Ubuntu cumplirán muy bien con el cometido. A
continuación, después de entrar en el modo interactivo de GRUB (basta con introducir grub en un terminal),
hay que definir el disco que deberá albergar el gestor de arranque y ejecutar el comando setup que realizará
la instalación propiamente dicha del gestor.
Instalación de GRUB 1
Desde un terminal del live cd activo, ejecute GRUB en modo interactivo tecleando "grub".
En el shell de GRUB, defina la partición que alberga el archivo del kernel tecleando "root
(hdx,y)" donde x representa el número de disco e y el número de partición (la numeración
empieza con el 0).
Según el caso, compruebe o cree el archivo /boot/grub/[Link] para que haga referencia
correctamente al kernel o kernels que se deberán cargar.
Instalación de GRUB 2
El modo monousuario permite realizar operaciones de mantenimiento de un sistema. En este modo se puede
conectar al sistema con la cuenta root y casi ningún servicio está en ejecución. Por tanto, el sistema está en
el estado más estable posible y ninguna interacción perjudicial podrá producirse ya que el administrador
trabaja solo.
telinit 1
Se puede pasar un parámetro al kernel indicándole un proceso para que lo inicie. Si este proceso se inicia en
un shell, permitirá abrir una sesión interactiva, modificar archivos locales y reiniciar manualmente servicios.
Basta con editar la línea de carga del kernel en GRUB y añadir el parámetro init=/bin/bash.
Donde archivo_kernel representa el kernel que normalmente se carga y fs_raíz representa el sistema de
archivos raíz que normalmente se carga. Solamente el parámetro init=/bin/bash debe añadirse en la línea de
comandos.
Modificar la carga por defecto pulsando la tecla "e" desde la lista de sistemas disponibles.
1. Preguntas
1 ¿Cuál es la diferencia entre un servicio, un daemon y un nivel de ejecución?
2 Los scripts de gestión de servicios admiten a menudo los parámetros restart y reload. ¿Cuál de estos
dos parámetros consume menos recursos de sistema en su llamada?
5 Para la configuración del gestor de arranque GRUB, las distribuciones inspiradas en Debian usan el
archivo /boot/grub/[Link], mientras que los sistemas basados en Red Hat prefieren el archivo
/etc/[Link]. ¿Cómo se mantiene la coherencia para que el gestor de arranque GRUB tenga siempre
acceso a su configuración en el mismo archivo?
7 ¿Qué interés tiene el parámetro ro (read only) generalmente pasado al kernel por el gestor de
arranque que indica que la carga del kernel debe hacerse en sólo lectura?
8 ¿Qué parámetro pasado al kernel permite en su arranque acceder al sistema de forma rudimentaria en
un equivalente al modo monousuario?
9 El comando telinit permite cambiar el nivel de ejecución en un sistema en funcionamiento. ¿Qué hay que
hacer para que un nivel de ejecución determinado se cargue directamente en el arranque?
10 ¿Por qué la copia integral de los archivos de un disco de sistema al disco de otra máquina no basta para
que funcione?
2. Respuestas
1 ¿Cuál es la diferencia entre un servicio, un daemon y un nivel de ejecución?
Un daemon es el término inglés que representa un servicio. Un servicio es un programa residente que se
ejecuta en un servidor, preparado para gestionar eventos en el sistema. Un nivel de ejecución es un estado
funcional de un servidor en el que más o menos servicios deben estar en ejecución o parados. Un daemon y
un servicio representan por lo tanto el mismo concepto y un nivel de ejecución describe el estado en el que se
deben encontrar los servicios disponibles en el sistema.
2 Los scripts de gestión de servicios admiten a menudo los parámetros restart y reload. ¿Cuál de estos
dos parámetros consume menos recursos de sistema en su llamada?
El parámetro restart aplicado a un script de gestión de servicio ejecuta el equivalente de un stop seguido de un
start. De este modo, se detienen los procesos y después se vuelven a iniciar realizando las tareas de
configuración. El parámetro reload, en cambio, mantiene los procesos en ejecución, pero les obliga a que relean
su configuración y se reconfiguren dinámicamente, generalmente enviando al proceso un signal 1 (hup).
3 ¿Qué script independiente de los niveles de ejecución se ejecuta siempre en el arranque de un sistema
después de todos los scripts relacionados con el nivel de ejecución actual?
El script [Link] se ejecuta automáticamente en el arranque, después de todos los scripts asociados al nivel de
ejecución actual. El administrador puede incorporar en él cualquier comando para que se ejecute en el
arranque independientemente del nivel de ejecución.
El comando dmesg muestra todos los mensajes que el kernel ha podido generar desde su arranque si disponía
de un terminal activo o de un archivo de registro en un sistema de archivos montado. Ante la ausencia de
estos elementos (en el arranque, el kernel no tiene nada de esto a su disposición), el kernel mantiene en
memoria su registro de eventos en lo que se llama en inglés el "kernel ring buffer". El comando dmesg
también devuelve su contenido por la salida estándar.
5 Para la configuración del gestor de arranque GRUB, las distribuciones inspiradas en Debian usan el
archivo /boot/grub/[Link], mientras que los sistemas basados en Red Hat prefieren el archivo
/etc/[Link]. ¿Cómo se mantiene la coherencia para que el gestor de arranque GRUB tenga siempre
acceso a su configuración en el mismo archivo?
Mediante un enlace simbólico. La historia de Unix y Linux está llena de particularidades ligadas a una
distribución o un desarrollo alternativo. Para permanecer en conformidad con el uso, el pasado o las reglas
POSIX, se ha generalizado el uso de enlaces simbólicos. Es mejor el uso de enlaces simbólicos, ya que un
enlace duro (del inglés hard link) no es capaz de hacer referencia a un elemento externo a su sistema de
archivos y no siempre los archivos favoritos y los archivos normalizados están en el mismo sistema de
archivos.
El Master Boot Record (MBR). Una ubicación del disco situada antes de la tabla de particiones y leída en primer
término por la BIOS es el sitio ideal para un gestor de arranque.
7 ¿Qué interés tiene el parámetro ro (read only) generalmente pasado al kernel por el gestor de arranque
que indica que la carga del kernel debe hacerse en sólo lectura?
En caso de haber problemas en la partición que contiene el kernel, las herramientas de diagnóstico pueden
ejecutarse sin dañar los elementos accedidos en sólo lectura.
8 ¿Qué parámetro pasado al kernel permite en su arranque acceder al sistema de forma rudimentaria en
un equivalente al modo monousuario?
El parámetro init= permite especificar qué ejecutable debe iniciarse directamente después de la carga del
kernel. Si este ejecutable es un shell, entonces el sistema arranca y ejecuta un shell independientemente de
cualquier servicio. Ésta es también una forma de acceder a un sistema del que se ha perdido la contraseña.
9 El comando telinit permite cambiar el nivel de ejecución en un sistema en funcionamiento. ¿Qué hay que
hacer para que un nivel de ejecución determinado se cargue directamente en el arranque?
Modificar el archivo inittab. Contiene una línea de definición del nivel de ejecución por defecto anunciada por la
palabra clave initdefault.
10 ¿Por qué la copia integral de los archivos de un disco de sistema al disco de otra máquina no basta para
que funcione?
Porque el kernel Linux debe invocarse por un gestor de arranque, el cual se encuentra fuera de
cualquier partición de disco y, por lo tanto, no se puede copiar con herramientas de gestión de archivo
ordinarias.
Trabajos prácticos
Han surgido nuevas necesidades en el sistema. Usted piensa que la gestión de estos servicios mediante niveles
de ejecución es la mejor respuesta a estas necesidades.
Su servidor alfa debe ser funcional con sus servicios usuales iniciados en su nivel de ejecución por defecto y
disponer de los mismos servicios con el añadido de una aplicación específica en ejecución en un nivel
personalizado. Para poder supervisar la nueva aplicación cuando ésta entra en ejecución, va a crear una
aplicación de monitorización de memoria.
Como el nivel por defecto de los servidores Debian es el nivel 2, lo conservará como nivel por defecto y
personalizará el nivel 3 para que la aplicación especial (a la espera de su aplicación de monitorización) se inicie
automáticamente.
Usted desea disponer, en un nivel de ejecución determinado, de registros periódicos del consumo de memoria en
el servidor. Para ello creará el programa encargado de realizar dicho registro periódico así como su script de inicio
normalizado. Cree en el directorio /opt/scripts con su editor favorito el archivo supervisamem con el contenido
siguiente:
#!/bin/bash
while true
do
ahora=$(date "+%H:%M:%S - ")
echo -n $ahora >> /var/log/[Link]
grep Dirty /proc/meminfo >> /var/log/[Link]
sleep 30
done
Comandos útiles
chmod
tail
vi
Operaciones
Archivo supervisamem:
#!/bin/bash
while true
do
ahora=$(date "+%H:%M:%S - ")
echo -n $ahora >> /var/log/[Link]
grep Dirty /proc/meminfo >> /var/log/[Link]
sleep 30
done
Script
alfa # ls -l /opt/scripts
-rw-r--r-- 1 root root 187 2010-07-13 15:31 supervisamem
alfa # chmod a+x /opt/scripts/supervisamem
alfa # ls -l /opt/scripts
-rwxr-xr-x 1 root root 187 2010-07-13 15:33 supervisamem
#!/bin/bash
case $1 in
start)
/opt/scripts/supervisamem &
;;
stop)
pkill supervisamem
;;
esac
Prueba
del
alfa # ls -l /etc/init.d/supervisamem
-rw-r--r-- 1 root root 102 2010-07-13 15:37 supervisamem
alfa # chmod a+x /etc/init.d/supervisamem
alfa # ls -l /etc/init.d/supervisamem
-rwxr-xr-x 1 root root 187 2010-07-13 15:37 supervisamem
servicio:
c.
Crear un nivel de funcionamiento personalizado sirve para asegurar que los servicios deseados en este nivel se
invocarán correctamente en el arranque del sistema. Para ello, basta con hacer que el directorio rcn.d (donde n
es el nivel de ejecución que se desea configurar) contenga un enlace cuyo nombre empiece por S (mayúscula) y
cuyo destino sea el script de servicio normalizado en /etc/init.d. El mecanismo de inicialización del sistema
operativo se encargará de llamar a todos los archivos de rcn.d cuya primera letra es una S con el parámetro
"start". Como estos archivos son de hecho enlaces simbólicos a los scripts de inicio de gestión de servicios y
estos servicios deben responder al parámetro "start" cuando arrancan, cada enlace provocará el inicio del
servicio.
Comando útil
update-rc.d
Operaciones
alfa:~# cd /etc/rc2.d/
alfa:/etc/rc2.d# ls *supervisa*
S19supervisamem
alfa:/etc/rc2.d# mv S19supervisamem K81 supervisamem
alfa:/etc/rc2.d#
d.
Cambio
alfa:~# cd /etc/rc3.d/ del
alfa:/etc/rc3.d# ls *supervisa* nivel
S19supervisamem de
alfa:/etc/rc3.d#
ejecución en caliente
Como no se ha modificado el nivel de ejecución por defecto, el sistema debe arrancar en nivel 2. Decide cambiar
el nivel de ejecución en caliente para comprobar que el servicio se inicia correctamente.
Comandos útiles
pgrep
reboot
runlevel
shutdown
telinit
Operaciones
1. Reiniciar la máquina.
6. Volver al nivel 2.
alfa:~# runlevel
N2
alfa:~#
Cambio
del
alfa:~# pgrep -l supervisamem nivel de
alfa:~#
ejecución en caliente:
alfa:~# telinit 3
INIT : Switching to runlevel: 3
alfa:~#
alfa:~# runlevel
23
alfa:~#
Retorno
al nivel
alfa:~# pgrep -l supervisamem 2:
2193 supervisamem
alfa:~# e.
alfa:~# telinit 2
INIT : Switching to runlevel: 2
alfa:~#
El responsable de la aplicación le informa de que la nueva aplicación que se despliega tiene un consumo de
memoria fijo de 32 KB. Decepcionado, decide entonces eliminar los enlaces de gestión del servicio. Sin recordar el
comando que permite borrar un enlace simbólico, decide ejecutar directamente un comando de gestión de
servicios.
Comando útil
update-rc.d
Operaciones
1. Eliminar todos los enlaces de los directorios rcn.d sin utilizar el comando rm (el
script contenido en init.d seguirá siempre presente, ya que puede que el comando
usado tenga escrúpulos. Haga lo necesario).
2.
alpha:/etc/rc3.d# update-rc.d supervisamem remove
update-rc.d: /etc/init.d/supervisamem exists during rc.d purge (use -f to force)
alpha:/etc/rc3.d# update-rc.d -f supervisamem remove
Removing any system startup links for
/etc/init.d/supervisamem ...
/etc/rc0.d/K05supervisamem
/etc/rc1.d/K05supervisamem
/etc/rc2.d/K05supervisamem
/etc/rc3.d/S95supervisamem
/etc/rc4.d/K05supervisamem
/etc/rc5.d/K05supervisamem
/etc/rc6.d/K05supervisamem
alpha:/etc/rc3.d#
En primer lugar, copiará la totalidad de los datos de la máquina alfa (el sistema y los datos de las aplicaciones)
en un disco que llamaremos clonehd. A continuación, creará una nueva máquina virtual que usará este disco pero
que, naturalmente, será incapaz de arrancar. Finalmente, instalará GRUB en este disco para que pueda
producirse el arranque de forma normal.
Descargue una imagen iso de una versión anterior de Debian para instalar un sistema que use GRUB 1. Estas
imágenes están disponibles en el sitio de archivos Debian:[Link] Una
versión 5 o anterior será suficiente.
Cree una máquina virtual a la que llamará deb5. Asígnele un disco duro IDE e instale el sistema con un mínimo de
recursos.
Comandos útiles
cp
dmesg
grep
mkdir
mke2fs
mount
Operaciones
1. Añada el disco IDE clonehd a la máquina virtual deb5. Para simplificar la operación
y evitar toda interacción perjudicial, elimine el controlador y los discos SATA.
3. Arranque la máquina desde el livecd DSL (la opción de arranque "dsl lang=es 2"
permite tener un teclado español y un inicio sin interfaz gráfica).
4. Desde un terminal en DSL, consulte el ring-buffer del kernel para ver si el sistema
ha reconocido los dos discos.
7. Cree dos directorios /uno y /dos en el sistema de archivos del sistema virtual.
8. Monte el sistema de archivos del primer disco duro (sistema deb5) en /uno.
9. Monte el sistema de archivos del segundo disco duro (nuevo disco clonehd)
en/dos.
10. Copie los datos del primer disco al segundo. Utilice una opción que conserve todos
los atributos de los archivos, entre otros las fechas y los permisos.
Detección de discos:
Creación de la partición:
Writing inode tables: 0/13 1/13 2/13 3/13 4/13 5/13 6/13
7/13 8/13 9/13 10/13 11/13 12/13 done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
Copia
de los
[~]# mkdir /uno /dos datos.
[~]# mount /dev/hda1 /uno
[~]# mount /dev/hdb1 /dos Parada
[~]# ls /uno del
bin cdrom dev home lib
media opt root selinux sys
usr vmlinuz root data etc
initrd.i lost+found mnt proc sbin
srv tmp var
[~]# ls /dos
lost+found
sistema.
c.
Cree una nueva máquina virtual llamada clon. Asígnele el disco clonehd que previamente habrá quitado de la
máquina virtual alfa y deje todos los valores por defecto.
Iníciela y compruebe que es incapaz de arrancar aunque tenga un disco duro particionado con todos los archivos
de sistema.
d. Instalación de GRUB
Comandos útiles
grub
grub : root
grub : setup
Operaciones
Asignar a la máquina virtual clon la imagen iso DSL y reiniciarla. Dispondrá entonces de un shell de root en la
máquina virtual.
4. Salir de GRUB.
e.
[~]# grub
GRUB version 0.91 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]
grub> quit
Reinicio y comprobación
Desconecte la imagen iso DSL y reinicie la máquina virtual. El arranque debería producirse correctamente.
Requisitos y objetivos
1. Requisitos
Los conocimientos adquiridos con la certificación LPI de nivel 1, especialmente:
2. Objetivos
Al final de este capítulo será capaz de:
Configurar IPv6.
Configuración de la red
1. Direccionamiento IP
Las direcciones IPv4 (direccionamiento IP histórico) se expresan en 4 bytes. Contienen dos datos
fundamentales: la dirección de red y la dirección de host (la máquina que se desea identificar). Aunque el
direccionamiento IP histórico ha previsto una segmentación implícita de redes según las clases A, B y C, la
disociación entre la dirección de red y la dirección de host se expresa hoy en día con la máscara de subred. La
máscara de subred, expresada también en 4 bytes, se compone de tantos bits a 1 como bits se usen en la
dirección para describir la dirección de red en una dirección IP. El resto de bits se pone a 0.
[Link]
[Link]
11000000.10101000.00000001.00000101
11111111.11111111.11111111.00000000
En este ejemplo, se puede observar que los 24 primeros bits de la máscara son 1, lo que indica que los 24
primeros bits de la dirección IP representan la dirección de red y los 8 restantes la dirección de host. La
dirección de red es por lo tanto convencionalmente expresada como [Link] con todos los bits de la
parte host inicializados a 0.
La asociación sistemática de una máscara a las direcciones IP en las configuraciones de elementos que usan
un direccionamiento IPv4 ha terminado por manifestar un problema de uso de memoria de los equipos,
especialmente en los routers: conservar en memoria los 32 bits de la máscara además de los de la dirección
representa una sobrecarga importante cuando se multiplica por miles de direcciones. Además, la escritura de
esta máscara puede también parecer tediosa en las operaciones de configuración. Por estos motivos, ha
aparecido una nueva forma de escribir la máscara, que es expresando cuántos bits a 1 tiene la máscara. La
dirección IP se escribe entonces A.B.C.D/n, siendo n el número de bits a 1 de la máscara asociada a la
dirección A.B.C.D. Es la notación CIDR (Classless Internet Domain Routing). La máscara se escribe en un solo
número comprendido entre 0 y 32, y por lo tanto puede escribirse rápidamente y codificarse en un número
reducido de bits en la memoria de los equipos.
[Link]/24
b. Direccionamiento IPv6
El direccionamiento IPv6 se creó para paliar la ausencia de direcciones IPv4 anunciada desde hace ya mucho
tiempo y encarar el futuro con más serenidad. El último bloque de direcciones IPv4 disponible se asignó a un
operador en 2011. El paso a IPv6 deja de ser, por lo tanto, una alternativa posible y pasa a ser una realidad
obligatoria a más o menos largo plazo.
Las direcciones IPv6 se expresan en 16 bytes. Aunque se tratan en binario por las máquinas, su notación
para los humanos es siempre en hexadecimal, lo que requiere todavía 32 caracteres. IPv6 soporta
naturalmente como su predecesor un direccionamiento jerárquico y, por lo tanto, irá sistemáticamente
acompañado de una máscara de subred. Por razones comprensibles, la máscara se expresará siempre en
notación CIDR.
El direccionamiento IPv6 retoma lo esencial de los principios de funcionamiento de su predecesor pero tiene
algunas diferencias importantes respecto al direccionamiento IPv4.
Como las direcciones IPv6 se expresan en 16 bytes, requieren 32 caracteres hexadecimales, con lo que son
largas y es tedioso teclearlas. Los bytes se agrupan de dos en dos y se separan por dos puntos (:). Por
convenio, se puede ignorar los 0 de un grupo de dos bytes (4 caracteres hexadecimales). También se puede
reemplazar cualquier serie de 0 en la dirección por dos símbolos de dos puntos (::). Naturalmente, esta
facilidad puede usarse solo una vez en la escritura de la dirección.
La parte host en 64 bits de una dirección IPv6 se genera localmente en la mayoría de los casos a partir de la
dirección MAC de la interfaz física. La dirección MAC por lo tanto se parte en dos por la mitad, y los caracteres
hexadecimales fffe se insertan para alcanzar los 64 bits. Por convenio, el segundo bit de menor peso del
primer byte de las direcciones MAC se asigna a 1 para la creación de la dirección IPv6. La parte host de la
dirección IPv6 también puede asignarse de forma pseudo-aleatoria (a partir de un hash de la dirección MAC),
o simplemente configurada a mano. En este caso, se tendrá la ventaja de elegir un valor pequeño para
simplificar la escritura de la dirección IPv6.
root@alfa:~# ifconfig
eth0 Link encap:Ethernet Hwaddr [Link]
inet adr:[Link] Bcast:[Link]
Máscara:[Link]
adr inet6: fe80::21c:23ff:fe59:d18c/64 Scope:Enlace
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets 218326 bytes 267371428 (254.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 183982 bytes 24737320 (23.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@alfa:~#
Cualquier máquina compatible con IPv6 dispone de una dirección llamada ”de enlace local” no enrutable y
autoasignada. Esta dirección le permite comunicar con otros equipos IPv6 (servidor DHCP por ejemplo) antes
de cualquier configuración más general. La dirección de enlace local comienza siempre por fe80 y la parte host
de la dirección se genera localmente, en principio a partir de la dirección MAC de la interfaz.
Dirección global
Una dirección global se puede enrutar, con lo que permite a la máquina comunicarse en IPv6 con sus
homólogos situados en otras redes. La parte de red de la dirección global la impone el operador o el
proveedor de acceso a Internet. Naturalmente, es única en todo Internet. La parte host de la dirección se
suele generar localmente a partir de la dirección MAC o se configura manualmente. La configuración de la
dirección de red IPv6 puede hacerse manualmente, mediante DHCPv6 o incluso por descubrimiento
automático.
En la mayoría de los casos, se usa un servidor DHCPv6 que distribuye las direcciones IPv6 a los equipos que
realizan la correspondiente solicitud. El servidor se aprovechará para tener la contabilidad de las direcciones
distribuidas. Las direcciones también pueden obtenerse por observación de anuncios del router, que informan
sobre la dirección global usada en la red local.
Fin de broadcast
Ya raras en IPv4, las direcciones broadcast desaparecen completamente del escenario IPv6. Esto no debería
ser un problema para las aplicaciones, que ya funcionan en multicast en la mayoría de los casos que
requieren una comunicación de ”uno a muchos”. Los modos de comunicación son por lo tanto el unicast, el
multicast y el anycast (uno a alguien).
Independientemente de estos elementos de confort proporcionados por las distribuciones o los escritorios
gráficos siempre se tendrá, sea cual sea la distribución y el entorno, los comandos básicos que permiten
configurar la red, es decir, la dirección ip, la ruta por defecto y la dirección de los servidores DNS. El método
descrito a continuación, si bien no es el más rápido, tiene la ventaja de ser universal.
Los sistemas Linux utilizan un nombre simbólico para la interfaz de red, ya sea real o virtual, ethernet o de
otro tipo. En el caso común donde el sistema está conectado a la red mediante ethernet y sólo utiliza una
tarjeta de red esta tarjeta se llamará "eth0". Se puede obtener la lista de todas las interfaces de red que
existen en un sistema, configuradas o no, con el comandoifconfig.
ifconfig -a
El comando ifconfig tiene muchos usos y sobre todo es conocido por mostrar las direcciones MAC e IP de un
sistema ya configurado. Sin embargo, el comando ifconfig también puede usarse para asignar dinámicamente
la dirección y la máscara de red de una máquina.
Aunque no es el uso más común, se puede agregar una segunda dirección IP a una interfaz ya configurada.
Las máquinas Linux disponen de forma nativa de un cliente DNS llamado resolver. Toda aplicación que
funcione en Linux y tenga la necesidad de hacer peticiones DNS se apoyará en este componente.
Usa el sencillo archivo de configuración /etc/[Link], donde debe constar la referencia de al menos un
servidor DNS.
search dominio
nameserver dirección_ip
El comando route define rutas estáticas en una máquina Linux. En el marco de una configuración sencilla y
puntual, se puede utilizar para definir la puerta de enlace por defecto. De hecho, consiste en declarar una
ruta estática indicando la ruta por defecto.
Un
Comando route: opciones y parámetros
servidor
add Indica que se añade una ruta a la tabla de enrutamiento. Linux
utilizado
-net Indica que el destino es una red. como
red_dest La red de destino para la ruta estática que se está definiendo. router
soporta
[Link] La ruta por defecto. [Link] representa todas las redes posibles. también
los
gw Define el valor de la puerta de enlace predeterminada.
hostname nombre_host
Atención, este valor se conserva sólo en memoria principal y se perderá cuando se reinicie el sistema. Los
sistemas tradicionales en producción deberán, por tanto, conservar este valor en un archivo de configuración
para que se lea en cada arranque. Este archivo depende de la distribución. Por ejemplo, para las
distribuciones basadas en Debian el archivo es /etc/hostname, mientras que para las distribuciones basadas
en RedHat es /etc/sysconfig/network. Los scripts que se ejecutan en el arranque del sistema se encargan
de llamar al comando hostname y de obtener el valor del nombre del sistema en el archivo.
Éste es el caso de las distribuciones Debian y derivadas. Los elementos de configuración se ubican en un
archivo de formato muy sencillo: /etc/network/interfaces.
auto interfaz
iface interfaz inet static
address dirección_ip
netmask máscara
gateway ip_p_enlace
auto interfaz
iface interfaz inet dhcp
Estos
Archivo interfaces: opciones y parámetros
archivos
auto Indica que la interfaz deberá activarse automáticamente en el no
arranque. generan
evidentemente ninguna acción por ellos mismos, el script de inicio de red (en general /etc/init.d/networking)
es el que los lee e invocará al comando ifup (interface up) para activar las interfaces con sus respectivas
configuraciones de red.
Éste es el caso de las distribuciones RedHat y derivadas. Los elementos de configuración se ubican en un
archivo de formato muy sencillo para cada interfaz en el directorio /etc/sysconfig/network-scripts. Todos estos
archivos tienen el prefijo ifcfg- seguido del nombre de la interfaz que configuran.
DEVICE=interfaz
BOOTPROTO=none
ONBOOT=yes
IPADDR=dirección_ip
NETMASK=máscara
GATEWAY=ip_p_enlace
DEVICE=interfaz
BOOTPROTO=dhcp
ONBOOT=yes
Sea cual sea el formato de los archivos de configuración de red, el parámetro que proporciona
la dirección IP de la pasarela para la configuración de una interfaz podría hacer pensar que la
puerta de enlace está asociada a la interfaz. Sin embargo, la puerta de enlace por defecto, sea
el sistema que sea, es única y está asociada a la tabla de enrutamiento del sistema y no a una
interfaz cualquiera.
Todo equipo de red que use el protocolo IP en una red ethernet tiene que utilizar el protocolo ARP para
establecer la correspondencia entre direcciones IP y direcciones MAC. En un régimen de funcionamiento
dinámico, el más común, una máquina que conoce la dirección IP de su destinatario pero que necesita
informar su cabecera MAC para comunicarse con él envía un broadcast para solicitar si alguien en la red tiene
la dirección IP en cuestión. Si la máquina destino está en el dominio broadcast (es decir, en la red local)
responderá en unicast indicando su dirección MAC. Con estas acciones se ha realizado la resolución ARP. Las
correspondencias establecidas entre las direcciones MAC y las direcciones IP se conservan durante un periodo
de tiempo en memoria en lo que se llama la caché ARP. En algunos casos particulares se puede asignar de
forma estática una correspondencia entre una dirección IP y una dirección MAC.
El comando arp permite observar y eventualmente administrar los valores almacenados en esta caché.
arp -n
El parámetro -n no es obligatorio, pero evita que el sistema realice una búsqueda DNS inversa que ralentiza
enormemente la visualización del resultado.
arp -d dirección_ip
Naturalmente, el uso más habitual consiste en dejar que la totalidad de las asociaciones entre
direcciones MAC y direcciones IP se realicen dinámicamente. Sin embargo si se desea configurar un gran
número de asociaciones estáticas, es recomendable escribirlas en el archivo /etc/ethers y llamar al
comando arp con la opción -f.
dirección_mac1 dirección_ip1
dirección_mac2 dirección_ip2
...
dirección_macn dirección_ipn
Se utiliza aquí el comando arp para mostrar el contenido de la caché arp antes y después de la actividad. A
continuación, se asigna manualmente una dirección MAC a una dirección IP, después se tiene en cuenta el
contenido del archivo /etc/ethers para configurar más asociaciones.
alfa:~# arp -n
alfa:~# ping [Link]
PING [Link] ([Link]) 56(84) bytes of data.
(...)
alfa:~# arp -n
Address HWtype HWaddress Flags Mask Iface
[Link] ether [Link] C eth0
alfa:~# arp -s [Link] [Link]
alfa:~# arp -n
Address HWtype HWaddress Flags Mask Iface
[Link] ether [Link] CM eth0
[Link] ether [Link] C eth0
alfa:~# cat /etc/ethers
[Link] [Link]
[Link] [Link]
[Link] [Link]
[Link] [Link]
alfa:~# arp -f
alfa:~# arp -n
Address HWtype HWaddress Flags Mask Iface
[Link] ether [Link] CM eth0
[Link] ether [Link] CM eth0
[Link] ether [Link] CM eth0
[Link] ether [Link] CM eth0
[Link] ether [Link] CM eth0
[Link] ether [Link] C eth0
alfa:~#
b. TCP Wrappers
Es posible administrar el acceso a un sistema Linux según la dirección IP o el nombre del host cliente. Se
puede gestionar una lista de "todos los que están autorizados", o bien una lista de "todos los que están
prohibidos". A pesar de que las modernas técnicas de intrusión y piratería informática vuelven este tipo de
control de acceso casi insignificante, no deja de ser una forma de control de acceso rudimentaria que puede
desalentar a curiosos. Además, la certificación LPI exige el conocimiento de estas técnicas de control de
acceso.
Los dos archivos que permiten este control son /etc/[Link] para los clientes autorizados,
y/etc/[Link] para los clientes no autorizados. Ambos archivos son leídos por el daemon tcpdque
aplicará los controles de acceso de forma consecuente. Por su principio de funcionamiento, estos archivos
deberán usarse independientemente: si se autorizan algunos hosts para conectarse, esto significa que todo
el resto de equipos tienen el acceso prohibido y por lo tanto el archivo de prohibición pierde su interés. Sin
embargo, si ambos archivos están presentes en el sistema, sólo se aplicará /etc/[Link] y el
archivo /etc/[Link] se ignorará.
servicio: clientes
Ejemplo
TCP Wrappers: archivos de control de acceso
de
servicio El nombre del servicio cuyo acceso queremos controlar. ALL es un valor archivo
especial que representa todos los servicios posibles.
[Link]
Observe que en el primer ejemplo la dirección termina con un punto. Esta sintaxis un poco particular permite incluir
a todas las direcciones cuya parte prefija al punto concuerde.
5. Configuración WiFi
Las distribuciones y los entornos de escritorio gráficos proporcionan utilidades gráficas para administrar las
redes WiFi cuyo uso es muy intuitivo. No obstante, a continuación se mostrará cómo configurar paso a paso
una conexión WiFi por línea de comandos. Las principales herramientas serán ifconfig, iwconfig e iwlist.
Ya sabemos que el comando ifconfig -a muestra todas las interfaces de red presentes en un sistema, incluso
si no están activadas. Una tarjeta WiFi, por lo tanto, tiene que aparecer en la lista devuelta por este
comando. Sin embargo, si el sistema tiene más tarjetas de red, un comando específico nos permitirá afinar
nuestra elección.
usuario@ubuntu:~$ iwconfig
lo no wireless extensions.
Sintaxis del comando iwlist para la visualización de las redes del entorno
Donde interfaz es el nombre de la tarjeta de red WiFi y scan el parámetro que indica el tipo de acción que
debe realizar.
En este ejemplo, se ve que hay dos redes disponibles. La primera se publica mediante un punto de acceso cuya
dirección MAC es [Link], usando el protocolo 802.11g (2,4 GHz et 54 Mb/s) y cuyo SSID es WLAN1.
La encriptación se realiza mediante WPA-TKIP. La segunda red proviene de un punto de acceso cuya dirección MAC
es [Link], usando también el protocolo 802.11g, con el SSID hotspot y sin ningún tipo de seguridad.
Una vez que se ha determinado la red, se puede conectar con el comando iwconfig.
Donde interfaz representa la interfaz de red WiFi administrada por el sistema y nombre_ssid el nombre de la
red WiFi (Service Set Identifier) a la que se desea conectar.
Diagnóstico de red
a. ping y ping6
El famoso comando ping sigue siendo de gran utilidad. Aparte de comprobar la conectividad IP de extremo a
extremo y comprobar la resolución DNS nativa, también obtiene información más sutil, como por ejemplo la
indicación de que una ruta es inaccesible.
El comando ping6, parecido en todas sus facetas a su homólogo histórico, permite comprobar la accesibilidad
a un host remoto en IPv6.
Los comandos ping y ping6 utilizan el protocolo ICMP (Internet Control Message Protocol).
En este ejemplo, la respuesta a ping es distinta dependiendo de si la ruta existe y la máquina destino no está
disponible, o si la ruta es desconocida.
A:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
[Link] * [Link] U 1 0 0 eth0
A:~$ ping [Link]
connect: Network is unreachable
A:~$ route add -net [Link] netmask [Link] gw [Link]
A:~$ ping [Link]
PING [Link] ([Link]) 56(84) bytes of data.
From [Link] icmp_seq=1 Destination Host Unreachable
From [Link] icmp_seq=2 Destination Host Unreachable
A:~$
El comando route, utilizado para configurar las rutas estáticas, también proporciona elementos de
diagnóstico. Permite saber cuáles son las redes locales o remotas (accesibles a través de una puerta de
enlace) o incluso ver qué ruta es rechazada por el kernel. Esta información se obtiene a través de los flags del
comando route.
Ejemplo
Comando route: flags principales de flags
U Up: la ruta está activa y es utilizable. del
comando
H Host: el destino es un host (y no una red). route
G Gateway: el destino está accesible a través de una puerta de enlace. Todas las
rutas
D Dynamic: la ruta ha sido configurada por un protocolo de enrutamiento.
están
! El kernel ha rechazado la ruta. activas y
son
utilizables.
c. traceroute
El comando traceroute, como el comando ping, permite comprobar la conectividad con un sistema remoto,
pero devolviendo el conjunto de routers que permiten encaminar el paquete. En caso de problema de
conectividad, se puede determinar en qué sitio se ha bloqueado o perdido el paquete.
El comando traceroute6 permite comprobar la ruta recorrida hacia una red remota en IPv6.
En este ejemplo, se constata que para alcanzar la máquina [Link] hay que pasar antes por el router
[Link].
a. netstat
El comando netstat permite observar las conexiones establecidas con el sistema local. Estas conexiones
pueden ser de tipo TCP, UDP o socket. Las conexiones TCP y UDP se establecen en general con sistemas
remotos, mientras que los sockets son archivos de un tipo particular que sirven de punto de intercambio entre
componentes de aplicación sin acceder a la red. Por ejemplo, el servidor gráfico X que era originalmente una
aplicación cliente/servidor ahora utiliza un socket para las comunicaciones entre el cliente X y su servidor
situados en la misma máquina.
Con el objetivo de diagnosticar el funcionamiento de la red, son más interesantes las conexiones TCP y UDP.
netstat -n
Donde la opción -n, opcional, impide la resolución inversa de las direcciones IP y de los puertos. La
visualización es más rápida.
netstat -p
A continuación se presenta el comando netstat en una sección de código en la que es llamado cada segundo para
supervisar la conexión con una aplicación del sistema local. El ejemplo es un script que se compone de un bucle
infinito en el que todos los comandos se han escrito en una sola línea. Si se necesita este script reiteradas veces,
se deberá crear un archivo de script.
Se
puede
while true ; do clear ; netstat -an | head -20 ; sleep 1 ; done salir de
este
bucle
con la combinación de teclas [Ctrl] C.
b. nc
El comando nc o netcat es una herramienta que permite leer o escribir datos a través de una conexión de
red. Por ejemplo, si tenemos una aplicación que trabaja con conexiones TCP en el puerto 1234 y que nos está
dando quebraderos de cabeza y, además, no disponemos de ninguna herramienta de diagnóstico, nc permite
establecer una conexión a través del puerto TCP/1234, enviar datos en bruto y observar la respuesta del
servidor.
nc -u dirección_ip puerto
Ejemplo
Comando nc: opciones y parámetros
de uso de
-u Opcional. Detalla que se desea trabajar con conexiones UDP. Si se nc para
omite, todas las peticiones se realizan usando TCP. consultar
un
dirección_ip La dirección IP de la máquina con la que se desea comunicar. servidor
web
puerto El puerto a través del cual se desea acceder a la máquina remota.
En este
ejemplo, el servidor al que se accede responde en html al código http (GET /) que le solicita mostrar su página de
inicio por defecto. Claramente se puede observar en este caso que el uso de nc para fines de diagnóstico requiere
un conocimiento detallado de los protocolos subyacentes.
usuario@ubuntu:~$ nc [Link] 80
GET /
<html><body><h1>It works!</h1></body></html>
usuario@ubuntu:~$
a. lsof
El comando lsof permite establecer la lista de archivos abiertos por procesos en un sistema. lsof, cuando se
ejecuta sin opciones, muestra simplemente el conjunto de archivos que pertenecen a todos los procesos
activos.
Las columnas con más utilidad directa son PID, USER y NAME.
Los registros representan las principales fuentes de información en caso de que dejen de funcionar las aplicaciones.
a. La librería libpcap
Para obtener información precisa sobre el funcionamiento a nivel de red de una aplicación, puede darse el
caso de que se tenga que llegar a capturar directamente el conjunto de elementos que circulan por la red.
Hay muchas herramientas para cumplir esta tarea en todos los sistemas. En entornos Linux, la mayor parte
de estas herramientas se basan en la librería libpcap que proporciona una interfaz de bajo nivel
estandarizada para la captura de paquetes. libpcap se creó a partir de los primeros desarrollos de un
comando de captura llamado tcpdump. Posteriormente, fue utilizada por muchos programas de análisis de
red, entre los cuales el célebre wireshark.
b. tcpdump
tcpdump es una herramienta que devuelve por la salida estándar (la pantalla) un resumen de las
capturas realizadas por la tarjeta de red. tcpdump trabajando en tiempo real (durante la ejecución del
programa) es útil para supervisar directamente la actividad de la red de una máquina. Si se redirigen las
capturas a un archivo se conservará la información completa de los paquetes para poder usarse con otras
utilidades compatibles con el formato libpcap.
Ejemplo
tcpdump: opciones y parámetros
de uso de
-warchivo Opcional: para guardar el resultado de la captura en un archivo en tcpdump
formato libpcap.
A
-i interfaz Opcional: para realizar la captura desde una interfaz concreta.
continuación, el ejemplo siguiente muestra elementos de tráfico de red capturados sobre la marcha por tcpdump.
Observe que la brevedad de la información mostrada (en este caso, intercambios relacionados con el Spanning Tree
Protocol entre conmutadores) no permite realizar un análisis en profundidad, sino principalmente ver de primera
mano la naturaleza de la información intercambiada.
Este
ejemplo
root@servidor:~$ tcpdump más
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth6, link-type EN10MB (Ethernet), capture size 96 bytes
[Link].961927
[Link].019503 STP 802.1d, Config, Flags [none], bridge-id
8007.[Link].800c, length 43
[Link].034712 STP 802.1d, Config, Flags [none], bridge-id
8007.[Link].800c, length 43
ˆC
3 packets captured
3 packets received by filter
0 packets dropped by kernel
root@servidor:~$
detallado redirige a un archivo en formato libpcap las peticiones http a un servidor con dirección IP
[Link].
c. Wireshark
Observe que la pantalla está dividida horizontalmente en tres paneles: el paquete que se está analizando, los
detalles capa por capa y el valor hexadecimal de los datos capturados. En este caso, se puede apreciar que se trata
de una petición DNS de tipo A para la resolución del nombre [Link].
En una red congestionada, se corre el riesgo de quedar sepultado bajo una avalancha de
paquetes capturados que no tienen necesariamente relación con lo que se está buscando. Se
mejorará la visibilidad aplicando un filtro de visualización (campo Filter de la pantalla principal).
Esta operación tiene la ventaja añadida de ser reversible (botón Clear).
Configuración automática con DHCP
1. El protocolo DHCP
DHCP (Dynamic Host Configuration Protocol) es un protocolo cliente/servidor que tiene como objetivo asignar
automáticamente una dirección IP así como los parámetros funcionales a los equipos de la red. Todo equipo
que no pueda configurarse estáticamente por un administrador de red usará este protocolo.
a. Funcionamiento
Descubrimiento de un servidor
Los clientes DHCP generan peticiones que envían por la red con la esperanza de encontrar un servidor DHCP.
Esta petición inicial sólo puede enviarse en broadcast: el equipo origen que genera la petición no sabe ni
siquiera su propia dirección, entonces es poco probable que conozca de antemano la dirección de un servidor
DHCP.
Si un servidor DHCP en la red recibe la petición de un cliente, le propondrá una dirección y una
configuración de red. Como el cliente al que responde el servidor de direcciones no tiene todavía dirección IP,
esta respuesta también se realizará en broadcast.
Los paquetes enviados para la respuesta del servidor tienen como nombre estandarizadoDHCPOFFER.
Aceptación de la propuesta
El cliente DHCP satisfecho de la propuesta que se le ha hecho, la va a aceptar. En este estado, esta
respuesta podría enviarse en unicast, debido a que el cliente ya tiene una propuesta de dirección IP y conoce
la del servidor. Sin embargo, este envío todavía se realizará en broadcast. En efecto: si un segundo servidor
DHCP trabaja concurrentemente con el primero para otorgar direcciones, este broadcast de aceptación
enviado a un servidor pero recibido por los dos ofertantes sirve para que el descartado tome nota de que el
equipo solicitante ya ha conseguido dirección por otro camino.
Los paquetes enviados para la aceptación de la oferta del servidor se llaman DHCPREQUEST.
El servicio DHCP más extendido en los sistemas Linux, que precisamente es el que hay que conocer para la
certificación LPI, es el servicio DHCP del ISC (Internet System Consortium). El ISC es un organismo creado en
1994 para asegurar el desarrollo y la sostenibilidad del servidor DNS BIND, cuyo desarrollo tiene origen en la
universidad de Berkeley. ISC DHCP es un desarrollo original del ISC para proporcionar una implementación de
referencia de este protocolo.
El servicio se inicia mediante un script estándar en /etc/init.d. Su nombre varía en función de la distribución y
la implementación.
En él se pueden encontrar las directivas de funcionamiento, las opciones generales del servidor y la declaración
de los recursos que se asignarán. Cada línea deberá terminar con un punto y coma.
default-lease-time duración;
authoritative;
log-facility destino;
En el archivo de configuración se pueden definir parámetros funcionales que se transmitirán a los clientes.
Estos parámetros se publican mediante la directiva option.
servidores_dns Servidor DNS utilizado por los clientes. Si hay varios, deberán
separarse por comas.
dominio_nis Cada vez más en desuso. Dominio NIS para los clientes.
servidores_nis Cada vez más en desuso. Servidor NIS utilizado por los clientes. Si
hay varios, deberán separarse por comas.
Las direcciones que se asignarán se definen en una o varias secciones subnet del [Link]. Dentro
de estas secciones, aparte de los rangos de direcciones se definen las opciones DHCP que se enviarán junto
a las ofertas de dirección. Las opciones más comunes son la puerta de enlace predeterminada y los
servidores DNS que se utilizarán. Las opciones pueden declararse fuera o dentro de las secciones subnet,
afectando al conjunto de direcciones asignadas o solamente a las del rango de subred en el que están
respectivamente. Si se produce un conflicto (se ha declarado la misma opción en la configuración general y
dentro de una sección subnet), es la opción de la subnet la que prevalece.
Se puede asignar opciones particulares de manera específica a una máquina. Esta máquina será objeto de
una declaración particular con la directiva host, parecida a una sección subnet pero dedicada a una sola
máquina.
Se puede utilizar este método para asignar de forma específica a un host de la red una dirección IP fija para
una máquina que, aunque disponga de un cliente DHCP, debería usar automáticamente la misma dirección.
Por ejemplo, en el caso de una impresora de red cuya interfaz de configuración sea tan incómoda que se
decida usar una configuración dinámica y para la que la reserva dhcp garantice la asignación de la dirección
deseada.
host máquina {
hardware ethernet dirección_mac;
fixed-address dirección_ip;
option routers router;
option domain-name sufijo;
option domain-name-servers servidor_dns;
}
Los servidores DHCP que posean múltiples interfaces deberán restringir sus comunicaciones a las tarjetas de
red correspondientes. Por ejemplo, si un servidor tiene una interfaz configurada en [Link] y otra en
[Link] y ofrece direcciones en la subred [Link], es evidente que sólo deberá atender a las
peticiones que reciba y ofertar direcciones en la interfaz correspondiente ([Link]). La única dificultad
reside en que este elemento de configuración no se encuentra en /etc/[Link], sino que está
en /etc/defaults/dhcp3-server.
Se puede acceder a este archivo en modo lectura, pero nunca se debería modificar.
lease {
interface "eth0";
fixed-address [Link];
option subnet-mask [Link];
option routers [Link];
option dhcp-lease-time 864000;
option dhcp-message-type 5;
option domain-name-servers [Link],[Link];
option dhcp-server-identifier [Link];
renew 6 2010/07/10 [Link];
rebind 3 2010/07/14 [Link];
expire 4 2010/07/15 [Link];
}
Observe las distintas etapas de asignación de la dirección: DHCPDISCOVER, DHCPOFFER, DHCPREQUEST y DHCPACK.
Ejemplo
de
root@servidor# dhclient eth1
Internet Systems Consortium DHCP Client V3.1.3
Copyright 2004-2009 Internet Systems Consortium.
All rights reserved.
For info, please visit [Link]
Listening on LPF/eth1/[Link]
Sending on LPF/eth1/[Link]
Sending on Socket/fallback
DHCPDISCOVER on eth1 to [Link] port 67 interval 8
DHCPOFFER of [Link] from [Link]
DHCPREQUEST of [Link] on eth1 to [Link] port 67
DHCPACK of [Link] from [Link]
bound to [Link] -- renewal in 49 seconds.
root@servidor#
Se puede comprobar que se envía un paquete DHCPRELEASE durante la ejecución del comando.
Listening on LPF/eth1/[Link]
Sending on LPF/eth1/[Link]
Sending on Socket/fallback
DHCPRELEASE on eth1 to [Link] port 67
root@servidor#
La totalidad de la configuración DHCP, incluyendo la declaración de todos los elementos subnet y todos los
rangos de direcciones, locales o remotos, se encontrará en un solo servidor DHCP. Una parte de los clientes,
en cambio, se encontrará en un segmento de red diferente. Para que las comunicaciones puedan
establecerse entre los clientes remotos y el servidor, el agente DHCP relay, que se encuentra también en el
segmento, deberá procesar los broadcasts recibidos y retransmitir la petición en modo unicast al servidor
DHCP. Los mensajes unicast pueden pasar por los routers, llegando la información a buen puerto. A
continuación, el servidor DHCP responderá con un mensaje en modo unicast con el agente relay como destino
y éste, a su vez, enviará un mensaje broadcast que recibirá el equipo cliente.
El cliente DHCP no sabe que está tratando con un agente relay, sino que piensa que hay un servidor DHCP
real en su segmento.
b. Configuración de los agentes relay
El agente relay se inicia de forma interactiva mediante el comando dhcrelay. En la mayoría de distribuciones
este comando se invoca desde un script de inicio de servicio y su configuración se obtiene a partir de un
archivo de configuración.
1. Preguntas
1 ¿Qué comando permite añadir una dirección IP secundaria a una interfaz?
2 Si una máquina tiene dos interfaces de red, ¿hay que configurar una segunda puerta de enlace
predeterminada?
3 ¿Qué interés puede haber en informar el archivo /etc/ethers que asocia direcciones MAC con direcciones
IP y cargarlo mediante el comando arp -f?
4 En el contexto de uso de los TCP Wrappers y del daemon tcpd, ¿cómo se resuelven los eventuales
conflictos entre el archivo [Link] y el archivo [Link]?
6 ¿Por qué el parámetro -n se usa con frecuencia con los comandos arp, route o netstat?
9 La petición DHCP de un cliente se envía en forma de broadcast ya que el cliente no sabe la dirección del
servidor DHCP. ¿Por qué la respuesta del servidor también se genera en broadcast?
10 Si se publica un servidor DNS en la configuración general de un servidor DHCP y hay otro servidor DNS
publicado en una sección subnet, ¿qué servidor(es) DNS obtiene(n) los clientes de la subnet?
2. Respuestas
1 ¿Qué comando permite añadir una dirección IP secundaria a una interfaz?
El comando ifconfig que, según los parámetros usados, puede asignar entre otros la dirección IP principal, la
máscara de subred, la dirección MAC y una dirección IP secundaria si fuera necesario.
2 Si una máquina tiene dos interfaces de red, ¿hay que configurar una segunda puerta de enlace
predeterminada?
Por supuesto que no. Si se definen dos puertas de enlace predeterminadas en los archivos de configuración de
las interfaces los scripts de inicialización de la red, que leen estos dos parámetros uno tras otro, sólo
recordarán el último. De todas formas, como su nombre indica, la puerta de enlace predeterminada se utiliza
en última instancia cuando el destino se encuentra en una red de la que no se conoce la ruta. Sin embargo, la
tabla de enrutamiento es única e independiente de las interfaces: la puerta de enlace predeterminada, por
tanto, debe ser un parámetro único e independiente de las interfaces.
3 ¿Qué interés puede haber en informar el archivo /etc/ethers que asocia direcciones MAC con direcciones
IP y cargarlo mediante el comando arp -f?
Si el archivo /etc/ethers se informa y se usa, el sistema aprende todas las asociaciones entre las direcciones
MAC y las direcciones IP introducidas. Por consiguiente, toda comunicación con las mencionadas direcciones IP
puede realizarse de forma directa, sin pasar previamente por una petición ARP. El beneficio neto es mínimo, las
peticiones ARP son rápidas, pequeñas y en volumen insignificantes en comparación con el conjunto de las
comunicaciones. Puede tener interés en términos de seguridad, ya que se evitan los broadcasts relacionados
con estas peticiones haciendo que la red sea más discreta.
4 En el contexto de uso de los TCP Wrappers y del daemon tcpd, ¿cómo se resuelven los eventuales
conflictos entre el archivo [Link] y el archivo [Link]?
En principio, solamente uno de estos archivos debería existir. Si es [Link], solamente los hosts
mencionados en este archivo estarán autorizados, y si es [Link], todos los hosts estarán autorizados
salvo los que figuen en el archivo. En caso de conflicto, la solución más restrictiva es la que se aplica. Por lo
tanto, el archivo [Link] se ignorará.
En realidad, no. El comando ifconfig proporciona información sobre todas las interfaces del sistema, incluyendo
las interfaces WiFi. Sin embargo, no proporciona ningún tipo de información relativa al funcionamiento
inalámbrico: SSID, la calidad del señal o el tipo de cifrado. En cambio, el comando iwconfig es útil en este
aspecto. Muestra la información relativa a una conexión WiFi e incluso permite configurarla.
6 ¿Por qué el parámetro -n se usa con frecuencia con los comandos arp, route o netstat?
Porque evita que el comando realice resoluciones de nombre inversas: estos comandos obtienen en principio
datos numéricos sin tratar (direcciones IP, direcciones MAC y números de puerto). Sin embargo, por motivos
estéticos, muestran por defecto los nombres correspondientes a estos datos numéricos, especialmente el
nombre DNS que puede estar asociado a una dirección IP tratada. Pero si no existe ningún registro DNS para la
dirección en cuestión, el comando intentará de todos modos realizar la resolución y no parará hasta que venza
el timeout del resolver DNS. Por lo tanto, para un dudoso elemento de confort (no es seguro que el usuario
prefiera los nombres a las direcciones), el comando pierde bastantes segundos intentando resolver las
direcciones sin esperanzas. El uso de la opción -n evita que el comando realice estas tediosas búsquedas y, por
tanto, disminuye el tiempo de respuesta.
Con el comando lsof, que devuelve los archivos abiertos, el nombre y el número del proceso responsable y el
nombre del usuario propietario del proceso.
Para la captura de tramas. Son muchas las aplicaciones que la utilizan, entre las que se pueden citar
especialmente tcpdump y wireshark. Una librería de código abierto permite a distintos programas utilizar el
mismo formato de datos. Por tanto, se puede utilizar tcpdump para capturar la comunicación entre dos
máquinas, wireshark para observarla detalladamente y un software de análisis para identificar las trazas
características de un virus, por ejemplo.
9 La petición DHCP de un cliente se envía en forma de broadcast ya que el cliente no sabe la dirección del
servidor DHCP. ¿Por qué la respuesta del servidor también se genera en broadcast?
Simplemente porque el cliente todavía no tiene una dirección IP y para enviar un mensaje unicast es necesaria
una dirección de destino.
10 Si se publica un servidor DNS en la configuración general de un servidor DHCP y hay otro servidor DNS
publicado en una sección subnet, ¿qué servidor(es) DNS obtiene(n) los clientes de la subnet?
El de la subnet. Los parámetros generales se usan para todos los clientes, excepto si hay otra información
más concreta en una sección de la red.
Trabajos prácticos
/etc/network/interfaces
/etc/[Link]
ifdown
ifup
vi
Operaciones
1. Configurar el servidor alfa con una dirección IP fija. La dirección debe ser
permanente y deberá conservarse después del reinicio. En los ejercicios se
utilizará la dirección [Link].
Uso de
la
# This file describes the network interfaces available on your system nueva
# and how to activate them. For more information, see interfaces(5).
gateway [Link]
configuración:
Archivo
/etc/[Link]:
nameserver [Link]
nameserver [Link]
b.
Acepte las opciones por defecto. Si el reinicio del servicio da error, no se preocupe. La situación mejorará
después de la configuración.
En la estación de trabajo, instale el software de captura de paquetes wireshark mediante el comando siguiente:
Directivas útiles
option
range
subnet
Operaciones
Archivo /etc/dhcp/[Link] modificado (esta sección debe añadirse al contenido ya existente del archivo):
Reinicio
del
default-lease-time 86400;
subnet [Link] netmask [Link] {
range [Link] [Link];
option routers [Link];
option domain-name-servers [Link];
}
servicio:
2.
alfa:/etc/dhcp# service isc-dhcp-server start Uso
Starting ISC DHCP server:dhcpd. del
alfa:/etc/dhcp/#
servicio DHCP
a. Configuración de la estación de trabajo
La estación de trabajo Ubuntu debe estar ya configurada como cliente DHCP. Para volver a solicitar de forma
explícita una dirección IP basta con hacer clic en el icono que representa a la red en la barra superior de la
pantalla. Un clic en Auto eth0 provocará una solicitud de concesión DHCP.
Compruebe a continuación que la estación de trabajo ha obtenido correctamente una dirección y que esta
dirección proviene del servidor alfa (podría ser necesario desactivar un posible servidor DHCP ya activo en la
red).
b.
Supongamos que tenemos una impresora cuya configuración de red es difícil de cambiar. Ante esta situación, el
servidor DHCP nos brinda la solución. Sin embargo, por razones obvias de comodidad en la administración, esta
impresora debe obtener sistemáticamente la misma dirección IP. Por lo tanto, decide reservarle una dirección IP.
Directivas útiles
fixed-address
hardware
host
option
Operaciones
c.
host printer1 {
hardware ethernet [Link];
fixed-ip-address [Link];
option routers [Link];
}
Su curiosidad natural le hace consultar con más detalle las comunicaciones DHCP entre el servidor y la estación
de trabajo. Utilizará para ello las herramientas estándar de captura de paquetes tcpdump y wireshark.
Comandos útiles
dhclient
tcpdump
wireshark
Operaciones
2. Desde otro terminal, capturar los paquetes con los puertos 67 y 68 como origen o
destino (comunicaciones DHCP) por la interfaz eth0. Utilizar el comando tcpdump
con privilegios de administrador.
Listening on LPF/eth0/[Link]
Sending on LPF/eth0/[Link]
Sending on Socket/fallback
DHCPRELEASE on eth0 to [Link] port 67
usuario@estacion:~$ ifconfig eth0
eth0 Link encap:Ethernet direcciónHW [Link]
Dirección inet6: fe80::a00:27ff:fe7b:c879/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:24856 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:6918 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 [Link]
Bytes RX:24613918 (24.6 MB) TX bytes:482889 (482.8 KB)
Memoria:10 Dirección básica:0xd020
usuario@estacion:~$
Listening on LPF/eth0/[Link]
Sending on LPF/eth0/[Link]
Sending on Socket/fallback
DHCPDISCOVER on eth0 to [Link] port 67 interval 5
DHCPOFFER of [Link] from [Link]
DHCPREQUEST of [Link] on eth0 to [Link] port 67
DHCPACK of [Link] from [Link]
bound to [Link] -- renewal in 329015 seconds.
usuario@estacion:~$
Terminal 2 - Resultado de tcpdump:
(...)
[Link].003789 IP [Link].68 > [Link].67: BOOTP/DHCP,
Request from [Link], length 300
[Link].008562 IP [Link].67 > [Link].68: BOOTP/DHCP,
Reply, length 548
[Link].051798 IP [Link].68 > [Link].67: BOOTP/DHCP,
Request from [Link], length 300
[Link].056980 IP [Link].67 > [Link].68: BOOTP/DHCP,
Reply, length 548
[Link].842693 IP [Link].67 > [Link].68: BOOTP/DHCP,
Reply, length 300
[ Ctrl - C ]
5 packets captured
6 packets received by filter
0 packets dropped by kernel
usuario@estacion:~$
1. Requisitos
Los conocimientos adquiridos con la certificación LPI nivel 1, especialmente:
2. Objetivos
Al final de este capítulo, usted será capaz de:
Desde su aparición, los sistemas Unix utilizan el archivo /etc/passwd como base de datos de cuentas de
usuarios. Este archivo se utiliza de forma natural para abrir sesiones en el sistema. Como su nombre todavía
indica albergaba, además de los identificadores de los usuarios, sus contraseñas encriptadas. Si algún otro
elemento distinto del de apertura de sesión necesita información sobre las cuentas (conexión ftp, apertura de
sesión remota, etc.), también consultará este archivo. En esta sencilla situación inicial, hay una única base de
datos de cuentas de usuario y múltiples aplicaciones que la usan. Todas las aplicaciones tienen que reconocer
el formato de esta base de datos.
Con la evolución de las técnicas de ataque de contraseñas, se hizo necesario mover las contraseñas a un
archivo no accesible a usuarios normales. Para ello, se almacenaron en un
nuevoarchivo: /etc/shadow cerrado a los usuarios. Los parámetros de autentificación con shadow se
administran mediante el archivo /etc/[Link]. Los parámetros almacenados en este archivo son en
general adecuados.
De la gran cantidad de parámetros del archivo [Link], los que están relacionados con el login son los que se
modifican con mayor frecuencia.
3. NSS
NSS (Name Service Switch) es una primera respuesta a la multiplicidad de bases de datos locales o
centralizadas. NSS tiene como objetivo normalizar la resolución de nombres en un sistema. NSS
permite resolver un nombre obteniendo la información asociada, como por ejemplo un nombre de usuario y su
uid, un nombre de grupo y su gid o incluso un nombre de host y su dirección IP.
[Link]
En este ejemplo se puede ver que las resoluciones de tipo password, group y shadow se realizarán mediante la
librería libnss_compat.so y que la resolución de nombres de host se realizará mediante las librerías libnss_files.so y
libnss_dns.so. Esto significa que los elementos de identificación de los usuarios se encontrarán en los archivos
locales de /etc y que la resolución de nombres de host se realizará en primer lugar mediante el archivo local
(/etc/hosts) antes de utilizar el servicio dns.
passwd: compat
group: compat
shadow: compat
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
En un sistema Linux moderno, NSS ya sólo se usa para operaciones de identificación, es decir,
encontrar información de una entidad. Todo lo relativo a la autentificación se realiza en un
mecanismo más elaborado: PAM.
4. Módulos de autentificación
Si NSS ya representa un progreso en relación a los archivos estáticos usados en los primeros años, la
revolución llega con PAM (Pluggable Authentication Module). PAM es un mecanismo complementario de NSS que
proporciona una autentificación a medida mediante la ejecución de módulos a la elección del administrador.
Cuando se abre una sesión en Linux, el usuario tiene que presentar su identificador y una contraseña. Gracias
a la resolución NSS, se deducirán los identificadores uid/gid, así como el resto de parámetros necesarios (fecha
de expiración, etc.). En lo que respecta a PAM, ejecutará según su configuración un módulo u otro para
proporcionar la autentificación, pero también puede realizar ciertas tareas ligadas a la apertura de sesión,
como por ejemplo la definición de variables.
PAM
1. El principio
PAM se posiciona como un intermediario entre las aplicaciones y los métodos de autentificación.
El objetivo principal de PAM es proporcionar una capa de abstracción entre las aplicaciones y los métodos de
autentificación. De este modo, una aplicación que quiera ser flexible y evolutiva en cuanto a los métodos de
autentificación que emplea sólo deberá ser compatible con PAM. Esto significa que deberá ser capaz de dirigirse
a la capa de autentificación PAM, sin importarle todo lo que hay detrás. Paralelamente, los procedimientos de
autentificación, sean cuales sean, deberán ser accesibles y utilizables por el mecanismo PAM.
Una aplicación solicita a PAM si un usuario se puede conectar. PAM, en función de su configuración, invocará los
módulos que utilizarán un método de autentificación. Si el resultado es positivo (el usuario ha proporcionado
los elementos correctos de autentificación), PAM devuelve la autorización de conexión a la aplicación.
PAM tiene otra ventaja. Acabamos de ver que la solicitud de autentificación entrañaba la carga de módulos.
Pues bien, el número de módulos no tiene límites y éstos se pueden acumular. Por lo tanto, se puede solicitar
una doble autentificación siguiendo dos métodos de autentificación distintos. Además, se puede sacar provecho
de la autentificación con PAM para provocar la carga de librerías sin relación con la autentificación. Por lo tanto,
es posible desencadenar muchas acciones una vez que se ha realizado con éxito la autentificación.
En resumen: cuando se solicita a un usuario que se autentifique, los módulos PAM se cargan en función de un
archivo de configuración y estos módulos provocan ciertas acciones, que pueden ser la propia autentificación u
otras acciones.
Los módulos PAM, invocados cuando se producen operaciones de autentificación, son muchos y están
enfocados a distintos usos. Algunos de ellos, sin embargo, se utilizan con mucha frecuencia y hay que
conocerlos. Otros son menos frecuentes y dependen de la distribución que se esté usando. No
obstante, conocer su funcionamiento y su finalidad permite comprender mejor la mecánica y la filosofía de
PAM.
Estos módulos están en archivos cuya ubicación estándar es /lib/security.
Para una acción determinada, por ejemplo la autentificación, se invocan varios módulos PAM. Se habla
entonces de una pila de módulos PAM. El funcionamiento en pila es una de las mayores aportaciones de los
servicios PAM.
3. Configuración de PAM
Las primeras versiones de PAM tenían su configuración en el archivo /etc/[Link]. La gran complejidad de
PAM ha hecho necesaria de forma inminente una estructura más modular en sus elementos de configuración.
Casi la totalidad de las implementaciones actuales utilizan un directorio /etc/pam.d que contiene tantos
archivos como aplicaciones que usan PAM. Si existe eldirectorio /etc/pam.d, el archivo /etc/[Link] no se
consultará.
Cada aplicación que utilice PAM necesita un archivo (en general del mismo nombre que la aplicación) que
alberga su configuración PAM.
El archivo contendrá tantas líneas como módulos se deseen llamar. Todas las líneas seguirán la siguiente
estructura:
Los
Archivo de pam.d: formato estándar
posibles
tipo Representa el tipo de acción que necesita recurrir a PAM. Los cuatro valores
valores posibles son: auth, account, password y session. de tipo y
de
control Indica cómo deberá reaccionar el módulo ante el éxito o el error de su control
ejecución. Los valores comunes se
son required, requisite, sufficient yoptional.
explicarán con más detalle, pero con lo explicado hasta ahora ya se puede entender la estructura del archivo
de configuración. En el extracto mostrado a continuación se puede ver que la línea sólo afecta a las
operaciones de autentificación (auth), que la ejecución del módulo es obligatoria (required), que el módulo
usa el método de autentificación tradicional unix, es decir, los archivos passwd y shadow (pam_unix.so) y,
finalmente, que este módulo debe aceptar una autentificación realizada con una contraseña vacía (nullok).
Observe que el parámetro nullok es específico del módulo y que cada módulo soportará todos los parámetros
que su desarrollador haya querido.
En este ejemplo se trata la autentificación (auth), la ejecución del módulo es obligatoria (required) y el módulo usa
el archivo de contraseñas clásico (pam_unix.so). Por último, se autoriza el uso de una contraseña vacía, tal y como
indica el argumento (nullok).
Cada línea de un archivo de configuración PAM debe comenzar por una de estas cuatro palabras clave que
determinan en qué tipo de acción debe actuar el módulo.
auth: la acción de autentificación propiamente dicha. Los módulos llamados con la acción
auth se ejecutan para o durante la autentificación.
Este ejemplo es un extracto muy resumido de un archivo de login estándar que ilustra tanto el concepto de pila
como la naturaleza modular de PAM.
El mismo módulo pam_unix también se declara con el tipo account. Si las aplicaciones que son compatibles com
PAM necesitan información sobre las cuentas de los usuarios, necesitarán el módulo pam_unix usado con el tipo
account.
El módulo pam_env se invoca con el tipo session, lo que asegura su ejecución (y por tanto la declaración de
variables) en la sesión del usuario.
El módulo pam_cracklib se invoca con el tipo password. Si una aplicación de gestión de contraseñas compatible con
PAM desea modificar una contraseña debe pasar el control de complejidad realizado por el módulo cracklib.
Los módulos se invocan con un "control_flag" (indicador de control) que determina el comportamiento en caso
de error o éxito del módulo.
sufficient: si el módulo se ejecuta con éxito y ningún módulo required o requisite ha dado
error, el resto de módulos de la pila se ignorarán.
optional: el módulo puede ejecutarse con éxito o error sin influenciar al resto de la pila. Es
decir, si un módulo opcional da error y un módulo required de la misma pila se ejecuta con
éxito, entonces el resultado global de la ejecución de la pila es positivo.
A continuación se muestran dos archivos PAM. El primero (gdm) gestiona la apertura de sesión gráfica en el
entorno Gnome y el otro (gdm-autologin) asegura la apertura automática sin contraseña de la sesión gráfica. Para
ver las diferencias entre estos dos modos de funcionamiento en lo que respecta a la autentificación de usuarios en
este ejemplo sólo tienen interés los módulos declarados en las líneas de tipo auth.
Los primeros módulos que se cargan, pam_nologin y pam_env, son comunes en ambos archivos. A título
informativo, pam_nologin prohíbe la conexión de los usuarios normales si el archivo /etc/nologin existe y ha sido
rellenado por el administrador y pam_env define diversas variables en el momento de la autentificación.
A continuación, el archivo gdm incluye el subarchivo common-auth que invocará los elementos de autentificación
deseados en el sistema (como mínimo pam_unix para la autentificación tradicional) y después carga el módulo
pam_gnome_keyring que permitirá a los usuarios debidamente autentificados en Gnome acceder a ciertas
características que necesitarían, por lo general, volver a autentificar al usuario.
El archivo gdm-autologin, en cambio, sólo carga un módulo: pam_permit que siempre devuelve un
resultado positivo, cuya ejecución es obligatoria (el módulo es required) y por lo tanto autorizará la apertura de
sesión incondicionalmente.
El
archivo
auth requisite pam_nologin.so de
auth required pam_env.so readenv=1
auth required pam_env.so readenv=1 envfile=/etc/default/locale
@include common-auth
auth optional pam_gnome_keyring.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_limits.so
@include common-session
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
session optional pam_gnome_keyring.so auto_start
@include common-password
1. Características generales
a. Los directorios
En 1990, la ITU (International Telecommunication Union) propuso una norma de estructuración de los
directorios electrónicos. Esta norma que tiene como objetivo establecer un marco de funcionamiento y de
referencia común para todos los desarrolladores se llama X500.
Los primeros programas que usaron esta norma fueron evidentemente los mensajes electrónicos. El NDS
(Netware Directory Services), célebre en su época, fue el primer uso relevante de las tecnologías de directorios
X500 al servicio de un sistema operativo en red. Hoy en día los directorios están ampliamente extendidos, ya
sean internos a un sistema operativo en red (como es el Active Directory de Microsoft) o bien estén a
disposición de otras aplicaciones. En ese caso, se suele hablar de directorios de "páginas blancas".
b. Estructura y terminología
Los directorios electrónicos X500 presentan características estructurales comunes. Son jerárquicos y tienen
un punto de origen que generalmente se denomina Root. Todo elemento del directorio se llama objeto;
algunos elementos son estructurales y otros son totalmente informativos. Los elementos estructurales se
llaman contenedores y son de distintos tipos, como por ejemplo organización, dominio o unidad organizativa.
Todo objeto del directorio alberga en su interior información en distintos formatos. Estos datos se
denominan atributos del objeto.
c. Esquema
Los directorios fueron originalmente diseñados para almacenar y administrar identidades. Naturalmente, en
ellos se encuentran los objetos que representan a las personas y los atributos para identificarlas y definirlas
tales como el nombre, los apellidos, el teléfono y la dirección electrónica. El conjunto de tipos de objetos
posibles en el directorio y para cada objeto el conjunto de atributos se definen en el esquema del directorio.
Sin embargo, es natural que un desarrollador o un usuario quieran almacenar en su directorio información de
índole particular para cubrir las necesidades propias de sus aplicaciones. Si el esquema original no lo permite,
entonces se puede realizar una extensión del esquema. La extensión del esquema consiste en definir para un
directorio nuevos tipos de objetos o nuevos atributos para un tipo de objeto existente. Por ejemplo, si una
empresa tiene un directorio con el censo de su personal y dicho personal debe llevar calzado de protección,
puede ser más interesante extender el esquema para añadir a los objetos de tipo persona el atributo "pie"
que gestionar una lista más o menos actualizada en una hoja de cálculo.
El tipo de cada objeto (unidad organizativa, usuario, grupo, etc.) se llama clase. Una clase de objetos se
define por el conjunto de atributos que la componen. Entre todos estos atributos, hay uno que tendrá una
importancia particular en la denominación del objeto, es el CN (Common Name).
d. El protocolo LDAP
La especificación X500 no previó originalmente que se pudieran realizar consultas ni disponía de un protocolo
para tal efecto. En 1993 se realizó un proyecto de protocolo por la universidad de Michigan para crear uno
que, funcionando sobre TCP/IP, proporcionara consultas sencillas a un directorio X500: fue el nacimiento de
LDAP (Lightweight Directory Access Protocol). Los directorios X500 existentes tuvieron que implementar, por
tanto, una capa servidor para el protocolo LDAP que permitiera responder a las peticiones de los clientes que
usaban este nuevo protocolo.
Rápidamente, el éxito del protocolo LDAP fue tal que se olvidó la función original de X500 para sólo hablar de
directorios LDAP. Incluso hoy en día se habla de directorios LDAP para cualquier directorio capaz de responder
a peticiones LDAP. Sin embargo, los elementos de estructura y denominación X500 han resistido el paso del
tiempo y siempre se habla de objetos, contenedores y esquema.
e. Denominación de objetos
Se ha visto que los objetos del directorio se insertan en una estructura de árbol. Para una denominación sin
ambigüedades, existe una notación formal que se basa en la posición del objeto dentro del árbol del
directorio activo y en su tipo. Esta notación es el DN (Distinguished Name).
clase1=nombre_objeto1,clase2=nombre_objeto2,...,clasen=nombre_objeton
Donde los parámetros clasex representan la clase del objeto descrito (cn, ou, uid, etc.) y los
parámetros objetox representan los nombres de los objetos descritos.
El nombre distinguido se basa en toda la ramificación del objeto al que se hace referencia hasta la raíz del
directorio, cada cambio de nivel se representa mediante comas. Para cada objeto citado, se dice
obligatoriamente la clase de este objeto.
El nombre distinguido se utiliza para identificar un objeto del directorio y su uso es obligatorio en operaciones
de autentificación.
Los directorios gestionan su propia seguridad. Aunque a menudo se permiten las peticiones anónimas para
consultas en modo lectura, habrá que autentificarse con el directorio para las operaciones de escritura. Esta
autentificación se realiza proporcionando el nombre distinguido y la contraseña de una cuenta del directorio
con los permisos necesarios en los elementos que se desean gestionar. En terminología LDAP, se habla de
"bind" (asociación) para referirse a la autentificación.
g. El formato LDIF
LDIF (LDAP Data Interchange Format - Formato de intercambio de datos LDAP) tiene como objetivo permitir la
exportación o la importación de datos desde o hacia un directorio LDAP. LDIF describe un formato de archivo
de texto que contiene la totalidad o parte de los datos de un directorio LDAP. Puede albergar la totalidad de
los objetos y de sus atributos o solamente una selección. Muchas utilidades LDAP usan el formato LDIF.
dn: nombre_distinguido
atributo1: valor1
atributo2: valor2
...
atributon: valorn
2. El servidor OpenLDAP
OpenLDAP es la implementación del servidor LDAP open source más común en sistemas Linux. Aunque su
facilidad de uso brilla por su ausencia en comparación a sus equivalentes comerciales, no está menos
extendido que éstos en todo tipo de implementaciones que van desde la centralización de la autentificación a
la gestión de cuentas y libretas de direcciones de correo electrónico.
b. Configuración
suffix "dc=dominio"
Donde dominio representa el contexto principal del árbol. Este valor se informa habitualmente en la instalación
mediante los scripts posteriores a la instalación de los paquetes. Un mismo directorio openldap puede
administrar varios árboles.
rootdn "cn=cuenta_admin,dc=dominio"
Donde cuenta_admin representa la cuenta del administrador del directorio. Atención, a diferencia de otras
implementaciones LDAP, no es obligatorio que la cuenta de administrador sea también un objeto del
directorio.
rootpw {método_de_encriptación}contraseña_encriptada
Donde método_de_encriptación representa el algoritmo de firma utilizado para encriptar la contraseña (SHA1,
MD5, crypt o texto sin encriptar).
Ya que el comando slappasswd envía su resultado por la salida estándar, hay que ser un poco astuto para
integrarlo en el archivo [Link].
En este
punto,
[root@beta openldap]# slappasswd -s contraseña el
{SSHA}oW6wu+yUpFnaB6tg+4cMWnAa8OmDXV62
[root@beta openldap]# echo "rootpw $(slappasswd -s contraseña)" >> [Link]
[root@beta openldap]#
directorio es completamente funcional después de un reinicio del servicio, pero aún estará vacío. Ya sólo falta
llenarlo con los clientes LDAP.
Sin duda, es la herramienta más comúnmente usada de entre las herramientas LDAP cliente por línea de
comandos. El comando ldapsearch permite efectuar peticiones a un directorio LDAP y recuperar el resultado
en formato LDIF.
El caso más simple consiste en solicitar localmente (directamente desde el servidor) la exportación completa
de todos los datos de un directorio y a menudo se utiliza esta posibilidad para comprobar la existencia de un
objeto o, simplemente, que el directorio responde adecuadamente a las peticiones.
Sintaxis del comando ldapsearch para exportar toda la información pública de un directorio
ldapsearch -x -b contexto
Sintaxis
Exportación con ldapsearch: opciones y parámetros
del
-x Utilizar una autentificación simple (caso general). comando
Ejemplos
Búsqueda con ldapsearch: opciones y parámetros
de
-Ddn_admin Realiza la autentificación con el nombre distinguido dn_admin. búsqueda
con
-W Solicitar interactivamente la contraseña. Puede reemplazarse por -w
(minúscula) seguido de la contraseña sin encriptar en la línea de
comandos.
-s sub Realiza una búsqueda recursiva en todos los niveles por debajo del
contexto de búsqueda.
ldapsearch
Se desea mostrar todos los usuarios que se encuentran en el directorio cuyo número de teléfono empieza por 91.
Ahora se
desea
usuario@ubuntu:~$ ldapsearch -x -D cn=admin,dc=pas,dc=net -w password mostrar
-h [Link] -b dc=pas,dc=net -s sub telephoneNumber=91* el
# extended LDIF conjunto
#
de
# LDAPv3
usuarios
# base <dc=pas,dc=net> with scope subtree
de la
# filter: telephoneNumber=91*
# requesting: ALL unidad
#
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
organizativa Sevilla. Observe el contexto de búsqueda (-b ou=sevilla,dc=pas,dc=net) y el filtro de búsqueda que
intenta comprobar que el atributo teléfono está informado (telephoneNumber=*).
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
Todas las conexiones con el servidor LDAP se realizan con la opción -x, lo cual indica una
autentificación en modo texto. Esto, naturalmente, constituye un riesgo en cuanto a la
seguridad. La conexión con autentificación SASL permitiría solucionar esta situación. Sin
embargo, la complejidad de implantación y el hecho de que la mayor parte de las consultas se
realizan de forma anónima hacen que raramente se use la autentificación SASL.
Básicamente, el comando ldapadd lee el contenido de un archivo LDIF que contiene los datos que se
modificarán y los añade al directorio. La construcción del archivo debe ser rigurosa, pero no presenta
dificultad alguna.
Ejemplo
ldappadd: opciones y parámetros
de
-x Utilizar una autentificación simple (caso general). archivo
LDIF para
-Ddn_admin Realiza la autentificación con el nombre distinguido dn_admin. añadir
-W Solicitar interactivamente la contraseña. Puede reemplazarse por -w
(minúscula) seguido de la contraseña sin encriptar en la línea de
comandos.
- El comando va dirigido al servidor cuya dirección es ip_servidor.
hip_servidor
Ejemplo
de uso
dn: cn=toto,dc=pas,dc=net de
objectClass: person ldapadd
cn: toto
sn: toto
telephoneNumber: 9123456789
El comando ldapmodify también se usa con un archivo ldif como argumento y sus parámetros de uso son los
mismos que los del comando ldapadd.
dn: cn=toto,dc=pas,dc=net
changetype: modify
replace: telephoneNumber
telephoneNumber: 912223344
El comando ldappasswd permite asignar una contraseña encriptada a un objeto usuario existente en el
directorio.
Ejemplo
ldappasswd: opciones y parámetro
de uso
- La contraseña que se desea asignar al nuevo usuario. Puede del
scontraseña reemplazarse por -S (mayúscula) para introducir interactivamente la comando
nueva contraseña.
ldappasswd
El primer comando asigna la contraseña al usuario tata. Observe que el uso de las opciones -w y -s permiten incluir
las contraseñas (contraseña de autentificación y contraseña del usuario) directamente en la línea de comandos sin
tener que introducirlos de forma interactiva.
El segundo comando provoca la visualización de todas las propiedades del usuario tata y se puede ver la contraseña
encriptada en el atributo userPassword.
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
usuario@ubuntu:~$
Cada una de las utilidades por línea de comandos puede encontrar algunos elementos de configuración en
el archivo [Link]. La sintaxis de los comandos se aligerará mucho. Su ubicación generalmente
es /etc/ldap/[Link], pero puede variar según la implementación.
BASE contexto
HOST ip_servidor
BASE contexto Realiza las búsquedas a partir del DN del contenedor contexto.
También se puede declarar el contexto base LDAP mediante la variable LDAPBASE. Sin
embargo, el método más universal es informar el archivo [Link].
g. Clientes gráficos
Las aplicaciones compatibles LDAP que integran un cliente les permite realizar peticiones de directorio para su
funcionamiento. Por ejemplo, un cliente de mensajería en general es capaz de comprobar la validez de una
cuenta o de realizar una búsqueda en el directorio LDAP. Sin embargo, si se utiliza un directorio LDAP al
servicio de una aplicación, a menudo es práctico disponer de una utilidad gráfica "universal" que permita
comprobar el buen funcionamiento del directorio y si fuera necesario realizar modificaciones
independientemente de la aplicación cliente. Son muchas y de calidad variable las herramientas de este tipo.
Podemos citar luma, gq y lat.
1. Configuración NSS
La autentificación sólo será posible si la información de los usuarios está accesible vía NSS.
La librería NSS, responsable de consultar al directorio, tiene que disponer de la información necesaria. Para
ello, hay que rellenar el archivo de configuración LDAP para la librería nss ldap. Generalmente, este archivo se
llama [Link] y se ubica directamente en el directorio /etc.
Esta configuración requiere que la librería NSS sea capaz de gestionar la información LDAP. Generalmente,
esta funcionalidad la proporciona un paquete llamado libnss_ldap.
Este archivo utilizado por NSS es extremadamente parecido al utilizado por los clientes LDAP.
host [Link]
base dc=pas,dc=net
ldap_version 3
rootbinddn cn=admin,dc=pas,dc=net
El archivo /etc/nsswitch se debe configurar para hacer referencia a LDAP como fuente de información
prioritaria. Sin embargo, debe seguir funcionando con los archivos locales para cuando el directorio no esté
disponible.
Modificación del archivo nsswitch con LDAP como fuente de nombres prioritaria
A menudo es difícil diagnosticar problemas relacionados con la autentificación LDAP. En efecto, se puede
alterar el buen funcionamiento por falta de disponibilidad del directorio, por cuentas de usuarios mal creadas
o por una mala configuración del cliente. La herramienta getent permite en este caso comprobar que el cliente
es capaz de realizar consultas al directorio LDAP y obtener información correcta.
La configuración de una autentificación LDAP no es particularmente fácil, esta comprobación en mitad del proceso es
bienvenida.
2. Configuración PAM
Afortunadamente, las distribuciones Linux modernas facilitan la tarea concentrando en los archivoscommon-
action para Debian o system-auth para Red Hat la configuración de todas las aplicaciones que comparten los
mismos modos de autentificación. Por tanto, nos bastará con modificar estos archivos para cambiar el modo
de autentificación de todas las aplicaciones del sistema.
Los tipos de acción PAM account y auth deben modificarse para permitir la autentificación LDAP. Si se consulta
su contenido inicial, se ve que configuran el módulo pam_unix.so, en general con el
control required o sufficient. La primera regla es no tocar estas líneas de la configuración. En efecto, incluso
si se desea utilizar un directorio LDAP para las operaciones de autentificación, ante todo se debe conservar el
mecanismo tradicional, aunque sólo sea para permitir la autentificación local en caso de fallo del directorio. Por
tanto, la configuración se realizará añadiendo para las acciones account y auth una línea indicando
como sufficient la autenticación por el módulo LDAP (pam_ldap.so). Se podrá evitar una doble entrada de
contraseña añadiendo la opciónuse_first_pass que permitirá reutilizar la contraseña introducida en el primer
intento de conexión.
El parámetro use_first_pass indica al sistema que debe intentar la autentificación en el módulo pam_ldap con los
mismos identificadores que los que se usaron con el módulo pam_unix. Así se evita que el usuario introduzca dos
veces sus credenciales.
1. Preguntas
1 ¿Por qué las contraseñas de los sistemas actuales ya no se almacenan en el archivo /etc/passwd como
se hacía en los sistemas Unix originales?
3 ¿En qué aspecto la aparición de PAM ha facilitado el trabajo de los desarrolladores en lo que respecta a
las operaciones de autentificación?
5 ¿En qué caso un módulo de autentificación PAM llamado con el control de comportamiento sufficient no
conduce al éxito de la autentificación?
6 ¿Qué sucede después del éxito de un modulo llamado con el control de comportamiento required?
7 ¿Cómo se puede utilizar el formato de intercambio LDIF de los directorios LDAP para exportar los datos
de un directorio LDAP como Active Directory a otro directorio LDAP como OpenLDAP?
8 ¿Por qué es necesario un comando específico (ldappasswd) para modificar la contraseña de una cuenta
de usuario openldap cuando el comando ldapmodify ya permite escribir cualquier atributo de objeto en el
directorio?
9 ¿Existe algún método concreto que permita definir el contexto de búsqueda de los clientes LDAP
distinto al de informar la directiva BASE en el archivo [Link]?
10 ¿Por qué en una autentificación LDAP de un sistema Linux se conserva casi siempre la autentificación
local mediante los archivos de contraseña (/etc/shadow)?
2. Respuestas
1 ¿Por qué las contraseñas de los sistemas actuales ya no se almacenan en el archivo /etc/passwd como
se hacía en los sistemas Unix originales?
El archivo [Link] contiene todos los parámetros de resolución de nombres así como las bases de datos
de información necesarias para su resolución. De este modo, generalmente indica que la resolución de
nombres de equipos (hosts) debe realizarse en primer lugar mediante un archivo local (parámetro files) y
después por un servicio dns si se ha configurado (parámetro dns).
3 ¿En qué aspecto la aparición de PAM ha facilitado el trabajo de los desarrolladores en lo que respecta a
las operaciones de autentificación?
Porque los desarrolladores sólo tienen que hacer sus aplicaciones compatibles con la librería de
autentificación PAM. Si las técnicas de autentificación evolucionan, no será necesario modificar la aplicación,
sino que lo único que habrá que modificar es su configuración PAM que determinará los nuevos módulos en los
que se basa esta autentificación.
5 ¿En qué caso un módulo de autentificación PAM llamado con el control de comportamiento sufficient no
conduce al éxito de la autentificación?
6 ¿Qué sucede después del éxito de un modulo llamado con el control de comportamiento required?
Se continua. El éxito de un módulo required no provoca la parada del tratamiento de la pila. Los otros módulos
de la pila se ejecutarán.
7 ¿Cómo se puede utilizar el formato de intercambio LDIF de los directorios LDAP para exportar los datos
de un directorio LDAP como Active Directory a otro directorio LDAP como OpenLDAP?
Es muy difícil. El formato LDIF está íntimamente ligado al esquema del directorio y dos directorios
distintos tienen casi siempre distintos esquemas. Los atributos LDAP, por consiguiente, no serán los mismos
por ambos lados y una exportación contendrá seguramente elementos no asimilables por el segundo
directorio. Se podría puntualmente tener éxito en algunos intercambios restringiendo los datos exportados e
importados a clases de objetos y atributos comunes en los dos directorios. Los servicios funcionales que
permiten intercambios completos (metadirectorios) se basan siempre en una fase de reformateo de datos. A
menudo se habla de una operación de mapeo de atributos.
8 ¿Por qué es necesario un comando específico (ldappasswd) para modificar la contraseña de una cuenta
de usuario openldap cuando el comando ldapmodify ya permite escribir cualquier atributo de objeto en el
directorio?
Porque el comando ldapmodify escribiría el atributo de la contraseña sin encriptar, mientras que el
comando ldappasswd gestiona de forma nativa varios algoritmos de encriptación.
9 ¿Existe algún método concreto que permita definir el contexto de búsqueda de los clientes LDAP
distinto al de informar la directiva BASE en el archivo [Link]?
Sí, se puede informar la variable LDAPBASE con el contexto de búsqueda que deberán usar los clientes LDAP.
Sin embargo, este método sufre el problema de la volatilidad de las variables y la declaración deberá guardarse
en el entorno de ejecución de los comandos cliente (la variable se exporta generalmente desde un proceso
padre de los comandos cliente).
10 ¿Por qué en una autentificación LDAP de un sistema Linux se conserva casi siempre la autentificación
local mediante los archivos de contraseña (/etc/shadow)?
Para preservar el uso del sistema en caso que el directorio LDAP no esté disponible. Los controles de
comportamiento de los módulos LDAP se adaptan a este uso permitiendo la autentificación por directorio LDAP
pero valiéndose de un método alternativo en caso de error.
Trabajos prácticos
Ante las perspectivas de crecimiento de la empresa y los miles de puestos de trabajo posibles, se va dando cuenta de la
necesidad de una autentificación centralizada y a gran escala. Por tanto, decide instalar un servidor LDAP en beta.
En el servidor beta, instale el servicio LDAP así como las utilidades cliente mediante el comando siguiente:
/etc/openldap/[Link]
rootpw
slaptest
vi
Operaciones
Estas operaciones se realizan con la versión 2.4 del servidor openldap en CentOS 6. Tienen en cuenta la reciente
modificación de configuración del servidor y el abandono del archivo [Link]. Por razones pedagógicas y para encuadrar
mejor los objetivos LPI, utilizaremos el archivo ”antiguo” y lo convertiremos al nuevo formato con el comando slaptest. Este
comando sirve originalmente para comprobar la coherencia de un archivo de configuración, pero también es capaz de
convertir el archivo de configuración histórico en la estructura de carpetas necesaria para el nuevo formato de configuración
(slapd.d).
8. Reasigne el contenido del directorio slapd a la cuenta y grupo del servicio ldap.
9. Inicie el servicio.
Comprobación de
la presencia de las
[root@beta openldap]# grep "dc=pas,dc=net" [Link] dos entradas
by [Link]="cn=Manager,dc=pas,dc=net" read rootpw:
suffix "dc=pas,dc=net"
rootdn "cn=Manager,dc=pas,dc=net" Archivo [Link]
[root@beta openldap]# después de la
modificación (sin
los comentarios):
Borramos el
[root@beta openldap]# grep rootpw [Link] contenido de
rootpw password slapd.d:
rootpw password
# rootpw {crypt}ijFYNcSNctBYg Recreación del
[root@beta openldap]# contenido de
slapd.d:
Asignación de
archivos ldap a la
include /etc/openldap/schema/[Link]
include /etc/openldap/schema/[Link] cuenta y grupo del
include /etc/openldap/schema/[Link] servicio:
include /etc/openldap/schema/[Link]
include /etc/openldap/schema/[Link] Parada e inicio del
include /etc/openldap/schema/[Link] servicio:
include /etc/openldap/schema/[Link]
c. Consulta
include /etc/openldap/schema/[Link]
include /etc/openldap/schema/[Link] sencilla al
include /etc/openldap/schema/[Link] directorio
include /etc/openldap/schema/[Link]
Un directorio
include /etc/openldap/schema/[Link]
openldap es por
allow bind_v2 definición muy
discreto. En este
punto, usted
pidfile /var/run/openldap/[Link] decide realizar una
argsfile /var/run/openldap/[Link] consulta sencilla al
directorio para ver
si va a responder.
database config
access to *
by [Link]="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
manage
by * none
rootpw password
database monitor
access to *
by [Link]="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read
by [Link]="cn=Manager,dc=pas,dc=net" read
by * none
database bdb
suffix "dc=pas,dc=net"
checkpoint 1024 15
rootdn "cn=Manager,dc=pas,dc=net"
rootpw password
directory /var/lib/ldap
[root@beta openldap]# ls
cacerts [Link] schema [Link] slapd.d
[root@beta openldap]# rm -rf slapd.d/*
[root@beta openldap]#
ldapsearch
pgrep
service
Operaciones
2. Desde el servidor beta, hacer una petición lo más simple posible con el objetivo de
obtener una respuesta del directorio (aunque en este momento el directorio esté
vacío).
Resumen de los comandos y resultado por pantalla
Petición simple:
# search result
search: 2
result: 32 No such object
# numResponses: 1
[root@beta openldap]#
ldappadd
vi
Operaciones
Archivo [Link]:
1. Crear un archivo LDIF que contenga la declaración del contexto base.
Importación del
archivo en el
[root@beta ~]# cat [Link] directorio:
dn: dc=pas, dc=net
objectClass: domain e. Creación de
dc: pas cuentas de
[root@beta ~]# usuario
Comandos útiles
ldappadd
vi
Operaciones
Archivo [Link]:
1. Crear un archivo LDIF que contenga los datos de dos usuarios.
dn: uid=titi,dc=pas,dc=net
objectClass: top
objectClass: posixAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: titi
cn: titi
sn: titi
uidNumber: 602
gidNumber: 1000
homeDirectory: /home/titi
loginShell: /bin/bash
userPassword: password
f. Consulta de un
directorio poblado
[root@beta openldap]# ldapadd -x -D cn=Manager,dc=pas,dc=net -W -f ~/[Link]
Enter LDAP Password :
adding new entry "uid=toto,dc=pas,dc=net" Comando útil
adding new entry "uid=titi,dc=pas,dc=net"
[root@beta openldap]#
ldapsearch
Operaciones
1. Desde el servidor beta, hacer una consulta con el objetivo de obtener la totalidad
de los datos del directorio.
Petición LDAP:
g. Consulta del
directorio desde
[root@beta openldap]# ldapsearch -x -b "dc=pas,dc=net" -D un cliente
cn=Manager,dc=pas,dc=net -W -s sub
Enter LDAP Password: Antes de pasar a
# extended LDIF temas más serios,
# nos falta
# LDAPv3 comprobar que el
# base <dc=pas,dc=net> with scope subtree cliente de la
# filter: (objectclass=*)
estación de
# requesting: ALL
trabajo recibe
#
adecuadamente
# [Link] los datos del
dn: dc=pas,dc=net directorio.
objectClass: domain
dc: pas
# toto, [Link]
dn: uid=toto,dc=pas,dc=net
objectClass: top
objectClass: posixAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: toto
cn: toto
sn: toto
givenName: toto
uidNumber: 601
gidNumber: 1000
homeDirectory: /home/toto
loginShell: /bin/bash
userPassword:: cGFzc3dvcmQ=
(...)
[root@beta openldap]#
[Link]
ldapsearch
Operaciones
1. Desde la estación de trabajo, hacer una consulta del contenido del directorio
detallando todos los elementos necesarios por línea de comandos.
3. Volver a hacer una consulta en el servidor con una sintaxis aligerada basándose
en los datos del archivo [Link].
Archivo
/etc/ldap/[Link]
usuario@estacion:~$ ldapsearch -x -h [Link] -b dc=pas,dc=net modificado:
-D cn=Manager,dc=pas,dc=net -W -s sub
Enter LDAP Password: Petición aligerada:
# extended LDIF
#
# LDAPv3
2.
# base <dc=pas,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# [Link]
dn: dc=pas,dc=net
objectClass: domain
dc: pas
# toto, [Link]
dn: uid=toto,dc=pas,dc=net
(...)
usuario@estacion:~$
#
# LDAP Defaults
#
BASE dc=pas,dc=net
HOST [Link]
#URI ldap://[Link] ldap://[Link]
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
usuario@estacion:~$ ldapsearch -x -D cn=Manager,dc=pas,dc=net -W -s sub
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <dc=pas,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# [Link]
dn: dc=pas,dc=net
objectClass: domain
dc: pas
# toto, [Link]
(...)
usuario@estacion:~$
En la estación de trabajo estacion, instale las librerías pam necesarias para la autentificación LDAP:
Responda a las pocas preguntas que se le plantean. De todos modos, volverá a los archivos de configuración para su
configuración. En caso de duda, ponga un valor claramente inapropiado para que sea más fácil de identificar los elementos
que habrá informado el asistente.
/etc/[Link]
/etc/[Link]
getent
Operaciones
2. Para que las resoluciones de nombres puedan realizarse por LDAP, introducir los
parámetros host y base en el archivo /etc/[Link]. Para una mejor estabilidad,
comentar o borrar la línea uri ldapi://.
Extracto del
archivo
passwd : ldap compat /etc/[Link]
group : ldap compat modificado:
shadow : ldap compat
Prueba de la
resolución de
nombres:
host [Link] c. Configuración
base dc=pas,dc=net de la
# uri ldapi://[Link]
autentificación
pam con LDAP
/etc/pam.d/common-account
/etc/pam.d/common-auth
Operaciones
Archivos modificados
Archivo /etc/pam.d/common-auth:
Archivo
/etc/pam.d/common-account:
Archivo
/etc/pam.d/common-session:
d. Validación
funcional
session [default=1] pam_permit.so
session requisite pam_deny.so La estación de
session required pam_permit.so trabajo Ubuntu
session optional pam_umask.so debería ser ahora
session required pam_unix.so capaz de abrir una
session required pam_mkhomedir.so skel=/etc/skel sesión con una
session optional pam_ldap.so cuenta de usuario
session optional pam_ck_connector.so nox11 situada en el
directorio LDAP del
servidor beta.
Modificar cualquier parámetro pam es peligroso en sí mismo, se recomienda comprobar la configuración con un comando que
no requiera reiniciar el sistema, como el comando su. En caso de error, se dispondrá de todo el tiempo para restablecer la
configuración y evitar tener que reinstalar un sistema incapaz de reiniciar.
Requisitos y objetivos
1. Requisitos
Los conocimientos adquiridos en la certificación LPI nivel 1, especialmente:
Edición de archivos.
2. Objetivos
Al final de este capítulo, será capaz de:
1. Compartición de directorios
Las comparticiones NFS activas en un sistema se declaran mediante un directorio local y están accesibles para
algunos clientes con ciertas opciones. Los clientes autorizados así como las opciones se declaran cuando se
activa la compartición. Si se encuentra un sistema ya configurado, puede ser útil hacer un diagnóstico de las
comparticiones activas de este sistema. Este diagnóstico se realiza usando el comando exportfs.
Ejemplo de uso del comando exportfs para observar las comparticiones activas
En este ejemplo, el directorio /perso se comparte solamente para la dirección [Link], mientras que /nas se
comparte para todos los clientes.
Se
pueden
alfa:~# exportfs
/data/perso <[Link]>
/nas <world>
alfa:~#
El comando nfsstat sirve sobre todo para verificar una actividad o una ausencia de actividad en un servidor NFS.
usuario@servidor:~$ nfsstat
Server rpc stats:
calls badcalls badauth badclnt xdrcall
12 0 0 0 0
usuario@servidor:~$
b. Compartición puntual
El comando exportfs también permite declarar una compartición de forma interactiva. Se utiliza para declarar
comparticiones puntuales.
Sintaxis del comando exportfs para una compartición puntual
exportfs dirección_cliente:/ruta_compartición
Por
Comando exportfs: opciones y parámetros
supuesto, hace ya mucho tiempo que el control de acceso basado en la dirección IP no es una garantía de
seguridad.
Naturalmente, se puede declarar una compartición permanente activa para el inicio del servicio NFS. Esta
declaración se realiza en el archivo /etc/exports. Hay que tener en cuenta que, según la distribución, este
archivo posiblemente no se haya creado después de la instalación del servicio y hay que crearlo desde cero.
compartición1 dirección_cliente1
compartición2 dirección_cliente2
Este archivo se lee cada vez que arranca el servicio NFS o en cada llamada al comando exporfscon la opción -
a. Hay que tener en cuenta que las comparticiones se expresan siempre con su ruta absoluta, es decir, se
expresan en relación a la raíz del sistema de archivos.
El script de administración del servicio NFS provoca la ejecución de tres daemons estándar:
nfsd: espacio de usuario del servicio NFS. Inicia los threads NFS para las conexiones cliente.
El comando rpcinfo permite efectuar una petición RPC a un servidor y mostrar los daemons gestionados.
d. Opciones de compartición
Algunas opciones modifican el comportamiento del servidor NFS para cada una de las comparticiones que
alberga. Las opciones se especifican mediante el comando exportfs si se utiliza dinámicamente o en
el archivo /etc/exports si se utiliza NFS como servicio.
Ejemplo
Opciones NFS comunes de uso
ro Acceso en modo sólo lectura. del
comando
rw Acceso en modo lectura/escritura. exportfs
con la
sync Acceso en modo escritura síncrona. Los datos se escriben
opción de
inmediatamente.
sólo
async Acceso en modo escritura asíncrona. Utilización de una caché de lectura
escritura.
Si hay
root_squash Comportamiento por defecto. La cuenta root pierde sus privilegios varias
en la compartición. opciones,
se deben
no_root_squash La cuenta root conserva sus privilegios en la compartición. separar
nolock No se bloquean los archivos a los que se accede. por
comas.
Ejemplo
de
root@servidor# exportfs -o ro *:/data archivo
root@servidor#
El parámetro * o una dirección IP de un cliente autorizado son indispensables para un buen funcionamiento.
Ejemplo
de
/data *(ro)
Se muestran las opciones explícitas así como las opciones por defecto.
alfa:~# exportfs -v
/perso [Link](rw,wdelay,root_squash,no_subtree_check)
/data <world>(ro,wdelay,root_squash,no_subtree_check)
alfa:~#
2. Configuración de clientes
Donde servidor representa la dirección IP del servidor del que queremos obtener las comparticiones.
Los ordenadores cliente acceden a una compartición NFS mediante una operación de montaje. Usan la
compartición montada como si de una estructura de directorios local se tratase.
Puede ser bastante sorprendente comprobar que no se solicita ningún tipo de identificación en la conexión a
una compartición NFS. Se encontrará conectado sin tener que haber proporcionado credenciales. De hecho,
NFS considera que los identificadores de los usuarios son coherentes entre el servidor y sus clientes, es decir,
que todas las cuentas de usuario son idénticas en todas las máquinas y que sus identificadores de usuario
(uid) son todos los mismos.
Cuando un cliente se conecta a una compartición NFS, presenta su uid y tiene exactamente los permisos que
el usuario con el mismo uid en el servidor. No se realiza ningún control.
Como la cuenta root tiene el uid 0 sea cual sea el sistema Linux, un cliente que se conecta al servidor con su
cuenta de superusuario en teoría debería tener todos los privilegios en la compartición. Esta embarazosa
situación se resuelve mediante la aplicación implícita de una opción de compartición: root_squash. En efecto,
si un servidor recibe una solicitud de conexión de una cuenta con el uid 0, modifica su identificador y le aplica
en la compartición el uid de una cuenta de servicio NFS. Esta cuenta (según la distribución nfsanonymous,
nfsnobody, nobody...) en general sólo tendrá permisos del conjunto de usuarios "otros" en el sistema del
servidor.
Compartición de datos con Samba
Samba es una solución software de interoperabilidad con Windows disponible en los sistemas Linux y Unix. El
nombre de Samba viene del protocolo SMB (Server Message Block) utilizado para la compartición de recursos en
las redes Microsoft. Permite en particular compartir archivos e impresoras en los servidores Linux para clientes
Windows. La suite software Samba también tiene un cliente que permite a las máquinas Linux conectarse a los
recursos compartidos de un servidor Windows.
1. Configuración general
Samba se basa en dos daemons llamados nmbd y smbd. El daemon nmbd se encarga de anunciar los
servicios y en general de todo el funcionamiento NetBIOS over IP. El daemon smbd se encarga de las
comparticiones de archivos y de impresoras.
El script de gestión del servicio que generalmente está presente en las distribuciones inicia estos dos
daemons en cada arranque.
Los daemons samba tienen su configuración en el archivo de configuración [Link], generalmente ubicado
en el directorio /etc/samba.
El archivo de configuración está dividido en secciones estandarizadas, cada una precedida por un título entre
corchetes. Los parámetros de funcionamiento se ubican en cada una de estas secciones escritos siguiendo la
sintaxis parámetro = valor.
[sección1]
parámetro1 = valor1
parámetro2 = valor2
[sección2]
parámetro3 = valor3
parámetro4 = valor4
Existe una herramienta muy útil llamada testparm que valida el formato de un archivo de configuración
samba. También devuelve un informe puro (sin líneas de comentarios) de la configuración por la salida
estándar. Naturalmente, esta salida se puede redirigir a un archivo y generar un [Link] legible y de
tamaño razonable. Cabe destacar que el comando testparmignora todo parámetro del archivo de
configuración si se ha configurado con su valor por defecto. Este comportamiento se puede modificar con la
opción -v. Entonces todas las opciones aplicables se mostrarán.
Este método se utiliza a menudo para usar un archivo de configuración con muchos comentarios obteniendo un
archivo real de dimensiones razonables.
alfa:/etc/samba# wc -l [Link]
31 [Link]
alfa:/etc/samba# testparm -v [Link] > [Link]
alfa:/etc/samba#
c. Configuración global
En su configuración más simple, una implementación samba incluye un servidor que alberga uno o más
recursos. Algunos parámetros relacionados con el funcionamiento global y la identidad de este servidor se
encuentran en una sección llamada global del archivo [Link].
En los ejemplos siguientes, nos pondremos en la situación de un servidor simple, fuera de un dominio
Windows, que tiene comparticiones para clientes Windows.
workgroup = grupo_de_trabajo
server string = comentario
log file = /ruta/log.%m
max log size = log_maxi
security = user (por defecto)
encrypt passwords = true (por defecto)
grupo_de_trabajo El nombre del grupo de trabajo del servidor. Hay que tener en
cuenta que este parámetro también proporciona el nombre del
dominio cuando está trabajando en un dominio.
2. Compartición de directorios
Para compartir un directorio hay que añadir una sección en el archivo [Link].
[nombre_compartición]
comment = comentario
path = ruta
readonly = sólo_lectura
browseable = yes
Si
Declaración de comparticiones en [Link].
consulta
nombre_compartición El nombre con el que se verá la compartición en las máquinas el
Windows. conjunto
de
comentario Opcional. Definición del comentario asociado a la compartición.
parámetros disponibles para el archivo [Link], puede quedar comprensiblemente impresionado por su gran
cantidad. Hay que tener en cuenta que muchos parámetros funcionales pueden expresarse de varias formas.
Tomemos por ejemplo el parámetro de acceso a una compartición en sólo lectura que hemos visto
anteriormente. Todas las expresiones siguientes son equivalentes:
readonly = yes
readonly = true
writable = no
writable = false
writeable = no
writeable = false
3. Administración de credenciales
En la gran mayoría de sistemas operativos y aplicaciones las contraseñas no se almacenan sin encriptar. Las
contraseñas de las cuentas están encriptadas y solamente se almacena la versión encriptada. La contraseña
sin encriptar se olvida tan pronto como se encripta.
Cuando un usuario se conecta y teclea sus credenciales para identificarse, la contraseña se codifica de
inmediato y esta versión recién encriptada de la contraseña se compara con la versión almacenada en la base
de datos de cuentas de usuario del sistema. De este modo, la contraseña no se transmite nunca sin encriptar
por la red.
Los algoritmos utilizados para encriptar la contraseña pertenecen a la familia de los algoritmos de hash.
Funcionan de un modo un poco particular, en el sentido de que permiten encriptar pero nunca desencriptar
datos: tienen un único sentido y por este hecho se los considera de una tipología diferenciada dentro del
mundo de la criptografía. Este modo de funcionamiento justifica por qué, cuando un usuario pierde su
contraseña, se le puede reasignar una nueva, pero no se le puede decir cuál era la que ha olvidado. La única
información que se guarda es la versión encriptada de la contraseña y es hipotéticamente indescifrable.
Los algoritmos de hash más comunes se llaman MD4, MD5 y SHA1. Se utilizan para almacenar contraseñas,
las operaciones de firma digital y los controles de integridad.
Un servidor Linux con la suite software Samba instalada utiliza nativamente las cuentas del sistema para las
autentificaciones Samba. De este modo, toda conexión por parte de un cliente se realiza con una cuenta de
usuario albergada en el sistema Linux. Sin embargo, esta situación podría ser un problema. El cliente de
Windows presentará una contraseña encriptada por el algoritmo de hash nativo de los sistemas Windows
MD4 (Message Digest 4), mientras que las contraseñas de los sistemas Linux usan el algoritmo MD5 (Message
Digest 5). La contraseña encriptada proporcionada por el cliente Windows no será, por tanto, la misma que la
que está almacenada en el archivo /etc/shadow del sistema Linux. Por consiguiente, la autentificación será
imposible, aunque la contraseña sin cifrar sea la misma.
Para que los clientes Windows se puedan autentificar en los sistemas Linux, hay que hacer que estos
sistemas alberguen una versión de la contraseña encriptada en MD4 además de la contraseña nativa
encriptada en MD5. Estas dos contraseñas se administrarán de forma independiente y podrán ser
incluso distintas.
c. Generación de contraseñas MD4
El comando específico smbpasswd permite crear una contraseña MD4 para una cuenta Linux existente. Esta
contraseña se almacenará aparte, generalmente en el archivo/etc/samba/smbpasswd.
smbpasswd -a nombre_cuenta
Se puede solicitar que se sincronicen las contraseñas samba con las contraseñas del sistema Linux. Atención,
tal y como se ha explicado anteriormente, las contraseñas se encriptan en ambos sistemas con algortimos de
hash distintos, que son por definición irreversibles. La sincronización sólo se puede realizar en el momento en
que la contraseña se introduce sin encriptar cuando se utiliza el comando smbpasswd. Es entonces cuando la
contraseña se encripta dos veces con los dos algoritmos diferentes y se modifican las dos bases de datos de
cuentas de usuario. Esta sincronización se activa mediante una directiva en el archivo [Link].
Se puede necesitar interrumpir el acceso de una cuenta de un usuario a los recursos compartidos del servidor
samba. El comando smbpasswd puede eliminar, desactivar o reactivar la cuenta samba,
independientemente de la cuenta Linux asociada.
smbpasswd -d nombre_cuenta
smbpasswd -e nombre_cuenta
smbpasswd -x nombre_cuenta
Donde nombre_cuenta representa la cuenta de usuario samba que se desea modificar. Cabe decir que las
operaciones en las cuentas samba no tienen efecto alguno en la cuenta Linux correspondiente.
4. El cliente Samba
El cliente Samba permite acceder a una compartición de una máquina Windows o Samba desde un cliente Linux.
Permite incluso a un cliente Linux conectarse a un servidor Samba Linux, pero el objetivo es más bien acceder a
datos de una compartición Windows desde una máquina Linux. Los dos comandos principales del cliente samba
son smbclient y smbmount.
Básicamente, se utiliza smbclient para obtener información de los recursos compartidos albergados por un
servidor SMB.
También
smbclient para mostrar comparticiones: parámetros
se puede
dirección_servidor La dirección IP del servidor del que se quiere mostrar los utilizar el
recursos.
comando smbclient de forma interactiva conectándose a un recurso compartido y accediendo a un shell que
permita realizar operaciones con los archivos.
Donde compartición representa el nombre de la compartición albergada por el servidor. Las múltiples
contrabarras son necesarias aunque generen una sintaxis un tanto curiosa. De hecho, se trata de una ruta
UNC (Uniform Naming Convention), utilizada para designar un recurso en los entornos Windows. Una ruta UNC
se compone del nombre del servidor, precedido de dos contrabarras, seguido de la ruta al recurso, separando
con una contrabarra cada nivel. Sin embargo, se da el caso que en los sistemas Linux la contrabarra es un
carácter reservado que indica que el shell no debe interpretar el carácter siguiente. Para escribir una
contrabarra de verdad, hay que anteponerle otra para indicarle al sistema que la segunda debe considerarse
como una contrabarra normal. Una alternativa más ligera consiste en cambiar las contrabarras por barras
normales. Ambas sintaxis están permitidas.
Una vez que este comando se ejecuta y después de haber introducido la contraseña del usuario, se entra en
el shell específico smbclient que permite realizar operaciones con los archivos. Los principales usos serán por
supuesto obtener o enviar archivos a la compartición. Se puede desplazar por la estructura de directorios con
el comando cd. Además, los dos comandos básicos son get para obtener archivos y put para enviar archivos a
la compartición.
El comando smbmount permite realizar el montaje de una compartición SMB en un directorio local tal y como
se puede hacer con un sistema de archivos local o una compartición NFS.
Existe
smbmount: opciones y parámetros
una
dirección_servidor Dirección IP del servidor que tiene la compartición a la que se
quiere acceder.
La opción -t smbfs provoca la llamada al subprograma smbmount para realizar el montaje, pero a partir de
una sintaxis casi estándar para realizar el montaje.
Para responder a las necesidades de apertura del protocolo, SMB se ha normalizado, ha evolucionado y se
ahora se denomina CIFS (Common Internet File System). La suite software Samba ahora designa a su cliente
y a los elementos software con este nombre. Como los hábitos resisten a morir, todavía persiste el uso del
nombre de SMB.
Según las versiones de Samba usadas, se puede utilizar smb, cifs o smb y cifs indiferentemente. La tendencia
es la desaparición de smb en beneficio de cifs.
Se puede verificar desde el lado servidor cuáles son los clientes que están conectados. El
comando smbstatus muestra las conexiones smb activas.
Compartición de archivos con FTP
1. El protocolo FTP
a. Historia
FTP (File Transfer Protocol) es un protocolo cliente/servidor bastante antiguo que fue uno de los primeros que
permitía compartir archivos entre ordenadores. Tiene un pasado glorioso y, por ejemplo, ya se usaba antes
de la creación del protocolo SMTP para transmitir mensajes electrónicos de un ordenador a otro.
Hoy en día, su edad y una cierta rigidez lo hacen menos apto para compartir archivos cómodamente. Sin
embargo, se sigue usando con asiduidad, especialmente por los servicios de alojamiento web que ofrecen a
sus clientes accesos FTP para actualizar sus páginas web.
b. Parámetros técnicos
El nivel de transporte de FTP es TCP y funciona por el puerto 21 para la transmisión de comandos. El puerto
20 es el que se usa tradicionalmente para transmitir datos, pero no es un comportamiento universal.
FTP soporta la autentificación de clientes, pero con un grado de seguridad débil que lo convierte en un
protocolo inadecuado para la transmisión de archivos sensibles. En efecto, FTP es conocido por transportar la
contraseña de sus clientes sin encriptar. Por estas razones, hoy en día FTP tiene un uso específico: el modo
anónimo. Los servidores FTP pueden reconocer una cuenta única anónima y autorizarle un acceso limitado,
generalmente en modo sólo lectura en algunos directorios. La cuenta tiene que llamarse
obligatoriamente anonymous, y el servidor puede solicitar una contraseña, sin importar el juego de
caracteres. La contraseña se guardará por motivos de trazabilidad aunque el cliente no tenga la obligación de
introducir una contraseña.
Tradicionalmente, los clientes FTP trabajaban en modo activo, donde la sesión se establecía en el puerto 21
del servidor y los datos se enviaban por iniciativa del servidor desde el puerto 20 a un puerto cualquiera del
cliente. Este modo de funcionamiento, que existe desde antes de la generalización de los cortafuegos, no
está exento de problemas, ya que es visto por el cortafuegos como una sesión abierta desde el servidor a un
puerto impredecible del cliente.
El modo pasivo apareció para corregir esta situación mediante el establecimiento de dos sesiones por el
cliente. El puerto utilizado para los datos es uno cualquiera que lo anuncia el servidor en modo comando y lo
utiliza el cliente para abrir la sesión de datos.
Son muchos los clientes FTP gráficos existentes y están disponibles para todas las plataformas. Se puede
citar filezilla, que es un producto open source muy popular en los sistemas Windows. La configuración y el uso
de clientes FTP gráficos varían según el producto y no presentan gran dificultad, su uso no se tratará en este
libro.
La mayoría de los sistemas incluyen un cliente FTP por línea de comandos. El modo de funcionamiento de
estos clientes puede hacerlos más incómodos para un uso frecuente pero son extremadamente prácticos
para comprobar la configuración de un servidor FTP.
La carga de estos clientes se realiza de la forma más sencilla mediante el comando ftp.
La ventaja principal del cliente FTP por línea de comandos es que permite realizar todas las operaciones
deseadas una a una y, por lo tanto, en caso de error ver dónde está el error. Por el contrario, los clientes
gráficos tienen tendencia a automatizar un gran número de operaciones. Para la conexión FTP con Internet
Explorer, por ejemplo, la conexión es anónima y se envía una contraseña estándar automáticamente.
open Abre una sesión FTP con el servidor al que se ha hará referencia. El cliente
solicitará de manera interactiva la dirección del servidor.
get Descarga un archivo del directorio remoto actual en el directorio local actual.
put Sube (envía) un archivo del directorio local actual al directorio remoto actual.
3. El servidor Pure-FTPd
Pure-FTPd es un servidor FTP cuyo objetivo es ofrecer un servicio de transferencia de archivos simple, estable y
eficaz. Su objetivo es ser apto tanto para principiantes como para entornos de producción en el lugar de
trabajo. Su característica principal es que puede ser iniciado fácilmente por línea de comandos sin necesitar un
archivo de configuración.
Este es el funcionamiento por defecto. Los usuarios dispondrán de una cuenta de usuario y un directorio
personal donde podrán acceder con su identificador y su contraseña habituales. Atención: generalmente se
desaconseja este modo de funcionamiento ya que la contraseña, circulando sin encriptar, supone un peligro
para las contraseñas Linux de los usuarios.
pure-ftpd
Se puede activar el acceso anónimo si se ha creado una cuenta de usuario llamada ftp en el servidor. Los
clientes conectados en modo anónimo trabajan entonces en el directorio /home/ftp.
c. Opciones de funcionamiento
Pure-ftpd funciona generalmente sin archivo de configuración. A la línea de comandos que inicia el servicio se
le pueden añadir opciones de configuración en función del resultado deseado. Sin embargo, algunas
implementaciones utilizan uno o varios archivos de configuración que el script de inicio del servicio
interpretará. La lista mostrada a continuación presenta algunas de las opciones más comunes.
4. El servidor vsftpd
vsftpd (very secure FTP daemon) es otro servidor FTP muy popular en los sistemas Linux. Necesita un servicio y
un archivo de configuración: [Link]. La certificación LPI requiere un conocimiento mínimo de vsftpd.
parámetro=valor
1. Preguntas
1 ¿Cómo acceden los clientes de línea de comandos a los datos de una compartición, ya sea del tipo NFS o
Samba?
2 ¿Se pueden compartir los directorios a los que hace referencia el archivo /etc/exports sin haber iniciado el
servicio NFS?
3 ¿Por qué la opción root_squash se aplica por defecto a una compartición NFS?
5 En una conexión a un servidor NFS no fiable, ¿qué opción sería la adecuada para asegurar a un cliente
NFS que las operaciones de escritura se realizan formalmente?
6 ¿Se puede comprobar la validez de un archivo de configuración Samba sin cargar el servicio?
7 ¿Cómo se impide a los usuarios que vean una compartición Samba en el Entorno de Red?
8 ¿Cómo se crea una contraseña a partir de la contraseña unix de una cuenta previamente existente en el
sistema?
9 ¿Se puede sincronizar las contraseñas Unix con las contraseñas Samba?
10 ¿Por qué el modo activo ha ido cayendo en desuso en beneficio del modo pasivo en los clientes FTP?
2. Respuestas
1 ¿Cómo acceden los clientes de línea de comandos a los datos de una compartición, ya sea del tipo NFS o
Samba?
Mediante una operación de montaje. El directorio compartido se monta en un directorio local. Cuidado: aunque
se use el comando universal mount, los elementos software cliente deben haberse instalado en el sistema
para que la operación de montaje tenga éxito.
2 ¿Se pueden compartir los directorios a los que hace referencia el archivo /etc/exports sin haber iniciado el
servicio NFS?
3 ¿Por qué la opción root_squash se aplica por defecto a una compartición NFS?
Porque el control de acceso a las comparticiones NFS se basa en el identificador (uid) de los clientes que se
conectan. La cuenta root tiene siempre el identificador 0 y la opción root_squash hace que sus privilegios
desaparezcan de manera que el usuario root no tenga plenos derechos en una compartición NFS. Sin embargo,
este comportamiento se puede modificar con la opción no_root_squash en la carga de la compartición.
NFS, de hecho, depende de tres procesos: portmapd, nfsd y mountd. El nombre del script de inicio del servicio
varía según la distribución (nfs para Red Hat, nfk-kernel-server para Debian).
5 En una conexión a un servidor NFS no fiable, ¿qué opción sería la adecuada para asegurar a un cliente
NFS que las operaciones de escritura se realizan formalmente?
La opción de montaje sync impide que se produzcan escrituras asíncronas. De este modo, el servidor prohíbe
que se use la caché en escritura. El cliente no será informado del éxito de una operación de escritura hasta
que ésta se haya producido físicamente.
6 ¿Se puede comprobar la validez de un archivo de configuración Samba sin cargar el servicio?
Sí, con el comando testparm. El comando testparm comprueba la validez del archivo de configuración y
muestra las comparticiones activas por la salida estándar. Cabe decir que los comandos por defecto no se
muestran a no ser que se invoque con la opción -v.
7 ¿Cómo se impide a los usuarios que vean una compartición Samba en el Entorno de Red?
8 ¿Cómo se crea una contraseña a partir de la contraseña Unix de una cuenta previamente existente en el
sistema?
No se puede. La contraseña de una cuenta Unix se encripta con el algoritmo de hash MD5, irreversible por
definición. Las contraseñas SMB tienen que encriptarse con el algoritmo MD4, no se puede crear esta
contraseña a partir de los datos encriptados presentes en el sistema.
9 ¿Se puede sincronizar las contraseñas Unix con las contraseñas Samba?
Sí, incluyendo la directiva "unix passwd sync = yes" en el archivo de configuración. Atención: los algoritmos de
hash son distintos, esta sincronización sólo se podrá realizar cuando la contraseña Samba se exprese sin
encriptar. Entonces se producen dos operaciones de encriptación: una en MD5 para la base de datos de
cuentas Unix y otra en MD4 para la base de datos de cuentas Samba.
10 ¿Por qué el modo activo ha ido cayendo en desuso en beneficio del modo pasivo en los clientes FTP?
Porque el modo activo utilizado tradicionalmente usa un número de puerto para los datos iniciado por el
servidor hacia el cliente y generalmente los cortafuegos ven esta acción como una amenaza. Con el modo
pasivo, el cliente inicia tanto las sesiones de comandos como las de datos, evitando que salten las alarmas de
los cortafuegos.
Trabajos prácticos
Comandos útiles
vi
testparm
Operaciones
1. Con el servicio recién instalado, mostrar los parámetros activos aplicados por el
servidor provenientes del archivo [Link].
2. Mostrar ahora los parámetros activos, pero esta vez incluyendo los parámetros
por defecto no mencionados de forma explícita en el archivo [Link].
Parámetros explícitos:
Todos
los
alfa:/etc/samba# testparm
Load smb config files from /etc/samba/[Link]
Processing section "[homes]"
Processing section "[printers]"
Processing section "[print$]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
[global]
server string = %h server
obey pam restrictions = Yes
passdb backend = tdbsam
pam password change = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n
*password\supdated\ssuccessfully* .
unix password sync = Yes
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = No
panic action = /usr/share/samba/panic-action %d
[homes]
comment = Home Directories
valid users = %S
create mask = 0700
directory mask = 0700
browseable = No
(...)
alfa:/etc/samba#
parámetros:
c.
Gestión
alfa:/etc/samba# testparm -v de las
Load smb config files from /etc/samba/[Link]
Processing section "[homes]"
Processing section "[printers]"
Processing section "[print$]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
[global]
dos charset = CP850
unix charset = UTF-8
display charset = LOCALE
workgroup = WORKGROUP
realm =
netbios name = ALPHA
netbios aliases =
netbios scope =
server string = %h server
interfaces =
bind interfaces only = No
config backend = file
security = USER
auth methods =
encrypt passwords = Yes
update encrypted = No
client schannel = Auto
(... ¡375 líneas en total!)
alfa:/etc/samba#
contraseñas
Comandos útiles
smbpasswd
Operaciones
d.
Acceso
alfa:/etc/samba# smbpasswd -a usuario de los
New SMB password:
Retype new SMB password:
alfa:/etc/samba#
Todos los usuarios que disponen de una máquina Windows están ausentes. Usted decide realizar las primeras
pruebas funcionales desde la estación de trabajo Ubuntu. Para ello, utilizará el cliente gráfico de la estación de
trabajo.
Comandos útiles
Operaciones
e.
1. Abra una sesión en la estación de trabajo.
Creación
2. En el menú Lugares, haga clic en Conectar con el servidor. de una
compartición común
chmod
mkdir
[Link]
testparm
vi
Operaciones
2. Hacer que todos los usuarios puedan leer y escribir en este directorio.
5. Hacer que esta compartición sea visible cuando se navegue por la red (del tipo
Entorno de Red de Windows).
Sección
de la
alfa:/home/usuario# mkdir /public
alfa:/home/usuario# chmod o+rwx /public/
alfa:/home/usuario#
compartición en [Link]:
Comprobación de la sintaxis:
Reinicio
[public] del
path = /public
writeable = yes
browseable = yes
directory mask = 0777
alfa:/public# testparm
Load smb config files from /etc/samba/[Link]
Processing section "[homes]"
Processing section "[public]"
Processing section "[printers]"
Processing section "[print$]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
servicio:
f.
Acceso
alfa:/home/usuario# /etc/init.d/samba reload de los
alfa:/home/usuario#
Comandos útiles
Operaciones
8. El directorio public tiene que estar ahora visible. Observe que el directorio personal
no aparece, ya que se ha configurado como no visible (Browseable = No).
b. Configuración de la compartición
Comandos y archivos útiles
/etc/exports
exportfs
mkdir
vi
Operaciones
Archivo
/etc/exports:
/virtu *(rw,no_root_squash)
Despliegue de la compartición:
c.
Comandos útiles
mkdir
mount
Operaciones
Montaje de la compartición:
3.
usuario@estacion:/mnt$ sudo mount -t nfs [Link]:/virtu virtu
usuario@estacion:/mnt$ ls virtu
dos tres uno
usuario@estacion:/mnt$
Comandos útiles
adduser
chmod
passwd
pure-ftpd
Operaciones
1. Añadir una cuenta de usuario ftp.
Bloqueo de la cuenta:
Limitación de permisos:
Inicio
del
alfa:/# chmod u=wx,go= /home/ftp
alfa:/# ls -ld /home/ftp
d-wx------ 2 ftp ftp 4096 jul 19 00:43 /home/ftp
alfa:/#
servicio:
c.
alfa:/#pure-ftpd --anonymous_only
Comandos útiles
ftp
vi
Operaciones
1. Crear un archivo de texto con el método que se desee.
Prueba
de
usuario@estacion:~$ ftp lectura
ftp> open [Link] del
Connected to [Link].
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 14:12. Server port: 21.
220-Only anonymous FTP is allowed here
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name ([Link]:toto): anonymous
230 Anonymous user logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Envío
del
ftp> ls archivo
200 PORT command successful al
150 Connecting to port 49524
226-Sorry, we were unable to read [.]
226-Options: -l
226 0 matches total
ftp>
servidor:
1. Requisitos
Los conocimientos adquiridos en la certificación LPI nivel 1, especialmente:
2. Objetivos
Al final de este capítulo, será capaz de:
Mientras la cantidad de máquinas públicas en Internet era pequeña, todas las resoluciones se realizaban
mediante un archivo llamado hosts que se descargaba a intervalos regulares para tener actualizadas las
últimas novedades.
El DNS se creó como solución a los límites del archivo hosts descargado y tenía que cumplir con ciertos
requisitos de diseño.
El DNS es dinámico
Los registros se tienen que poder añadir de una forma única al sistema y estar rápidamente disponible para
todos.
El DNS se replica
No se puede permitir depender de un solo servidor. Hay que disponer de la información existente siempre en
varias copias.
Los datos se clasifican en una estructura de árbol que permite su organización. Cada nivel de la jerarquía se
llama "zona" y la cima de esta jerarquía es la zona ".".
Los datos se reparten en una multitud de "subbases de datos" (las zonas DNS) y el conjunto de estas
pequeñas bases de datos compone la totalidad de los registros DNS. Este funcionamiento tiene como ventaja
la fácil administración repartiendo la carga en miles de servidores.
El DNS es seguro
Esta máxima apareció más tarde y no está todavía implementada en todos los servidores DNS. Sin embargo,
ahora se pueden asegurar de extremo a extremo las operaciones DNS. Los servicios de seguridad disponibles
son la autentificación, el control de acceso y el control de integridad.
Se ha creado de forma arbitraria una zona llamada "." (punto), que es la raíz de la jerarquía y que contiene
todos los tld (top level domain, dominio de nivel superior). Los tld son las archiconocidas extensiones tales
como com, es, net, fr, etc. Todos los dominios que conocemos y utilizamos son subárboles de los tld.
En el ejemplo mostrado previamente, la zona google contiene las subzonas maps, reader y labs. Asimismo,
también se puede decir que la zona "." contiene las subzonas es, com y fr. Las zonas situadas jerárquicamente
por debajo de una zona se llaman zonas "hijo".
El interés de este tipo de organización es dedicar un servidor (de hecho por lo menos dos, por motivos de
tolerancia a fallos) a la gestión de una zona. Como la jerarquía DNS es virtualmente ilimitada, tanto en anchura
como en profundidad, un servidor DNS sólo gestiona una pequeña porción del espacio de nombres. Según
nuestro ejemplo, si un servidor DNS alberga los datos de la zona google, a él irán dirigidas todas las consultas
para la resolución de nombres acabados en "[Link]". Sin embargo, no es necesario que albergue los datos
de las zonas maps, reader y labs, debido a que le basta con redirigir la petición al servidor de la zona hijo. Se
habla entonces dedelegación en el sentido que se delega la gestión de una zona hijo a otro servidor.
Por razones de tolerancia a fallos, los datos de cada zona DNS se deben replicar por lo menos una vez, es
decir, tienen que existir al menos dos copias. Un servidor tendrá autoridad en la zona y será responsable de
las actualizaciones. Se dice que es el SOA (Start Of Authority). Las zonas que alberga este servidor son de
tipo master y los que albergan una réplica de la zona se configuran como slave.
Si el servidor al que se le ha preguntado tiene localmente la información, responde directamente. Se dice que
hace una respuesta authoritative (autoritaria).
Si le servidor al que se le ha preguntado no tiene la información, consultará la única zona que conoce, la zona
".", que le proporcionará la dirección de uno de los 13 servidores raíz de Internet. El servidor preguntará
entonces a este servidor raíz para conocer la dirección de un servidor de la zona del tld. A este nuevo servidor
se le preguntará por la dirección de un servidor de nombres que gestione la zona directamente por debajo del
tld. Finalmente, a este siguiente servidor se le interrogará para saber si dispone del registro deseado en este
dominio.
Esquema simplificado de la resolución de nombres:
4. Registros
Las zonas sólo tienen una función estructural, para proporcionar la resolución de nombres habrá que crear
registros que harán corresponder un nombre a una dirección IP o a otro dato. Estos registros se
llaman Resource Records (registros de recursos), a menudo escritos como RR, y constituyen la
información fundamental de un DNS.
El FQDN (Fully Qualified Domain Name, nombre de dominio completamente cualificado) representa el nombre del
host, con todo su árbol jerárquico, hasta la zona ".". Por ejemplo,[Link] representa el
registro www en la zona [Link], siendo es la última zona antes de la zona punto. Cuando se quiere
escribir un nombre sin ningún tipo de ambigüedad en su interpretación como nombre DNS, se utiliza
el FQDN con la zona punto presente, es decir, que se escribe un punto como último carácter del FQDN. Por lo
tanto, se obtiene [Link] notación es común e indispensable en los archivos de
configuración DNS.
El objetivo primordial del sistema DNS es proporcionar un servicio de resolución de nombres. Es decir, crear la
correspondencia entre un nombre de host y una dirección IP. Sin embargo, sus creadores previeron que el
sistema DNS sería capaz de proporcionar la resolución para otros tipos de nombres mejorando, de este modo,
la finura del servicio.
a. Registros de tipo A
El más fácil de aprender y el más común. Es el registro que hace corresponder una dirección IP a un nombre.
Por ejemplo, cuando se teclea [Link] www es un registro de tipo A en la zona
[Link]. Corresponde a una dirección IP que es la del servidor web que alberga el sitio en cuestión.
www → [Link]
soporte → [Link]
vpn → [Link]
Reciente pero cada vez más usado. Este registro hace corresponder una dirección IPv6 a un nombre.
www → [Link]
suporte → [Link]
Pointer, justamente lo contrario de A. Si los registros de tipo A hacer corresponder una dirección IP a un
nombre de host, los PTR hacen justo lo contrario. Existen en zonas un poco particulares llamadas IN-
[Link].
El nombre estándar de la zona estará formado por los bytes de la parte de red de la dirección IP ordenados
en sentido inverso, seguidos de la cadena de caracteres ".[Link]".
Canonical Name (alias o sobrenombre). Este tipo de registros hace corresponder un nombre a un nombre.
Por ejemplo, si crea un servidor web para uso interno de su empresa en un servidor existente que se llamaría
"[Link]", puede crear el CNAME "intranet" que es más intuitivo para los usuarios.
intranet → produccion1
impresora1 → printer1
e. Registros de tipo MX
Mail Exchanger (indicador de servidor de mensajería para un dominio). Este tipo de registros hace que los
agentes de transferencia de correo sepan cuál es el servidor destinatario final de un correo. El
ejemplo mostrado a continuación tiene fines ilustrativos y no presenta el formato de un registro MX.
Resolución en la zona [Link]
Start Of Authority (inicio de autoridad). Indica que el servidor tiene la responsabilidad de la zona. Toda zona
en funcionamiento tiene un registro SOA.
[Link] → [Link]
g. Registro de tipo NS
Name Server (servidor de nombres). Indica los servidores de nombres para la zona. Toda zona en
funcionamiento tiene por lo menos un registro NS.
[Link] → [Link]
5. DNS en Linux
a. El servidor DNS
Los servicios DNS que se ejecutan en Linux se basan, casi con total exclusividad, en el
softwareBIND (Berkeley Internet Name Domain). Como su nombre indica, se creó en la universidad de
Berkeley en California. Los primeros desarrollos tienen fecha de los años 80 y su mantenimiento lo realiza
actualmente el ISC (Internet System Consortium), una asociación no lucrativa que gestiona un cierto número
de programas estructurales de Internet y de redes locales.
Aunque existen alternativas al uso de BIND para la resolución de nombres en Linux (maradns y djbdns por
ejemplo), solamente se exige el conocimiento de BIND en la certificación LPI.
b. El cliente DNS
Las máquinas Linux disponen de forma nativa de un cliente DNS llamado resolver. Toda aplicación que esté
funcionando en Linux y necesite realizar una petición DNS utilizará este componente.
Este componente usa el archivo de configuración /etc/[Link], que tiene una estructura muy sencilla.
search dominio
domain dominio
nameserver A.B.C.D
A continuación se muestra un ejemplo genérico del archivo [Link]. Según el caso, se puede
encontrar en una forma completa y monolítica, pero es frecuente encontrarlo disperso en varias partes por
razones de legibilidad. Los subarchivos se llaman mediante la directiva include. La función principal de este
archivo es declarar las zonas que administrará este servidor y especificar todos los elementos de
configuración.
include "/ruta/archivo";
options {
directory "/ruta/directoriodetrabajo";
forwarders { A.B.C.D };
};
zone "NOMBREDEZONA1" {
type tipo;
file "/RUTA/NOMBREARCHIVO1";
};
zone "NOMBREDEZONA2" {
type tipo;
file "/RUTA/NOMBREARCHIVO2";
};
Según la implementación, algunas zonas se proporcionan por defecto en la instalación del servidor para
habilitar un funcionamiento estándar y permitir las resoluciones de nombre comunes. Por ejemplo, la zona
localhost que permite resolver el nombre localhost a [Link] incluida en el interior del servicio DNS y no sólo
en el archivo hosts.
Estos archivos de zona se crean durante la instalación y se les hace referencia en el [Link].
Ejemplo de archivo [Link] en una distribución Debian:
Observe que se incluye la declaración de las zonas por defecto así como la llamada a dos subarchivos de
configuración llamados mediante la directiva include.
Observe
que las
include "/etc/bind/[Link]";
zone "." {
type hint;
file "/etc/bind/[Link]";
};
zone "localhost" {
type master;
file "/etc/bind/[Link]";
};
zone "[Link]" {
type master;
file "/etc/bind/db.127";
};
zone "[Link]" {
type master;
file "/etc/bind/db.0";
};
zone "[Link]" {
type master;
file "/etc/bind/db.255";
};
include "/etc/bind/[Link]";
directivas include devuelven dos archivos vacíos en la instalación (sólo contienen comentarios). El resto de la
configuración finaliza con la declaración de las zonas, de las cuales la única realmente requerida para la
resolución de nombres públicos es la zona ".", que está escrita en primer lugar.
2. Servidor de caché
Un servidor DNS de caché proporciona también la resolución de nombres, pero no contiene ningún dato de
resolución local y requiere una infraestructura ya existente. Se limita a reenviar las peticiones a otros
servidores. De este modo, el servidor pondrá en caché durante un tiempo determinado todas las resoluciones
que ha reenviado.
Por definición, un servidor de caché no dispone localmente de zonas DNS personalizadas. Es decir, que no
proporcionará por sí mismo ninguna resolución de tipo "¿Qué dirección IP le corresponde al nombre
[Link]?": No guarda este tipo de información y deberá responder a las peticiones dirigiéndose a
otros servidores mejor informados.
Ésta es la buena noticia: un servidor BIND recién instalado es de forma natural un servidor de caché. Por lo
tanto no hay que realizar ningún tipo de configuración particular. Cuando se habla de instalar y configurar un
servidor de caché como uno de los objetivos de la certificación LPI, se trata simplemente de instalar un
servidor en funcionamiento sin información de zona local.
b. Redirección
Como ya se ha dicho, un servidor de caché no alberga de forma local registros de recursos. Si tiene que hacer
una resolución, se dirigirá a los únicos servidores que conoce, que son los servidores raíz. Este método de
resolución obviamente no es el más rápido y se podría desear aprovechar la caché de servidores ya en
funcionamiento, como los de un servicio de hospedaje o de un ISP. Para ello, hay que indicar a nuestro
servidor la dirección de otros servidores a los que podrá redirigir sus peticiones. Este tipo de redirección se
llama incondicional, ya que se redirigen todas las resoluciones no pesadas.
options {
forwarders {
A.B.C.D;
};
};
No es obligatorio usar rndc en la administración del día a día. Pero entonces cualquier modificación realizada en
el archivo de configuración requerirá el reinicio completo del servicio y, por tanto, su interrumpción temporal. De
este modo, rndc debería usarse sistemáticamente, sobre todo si el servidor gestiona una gran cantidad de
zonas, como el caso de un alojamiento web, por ejemplo.
Sintaxis
flush zona Borra la caché del servidor para una zona específica.
Este archivo tiene un formato muy estricto que se muestra a continuación. En la mayoría de los casos, un
fracaso en el inicio se debe a un archivo de zona mal formado. Se compone de las declaraciones de tiempo de
vida en caché de los datos, de los servidores de nombres de esta zona y del conjunto de registros de
recursos (RR) de esta zona.
$TTL ttl
nombrezona IN SOA servidor mailadmin (
serial
refresh
retry
expire
negative )
nombrezona IN NS servidor
IN Obsoleto a la vez que actual: clase Internet (no hay otra clase que se
pueda usar).
SOA Start Of Authority. Registro obligatorio para indicar que este servidor es
legítimo en esta zona.
serial Valor numérico. Número de serie del archivo. Útil cuando la zona se
replica en otros servidores para saber si los datos han cambiado y si
debe hacerse la réplica.
El archivo de zona inversa tendrá la misma estructura que un archivo de zona directa. Como se ha
indicado anteriormente, el nombre normalizado de la zona se forma con los bytes de la IP de partida
ordenados en sentido inverso seguidos de la cadena de caracteres ".[Link]". Por ejemplo, la zona
inversa para la red [Link] será: [Link] y éste es el nombre que deberá usarse en
el archivo de zona y en el archivo [Link].
$TTL ttl
nombrezonainv IN SOA servidor mailadmin (
serial
refresh
retry
expire
negative )
nombrezonainv IN NS servidor
Como se
Archivo de zona inversa: formato típico de la cabecera
puede
nombrezonainv Nombre normalizado de la zona inversa: subred_invertida.in-
[Link]. Donde subred_invertida representa los bytes de la
subred en orden inverso. Atención: el nombre de la zona inversa
es un FQDN, por lo tanto tiene que terminar con un punto.
comprobar es exactamente lo mismo que para la zona directa. Es el formato de los registros los que marcan
las diferencias.
Una vez que los archivos de zona se han creado, basta con añadir tantos registros de recursos como se
desee, a razón de uno por línea.
Evidentemente, añadir un gran número de registros es una tarea tediosa. Es mucho mejor hacerlo
mediante un script.
Los alojamientos y otros DNS que gestionan un gran número de registros utilizan de forma natural scripts más
elaborados.
#!/bin/bash
echo "¿Nombre que se añadirá a la zona?"
read nombre
echo "¿Dirección IP correspondiente?"
read ip
echo "$nombre IN A $ip" >> /var/named/[Link]
Una vez que se dispone de un archivo de zona, hay que darlo a conocer al servidor que debe cargarlo en el
arranque. Esto se realiza mediante una declaración normalizada en el [Link].
zone "nombrezona" {
type master;
file "archivo";
};
type Determina que se trata de una zona maestra que se debe sincronizar
master con posibles servidores esclavos.
archivo Ruta absoluta del archivo que se debe leer para conocer todos los
elementos propios de la zona (configuración, RR, etc.).
A continuación hay que hacer que el servidor recargue los archivos de configuración para que tenga en cuenta
los cambios realizados. Para ello, tenemos dos alternativas: el reinicio del servicio o la carga de la nueva
configuración mediante el comando de control rndc.
/etc/init.d/bind9 restart
Evidentemente no es necesario crear los archivos de zona, ya que se sincronizarán desde el servidor
autoritario. Se habla comúnmente de servidor maestro y servidores esclavos.
zone "nombrezona" {
type slave;
masters { dirección_maestro; };
file "archivo";
};
type slave Determina que se trata de una zona esclava que se tendrá que
sincronizar desde un servidor maestro.
A continuación hay que hacer que el servidor recargue los archivos de configuración para que tenga en cuenta
los cambios realizados. Para ello, tenemos dos alternativas: el reinicio del servicio o la carga de la nueva
configuración mediante el comando de control rndc.
/etc/init.d/bind9 restart
3. Delegación de zona
Una delegación de zona consiste en hacer que un servidor de terceros gestione una zona hija albergada por
un servidor padre. Es el principio de la delegación el que permite distribuir el conjunto de espacio de nombres
DNS en miles de servidores. La delegación se configura en el servidor padre.
Para ello se añaden dos Resource Records en el archivo de zona del padre: uno de tipo NS para indicar que
existe un servidor de nombres para la zona hija y otro de tipo A para saber la dirección IP de este servidor de
nombres. El registro NS que proporciona la delegación se llama glue record(registro de pegado).
zona_hija IN NS dns_hijo
dns_hijo IN A A.B.C.D
Elementos
4. Herramientas de comprobación
a. ping
Aunque no es su función principal, ping se puede usar como prueba rudimentaria para la resolución de
nombres. Entonces se limitará a comprobar la respuesta de los servidores por defecto, que se
informan en /etc/[Link].
Cuando se utiliza ping para comprobar la resolución de nombres, es la traducción de la dirección lo que importa, no
la respuesta ICMP de la máquina remota.
b. nslookup
nslookup es la herramienta más popular de consulta a servidores DNS. Está disponible en la gran mayoría de
plataformas Unix y Windows.
nslookup se utiliza en la mayoría de las veces en modo interactivo. Es decir, después de haber
teclado nslookup se accede a su interfaz donde se introducen comandos específicos. Los servidores de
nombres consultados por defecto son aquellos que se hace referencia en/etc/[Link]. Esto puede
cambiar si así se desea a través de esta herramienta.
donald:/etc/bind# nslookup
> server
Default server: [Link]
Address: [Link]#53
> [Link]
Server: [Link]
Address: [Link]#53
Utilización
Peticiones y parámetros en la interfaz interactiva de nslookup de
nombre Teclear un nombre DNS directamente en la interfaz de nslookup nslookup
equivale a solicitar su resolución. nslookup indica entonces a qué para
servidor DNS ha consultado y la respuesta que le ha dado. Se encontrar
puede tratar de un nombre completo (FQDN) o de uno simple si se la
basa en un sufijo de búsqueda definido en /etc/[Link]. dirección
de un
server A.B.C.D El comando server seguido de la dirección IP de un servidor indica servidor
a nslookup que todas las futuras consultas se deberán dirigir a de correo
este servidor.
nslookup
set type=TIPO Por defecto, nslookup realiza consultas de tipo A (resolución normal se puede
de nombres en direcciones IPv4). El comando set type permite usar para
realizar consultas de otro tipo. Se usa comúnmente para saber, por todo tipo
ejemplo, los servidores de nombres o de correo asociados a una de
zona. registros
comunes
(en este caso MX).
donald:/etc/bind# nslookup
> set type=MX
> [Link]
Server: [Link]
Address: [Link]#53
Non-authoritative answer:
[Link] mail exchanger = [Link]
c. dig
dig es la nueva herramienta propuesta por el ISC para la consulta y el diagnóstico de servidores DNS.
Llegando a ser la más precisa y exitosa de las herramientas de test, con el tiempo acabará siendo la solución
de referencia. Sin embargo, el hábito de los administradores de DNS todavía sugiere un brillante futuro para
nslookup.
dig se utiliza en modo no interactivo, es decir, cada vez que se usa dig se le debe proporcionar los
parámetros necesarios para la resolución.
dig nombre
dig A.B.C.D nombre TIPO
Ejemplo
Elementos
de
nombre El nombre completo (FQDN) del que se quiere obtener la resolución. utilización
de dig
A.B.C.D La dirección IP del servidor DNS al que se consultará. En caso de omisión,
se consultarán los servidores a los que se hace referencia en Con
/etc/[Link]. diferencia
se trata
TIPO Por defecto, dig realiza consultas de tipo A (resolución normal de del
nombres con direcciones IPv4). Si se usa el parámetro TIPO, permite comando
definir otros tipos de búsqueda con el objetivo de saber, por ejemplo, los más
servidores de nombres o de correo asociados a una zona. preciso de
diagnóstico DNS.
;; QUESTION SECTION:
;[Link]. IN A
;; ANSWER SECTION:
[Link]. 86400 IN CNAME [Link].
[Link]. 86400 IN A [Link]
;; AUTHORITY SECTION:
[Link]. 86400 IN NS [Link].
d. host
host es una sencilla herramienta para realizar peticiones DNS en modo no interactivo.
host nombre
Utilización
Elementos
de host
nombre El nombre DNS del que se desea realizar la resolución. Se puede tratar para
de un FQDN o de un nombre simple que se completará con el sufijo de
búsqueda si se ha definido en /etc/[Link].
donald:/etc/bind#
donald:/etc/bind#
e. Medición de rendimiento
El comando time, que mide el tiempo consumido por una aplicación, permite medir el rendimiento de una
resolución DNS. Indica el tiempo total consumido por el comando y el tiempo consumido por los procesos en el
espacio de ejecución del sistema y en el del usuario.
Los tiempos medidos dependen del ancho de banda disponible, de la disponibilidad del servidor y de la rapidez de la
máquina cliente.
real 0m0.256s
user 0m0.000s
sys 0m0.010s
usuario@servidor:~$
Seguridad en el servicio DNS
allow-query { redes_autorizadas; };
Donde redes_autorizadas representa la o las direcciones de red o de equipo que pueden dirigirse al servidor.
En los orígenes, era frecuente ejecutar un servidor bind con la cuenta de administración root. Es decir, la
cuenta root era propietaria del proceso. Las consecuencias podían llegar a ser desastrosas: si el
ejecutable named enviaba código sensible (peligroso) al procesador, lo hacía en nombre de root, es decir con
privilegios absolutos en el sistema. Esta situación presenta una serie de riesgos. Pueden ser errores en el
código ejecutable de named o bien vulnerabilidades del programa que permitirían a un atacante enviar código
ejecutable al procesador.
La solución es, en general, ejecutar named con unas credenciales distintas a las de root, utilizando una
cuenta de servicio: una cuenta de usuario que no permita la conexión directa al sistema, pero que será
propietaria del proceso. De este modo, si se ejecuta código malicioso proveniente del proceso named, no
tendrá más privilegios que los de la cuenta de servicio y, por tanto, no pondrá en peligro el sistema.
La mayoría de las implementaciones modernas de bind usan de forma nativa una cuenta de servicio.
Como ya se ha dicho, todas las implementaciones de bind utilizadas en las distribuciones modernas de Linux
usan de forma nativa una cuenta de servicio. A continuación se muestra cómo se incluye esta forma de
ejecución en los scripts de inicio del servicio.
Sintaxis simplificada del comando named para su uso con una cuenta de servicio
named -u usuario
Elementos
usuario Llamado con el parámetro -u, indica la cuenta de servicio propietaria del
proceso. Por supuesto, esta cuenta tiene que haberse definido en el
archivo /etc/passwd.
Se ha visto anteriormente que un uso malintencionado del proceso named podía entrañar el riesgo de
ejecución de acciones peligrosas para el sistema. El enjaulamiento del proceso en un directorio dedicado
permite limitar los riesgos. El objetivo es hacer creer al proceso que se está ejecutando en un sistema normal,
mientras que realmente está enclaustrado en una estructura de directorios paralela y en ningún caso puede
interactuar con el resto del sistema. El término "enjaulamiento" no ha sido usurpado, en inglés también se
habla de poner "in jail", es decir, en prisión.
Entonces se dice que se está utilizando bind en modo chroot, contracción de change root (cambio de raíz).
Se recomienda utilizar el modo chroot con una cuenta de servicio. Un proceso que tuviera los privilegios
de root podría obtener el modo de salir del directorio donde ha sido enjaulado.
En la media en que se engaña al proceso y éste cree que se ejecuta en un entorno normal, debe tener a su
disposición todos los elementos necesarios para su funcionamiento. Hay que entender que el proceso no
tendrá ningún modo de ir a buscar cualquier tipo de dato fuera de su directorio. La puesta en marcha de
un bind en modo chroot requiere, por tanto, una fase preliminar de creación de su entorno de trabajo.
Es
Elementos usados en la sintaxis:
usuario La cuenta de servicio propietaria del proceso. Por supuesto, esta cuenta
tiene que definirse en el archivo /etc/passwd.
recomendable comprobar en los registros que el proceso consigue iniciarse correctamente en su nuevo
entorno. En general, se requieren algunos intentos.
En este caso se usará el mecanismo TSIG (Transaction SIGnature, firma de transacciones). Este mecanismo se
basa en el uso de una clave compartida entre los servidores que intercambian datos.
Existe una herramienta de generación de claves: dnssec-keygen. Tiene muchos posibles usos, pero el que se
muestra a continuación es su uso para TSIG.
El
dnssec-keygen: variables y parámetros
comando
-a HMAC-MD5 -a define el algoritmo de encriptación. HMAC-MD5 es el único finaliza
valor soportado para TSIG. con la
En los servidores afectados por esta medida de seguridad, se incluirá en el archivo [Link] la
definición de la clave.
key nombreclave {
algorithm hmac-md5;
secret "yItYGlAQtGcM7VqGjZdJAg==";
};
La clave compartida se declara en ambos servidores. Ahora hay que hacer que sepan que tienen que utilizarla
para garantizar la seguridad de ciertas comunicaciones. Por lo tanto, habrá que añadir un nuevo comando
en [Link].
server ip_dest {
keys { nombreclave; };
};
El párrafo anterior ha dado a los servidores la capacidad de comunicarse de forma segura. A continuación hay
que hacer que esta medida de seguridad sea obligatoria para todas las peticiones entre servidores, por
ejemplo en el contexto de una delegación.
Sintaxis
zone "[Link]" {
type master;
file "[Link]";
allow-recursion { key supersecret; };
};
Comprobación de los conocimientos adquiridos:
preguntas/respuestas
Ponga a prueba sus conocimientos respondiendo a las preguntas siguientes. Estas preguntas no siempre
esperan una respuesta cerrada. Las preguntas planteadas en la certificación, a pesar de que abordan los
mismos temas, en su mayoría serán planteadas en forma de preguntas de opción múltiple o que requieran una
respuesta corta, en palabras escritas en el teclado.
1. Preguntas
1 ¿Por qué existen varios tipos de registros DNS?
3 ¿En qué aspecto un servidor de caché mejora el funcionamiento global de una red?
6 ¿Cómo un servidor DNS local dentro de una empresa puede aprovechar la caché de un servidor más
solicitado como el de su proveedor de servicios de Internet por ejemplo?
7 ¿Qué se puede hacer para que un servidor DNS actualice su configuración teniendo en cuenta nuevos
elementos, como por ejemplo nuevos registros, sin tener que recurrir a un reinicio total del servicio?
8 De entre todos los comandos de comprobación de resolución DNS, ¿cuál proporciona los resultados más
precisos y detallados?
9 ¿Cómo se puede proteger de una vulnerabilidad de código ejecutable DNS cuando se teme que se
produzca una intrusión o un daño mediante el uso de esta vulnerabilidad?
10 En el contexto de una delegación, ¿por qué es indispensable tener disponibilidad de comunicación entre
el servidor que delega y el servidor delegado?
2. Respuestas
1 ¿Por qué existen varios tipos de registros DNS?
Para almacenar información de distinto tipo. De este modo, un cliente puede solicitar a su servidor DNS
información precisa. Por ejemplo: ¿Cuál es el servidor maestro para esta zona? ¿Cuáles son los servidores DNS
disponibles para esta zona?
Los registros MX hacen referencia a los servicios de mensajería en un dominio DNS. Un servidor de mensajería
que esté funcionando puede que no reciba ningún mensaje del exterior si a su registro MX no se le hace
referencia correctamente.
3 ¿En qué aspecto un servidor de caché mejora el funcionamiento global de una red?
Conservando en memoria las resoluciones ya realizadas, el servidor responde mucho más rápidamente en las
siguientes peticiones. En la medida en que en una red normal la mayoría de las peticiones se realizan sobre los
mismos registros comunes (google, hotmail, ebay, etc.), todos los clientes obtienen una respuesta inmediata
sin que el servidor tenga que volver a realizar una resolución pública.
El resolver forma parte de la pila IP en todas las distribuciones Linux y, por lo tanto, no hay que instalarlo.
Por supuesto. Esta directiva permite llamar a archivos que contengan elementos de configuración anexa e
integrarlos en la configuración del servidor. Sin embargo, si se decide ubicar todos los elementos de
configuración en un solo archivo [Link], aunque no genere problemas, se obtendrá un archivo de
configuración un poco largo.
6 ¿Cómo un servidor DNS local dentro de una empresa puede aprovechar la caché de un servidor más
solicitado como el de su proveedor de servicios de Internet por ejemplo?
Declarando una redirección hacia él (directiva forwarders). El servidor resolverá entonces todos los
registros que pertenezcan a zonas locales y se dirigirá al servidor de su proveedor de servicios de Internet para
cualquier otra resolución.
7 ¿Qué se puede hacer para que un servidor DNS actualice su configuración teniendo en cuenta nuevos
elementos, como por ejemplo nuevos registros, sin tener que recurrir a un reinicio total del servicio?
Gracias al comando de control rndc, que permite precisamente tener en cuenta los cambios en la
configuración o en los datos albergados en una sola zona evitanto, por tanto, la recarga completa del servicio
que requeriría muchos más recursos.
8 De entre todos los comandos de comprobación de resolución DNS, ¿cuál proporciona los resultados más
precisos y detallados?
El comando dig, considerado el buque insignia de las herramientas de diagnóstico DNS. Mientras que algunas
distribuciones tienen a dig como la herramienta universal destinada a reemplazar con ciertas ventajas a las
demás, la mayoría de los usuarios siguen prefiriendo hoy en día el comando nslookup.
9 ¿Cómo se puede proteger de una vulnerabilidad de código ejecutable DNS cuando se teme que se
produzca una intrusión o un daño mediante el uso de esta vulnerabilidad?
Mediante dos técnicas que se usan a menudo conjuntamente. Para empezar, enjaulando el proceso named en
un entorno de ejecución impermeable. Se dice que se mete el proceso en prisión (in jail) mediante un cambio
de raíz (chroot). La prisión en cuestión es una estructura de directorios que contiene una copia de todos los
elementos que necesitará el proceso para funcionar, por ejemplo librerías o archivos de configuración. Además,
se ejecuta el proceso con una cuenta de servicio con privilegios limitados, por lo que el uso de una posible
vulnerabilidad no daría al atacante más permisos que los de la cuenta en cuestión.
10 En el contexto de una delegación, ¿por qué es indispensable tener disponibilidad de comunicación entre
el servidor que delega y el servidor delegado?
El principio de una delegación es externalizar la administración de una zona hija usando otro servidor. Todas
las peticiones que se hagan al servidor padre para la zona hija se dirigirán dinámicamente al servidor de la zona
hija. Si no hay comunicación, esta redirección es simplemente imposible.
Trabajos prácticos
b. Verificación
Comandos útiles
pgrep
ps
rndc
Operaciones
c.
/etc/[Link]
vi
Operaciones
1. Comprobar la configuración del servidor alfa para que se consulte a sí mismo para
todas las peticiones DNS.
Archivos modificados
Archivo
nameserver [Link]
2.
nameserver [Link]
Comandos útiles
ping
Operaciones
Cabe
recordar que cuando se comprueba una resolución con el comando ping, es la primera línea la que interesa, la
que traduce el nombre en dirección IP y no la posible respuesta de ping, que se puede filtrar.
Comandos útiles
ping
Operaciones
1. Justo después de una resolución con éxito, hacer que el servidor no pueda salir de
la red desconectando el router de su switch, por ejemplo.
Ping
con un
alfa:~# ping [Link] valor
PING [Link] ([Link]) 56(84) bytes of data. nuevo:
alfa:~#
c.
Redirección
Ahora dispone de un servidor capaz de hacer resoluciones de nombres. Para que su servidor pueda beneficiarse
de la caché del servidor de su proveedor de acceso, declare una redirección.
[Link] ([Link])
vi
Operaciones
2. Descomentar la línea de forwarders suprimiendo la doble barra así como las dos
líneas inmediatamente siguientes.
Archivo /etc/bind/[Link]:
Reinicio
del
options {
directory "/var/cache/bind";
forwarders {
[Link];
};
servicio:
3.
alfa:/etc/bind# /etc/init.d/bind9 restart
Stopping domain name service...: bind9.
Starting domain name service...: bind9.
alfa:/etc/bind#
Decide crear los archivos para la zona directa [Link] y para la zona inversa [Link]. Estos
archivos deberán declarar alfa como servidor maestro para estas zonas. La dirección de email del contacto
administrativo es root@[Link].
archivos de zona
vi
Operaciones
2. En ambos archivos, crear el registro SOA con alfa como servidor autoritario. Hay
que basarse en /etc/bind/[Link] para conocer los valores de caché por defecto.
No hay que olvidar que las zonas son FQDN y por lo tanto deben terminar con un
punto. La dirección de correo electrónico del contacto administrativo es
root@[Link].
3. Crear registros NS para cada uno de los archivos. Para ambas zonas, el servidor
alfa es el servidor de nombres.
Archivo /etc/bind/[Link]:
Archivo
$TTL 86400
[Link]. IN SOA [Link]. [Link]. (
1
604800
86400
2419200
86400 )
[Link]. IN NS [Link].
[Link]. IN A [Link]
/etc/bind/db.192.168.200:
b.
$TTL 86400
[Link]. IN SOA [Link]. [Link]. (
1
604800
86400
2419200
86400 )
[Link]. IN NS [Link].
Ahora, el objetivo es hacer saber al servidor que debe cargar ambos archivos de zona que se acaban de crear en
cada inicio del servicio.
[Link] ([Link])
vi
Operaciones
3. Recargue el servicio.
Archivo /etc/bind/[Link]:
//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
zone "[Link]" {
type master;
file "/etc/bind/[Link]";
};
zone "[Link]" {
type master;
file "/etc/bind/db.192.168.200";
};
Recarga del servicio:
c. Creación de registros
Ahora decide crear algunos registros de distinta naturaleza para comprobar el funcionamiento de su servidor.
Archivos de zona
vi
Operaciones
[Link]. IN A [Link]
servidor-a IN CNAME [Link].
4.
alfa:/etc/bind# rndc reload
server reload successful
alfa:/etc/bind#
Consultas al servidor
Estando decidio a comprobar que todo funciona correctamente, realiza algunas pruebas desde la estación de
trabajo Ubuntu.
a. Utilización de nslookup
Comando útil
nslookup
Operaciones
b.
usuario@estacion:~$ nslookup
> server [Link]
Default server: [Link]
Address: [Link]#53
> [Link]
Server: [Link]
Address: [Link]#53
Name: [Link]
Address: [Link]
> [Link]
Server: [Link]
Address: [Link]#53
Utilización de dig
Comando útil
dig
Operaciones
5.
usuario@estacion:~$ dig @[Link] [Link]
; <<>> DiG 9.6.1-P1 <<>> @[Link] [Link]
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34012
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;[Link]. IN A
;; ANSWER SECTION:
[Link]. 86400 IN A [Link]
;; AUTHORITY SECTION:
[Link]. 86400 IN NS [Link].
;; ADDITIONAL SECTION:
[Link]. 86400 IN A [Link]
usuario@estacion:~$
Las distribuciones Red Hat ofrecen un servicio bind con el chroot realizado por defecto. Sin ningún tipo de
problemas, el entorno de trabajo se situará de forma integral en el directorio /var/named/chrooty el
funcionamiento con el chroot realizado estará ya configurado en el script de inicio del servicio.
Durante la sincronización, los archivos de zona se crearán de manera local en el servidor beta. Hay que asegurar
que la cuenta de servicio (named) tiene permisos de escritura en su directorio de almacenamiento.
[Link]
chmod
Operaciones
Archivo /var/named/chroot/etc/[Link] :
zone "[Link]" {
type slave;
masters { [Link] ; };
file "/var/named/[Link]";
};
zone "[Link]" {
type slave;
masters { [Link] ; };
file "/var/named/[Link]";
};
Inicio
del
[root@beta var]# ls -ld /var/named/chroot/var/named/
drwxr-x--- 4 root named 4096 jul 26 20:01 /var/named/chroot/var/named/
[root@beta var]# chmod g+w /var/named/chroot/var/named/
[root@beta var]# ls -ld /var/named/chroot/var/named/
drwxrwx--- 4 root named 4096 jul 26 20:01 /var/named/chroot/var/named/
[root@beta var]#
servicio:
Comprobación:
b.
Sólo nos falta indicar al servidor maestro que ahora debe trabajar con un compañero.
Archivos de zona
dig
tail
vi
Operaciones
1. Declarar el servidor beta como nuevo servidor de tipo NS para sus dos zonas.
5. Comprobar consultando el registro de sistema del servidor alfa que el reinicio del
servicio se ha realizado correctamente.
Archivo
de
$TTL 86400 zona
[Link]. IN SOA [Link]. [Link]. ( inversa
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
[Link]. IN NS [Link].
[Link]. IN NS [Link].
[Link]. IN A [Link]
[Link]. IN A [Link]
servidor-a IN CNAME [Link].
alpha IN CNAME alfa
estacion IN A [Link]
modificado:
$TTL 86400
[Link]. IN SOA [Link]. [Link]. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
[Link]. IN NS [Link].
[Link]. IN NS [Link].
101 IN PTR [Link].
102 IN PTR [Link].
199 IN PTR [Link].
;; QUESTION SECTION:
;[Link]. IN A
;; ANSWER SECTION:
[Link]. 86400 IN A [Link]
;; AUTHORITY SECTION:
[Link]. 86400 IN NS [Link].
[Link]. 86400 IN NS [Link].
;; ADDITIONAL SECTION:
[Link]. 86400 IN A [Link]
[Link]. 86400 IN A [Link]
[root@beta named]#
1. Requisitos
Los conocimientos adquiridos en la certificación LPI nivel 1, especialmente:
2. Objetivos
Al final del capítulo, será capaz de:
El servidor web se compone de un script de inicio del servicio que, en función de un archivo de configuración,
cargará los daemons apache y los posibles módulos de funcionamiento.
La riqueza funcional de Apache implica a menudo un archivo de configuración impresionante. Sin embargo, la
configuración de un servidor básico es bastante sencilla de realizar.
2. Archivo de configuración
El archivo de configuración de Apache, que según la versión y las opciones de compilación puede
ser [Link], [Link] o [Link], se compone de directivas seguidas de valores. Algunas
directivas se integran en contenedores para limitar su ámbito de aplicación.
directiva1 valor1
directiva2 valor2
...
<directiva_de_contenedor valor>
directiva3 valor3
directiva4 valor4
...
</directiva_de_contenedor>
Como se puede ver, hay directivas escritas directamente y otras integradas en una sección en el archivo de
configuración. Esta sección limita el ámbito de aplicación de las directivas a un determinado contexto de
funcionamiento. La configuración de Apache consiste en elegir las directivas adecuadas, asignarles los valores
adecuados y construir las secciones necesarias.
De entre todas las innumerables directivas de Apache, algunas son fundamentales y deberán encontrarse en
cualquier configuración de Apache.
Ejemplo
Archivo de configuración: directivas comunes de
ServerRoot Indica el directorio raíz de los archivos de configuración. archivo
de
User Determina la cuenta de usuario del proceso Apache.
configuración mínimo
Aunque esta configuración pueda funcionar, el servidor carecerá de cierta comodidad de uso. Por ejemplo, no
reconocerá los archivos [Link] o [Link]. Por lo tanto se deberá proporcionar en la URL el nombre de los
archivos html deseados tecleando por ejemplo [Link] si el directorio /var/www contiene el
archivo [Link]. Además, los scripts de inicio del servicio se podrían confundir por este archivo de configuración
mínimo que está estructurado en una sola pieza. Sin lugar a dudas, es recomendable iniciar el
ejecutable apache directamente sin usar el script.
ServerRoot /etc/apache2
User www-data
Group www-data
ErrorLog /var/log/apache2/[Link]
Listen 80
DocumentRoot /var/www
b. Directivas de contenedor
Ya se ha mostrado que las directivas sirven para aplicar un elemento de configuración al servidor. Por
ejemplo, la línea de configuración Listen 80 en el archivo de configuración se compone de la directiva Listen,
que indica en qué puerto el servidor debe esperar peticiones, y del valor 80 que es el puerto HTTP estándar.
Ubicada directamente en el archivo de configuración, esta directiva se aplicará en todo el servidor.
Sin embargo, hay elementos de configuración que sólo afectan a un aspecto funcional del servidor. Por
ejemplo, hay directivas que sólo deberían aplicarse a una parte limitada de un sitio web, como páginas web
protegidas que estén situadas en una estructura de carpetas específica del sistema de archivos. Para este
tipo de usos, Apache utiliza las directivas de contenedor.
Las directivas de contenedor tienen dos objetivos: agrupar un conjunto de directivas de configuración y
aplicarlas a una parte limitada del servidor Apache.
<directiva_de_contenedor valor>
directiva3 valor3
directiva4 valor4
...
</directiva_de_contenedor>
Observe que cualquier sección definida por una directiva de contenedor rodea la directiva con los caracteres <
> y que la sección termina con el nombre de la directiva precedido con una barra. Entre el inicio y el final de la
sección se encuentran todas las directivas normales que se aplicarán en el contexto funcional definido por la
directiva de contenedor.
La directiva Directory es sin duda la directiva de contenedor más fácil de aprender. Admite como argumento un
directorio y define parámetros específicos del contenido web situado en este directorio. En el ejemplo mostrado a
continuación, se indica que en el directorio /var/www/especial, y sólo en este directorio, el servidor puede seguir los
enlaces simbólicos durante la lectura de páginas web.
<Directory /var/www/especial>
Options FollowSymLinks
</Directory>
c. Validación de la sintaxis
ejec_apache -t
Donde ejec_apache representa el ejecutable de inicio del servidor Apache. Los valores más frecuentes
son httpd, apache y apache2.
ejec_apache -k start
ejec_apache -k stop
Donde ejec_apache representa el ejecutable de inicio del servidor Apache. Los valores habituales
son httpd, apache y apache2.
También se puede controlar el daemon apache mediante el comando de control apache2ctl con el uso, entre
otros, de los mismos parámetros start y stop.
3. Módulos Apache
a. Carga de módulos
El servidor web Apache tiene una estructura modular, es decir, las funciones fundamentales del servidor se
proporcionan con el ejecutable apache, mientras que las funciones adicionales o suplementarias se añaden a
través de módulos cargados bajo demanda desde el archivo de configuración. Estos módulos requieren a
menudo elementos de configuración adicionales. Las directivas asociadas a los módulos deben añadirse
también al archivo de configuración.
Ejemplo
Archivo de configuración: Carga de módulos
de carga
LoadModule Directiva de carga de módulos. de un
módulo
id_módulo Identificador del módulo. Valor estándar asociado a cada módulo.
En este
archivo_módulo La ruta absoluta del archivo de módulo proporcionado con Apache. ejemplo,
el módulo
cargado es dir_m odule cuya función es simplificar la escritura de las URL por los usuarios y mostrar un archivo
html (en general [Link]) incluso si éste no se ha facilitado. El archivo ejecutable de este módulo
es m od_dir.so. Una vez que se ha cargado el módulo, se puede llamar a la directiva DirectoryIndex que solicita
la carga de [Link] si no hay ningún archivo en la URL.
b. Visualización de módulos
El comando apache, cuando se utiliza de forma interactiva, permite visualizar los módulos cargados. Los
módulos pueden tener dos orígenes: se han llamado con el comando load desde el archivo de configuración o
se han compilado con el núcleo del programa y se cargan automáticamente.
ejec_apache -l
ejec_apache -M
Ejemplo de visualización de módulos cargados
La opción -M muestra los módulos estáticos y los módulos cargados desde el archivo de configuración con la
directiva LoadModule.
alfa:/etc/apache2# apache2 -l
Compiled in modules:
core.c
mod_log_config.c
mod_logio.c
worker.c
http_core.c
mod_so.c
alfa:/etc/apache2# apache2 -M
Loaded Modules:
core_module (static)
log_config_module (static)
logio_module (static)
mpm_worker_module (static)
http_module (static)
so_module (static)
alias_module (shared)
auth_basic_module (shared)
authn_file_module (shared)
authz_default_module (shared)
authz_groupfile_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cgid_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
mime_module (shared)
negotiation_module (shared)
setenvif_module (shared)
status_module (shared)
Syntax OK
alfa:/etc/apache2#
Los módulos dependen naturalmente del uso que se haga del servidor. Para determinar el uso que se le va a
dar, hay que identificar las necesidades, determinar las directivas asociadas a estas necesidades y comprobar
en la documentación en línea de Apache (sección Directivas para configurar la ejecución) cuáles son los
módulos implicados.
Supongamos que se desea dar a los usuarios acceso a páginas personales situadas en su directorio
personal. La directiva UserDir sirve precisamente para este fin. Admite como parámetro una ruta relativa que
indica la ubicación del directorio personal del usuario donde se colocarán los recursos html del mismo. Los
documentos por lo tanto estarán accesibles mediante la url [Link]
Si se consulta esta directiva en la documentación en línea, se puede comprobar que depende del
módulo mod_userdir. Por tanto, habrá que configurar esta directiva y asegurarse de que se carga el módulo.
Ejemplo de configuración del acceso a la carpeta de usuarios
Con la configuración del acceso a la carpeta de usuarios siguiente, la url [Link] dará
acceso al archivo /home/usuario/web/[Link] en el servidor.
4. Gestión de recursos
Contrariamente a una creencia popular, el servidor Apache no es necesariamente el servidor más rápido del
mercado y productos con código más simple ofrecen tiempos de respuesta más rápidos con hardware
equivalente. Sin embargo, Apache, con su gestión inteligente de recursos y la prealocación de procesos, ofrece
una mejor escalabilidad respecto a la carga.
Se
puede
alfa:~# ps -ef | grep apache
root 3244 1 0 Feb05 ? [Link] /usr/sbin/apache2 -k start
www-data 3245 3244 0 Feb05 ? [Link] /usr/sbin/apache2 -k start
www-data 3247 3244 0 Feb05 ? [Link] /usr/sbin/apache2 -k start
www-data 3252 3244 0 Feb05 ? [Link] /usr/sbin/apache2 -k start
alfa:~#
comprobar la existencia de un proceso ejecutado por root y de otros tres por la cuenta de servicio www-data.
El primer proceso sólo sirve para iniciar los demás, que procesan las peticiones de los clientes. El servidor
mostrado en este ejemplo no gestiona ninguna conexión cliente y, sin embargo, hay tres procesos previamente
creados listos para gestionar toda la demanda de los clientes. La gestión del primer servicio por la cuenta root
es obligatoria, ya que es el único con privilegios para abrir el puerto 80 en un sistema Linux.
Hosts virtuales
Es frecuente que un servidor Apache físico albergue varios sitios web distintos. Es lo que permite a las empresas
de alojamiento gestionar sitios web de decenas de clientes en un solo servidor. Esta tecnología se conoce en el
mundo Apache con el nombre de "Virtual Host" (host virtual).
1. Configuración global
a. Gestión de contenidos
Si un servidor tiene que gestionar hosts virtuales, es porque debe albergar varios contenidos o sitios web
distintos. Simplemente será necesario albergar cada uno de estos contenidos en directorios diferentes y
debidamente identificados. El alojamiento de un gran número de sitios web en un solo servidor requiere cierta
disciplina y convenios de nomenclatura estrictos.
El archivo de configuración debe modificarse ligeramente. Cada host virtual lee sus elementos de
configuración específicos en contenedores declarados mediante la directiva VirtualHost. Algunas directivas de
tipo general (DocumentRoot, por ejemplo) dejarán de usarse y deberán especificarse en cada uno de los
hosts virtuales en el contenedor correspondiente.
Si un servidor Apache gestiona hosts virtuales, sólo hay que hacer este cambio. Es decir, no hay configuración
estándar a la que se añadan configuraciones específicas para los hosts virtuales. Una vez que se configuran
los hosts virtuales, todo acceso al servidor se realiza por un host virtual, incluso si es el sitio básico.
Aunque el servidor soporta hosts virtuales por dirección IP, raramente se usa. En esta configuración, el
servidor dispone de varias direcciones IP y responde de forma distinta según la interfaz a la que llegue cada
petición HTTP. Se tiene que crear una directiva VirtualHost para cada dirección IP que esté en uso. Esta
directiva contendrá la declaración del directorio que contenga los datos html correspondientes al sitio virtual.
Esta declaración se realiza mediante la directivaDocumentRoot.
<VirtualHost dirección_1:80>
ServerName nombre1
DocumentRoot dir1
</VirtualHost>
<VirtualHost dirección_2:80>
ServerName nombre2
DocumentRoot dir2
</VirtualHost>
DocumentRootdir Las páginas web de este host virtual están en el directorio dir.
El soporte de hosts virtuales por nombre de host requiere que se use la directivaNameVirtualHost que debe
ubicarse en el contexto general del archivo de configuración y tantas directivas de
contenedor VirtualHost como sitios virtuales albergue el servidor. Para entender adecuadamente la
organización de los sitios virtuales, hay que saber que no hay un sitio principal y varios sitios virtuales sino
que todo sitio alojado en el servidor es un sitio virtual.
Como el sitio virtual se reconoce a partir de su nombre de host, la directiva ServerName debe estar presente
de forma sistemática en los contenedores de host virtual y el nombre asociado debe ser precisamente el que
usarán los clientes para acceder al servidor (el nombre tiene que estar en la URL).
La última directiva obligatoria en una declaración de host virtual es la directiva DocumentRoot que
determina la ubicación de los datos web asociados al sitio virtual.
NameVirtualHost *:80
<VirtualHost *:80>
ServerName nombre1
DocumentRoot dir1
</VirtualHost>
<VirtualHost *:80>
ServerName nombre2
DocumentRoot dir2
</VirtualHost>
ServerNamenombre Este host virtual se elegirá para las peticiones que tengan el
nombre de servidor nombre. Es decir, se activará para las
peticiones a [Link]
La restricción se realiza en directorios cuyo contenido sólo se puede ver una vez el usuario se ha
autentificado. Si se desea restringir el acceso a un sitio entero, basta con restringir el acceso al directorio raíz
del contenido web. Sin embargo, en la práctica se desea tener una página de inicio disponible para todo el
mundo y que toda navegación a partir de ésta esté sometida a la autentificación del usuario.
<Directory directorio>
...
</Directory>
Donde directorio representa la ruta absoluta del directorio al que hay que proteger el acceso. Cabe destacar
los puntos suspensivos que representan las directivas específicas que se aplicarán al contenido de este
directorio.
b. Directivas de autentificación
En la sección de directorio sujeta a la autentificación, hay que añadir el conjunto de directivas necesarias
según el modo de autentificación que se escoja. Algunas de estas directivas se encontrarán en la mayoría de
las circunstancias.
Solicitud de autentificación
AuthName "texto"
Require valid-user
Directiva_aut parámetro_aut
Se ha
Archivo [Link]: solicitud de autentificación para un directorio
empleado en este ejemplo el parámetro valid-user para establecer que cualquier usuario autentificado pueda
acceder a los datos protegidos. Se podría haber usado user x o group y para limitar el acceso a un usuario o
a los miembros de un grupo.
2. Autentificación local
El comando htpasswd permite crear la base de datos de cuentas y trabajar con ella.
Ejemplo
Comando htpasswd: opciones y parámetros
de
-c Necesario si el archivo no existe todavía. Si el archivo ya existe, se archivo
sobreescribe. de
contraseñas
Algunos módulos tienen que cargarse para que se puedan reconocer las directivas. Habrá que cargar como
mínimo el módulo auth_basic para permitir la autentificación mediante un archivo local, el
módulo authn_file para gestionar esta autentificación y finalmente el módulo authz_user, que gestiona la
autorización de acceso a las páginas protegidas. Esta profusión de módulos puede ser inquietante, pero un
mínimo de rigor facilita las cosas: para cada una de las directivas empleadas, la documentación en línea
especifica sistemáticamente qué módulos tienen que cargarse.
Carga de módulos
En la sección de directorio sujeta a la autentificación, habrá que añadir a continuación las directivas
necesarias para la autentificación local.
Donde archivo representa el archivo que contiene la base de datos de cuentas de usuario usada para la
autentificación con las contraseñas de los usuarios.
ServerRoot /etc/apache2
User www-data
Group www-data
ErrorLog /var/log/apache2/[Link]
Listen 80
DocumentRoot /var/www
Se recomienda encarecidamente comprobar que el directorio está adecuadamente en línea y accesible con los datos
correctos (dirección IP y contexto LDAP) antes de configurar la autentificación LDAP para cualquier aplicación.
# [Link]
dn: dc=direc,dc=es
objectClass: domain
dc: direc
(...)
# usuario, [Link]
dn: uid=usuario,ou=users,dc=direc,dc=es
objectClass: top
objectClass: posixAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
(...)
usuario@servidor#
auth_basic
authn_file
authz_user
authnz_ldap
c. Configuración de la autentificación
Ahora se deberán utilizar las directivas de autentificación en una sección de directorio. El punto culminante de
la configuración será la declaración de la directiva AuthLDAPUrl.
Aunque la sintaxis pueda parecer impresionante, no se debe al azar o a la imaginación de los desarrolladores. El
formato URL LDAP se define en la RFC2255 y se utiliza en algunas aplicaciones.
AuthName "Texto"
AuthType Basic
Require Valid-user
AuthLDAPUrl ldap://[Link]/ou=users,dc=direc,dc=es?cn?sub?objectclass=*
Aunque el mejor método es sin duda el uso de la directiva Directory, se recomienda (encarecidamente) para la
certificación LPI estar familiarizado con el concepto de los archivos .htaccess.
...
<Directory /var/www/prot>
AllowOverride all
authType basic
AuthName "Se necesita comprobar sus credenciales"
Require valid-user
AuthUserFile /etc/httpd/mdp
</Directory>
...
Contenido del archivo /var/www/prot/.htaccess utilizado para configurar una autentificación desde el directorio de
datos html:
A veces,
las dos
authType basic
AuthName "Se necesita comprobar sus credenciales"
Require valid-user
AuthUserFile /etc/httpd/mdp
configuraciones entran en conflicto, configurando por un lado el comportamiento específico del directorio en un
contexto directory y, por otro lado, la misma directiva se configura de forma distinta en un archivo .htaccess del
mismo directorio. En este caso, la directiva AllowOverridepermite establecer qué configuración se utilizará.
1. Criptografía y certificados
Explicar exhaustivamente qué son la criptografía y los certificados digitales X509 sobrepasarían por completo
los objetivos de este libro, y su conocimiento detallado no es un requerimiento en la certificación LPI. Sin
embargo, la utilización de certificados es necesaria para asegurar el acceso a las páginas web de un servidor
mediante SSL (https).
a. Conceptos criptográficos
La criptografía asimétrica usa dos claves. Por convenio, se decide que una de estas claves será privada y sólo
la podrá usar su propietario y que la otra será pública y podrá ser vista por todos, incluso personas hostiles.
El gran consumo de recursos de procesador de la criptografía asimétrica hace que su uso no sea apto para la
encriptación de grandes cantidades de datos, pero la amplia cantidad de posibilidades que ofrecen las claves
públicas y privadas la convierten en una herramienta imprescindible. La clave pública servirá para encriptar
pequeñas cantidades de datos (como otras claves, simétricas por ejemplo), mientras que la clave privada se
utilizará para operaciones de firma digital (se firma con algo que sólo pertenezca a uno mismo).
Aunque los algoritmos utilizados comúnmente en Internet y en las empresas se consideran fiables, el análisis
de sistemas criptográficos muestra que la vulnerabilidad está sobre todo en los riesgos asociados a la
transmisión de la clave pública de un usuario o un servidor. El mismo diseño de la criptografía asimétrica hace
que esta clave sea absolutamente inútil por sí sola y que no haya modo alguno de deducir la clave privada a
partir de la pública. Sin embargo, los fallos de seguridad en comunicaciones confidenciales o en las firmas
digitales de documentos se basan en claves públicas cuyo nombre del propietario ha sido usurpado. Es decir,
una clave pública circula, pero no es la verdadera y un farsante hace pasar su clave pública por la de otro. La
persona engañada podría entonces encriptar datos muy confidenciales con la clave falsa y, por lo tanto, poner
esta información en peligro.
Los certificados digitales X509 tienen como objetivo establecer de modo formal un enlace entre una identidad
(nombre, dirección IP, etc.) y una clave pública. Los certificados no pueden falsificarse, ya que están firmados
por un tercero con quien todos tienen una relación de confianza. Este tercer actor se llama "Certificate
Authority" (autoridad de certificación). Pueden ser públicos y reconocidos por todo el mundo o privados y
usados en un entorno restringido. En este caso, las aplicaciones cliente deberán configurarse para reconocer
la autoridad de certificación que emitirá los certificados.
Cuando un servidor web tiene que usar un certificado, tiene que disponer de un certificado que demuestre su
identidad: una clave pública relacionada con su nombre de host. Cuando se produce una conexión https por
parte de un navegador, el servidor envía su certificado y el navegador comprueba su validez, debido a que el
nombre con el que se accede al servidor es el que se anuncia en el certificado. Si no es así, el navegador
muestra una alerta de seguridad. Entonces queda en manos del usuario cancelar la conexión segura o
aceptarla, pero siempre con la duda de no saber si el servidor al que se dirige es legítimo o se trata de un
farsante.
El funcionamiento de HTTP con SSL requiere que un certificado que contenga una clave pública del servidor
web se envíe al navegador cliente y que esta clave pública se envíe siempre en un certificado. Por lo tanto,
Apache configurado para SSL debe disponer de un certificado que podrá enviar a sus clientes.
El certificado utilizado por Apache podrá ser facilitado por una autoridad de certificación pública o
privada proporcionada por una aplicación especializada. En este supuesto, la autoridad proporcionará un
certificado que se exportará en forma de archivo, se copiará en el disco del servidor Apache y éste lo utilizará.
Para un uso puntual o para realizar pruebas también se puede generar de manera local un certificado listo
para usar que Apache podrá utilizar. Hay herramientas especializadas en esta función, pero están
generalmente ligadas a una distribución, o se pueden crear a partir de todas las piezas generadas con las
utilidades de la librería openssl. Para operaciones limitadas a las pruebas de la configuración ssl de Apache,
se elegirá la solución más sencilla, que es utilizar la misma clave tanto para generar el certificado como para
firmarlo.
El
Comando openssl para generar certificados: opciones y parámetros
comando
req Solicitud de certificado. anterior
genera la
-x509 Se desea un certificado autofirmado y no una petición de solicitud
firma. del
-nodes La clave del servidor no debe estar protegida con
contraseña.
certificado. Los campos estándar del certificado se solicitan de forma interactiva al usuario. La mayoría de
estos campos son informativos, pero para un certificado que se usa en un servidor web, el campo Common
Name (nombre común) tiene que ser obligatoriamente el nombre DNS del servidor que aparecerá en la URL de
acceso. En caso contrario, el navegador del cliente mostrará una alerta de seguridad cuando compruebe el
certificado del servidor.
Es imprescindible informar correctamente el campo Common Name (CN). Es el que se asociará formalmente a la
clave pública en el certificado digital.
2. Configuración de ssl
a. Carga del módulo SSL
Donde ruta es la ruta absoluta del archivo de módulo. La ruta por defecto depende de la forma en que haya
sido compilado Apache y, por lo tanto, de la distribución.
A continuación hay que especificar al servidor cuáles son las claves que se deben usar para que funcione en
modo SSL. Se tiene que disponer de su clave privada y de su certificado, que contendrá su clave pública.
SSLCertificateFile /ruta/archivo_certificado
SSLCertificateKeyFile /ruta/archivo_clave
Sólo hay que solicitar al servidor que escuche por el puerto https y reiniciar el motor SSL que, una vez
realizada la autentificación, permitirá encriptar las comunicaciones entre cliente y servidor.
Listen 443
SSLEngine on
Por supuesto, estos dos parámetros se deben añadir al archivo de configuración Apache.
El funcionamiento en modo SSL estándar que se acaba de mostrar es el que se encuentra generalmente en
Internet y sirve para la mayor parte de situaciones. Sin embargo, se pueden utilizar los certificados no para
transmitir una clave de sesión encriptada y, por consiguiente, asegurar la confidencialidad; sino para
garantizar la identidad de los clientes que se conecten al servidor. En esta configuración, el navegador cliente
deberá disponer de un certificado que se comprobará por el servidor web. Para ello, el servidor Apache tiene
que disponer de un certificado de la autoridad que haya emitido los certificados de los clientes.
SSLVerifyClient require
SSLCACertificateFile certificado_ca
Donde certificado_ca representa el archivo de certificado de la autoridad que habrá firmado los
certificados clientes. Los certificados clientes se deben instalar en el repositorio de certificados del
navegador web.
Servidor proxy
1. Servidores proxy
Un servidor proxy se encarga de realizar una petición en nombre de un cliente a otro servidor mediante un
protocolo determinado. El término español para proxy es también "intermediario", el servidor hace de
intermediario para realizar una acción en nombre del cliente. Se dice que un servidor proxy trabaja en rotura de
flujo. La mayoría de los proxys trabajan con el protocolo HTTP. Si se habla de proxy sin concretar el protocolo
aplicado, se trata de un proxy web (HTTP).
a. Protección de clientes
Los servidores proxy son el único camino válido para ir a Internet (en principio, cualquier cliente tiene que
pasar por el proxy para obtener contenido proveniente de Internet). Están en la primera línea en caso de que
se produzca un ataque desde el exterior. Un servidor proxy correctamente configurado proporcionará, por
tanto, una protección natural a los navegadores web en la red.
b. Servidores de caché
Todas las peticiones pasan por los proxy, el proxy obtiene los datos del servidor y los retransmite al cliente.
En la mayoría de los casos, el servidor conserva en su disco una copia de estos datos para responder
directamente a los sucesivos clientes que hagan las mismas peticiones. Por tanto, la navegación de los
clientes se acelera porque no es necesario desviar continuamente las solicitudes a los servidores web.
La generalización de la banda ancha ha hecho que los beneficios de los servidores proxy de caché sean
menos espectaculares.
c. Filtrado
Los servidores proxy ofrecen la posibilidad de rechazar parte o la totalidad de sus peticiones a algunos
clientes. Entonces, se puede rechazar en bloque cualquier navegación o filtrar algunas url para impedir que se
navegue en sitios no profesionales, por ejemplo. El servidor proxy es mejor que los cortafuegos para este
tipo de tareas, ya que el proxy "entiende" qué es lo que se está solicitando (una URL), mientras que el
cortafuegos se limita a autorizar o prohibir cualquier tráfico en un puerto (80 en el caso de http) sin
diferenciar las páginas web visitadas.
d. Inconvenientes
Los servidores proxy no están libres de inconvenientes. Requieren una configuración específica de los clientes
(hay que informar la dirección IP del proxy en el navegador) y se limitan a un protocolo de aplicación. Por
tanto, se necesitan otros mecanismos de protección o de optimización para cada uno de los protocolos. Por
ello, para cada despliegue planeado de un proxy, habrá que sopesar de forma precisa sus ventajas e
inconvenientes.
a. Configuración básica
Squid se compone de un servicio cuyo script de inicio estándar va a buscar su configuración en un único
archivo llamado [Link], que generalmente se ubica en /etc/squid.
La configuración de squid en un modo de funcionamiento estándar (ruptura de flujo de los accesos cliente y
de algunas listas de acceso para gestionar los permisos) no es nada difícil, pero en la mayoría de las
implementaciones el archivo de configuración por defecto de squid es impresionante. En el
paquete proporcionado con debian, por ejemplo, el archivo ocupa un total de 5000 líneas, del que
aproximadamente el uno por ciento se lee en el arranque del servicio.
Sin una
configuración particular, un servidor proxy squid ejerce de manera natural como servidor de caché de oficio y
protege las redes locales mediante una ruptura del tráfico (las peticiones de los navegadores no van por
Internet, sino que se paran en el proxy que consultará a los servidores en su lugar).
Antes de que pueda funcionar, el servidor todavía requiere una configuración mínima.
http_port número_de_puerto
cache_dir ufs directorio tamaño dir_nivel_1, dir_nivel_2
visible_hostname nombre_servidor
A continuación se trata de especificar quién puede o quién no puede acceder a Internet a través del servidor
proxy.
La primera etapa consiste en definir los hosts o conjuntos de hosts (grupos, redes) al que se aplicará la
autorización. Estos grupos se crean con el nombre de ACL (Access Control List).
Ejemplo
Archivo [Link]: definición de acl
de
nombre_lista El nombre de la lista creada. Valor alfanumérico cualquiera. definición
de acls
tipo_acl src Definición de direcciones origen.
Cabe
dst Definición de direcciones destino.
destacar
A.B.C.D/M Dirección de red y máscara de subred (número de bits de la la
máscara). definición
de la acl
Dirección de host y máscara de subred (número de bits de la "all" que
máscara). incluye a
todas las
Intervalo de direcciones: A.B.C.D-E.F.G.H/M (número de bits a 1
redes
de la máscara).
posibles.
Sólo
falta
acl all src all decirle a
acl red_local src [Link]/24 squid
acl servidores_prohibidos dst [Link]-[Link]/24
qué
tiene
que
hacer con estas acls.
Ejemplos
Archivo [Link]: autorización de acl
de
autorización Autorización o denegación de la acl. Los dos valores posibles son allow
y deny.
nombre_acl El nombre de la lista que se autoriza o se deniega.
autorizaciones de acls
Se
pueden
acl all src all definir
acl red_local src [Link]/24 acl en
acl servidores_prohibidos dst [Link]-[Link]/24
un
http_access deny servidores_prohibidos
archivo
http_access allow red_local
externo
http_access deny all
al
archivo
de
configuración principal.
Donde archivo_acl representa la ruta absoluta del archivo que contiene las acls. Este archivo tiene que estar
informado obligatoriamente entre comillas dobles.
Comprobación de los conocimientos adquiridos:
preguntas/respuestas
Ponga a prueba sus conocimientos respondiendo a las preguntas siguientes. Estas preguntas no siempre
esperan una respuesta cerrada. Las preguntas planteadas en la certificación, a pesar de que abordan los
mismos temas, en su mayoría serán planteadas en forma de preguntas de opción múltiple o que requieran una
respuesta corta, en palabras escritas en el teclado.
1. Preguntas
1 ¿Cuál es el interés del funcionamiento modular de Apache?
2 ¿Cómo se puede validar la sintaxis de un archivo de configuración Apache sin tener que iniciar el
servicio?
3 ¿Qué fuente de información es casi imprescindible para el uso correcto de módulos Apache y de
directivas de configuración de estos módulos?
4 En la mayoría de las situaciones comunes de un servidor con hosts virtuales, ¿cómo sabe el servidor a
qué host virtual se está consultando de entre todos los disponibles?
5 En el contexto de una autentificación sencilla gestionada de manera local por un servidor Apache, ¿qué
comando permite crear cuentas de usuario en la base de datos local?
9 ¿Por qué se dice que un servidor proxy tradicional funciona rompiendo el tráfico?
10 En un servidor proxy squid, ¿se pueden poner acls squid en archivos de definición anexos?
2. Respuestas
1 ¿Cuál es el interés del funcionamiento modular de Apache?
Más allá de la simple visualización de páginas web, el servidor web Apache soporta decenas de funciones,
algunas comunes y otras específicas. La naturaleza modular de Apache permite cargar solamente los módulos
necesarios para su funcionamiento y, por tanto, tener un código ejecutable cargado más ligero.
2 ¿Cómo se puede validar la sintaxis de un archivo de configuración Apache sin tener que iniciar el servicio?
3 ¿Qué fuente de información es casi imprescindible para el uso correcto de módulos Apache y de directivas
de configuración de estos módulos?
Es difícil configurar correctamente un servidor Apache complejo sin la ayuda del sitio web de documentación
oficial de Apache. En primer lugar porque hay una gran cantidad de directivas: más de 400 en la versión 2.2 y
más de un centenar de módulos; y también porque Apache es un software vivo y sus módulos están
evolucionando continuamente.
4 En la mayoría de las situaciones comunes de un servidor con hosts virtuales, ¿cómo sabe el servidor a
qué host virtual se está consultando de entre todos los disponibles?
El servidor consulta la url solicitada por el cliente y averigua qué nombre se ha usado para la solicitud. Es el
método más común, utilizado normalmente por los servicios de alojamiento web y por los proveedores de
servicio de Internet que pueden albergar en un solo servidor físico varias decenas de sitios web bajo la forma
de hosts virtuales.
5 En el contexto de una autentificación sencilla gestionada de manera local por un servidor Apache, ¿qué
comando permite crear cuentas de usuario en la base de datos local?
El comando es htpasswd, que permite crear, modificar y eliminar cuentas de usuario. Observe que este
comando es útil cuando se trata de una autentificación local sencilla, que se usa en los casos más simples,
pero que este método representa solamente una de las posibles formas de autentificación disponibles en
Apache.
No hay, en principio, ningún motivo para que el servidor Apache busque en cada uno de sus directorios un
posible archivo de configuración adicional. Por consiguiente, la directiva AllowOverride es necesaria para indicar
que se acepta la existencia de una configuración complementaria y que conviene buscar este archivo de forma
automática.
Se le puede dar muchos usos, pero en esencia un certificado digital asocia una identidad a una clave pública.
Esta identidad puede ser una referencia a un usuario, un nombre, una dirección IP, etc. Esta asociación está
garantizada, ya que está firmada por una autoridad de certificación a la que todo el mundo le ha otorgado su
confianza. Si tuviéramos que encontrar una analogía en la vida cotidiana, se podría hablar de una identidad que
asocia un nombre a una foto (clave pública), estando firmada por una autoridad (la jefatura de policía).
9 ¿Por qué se dice que un servidor proxy tradicional funciona rompiendo el tráfico?
Trabajando con un servidor proxy (intermediario), el cliente se dirige al servidor proxy indicándole el servidor
web objetivo. El servidor proxy captura la petición y, a su vez, envía una petición al servidor objetivo, pero en
nombre del cliente. Por tanto, se tiene un flujo de datos del cliente al proxy y otro flujo de datos del proxy al
servidor objetivo. El proxy aprovecha la operación para realizar operaciones de filtrado, estadísticas, poner
información en caché, etc.
10 En un servidor proxy squid, ¿se pueden poner acls squid en archivos de definición anexos?
Sí, la directiva acl usada en el archivo de configuración squid puede hacer referencia directamente a un
parámetro de red o designar un archivo que contenga este mismo parámetro.
Trabajos prácticos
Para cubrir las necesidades internas de la empresa, se le pide desplegar dos servidores web para la intranet de
la empresa. Uno contendrá datos accesibles para todos, incluyendo los visitantes de la empresa, y el otro
contendrá datos confidenciales y sólo deberán acceder a él una serie de usuarios. Además, por temor a escuchas
indiscretas, se le pide que aplique alguna medida para que no se puedan capturar datos sensibles por la red.
Por lo tanto, planea aplicar una medida de protección usando SSL.
A pesar de disponer de dos servidores físicos, ansioso por economizar esfuerzos, decide implementar los dos
servidores web en uno solo físico. Elige para esta tarea el servidor beta.
Sus sitios web se diferenciarán gracias a la URL utilizada para acceder. Por tanto, necesitamos dos nombres
distintos que hagan referencia a la misma IP.
Comandos útiles
rndc
vi
Operaciones
1. Crear en el dominio DNS [Link] del servidor alfa los dos registros, publico y
privado, de tipo CNAME, que tengan como destino [Link].
3. Recargar la zona.
Archivo
[Link] localhost
[Link] [Link] [Link]
$TTL 86400
[Link]. IN SOA [Link]. [Link]. (
8
604800
86400
2419200
86400 )
[Link]. IN NS [Link]
[Link]. IN A [Link]
[Link]. IN A [Link]
servidor-a IN CNAME [Link].
alpha IN CNAME alfa
publico IN CNAME beta
privado IN CNAME beta
Recarga de datos de zona:
b.
Gestión
alfa:/etc/bind# rndc reload de
server reload successful
alfa:/etc/bind#
contenidos
Usted no se encarga del contenido de los sitios web. Por tanto, creará dos elementos simbólicos que le
permitirán comprobar que el acceso a los distintos sitios está correctamente diferenciado.
Comandos útiles
mkdir
vi
Operaciones
3. Crear en cada uno de estos directorios un archivo [Link] como el del siguiente
ejemplo. Estos archivos deberán poder identificarse para saber si se está en el
sitio privado o público.
<html>
<body>
<h1>Contenido del sitio</h1>
</body>
</html>
c.
Su objetivo por el momento es crear un servidor web que responda a peticiones HTTP.
Comandos útiles
httpd
useradd
vi
Directivas de apache útiles
ServerRoot
User
Group
ErrorLog
Listen
DocumentRoot
LoadModule
DirectoryIndex
ServerName
Operaciones
5. Indicar al servidor que los procesos deben detenerse por el grupo apache-user.
10. Indicar al servidor que hay que cargar el módulo /usr/lib/httpd/mod_dir.so con
el nombre dir_module.
11. Indicar al servidor que los archivos [Link] tienen que mostrarse por defecto
incluso si no se escriben en la URL.
13. Iniciar el servidor web sin usar el script de gestión del servicio y precisando que se
quiere usar este archivo de configuración personal (/etc/httpd/[Link]).
Archivo
/etc/httpd/[Link]
ServerRoot /etc/httpd
User apache-user
Group apache-user
Errorlog /var/log/httpd/[Link].
Listen 80
DocumentRoot /var/web/publico
ServerName [Link]
LoadModule dir_module modules/mod_dir.so
DirectoryIndex [Link]
d.
Animado por este éxito, decide implementar la gestión de sitios virtuales para que el servidor devuelva
contenidos distintos según el nombre mediante el cual se acceda al mismo.
Comandos útiles
httpd
vi
NameVirtualHost
VirtualHost
Operaciones
3. Crear dos estructuras de sitios virtuales que responderán en todas las interfaces
posibles a través del puerto 80.
4. Informar para cada uno de los sitios virtuales el nombre del servidor asociado
([Link] y [Link]).
5. Informar para cada uno de los sitios virtuales el directorio del contenido web
asociado (/var/web/publico y /var/web/privado).
Archivo
/etc/httpd/[Link] modificado:
2.
ServerRoot /etc/httpd
ServerName [Link]
User apache-user
Group apache-user
Errorlog /var/log/httpd/[Link].
Listen 80
DocumentRoot /var/web/publico
LoadModule dir_module modules/mod_dir.so
directoryIndex [Link]
NameVirtualHost *:80
<VirtualHost *:80>
ServerName [Link]
DocumentRoot /var/web/publico
</VirtualHost>
<VirtualHost *:80>
ServerName [Link]
DocumentRoot /var/web/privado
</VirtualHost>
Ahora es el turno de proteger el acceso al sitio privado contra las escuchas espía. Va a crear los certificados
digitales necesarios para el funcionamiento con SSL. Siempre que no haya acceso público a este sitio web, se
pueden utilizar certificados generados de manera local (y de forma gratuita).
Comandos útiles
openssl
Operaciones
b.
Configuración de SSL
Comandos útiles
vi
Directivas útiles
Listen
LoadModule
NameVirtualHost
SSLCertificateFile
SSLCertificateKeyFile
SSLEngine
Operaciones
3. Indicar al servidor que debe utilizar el archivo [Link] como archivo de clave
privada.
4. Indicar al servidor que va gestionar un host virtual también para el puerto 443.
5. Indicar al servidor que el sitio virtual privado está ahora accesible a través del
puerto 443.
6. Indicar al servidor que debe estar a la escucha por el puerto 443 y activar el
funcionamiento de SSL para el sitio virtual privado.
c. Gestión de la autentificación
(...)
NameVirtualHost *:80
<VirtualHost *:80>
ServerName [Link]
DocumentRoot /var/web/publico
</VirtualHost>
NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine on
ServerName [Link]
DocumentRoot /var/web/privado
</VirtualHost>
LoadModule ssl_module modules/mod_ssl.so
SSLCertificateFile [Link]
SSLCertificateKeyFile [Link]
Listen 443
Finalmente, el acceso al sitio privado está protegido mediante SSL y sólo falta proteger el acceso a la parte
confidencial mediante una autentificación por contraseña. Para sus primeros intentos decide configurar el control
de acceso para un solo directorio (/var/web/privado/auth) y ubicar las directivas de configuración en un archivo
oculto .htaccess en este directorio.
Comandos útiles
chmod
chown
htpasswd
vi
Directivas útiles
AuthName
AuthType
AuthUserFile
LoadModule
Require
Operaciones
2. Asignar este archivo a las únicas cuentas de usuario y grupos de servicio Apache.
3. Gestionar los permisos de acceso a este archivo para que ninguna otra cuenta de
usuario tenga acceso.
Añadir
al
[root@beta httpd]# htpasswd -c /etc/httpd/passwd usuario archivo
New password: ********
Re-type new password: ********
Adding password for user usuario
[root@beta httpd]#
[root@beta httpd]# chown apache-user:apache-user passwd
[root@beta httpd]# chmod 440 passwd
[root@beta httpd]#
[root@beta httpd]# ls -l passwd
-r--r----- 1 apache-user apache-user 19 ago 2 10:46 passwd
[root@beta httpd]# cat passwd
usuario:[Link]/SXrEPV3E
[root@beta httpd]#
[Link]:
Archivo
(...)
LoadModule ssl_module modules/mod_ssl.so
SSLCertificateFile [Link]
SSLCertificateKeyFile [Link]
Listen 443
.htaccess:
3.
authType basic
AuthName "Se necesita comprobar sus credenciales"
Require valid-user
AuthUserFile /etc/httpd/passwd
b. Configuración básica
Para controlar perfectamente su implementación, decide crear una vez más un archivo de configuración desde
cero.
Comandos útiles
chown
mkdir
mv
vi
Directivas útiles
cache_dir
http_port
visible_hostname
Manipulaciones
6. Indicar que el directorio de caché será /var/proxy con un tamaño máximo de 500
MB, 16 directorios de primer nivel de caché y 256 directorios de segundo nivel de
caché.
7. Indicar que el nombre del servidor proxy que aparecerá en los archivos de registro
es prox.
Copia
de
alfa:~# mkdir /var/proxy
alfa:~# chown proxy /var/proxy
alfa:~# ls -ld /var/proxy
drwxr-xr-x 2 proxy root 4096 ago 3 10:32 /var/proxy
alfa:~#
Nuevo
archivo
alfa:/etc/squid# pwd
/etc/squid
alfa:/etc/squid# ls
[Link]
alfa:/etc/squid# mv [Link] [Link]
alfa:/etc/squid#
[Link]:
c.
http_port 8080
cache_dir ufs /var/proxy 500 16 256
visible_hostname prox
Si a pesar de nuestras advertencias ha intentado iniciar el servicio proxy, obtendrá un mensaje de error
indicando que la acl no está definida. En efecto, incluso si no se desea gestionar el filtrado de ningún modo, tiene
que definirse como mínimo la acl all.
Por tanto, va a declarar la acl e indicar que todo el tráfico está autorizado para todo el mundo y una acl llamada
fun para indicar la dirección IP del servidor de juegos en línea prohibido.
Directivas útiles
acl
http_access
Operaciones
Reinicio
del
http_port 8080
cache_dir ufs /var/proxy 100 16 256
visible_hostname prox
servicio:
d.
Prueba
alfa:/etc/squid# /etc/init.d/squid stop
Stopping Squid HTTP proxy: squid.
alpha:/etc/squid# /etc/init.d/squid start
Starting Squid HTTP proxy: squidCreating squid cache structure (warning).
2011/08/03 [Link]| Creating Swap Directories
.
alfa:/etc/squid#
funcional
Configure el navegador de la estación de trabajo cliente para que use el proxy instalado en alfa con el puerto
8080.
1. Requisitos
Los conocimientos adquiridos en la certificación LPI nivel 1, especialmente:
Edición de archivos.
2. Objetivos
Al final de este capítulo, será capaz de:
1. El protocolo SMTP
El protocolo SMTP (Simple Mail Transfer Protocol) se utiliza para transmitir correos electrónicos a servidores de
correo. SMTP puede utilizarse desde un cliente de correo (Outlook, Thunderbird, etc.) para enviar un correo
electrónico a su servidor de correo, pero también entre los servidores de correo del emisor y los del
destinatario. Se ha visto en el capítulo Resolución de nombres DNS cómo los registros MX asociados a un
nombre de dominio del destinatario permiten encontrar la dirección IP del servidor. Una vez llega a su destino,
el mensaje se conserva hasta que el destinatario se dé cuenta de que tiene correo pendiente. La lectura del
correo puede realizarse directamente en el servidor o a través de un MDA (Mail Delivery Agent) con un protocolo
de recepción de correo (POP o IMAP).
SMTP usa una sintaxis básica fácilmente comprobable desde un cliente telnet o nc.
El comando ehlo se utiliza por defecto en todos los sistemas actuales y solicita al servidor
mostrar las extensiones SMTP que soporta. Los sistemas más antiguos (anteriores a 2001)
utilizan el comando helo.
2. Presentación de Sendmail
SendMail es el más antiguo y puede que el más famoso MTA utilizado en Internet de la historia. Se escribió
incluso antes de la creación del protocolo SMTP y, en ese periodo, los mensajes se transmitían usando FTP de
un servidor a otro. No había lugar para la existencia de MDA ni de un protocolo de recepción de correo y
cualquier correo recibido se tenía que leer directamente en el servidor.
Sendmail no es motivo de entusiasmo para todo el mundo por dos razones: como la fecha de su creación es de
una época en que los riesgos de ataque se limitaban a chistes de escuela, se ha configurado a menudo sin
importantes opciones de seguridad y, de este modo, ha participado en la retransmisión de millones de spam.
Por otro lado, las dificultades derivadas de la configuración de Sendmail pueden desalentar a los más
entusiastas.
Las múltiples evoluciones y reescrituras de Sendmail lo han convertido hoy en día en una herramienta en la que
se puede depositar total confianza y es uno de los MTA más potentes y rápidos del mercado.
3. Presentación de Exim
Exim es un MTA relativamente reciente (sus primeros desarrollos datan de 1995) que tiene como objetivos la
robustez y la flexibilidad. Es el MTA ofrecido por defecto en las distribuciones Debian y en la mayoría de sus
derivadas.
4. Presentación de Postfix
Postfix es, en el mundo del open source, el MTA más popular y casi el más fácil de configurar. Muchos servicios
de alojamiento y proveedores de servicios de internet utilizan Postfix para administrar las cuentas de correo de
sus clientes.
El servidor SMTP Postfix
1. Configuración de Postfix
a. Gestión de cuentas
Un MTA tiene que gestionar las cuentas de correo de su dominio, lo que implica que el servidor tiene que
gestionar la lista de usuarios que tienen una cuenta de correo en el dominio. Los MTA generalmente son
capaces de usar bases de datos de usuarios de distinto tipo: archivos locales de cuentas locales, directorio
ldap, bases de datos MySQL, etc.
La solución más simple, siempre disponible y que no necesita ninguna configuración particular, es
utilizar directamente las cuentas de usuario del sistema Linux.
b. Gestión de alias
En general, la base de datos de cuentas de usuario utilizada por un MTA determina qué direcciones de correo
son susceptibles de recibir correos electrónicos. Sin embargo, puede que un usuario tenga varias cuentas de
correo. Por ejemplo, es frecuente que el administrador de una red deba responder a los correos dirigidos a
postmaster@[Link]. Es incluso una recomendación de la RFC SMTP. Para este tipo de uso, un MTA utiliza
una relación de correspondencias entre cuentas llamadas alias. Postfix utiliza el archivo de declaración
de alias /etc/aliases y lo utiliza en una base de datos generada a partir del archivo de alias mediante el
comando postalias.
# /etc/aliases
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
root: usuario
Cualquier modificación del archivo /etc/aliases debe ir acompañada de una redeclaración de la base de datos
con el comando postalias.
c. El comando postfix
Generalmente un script de configuración estándar inicia el servicio postfix. Sin embargo, se puede utilizar el
comando postfix directamente, especialmente cuando se está en fase de pruebas y diagnóstico.
postfix acción
Comando postfix: acciones comunes
flush Intenta mandar todos los correos pendientes: los que ya han dado error y
los que están a la espera de un nuevo intento.
d. Archivos de configuración
La configuración del servicio Postfix se encuentra en el archivo llamado [Link], alojado generalmente en el
directorio /etc/postfix.
myorigin = dominio_origen
mydestination = dominio_destino
mynetwork = red/máscara_de_bits
relayhost = relays_MTA
Con un archivo de configuración mínimo y usando únicamente los parámetros mencionados anteriormente, un
servidor postfix ya sería capaz de realizar sus tareas de MTA. Estando a la espera de que un cliente de correo
los descargue a su destinatario (mediante un protocolo de obtención de correo electrónico como POP o IMAP),
los mensajes se almacenan en el directorio/var/mail con el nombre del usuario destinatario.
Para comprobar el funcionamiento hasta el momento del proceso de configuración, se puede mandar un email
desde un cliente SMTP (Outlook, Thunderbird, etc.) configurado para que utilice el servidor postfix como
servidor SMTP. La lectura de mensajes a este nivel de configuración sólo puede hacerse desde una sesión
shell en el servidor postfix con el comando mail. El comando mailse explica en la sección de clientes de
correo. Los requerimientos de la certificación LPI establecen que hay que tener conocimientos básicos de este
comando.
Se puede comprobar la configuración real de un servidor postfix para detectar problemas importantes de
funcionamiento (directorios inexistentes, etc.) y los parámetros aplicados por el servidor desde el
archivo [Link].
Comprobación del entorno funcional
postfix check
Parámetros reales
postconf -n
Se ha visto anteriormente que el archivo [Link] tenía que albergar en la directiva mydestinationel nombre
del dominio de correo gestionado. Este dominio principal, coherente con el nombre completo del servidor, se
llama dominio canónico. Si se desea administrar otros dominios habrá que declararlos primeramente usando
la directiva virtual_alias_domain.
Donde dominio2 y dominio3 representan los dominios virtuales gestionados por el servidor.
A continuación hay que especificar qué cuenta de usuario se asigna a qué cuenta de correo y para qué
dominio. Esta asociación debe hacerse en un archivo cuyo nombre y ubicación estén especificados por la
directiva virtual_alias_maps en el archivo de configuración [Link]. El nombre que se suele utilizar para este
archivo es /etc/postfix/virtual.
virtual_alias_maps = hash:/etc/postfix/virtual
dirección_de_correo1 cuenta_linux
dirección_de_correo2 cuenta_linux
Creación
del
root@servidor# cat /etc/postfix/virtual archivo
toto@[Link] toto de alias
titi@[Link] titi en un
usuario@[Link] usuario
formato
root@servidor#
que
pueda
utilizar
postfix
postmap /etc/postfix/virtual
Este comando crea un archivo en formato Berkeley DB a partir del archivo de alias en texto plano.
El comando postmap crea el archivo [Link] a partir del archivo en texto plano virtual.
3. Gestión de cuotas
Se puede limitar el espacio de disco consumido por las cuentas de correo. Esta limitación se establece
fácilmente mediante el parámetro mailbox_size_limit en el archivo de configuración. Del mismo modo, se
puede limitar el tamaño de un mensaje con el parámetro message_size_limit.
mailbox_size_limit = tamaño_máx_cuenta
message_size_limit = tamaño_máx_correo
1. El comando mail
En un modo de funcionamiento normal, un MTA tiene que gestionar el correo que llega del exterior y enviar el
correo de salida, pero tareas como la redacción de correos o la lectura de los correos entrantes se realizan
desde un cliente de correo con el que el usuario pueda trabajar con más comodidad. Sin embargo, hasta que
se configure un cliente de correo para enviar correos y se instale un servidor de recepción de correo para recibir
correo en los clientes, es práctico poder utilizar el comando tradicional mail directamente desde el servidor.
El comando mail permite enviar correos electrónicos de forma bastante cómoda. Se puede redactar y enviar el
correo con una línea de comando única, pero generalmente es más cómodo utilizar el comando de forma
interactiva.
Introduzca el comando mail seguido del nombre del destinatario. Puede ser el nombre simple
de la cuenta de usuario o la dirección de correo del destinatario.
A continuación, redacte su mensaje con tantas líneas como desee. No aparecerá ningún tipo
de indicación para esta introducción de datos.
Una vez haya terminado, en una nueva línea, introduzca el carácter punto "." únicamente en
su línea.
Si aparece la indicación "Cc:", introduzca si fuera necesario los destinatarios en copia. (Cc
significa Carbon copy o copia de carbón como en la época en la que las fotocopiadoras no
existían). Si no hay que incluir en copia a ningún destinatario, pulse simplemente enter.
El uso del comando mail para su uso en pruebas permite ganar una cantidad de tiempo nada despreciable.
Usuario
.
Cc:
alfa:/home/usuario#
Más aún que para el envío de correos, el comando mail es útil para leer los correos recibidos sin necesidad de
instalar un servicio de recepción de correo. En efecto, un cliente de correo puede enviar fácilmente un mail
dirigiéndose directamente al MTA usando SMTP. En cambio, en lo que se refiere a la lectura de mensajes
recibidos desde un cliente de correo, hay que poder dirigirse al servidor con un protocolo de recepción: POP o
IMAP. Si no hay ningún servidor POP o IMAP instalado, el comando mail es la solución más práctica para leer
correos.
Lectura de un correo recibido con el comando mail
toto@alfa:~$ mail
Mail version 8.1.2 01/15/2001. Type ? for help.
"/var/mail/toto": 4 messages 4 new
>N 1 usuario@[Link] Sun Aug 6 13:12 15/398 hola
N 2 usuario@[Link] Sun Aug 6 15:24 17/438 Comida hoy
N 3 usuario@[Link] Sun Aug 6 19:10 14/402 Hello
N 4 usuario@[Link] Sun Aug 6 19:10 14/412 Are you Chip or Dale ?
&2
Message 2:
From usuario@[Link] Sun Aug 6 [Link] 2011
X-Original-To: toto
To: toto@[Link]
Subject: Comida hoy
Date: Sun, 6 Aug 2011 [Link] +0100 (CET)
From: usuario@[Link] (root)
Buenas,
Si quieres venir a comer hoy con nosotros dinos algo.
Usuario
&q
Saved 1 message in /home/toto/mbox
Held 3 messages in /var/mail/toto
toto@alfa:~$
a. Formato mbox
El formato mbox se utiliza para almacenar los mensajes recibidos por un usuario. Es un formato rudimentario
y bastante antiguo, en el que todos los mensajes se concatenan y un único archivo contiene todos los
correos recibidos. Este formato tiene como ventaja su simplicidad y se puede usar fácilmente, incluso con un
simple editor de texto (basta con detectar el correo buscado en el contenido del archivo). El comienzo de un
mensaje se detecta mediante la secuencia de caracteresFrom al principio de línea. En cambio, presenta
limitaciones inherentes a su modo de funcionamiento. El acceso desde varios programas al archivo es muy
peligroso, debido a que cualquier operación de escritura en un archivo en formato mbox desde dos programas
distintos dejaría el archivo corrupto y, por consiguiente, conduciría a la pérdida de la cuenta de correo. Por
ello, hay mecanismos de bloqueo para el archivo mbox, pero lamentablemente puede que haya programas
distintos que no reconozcan el mismo mecanismo de bloqueo y terminaríamos de todos modos en una
situación catastrófica. La solución a estos problemas la proporciona el formato maildir.
b. Formato maildir
El formato maildir utiliza una estructura de directorios para almacenar los correos recibidos para un usuario. A
diferencia del formato mbox, maildir utiliza un archivo por correo recibido. Cualquier operación realizada en un
mensaje no afecta, por tanto, al resto de datos.
Un directorio en formato maildir contiene tres subdirectorios: tmp, new y cur. Los correos se almacenan
inicialmente en tmp y después se mueven a new. Finalmente, después de haber sido leídos por un programa
del usuario, los mensajes se mueven a cur. Los correos se guardan en su directorio de asignación con un
nombre único sin relación alguna con el asunto del correo.
Por defecto, postfix utiliza el formato mbox para almacenar los correos recibidos por los usuarios. Sin
embargo, se puede hacer (y a menudo se recomienda) que utilice el formato maildir en su lugar. Esta
operación se realiza simplemente mediante una declaración en el archivo [Link]. El directorio Maildir se
creará entonces en el directorio personal del usuario con la recepción del primer correo.
home_mailbox = Maildir/
El comando mail usa únicamente el formato mbox. Por lo tanto no se puede utilizar si se usa
el formato maildir. En ese caso, los mensajes deberán obtenerse mediante el uso de algún
medio compatible, como por ejemplo un servidor POP o IMAP que sea compatible con maildir.
3. Procmail
Se puede indicar al MTA que procese los mensajes entrantes antes de almacenarlos. Postfix puede designar a
un programa de terceros para este propósito. El más conocido de todos ellos es procmail. Basta con solicitar a
postfix que utilice procmail (es fácil) y configurarlo para que realice un procesado con los correos entrantes (un
poco más difícil). Este procesado puede ser de reorganización (poner ciertos mensajes en directorios), de
filtrado (rechazar mensajes que contienen palabras prohibidas) o incluso llamar a otro programa para aplicar un
procesado más pesado que procmail no sabría hacer por sí solo.
mailbox_command = /usr/local/bin/procmail
b. Configurar procmail
La configuración completa de procmail sobrepasa el alcance de la certificación LPI nivel 2 y, por tanto, de este
libro. Sin embargo, se pueden aplicar algunos ejemplos de configuración simples sin dificultad.
Procmail lee su configuración del archivo .procmailrc que se encuentra en el directorio local del usuario. Este
archivo contiene reglas que se aplicarán secuencialmente para todo correo entrante. El procesado se detiene
cuando se satisface alguna regla.
:0 flags
condición
acción
Ejemplos
Archivo ~/.procmailrc: opciones y parámetros
de reglas
:0 Señal que marca el comienzo de una regla de procesado. en el
archivo
flags Opcional. Sobre qué debe aplicarse la búsqueda. Valor H para la
cabecera solamente, B para el cuerpo del mensaje.
condición Expresión regular que permite aislar los correos que se verán afectados
por la regla.
~/.procmailrc
En el ejemplo siguiente, la búsqueda se realiza sólo en la cabecera del mensaje (es el valor por defecto) y
seleccionará los correos que contengan las palabras "From" al comienzo de la línea y la cadena de caracteres "toto"
en la misma línea. La tercera línea de la condición moverá el correo al directorio amigos/toto en el directorio de
correo (y por lo tanto al subdirectorio del buzón de entrada en el cliente de correo).
Para la
:0
* ˆFrom.*toto
amigos/toto
:0
* < 1000
| /usr/bin/lp
4. Alternativas al correo
Durante mucho tiempo, la cantidad de recursos que consumía la infraestructura de correo, tanto en espacio de
disco como en ancho de banda en la red, era un problema para los administradores. Aparecieron comandos
alternativos que permitían a los usuarios conectados comunicarse de forma independiente al sistema de correo
y con un consumo de recursos mucho inferior.
a. write y wall
Se pueden enviar mensajes cortos con los comandos write y wall. El comando write permite enviar un
mensaje a un usuario conectado, mientras que wall (write all) difunde el mensaje a todos los usuarios
conectados.
write nombre_usuario
(introducir el mensaje terminándolo con Ctrl-D)
Donde nombre_usuario representa un usuario del sistema conectado a una sesión interactiva,
yarchivo_mensaje el archivo que contiene el texto que se enviará.
wall
(introducir el mensaje terminándolo con Ctrl-D)
b. issue e [Link]
El contenido del archivo /etc/issue se muestra antes de la solicitud de identificación local y ofrece una posible
comunicación con los usuarios.
c. motd
El contenido del archivo /etc/motd (Message Of The Day) se visualiza después de la apertura de una sesión
con éxito.
Recepción remota de mensajes
Cuando un mensaje llega al MTA, desde un punto de vista MTA ya ha llegado a destino. Por tanto, el MTA lo
guarda en su disco local, en nuestro caso en formato mbox o maildir. Si se instala un servidor POP o IMAP, su
función será, después de haber identificado el usuario, buscar los mensajes entrantes en este espacio de
almacenamiento y proporcionárselos al cliente de correo.
a. El protocolo POP3
El protocolo POP3 funciona a través del puerto 110 y usa TCP como protocolo de transporte. Descarga los
mensajes desde un buzón de usuario a un cliente de correo. A continuación, normalmente se borran los
correos del buzón, liberando espacio de disco del servidor. Sin embargo, cada vez es más frecuente configurar
POP desde el cliente para que deje una copia de los correos en el servidor.
b. El protocolo IMAP4
El protocolo IMAP4 funciona a través del puerto 143 y usa TCP como protocolo de transporte. Descarga las
cabeceras de los correos desde el servidor y el cliente decide a continuación la acción que desea realizar con
estos mensajes: consultarlos, borrarlos, moverlos, etc. Los mensajes se conservan en el servidor, pero se
puede configurar los clientes IMAP para que sincronicen los mensajes descargados para una consulta sin
conexión.
Los servicios courier-pop y courier-imap encontrarán los correos entrantes exclusivamente en un directorio en
formato maildir. No son compatibles con el formato mbox. Por tanto, habrá que configurar postfix para que
utilice el formato maildir.
b. Configuración de servicios
Ésta es la buena noticia: en principio sólo hay que instalar el servicio e iniciarlo. Los parámetros por defecto
son adecuados para el modo de funcionamiento estándar. Los archivos de configuración generalmente se
encuentran en el directorio /etc/courier y se llaman pop3d para el servicio POP e imapd para el servicio
IMAP.
Si el directorio de almacenamiento de los correos en formato maildir no debe usar el nombre por
defecto (Maildir), hay que especificar en estos archivos de configuración el nombre usado realmente.
MAILDIRPATH=nombredirmaildir
Donde nombredirmaildir representa el directorio usado para almacenar los correos recibidos en formato
maildir.
Si el servidor dispone de varias interfaces físicas, se puede limitar las interfaces de escucha del daemon imap.
address = dirección_interfaz
Donde dirección_interfaz representa la dirección IP de la interfaz válida para establecer las conexiones con los
clientes.
c. Validación de la autentificación
Donde usuario y contraseña son las credenciales de autentificación que presenta el cliente de correo para
conectarse usando imap o pop al servidor.
3. Servidor Dovecot
Dovecot es otro servidor de recuperación de correo que hay que conocer para la certificación LPI. Se ha
desarrollado con el objetivo de proporcionar el máximo rendimiento y seguridad. Su despliegue es
relativamente simple, pero es tan rico funcionalmente que las posibilidades de configuración son innumerables
y, a menudo, desalentadoras.
a. Configuración de Dovecot
disable_plaintext_auth = no
Esta línea puede añadirse en cualquier parte del archivo de configuración, pero generalmente está
comentada en los archivos de configuración por defecto facilitados con los paquetes.
b. Visualización de la configuración
El número de parámetros definidos en el archivo [Link] puede ser impresionante y hacer que su
interpretación se vuelva difícil. Además, puede ser útil comprobar un parámetro de configuración sin tener que
recorrer las decenas o centenas de líneas del archivo. El comandodovecot llamado con la opción -a permite
ver los parámetros reales del servidor.
alfa:/etc/dovecot# dovecot -a | wc -l
139
alfa:/etc/dovecot# dovecot -a | head -20
# 1.0.15: /etc/dovecot/[Link]
base_dir: /var/run/dovecot
log_path:
info_log_path:
log_timestamp: %Y-%m-%d %H:%M:%S
syslog_facility: mail
protocols: imap imaps pop3 pop3s
listen: *
ssl_listen:
ssl_disable: no
ssl_ca_file:
ssl_cert_file: /etc/ssl/certs/[Link]
ssl_key_file: /etc/ssl/private/[Link]
ssl_key_password:
ssl_parameters_regenerate: 168
ssl_cipher_list:
ssl_verify_client_cert: no
disable_plaintext_auth: no
verbose_ssl: no
shutdown_clients: yes
alfa:/etc/dovecot#
Comprobación de los conocimientos adquiridos:
preguntas/respuestas
Ponga a prueba sus conocimientos respondiendo a las preguntas siguientes. Estas preguntas no siempre
esperan una respuesta cerrada. Las preguntas planteadas en la certificación, a pesar de que abordan los
mismos temas, en su mayoría serán planteadas en forma de preguntas de opción múltiple o que requieran una
respuesta corta, en palabras escritas en el teclado.
1. Preguntas
1 En el funcionamiento de un servidor de correo de tipo MTA, ¿a qué se llama generalmente un alias?
3 ¿Se puede gestionar con postfix un dominio de correo en una red local pero presentarlo al exterior con
otro nombre más adecuado?
4 Cuando un servidor postfix recibe un mensaje, ¿cómo sabe que debe tratarlo personalmente y no
reenviarlo?
5 ¿Se puede comprobar la validez de la configuración de un servidor postfix sin tener que iniciar el
servicio?
6 En la sintaxis SMTP o cuando se envía un correo con el comando mail, ¿cómo se indica que se ha
terminado la redacción del mensaje?
8 Si un administrador quiere enviar un mensaje urgente a todos los usuarios conectados en modo consola
(local, telnet o ssh), ¿dispone de alguna alternativa al envío de un mensaje con SMTP?
9 ¿Qué diferencia hay entre el contenido del archivo /etc/issue y el del archivo /etc/motd?
10 ¿Se puede comprobar la autentificación a través de los servidores courier (Courier-POP y Courier-IMAP)
sin tener que configurar un cliente de correo?
2. Respuestas
1 En el funcionamiento de un servidor de correo de tipo MTA, ¿a qué se llama generalmente un alias?
Es la asociación de una identidad con una cuenta existente. Por ejemplo, generalmente se debe poder enviar
un mensaje a la dirección de servicio webmaster@[Link]. Para que el webmaster no tenga que consultar su
cuenta personal y la de webmaster, se crea un alias entre ambas identidades.
La generalización del spam ha complicado un poco el envío de mensajes por Internet con el protocolo SMTP. Si
la dirección IP pública asignada a una organización por su proveedor de servicios de Internet tiene un dudoso
pasado, puede que la dirección en cuestión esté en una blacklist y, por tanto, los MTA correspondientes la
rechazarán. Traspasar todo mensaje saliente a su proveedor de servicios de Internet para que se encargue de
enviarlo es una solución interesante si no desea iniciar un procedimiento para eliminar la dirección IP de las
blacklists.
3 ¿Se puede gestionar con postfix un dominio de correo en una red local pero presentarlo al exterior con
otro nombre más adecuado?
Sí, para ello hay que informar la directiva myorigin en el archivo de configuración de postfix. Es un
comportamiento común, por ejemplo cuando una empresa cambia de nombre.
4 Cuando un servidor postfix recibe un mensaje, ¿cómo sabe que debe tratarlo personalmente y no
reenviarlo?
Compara el dominio de destino anunciado (los caracteres escritos a continuación de la arroba) con los definidos
por la directiva mydestination en el archivo de configuración de postfix. Si son idénticos, el servidor postfix
sabe que es el responsable de tratar el mensaje.
5 ¿Se puede comprobar la validez de la configuración de un servidor postfix sin tener que iniciar el servicio?
Sí, con el comando postfix check. También se pueden visualizar los parámetros reales de la configuración con el
comando postconf -n.
6 En la sintaxis SMTP o cuando se envía un correo con el comando mail, ¿cómo se indica que se ha
terminado la redacción del mensaje?
Escribiendo una línea que consista únicamente en un punto. El punto tiene que ser el carácter único en la
línea, validado inmediatamente con un retorno de carro.
Llamando al comando de gestión de procmail. Se tiene que hacer referencia a procmail en el archivo de
configuración postfix y poseer también su propio archivo de reglas.
8 Si un administrador quiere enviar un mensaje urgente a todos los usuarios conectados en modo consola
(local, telnet o ssh), ¿dispone de alguna alternativa al envío de un mensaje con SMTP?
Sí, el antiguo comando wall se creó para ello. Envía un mensaje a todos los usuarios conectados. Se emplea
frecuentemente antes de reiniciar el sistema o detener un servicio.
9 ¿Qué diferencia hay entre el contenido del archivo /etc/issue y el del archivo /etc/motd?
Los dos se muestran a los usuarios que se conecten al sistema, pero /etc/issue se muestra antes de la
apertura de sesión -y por tanto todos los usuarios lo pueden ver- mientras que el contenido del archivo
/etc/motd sólo es visible a través de una apertura de sesión con éxito.
10 ¿Se puede comprobar la autentificación a través de los servidores courier (Courier-POP y Courier-IMAP)
sin tener que configurar un cliente de correo?
Sí, el comando authtest realiza esta comprobación. No determina un éxito funcional completo en producción,
pero por lo menos comprueba que las librerías de autentificación de courier están instaladas y configuradas
correctamente.
Trabajos prácticos
Con el fin de mejorar la comunicación dentro de la empresa, se le pide que despliegue un servicio de correo.
Si el asistente de instalación le realiza alguna pregunta, elija "Sin configuración" para indicar que desea realizar
la configuración usted mismo.
Observe que la instalación de postfix incluye la eliminación del servicio de correo nativo Exim de las distribuciones
Debian.
Comandos útiles
postconf
postfix
tail
vi
Archivo útil
[Link]
Operaciones
2. En el archivo [Link], indicar que los correos vendrán del dominio [Link].
3. En el archivo [Link], indicar que el servidor gestionará los correos con destino el
dominio [Link].
myorigin = [Link]
mydestination = [Link]
mynetwork = [Link]/24
alfa:/etc/postfix# postconf -n
config_directory = /etc/postfix
mydestination = [Link]
myorigin = [Link]
alfa:/etc/postfix#
Inicio
del
alfa:/etc/postfix# postfix check servicio
alfa:/etc/postfix# y
comprobación:
c.
Gestión
alfa:/etc/postfix# /etc/init.d/postfix start de los
Starting Postfix Mail Transport Agent: postfix. alias
alfa:/etc/postfix# tail -1 /var/log/syslog
postfix
Aug 12 [Link] alfa postfix/master[5008]: daemon started --
version 2.5.5, configuration /etc/postfix
alfa:/etc/postfix#
/etc/aliases
postalias
Operaciones
2. Crear la base de datos alias que deberá utilizar el servicio postfix a partir de su
inicio.
d.
Integración DNS
Para que se puedan enviar mensajes desde otros MTA, decide crear un registro MX para hacer referencia a su
dominio.
Comandos útiles
rndc
vi
Operaciones
3. Recargue la zona.
$TTL 86400
[Link]. IN SOA [Link]. [Link]. (
15
604800
86400
2419200
86400 )
[Link]. IN NS [Link].
[Link]. IN NS [Link].
[Link]. IN A [Link]
[Link]. IN A [Link]
servidor-a IN CNAME [Link].
client IN A [Link]
publico IN CNAME beta
privado IN CNAME beta
[Link]. IN MX 10 [Link].
e.
Envío y
alfa:/etc/bind# rndc reload
server reload successful
alfa:/etc/bind#
Comandos útiles
adduser
su
Operaciones
Envío
de un
alfa:~# adduser titi correo
Añadiendo el usuario `titi’ ... por
Añadiendo el nuevo grupo `titi’ (1002) ...
parte
Añadiendo el nuevo usuario `titi’ (1002) con grupo `titi’ ...
del
Creando el directorio personal `/home/titi’ ...
usuario
Copiando los archivos desde `/etc/skel’ ...
Introduzca la nueva contraseña de UNIX:
Vuelva a escribir la nueva contraseña de UNIX:
passwd: contraseña actualizada correctamente
Cambiando la información de usuario para titi
Introduzca el nuevo valor, o presione ENTER para el predeterminado
Nombre completo []: titi
Número de habitación []:
Teléfono del trabajo []:
Teléfono de casa []:
Otro []:
¿Es correcta la información? [S/n] S
alfa:~#
usuario:
usuario@alfa:~$ whoami
usuario
usuario@alfa:~$
usuario@alfa:~$ mail titi
Subject: Buenas
Solamente comprobar si funciona.
.
Cc:
usuario@alfa:~$
f. Paso
de
usuario@alfa:~$ whoami postfix
usuario al
usuario@alfa:~$ su - titi
Contraseña:
titi@alfa:~$ whoami
titi
titi@alfa:~$ mail
Mail version 8.1.2 01/15/2001. Type ? for help.
"/var/mail/titi": 1 message 1 new
>N 1 usuario@[Link] Thu Aug 12 15:17 15/428 Buenas
&1
Message 1:
From usuario@[Link] Thu Aug 12 [Link] 2010
X-Original-To: titi
To: titi@[Link]
Subject: Buenas
Date: Thu, 12 Aug 2010 [Link] +0200 (CEST)
From: usuario@[Link] (usuario)
&q
Saved 1 message in /home/titi/mbox
titi@alfa:~$
formato maildir
/etc/postfix/[Link]
vi
Operaciones
2. Reiniciar el servicio.
Reinicio
del
myorigin = [Link]
mydestination = [Link]
mynetwork = [Link]/24
home_mailbox = Maildir/
servicio:
2.
alfa:/etc/postfix# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
alfa:/etc/postfix#
alfa:/etc/postfix# tail -1 /var/log/syslog
Aug 12 [Link] alfa postfix/master[5101]: daemon started --
version 2.5.5, configuration /etc/postfix
alfa:/etc/postfix#
Acepte
todas
alfa:~# apt-get install courier-imap las
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes extras:
courier-authdaemon courier-authlib courier-authlib-userdb courier-base
expect fam libfam0 libltdl3 tcl8.4
(...)
El envío de este mensaje nos servirá para comprobar la correcta configuración del servidor IMAP.
Comandos útiles
su
Operaciones
c.
Gestión
alfa:~# su - titi de
titi@alfa:~$ whoami correo
titi desde
titi@alfa:~$ mail usuario la
Subject: Hola usuario
Espero que el cliente de correo funcione correctamente.
.
Cc:
titi@alfa:~$
estación de trabajo
Para comprobar el funcionamiento del servidor imap, debe configurar un cliente de correo en la estación de
trabajo.
El paquete Evolution es el cliente de correo por defecto pero puede utilizar cualquier tipo de cliente imap.
Comandos útiles
Operaciones
2. Utilizar todos los parámetros por defecto, a excepción de la identidad del usuario
(usuario), el servidor IMAP (dirección IP o nombre DNS del servidor alfa) y el
servidor SMTP (dirección IP o nombre DNS del servidor alfa).
alfa:~# su - titi
titi@alfa:~$ mail usuario
Subject: Prueba 2
bla
.
Cc:
titi@alfa:~$
1. Requisitos
Los conocimientos adquiridos con la certificación LPI de nivel 1, especialmente:
2. Objetivos
Al final del capítulo, será capaz de:
Sabemos que cualquier sistema Linux presenta un sistema de archivos virtual /proc que permite observar en directo un cierto número
de componentes y parámetros. La activación del enrutamiento se realiza modificando el contenido
del archivo /proc/sys/net/ipv4/ip_forward. Este archivo contiene un solo carácter que por defecto es 0 para indicar que el
enrutamiento está inactivo.
Una vez se ha realizado el cambio, la máquina Linux está lista para enrutar paquetes que lleguen a sus interfaces. Este parámetro es
volátil y se perderá una vez que la máquina se detenga. Sin embargo, se puede anular el enrutamiento realizando la operación
inversa.
Otra posibilidad es usar el comando sysctl que permite modificar dinámicamente los parámetros funcionales del núcleo. sysctl permite
modificar directamente todos los archivos que se encuentran en la estructura de directorios que cuelga de /proc/sys.
sysctl net.ipv4.ip_forward=1
Estos comandos son efectivos durante toda la duración de la sesión y deben volver a introducirse después de cada reinicio. Por
supuesto, se pueden poner en un script de servicio llamado en el arranque, o modificar el archivo /etc/[Link].
net.ipv4.ip_forward = 1
En este punto, el router Linux es perfectamente capaz de enrutar paquetes. Sin embargo, sólo podrá hacerlo a redes conocidas, es
decir, referenciadas en su tabla de enrutamiento.
La tabla de enrutamiento se mantiene en memoria, pero se puede consultar usando varios comandos.
route -n
El parámetro -n es opcional, pero sirve para ahorrar mucho tiempo en la visualización, ya que no fuerza a que el comando intente
resolver los nombres de las redes devueltas. Además, si la dirección en cuestión no se informa en una zona DNS inversa, esta petición
se realiza en vano y hay que esperar varios segundos para que se muestre la salida del comando.
netstat -nr
Donde la opción -r hace que el comando muestre la tabla de enrutamiento y -n evita que se realice la resolución de nombres.
El comando netstat tiene muchos posibles usos, pero a menudo se utiliza en este simple contexto de consulta de la tabla de
enrutamiento.
A menudo, la visualización de la tabla de enrutamiento es el único método sencillo para consultar el valor de la puerta de enlace
predeterminada.
beta:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
[Link] [Link] [Link] U 0 0 0 eth1
[Link] [Link] [Link] U 0 0 0 eth0
[Link] [Link] [Link] UG 0 0 0 eth0
c. Gestión de rutas estáticas
Las únicas entradas presentes de forma automática en la tabla de enrutamiento son las redes a las que el router está conectado
directamente, así como la puerta de enlace predeterminada. Por tanto, el router puede usar estas entradas de la tabla de
enrutamiento sin necesidad de otra configuración. Si el router tiene que enrutar paquetes a otras redes, habrá que añadir de forma
manual las rutas en la tabla de enrutamiento.
red_objetivo La dirección de red que la nueva ruta permitirá alcanzar. route add -net [Link] gw router
máscara La máscara de subred asociada a la nueva ruta.
En la segunda sintaxis, [Link]
gw router Indica el router que se utilizará para alcanzar la red objetivo. representa la ruta por defecto.
Esta representación de la ruta
por defecto es universal y se puede aplicar en casi la totalidad de sistemas que usen un tabla de enrutamiento IP.
Por supuesto, también se pueden eliminar las rutas estáticas que ya no sean necesarias o que estén guardadas por error.
beta:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
[Link] [Link] [Link] U 0 0 0 eth1
[Link] [Link] [Link] U 0 0 0 eth0
[Link] [Link] [Link] UG 0 0 0 eth0
beta:~# route add -net [Link] netmask [Link] gw [Link]
beta:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
[Link] [Link] [Link] U 0 0 0 eth1
[Link] [Link] [Link] U 0 0 0 eth0
[Link] [Link] [Link] UG 0 0 0 eth1
[Link] [Link] [Link] UG 0 0 0 eth0
2. Iptables
Iptables se utiliza para gestionar el filtrado de paquetes IP en un sistema Linux. Usa un solo comando: iptables, y se configura
mediante la aplicación de reglas de gestión de paquetes. Iptables puede filtrar el tráfico que transita por un router Linux, pero también
el tráfico entrante y saliente de cualquier servidor o estación de trabajo en una sola interfaz.
Aunque iptables constituye una herramienta muy potente de gestión del tráfico, esta ventaja hace que su archivo de configuración sea
todo excepto intuitivo. Sin embargo, con una aproximación estructurada se puede aprender su funcionamiento bastante rápido. Los
siguientes párrafos exponen los conceptos fundamentales de iptables, para utilizarlos más tarde en configuraciones de cortafuegos.
a. Tablas
Iptables se basa en tablas asociadas a un modo funcional. Según el tipo de regla que se desea añadir en el funcionamiento de
iptables, se precisará la tabla asociada. Las tablas principales utilizadas son filter para filtrar paquetes y nat para la traducción de
direcciones entre una red privada y una red pública.
La tabla filter es la tabla por defecto. Por ello, cuando se establece una regla de iptables con el objetivo de filtrar paquetes, se
sobreentiende y, por consiguiente, no se detalla.
La tabla nat sirve para traducir direcciones y debe precisarse sistemáticamente cuando se invoca.
b. Cadenas
Una cadena de iptables representa un tipo de tráfico desde el punto de vista de su circulación por una máquina. Las cadenas permiten
especificar si una regla debe aplicarse al tráfico que entra en una máquina, que sale o que la cruza.
La cadena INPUT identifica el tráfico entrante, la cadena OUTPUT identifica el tráfico saliente y la cadena FORWARD identifica el
tráfico que atraviesa la máquina, entrando por una interfaz y saliendo por otra. Atención, aunque un paquete que atraviesa el router
es desde un punto de vista físico respectivamente entrante, encaminado y saliente, iptables lo considera solamente como encaminado
(cadena FORWARD). Las cadenas INPUT y OUTPUT se reservan al tráfico con origen o destino explícito el host al que se le aplican las
reglas.
También hay otra cadena llamada POSTROUTING que se utiliza en la configuración de NAT y tiene como objetivo tratar paquetes
después de una operación de enrutamiento.
c. Acciones
Cuando se satisface una regla, el sistema genera una acción sobre el paquete comprobado. Las acciones principales son ACCEPT que
permite el paso del paquete y DROP, que lo destruye.
En la sintaxis de iptables, la acción (target en el manual en línea) se anuncia con el parámetro -j.
d. Tratamiento de reglas
Se aplican las reglas una por una para cada paquete filtrado. Si se satisface una regla, se genera una acción sobre el paquete y
finaliza su tratamiento. Si no se satisface, se comprueba la siguiente regla. En el caso que ninguna regla se haya satisfecho, el
paquete recibe un tratamiento por defecto configurado con una regla específica llamada "política" (policy).
Se pueden mostrar las reglas aplicadas en orden para cada una de las cadenas.
iptables -L
Este ejemplo muestra las reglas activas en un sistema Linux sin configurar. Se ve la política aplicada para cada una de las cadenas y se
comprueba la ausencia de reglas de filtrado.
alfa:~# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
alfa:~#
Administración de un cortafuegos con iptables
1. Políticas
Un cortafuegos puede funcionar según dos modelos distintos: "todo lo que no está autorizado está
prohibido" o "todo lo que no está prohibido está autorizado". Para definir el comportamiento por defecto,
iptables permite definir para cada cadena una acción por defecto.
Donde cadena representa el tipo de tráfico (INPUT, OUTPUT y FORWARD), y acción el comportamiento deseado
(DROP o ACCEPT).
En este ejemplo, se prohíbe todo el tráfico saliente del host aplicando una política de descarte de
paquetes salientes.
Si el host que se desea configurar se sabe que se convertirá en un cortafuegos, es probable que todo el
tráfico esté prohibido por defecto. Esta configuración común consiste en establecer para las tres
cadenas INPUT, OUTPUT y FORWARD una política de descarte de paquetes.
2. Filtrado de paquetes
a. Política y reglas
Después de haber configurado una política que describe el comportamiento básico del cortafuegos, hay que
crear las reglas específicas para el tráfico que se desea dejar pasar o prohibir. La filosofía del cortafuegos es:
se define el comportamiento general con las políticas y se gestiona caso por caso el comportamiento
específico con reglas.
b. Creación de reglas
Para cada elemento de tráfico que debe estar permitido o prohibido, habrá que crear una regla específica.
Cada tipo de flujo tiene que ser el objetivo de una regla de iptables.
Autorización del tráfico http que pase por la máquina con origen una red determinada
c. Gestión de reglas
Las reglas se aplican en su orden de creación y el sistema les asigna automáticamente un número de orden.
Donde condiciones representa los criterios de selección del paquete sometido a la regla (direcciones IP,
puertos y protocolos).
La gestión dinámica de reglas es tan pesada que su uso se ha establecido en un archivo de script que incluye todas
las reglas y se recarga por completo después de cada cambio.
En la mayoría de las aplicaciones de red, un host envía un paquete con destino otro host que le responde.
Por lo tanto, se establece una comunicación bidireccional. Ahora bien, en la configuración de un cortafuegos,
se visualiza perfectamente la comunicación de ida: por ejemplo, desde un navegador a un servidor web a
través del puerto 80, en cambio no se ve tan bien las respuestas que se realizan por un puerto aleatorio, por
iniciativa del cliente, mayor que 1024.
En los inicios de los cortafuegos, la solución consistía en autorizar cualquier tráfico entrante cuyo puerto era
superior al 1024. Los cortafuegos tenían entonces más tendencia a impedir a los usuarios salir antes que
evitar las intrusiones en la red.
Pasados unos años, los cortafuegos llamados "stateful" (con estado) son capaces de autorizar
dinámicamente los flujos de retorno siempre que sean respuesta a un flujo de salida explícitamente
autorizado.
La opción -m state permite realizar un filtro en función del estado del paquete tratado. Los estados
aceptados son ESTABLISHED y RELATED y representan respectivamente paquetes en respuesta a un flujo
autorizado y paquetes enviados para una nueva conexión, pero con la iniciativa de una conexión establecida
y autorizada (por ejemplo el tráfico de datos ftp relativo al tráfico de comandos ftp).
Se configura en este caso el cortafuegos para que no deje pasar nada, a excepción de las respuestas a cada una de
las comunicaciones establecidas, así como los protocolos necesarios para navegar por Internet (http, https y dns).
En este
alfa:~# iptables -P INPUT DROP
alfa:~# iptables -P OUTPUT DROP
alfa:~# iptables -P FORWARD DROP
alfa:~# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
alfa:~# iptables -A FORWARD -s [Link]/24 -p tcp --dport 80 -j ACCEPT
alfa:~# iptables -A FORWARD -s [Link]/24 -p tcp --dport 443 -j ACCEPT
alfa:~# iptables -A FORWARD -s [Link]/24 -p udp --dport 53 -j ACCEPT
ejemplo, se configura el cortafuegos para que no deje pasar nada excepto las respuestas a los tráficos
establecidos, así como los protocolos necesarios para navegar por Internet (http, https y dns).
3. Gestión de NAT
NAT consiste en reescribir la cabecera IP de un paquete que viaja de una red pública a una red privada y
viceversa.
Las direcciones IP privadas no se pueden enrutar por Internet. Un paquete proveniente de una dirección
privada no podría encontrar una ruta de retorno, porque ningún router aceptaría devolverlo a su origen. De
todos modos, las redes privadas se usan en todas partes (hay millones de redes [Link]), sería
imposible mantener en las tablas de enrutamiento de los routers de Internet una ruta coherente con la red
de origen.
La solución para salir de una red privada consiste en reemplazar la dirección IP privada del emisor por la
dirección IP pública (único tipo de dirección en Internet) del router realizando NAT. La trazabilidad de las
traducciones (reemplazo de direcciones IP privadas) se realiza gracias al puerto emisor utilizado: para cada
traducción realizada, el router se guarda en memoria el puerto emisor empleado. Como el paquete de
respuesta llega al router con la dirección pública del mismo y al mismo puerto que usó en la emisión, la
dirección original del cliente se averigua fácilmente por parte del router NAT.
NAT se gestiona en una tabla específica llamada NAT. Cualquier configuración vinculada con NAT se realiza
con el comando iptables especificando que se trabaja en la tabla NAT. Las cadenas que se tratan en la tabla
NAT son PREROUTING, POSTROUTING y OUTPUT, que representan el tráfico que hay que modificar antes
del enrutamiento, después del enrutamiento o directamente en la salida de la máquina.
iptables -t nat -L
iptables -t nat -S
En esta configuración, que también es la más corriente, la dirección IP del emisor de los hosts de la red
privada se reemplaza por la dirección pública del router NAT.
Configuración de NAT
Ejemplo
NAT con iptables: opciones y parámetros
de
-t nat La regla afecta a la tabla NAT.
configuración de NAT
En este
Los sistemas Red Hat y sus derivados ofrecen un servicio iptables que permite aplicar una configuración de
filtrado o NAT automáticamente. El arranque del servicio aplica la configuración y su parada anula todos los
filtros. Este funcionamiento es extremadamente práctico y permite gestionar un cortafuegos RedHat
cómodamente.
Se comprueba bastante rápido que la creación de reglas de filtrado y de NAT con iptables tiene aspectos
pesados. Por consiguiente, después de haber determinado qué reglas se necesitan, es interesante escribirlas
en un script.
Ejemplo de script de configuración de cortafuegos
Este tipo de script no fuerza a que se tengan que gestionar las reglas una por una en el caso de que se modifique la
configuración. Es mucho más fácil insertar una línea en el script que desplazar la numeración de las reglas en
memoria. Sin embargo, hay que anular cualquier regla antes de cada ejecución del script.
Por
#!/bin/bash
# nombre del archivo: /etc/cortafuegos_on
# Política básica
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# NAT con eth0 como interna y eth1 como externa - dirección IP pública fija
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source [Link]
# gestión de paquetes devueltos
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# tráfico saliente autorizado
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p udp --dport 53 -j ACCEPT
También será útil crear un script de anulación de todas las reglas de filtrado. En efecto, puede ser útil
autorizar más o menos provisionalmente todo el tráfico, para una actualización del cortafuegos o para usar
una aplicación puntual.
#!/bin/bash
# nombre del archivo: cortafuegos_off
# Borrado de reglas
iptables -F
# Política permisiva
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#!/bin/bash
# nombre del archivo: cortafuegos
case $1 in
start)
/etc/cortafuegos_on
;;
stop)
/etc/cortafuegos_off
;;
status)
iptables -L
;;
*)
echo "Syntaxis: /etc/init.d/cortafuegos start|stop|status
;;
esac
Detección de intrusiones y de vulnerabilidades
1. Sistemas IDS
Los cortafuegos, en su modo tradicional de funcionamiento, filtran los paquetes según los valores
albergados en las cabeceras de las capas de red o de transporte -y, por tanto, según las direcciones IP o los
puertos usados-. Para evitar la protección que aportan los cortafuegos, muchas aplicaciones usan puertos
comunes (especialmente el 80 tcp) para lograr transmitir su propio tráfico. Los cortafuegos, a menudo
configurados para que dejen pasar los datos por estos puertos comunes, no detectan el peligro.
Para proporcionar un mejor control hay que utilizar un equipamiento más elaborado, capaz de examinar y
analizar el tráfico a nivel de aplicación, de forma directa y sin caer en este engaño del puerto erróneo. Estos
sistemas se llaman Sistemas de Detección de Intrusos, IDS (Intrusion Detection System) en inglés.
b. Técnicas de análisis
Para identificar tráfico perjudicial, los IDS usan tres técnicas: la detección de anomalías, el análisis de
protocolos y el análisis de firmas.
La detección de anomalías tiene como objetivo detectar un comportamiento anormal, como por ejemplo un
volumen de tráfico ICMP desmesurado, que indicaría que es el blanco o el emisor de un ataque por
denegación de servicio.
El análisis de protocolos no busca detectar una acción realmente perjudicial, sino más bien un tráfico de
aplicación que no cumple el estándar del protocolo al pie de la letra. Es como la historia del atracador de
bancos que fue detenido tontamente porque sus neumáticos eran lisos.
c. Fuentes de información
Las técnicas de análisis, que son el análisis de firmas, el análisis de protocolos y la detección de anomalías, se
apoyan en información que evoluciona con el tiempo. Es evidente que el análisis de firmas sólo puede
realizarse si el IDS conoce la firma del ataque en curso. Además, la naturaleza de las amenazas puede
evolucionar. Por ejemplo, un host que enviaba un gran volumen de tráfico SMTP en los años 80 indicaría que
el servidor de correo funcionaba bien. La misma situación hoy en día podría demostrar que el host en cuestión
está infectado por un caballo de Troya y está enviando un gran volumen de SPAM.
Los IDS obligatoriamente tienen que obtener actualizaciones de sus técnicas de análisis así como de las
bases de datos de firmas a intervalos regulares. Los editores de IDS tienen que mantener sistemáticamente
sus bases de datos de información al día y los administradores de IDS tienen que descargar regularmente
estas bases de datos.
Muchas organizaciones, asociaciones y empresas permiten estar al corriente de las evoluciones en materia de
técnicas de intrusión y ataques. Se recomienda conocer la existencia de las principales y, como parte de una
administración de red en la que se tiene en cuenta la seguridad, velar tecnológicamente por estas áreas.
a. Componentes
Snort es el más conocido de los IDS libres. Analiza todo el tráfico y aporta un complemento de seguridad
apreciable (incluso indispensable) en la red. Snort se compone de un motor de análisis y de un conjunto de
reglas.
Snort también dispone del comando oinkmaster para actualizar reglas que tienen su configuración en el
archivo [Link].
SNORT utiliza archivos de reglas que deben descargarse del sitio web del editor.
url = [Link]
Donde archivo_reglas representa el archivo de reglas en formato [Link]. Hay que estar suscrito al editor, pero
hay otras páginas web que ofrecen archivos de actualización gratuitos. Naturalmente, la calidad del
seguimiento depende de los administradores de estos archivos de reglas.
Después de cualquier modificación del archivo de definición de firmas, y a intervalos regulares gracias a una
planificación cron, hay que solicitar a snort que cargue sus nuevas reglas. Esta operación se realiza con el
comando oinkmaster.
Carga de reglas
oinkmaster -o dir_reglas
Donde dir_reglas representa el directorio que contiene las reglas de funcionamiento de snort, suele
ser /etc/snort/rules. Los archivos de reglas deben llamarse desde el archivo [Link] con el
parámetro include, como se hace con los parámetros por defecto y las firmas del editor.
c. Gestión de alertas
Cuando Snort detecta tráfico perjudicial, deja una traza en el archivo de registro a través desyslog y envía
una copia del paquete en un archivo con formato tcpdump (formato libpcap, visualizable con wireshark por
ejemplo). También se puede enviar la información a una base de datos (Oracle, MySQL y PostGreSQL son
algunas de las bases de datos compatibles).
Esta declaración indica que los elementos deben enviarse al servidor syslog cuya dirección IP es ip_servidor con la
categoría "alerta".
3. OpenVAS
OpenVAS (Open Vulnerability Assessment Scanner) es una variante del escáner de vulnerabilidades Nessus. Se
recomienda conocer su existencia en el marco de la certificación LPI.
a. El servidor OpenVAS
El servidor es el corazón de la suite OpenVAS. Escanea y analiza los hosts de red en busca de
vulnerabilidades conocidas (NVT: Network Vulnerability Tests).
b. Clientes OpenVAS
Los clientes OpenVAS son aplicaciones por línea de comandos o con interfaz gráfica que realizan el análisis de
los hosts de la red en busca de vulnerabilidades para devolver los resultados al servidor.
c. Obtención de vulnerabilidades
OpenVas ofrece una fuente pública de vulnerabilidades conocidas con el nombre de OpenVas NVT Feed.
Permite a los servidores estar al corriente de las últimas vulnerabilidades conocidas y contiene más de 15000
NVT.
Comprobación de los conocimientos adquiridos:
preguntas/respuestas
Ponga a prueba sus conocimientos respondiendo a las preguntas siguientes. Estas preguntas no siempre
esperan una respuesta cerrada. Las preguntas planteadas en la certificación, a pesar de que abordan los
mismos temas, en su mayoría serán planteadas en forma de preguntas de opción múltiple o que requieran una
respuesta corta, en palabras escritas en el teclado.
1. Preguntas
1 ¿Un servidor Linux es capaz de enrutar paquetes IP de forma natural?
2 El comando sysctl permite modificar el contenido de ciertos archivos del pseudosistema de archivos /proc.
¿Cómo se construye el parámetro que se le proporciona?
3 ¿Dispone de tabla de enrutamiento un sistema que sólo tiene una tarjeta de red?
4 Si se consulta a iptables con el comando iptables -L, ¿qué tabla de iptables se muestra?
5 Con iptables, ¿cómo se puede aplicar una configuración particular al tráfico con destino el propio
sistema distinta de la configuración aplicada al tráfico enrutado por el sistema?
6 En el contexto de uso de iptables, ¿qué sucede si ninguna de las reglas configuradas para una
cadena se satisface?
7 ¿En qué aspecto se dice que NAT aporta una protección rudimentaria de las redes privadas?
8 La creación manual de reglas en iptables es muy pesada y no siempre se puede predecir qué se
desea filtrar. ¿Cómo se puede automatizar la creación de reglas para bloquear el tráfico molesto?
10 ¿En qué aspecto OpenVAS está bien adaptado para la protección de parques informáticos?
2. Respuestas
1 ¿Un servidor Linux es capaz de enrutar paquetes IP de forma natural?
Sí, pero esta función siempre está desactivada por defecto. Se puede activar modificando el contenido del
archivo /proc/sys/net/ipv4/ip_forward (con el valor 1).
2 El comando sysctl permite modificar el contenido de ciertos archivos del pseudosistema de archivos /proc.
¿Cómo se construye el parámetro que se le proporciona?
Especificando el archivo que se desea modificar dentro de la estructura de carpetas albergada en /proc/sys. En
su ruta hay que reemplazar el separador jerárquico de directorios (la barra) por un punto. El archivo
/etc/[Link] se relee en cada arranque mediante el comando sysctl para tener una aplicación permanente
de estos parámetros.
3 ¿Dispone de tabla de enrutamiento un sistema que sólo tiene una tarjeta de red?
Sí, por supuesto. Cualquier sistema IP dispone de su tabla de enrutamiento. Aunque el sistema no sea
claramente un router (no está conectado a varias redes), tiene que ser capaz de enrutar paquetes a sus redes
de destino. Como mínimo, la tabla de enrutamiento contiene una referencia a la red local y la definición de la
ruta por defecto (pasarela por defecto).
4 Si se consulta a iptables con el comando iptables -L, ¿qué tabla de iptables se muestra?
La tabla filter que, además de estar muy bien, es lo que con mayor frecuencia se desea ver. Sin embargo, este
comportamiento puede dar pie a engaños en el aspecto de que muchos administradores incluso ignoran la
existencia de la tabla nat que puede consultarse con el comando iptables -t nat -L.
5 Con iptables, ¿cómo se puede aplicar una configuración particular al tráfico con destino el propio sistema
distinta de la configuración aplicada al tráfico enrutado por el sistema?
Para ello, hay que gestionar reglas distintas según la cadena que se desea configurar. La cadena INPUT hace
referencia al tráfico con destino el propio sistema, mientras que la cadena FORWARD se aplica al tráfico
enrutado a través del sistema.
6 En el contexto de uso de iptables, ¿qué sucede si ninguna de las reglas configuradas para una cadena
se satisface?
Se aplica la regla por defecto. Las reglas por defecto se describen en las políticas de iptables (policies), definidas
con el parámetro -P. Hay una policy por cadena.
7 ¿En qué aspecto se dice que NAT aporta una protección rudimentaria de las redes privadas?
En el marco de funcionamiento de NAT, las direcciones de las máquinas privadas en la red no van más allá del
router NAT (se reemplazan automáticamente por su dirección pública), lo que proporciona una cierta discreción
de la red privada. Además, un atacante que quiera penetrar en la red privada desde el exterior no sabrá
encontrar la ruta a la red, las direcciones privadas no se pueden enrutar en Internet.
8 La creación manual de reglas en iptables es muy pesada y no siempre se puede predecir qué se desea
filtrar. ¿Cómo se puede automatizar la creación de reglas para bloquear el tráfico molesto?
El programa fail2ban tiene como objetivo la creación de reglas dinámicamente, como por ejemplo una regla que
prohíba el tráfico proveniente de un usuario remoto que ha hecho tres intentos sin éxito de apertura de sesión
SSH.
Organismos de investigación y de vigilancia de la seguridad. Publican los anuncios y los datos técnicos de las
vulnerabilidades descubiertas.
10 ¿En qué aspecto OpenVAS está bien adaptado para la protección de parques informáticos?
Comandos útiles
ifconfig
lspci
shutdown
Operaciones
Comprobación de la interfaz:
b.
[root@beta ~]#
/etc/sysconfig/network-scripts/ifcfg-ethx
ifconfig
ifup
route
vi
Operaciones
[root@beta network-scripts]#
c.
Comandos útiles
ifconfig
ping
Operaciones
Comprobación de la conectividad:
d.
Archivo /etc/network/interfaces
ifconfig
ifup
ifdown
ping
Operaciones
alfa:/etc/network#
Comprobación de la conectividad:
2.
alfa:/etc/network# ifdown eth0
alfa:/etc/network# ifup eth0
alfa:/etc/network# ifconfig eth0
eth0 Link encap:Ethernet HWaddr [Link]
inet adr:[Link] Bcast:[Link] Mask:[Link]
adr inet6: fe80::a00:27ff:fe9c:6e9f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9 errors:0 dropped:0 overruns:0 frame:0
TX packets:159 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:714 (714.0 B) TX bytes:22494 (21.9 KiB)
a. Configuración de NAT
/etc/[Link]
/proc/sys/net/ipv4/ip_forward
cat
iptables
ping
sysctl
Operaciones
7. Desde la estación de trabajo, hacer un ping a una dirección de la red pública (la
pasarela a Internet, por ejemplo).
Archivo
La
navegación a Internet también tiene que estar habilitada (puede ser necesario desactivar el uso de un servidor
proxy).
La red local es ahora capaz de navegar libremente por Internet. Sin embargo, en esta fase de la
configuración, cualquier protocolo puede circular libremente y esto no se corresponde con sus objetivos. Decide
tomar medidas para cambiar esta situación.
Comandos útiles
iptables
ping
Operaciones
1. Declarar una política de rechazo para todo tráfico entrante en el servidor beta.
2. Declarar una política de rechazo para todo tráfico saliente del servidor beta.
3. Declarar una política de rechazo para todo tráfico que circule a través del servidor
beta.
Intento
de ping
[root@beta ~]# iptables -P INPUT DROP desde
[root@beta ~]# iptables -P OUTPUT DROP la
[root@beta ~]# iptables -P FORWARD DROP
[root@beta ~]#
[root@beta ~]# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
estación de trabajo:
c.
usuario@ubuntu:~$
Interesado en alcanzar cierto equilibrio, decide autorizar los protocolos http, https y dns.
Comandos útiles
iptables
Operaciones
2. Autorizar el tráfico hacia cualquier dirección (la dirección pública en Internet) para
el protocolo http (TCP 80).
3. Autorizar el tráfico hacia cualquier dirección (la dirección pública en Internet) para
el protocolo https (TCP 443).
4. Autorizar el tráfico hacia cualquier dirección (la dirección pública en Internet) para
el protocolo dns cliente/servidor (UDP 53).
5. Comprobar desde la estación cliente que se puede navegar por Internet (no hay
que olvidar reconfigurar el navegador para que se conecte directamente a Internet
sin pasar por un servidor proxy).
6. Comprobar desde la estación cliente que los pings no logran pasar (en ningún
momento se ha autorizado su circulación y la política básica prohíbe cualquier tipo
de tráfico no autorizado explícitamente).
d.
Gestión
[root@beta ~]# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT en
[root@beta ~]# iptables -A FORWARD -p tcp --dport 80 -j ACCEPT forma
[root@beta ~]# iptables -A FORWARD -p tcp --dport 443 -j ACCEPT de
[root@beta ~]# iptables -A FORWARD -p udp --dport 53 -j ACCEPT
[root@beta ~]#
servicio
Para poder gestionar cómodamente su configuración de filtrado de tráfico, decide crear un servicio que se
ejecutará automáticamente en el arranque del sistema.
Comandos útiles
chmod
ln
vi
Operaciones
Archivo
de
#!/bin/bash script
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
ejecutable /opt/scripts/[Link]:
Archivo
#!/bin/bash
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#!/bin/bash
case $1 in
start)
/opt/scripts/[Link]
;;
stop)
/opt/scripts/[Link]
;;
status)
iptables -L
;;
esac
1. Requisitos
Los conocimientos adquiridos con la certificación LPI nivel 1, especialmente:
Edición de archivos.
2. Objetivos
Al final de este capítulo, será capaz de:
1. Usos de OpenSSH
Al principio, las sesiones interactivas en sistemas Unix se realizaban con terminales pasivos, que se limitaban a
gestionar la entrada/salida, conectados a una unidad central a través del puerto serie. Las pulsaciones del
teclado se enviaban sin procesar a la unidad central y la unidad central enviaba como respuesta órdenes de
impresión por pantalla. Los ordenadores eran muy caros entonces, el coste relativamente modesto de los
terminales pasivos permitía compartir el uso de un ordenador.
Con la generalización de las redes IP y la proliferación de los ordenadores personales, la administración remota
de sistemas Unix pasó a realizarse con el protocolo telnet. Se basa exactamente en el mismo principio que los
terminales pasivos, excepto en que las pulsaciones de teclado y las órdenes de impresión por pantalla se
envían en paquetes transportados por IP. El problema es que la gestión de la seguridad con el protocolo telnet
es absolutamente insuficiente: la autentificación se realiza sin encriptar y no hay ningún método de
confidencialidad que se aplique a los intercambios entre el cliente y el servidor.
2. Gestión de autentificaciones
El uso más sencillo del cliente SSH, que consiste en abrir una sesión de shell remota de forma segura en
redes IP, usa un modo de autentificación simple, que es utilizar una cuenta local del servidor y solicitar al
cliente que se autentifique con el nombre y la contraseña de esta cuenta existente en el servidor. La
contraseña se verifica a continuación y la autentificación se valida. Sin embargo, esta fase de autentificación
por contraseña sirve únicamente para comprobar la validez del cliente. El cliente a su vez puede tener dudas
acerca de la identidad del servidor. Dicho de otro modo: ¿se está a punto de hablar con el servidor deseado o
con un servidor falso que se aprovechará de los comandos tecleados para obtener información acerca de los
sistemas? Para evitar cualquier tipo de riesgo de falsificación de servidor, el cliente realiza una comprobación
de la identidad del servidor en la primera conexión. De hecho, se crea una huella digital del servidor y,
después de que el cliente valide esta huella, se guarda en un archivo llamado known_hosts, alojado en el
directorio oculto .ssh en el directorio personal del usuario.
El archivo known_hosts presenta una línea (muy larga) por cada servidor conocido.
Sin lugar a dudas, un método más fiable para autentificar conexiones SSH consiste en utilizar claves de
autentificación almacenadas localmente en el disco del usuario. La autentificación por claves no exime de la
obligación de utilizar una contraseña, pero garantiza al usuario que la máquina remota es con la que se
quiere trabajar y no una falsificación.
Creación del par de claves en el cliente
Para que el servidor pueda identificarse formalmente, tiene que tener la clave pública del cliente. Esta clave le
permitirá encriptar datos que sólo el cliente propietario de la clave privada asociada podrá descifrar. Por
tanto, conviene que se genere en primer lugar esta clave pública en el cliente. Como se trata de criptografía
asimétrica, la generación de la clave pública es necesariamente simultánea a la de la clave privada asociada.
El comando ssh-keygen permite crear estas claves (la pública y la privada).
ssh-keygen -t algoritmo
Donde algoritmo representa el algoritmo usado para la generación de las claves del cliente. Puede tratarse de
RSA (versión 1 o 2 de SSH). RSA y DSA son dos algoritmos de encriptación asimétricos que se usan a menudo
para autentificar. Si no se especifica un algoritmo, se usa el valor por defecto: RSA.
En este ejemplo se generan un par de claves con el algoritmo por defecto (RSA) para el usuario tata. La
representación gráfica (randomart) de la clave no es automática y su impresión por pantalla depende de la versión
del comando.
El
tata@estacion:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tata/.ssh/id_rsa):
Created directory ’/home/tata/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/tata/.ssh/id_rsa.
Your public key has been saved in /home/tata/.ssh/id_rsa.pub.
The key fingerprint is:
[Link] tata@estacion
The key’s randomart image is:
+--[ RSA 2048]----+
| o+=++o |
| . ..+..o|
| o E. |
| oX+|
| S =o |
| +. |
| o |
| |
| |
+-----------------+
tata@estacion:~$
comando ssh-keygen provoca la creación de dos archivos, creados por defecto en el [Link] ubicado
directamente en el directorio personal del usuario. Estos dos archivos son por defectoid_rsa para la clave
privada e id_rsa.pub para la clave pública asociada. Aunque no sea obligatorio, se
recomienda encarecidamente proteger la clave privada con una contraseña que se solicitará en su creación.
A continuación se muestra el contenido de los archivos de claves privadas y públicas. Cabe destacar que los
permisos por defecto están limitados en el archivo de clave privado y abiertos en el archivo de clave pública.
En cada
tata@estacion:~/.ssh$ ls -l
total 8
-rw------- 1 tata tata 1743 2011-08-09 09:38 id_rsa
-rw-r--r-- 1 tata tata 394 2011-08-09 09:38 id_rsa.pub
tata@estacion:~/.ssh$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAs0jrYKKQKiS4f/cCQMhOcc2WTMmGrbXXv3oyz67KUwkm4JumEU1
YkOaNi+WM4nVbkzC7rkUnlXQMxu/EpZLoraNySMHZjUgYiWiRuM4pI0z/atPfjVlwPtGzfUKlqSsP4NCark/9G0
WlMgEXlgpEdeJDmMBRuj98PJjOI/cRGRTgR6JEoevFWMPTDRpoBix3YizVY+dA+unJQPaNKWhoDnCZg7xWi+ZRg
T2Q1PcbqYKt4xLio+Eei0dvlgu5r5hSvymOdWbXwykywoloIxnzIPiUe7CAxm+KCBA23LQw73pREd1cglS6Gd23
b5Byv/oI6etqs4WOmcJa40Ymvtfbjw== tata@station
tata@estacion:~/.ssh$ cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,B08C4C3C4B021A76
TzO6ofHOv8sVRDoPj+o7dXfPuXDJaOmQSGhDkWUTC9iGHYnGdHgsig5EKWEez0Zj
YucF9doTpLCv9UsRac6WHRjlQb7AUjk9phEjrKYW4gAfoXNcFY5IiC7fca9i8NQk
YCj4mtzmbJAFc0W9Ax8g0UzZ8bwElIacI28pAdSvVqVHQ6omnVBoWhXhgWTUZaKp
2XbY5gJ7miKW3Y9IPZ3JLukB3j4rTZ0bu8j/UedyXuogpZgYF2vW0GfvtBbfP31F
(...)
RZfBnf+3+KxTvnAtJsMSZc4Glg+9Gch9V+mjU2SfW+T+bUnYLB/6Mpo1aq/akj3r
0G6w12SgjqiOuuXnsCdU8Ox1olCqiHFrk0DyPmwoxcSQygpm2r7FIwL4MPxbELJO
zfk+0wJOmsUANJzeBKd4LXmZykYsAOmf3zZNlS+iU/ZhCBqFmn3/5w==
-----END RSA PRIVATE KEY-----
tata@estacion:~/.ssh$
conexión, el servidor mira en el directorio local del usuario que se intenta conectar para ver si existe el
directorio .ssh/authorized_keys y si contiene la clave pública del cliente. Si éste es el caso, la autentificación
del servidor la puede realizar el cliente. Por tanto, el cliente deberá copiar su archivo de clave pública en el
directorio ~/.ssh.authorized_keys del servidor usando algún método de su elección (memoria usb, copia por
red).
c. El agente SSH
Para los administradores que necesiten acceder frecuentemente a varias máquinas por SSH, existe un
"agente SSH", iniciado con el comando ssh-agent, que permite conservar en memoria las claves
privadas utilizadas en las autentificaciones. Las claves privadas se transmiten sólo una vez al agente con
el comando ssh-add. Si se requiere una contraseña de protección de la clave, se solicitará en esta ocasión. A
continuación, las claves quedan disponibles sin intervención directa del usuario para cualquier autentificación.
El comando ssh-add consulta el directorio .ssh en el directorio personal del usuario y busca posibles claves
privadas en los archivos id_rsa, id_dsa e identity. Se pueden consultar las claves almacenadas por el agente
SSH mediante el comando ssh-add -l.
El agente nutre variables durante su funcionamiento que permiten gestionarlo más fácilmente.
Carga de
claves
tata@estacion:~$ ssh-agent por el
SSH_AUTH_SOCK=/tmp/ssh-sRuvox4519/agent.4519; export SSH_AUTH_SOCK; agente
SSH_AGENT_PID=4520; export SSH_AGENT_PID; SSH
echo Agent pid 4520;
tata@estacion:~$ El
comando
ssh-agent: variables comunes
ssh-add
SSH_AGENT_PID El pid del agente que se encuentra en ejecución. sin
argumentos permite que el agente SSH, que debe haberse iniciado previamente, cargue las claves.
tata@estacion:~$ ssh-add
Enter passphrase for /home/tata/.ssh/id_rsa:
Identity added: /home/tata/.ssh/id_rsa (/home/tata/.ssh/id_rsa)
tata@estacion:~$
El comando ssh-add -l permite comprobar que el agente ha cargado las claves correctamente.
tata@estacion:~$ ssh-add -l
2048 [Link] tata@estacion (RSA)
2048 [Link] /home/tata/.ssh/id_rsa (RSA)
tata@estacion:~$
El agente SSH es ante todo una solución de gestión de claves y no tiene como finalidad la
creación de claves SSH. El agente SSH sólo puede trabajar con claves ya creadas con el
comando ssh-keygen.
La sesión interactiva se abre desde un cliente a un servidor con una cuenta de usuario existente en el
servidor.
ssh usuario@dirección_servidor
Ejemplo
Sesión interactiva con SSH: opción y parámetros
de
usuario La cuenta de usuario existente en el servidor con la que se apertura
realiza la conexión. de sesión
El comando scp requiere el daemon SSH y permite copiar archivos de forma segura utilizando los servicios de
autentificación y de confidencialidad proporcionados por SSH. La copia puede realizarse del cliente al servidos
o viceversa.
archivo_local Ruta relativa o absoluta del archivo local que debe copiarse.
archivo_remoto Ruta absoluta del archivo remoto que debe copiarse.
La creación de un túnel SSH permite asegurar las comunicaciones cliente/servidor para protocolos a priori
poco seguros. Se establece un túnel desde el cliente al servidor y todo el tráfico entre estas dos máquinas es
seguro. El servidor genera entonces otra comunicación no segura con la máquina objetivo del tráfico. Las
conexiones de los clientes que deseen utilizar el túnel se crean a través del cliente SSH.
Con esta
Túnel SSH: opciones y parámetros
servidor Dirección IP o nombre del servidor que será el extremo del túnel.
instrucción, se crea un túnel entre un cliente y un servidor. En el cliente, el tráfico con destino el puerto local
se reenvía a través del túnel SSH a la máquina destino en el puerto destino.
El servidor X no tiene de forma nativa una fuerte seguridad para sus comunicaciones cliente/servidor. Un uso
habitual de SSH consiste en transmitir a través de un túnel SSH aplicaciones gráficas. Para ello, hay que
autorizar que el servidor SSH reenvíe este tipo de tráfico y utilizar un cliente compatible con este modo de
funcionamiento.
La autorización del reenvío de sesiones X a través de SSH se consigue modificando el archivo de configuración
del servidor SSH /etc/ssh/sshd_config.
X11Forwarding yes
ssh -X usuario@servidor
Donde usuario representa la cuenta de usuario utilizada para la conexión y servidor la dirección IP o el nombre
del servidor al que se conecta. Las aplicaciones gráficas podrán entonces ejecutarse desde la sesión SSH
cliente.
OpenVPN
OpenVPN es un programa open source para la creación de túneles seguros (VPN). Contrariamente a las VPN
habituales, no se basa en IPsec sino en SSL. Proporciona servicios de autentificación, de confidencialidad y de
control de la integridad.
a. Autentificación
Los extremos del túnel, es decir, las dos máquinas que encriptan los flujos de datos salientes y desencriptan
los entrantes, tienen que estar mutuamente autentificados. No debería haber ninguna duda acerca de la
autenticidad del otro extremo. OpenVPN soporta varios modos de autentificación, pero los dos más comunes
son la autentificación por compartición de claves y la autentificación con certificados digitales X509. La primera
solución es mucho más sencilla de aplicar, pero también es menos segura. La segunda, si bien es la
recomendada, es mucho más difícil de desplegar si no se tiene profundos conocimientos de la infraestructura
de clave pública que permite generar los certificados. A menudo es mejor tener una solución de claves
compartidas que funcione correctamente que una infraestructura de clave pública tambaleante, mal
controlada y, por lo tanto, difícil de mantener.
b. Confidencialidad
c. Funcionamiento de red
El modo de funcionamiento más sencillo y más fácil de aprender es el modo punto a punto, en el que los dos
protagonistas de la vpn son los que deben comunicarse de forma segura: son al mismo tiempo los extremos
del túnel y los extremos de la comunicación. También se pueden conectar dos redes entre sí en modo sitio a
sitio. Dos servidores OpenVPN proporcionan entonces un túnel, pero los extremos del tráfico son las dos
redes conectadas. De este modo, los servidores OpenVPN realizan además una función de enrutamiento
entre ambas redes. Finalmente, se puede montar una VPN de acceso remoto en la que una máquina se
conecta a una red.
OpenVPN puede funcionar en modo puente, en cuyo caso se conectan dos redes remotas como si se hubiera
añadido un cable entre los switches, aunque este cable fuera de 200km. Este modo de funcionamiento puede
considerarse como anecdótico, el modo enrutado es de lejos el más utilizado.
El nivel de transporte de los paquetes encriptados usa por defecto UDP aunque también se puede usar TCP.
a. Gestión de la autentificación
Se genera a continuación una clave secreta que permitirá realizar la autentificación entre las máquinas en cada
extremo del túnel.
b. Archivos de configuración
remote servidor
dev tun
ifconfig IP_local IP_remota
secret archivo_clave
route red_remota máscara
Ejemplo
Archivo de configuración Open VPN: directivas comunes
de
remote servidor En el cliente únicamente. servidor indica el nombre o la archivos
dirección IP del servidor al que se debe conectar la VPN. de
configuración OpenVPN
Archivo
de
alfa:/etc/openvpn# cat [Link]
dev tun
ifconfig [Link] [Link]
secret [Link]
Una vez se han creado los archivos en el cliente y el servidor, basta con iniciar en ambas partes el servicio con
su script de inicio.
La comprobación del funcionamiento puede hacerse mediante un ping entre las dos direcciones del túnel. Una
captura de tramas permitirá observar el tráfico entre ambos extremos a través del puerto UDP/1194 por
defecto.
Se inicia el servicio con su script estándar, se comprueba la existencia de la interfaz virtual y se controla el
funcionamiento del túnel con tráfico de un tipo cualquiera.
1. Preguntas
1 Los conceptos de seguridad principales son la autentificación, la confidencialidad y el control de la
integridad. El servicio telnet se describe por su ausencia de seguridad, ¿pero dispone sin embargo de
algún mecanismo de seguridad?
2 ¿Cómo conserva un cliente SSH el registro de los servidores a los que ya se ha conectado?
4 ¿Qué mecanismo permite conservar en memoria las claves privadas utilizadas en las autentificaciones
permitiendo de este modo un uso más cómodo?
5 ¿En qué servicio se basa el comando scp en la máquina remota para copiar archivos de forma segura?
6 ¿Cómo se llama el funcionamiento en el que el tráfico se transporta por SSH y, por lo tanto, queda
protegido gracias a las funciones nativas de seguridad de este protocolo?
8 ¿Qué diferencia hay entre un túnel vpn sitio a sitio y un túnel vpn punto a punto?
9 ¿OpenVPN puede conectar dos máquinas remotas sin proporcionar enrutamiento entre las dos
máquinas?
10 ¿Cómo puede un usuario visualizar si un túnel Open VPN se ha montado, a priori, en su máquina?
2. Respuestas
1 Los conceptos de seguridad principales son la autentificación, la confidencialidad y el control de la
integridad. El servicio telnet se describe por su ausencia de seguridad, ¿pero dispone sin embargo de
algún mecanismo de seguridad?
Sí, el que se estimaba suficiente en la época de creación del protocolo. Telnet no ofrece ni un control de
integridad serio ni una encriptación de datos que proporcione algún tipo de confidencialidad en las
comunicaciones. En cambio, el protocolo telnet soporta una autentificación por contraseña. El fallo de esta
autentificación es que la transmisión de esta contraseña se realiza sin encriptar, haciendo su intercepción
relativamente fácil.
2 ¿Cómo conserva un cliente SSH el registro de los servidores a los que ya se ha conectado?
Los clientes guardan un registro de cada conexión establecida con servidores SSH y almacenan una huella
digital de los servidores en el archivo known_hosts, situado en el directorio oculto .ssh del directorio personal
del usuario. Es importante que no haya dudas acerca de la validez del servidor: la encritptación utilizada por
SSH permite escaparse de todo intento de lectura realizado con medios razonables, pero es relativamente fácil
suplantar la identidad de un servidor usando su nombre y su dirección IP por ejemplo. En esta situación, el
usuario teclearía con total confianza comandos que el atacante podría recuperar fácilmente.
La creación de claves públicas y privadas requiere que se haga conjuntamente. Cualquier comando que crea
una debe obligatoriamente crear la otra al mismo tiempo. A veces el manual o la documentación presentan
una operación antes de la otra, pero en realidad el par de claves se crea a la vez. Es imposible a partir de la
clave pública determinar la clave privada asociada y viceversa.
4 ¿Qué mecanismo permite conservar en memoria las claves privadas utilizadas en las autentificaciones
permitiendo de este modo un uso más cómodo?
El comando ssh-agent permite que las claves privadas se almacenen de forma cómoda. Las claves privadas (y
las públicas) se crean inicialmente con el comando ssh-keygen y se facilitan al agente con el comando ssh-add.
Este agente se carga con el comando ssh-agent. El agente SSH es un programa residente y los programas que
requieran autentificaciones son los clientes.
5 ¿En qué servicio se basa el comando scp en la máquina remota para copiar archivos de forma segura?
El comando scp sólo necesita el servicio SSH en la máquina remota, también utilizado para las sesiones
remotas.
6 ¿Cómo se llama el funcionamiento en el que el tráfico se transporta por SSH y, por lo tanto, queda
protegido gracias a las funciones nativas de seguridad de este protocolo?
Se llama túnel SSH. Las aplicaciones no requieren modificaciones para este uso, sólo el transporte se ve
afectado.
Sí, pero para ello hay que autorizar este uso informando la directiva X11Forwarding con el valor yes en el
archivo de configuración sshd_config del servidor SSH.
8 ¿Qué diferencia hay entre un túnel vpn sitio a sitio y un túnel vpn punto a punto?
Un túnel punto a punto conecta dos máquinas entre ellas de forma segura. Se garantizan todas las funciones
de seguridad (autentificación, confidencialidad, integridad), pero solamente entre ambas máquinas. Usando el
modo sitio a sitio, se aplican las mismas funciones al túnel, pero todos los hosts de ambas redes conectadas
pueden comunicarse entre ellos mediante el túnel.
9 ¿OpenVPN puede conectar dos máquinas remotas sin proporcionar enrutamiento entre las dos
máquinas?
Sí, usando el modo puente en el que el túnel conecta directamente ambas máquinas que se encuentran en la
misma subred. Este modo de uso es poco frecuente.
10 ¿Cómo puede un usuario visualizar si un túnel Open VPN se ha montado, a priori, en su máquina?
Consultando la configuración de red con el comando ifconfig. Una interfaz virtual, generalmente llamada tun0,
debe mostrarse con la dirección IP asociada a esta interfaz. La presencia de esta interfaz virtual no asegura el
correcto funcionamiento del túnel, pero es necesaria para su funcionamiento.
Trabajos prácticos
Aparecen nuevas necesidades. Es necesario acceder desde el exterior a un servidor de intranet situado en el
servidor alfa. Duda entre dos soluciones y decide probar ambas.
Estos ejercicios requieren que la red de pruebas se haya reorganizado como se describe en los trabajos
prácticos del capítulo Protección de redes.
Para la realización de las pruebas se necesita que una estación cliente esté situada en la red pública. Se puede
usar una nueva máquina, pero lo más sencillo es desplazar provisionalmente la estación de trabajo Ubuntu a la
red pública.
b.
1. En los menús de Virtualbox de la estación cliente, desplegar Dispositivos y, a
Parada
continuación, hacer clic en Adaptadores de red.
del
2. En la pestaña Adaptador 1, desplegar el campo Conectado a y elegir Adaptador
puente.
cortafuegos
Comandos útiles
Scripts personalizados de gestión del cortafuegos
iptables
Operaciones
1. Para poder hacer correctamente la práctica sin interferencia por parte del
cortafuegos, hay que desactivarlo en el servidor beta. Utilizar para ello los scripts
creados en el capítulo Protección de redes.
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
c.
a. Gestión de la autentificación
Como el túnel se establece entre la estación cliente pública y el servidor beta, hay que resolver el problema de la
autentificación entre ambas máquinas. Preocupado por aplicar la solución más segura, opta por la autentificación
mediante claves SSH.
Comandos útiles
mkdir
scp
ssh-key-gen
Operaciones
Copia
de la
[toto@beta ~]$ hostname clave
beta pública
[toto@beta ~]$ id desde
uid=500(toto) gid=500(toto) grupos=500(toto)
[toto@beta ~]$ mkdir -p .ssh/authorized_keys la
[toto@beta ~]$
estación al servidor:
b.
toto@estacion:~$ cd .ssh
toto@estacion:~/.ssh$ whoami
toto
toto@estacion:~/.ssh$ hostname
estacion
toto@estacion:~/.ssh$ ls
id_dsa id_dsa.pub known_hosts
toto@estacion:~/.ssh$ scp id_dsa.pub toto@[Link]:/home/toto/.ssh/authorized_keys
toto@[Link]’s password:
id_dsa.pub 100% 597 0.6KB/s 00:00
toto@estacion:~/.ssh$
Comandos útiles
ssh
Operaciones
c.
Validación
Comandos útiles
navegador web
netstat
Operaciones
1. Desde la estación cliente en el navegador, abrir una sesión web hacia sí misma
(localhost) al puerto 1234. La página web por defecto del servidor alfa debería
mostrarse. Se han transmitido los datos encriptados desde la estación y el
servidor beta.
2. En el servidor beta, comprobar que hay una sesión SSH establecida entre el cliente
y el servidor beta y que existe una sesión http entre el servidor beta y el servidor
alfa.
3. En el servidor alfa, comprobar que hay una sesión http abierta por el servidor beta
(extremo del túnel).
Resumen de los comandos y resultado por pantalla
3.
alfa:/var/www# netstat -n | head -5
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp6 0 0 [Link]:80 [Link]:45678 TIME_WAIT
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
alfa:/var/www#
OpenVPN no forma parte de los paquetes estándar de la distribución CentOS. La solución propuesta es añadir el
paquete EPEL, un proyecto de código abierto que pretende proporcionar a las distribuciones Fedora y CentOS
programas orientados a profesionales que no están incluidos por defecto en estas distribuciones. Una solución
más sencilla sería realizar las pruebas en las distribuciones Debian o Ubuntu exclusivamente.
b.
1. En el servidor beta, descargue la versión actual del paquete EPEL llamado epel-
Gestión
release en la siguiente dirección según la arquitectura del servidor beta:
de la
[Link]
o [Link]
Este paquete permitirá configurar los repositorios alternativos EPEL en su servidor
CentOS.
rpm -i [Link]
yum update
autentificación
Comandos útiles
openvpn
scp
Operaciones
1. En el cliente, genere una clave exportable para OpenVPN. Almacene esta clave en
el archivo [Link].
Copia
de la
toto@estacion:~$ openvpn --genkey --secret [Link] clave al
toto@estacion:~$ cat [Link]
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
5e1daf78432b5217c1be08b151630622
2f3df08093262bd5e8e12dfddb180f9b
1bb06c684d842bacbe9b67bb3fe76830
3e23899306d15f33451028e8e1a7d78a
d6850f6cfe666d710e5a840e00fc3d18
d1328b3474a23441353983a697ff04c5
45a8457f2e085883e4565df8a920a655
a98ee7252e9f9e8b0377a2988a261d4c
38d0e02407ed26003fab943f8dde4399
67d053533c807bede026c0be5efe2fe7
987103e4d864ca4799be62a52b2cb47c
2d1c0e76c468a3b8d69c4662debfbb0d
ea722255a0158451b5d21187d54258d1
9ff4cdbdc8f8dd4553b96a303c866f1d
2b360353c78797110ab8c06fd96e58d3
8b283865278e1629fb2054f67e4f52e9
-----END OpenVPN Static key V1-----
toto@estacion:~$
servidor:
c.
dev
ifconfig
remote
route
secret
vi
Operaciones
1. En la estación cliente, crear el archivo de configuración/etc/openvpn/[Link].
d.
remote [Link]
dev tun
ifconfig [Link] [Link]
secret /home/toto/[Link]
route [Link] [Link]
Comandos útiles
ifconfig
vi
Directivas útiles
dev
route
secret
Operaciones
e.
dev tun
ifconfig [Link] [Link]
secret /home/toto/[Link]
Comprobación
Comandos útiles
Navegador web
ping
Operaciones
Inicio
del
[root@beta openvpn]# service openvpn start servicio
Inicialización de de openvpn : [ OK ] en la
[root@beta openvpn]# ifconfig
eth0 Link encap:Ethernet HWaddr [Link]
inet adr:[Link] Bcast:[Link] Mask:[Link]
(...)
eth1 Link encap:Ethernet HWaddr [Link]
inet adr:[Link] Bcast:[Link] Mask:[Link]
(...)
lo Link encap:Bucle local
inet adr:[Link] Mask:[Link]
(...)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet adr:[Link] P-t-P:[Link] Mask:[Link]
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
[root@beta openvpn]#
estación cliente:
toto@estacion:/etc/openvpn$
Comprobación desde el cliente:
Cabe destacar que con el túnel OpenVPN se obtienen interfaces virtuales que puede usar
cualquier aplicación. Con el túnel SSH, se está estrechamente ligado a la aplicación asociada al
túnel.
Requisitos y objetivos
1. Requisitos
Los conocimientos adquiridos con la certificación LPI de nivel 1, especialmente:
Edición de archivos.
2. Objetivos
Al final de este capítulo, será capaz de:
Compilar un kernel.
1. Características generales
a. Principios de la compilación
Los programas que se utilizan en informática generalmente pertenecen a dos familias: los programas
interpretados y los programas compilados. Un programa interpretado se escribe en un lenguaje de
programación (basic, perl, shell, etc.) y hay un programa específico que tiene que leerlo para que se pueda
ejecutar llamado intérprete. En cada ejecución, el intérprete tiene que recorrer todo el código del programa.
Un programa compilado se escribe en un lenguaje de programación (Pascal, C, C++, etc.) y a continuación se
pasa a un compilador. El compilador es un programa ejecutable que lee el código del programa que se
compilará (llamado código fuente) y generará con esta operación otro programa ejecutable, en modo binario,
que podrá ejecutarse independientemente del compilador. La mayoría de los programas usados en el entorno
Linux son compilados y el kernel Linux es un ejemplo particular.
La mayoría de las veces se proporcionan las aplicaciones en forma de paquete ya compilado y listo para su
uso. En estas condiciones, la compilación es una operación cuyo responsable es el creador del paquete y el
usuario no tiene por qué preocuparse. El éxito de distribuciones como Ubuntu viene en parte de su gran
número de paquetes existentes y disponibles bajo demanda.
Sin embargo, puede darse el caso en que uno mismo tenga que compilar una aplicación. Por ejemplo, si se
desea tener una versión del software tan reciente que todavía no está disponible en forma de paquete o bien
que el paquete no exista en la distribución. Además, la compilación se puede personalizar con opciones,
mientras que el creador del paquete ha tomado elecciones arbitrarias en lo que respecta a estas opciones de
compilación. En estas condiciones, puede desear compilar uno mismo su aplicación y obtener, de este modo,
un funcionamiento específico.
Las fuentes de los programas utilizados en la compilación de aplicaciones casi siempre están disponibles en
forma de archivos comprimidos. Por tanto, hay que recordar la sintaxis que permite descomprimir un archivo
en formato tar comprimido, que es, con diferencia, el formato más habitual.
Por definición, el código fuente de una aplicación open source está siempre disponible, generalmente en un
sitio web adjunto al proyecto de desarrollo de la aplicación. Particularmente, el sitio web [Link] se
dedica a albergar muchos proyectos de desarrollo.
Una vez que se han descargado las fuentes, basta con extraerlas de su archivo e irse al directorio que se ha
extraído. Todas las operaciones relacionadas con la compilación se realizarán desde la raíz de este directorio.
b. Configuración de la compilación
La compilación tiene una serie de requisitos: la existencia del compilador, la posible presencia de
librerías necesarias para compilar el programa y, sobre todo, un archivo de respuesta que será leído por el
compilador en la compilación. En el procedimiento estándar de compilación GNU, debe haber un script
llamado configure en el directorio raíz de las fuentes y este script es el que se encarga de realizar estas tres
operaciones. El desarrollador del programa es su autor y lo libera con las fuentes.
Durante la ejecución, posiblemente con opciones de compilación, este script comprobará el entorno y
devolverá un mensaje de error en el caso que se produzca una ausencia en el entorno de compilación
(compilador y librerías necesarias). Si todo va bien, este script acabará generando archivos como
resultado (uno por cada subdirectorio existente en el directorio de los fuentes)llamados Makefile.
Estos archivos se crean a partir de las opciones que se han facilitado al script de configuración y de un
archivo plantilla [Link]. Aunque una curiosidad justificada incita a la lectura del contenido de estos
archivos, no es en absoluto necesaria para seguir con las operaciones.
Se ejecuta el script de configuración desde el directorio raíz de los fuentes. Se puede comprobar que ha terminado
con la línea "creating Makefile", que constituye el último paso del script.
Gestión
de fallos
[root@beta rdesktop-1.6.0]# ./configure por el
checking for gcc... gcc script de
checking for C compiler default output file name... [Link]
checking whether the C compiler works... yes
checking whether we are cross compiling... no
(...)
checking for setmntent... yes
checking build system type... i686-redhat-linux-gnu
checking host system type... i686-redhat-linux-gnu
configure: creating ./[Link]
[Link]: creating Makefile
[root@beta rdesktop-1.6.0]#
configuración
El script de configuración detecta en este ejemplo la ausencia de librerías que son necesarias para el proyecto. Lejos
de ser genéricos, se tiene la suerte de que el script devuelve consejos precisos.
Para empezar, se ejecuta el script con la opción --help para saber qué opciones hay disponibles. Después, se vuelve
a ejecutar con las opciones elegidas.
Configuration:
-h, --help display this help and exit
--help=short display options specific to this package
--help=recursive display the short help of all the included packages
-V, --version display version information and exit
-q, --quiet, --silent do not print `checking...’ messages
--cache-file=FILE cache test results in FILE [disabled]
-C, --config-cache alias for `--cache-file=[Link]’
-n, --no-create do not create output files
--srcdir=DIR find the sources in DIR [configure dir or `..’]
(...)
[root@beta rdesktop-1.6.0]#
[root@beta rdesktop-1.6.0]# ./configure --with-ipv6
checking for gcc... gcc
(...)
configure: creating ./[Link]
[Link]: creating Makefile
[root@beta rdesktop-1.6.0]#
d. Compilación
La compilación se realiza simplemente con el comando make, sin parámetros ni opciones desde el
directorio raíz de las fuentes donde se encuentran los archivos Makefile y [Link]. Esta operación suele
ser bastante larga y desemboca si todo va bien en la generación de archivos binarios compilados. Cabe
destacar que, en esta etapa, estos archivos se encuentran exclusivamente en la estructura de directorios de
las fuentes.
Se intenta realizar en este ejemplo una compilación con el comando make sin haber configurado previamente la
compilación.
El comando make permite realizar la compilación propiamente dicha, pero este mismo comando llamado con
algunos argumentos permite realizar diversas acciones relacionadas con la compilación. A estos argumentos
se les llama objetivos. Todos los objetivos no siempre están disponibles, y su presencia depende de los
objetivos del desarrollador. Sin embargo, los objetivos de instalación de los binarios o de limpieza sencilla de
fuentes siempre están disponibles.
f. Instalación de binarios
Desde el directorio de las fuentes, hay que introducir el comando make install para desencadenar la
instalación de archivos binarios compilados en sus directorios de destino en el interior de la estructura de
carpetas del sistema de archivos Linux. La instalación también puede provocar la copia de archivos de
manuales o de configuración.
El comando make ejecutado con el objetivo install copia los archivos binarios compilados así como todo elemento
previsto por el desarrollador. Se requiere tener los permisos adecuados para la escritura en los directorios de
destino.
g. Limpieza de fuentes
El comando make clean ejecutado desde el directorio raíz de las fuentes limpia la estructura de carpeta
eliminando cualquier elemento ya compilado y permite reiniciar otra compilación a partir de las mismos fuentes
y del mismo entorno.
El comando make mrproper permite realizar, como su nombre indica, una limpieza completa de cualquier
elemento generado localmente, desde los archivos compilados a los archivos de configuración (Makefile)
generados previamente.
El comando make ejecutado con el objetivo clean borra todos los elementos generados por la compilación pero
conserva los archivos de configuración.
[root@beta rdesktop-1.6.0]# ls Makefile
Makefile
[root@beta rdesktop-1.6.0]# make clean
rm -f *.o *~ vnc/*.o vnc/*~ rdesktop rdp2vnc
[root@beta rdesktop-1.6.0]# ls Makefile
Makefile
[root@beta rdesktop-1.6.0]#
h. Desinstalación de un programa
El comando make uninstall ejecutado desde el directorio raíz de los fuentes limpia el sistema de todos los
archivos instalados por el comando make install.
cd dir_fuentes
./configure
make
make install
Donde dir_fuentes representa el directorio de las fuentes, obtenido a partir de la extracción del archivo tar
comprimido.
a. Librerías
Una librería (library en inglés) es un conjunto de elementos preprogramados que pueden utilizar los
desarrolladores. De este modo, se puede ganar tiempo gracias a la reutilización de funciones comunes y a
que se evita la reescritura de funciones triviales. El uso de librerías en el entorno gráfico también ayuda a
proporcionar unidad a los programas con elementos de interfaz coherentes.
La librería libstdc++ está casi siempre disponible en los sistemas Linux ya que la usan muchos programas y
las aplicaciones gráficas usan frecuentemente las librerías gtk o qt. Existen centenares de
librerías compartidas utilizadas en entornos Linux. Normalmente se encuentran en el directorio /usr/lib.
La mayoría de los programas se compilan de forma dinámica (en contraposición a la forma estática). Es decir,
se basan en las mismas librerías que las que ha usado el desarrollador, pero están presentes localmente en
el sistema. Por lo tanto, las aplicaciones necesitan tener a su disposición las librerías adecuadas durante la
ejecución.
Se puede comprobar cuáles son las librerías necesarias para un ejecutable con el comando ldd.
Se puede observar que para cada librería existe el archivo correspondiente en el disco.
El
comando ldconfig permite crear enlaces entre las aplicaciones y las librerías existentes en el sistema.
Consulte en su archivo de configuración /etc/[Link] cuáles son las rutas que hay que analizar para la
búsqueda de librerías. A continuación se generará el archivo /etc/[Link] que contiene la lista de
librerías.
ldconfig
ldconfig -p
A continuación se borra la caché para comprobar que el archivo se crea correctamente mediante el comando.
root@beta:~$ rm /etc/[Link]
root@beta:~$ ls /etc/[Link]
ls: no se puede acceder a /etc/[Link]: No existe el fichero o el directorio
root@beta:~$ ldconfig
root@beta:~$ ls /etc/[Link]
/etc/[Link]
root@beta:~$
Visualización de librerías
Se puede comprobar que el comando ldconfig -p se basa en el archivo de caché que se ha generado anteriormente.
Para un
uso
[root@beta ~]# ldconfig -p puntual,
776 libs found in cache `/etc/[Link]’ también
[Link].1 (libc6) => /usr/lib/[Link].1 se
[Link] (libc6) => /usr/lib/[Link]
puede
[Link].1 (libc6) => /usr/lib/[Link].1
informar
[Link] (libc6) => /usr/lib/[Link]
[Link].2 (libc6) => /usr/lib/[Link].2 una
[Link] (libc6) => /usr/lib/[Link] ruta de
[Link].1 (libc6) => /usr/lib/[Link].1 librería
[Link] (libc6) => /usr/lib/[Link] en la
[Link].11 (libc6) => /usr/lib/[Link].11 variable
(...) de
[root@beta ~]#
sistemaLD_LIBRARY_PATH.
LD_LIBRARY_PATH=ruta1:ruta2:...:rutan
export LD_LIBRARY_PATH
Donde las rutas representan la ruta absoluta del directorio que contiene las librerías.
Se puede probar el funcionamiento de las aplicaciones visualizando las llamadas a sistema realizadas por la
aplicación durante su ejecución. Si se aplica el comando strace a un programa, intercepta las llamadas a
sistema que han sido realizadas por el proceso así como los signals recibidos por este proceso. Este
comando, útil para desarrolladores, tiene que usarse con mucho cuidado en manos no expertas.
El comando ltrace, funciona de un modo muy parecido pero centrándose en las cargas de librerías e ignora
las llamadas a sistema.
Se puede ver la llamada a varias librerías durante la ejecución del comando echo.
[root@beta ~]# strace echo hola
execve("/bin/echo", ["echo", "hola"], [/* 35 vars */]) = 0
brk(0) = 0x9d71000
access("/etc/[Link]", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/[Link]", O_RDONLY) =3
fstat64(3, {st_mode=S_IFREG|0644, st_size=60638, ...}) = 0
mmap2(NULL, 60638, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fe8000
close(3) =0
open("/lib/[Link].6", O_RDONLY) =3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340\317\270\0004\
0\0\0"..., 512) = 512
(...)
brk(0) = 0x9d71000
brk(0x9d92000) = 0x9d92000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=56464512, ...}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7de6000
close(3) =0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0xb7ff6000
write(1, "hola\n", 5hola
) =5
close(1) =0
munmap(0xb7ff6000, 4096) =0
exit_group(0) =?
[root@beta ~]#
Compilación del kernel
Desde el punto de vista de la compilación, el kernel (también llamado núcleo) es casi como una aplicación más,
con su código fuente, un procedimiento de compilación y un procedimiento de instalación.
Se puede llamar "corazón del kernel" a la parte irreductible del kernel, que es la que se carga en su totalidad
en memoria. Sólo contiene elementos de los que se está seguro que se necesitarán. El corazón del kernel es
un archivo que se encuentra en el directorio /boot y cuyo tamaño es de algunos MB.
b. Módulos
Los módulos tienen un papel primordial ya que muchas de las funciones básicas se gestionan en forma de
módulos. Si un kernel no dispone de los módulos necesarios para el funcionamiento del sistema, las funciones
simplemente no estarán disponibles.
Este ejemplo se realiza en un sistema cuyo kernel no soporta el formato de sistema de archivos ext3.
Los
módulos
light:/mnt# mount /dev/hda3 partition son
mount: unknown filesystem type ’ext3’ archivos
light:/mnt# con la
extensión .ko que se cargan en memoria en función de las necesidades. Existe a nuestra disposición una
serie de comandos que permiten listar los módulos cargados, retirarlos de memoria o cargar otros nuevos.
Los kernels de versiones antiguas (2.4 especialmente) usan archivos de módulos con la
extensión ".o".
lsmod
modprobe -l
rmmod nombre_módulo
modprobe -r nombre_módulo
Donde nombre_módulo representa el nombre del módulo presente en memoria tal y como se muestra con el
comando lsmod. Ambos comandos (rmmod y modprobe -r) producen el mismo resultado.
insmod archivo_módulo
modprobe nombre_módulo
Donde nombre_módulo representa el nombre del módulo tal y como será mostrado por el
comandolsmod y archivo_módulo representa el nombre del archivo de módulo presente en disco. De hecho, el
nombre del módulo se obtiene retirando la extensión .ko al nombre del archivo.
Carga de un módulo
La carga manual del módulo que faltaba anteriormente hace posible que se pueda montar la partición ext3.
Los módulos se cargan en principio durante el arranque en función del hardware que se haya detectado. Sin
embargo, se puede forzar la carga de un módulo rellenando un archivo de configuración de módulos.
Cualquier módulo mencionado en el archivo /etc/modules se cargará por defecto en el arranque.
Configuración de módulos
A título
de
# Asociación forzada del controlador tg3 con la tarjeta de red
alias eth0 tg3
comprobación, o para ver si las asociaciones entre el hardware y los módulos han sido realizadas
correctamente, se puede mostrar información acerca de los módulos cargados con el comando modinfo.
Se ve especialmente el archivo .ko que contiene el código del módulo, alguna información relativa al entorno y los
alias gestionados dinámicamente por el sistema para el hardware ligado a este módulo.
root@servidor:/boot$ modinfo r8169
filename: /lib/modules/2.6.32-24-generic/kernel/drivers/net/[Link]
version: 2.3LK-NAPI
license: GPL
description: RealTek RTL-8169 Gigabit Ethernet driver
author: Realtek and the Linux r8169 crew <netdev@[Link]>
srcversion: D37E06388C6313C1D062CC3
alias: pci:v00000001d00008168sv*sd00002410bc*sc*i*
alias: pci:v00001737d00001032sv*sd00000024bc*sc*i*
alias: pci:v000016ECd00000116sv*sd*bc*sc*i*
alias: pci:v00001259d0000C107sv*sd*bc*sc*i*
alias: pci:v00001186d00004300sv*sd*bc*sc*i*
alias: pci:v000010ECd00008169sv*sd*bc*sc*i*
alias: pci:v000010ECd00008168sv*sd*bc*sc*i*
alias: pci:v000010ECd00008167sv*sd*bc*sc*i*
alias: pci:v000010ECd00008136sv*sd*bc*sc*i*
alias: pci:v000010ECd00008129sv*sd*bc*sc*i*
depends: mii
vermagic: 2.6.32-24-generic SMP mod_unload modversions
parm: rx_copybreak:Copy breakpoint for copy-only-tiny-frames (int)
parm: use_dac:Enable PCI DAC. Unsafe on 32 bit PCI slot. (int)
parm: debug:Debug verbosity level (0=none, ..., 16=all) (int)
root@servidor:/boot$
Ya se ha explicado que el kernel se constituye de una entidad indivisible y de módulos cargados en memoria
bajo demanda. En la fase de arranque, el gestor de arranque carga el kernel así como los módulos
correspondientes a la configuración hardware del sistema. Para acelerar la fase de detección del hardware y
la carga de módulos asociada, la mayoría de sistemas modernos usan un ramdisk (disco virtual cuyo soporte
físico es la memoria principal) que contiene el conjunto de módulos. Este ramdisk se genera una vez se ha
compilado el kernel y se llama directamente por el gestor de arranque.
El kernel lleva un número de versión de tipo A.B.C, por ejemplo 2.6.15. "A" determina la versión principal del
kernel: hasta hace poco la versión 2. "B" representa la versión actual del kernel. Este valor es
sistemáticamente par en las versiones estables e impar en las versiones de desarrollo. Finalmente, "C" se
incrementa en función de las evoluciones menores del kernel, básicamente correcciones de errores y
actualizaciones de nuevo hardware.
En Julio de 2011, el núcleo alcanzó la versión 3.0 teniendo como cambio principal, según su creador Linus
Torvalds: ”nada, absolutamente nada”. Este cambio se recibió como una especie de capricho, más o menos
para celebrar los veinte años del núcleo Linux. La evolución de esta versión, la más espectacular, para el gran
público ha sido el soporte a los periféricos Kinect de Microsoft. Una adición entre tantas otras, soporte de
nuevo hardware, correcciones varias y otras evoluciones menores.
Las distribuciones actuales no buscan especialmente proporcionar la última versión disponible del núcleo. El
número de funciones implementadas por el núcleo hace que la validación de una versión antes de su
distribución sea difícil y compleja. Los sistemas Linux orientados al gran público son más bien vanguardistas e
intentan proporcionar las últimas versiones del núcleo, mientras que las destinadas al mundo empresarial
premian la estabilidad y liberan núcleos en versiones más antiguas, que de algún modo han superado las
pruebas de estabilidad. En junio de 2012, Red Hat ofrecía un núcleo en versión 2.6.32, Ubuntu 3.2.0, mientras
que el último núcleo estable disponible en el sitio web de [Link] estaba en versión 3.4.4.
toto@servidor:~$ uname -r
2.6.32-24-generic
toto@servidor:~$
a. Obtención de fuentes
El código fuente del kernel se puede descargar de forma gratuita desde el sitio
web[Link] Las principales versiones están disponibles. Los enlaces "Full source" permiten
descargar el código fuente completo del kernel.
El kernel se libera en forma de archivo tar.bz2, por lo que primeramente hay que descomprimirlo. Como para
cualquier compilación de aplicación, la mayor parte del trabajo se realizará en el directorio creado en la
extracción del archivo.
Si se trabaja sobre las fuentes del kernel copiadas en la instalación del sistema, el directorio de trabajo
debería ser /usr/src/linux. Naturalmente, la documentación se encontrará entonces en
/usr/src/linux/Documentation. En caso de trabajar con fuentes nuevas, se recomienda utilizar un directorio
neutro.
Según el sistema usado, hay varios medios a nuestra disposición para generar este archivo de configuración.
Aunque
Generación del archivo de configuración: comandos posibles la
make config Va realizando preguntas al usuario para cada uno de los módulos.
compilación del kernel no presenta ninguna dificultad particular, informar el archivo de configuración requiere
una gran capacidad y el conocimiento preciso del hardware.
La compilación detallada del núcleo requiere el conocimiento de todas las tecnologías hardware gestionadas por este
núcleo.
Primeras
líneas
[root@beta linux-[Link]]# make config del
HOSTCC scripts/basic/fixdep archivo
HOSTCC scripts/basic/docproc de
HOSTCC scripts/basic/hash
HOSTCC scripts/kconfig/conf.o
(...)
PentiumPro memory ordering errata workaround (X86_PPRO_FENCE) [Y/n/?] y
HPET Timer Support (HPET_TIMER) [Y/n/?] y
Maximum number of CPUs (NR_CPUS) [8] (NEW) 8
SMT (Hyperthreading) scheduler support (SCHED_SMT) [Y/n/?] y
Multi-core scheduler support (SCHED_MC) [Y/n/?] y
Preemption Model
1. No Forced Preemption (Server) (PREEMPT_NONE)
> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT)
choice[1-3]: 2
Reroute for broken boot IRQs (X86_REROUTE_FOR_BROKEN_BOOT_IRQS) [N/y/?] (NEW) n
Machine Check / overheating reporting (X86_MCE) [Y/n/?] n
Toshiba Laptop support (TOSHIBA) [M/n/y/?] n
Dell laptop support (I8K) [M/n/y/?] m
Enable X86 board specific fixups for reboot (X86_REBOOTFIXUPS) [N/y/?] n
(...)
CRC-CCITT functions (CRC_CCITT) [M/y/?] m
CRC16 functions (CRC16) [M/y/?] m
CRC calculation for the T10 Data Integrity Field (CRC_T10DIF) [N/m/y/?] (NEW) m
CRC ITU-T V.41 functions (CRC_ITU_T) [M/y/?] m
CRC32 functions (CRC32) [Y/?] y
CRC7 functions (CRC7) [N/m/y/?] (NEW) n
CRC32c (Castagnoli, et al) Cyclic Redundancy-Check (LIBCRC32C) [Y/m/?] y
#
# configuration written to .config
#
[root@beta linux-[Link]]#
configuración
Tamaño
La
configuración de los módulos para una versión de kernel instalada se encuentra en el archivo config-
versión en el directorio /boot.
root@servidor:/boot$ ls config*
config-2.6.27-11-generic config-2.6.32-21-generic config-2.6.32-24-generic
config-2.6.28-16-generic config-2.6.32-22-generic
config-2.6.31-21-generic config-2.6.32-23-generic
root@servidor:/boot$ cat config-2.6.32-24-generic
#
# Automatically generated make config: don’t edit
# Linux kernel version: 2.6.32-24-generic
# Thu Aug 19 [Link] 2010
#
CONFIG_64BIT=y
# CONFIG_X86_32 is not set
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
(...)
root@servidor:/boot$
La compilación se realiza de la forma más trivial, simplemente tecleando el comando make desde el directorio
raíz de los fuentes. La duración de la operación depende de la potencia de la máquina en la que se realiza,
pero una buena hora es a menudo necesaria. Para un kernel con versión 2.6, el comando make provoca la
compilación del kernel y sus módulos.
La
ejecución del comando make provoca la compilación del kernel y de sus módulos. También invoca el
comando depmod que genera el archivo [Link] de dependencia de módulos.
d. Instalación de módulos
root@servidor:~$ ls /lib/modules/
2.6.27-11-generic 2.6.28-16-generic 2.6.32-22-generic
2.6.27-7-generic 2.6.31-21-generic 2.6.32-23-generic
2.6.27-9-generic 2.6.32-21-generic 2.6.32-24-generic
root@servidor:~$
El kernel sin módulos se encuentra en el directorio de fuentes en la ruta relativa arch/x86/bootpara las
versiones de 32 bits o arch/ia64/boot para las versiones de 64 bits con el nombrebzImage. Su instalación
en el sistema en producción se realiza copiando simplemente este archivo en el directorio /boot. Se puede
usar perfectamente el nombre por defecto (bzImage), pero es recomendable renombrarlo para tener en
cuenta la versión compilada.
Las compilaciones que se realicen con versiones antiguas de kernel pueden generar un archivozImage y no
un bzImage. El prefijo z o bz indica si el formato de compresión del archivo de kernel es gzip (z) o bzip2 (bz).
Un kernel recién compilado siempre debe instalarse añadiéndose al kernel existente. Nunca
reemplace un kernel que funciona por un kernel nuevo.
Las buenas prácticas recomiendan que el archivo de kernel tenga un nombre estándar que refleje su versión.
Hay que dejar a disposición del kernel un ramdisk que contenga el conjunto de módulos compilados para la
nueva versión. Este ramdisk necesita un archivo de imagen, que puede construirse con dos
comandos distintos en función de la generación del sistema usado. El comandotradicional es mkinitrd. Éste
tiende a desaparecer en beneficio del comando mkinitramfs.
Donde nombre_imagen representa el nombre del archivo de imagen de ramdisk que se desea crear
y versión el número de versión del kernel. Este número se corresponde de hecho con el directorio de módulos
albergado en /lib/modules.
El
archivo
root@servidor:/boot$ mkinitrd /boot/[Link] 2.6.28 ramdisk
root@servidor:/boot$ file [Link] es de
[Link]-2.6.32-24-generic: gzip compressed data, from Unix, last modified: Fri hecho
Aug 20 [Link] 2010 un
root@servidor:/boot$
archivo
cpio
comprimido en formato gzip. Los comandos de creación de ramdisk generan directamente sus archivos en
este formato.
Un sistema reciente sólo debería ofrecer el comando mkinitramfs, sin embargo, si mkinitrd
también está disponible, no debería usarse. mkinitrd se basa en devfs y no en udev, y no
soporta los discos sata.
g. Configuración del gestor de arranque
No basta con tener compilado el kernel y haberlo puesto en el sitio adecuado, todavía falta por configurar el
gestor de arranque para que sea capaz de cargar este kernel. Por consiguiente, hay que añadir su entrada al
gestor de arranque. Atención, no hay que quitar nada de lo que ya haya en la configuración del gestor de
arranque: no se toca lo que ya funciona. Basta con añadir una entrada en el archivo de configuración del
gestor basándose, si fuera necesario, en las entradas ya existentes.
La conservación de entradas existentes siempre permitirá poder arrancar usando una configuración estable.
1. Adición de parches
Para beneficiarse de un kernel reciente se puede descargar las fuentes completas del núcleo, compilarlas e
instalarlas como un kernel nuevo. Un método alternativo consiste en utilizar las fuentes del kernel antiguo y
parchearlas antes de recompilarlas.
Los parches se descargan del sitio web [Link] y se añaden a las fuentes del kernel. La
aplicación de un parche se hace generalmente con el comando patch y puede hacerse específicamente con un
script liberado con el kernel que se llama patch-kernel. El script patch-kernel se encuentra en el
directorio scripts de las fuentes del kernel, mientras que el comandopatch viene con la distribución Linux.
Un
Aplicación de parches: opciones y parámetros
archivo
-pn Depende del diseño del archivo de parches. Sube n niveles de
jerárquicos en las rutas de los archivos escritos. parches
es en
archivo_parche El archivo que contiene los parches que se aplicarán. realidad
el
resultado de un comando diff aplicado a dos estructuras de directorios de fuentes distintas. Por tanto, el
archivo resultante contendrá una referencia a cada uno de los archivos de la estructura de directorios que
deben modificarse. Si el nivel jerárquico de los archivos descritos no se corresponde con el de las fuentes que
se modificarán, el parámetro -p permite desplazar esta jerarquía.
Los archivos de parche son extremadamente sensibles a la conformidad de las fuentes a las que se aplican. Sólo se
obtendrá un resultado positivo si se aplica el parche adecuado a las fuentes adecuadas.
2. Retirada de parches
La retirada de un parche aplicado se realiza con el mismo comando y la misma sintaxis, a la que se añade el
conmutador -R.
Aplicación de un parche a las fuentes
Ejemplo
Aplicación de parches: opciones y parámetros
de
-pn Depende del diseño del archivo de parches. Sube n niveles retirada
jerárquicos en las rutas de los archivos escritos. de un
parche
-R Retira el parche en vez de aplicarlo.
1. Preguntas
1 ¿Por qué razón un programa escrito en un lenguaje de programación compilado es generalmente más
eficiente que un programa escrito en un lenguaje interpretado?
2 ¿Para que sirve el script configure que generalmente de publica con las fuentes de los programas open
source?
4 Cuando un programa se compila de forma dinámica, ¿de qué elementos depende en su entorno de
ejecución?
5 ¿Cómo sabe el comando ldconfig qué directorios debe analizar para inventariar las librerías de un
sistema?
6 En el contexto de una compilación de kernel, ¿qué objetivo del comando make permite basarse en un
archivo .config resultante de una compilación anterior?
8 Ante la ausencia de una configuración particular, ¿en qué circunstancia un módulo de kernel presente en
forma de archivo en el sistema no se carga en el arranque?
9 ¿Cuál es la naturaleza de un archivo de carga de ramdisk utilizado durante la carga del kernel para la
detección de periféricos?
2. Respuestas
1 ¿Por qué razón un programa escrito en un lenguaje de programación compilado es generalmente más
eficiente que un programa escrito en un lenguaje interpretado?
La ejecución de un programa interpretado requiere el uso de otro programa llamado intérprete, que por cada
acción descrita en el código del programa deberá traducirla en una multitud de instrucciones de procesador. En
el caso de un programa compilado, el código binario del programa compilado contiene directamente
instrucciones inteligibles por el procesador. El tratamiento es, por tanto, mucho más rápido. Como desventaja,
el código compilado está íntimamente relacionado con el juego de instrucciones de un procesador y, por
consiguiente, es menos portable.
2 ¿Para que sirve el script configure que generalmente de publica con las fuentes de los programas open
source?
Para comprobar la validez del entorno de compilación y para generar un archivo de salida Makefile que utilizará
el compilador. Puede ocurrir que las fuentes se publiquen sin el script configure. Generalmente sucede cuando
el desarrollador no desea que se personalice su programa antes de la compilación.
El comando make clean limpia el directorio de las fuentes de todos los elementos resultantes de la compilación.
Se puede realizar una nueva compilación sobre las mismas bases. El comando make mrproper borra cualquier
otro elemento que no pertenezca a las fuentes, incluso los elementos de configuración. Deja una situación
similar a si se hubiera borrado todo lo realizado hasta justo después de haber extraído las fuentes del archivo
tar. Cabe destacar que estas opciones no siempre están disponibles (especialmente mrproper).
4 Cuando un programa se compila de forma dinámica, ¿de qué elementos depende en su entorno de
ejecución?
De las librerías compartidas. Es muy extraño hoy en día encontrar ejecutables compilados con librerías
estáticas. De este modo se optimiza el espacio en disco, pero el ejecutable se vuelve más dependiente de su
entorno.
5 ¿Cómo sabe el comando ldconfig qué directorios debe analizar para inventariar las librerías de un
sistema?
Consultando el archivo de configuración /etc/[Link]. Este archivo contiene la lista de directorios que se
deben analizar para encontrar los archivos de librerías.
6 En el contexto de una compilación de kernel, ¿qué objetivo del comando make permite basarse en un
archivo .config resultante de una compilación anterior?
Es el objetivo oldconfig. Sólo los nuevos elementos a los que no se hace referencia en el antiguo archivo .config
serán objeto de pregunta al usuario.
Porque la numeración impar de la segunda cifra indica que se trata de un kernel en desarrollo. Las
versiones de producción pasan directamente de la versión 2.4 a la versión 2.6.
8 Ante la ausencia de una configuración particular, ¿en qué circunstancia un módulo de kernel presente en
forma de archivo en el sistema no se carga en el arranque?
Si este módulo no es necesario. Ya sea porque gestiona un hardware que no está en el sistema, o bien porque
no se invoca por ninguna función lógica.
9 ¿Cuál es la naturaleza de un archivo de carga de ramdisk utilizado durante la carga del kernel para la
detección de periféricos?
Se trata de un archivo cpio comprimido en formato gzip. Ante la ausencia de extensión estándar en un archivo
comprimido, hay que recurrir al comando file para averiguar su tipo. Atención, si desea ver el contenido,
primero hay que renombrarlo con un nombre que lleve la extensión adecuada (gz), y después extraerlo con el
comando cpio.
Porque el comando initrd no se basa en la gestión de hardware moderno udev, sino que usa devfs y, además,
no es capaz de gestionar discos duros sata, lo cual es un problema en los sistemas recientes.
Trabajos prácticos
En el servidor beta, vaya al sitio [Link] y descargue las fuentes de la última versión disponible del
software (sección Downloads, la versión más reciente del programa).
Comandos útiles
configure
make
tar
Operaciones
[root@beta rdp]# ls
[Link]
[root@beta rdp]# tar xzf [Link]
[root@beta rdp]# ls
rdesktop-1.6.0 [Link]
[root@beta rdp]# cd rdesktop-1.6.0
[root@beta rdesktop-1.6.0]#
Configuración de la compilación:
Compilación:
c.
Comandos útiles
make
Operaciones
Observe que los elementos instalados no sólo se centran en elementos binarios compilados, sino que también
hay otros archivos como los de ayuda o de configuración.
d. Limpieza de fuentes
Comandos útiles
make
Operaciones
2.
[root@beta rdesktop-1.6.0]# ls -l rdesktop
-rwxr-xr-x 1 root root 615042 ago 13 21:03 rdesktop
[root@beta rdesktop-1.6.0]# make clean
rm -f *.o *~ vnc/*.o vnc/*~ rdesktop rdp2vnc
[root@beta rdesktop-1.6.0]# ls -l rdesktop
ls: no se puede acceder a rdesktop: No existe el fichero o el directorio
[root@beta rdesktop-1.6.0]# ls -l Makefile
-rw-r--r-- 1 root root 5823 ago 13 21:03 Makefile
[root@beta rdesktop-1.6.0]#
Descargue del sitio web de Ediciones ENI el archivo [Link] y proceda a su extracción.
Comandos útiles
lsmod
rm
rmmod
Operaciones
c.
Compilación de fuentes
Comandos útiles
make
Operaciones
[root@beta tg3-3.110g]# ls -l
total 1024
-rw-r--r-- 1 2397 305 350928 abr 13 23:19 ChangeLog
-rw-r--r-- 1 2397 305 15153 ene 9 2009 LICENSE
-rw-r--r-- 1 2397 305 3870 may 13 01:16 Makefile
-rwxr--r-- 1 2397 305 6584 abr 13 18:56 [Link]
-rw-r--r-- 1 2397 305 10921 jun 8 19:58 [Link]
-rw-r--r-- 1 2397 305 3445 feb 5 2010 tg3.4
-rw-r--r-- 1 2397 305 424808 jun 9 00:45 tg3.c
-rw-r--r-- 1 2397 305 2253 mar 31 22:20 tg3_compat2.h
-rw-r--r-- 1 2397 305 35711 jun 4 20:08 tg3_compat.h
-rw-r--r-- 1 2397 305 43934 mar 31 22:26 tg3_firmware.h
-rw-r--r-- 1 2397 305 114378 jun 4 20:01 tg3.h
-rw-r--r-- 1 2397 305 4286 jun 4 01:45 tg3_vmware.c
-rw-r--r-- 1 2397 305 1354 jun 4 01:57 tg3_vmware.h
Compilación:
d.
Carga
[root@beta tg3-3.110g]# make del
sh [Link] /lib/modules/2.6.18-194.el5/source > tg3_flags.h módulo
make -C /lib/modules/2.6.18-194.el5/build SUBDIRS=/root/Desktop/red/tg3-3.110g modules de
make[1]: se ingresa al directorio `/usr/src/kernels/2.6.18-194.el5-i686’
kernel
CC [M] /root/Desktop/red/tg3-3.110g/tg3.o
e
Building modules, stage 2.
MODPOST
CC /root/Desktop/red/tg3-3.110g/[Link].o
LD [M] /root/Desktop/red/tg3-3.110g/[Link]
make[1]: se sale del directorio `/usr/src/kernels/2.6.18-194.el5-i686’
[root@beta tg3-3.110g]#
Comandos útiles
insmod
ls
lsmod
Operaciones
1. Comprobar la presencia del archivo [Link]. Éste es el módulo del kernel que se
acaba de compilar.
3.
[root@beta tg3-3.110g]# make install
make -C /lib/modules/2.6.18-194.el5/build SUBDIRS=/root/Desktop/red/tg3-3.110g modules
make[1]: se ingresa al directorio `/usr/src/kernels/2.6.18-194.el5-i686’
Building modules, stage 2.
MODPOST
make[1]: se sale del directorio `/usr/src/kernels/2.6.18-194.el5-i686’
gzip -c tg3.4 > [Link]
mkdir -p //lib/modules/2.6.18-194.el5/updates;
install -m 444 [Link] //lib/modules/2.6.18-194.el5/updates;
install -m 444 [Link] /usr/share/man/man4;\
[root@beta tg3-3.110g]#
Comandos útiles
cp
patch
tar
Operaciones
3. El parche ha sido diseñado desde el directorio padre de los fuentes. Por lo tanto
no se puede aplicar directamente desde el directorio de fuentes. Aplique el parche
retirando un nivel de directorios.
toto@ubuntu:~$ ls
[Link] modif_compras
toto@ubuntu:~$ tar xzf [Link]
toto@ubuntu:~$ ls compras
lunes martes miércoles
toto@ubuntu:~$ cp modif_compras compras
toto@ubuntu:~$
c.
Como no desea comprar nabos y teme que le inviten a cenar, decide retirar el parche.
Comandos útiles
patch
Operaciones
1. Retirar el parche.
2. Mostrar la lista de la compra del lunes.
4.
toto@ubuntu:~/compras$ cat lunes/compras
mantequilla
queso
pan
zanahorias
toto@ubuntu:~/compras$
Para disponer de las herramientas de compilación en el servidor alfa, hay que introducir el comando siguiente:
Comandos útiles
tar
Operaciones
1. Ir al sitio web [Link] y descargar las fuentes completas del último kernel
estable (enlace Latest Stable Kernel).
c.
toto@alfa:~/kernel$ ls
[Link].bz2
toto@alfa:~/kernel$ tar xjf [Link].bz2
toto@alfa:~/kernel$ ls
linux-3.4.4 [Link].bz2
toto@alfa:~/kernel$
Configuración y compilación del kernel
Comandos útiles
make
Operaciones
1. Generar un archivo de configuración del kernel usando todos los valores por
defecto en la compilación.
3. Compilar el kernel.
toto@alfa:~/kernel$ cd linux-3.4.4
toto@alfa:~/kernel/linux-3.4.4$ make defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/[Link].c
HOSTCC scripts/kconfig/[Link].o
HOSTLD scripts/kconf/conf
*** Default configuration is based on ’i386_defconfig’
#
# configuration written to .config
#
toto@alfa:~/kernel/linux-3.4.4$
menudo, puede que la definición del objetivo defconfig no sea la más adecuada para un uso habitual. Un método
alternativo consiste en utilizar el objetivo config (make config) y "aburrirse" pulsando la tecla [Enter] una y otra
vez para utilizar todos los valores por defecto.
d.
toto@alfa:~/kernel/linux-3.4.4$ make
scripts/kconfig/conf --silentoldconfig Kconfig
SYSHDR arch/x86/syscalls/../include/generated/asm/unistd_32.h
SYSHDR arch/x86/syscalls/../include/generated/asm/unistd_64.h
SYSHDR arch/x86/syscalls/../include/generated/asm/unistd_x32.h
SYSTBL arch/x86/syscalls/../include/generated/asm/syscalls_32.h
HOSTCC arch/x86/tools/relocs
CHK include/linux/version.h
UPD include/linux/version.h
(...)
CC arch/x86/boot/version.o
CC arch/x86/boot/video-vga.o
CC arch/x86/boot/video-vesa.o
CC arch/x86/boot/video-bios.o
LD arch/x86/boot/[Link]
OBJCOPY arch/x86/boot/[Link]
OBJCOPY arch/x86/boot/[Link]
HOSTCC arch/x86/boot/tools/build
BUILD arch/x86/boot/bzImage
Setup is 13248 bytes (padded to 13312 bytes).
System is 4812 kB
CRC 91ad448d
Kernel: arch/x86/boot/bzImage is ready (#1)
Building modules, stage 2.
MODPOST 5 modules
CC arch/x86/kernel/test_nx.mod.o
LD [M] arch/x86/kernel/test_nx.ko
CC drivers/hid/[Link].o
LD [M] drivers/hid/[Link]
CC drivers/scsi/scsi_wait_scan.mod.o
LD [M] drivers/scsi/scsi_wait_scan.ko
CC net/netfilter/xt_LOG.mod.o
LD [M] net/netfilter/xt_LOG.ko
CC net/netfilter/xt_mark.mod.o
LD [M] net/netfilter/xt_mark.ko
toto@alfa:~/kernel/linux-3.4.4$
Comandos útiles
cp
make
su
Operaciones
Copia
del
toto@alfa:~/kernel/linux-3.4.4$ su archivo
Contraseña: de
root@alfa:/home/toto/kernel/linux-3.4.4# cp arch/x86/boot/bzImage /boot/vmlinuz-3.4.4
root@alfa:/home/toto/kernel/linux-3.4.4#
configuración:
Instalación de módulos:
e.
Comandos útiles
file
mkinitramfs
Operaciones
root@alfa:/home/toto/kernel/linux-3.4.4# cd /boot
root@alfa:/boot# mkinitramfs -o [Link]-4.5.5 3-4-4
grep: /boot/config-3-4-4: No existe el fichero o el directorio
WARNING: missing /lib/modules/3-4-4
Device driver support needs thus be built-in linux image!
FATAL: modules must be specified in absolute paths.
"3-4-4" is a relative path
FATAL: Could not load /lib/modules/3-4-4/[Link]: No such file or directory
(...)
root@alfa:/boot# ls /lib/modules/
2.6.32-5-686 3.4.4
root@alfa:/boot# mkinitramfs -o [Link]-3.4.4 3.4.4
W: mdadm: /etc/mdadm/[Link] defines no arrays.
root@alfa:/boot#
Comprobación:
f.
Comandos útiles
update-grub
Operaciones
1. Solicitar al gestor de arranque que tenga en cuenta al nuevo núcleo.
g.
root@alfa:/boot# update-grub
Generating [Link] ...
Found linux image: /boot/vmlinuz-3.4.4
Found initrd image: /boot/[Link]-3.4.4
Found linux image: /boot/vmlinuz-2.6.32-5-686
Found initrd image: /boot/[Link]-2.6.32-5-686
done
root@alfa:/boot#
Si realiza la instalación del núcleo en un sistema con GRUB 1, como una Debian 5 o la distribución CentOS, siga
los siguientes pasos :
/boot/grub/[Link]
vi
Operaciones
3. Al final del archivo, se encuentra la última sección que hace referencia a un kernel
ordinario (non single), duplicarla.
4. Modificar el título de forma que aparezca de algún modo que el kernel no está
validado.
6. Modificar el valor del parámetro initrd para cambiar al nuevo archivo de imágenes
de módulos.
8. No hay que dejarse impresionar por los mensajes de error, ya sean bloqueantes o
no. La compilación de un kernel es una tarea larga y no tiene éxito
necesariamente en medio día. Además, ¡hay que recordar que se tiene que
conservar los kernels existentes por si aparecen errores!
timeout 15
(...)
## ## End Default Options ##