2.1. Seguridad de la estación de trabajo
Asegurar un entorno Linux comienza con la estación de trabajo. Ya sea bloqueando una máquina personal, o asegurando un sistema corporativo, cualquier política de seguridad empieza con la computadora individual. La seguridad de una red de computadoras es la misma que la de su nodo más débil.
2.1.1. Evaluación de la seguridad de la estación de trabajo
Cuando se evalúa la seguridad de una estación de trabajo Fedora, considere los siguientes aspectos:
Seguridad del BIOS y del gestor de arranque — ¿Puede un usuario no autorizado tener acceso a la máquina e iniciarla como usuario único, o en modo de rescate, sin ninguna contraseña?
Seguridad de la contraseña — ¿Qué tan seguras son las contraseñas de usuario en la máquina?
Controles administrativos — ¿Quién posee una cuenta en el sistema y cuánto control administrativo posee?
Servicios de red disponibles — ¿Qué servicios están escuchando peticiones activas de la red? ¿Deberían estar ejecutándose?
Cortafuegos personals — En caso de necesitarse alguno, ¿qué tipo de cortafuegos son necesarios?
Herramientas de seguridad en la comunicación mejoradas — ¿Qué herramientas deberían utilizarse para comunicarse entre estaciones de trabajo, y cuáles deberían evitarse?
2.1.2. Seguridad en el BIOS y en el gestor de arranque
Una protección del BIOS (o de su equivalente) y del gestor de arranque mediante una contraseña, puede prevenir que el sistema sea iniciado mediante la utilización de medios removibles, o que se obtengan privilegios de usuario root, por cualquier usuario no autorizado que tenga acceso físico al él. Las medidas de seguridad que debería adoptar para protegerse de este tipo de ataques depende tanto de la calidad de la información de la estación de trabajo, como de la ubicación de la máquina.
Por ejemplo, si una máquina es utilizada en algún tipo de evento, y no contiene ninguna clase de información importante, entonces no sería prioritario prevenir tales ataques. Sin embargo, si la laptop de algún empleado con claves SSH privadas y no encriptadas de la red de la compañía es descuidada en el mismo evento anterior, podría permitir una falla importante en la seguridad, con consecuencias para la compañía entera.
Por otro lado, si la estación de trabajo se encuentra ubicada en un lugar al cuál tienen acceso solo personas autorizadas o de confianza, en ese caso asegurar el BIOS o el gestor de arranque podría no ser necesario.
Las dos razones fundamentales para proteger con una contraseña el BIOS de una computadora son []:
Evitar modificaciones a la configuración del BIOS — Si un intruso tiene acceso al BIOS, puede configurarlo para iniciarse desde un diskette o CD-ROM. Esto hace que sea posible para él ingresar en modo rescate o en modo de único usuario, lo que a su vez permite que inicie procesos a elección en el sistema, o que pueda copiar información importante.
Evitar el inicio del sistema — Algunas BIOS permiten protección mediante contraseñas del proceso de arranque. Cuando es activado, el atacante se ve obligado a ingresar una contraseña antes que el BIOS ejecute el gestor de arranque.
Debido a que los métodos para establecer una contraseña de BIOS son diferentes de acuerdo a cada fabricante, consulte el manual de la computadora para instrucciones específicas.
Si no recuerda la contraseña del BIOS, puede ser reseteada o bien mediante jumpers en la placa madre, o bien desconectando la batería del CMOS. Por esta razón, es una buena costumbre bloquear el gabinete de la computadora siempre que sea posible. Sin embargo, consulte el manual de la computadora o de la placa madre antes de intentar desconectar la batería del CMOS.
Otras arquitecturas utilizan diferentes programas para realizar tareas de bajo nivel, apenas equivalentes a las que realiza el BIOS en sistemas x86. Por ejemplo, las computadoras Intel® Itanium™ utilizan el shell Interfaz de firmware extensible (EFI, por las iniciales en inglés de Extensible Firmware Interface).
Para instrucciones acerca de la protección mediante contraseñas de programas similares al BIOS, consulte las instrucciones del fabricante.
2.1.2.2. Contraseñas del gestor de arranque
Las principales razones por las que proteger un gestor de arranque de Linux son las siguientes:
Prevenir el ingreso en modo de único usuario — Si los atacantes pueden iniciar el sistema en modo de usuario único, automáticamente se registran como usuarios root sin que para ello se les solicite una contraseña de usuario root.
Prevenir el acceso a la consola del GRUB — Si la máquina en cuestión utiliza el GRUB como su gestor de arranque, un atacante puede utilizar la interfaz del editor del GRUB para modificar sus configuraciones, o para reunir información utilizando el comando cat
.
Prevenir el acceso a sistemas operativos no seguros — Si el sistema en cuestión es de arranque dual, un atacante puede seleccionar uno de los sistemas en el momento del inicio (por ejemplo, DOS), que ignora controles de acceso y permisos de archivo.
Fedora por defecto instala el gestor de arranque GRUB en la plataforma x86. Para una exposición detallada del GRUB, consulte la Guía de Instalación de Fedora.
2.1.2.2.1. Protección de GRUB con contraseña
Puede configurar el GRUB para prevenir los dos primeros problemas descritos en la
Sección 2.1.2.2, “Contraseñas del gestor de arranque”, añadiendo una directiva de contraseña a su archivo de configuración. Para hacerlo, primero elija una contraseña poderosa, abra una terminal, regístrese como usuario root, e ingrese el siguiente comando:
/sbin/grub-md5-crypt
Cuando se le solicite, ingrese la contraseña del GRUB y presione la tecla Intro. Con esto obtendrá un hash MD5 de la contraseña.
A continuación, edite el archivo de configuración del GRUB /boot/grub/grub.conf
. Abra el archivo y debajo de la línea timeout
en la sección principal del documento, añada la siguiente:
password --md5 <hash-de-contraseña>
Reemplace <hash-de-contraseña>
con el valor obtenido por el comando /sbin/grub-md5-crypt
[].
La próxima vez que el sistema sea iniciado, el menú del GRUB evitará que se ingrese al editor, o a la interfaz de comandos, sin haber presionado primero la tecla p, seguida de la contraseña del GRUB
Desafortunadamente, esta solución no previene que un atacante inicie el equipo con un sistema operativo no seguro, si es que existe un entorno de arranque dual. Para esto, debe ser editada una parte diferente del archivo /boot/grub/grub.conf
.
Ubique la línea title
del sistema operativo que desea asegurar, y añada otra línea con la directiva lock
inmediatamente debajo de ella.
Para un sistema DOS, el bloque de líneas pertinente debería empezar de manera similar a la siguiente:
title DOS lock
Advertencia
Una línea password
debe estar presente en la sección principal del archivo /boot/grub/grub.conf
para el correcto funcionamiento de este método. De lo contrario, un atacante puede acceder a la interfaz del editor del GRUB y eliminar la línea de bloqueo.
Para crear una contraseña diferente para un kernel particular o sistema operativo, añada la línea lock
a las presentes seguida de una línea de contraseña.
Cada porción de líneas protegidas con una contraseña única deberían empezar de manera similar al siguiente ejemplo:
title DOS lock password --md5 <password-hash>
2.1.3. Seguridad de contraseñas
Las contraseñas son el método primario que Fedora utiliza para verificar la identidad de los usuarios. Este es el motivo por el que la seguridad de la contraseña es tan importante para la protección del usuario, la estación de trabajo y la red.
Por motivos de seguridad, el programa de instalación configura el sistema para utilizar Message-Digest Algorithm (MD5) y ocultar las contraseñas. Es muy recomendable que no modifique estas configuraciones.
Si las contraseñas MD5 son deseleccionadas durante la instalación, el antiguo formato
Data Encryption Standard (
DES) es utilizado. Este formato limita las contraseña a ocho caracteres alfanuméricos (deshabilitando los signos de puntuación y otros caracteres especiales), y proveyendo un modesto nivel de encriptado de 56 bits.
Si durante la instalación se deselecciona el ocultamiento de contraseñas, todas las contraseñas son almacenadas en un hash unidireccional en el archivo de lectura pública /etc/passwd
, lo que hace que el sistema sea vulnerable a los ataques de descubrimiento de contraseñas fuera de línea. Si un intruso puede obtener acceso a la máquina como un usuario regular, puede copiar el archivo /etc/passwd
a su propio equipo, y ejecutar cualquier cantidad de programas de descubrimiento de contraseñas sobre él. Si existe una contraseña no segura en el archivo, es sólo cuestión de tiempo antes que el atacante la encuentre.
El ocultamiento de contraseñas elimina este tipo de ataques almacenando el hash de contraseña en el archivo /etc/shadow
, que solo puede ser leído por el usuario root.
Esto obliga a los potenciales atacantes a intentar descubrir las contraseñas remotamente, registrándose en un servicio de red en la máquina, como por ejemplo SSH o FTP. Esta clase de ataque de tipo fuerza bruta es mucho más lento y deja un rastro obvio, consistente en los cientos de intentos fallidos de registro almacenados en los archivos del sistema. Por supuesto, si el atacante inicia un ataque en medio de la noche en un sistema con contraseñas débiles, podría obtener acceso antes del amanecer y editar los archivos de registro para eliminar sus huellas.
Además del las cuestiones acerca del formato y del almacenamiento, está el problema de los contenidos. La única cosa realmente importante que un usuario puede hacer para proteger su cuenta de ataques para descubrir su contraseña, es crear una contraseña poderosa.
2.1.3.1. Creando contraseñas poderosas
Para crear una contraseña segura, es una buena idea seguir las siguientes indicaciones:
No utilice solo palabras o números — Nunca utilice solo números o palabras en contraseñas.
Algunos ejemplos inseguros incluyen los siguientes:
No use palabras reconocibles — Palabras como nombres propios, palabras de diccionario, o incluso términos de shows de televisión, o de novelas, deberían ser evitados. Aún si están complementadas con números.
Algunos ejemplos inseguros incluyen los siguientes:
No utilice palabras de otros idiomas — Los programas de descubrimiento de contraseñas a menudo verifican sobre listas de palabras que incluyen diccionarios de muchos idiomas. Confiar en idiomas extranjeros para establecer contraseñas seguras, no es algo aconsejable.
Algunos ejemplos inseguros incluyen los siguientes:
cheguevara
bienvenido1
1dumbKopf
No utilice terminología hacker — Si usted piensa que es intocable porque utiliza terminología hacker — también denominada lengua l337 (LEET) — en su contraseña, piénselo dos veces, Muchas listas de palabras incluyen lengua LEET.
Algunos ejemplos inseguros incluyen los siguientes:
No use Información Personal — Evite usar cualquier tipo de información personal en sus contraseñas. Si el atacante conoce su identidad, la tarea de deducir su contraseña se vuelve más fácil. La siguiente es una lista de los tipos de información a evitar cuando se crea una contraseña:
Algunos ejemplos inseguros incluyen los siguientes:
Su nombre
El nombre de su mascota
El nombre de un miembro de la familia
Cualquier fecha de cumpleaños
Su número de teléfono o su código postal
No invierta palabras reconocibles — Los buenos verificadores de contraseña siempre invierten palabras comunes, por lo que la inversión de un mala contraseña no la hace más segura.
Algunos ejemplos inseguros incluyen los siguientes:
No escriba su contraseña — Nunca guarde su contraseña en papel. Es más seguro memorizarla.
No use la misma contraseña para todas las computadoras — es importante crear contraseñas distintas para cada máquina. De esta forma, si un sistema está comprometido, todas sus computadoras no estarán inmediatamente en riesgo.
Los siguientes consejos le ayudarán a crear una contraseña fuerte:
La contraseña debe tener al menos 8 caracteres de largo — Cuanto más larga la contraseña, mejor. Si usa contraseñas MD5, deben ser de 15 caracteres o más. Con contraseñas DES, use la longitud máxima (ocho caracteres).
Mezcle letras en mayúsculas y minúsculas — Fedora diferencia entre mayúsculas y minúsculas, por lo que su mezcla mejora la fortaleza de la contraseña.
Mezcle letras con números — Agregar números a la contraseña mejora la fortaleza de la misma, especialmente cuando se los agrega en el medio (no al principio ni al final).
Incluya caracteres no alfanuméricos — Caracteres especiales como &, $, y > pueden mejorar mucho la fortaleza de la contraseña (esto no es posible cuando se utilicen contraseñas DES).
Elija una contraseña que pueda recordar — La mejor contraseña del mundo no mejora nada si no la puede recordar; use siglas u otros dispositivos memotécnicos para ayudarle a recordar las contraseñas.
Con todas estas reglas, puede parecer difícil crear una contraseña que cumpla al mismo tiempo con todos los criterios pedidos para una buena contraseña, y que evite la creación de una mala. Afortunadamente, hay algunos pasos que se pueden tomar para generar una contraseña segura y fácil de recordar.
2.1.3.1.1. Metodología para la creación de una contraseña segura
Hay muchos métodos que se pueden usar para crear contraseñas seguras. Uno de los más populares involucra las siglas. Por ejemplo:
Piense en una frase fácil de recordar, tal como:
"por el río y a través del bosque, vamos a la casa de la abuela."
Luego, conviértala en una sigla (incluyendo la puntuación).
peryatdb,valcdla.
Agregue complejidad sustituyendo números y símbolos por letras en la sigla. Por ejemplo, sustituya 7
por t
el arroba (@
) por a
:
pery@7db,v@lcdl@.
Agregue más complejidad poniendo en mayúsculas al menos una letra, tal como la B
.
pery@7dB,v@lcdl@.
Finalmente, no use nunca la contraseña ejemplo anterior para ningún sistema.
La creación de contraseñas seguras es imperativo, y su apropiada administración es igual de importante, especialmente para administradores de sistemas dentro de organizaciones grandes. La siguiente sección detalla las buenas prácticas para crear y administrar las contraseñas de los usuarios dentro de una organización.
2.1.3.2. Creación de contraseñas de usuarios dentro de una organización
Si una organización tiene un gran número de usuarios, los administradores de sistema tienen dos opciones básicas disponibles para obligar al uso de contraseñas buenas. Pueden crear contraseñas para los usuarios, o permitirles crear sus propias contraseñas, pero verificando que sean de una calidad aceptable.
La creación de contraseñas para usuarios asegura que las contraseñas sean buenas, pero se vuelve una tarea intimidante a medida que la organización crece. También aumenta el riesgo de que los usuarios escriban sus contraseñas.
Por estas razones, la mayoría de los administradores de sistema prefieren que sus usuarios creen sus propias contraseñas, pero verificar activamente que sean buenas y, en algunos casos, forzarlos a cambiarlas periódicamente mediante el establecimiento de un período determinado de validez.
2.1.3.2.1. Obligando a usar contraseñas poderosas
Para proteger la red de intrusos, es una buena idea que los administradores del sistema comprueben que las contraseñas utilizadas dentro de una organización sean buenas y potentes. Cuando se les pida a los usuarios crear o modificar una contraseña, pueden utilizar la herramienta de línea de comando
passwd
, que es compatible con el
Administrador de módulos de autenticación conectables (
PAM, por las iniciales en inglés de Pluggable Authentication Manager), y por lo tanto verifica si la contraseña es demasiado corta o demasaido fácil de descubrir. Esta comprobación es realizada utilizando el módulo PAM
pam_cracklib.so
. Ya que PAM es personalizable, es posible añadir más verificadores de la integridad de las contraseñas, como ser por ejemplo,
pam_passwdqc
(disponible en
http://www.openwall.com/passwdqc/), o escribir un módulo nuevo. Para conocer una lista de módulos PAM disponibles, vea
http://www.kernel.org/pub/linux/libs/pam/modules.html. Para obtener mayor información acerca de PAM, vaya a la
Sección 2.4, “Módulos de autenticación conectables (PAM, por las iniciales en inglés de Pluggable Authentication Modules)”.
La verificación de la contraseña que se realiza al momento de su creación, no permite saber con tanta certeza si una contraseña es débil, cosa que sí se puede verificar exactamente con la ejecución sobre ellas de un programa de descubrimiento de contraseñas.
Muchos programas de descubrimiento de contraseñas están disponibles para ejecutarse en Fedora, aunque ninguno viene con el sistema operativo. A continuación ofrecemos una pequeña lista con algunos de los programas de descubrimiento de contraseñas más populares:
John The Ripper — Un programa de descubrimiento de contraseña rápido y flexible. Permite el uso de múltiples listas de palabras y puede descubrir contraseñas por fuerza bruta. Está disponible en línea en
http://www.openwall.com/john/.
Slurpie —
Slurpie es similar a
John The Ripper y a
Crack, pero se diseñó para correr en varias computadoras a la vez, creando un ataque de descubrimiento de contraseñas distribuido. Se puede encontrar junto con un número de otras herramientas de evaluación de seguridad al ataque distribuído, en línea en
http://www.ussrback.com/distributed.htm.
Advertencia
Siempre obtenga una autorización por escrito antes de intentar descubrir contraseñas dentro de una organización
2.1.3.2.2. Frases de acceso
Passphrases and passwords are the cornerstone to security in most of today's systems. Unfortunately, techniques such as biometrics and two-factor authentication have not yet become mainstream in many systems. If passwords are going to be used to secure a system, then the use of passphrases should be considered. Passphrases are longer than passwords and provide better protection than a password even when implemented with non-standard characters such as numbers and symbols.
2.1.3.2.3. Edad de las contraseñas
El envejecimiento de las claves es otra técnica usada por los administradores del sistema para defenderlo de malas contraseñas dentro de una organización. El envejecimiento de la contraseña significa que después de un período especificado (normalmente 90 días), el usuario debe crear una nueva contraseña. La idea detrás de este método es que si el usuario es forzado a cambiar su contraseña periódicamente, una contraseña descubierta sería útil para un intruso por un tiempo limitado. La contra del envejecimiento es que los usuarios, seguramente, anotarán en un papel sus contraseñas.
Hay dos programas principales usados para especificar el envejecimiento de contraseñas bajo Fedora: el comando chage
o la aplicación gráfica Administración -> Usuarios y Grupos (system-config-users
).
La opción -M
del comando chage
especifica el número máximo de días en los cuales será válida la contraseña. Por ejemplo, para poner la contraseña del usuario para que venza en 90 días, use el siguiente comando:
chage -M 90 <nombre-de-usuario>
En el comando de arriba, reemplace <nombre-de-usuario>
con el nombre del usuario. Para deshabilitar el vencimiento de la contraseña, es tradicional usar el valor 99999
espués de la opción -M
(esto es cerca de 273 años).
También puede usar el comando chage
en modo interactivo para modificar el envejecimiento de varias contraseñas y detalles de cuenta. Use el siguiente comando para ingresar en modo interactivo:
chage <nombre-de-usuario>
El siguiente es un ejemplo de la sesión interactiva usando este comando:
[root@myServer ~]# chage davido
Changing the aging information for davido
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 10
Maximum Password Age [99999]: 90
Last Password Change (YYYY-MM-DD) [2006-08-18]:
Password Expiration Warning [7]:
Password Inactive [-1]:
Account Expiration Date (YYYY-MM-DD) [1969-12-31]:
[root@myServer ~]#
Vaya a la página man de chage para más información sobre las opciones disponibles.
También se puede usar la aplicación Usuarios y Grupos para crear políticas de envejecimiento de contraseñas, como sigue. Nota: necesita los privilegios de administrador para realizar este procedimiento.
Haga clic en el menú en el panel, apunte al menú y luego haga clic en para mostrar el Aministrador de Usuarios. Alternativamente, teclee el comando system-config-users
en un indicador de shell.
Haga clic en la pestaña Usuarios y seleccione el usuario requerido de la lista de usuarios.
Haga clic en Propiedades en la barra de herramientas para mostrar el cuadro de diálogo de las Propiedades del Usuario (o elija en el menú ).
Haga clic en la pestaña Información de la Contraseña, y seleccione la casilla de Activar expiración de contraseña.
Ingrese el valor requerido en el campo Días requeridos antes de cambiar y haga clic en Aceptar.
2.1.4. Controles administrativos
Cuando se administra una máquina personal, el usuario debe realizar algunas tareas como usuario root, o mediante la adquisisción de privilegios de usuario root, a través de un programa de tipo setuid, como lo son por ejemplo sudo
o su
. Se denomina un programa de tipo setuid a aquel que opera con el ID de usuario (UID) del dueño del programa, en lugar del ID de usuario de quien sea que esté utilizando el programa. Tales programas son identificados con una s
en la sección de pertenencia del listado de formato extenso, como se muestra en el siguiente ejemplo:
-rwsr-xr-x 1 root root 47324 May 1 08:09 /bin/su
Nota
La s
puede figurar en mayúscula o en minúscula. Si aparece en mayúscula, significa que el bit de los permisos subyacentes no ha sido definido.
Sin embargo, para el administrador del sistema de una organización, las elecciones deben ser realizadas tomando en cuenta el tipo de acceso adminsitrativo que los usuarios dentro de la organización deberían tener a su máquina. A través del módulo PAM denominado
pam_console.so
, algunas actividades normalmente reservadas solo para el usuario root, como ser reiniciar o montar medios removibles, son permitidas para el primer usuario que se registre en la consola física (para obtener mayor información acerca del módulo
pam_console.so
, vaya a la
Sección 2.4, “Módulos de autenticación conectables (PAM, por las iniciales en inglés de Pluggable Authentication Modules)”. Sin embargo, otras tareas importantes en el sistema, como ser modificar parámetros de red, configurar un nuevo ratón, o montar dispositivos de red, no será posible realizarlas sin privilegios administrativos. Como resultado, los administradores del sistema deben decidir cuánto acceso deben otorgarle a los usuarios de la red.
2.1.4.1. Permitiendo accesos root
Si los usuarios de una organización son confiables y conocen acerca de computadoras, permitirles acceso root no debería ser un problema. Esto significa que actividades menores, como añadir dispositivos o configurar interfases de red podrían ser realizadas por los usuarios individuales, quedando los administradores del sistema liberados y poder realizar tareas más importantes relacionadas, por ejemplo, con la red o con la seguridad.
Por otro lado, darle accesos de root a usuarios individuales podría generar los siguientes inconvenientes:
Configuración errónea del equipo — Los usuarios con acceso root pueden desconfigurar sus máquinas y necesitar asistencia para resolver problemas. O peor aún, podrían abrir agujeros en la seguridad del sistema sin saberlo.
Ejecutar servicios no seguros — Usuarios con acceso root podrían ejecutar servidores no seguros en su máquina, como por ejemplo Telnet o FTP, poniendo en riesgo en forma potencial nombres de usuarios o contraseñas. Estos servicios transmiten la información sobre la red en formato de texto simple.
Ejecutar archivos adjuntos de correos como usuarios root — Si bien son excepcionales, existen virus de correo electrónico que afectan a los sistemas Linux. Sin embargo, el único momento en que se convierten en una amenaza, es cuando son ejecutados por el usuario root.
2.1.4.2. Anulación del acceso como root
Si un administrador no se encuentra cómodo al permitir que los usuarios se registren como usuarios root por estas razones, o por otras, la contraseña de usuario root debería ser mantenida en secreto, y el acceso al nivel de ejecución 1, o al modo de usuario único, debería ser desactivado mediante una protección del gestor de arranque a través de una contraseña (para obtener mayor información en este aspecto, vea la
Sección 2.1.2.2, “Contraseñas del gestor de arranque”).
Método
|
Descripción
|
Efectos
|
No afecta
|
---|
Cambio del shell para root.
|
Edite el archivo /etc/passwd y cambie la terminal de /bin/bash a /sbin/nologin .
|
Previene acceso a la terminal root y registra cualquiera de tales intentos. | Los siguientes programas están prevenidos al intentar ingresar a la cuenta de usuario root: | · login | · gdm | · kdm | · xdm | · su | · ssh | · scp | · sftp |
|
Programas que no necesiten de una terminal, como por ejemplo, clientes FTP, clientes de correo, y muchos programas de tipo setuid. | Los siguientes programas no están prevenidos al intentar acceder a la cuenta root: | · sudo | · Clientes de FTP | · Clientes de correo |
|
Deshabilitar el acceso root mediante cualquier dispositivo de consola (tty)
|
Un archivo /etc/securetty vacío previene los intentos de accesos root a cualquier dispositivo asociado con la computadora.
|
Previene accesos a la cuenta root mediante la consola o la red. Los siguientes programas son prevenidos al intentar acceder a la cuenta root: | · login | · gdm | · kdm | · xdm | · Otros servicios de red que abran una tty |
|
Programas que no se registran como root, pero que realizan tareas administrativas mediante programas de tipo setuid, o mediante otros mecanismos. | Los siguientes programas no están prevenidos al intentar acceder a la cuenta root: | · su | · sudo | · ssh | · scp | · sftp |
|
Deshabilitación de las opciones de ingreso como root por SSH.
|
Edite el archivo /etc/ssh/sshd_config y establezca el parámetro PermitRootLogin en no .
|
Prevenga el acceso root utilizando el conjunto de herramientas de OpenSSH. Los siguientes programas son prevenidos al intentar acceder a a cuenta root: | · ssh | · scp | · sftp |
|
Esto sólo previene el acceso root al conjunto de herramientas de OpenSSH. |
|
Utilice PAM para limitar el acceso root a los servicios.
|
Edite el archivo para el servicio en cuestión en el directorio /etc/pam.d/ . Asegúrese que el archivo pam_listfile.so sea requerido para autenticación.[]
|
Previene el acceso root a los servicios de red que son compatibles com PAM. | Los siguientes servcicios son prevenidos al intentar acceder a la cuenta de root: | · Clientes de FTP | · Clientes de correo | · login | · gdm | · kdm | · xdm | · ssh | · scp | · sftp | · Cualquier servicio PAM |
|
Programas y servicios que no son compatibles con PAM. |
|
Tabla 2.1. Métodos para deshabilitar la cuenta root
2.1.4.2.1. Deshabilitando la cuenta shell de root
Para prevenir que los usuarios se resgistren directamente como usuarios root, el administrador del sistema puede establecer la consola de la cuenta de root como /sbin/nologin
en el archivo /etc/passwd
. Esto previene el acceso a la cuenta root mediante comandos que necesiten una terminal, como por ejemplo el comando su
y los comandos ssh
.
Importante
Los programas que no necesitan acceso a la consola, como son por ejemplo los clientes de correo electrónico, o el comando sudo
, pueden todavía tener acceso a la cuenta root.
2.1.4.2.2. Deshabilitando conexiones como root
Para en el futuro limitar el acceso a la cuenta root, los administradores pueden deshabilitar la posibilidad de registrarse como usuarios root editando el archivo /etc/securetty
. Este archivo muestra todos los dispositivos a los que el usuario root puede registrarse. Si el archivo no existiese, el usuario root puede registrarse a través de cualquier dispositivo de comunicación en el sistema, ya sea mediante la utilización de la consola, o mediante una interfaz de red. Esto es peligroso ya que un usuario puede registrarse en su máquina como usuario root mediante Telnet, que transmite en la red la contraseña en formato de texto simple. Por defecto, el archivo /etc/securetty
de Fedora sólo permite que el usuario root se registre en la consola asociada físicamente en la máquina. Para prevenir al usuario root que se registre, elimine los contenidos de este archivo con la utilización del siguiente comando:
echo > /etc/securetty
Advertencia
Un archivo /etc/securetty
vacío no evita que el usuario root se registre remotamente en el sistema utilizando el conjunto de herramientas OpenSSH, ya que la consola no se inicia hasta luego de la autenticación.
2.1.4.2.3. Deshabilitando conexiones SSH como root
Los ingresos root mediante el protocolo SSH están deshabilitados por defecto en Fedora; sin embargo, si esta opción ha sido activada, puede deshabilitarse nuevamente editando el archivo de configuración del demonio SSH (/etc/ssh/sshd_config
). Cambie la línea en la que se lee:
PermitRootLogin yes
leer como sigue:
PermitRootLogin no
Para que estos cambios tengan efecto, el demonio SSH debe ser reiniciado. Esto puede realizarse mediante el siguiente comando:
kill -HUP `cat /var/run/sshd.pid`
2.1.4.2.4. Deshabilitando root usando PAM
PAM, a través del módulo /lib/security/pam_listfile.so
, permite gran flexibilidad a la hora de denegar cuentas específicas. El administrador puede utilizar este módulo para hacer referencia a una lista de usuarios que no tienen permitido registrarse. Más abajo mostramos un ejemplo acerca de cómo el módulo es utilizado por el servidor FTP vsftpd
en el archivo de configuración de PAM /etc/pam.d/vsftpd
(el caracter \
al final de la primera línea en el ejemplo no es necesario si la directiva se encuentra en una sola línea):
auth required /lib/security/pam_listfile.so item=user \
sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
Esto le indica a PAM que consulte el archivo /etc/vsftpd.ftpusers
y que niegue el acceso al servicio al usuario listado. El administrador puede modificar el nombre en este archivo, y puede tener diferentes listas para cada servicio, o utilizar una lista principal para negar el acceso a múltiples servicios.
Si el administrador quiere negar el acceso a múltiples servicios, una línea similar puede ser añadida a los archivos de configuración PAM, como por ejemplo, /etc/pam.d/pop
y /etc/pam.d/imap
para clientes e correo, o /etc/pam.d/ssh
para clientes SSH.
2.1.4.3. Limitando acceso como root
En lugar de negarle acceso completamente al usuario root, el admisnitrador podría querer permitirle el acceso sólo mediante la utilización de programas de tipo setuid, como ser por ejemplo su
o sudo
.
Cuando un usuario ejecuta el comando su
, se le solicita la contraseña de root y, luego de la autenticación, le es dado un indicador de consola.
Una vez que se registra mediante el comando su
, el usuario es el usuario root y tiene accesos admisnitrativos absolutos en el sistema []. Además, una vez que el usuario se ha convertido en root, es posible la utilización del comando su
para convertirse en cualquier otro usuario en el sistema sin que por eso se le pida ningún tipo de contraseña.
Debido a la potencia de este programa, los administradores de una organización podrían desear limitar a quiénes tienen acceso a este comando.
Una de las maneras más sencillas de hacer esto es añadiendo usuarios al grupo administrativo especial denominado wheel. Para hacerlo, ingrese el siguiente comando como usuario root:
usermod -G wheel <nombreusuario>
En el comando anterior, reemplace <username>
con el nombre del usuario que desee añadir al grupo wheel
.
También puede utilizar de la siguiente manera el Administrador de usuarios para modificar las pertenencias a los grupos. Nota: necesita privilegios de administrador para realizar este procedimiento:
Haga clic en el menú en el panel, apunte al menú y luego haga clic en para mostrar el Aministrador de Usuarios. Alternativamente, teclee el comando system-config-users
en un indicador de shell.
Haga clic en la pestaña Usuarios y seleccione el usuario requerido de la lista de usuarios.
Haga clic en Propiedades en la barra de herramientas para mostrar el cuadro de diálogo de las Propiedades del Usuario (o elija en el menú ).
Abra el archivo de configuración PAM para el comando su
(/etc/pam.d/su
) en un editor de textos, y elimine el comentario # de la siguiente línea:
auth required /lib/security/$ISA/pam_wheel.so use_uid
Este cambio significa que solo miembros del grupo administrativo wheel
pueden usar este programa.
Nota
El usuario root es por defecto miembro del grupo wheel
.
2.1.4.3.2. El comando sudo
El comando sudo
ofrece un nuevo punto de vista a la cuestión acerca de si otorgarle o no accesos administrativos a los usuarios. Cuando un usuario confiable le anteponga el comando sudo
a un comando administrativo, le será pedida su propia contraseña. Entonces, cuando sea autenticado y asumiendo que el comando le sea permitido, el comando administrativo en cuestión será ejecutado como si este usuario fuera el usuario root.
Los formatos básicos del comando sudo
son los siguientes:
sudo <comando>
En el ejemplo anterior, <command>
debería ser reemplazado por un comando que por lo general esté reservado al usuario root, como ser por ejemplo, mount
.
Importante
Los usuarios del comando sudo
deberían tener mucho cuidado y cancelar esta herramienta antes de abandonar sus equipos, ya que en un período de tiempo de cinco minutos, los usuarios sudo pueden utilizar el comando nuevamente sin que por ello les sea pedida una contraseña. Esta configuración puede modificarse desde el archivo de configuración /etc/sudoers
.
El comando
sudo
permite un alto grado de flexibilidad. Por ejemplo, solo a los usuarios listados en el archivo de configuración
/etc/sudoers
les es permitido utilizar el comando
sudo
, y el comando es ejecutado en la terminal
del usuario, no en una consola de usuario root. Esto significa que la consola del usuario root puede ser completamente deshabilitada, como se indicó en
Sección 2.1.4.2.1, “Deshabilitando la cuenta shell de root”.
El comando sudo
también ofrece un método fácil de entender para su control. Cada autenticación exitosa es registrada en el archivo /var/log/messages
, y el comando ingresado, junto con el nombre del usuario que lo ingresó, se registran en el archivo /var/log/secure
.
Otra ventaja del comando sudo
es que un administrador puede permitir a diferentes usuarios acceder a comandos específicos de acuerdo a sus necesidades.
Los administradores que quieran editar /etc/sudoers
, el archivo de configuración del comando sudo
, deberían utilizar el comando visudo
.
Para otrogarle a un usario todos los privilegios admisnitrativos, ingrese visudo
, y agregue una línea similar a la siguiente en la sección de especificaciones de los privilegios del usuario:
juan ALL=(ALL) ALL
Este ejemplo indica que el usuario juan
, puede utilizar el comando sudo
desde cualquier equipo y ejecutar cualquier comando.
El ejemplo que damos a continuación ilustra pequeños detalles posibles al configurar sudo
:
%users localhost=/sbin/shutdown -h now
Este ejemplo indica que cualquier usuario puede ejecutar el comando /sbin/shutdown -h now
, siempre y cuando lo haga desde una consola.
La página man del archivo sudoers
contiene una lista detallada de opciones.
2.1.5. Servicios de red disponibles
Si bien el acceso de los usuarios a controles administrativos es un problema importante para los administradores del sistema dentro de una organización, controlar qué servicios de red son los que se encuentran activos, es de importancia suprema para cualquiera que opere un sistema Linux.
Muchos servicios bajo Fedora se comportan como servidores de red. Si un servicio de red está ejecutándose en una máquina, una aplicación de servidor (denominada demonio), está escuchando las conexiones de uno o más puertos de red. Cada uno de estos servidores debería ser tratado como una potencial vía de ingreso de atacantes.
2.1.5.1. Riesgos a servicios
Los servicios de red puede plantear numerosos riesgos para sistemas Linux. A continuación mostramos una lista con algunas de las cuestiones principales:
Ataques de denegación de servicio (DoS, por las iniciales en inglés de Denial of Service Attacks ) — Al inundar un servicio con peticiones, un ataque de denegación de servicio puede dejar inutilizable a un sistema, ya que este trata de registrar y de responder a cada petición.
Distributed Denial of Service Attack (DDoS) — A type of DoS attack which uses multiple compromised machines (often numbering in the thousands or more) to direct a co-ordinated attack on a service, flooding it with requests and making it unusable.
Ataques a las debilidades de los programas — Si un servidor está utilizando programas para ejecutar acciones propias, como comúnmente lo hacen los servidores Web, un atacante puede concentrarse en los scripts mal escritos. Este ataque a las debilidades de los programas puede llevar a una condición de desbordamiento del búfer, o permitir que los atacantes modifiquen archivos en el sistema.
Ataques de desbordamiento del búfer — Los servicios que se conectan al rango de puertos que va entre 0 y 1023, deben ser ejecutados como usuario administrativo. Si una aplicación puede provocar un desbordamiento del búfer, un atacante puede obtener acceso al sistema como el usuario que ejecuta el demonio. Debido a que los desbordamientos del búfer existen, los atacantes utilizan herramientas automatizadas para identificar sistemas con debilidades, y una vez obtenido el acceso, usan rootkits automatizados para mantener ese acceso al sistema.
Nota
La amenaza que representa la debilidad de un búfer desbordado es mitigada en Fedora mediante la utilización de ExecShield, un programa de ejecución de segmentación de la memoria y protección de la tecnología, con soporte para kernels de sistemas compatibles x86 de uno o más procesadores. ExecShield reduce el riesgo de un desbordamiento del búfer al clasificar la memoria virtual en segmentos ejecutables y no ejecutables. Cualquier código de programa que intente ejecutarse fuera de los segmentos ejecutables (como por ejemplo codigo maliciosos introducido desde un búfer desbordado que ha sido aprovechado), dispara una falla de segmentación y finaliza.
Execshield también ofrece soporte para las tencologías
No ejecutar (
NX, por las iniciales en inglés de No eXecute) de las plataformas AMD64, y para las tecnologías
Deshabilitar ejecutar (
XD, por las iniciales en inglés de eXecute Disable) de las las plataformas Itanium y sistemas
Intel® 64. Estas tecnologías trabajan junto a ExecShield para prevenir que sea ejecutado código malicioso en la porción ejecutable de la memoria virtual, con una precisión de 4KB de código ejecutable, disminuyendo el riego de un ataque a la debilidad de un búfer desbordado.
Importante
Para limitar la exposición a ataques en la red, todos los servicios que no son utilizados deben ser apagados.
2.1.5.2. Identificando y configurando servicios
Para mejorar la seguridad, muchos de los servicios de red instalados con Fedora están apagados por defecto. Hay, de todas formas, algunas notables excepciones:
cupsd
— El servidor de impresión por defecto para Fedora.
lpd
— Un servidor de impresión alternativo.
xinetd
— Un súper servidor que controla las conexiones de un rango de servidores subordinados, como son, por ejemplo gssftp
y telnet
.
sendmail
— El
Agente de transporte de correo (
MTA, por las iniciales en inglés de Mail Transport Agent) de Sendmail es activado por defecto, pero solo escucha las conexiones del
localhost.
sshd
— El servidor OpenSSH, es un reemplazo seguro para Telnet.
Cuando se intenta conocer cuándo dejar estos servicios en ejecución, lo mejor es utilizar el sentido común y adoptar un punto de vista basado en la precaución. Por ejemplo, si una impresora no está disponible, no deje el servicio cupsd
prendido. Lo mismo vale para portmap
. Si usted no monta volumenes NFSv3, o utiliza NIS (el servicio ypbind
), entonces portmap
debería deshabilitarse.
Verificar qué servicios de red se encuentran disponibles para iniciarse en el momento del arranque del sistema, es sólo una parte de esta historia. Debería verificar también qué puertos están abiertos y escuchando. Para más información, vea la
Sección 2.2.8, “Verificar qué puertos están abiertos”.
2.1.5.3. Servicios inseguros
Cualquier servicio de red es potencialmente inseguro. Es por esto que es tan importante apagar los servicios que no se utilicen. Las debilidades de los servicios son cotidianamente descubiertas y enmendadas, haciendo que sea muy importante actualizar los paquetes relacionados con cualquiera de los servicios de red. Para obtener más información, vea la
Sección 1.5, “Actualizaciones de seguridad”.
Algunos protocolos de red son en sí mismos más inseguros que otros. Estos incluyen los servicios que:
Transmiten sin encriptar nombres de usuarios y contraseñas en la red — Muchos protocolos antiguos, como por ejemplo Telnet y FTP, no encriptan las autenticaciones de las sesiones, y siempre que sea posible, deberían ser evitados.
Transmiten datos vitales sin encriptarse sobre una red — Muchos protocolos transmiten datos en la red sin encriptarlos. Estos protocolos incluyen Telnet, FTP, HTTP y SMTP. Muchos sistemas de archivos de red, como NFS y SMB, también transmiten información sobre internet sin encriptarla. Al utilizar estos protocolos, queda bajo la exclusiva responsabilidad del usuario limitar la clase de datos que se transmitan.
Servicios de volcado de memoria remoto, como netdump
, transmiten el contenido de la memoria sobre una red sin encriptar . Los volcados de memoria pueden contener contraseñas o, peor aún, entradas a base de datos o información sensible.
Otros servicios como finger
y rwhod
revelan información sobre usuarios del sistema.
Ejemplos de servicios inherentemente inseguros incluyen rlogin
, rsh
, telnet
, y vsftpd
.
FTP no es en sí mismo tan peligroso para la seguridad del sistema como las consolas remotas, pero los servidores FTP deben ser cuidadosamente configurados y vigilados para evitar probelmas. Para obtener mayor información acerca cómo asegurar servidores FTP, vea la
Sección 2.2.6, “Asegurando FTP”.
Entre los ervicios que deberían ser cuidadosamente implementados, y colocarse detrás de un cortafuegos, podemos encontrar a:
La siguiente sección discute las herramientas disponibles para crear un cortafuegos sencillo.
2.1.6. Cortafuegos personales
Luego de haberse configurado los servicios de red necesarios, es importante la implementación de un cortafuegos.
Importante
Debería configurar los servicios necesarios e implementar un cortafuegos antes de conectarse a Internet, o a cualquier otra red en la que usted no confíe.
Los cortafuegos previenen que los paquetes de red ingresen a la interfaz de red del sistema. Si una petición es realizada a un puerto bloqueado por un cortafuegos, la petición será ignorada. Si un servicio está escuchando uno de estos puertos bloqueados, no recibe los paquetes y es efectivamente deshabilitado. Por esta razón, debe tenerse cuidado cuando se configure un cortafuegos para bloquear el acceso a puertos que no estén en uso, y se ponga atención al proceso para que no sea bloqueado el acceso a puertos utilizados por otros servicios configurados.
Para la mayoría de los usuarios, la mejor herramienta para configurar un cortafuegos es la herramienta de configuración gráfica de cortafuegos que viene con Fedora: Firewall Configuration Tool (system-config-firewall
). Esta herramienta genera reglas amplias de iptables
para un cortafuegos de propósitos generales, utilizando una interfaz de panel de control.
Para usuarios avanzados y administradores de servidores, es una mejor opción la de configurar manualmente el cortafuegos utilizando
iptables
. Para obtener mayor información, vea la
Sección 2.8, “Cortafuegos”. Para una guía detallada de la utilización del comando
iptables
, vea la
Sección 2.9, “IPTables”.
Así como han crecido el tamaño y la popularidad de Internet, también han aumentado los peligros de la interceptación de las comunicaciones. Con el correr de los años, se han desarrollado herramientas para encriptar las comunicaciones mientras están siendo transferidas sobre la red.
Fedora viene con dos herramientas básicas, que usan algoritmos de encriptación de alto nivel de clave pública, para proteger la información mientras viaja por la red:
OpenSSH — Una implementación libre del protocolo SSH para encriptar comunicaciones de red.
Protección de Privacidad Gnu (GPG, por las iniciales en inglés de Gnu Privacy Guard) — Una implementación libre para proteger los datos de la aplicación para encriptado PGP (por las iniciales en inglés de Pretty Good Privacy).
OpenSSH es la forma más segura de acceder a equipos remotos y reemplazar servicios antiguos y no encriptados como telnet
y rsh
. Open SSH ofrece un servicio de red llamado sshd
y tres aplicaciones de cliente mediante la línea de comandos:
ssh
— Un cliente seguro para acceso a consola remota.
scp
— Un comando de copia remota segura.
sftp
— Un pseudo cliente ftp seguro que permite sesiones interactivas de transferencias de archivos.
GPG es una manera de asegurar la privacidad en la comunicación de correo. Puede ser utilizado tanto para enviar datos sensibles sobre las redes públicas como para proteger datos sensibles en discos duros.
2.2. Seguridad del servidor
Cuando un sistema es utilizado como servidor en una red pública, se convierte en el objetivo de los ataques. Por lo tanto, robustecer el sistema y desconectar los servicios es de importancia suprema para el administrador del sistema.
Antes de profundizar en problemas específicos, recuerde los siguientes consejos generales para fortalecer la seguridad de los servidores:
Mantenga todos los servicios actualizados, para protegerse contra las últimas amenazas.
Siempre que sea posible, utilice protocolos seguros.
Siempre que sea posible, ofrezca sólo un tipo de servicio de red por máquina.
Observe cuidadosamente a todos los servidores en busca de actividad sospechosa.
2.2.1. Asegurando los servicios con encapsuladores TCP y xinetd
Los encapsuladores TCP ofrecen control de acceso para una variedad de servicios. Muchos de los servicios de red modernos, como SSH, Telnet, y FTP, utilizan encapsuladores TCP, quienes hacen de guardianes entre la petición entrante y el servicio solicitado.
Los beneficios que ofrecen los encapsuladores TCP se potencian si se utilizan junto a xinetd
, un super servidor que ofrece acceso adicional, registrado, vinculación, redireccionamiento y control de la utilización de los recursos.
Nota
Es una buena idea utilizar reglas de cortafuego iptables junto con los encapsuladores TCP y
xinetd
, para generar redundancia dentro de los controles de acceso al servicio. Para obtener más información acerca de la implementación de cortafuegos con comandos iptable, vea la
Sección 2.8, “Cortafuegos”.
Las siguientes subsecciones presuponen un conocimiento básico de cada uno de los temas, y se concentran en opciones de seguridad específicas.
2.2.1.1. Mejorando la seguridad utilizando encapsuladores TCP
Los encapsuladores TCP son capaces de mucho más que denegar el acceso a servicios. Esta sección ilustra como se pueden usar para enviar pancartas de conexión, alertar de ataques de nodos en particular y aumentar la funcionalidad de registro. Refiérase a la página del manual hosts_options
para obtener información acerca de la funcionalidad de los encapsuladores TCP y el lenguaje de control.
2.2.1.1.1. Encapsuladores TCP y pancartas de conexión
Desplegar una pancarta apropiada cuando los usuarios se conectan a un servicio es una buena manera de hacerle saber a los posibles atacantes que el administrador del sistema está vigilando. Usted puede también controlar qué información acerca del sistema es presentada a los usuarios. Para implementar una pancarta por medio de encapsuladores TCP para un servicio, use la opción banner
.
Este ejemplo implementa una pancarta para vsftpd
. Para comenzar, cree un archivo de pancarta. Puede ser en cualquier lugar del sistema, pero debe tener el mismo nombre que el demonio. Para este ejemplo, el archivo es llamado /etc/banners/vsftpd
y contiene la siguiente linea:
220-Hola, %c
220-Toda actividad en ftp.ejemplo.com es registrada.
220-El uso inapropiado resultará en la remoción de los privilegios de acceso.
La ficha %c
proveé de una serie de información del cliente, como el nombre de usuario y el nombre de huésped o el nombre de usuario y la dirección IP para hacerlo más intimidante.
Para que esta pancarta sea desplegada en todas la conexiones entrantes, hay que agregar la siguiente linea en el archivo/etc/hosts.allow
:
vsftpd : ALL : banners /etc/banners/
2.2.1.1.2. Encapsuladores TCP y alertas de ataque
Si un huésped o red en particular han sido detectados atacando el servidor, los encapsuladores TCP pueden ser usados para alertar al administrador de ataques subsecuentes provenientes de ese huésped o red usando la directiva spawn
.
En este ejemplo, asumamos que un atacante de la red 206.182.68.0/24 ha sido detectado tratando de atacar el servidor. Agregue la siguiente linea en el archivo /etc/hosts.deny
para denegar cualquier intento de conexión desde esa red, y para registrar los intentos a un archivo en especial:
ALL : 206.182.68.0 : spawn /bin/ 'date' %c %d >> /var/log/intruder_alert
La ficha %d
proveé el nombre del servicio al que el atacante está tratando de acceder.
Para permitir una conexión y registrarla, use la directiva spawn
en el archivo /etc/hosts.allow
.
Nota
Ya que la directiva spawn
ejecuta cualquier comando, es una buena idea crear un programa especial para notificar al administrador o ejecutar una cadena de comandos en el evento de un cliente en particular tratando de conectarse al servidor.
2.2.1.1.3. Encapsuladores TCP y registro avanzado
Si ciertos tipos de conexión son más preocupantes que otros, el nivel de registro puede ser elevado para ese servicio usando la opción severity
.
Para este ejemplo, asumamos que cualquiera que intente conectarse al puerto 23 (el puerto de Telnet) en un servidor FTP está tratando de romper el sistema. Para denotar esto, use la bandera emerg
en los archivos de registro en lugar de la bandera por defecto info
y deniegue la conexión.
Para hacer esto, ponga la siguiente linea en el archivo /etc/hosts.deny
:
in.telnetd : ALL : severity emerg
Esto usa la facilidad de registro por defecto authpriv
, pero eleva la prioridad del valor por defecto info
a emerg
, lo cual escribe los mensajes de registro directamente a la consola.
2.2.1.2. Aumentando la seguridad con xinetd
Esta sección se concentra en el uso de
xinetd
para crear un servicio de trampa y usarlo para controlar los niveles de recurso disponibles para cualquier servicio
xinetd
. Crear límites de recursos para los servicios puede ayudar a frustrar ataques de denegación de servicio (
Denial of Service,
DoS). Refiérase a las páginas del manual para
xinetd
y
xinetd.conf
para una lista de opciones disponibles.
2.2.1.2.1. Poniendo una trampa
Una característica importante de xinetd
es su habilidad para agregar equipos a una lista no_access
global. Los equipos en esta lista no pueden crear conexiones subsecuentes a servicios manejados por xinetd
por un periodo específico de tiempo, o hasta que xinetd
sea reiniciado. Usted puede hacer esto usando el atributo SENSOR
. Esta es una manera fácil de bloquear equipos que intentan explorar puertos en el servidor.
El primer paso para crear un SENSOR
es escoger que servicio no está planeado a usarse. En este ejemplo es utilizado telnet.
Edite el archivo /etc/xinetd.d/telnet
y cambie la linea flags
a:
flags = SENSOR
Agregue la siguiente línea:
deny_time = 30
Esto deniega cualquier intento de conexión a este puerto para ese equipo por 30 minutos. Otros valores aceptables para el atributo deny_time
son FOREVER, el cual mantiene el veto en efecto hasta que xinetd
es reiniciado y NEVER, el cual permite la conexión y la registra.
Finalmente, la última linea debe ser:
disable = no
Esto habilita la trampa.
Mientras que el uso de SENSOR
es una buena idea para detectar y detener conexiones desde equipos indeseables, tiene dos características en contra:
No funciona contra exploraciones sigilosas (stealth)
Un atacante que sabe que un SENSOR
esta corriendo puede montar un ataque de denegación de servicio contra un servidor en particular al forjar su dirección IP y conectarse al puerto prohibido.
2.2.1.2.2. Control de los recursos del servidor
Otra característica importante de xinetd
es su habilidad de declarar límites de recursos para los servicios bajo su control.
Lo hace usando las siguientes directivas
cps = <number_of_connections> <wait_period>
— Limita el ritmo de las conexiones entrantes. Esta directiva toma dos argumentos:
<number_of_connections>
— El número de conexiones por segundo a manejar. Si el ritmo de conexiones es más alto que esto, el servicio se deshabilita temporalmente. El valor por defecto es cincuenta (50).
<wait_period>
— El número de segundos a esperar antes de rehabilitar el servicio después de que ha sido deshabilitado. El valor por defecto es diez (10) segundos.
instances = <number_of_connections>
— Especifica el número total de conexiones permitidas a un servicio. Esta directiva acepta ya sea un valor entero o UNLIMITED
.
per_source = <number_of_connections>
— Especifica el número de conexiones permitidas a un servicio para cada huésped. Esta directiva acepta ya sea un número entero o UNLIMITED
.
rlimit_as = <number[K|M]>
— Especifica el monto de espacio de dirección de memoria que el servicio puede ocupar en kilobytes o megabytes. Esta directiva acepta ya sea un número entero o UNLIMITED
.
rlimit_cpu = <number_of_seconds>
— Especifica el monto de tiempo en segundos que un servicio puede ocupar del CPU. Esta directiva acepta un valor entero o UNLIMITED
.
Usar estas directivas puede ayudar a prevenir cualquier servicio xinetd
de abrumar el sistema, resultando en una denegación de servicio.
2.2.2. Asegurando Portmap
El servicio portmap
es un demonio de asignación dinámica de puertos para servicios RPC como NIS y NFS. Tiene mecanismos débiles de autenticación y tiene la habilidad de asignar un amplio rango de puertos para los servicios que controla. Por estas razones, es difícil de asegurar.
Nota
Asegurar portmap
solo afecta a las implementaciones NFSv2 y NFSv3, ya que desde NFSv4 ya no es requerido. Si usted planea implementar un servidor NFSv2 o NFSv3, entonces portmap
es requerido, y la siguiente sección aplica.
Si corre servicios RPC, obedezca estas reglas básicas.
2.2.2.1. Proteja portmap con encapsuladores TCP
Es importante usar encapsuladores TCP para limitar qué redes o equipos tienen acceso al servicio portmap
dado que no tiene una forma propia de autenticación.
Además, use solamente direcciones IP cuando limite el acceso al servicio. Evite usar nombres de equipos, ya que pueden ser forjados por envenenamiento de DNS y otros métodos.
2.2.2.2. Proteja portmap con iptables
Para restringir aún más el acceso al servicio portmap
, es una buena idea agregar reglas de iptables al servidor y restringir el acceso a redes específicas.
Abajo hay dos ejemplos de comandos iptables. El primero permite conexiones TCP al puerto 111 (usado por el servicio portmap
) desde la red 192.168.0.0/24. El segundo permite conexiones TCP al mismo puerto localmente. Esto es necesario para el servicio sgi_fam
usado por Nautilus. Todos los demás paquetes son ignorados.
iptables -A INPUT -p tcp -s! 192.168.0.0/24 --dport 111 -j DROP
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 111 -j ACCEPT
Para limitar el tráfico UDP de manera similar, use el siguiente comando.
iptables -A INPUT -p udp -s! 192.168.0.0/24 --dport 111 -j DROP
El servicio de información de red (
Network Information Service,
NIS) es un servicio RPC, llamado
ypserv
, el cual es usado en conjunto con
portmap
y otros servicios relacionados para distribuir mapas de nombres de usuario, contraseñas y otros tipos de información sensible dentro de su propio dominio.
Un servidor NIS está compuesto por diversas aplicaciones. Entre ellas podemos encontrar:
/usr/sbin/rpc.yppasswdd
— También denominado servicio yppasswdd
. Este demonio permite que los usuarios modifiquen sus contraseñas NIS.
/usr/sbin/rpc.ypxfrd
— También denominado servicio ypxfrd
. Este demonio es el responsable de las transferencias de mapas NIS sobre la red.
/usr/sbin/yppush
— Esta aplicación se encarga de distribuir las bases de datos NIS que han sido modificadas hacia diferentes servidores NIS.
/usr/sbin/ypserv
— Este es el demonio del servidor NIS.
De acuerdo a los estándares actuales, NIS está considerado como un método inseguro. No tiene mecanismos de autenticación y toda la información que transmite por la red viaja sin ser encriptada, incluyendo los hashes de las contraseñas. Es por esto que hay que tomar todas las precauciones posibles cuando se configure una red que utilice NIS. Esto se complica aún más por el hecho que la configuración establecida por defecto de NIS es en si misma insegura.
Se recomienda a todo aquel que tenga intenciones de implementar un servidor NIS, que primero asegure el servicio
portmap
(como se puede observar en la
Sección 2.2.2, “Asegurando Portmap”), y que luego continúe con los siguientes eventos, como la planificación de la red.
2.2.3.1. Planeamiento cuidadoso de la red
Debido a que NIS transmite sin encriptar información clave a través de la red, es importante que el servicio sea ejecutado detrás de un cortafuegos y sobre una porción de la red definida y considerada segura. Existen riegos de intercepción cada vez que se transmite información NIS sobre una red que no es segura. Un cuidadoso diseño de la red puede ayudar a prevenir importantes intrusiones en la seguridad.
2.2.3.2. Utilización de nombres de dominio y de equipo NIS, de modo similar a una contraseña
Cualquier equipo dentro de un dominio NIS puede utilizar comandos para obtener información del servidor sin tener que autenticarse, siempre y cuando el usuario conozca tanto el nombre del equipo del servidor DNS y el nombre del dominio DNS.
Por ejemplo, si alguien conecta una laptop en la red, o si irrumpe en ella desde el exterior (y se las ingenia para obtener una dirección IP interna), los siguientes comandos muestran el mapa de /etc/passwd
:
ypcat -d <NIS_domain>
-h <DNS_hostname>
passwd
Si el atacante es un usuario root, puede obtener el archivo /etc/shadow
ingresando el siguiente comando:
ypcat -d <NIS_domain>
-h <DNS_hostname>
shadow
Nota
Si se utiliza Kerberos, el archivo /etc/shadow
no se encuentra almacenado dentro de un mapa NIS.
Para hacer más complicado a los atacantes el acceso a los mapas NIS, genere una cadena aleatoria para el nombre del equipo DNS, como por ejemplo o7hfawtgmhwg.domain.com
. De manera similar, genere aleatoriamente un nombre de dominio NIS distinto. Esto hace que para un atacante sea mucho más dificil ingresar en el servidor NIS.
2.2.3.3. Editar el archivo /var/yp/securenets
Si el archivo /var/yp/securenets
está vacío o no existe (como es el caso luego de una instalación por defecto), NIS escucha a todos los puertos. Una de las primeras cosas a realizar es ingresar pares máscara de red/red (netmask/network) en el archivo de modo que ypserv
solo responda a las peticiones de una red adecuada.
A continuación se muestra una entrada de ejemplo del archivo /var/yp/securenets
:
255.255.255.0 192.168.0.0
Advertencia
Nunca inicie un servidor NIS por vez primera sin haber antes creado el archivo /var/yp/securenets
.
Esta técnica no ofrece protección contra ataques de simulación de identidad, pero al menos establece límites sobre las redes en las que el servidor NIS está funcionando.
2.2.3.4. Asigne puertos estáticos y utilice reglas de iptables
A todos los servidores relacionados con NIS se les puede asignar un puerto específico, excepto rpc.yppasswdd
— el demonio que permite a los usuarios modificar sus contraseñas de logueo. Asignar puertos a rpc.ypxfrd
y ypserv
, los restantes demonios de servidores NIS, permite la creación de reglas de cortafuegos, y de esta manera poder proteger a los demonios de futuras intrusiones.
Para hacerlo, agregue las siguientes líneas en /etc/sysconfig/network
:
YPSERV_ARGS="-p 834" YPXFRD_ARGS="-p 835"
Las siguientes reglas iptables pueden ser utilizadas para fortalecer la red que el servidor está escuchando con estos puertos:
iptables -A INPUT -p ALL -s! 192.168.0.0/24 --dport 834 -j DROP
iptables -A INPUT -p ALL -s! 192.168.0.0/24 --dport 835 -j DROP
Esto significa que el servidor solo permite conexiones a los puertos 834 y 835, si es que la petición proviene desde la red 192.168.0.0/24, y sin importar qué protocolo se esté utilizando.
2.2.3.5. Use autenticación con Kerberos
Uno de los problemas a ser considerados si se utiliza NIS para una autenticación, es que cada vez que un usuario ingresa en una máquina, se envía un hash del mapa /etc/shadow
por la red. Si un intruso obtiene acceso a un dominio NIS y observa el tráfico en la red, puede recolectar los hashes de nombres de usuarios y contraseñas. Con el tiempo suficiente, un programa de descifrado de contraseñas puede adivinar aquellas que son débiles, y el atacante puede obtener acceso a una cuenta válida en esa red.
Debido a que Kerberos utiliza encriptados con una clave secreta, nunca se envían hashes de contraseñas sobre la red, haciendo que el sistema sea más seguro. Para obtener mayor información acerca de Kerberos, vea la
Sección 2.6, “Kerberos”.
Importante
La versión de NFS incluida en Fedora, NFSv4, ya no necesita el servicio
portmap
como se lo indica en la
Sección 2.2.2, “Asegurando Portmap”. El tráfico NFS, en lugar de UDP ahora utiliza TCP para todas sus versiones, y lo solicita al utilizar NFSv4. NFSv4 ahora incluye autenticación Kerberos para grupos y usuarios, como parte del módulo del kernel
RPCSEC_GSS
. Sigue existinedo información incluida acerca de
portmap
, desde que Fedora tiene soporte para NFSv2 y NFSv3, ya que ambos utilizan
portmap
.
2.2.4.1. Planeamiento cuidadoso de la red
Ahora que NFSv4 tiene la capacidad de enviar toda la información en la red encriptada utilizando Kerberos, es importante que el servicio sea configurado correctamente, si es que se encuentra detrás de un cortafuegos o en una red segmentada. Todavía NFSv3 envía los datos de manera no segura, y esto debería ser tendido en cuenta. Un diseño de redes que preste atención a todos estos aspectos puede prevenir fallas en la seguridad.
2.2.4.2. Cuidado con los errores de sintaxis
El servidor NFS determina qué sistemas de archivos exportar y hacia qué equipos hacerlo al consultar el archivo /etc/exports
. Tenga cuidado de no agregar espacios extraños cuando edite este archivo.
Por ejemplo, la siguiente línea en el archivo /etc/exports
comparte el directorio /tmp/nfs/
con el equipo juan.ejemplo.com
con permisos de lectura y escritura.
/tmp/nfs/ juan.ejemplo.com(rw)
Por otro lado, la siguiente línea en el archivo /etc/exports
comparte el mismo directorio con el equipo juan.ejemplo.com
, sólo con permisos de lectura, y además lo comparte con el mundo con permisos de lectura y de escritura, debido a un simple espacio en blanco dejado luego del nombre del equipo.
/tmp/nfs/ juan.ejemplo.com (rw)
Es una buena costumbre la de confirmar cualquier configuración de elementos compartidos NFS, utilizar para ello el comando showmount
y verificar qué es lo que está siendo compartido:
showmount -e <hostname>
2.2.4.3. No utilice la opción no_root_squash
Por defecto, al utilizarse para compartir elementos, NFS cambia el usuario root al usuario nfsnobody
, una cuenta de usuario sin privilegios. Esto modifica la pertenencia de todos los archivos creados por el usuario root, y se los otorga a nfsnobody
, evitando de esta forma la carga de programas definidos con bit de tipo setuid.
Si se utiliza no_root_squash
, los usuarios root remotos tienen la posibilidad de modificar cualquier archivo en el sistema de archivos compartido, y dejar aplicaciones infectadas con troyanos para que otros usuarios las ejecuten sin saberlo.
2.2.4.4. Configuración del cortafuego de NFS
Los puertos utilizados por NFS están dinámicamente asignados por rpcbind, y esto puede causar problemas en el momento de crear reglas de cortafuegos. Para simplificar este proceso, utilice el archivo /etc/sysconfig/nfs para especificar qué puertos deben ser utilizados:
MOUNTD_PORT
— puerto TCP y UDP para mountd (rpc.mountd)
STATD_PORT
— puerto TCP y UDP para status (rpc.statd)
LOCKD_TCPPORT
— puerto TCP para nlockmgr (rpc.lockd)
LOCKD_UDPPORT
— UDP port nlockmgr (rpc.lockd)
Los números de puerto especificados no deben ser utilizados por ningún otro servicio. Configure su cortafuegos para permitir los números de puerto especificados, del mismo modo que el puerto TCP y UDP 2049 (NFS).
Ejecute el comando rpcinfo -p
sobre el servidor NFS para conocer qué programas RPC y qué puertos están siendo utilizados.
2.2.5. Asegurando el servidor HTTP Apache
El servidor HTTP Apache es uno de los servicios más seguros y estables que son empaquetados con Fedora. Una extensa variedad de opciones y técnicas están disponibles para asegurar el servidor HTTP Apache — demasiado numerosas para analizarlas en profundidad aquí. La sección siguiente explica brevemente algunas buenas costumbres al ejecutar el servidor HTTP Apache.
Siempre verifique que funcione correctamente cualquier programa que tenga intención de utilizar en el sistema antes de ponerlo en producción. Además, asegúrese que solo el usuario root tenga permisos de escritura sobre cualquier directorio que contenga programas o CGIs. Para hacer esto, ejecute los siguientes comandos como usuario root:
chown root <nombre_de_directorio>
chmod 755 <nombre_de_directorio>
Los administradores de sistemas deben ser cuidadosos al utilizar las siguientes opciones de configuración (definidas en /etc/httpd/conf/httpd.conf
):
FollowSymLinks
Esta directiva se encuentra activa por defecto, de modo que tenga cuidado al crear enlaces simbólicos al documento raíz del servidor Web. Por ejemplo, es una mala idea la de adjudicarle un enlace simbólico a /
.
Indexes
Esta directiva está activa por defecto, pero puede no ser deseada. Elimínela si quiere evitar que los visitantes puedan examinar los archivos del servidor.
UserDir
La directiva UserDir
se encuentra deshabilitada por defecto, debido a que puede confirmar la presencia de una cuenta de usuario en el sistema. Para permitir que se examinen directorios de usuario en el servidor, utilice las siguientes directivas:
UserDir enabled
UserDir disabled root
Estas directivas activan la posibilidad de analizar directorios de usuario para todos los directorios de usuarios que no sean /root/
. Para añadir usuarios a la lista de las cuentas desactivadas, añada a esos usuarios en una lista separada por espacios en la línea UserDir disabled
.
Importante
No elimine la directiva
IncludesNoExec
. Por defecto, el módulo
Server-Side Includes (
SSI) no puede ejecutar comandos. Se recomienda no cambiar estas configuraciones a no ser que sea absolutamente necesario, ya que potencialmente podría permitir que un atacante ejecute comandos en el sistema.
El
Protocolo de Transferencia de Archivos (
FTP, por las iniciales en inglés de File Transfer Protocol), es un viejo protocolo TCP diseñado para transferir archivos sobre una red. Puesto que todas las transacciones con el servidor no son encriptadas, incluyendo las autenticaciones de usuario, es considerado un protocolo no seguro y debería ser configurado cuidadosamente.
Fedora provee tres servidores FTP.
gssftpd
— Un demonio basado en xinetd
con soporte para Kerberos que no transmite informaciones de autenticación sobre la red.
Acelerador de Contenido de Red Hat (tux
) — Un servidor web en el espacio del kernel con capacidades FTP.
vsftpd
— Una implementación orientada a la seguridad del servicio FTP.
Los siguientes lineamientos de seguridad sirven para configurar el servicio FTP vsftpd
.
2.2.6.1. Mensaje de bienvenida de FTP
Antes de enviar un nombre de usuario y una contraseña, todos los usuarios son recibidos con una imagen de bienvenida. Por defecto, esta imagen incluye la información de la versión que se está utilizando, información que sirve a los atacantes para poder identificar debilidades en el sistema.
Para modificar la imagen de bienvenida para vsftpd
, agregue la siguiente directiva en el archivo /etc/vsftpd/vsftpd.conf
:
ftpd_banner=<insert_greeting_here>
En la directiva indicada recién, sustituya <insert_greeting_here>
con el texto del mensaje de bienvenida.
Para imágenes con varias líneas, lo mejor es utilizar un archivo de imagen. Para simplificar la administración de múltiples imágenes, coloquelas a todas ellas en un nuevo directorio llamado /etc/banners/
. En nuestro ejemplo, el archivo de imagen para conexiones FTP es /etc/banners/ftp.msg
. A continuación se puede observar cómo puede llegar a lucir un archivo con esstas características:
######### # Hola, cualquier tipo de actividad dentro de ftp.ejemplo.com es registrada. #########
Para tener una referencia de esta imagen de bienvenida en vsftpd
, añada la siguiente directiva en el archivo /etc/vsftpd/vsftpd.conf
:
banner_file=/etc/banners/ftp.msg
La presencia del directorio /var/ftp/
activa la cuenta anónima.
La forma más sencilla de crear este directorio es instalando el paquete vsftpd
. Este paquete establece un árbol de directorios para usuarios anónimos y configura los permisos de manera tal que estos usuarios sólo puedan leer sus contenidos.
Por defecto, el usuario anónimo no puede escribir en ningún directorio.
Advertencia
Si se habilita la posibilidad de acceso anónimo a un servidor FTP, tenga cuidado de donde almacenar los datos importantes.
2.2.6.2.1. Subida anónima
Para permitir que los usuarios anónimos suban archivos, es recomendable la creación de un directorio dentro de /var/ftp/pub/
, con permisos de escritura solamente.
Para hacerlo, ingrese el siguiente comando:
mkdir /var/ftp/pub/subidas
A continuación, modifique los permisos de modo que los usuarios anónimos no puedan conocer el contenido del directorio:
chmod 730 /var/ftp/pub/subidas
Un listado de manera extendida del directorio, debería ser semejante a esto:
drwx-wx--- 2 root ftp 4096 Feb 13 20:05 subidas
Advertencia
Los administradores que permiten que usuarios anónimos sean capaces de leer y de escribir sobre los directorios, a menudo se encuentran con que sus servidores se han convertido en repositorios de software robado.
Adicionalmente, bajo vsftpd
, añada la siguiente línea en el archivo /etc/vsftpd/vsftpd.conf
:
anon_upload_enable=YES
2.2.6.3. Cuentas de usuario
Debido a que FTP transmite para su autenticación nombres de usuario y contraseñas sin encriptarse sobre redes no seguras, es una buena idea la de negar a los usuarios del sistema el acceso al servidor desde sus cuentas de usuario.
Para deshabilitar todas las cuentas de usuario en vsftpd
, agregue la siguiente directiva en /etc/vsftpd/vsftpd.conf
:
local_enable=NO
2.2.6.3.1. Restringiendo cuentas de usuario
Para deshabilitar acceso FTP para una cuenta específica, o un grupo de cuentas específico, como ser por ejemplo el usuario root y todos aquellos con privilegios
sudo
, la manera más sencilla de hacerlo es utilizar un archivo de lista PAM como se explica en la
Sección 2.1.4.2.4, “Deshabilitando root usando PAM”. El archivo de configuración PAM para
vsftpd
es
/etc/pam.d/vsftpd
.
También es posible deshabilitar cuentas de usuario directamente dentro de cada servicio.
Para deshabilitar cuentas de usuario específicas en vsftpd
, agregue el nombre del usuario en /etc/vsftpd.ftpusers
2.2.6.4. Utilice encapsuladores TCP para el control de acceso
2.2.7. Asegurando Sendmail
Sendmail es un agente de transferencia de correos (MTA, por las iniciales en inglés de Mail Transfer Agent), que utiliza protocolo simple de transferencia de correo (SMTP, Simple Mail Transfer Protocol) para enviar mensajes electrónicos entre otros MTAs, o hacia otros clientes de correo, o agentes de entrega. Si bien muchos MTAs son capaces de encriptar el tráfico entre uno y otro, algunos no lo hacen, de modo que enviar correos electrónicos en una red pública es considerado una forma de comunicación no segura.
Es recomendable que todos aquellos que estén planeando implementar un servidor Sendmail, tengan en cuenta los siguientes inconvenientes.
2.2.7.1. Limitar un ataque de denegación de servicio
Debido a la naturaleza del correo electrónico, un atacante determinado puede inundar de manera relativamente sencilla el servidor con correos, y provocar la denegación del servicio. Al establecer límites a las siguientes directivas en /etc/mail/sendmail.mc
, la efectividad de ataques de ese tipo se ve disminuida.
confCONNECTION_RATE_THROTTLE
— El número de conexiones que el servidor puede recibir por segundo. Por defecto, Sendmail no limita el número de conexiones. Si se alcanza un límite previamente establecido, las siguientes conexiones son demoradas.
confMAX_DAEMON_CHILDREN
— El máximo número de procesos hijo que pueden ser generados por el servidor. Por defecto, Sedmail no atribuye un límite a la cantidad de estos procesos. Si se alcanza un límite previamente establecido, las siguientes conexiones serán demoradas.
confMIN_FREE_BLOCKS
— El número mínimo de bloques libres que deben estar disponibles para que el servidor acepte correos. La cantidad establecida por defecto es de 100 bloques.
confMAX_HEADERS_LENGTH
— El tamaño máximo aceptable (en bytes) para un encabezado de mensaje.
confMAX_MESSAGE_SIZE
— El tamaño máximo aceptable (en bytes) para un solo mensaje.
Nunca coloque el directorio mail spool, /var/spool/mail/
, en un volumen NFS compartido.
Debido a que NFSv2 y NFSv3 no tienen control sobre usuarios ni IDs de grupos, dos o más usuarios pueden tener el mismo UID, y recibir y leer cada uno correos electrónicos del otro.
Nota
Con NFSv4 utilizando Kerberos este no es el caso, ya que el módulo del kernel SECRPC_GSS
no utiliza autenticaciones basadas en UID. Sin embargo, todavía hoy es considerada una buena costumbre la de no colocar el directorio mail spool en volúmenes NFS compartidos.
2.2.7.3. Usuarios de sólo correo
Para ayudar a prevenir que explote a los usuarios locales para usar el servidor Sendmail, lo mejor es que solamente ingresen al servidor Sendmail usando un cliente de correos electrónicos. Las cuentas de consola en el servidor de correo no deberían ser permitidas y todos los usuarios de consola en el archivo /etc/passwd
deberían definirse como /sbin/nologin
(con la posible excepción del usuario root).
2.2.8. Verificar qué puertos están abiertos
Luego de configurar los servicios de red, es importante prestarle atención a los puertos que actualmente están escuchando en las interfases de red del sistema. Cualquier puerto abierto puede ser la evidencia de una intrusión.
Existen dos maneras fundamentales para listar los puertos que están abiertos en la red. La menos confiable consiste en consultar los paquetes en la red utilizando comandos como netstat -an
o lsof -i
. Este método es menos confiable debido a que estos programas no se conectan a la máquina desde la red, sino que verifican qué es lo que se está ejecutando en el sistema. Por esta razón, estas aplicaciones frecuentemente son reemplazadas por atacantes. Alguien que quiera ocultar el rastro que está dejando al ingresar, o al abrir sin autorización los puertos de un sistema, intentará reemplazar netstat
y lsof
, con sus versiones personales y modificadas.
Una forma más confiable de verificar los puertos que están escuchando en una red, es mediante la utilización de un escáner de puertos como nmap
.
El siguiente comando ejecutado desde una terminal, especifica los puertos que se encuentran abiertos a conexiones TCP desde la red:
nmap -sT -O localhost
La salida de este comando es la siguiente:
Starting Nmap 4.68 ( http://nmap.org ) at 2009-03-06 12:08 EST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1711 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
113/tcp open auth
631/tcp open ipp
834/tcp open unknown
2601/tcp open zebra
32774/tcp open sometimes-rpc11
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.17 - 2.6.24
Uptime: 4.122 days (since Mon Mar 2 09:12:31 2009)
Network Distance: 0 hops
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.420 seconds
Esta salida muestra que el sistema está ejecutando portmap
debido a la presencia del servicio sunrpc
. Sin embargo, existe además un servicio misterioso en el puerto 834. Para verificar si el puerto está asociado con la lista oficial de servicios conocidos, ingrese:
cat /etc/services | grep 834
Este comando no devuelve ninguna información. Lo que está indicando es que si bien el puerto se encuentra dentro del rango reservado (es decir, entre 0 y 1023), y que no necesita privilegios de usuario root para abrirse, sin embargo no está asociado con ningún servicio conocido.
A continuación, verifique si existe información acerca del puerto utilizando netstat
o lsof
. Para verificar el puerto 834 utilizando netstat
, ingrese el siguiente comando:
netstat -anp | grep 834
El comando devuelve la siguiente salida:
tcp 0 0 0.0.0.0:834 0.0.0.0:* LISTEN 653/ypbind
La presencia de un puerto abierto en
netstat
es un reaseguro, ya que si un atacante ha abierto un puerto en un sistema en el que no está autorizado a ingresar, seguramente no permitirá que sea detectada su presencia mediante este comando. Además, la opción
[p]
revela el proceso ID (PID) del servicio que ha abierto el puerto. En este caso, el puerto abierto pertenece a
ypbind
(
NIS), que es un servicio
RPC administrado conjuntamente con el servicio
portmap
.
El comando lsof
muestra información similar a netstat
, ya que también es capaz de enlazar puertos con servicios:
lsof -i | grep 834
La sección que nos interesa de la salida de este comando es la siguiente:
ypbind 653 0 7u IPv4 1319 TCP *:834 (LISTEN)
ypbind 655 0 7u IPv4 1319 TCP *:834 (LISTEN)
ypbind 656 0 7u IPv4 1319 TCP *:834 (LISTEN)
ypbind 657 0 7u IPv4 1319 TCP *:834 (LISTEN)
Estas herramientas nos dicen mucho acerca del estado en que se encuentran los servicios en ejecución de una máquina. Estas herramientas son flexibles y pueden ofrecer una importante cantidad de información acerca de los servicios de red y sus configuraciones. Para obtener más informacuión, vea las páginas man de lsof
, netstat
, nmap
, y services
.
2.4. Módulos de autenticación conectables (PAM, por las iniciales en inglés de Pluggable Authentication Modules)
Los programas que permiten el acceso del usuario a un sistema usan la autenticación para verificar la identidad de cada uno (es decir, para establecer que el usuario es quien dice ser).
Históricamente, cada programa tenía su propia forma de autenticar los usuarios. En Fedora, muchos programas se configuran para usar el mecanismo de autenticación centralizado llamado
Módulos de Autenticación Conectables (
PAM).
PAM usa una arquitectura modular, con complementos, que le da al administrador del sistema un buen grado de flexibilidad en la configuración de las políticas de autenticación para el sistema.
En la mayoría de las situaciones, la configuración establecida por defecto del archivo PAM será suficiente para una aplicación que tenga soporte de PAM. Sin embargo, algunas veces, es necesario editar un archivo de configuración de PAM. Dado que una configuración errónea de PAM puede llegar a poner en riesgo la seguridad del sistema, es importante comprender la estructura de estos archivos antes de realizar cualquier tipo de modificación. Para obtener más información, vea la
Sección 2.4.3, “Formato del archivo de configuración de PAM”.
PAM ofrece las siguientes ventajas;
un esquema de autenticación común que se puede usar en una amplia variedad de aplicaciones.
flexibilidad significativa y control sobre la autenticación para administradores del sistema y desarrolladores de aplicaciones.
una única biblioteca bien documentada que permite a los desarrolladores escribir programas sin tener que crear sus propios esquemas de autenticación.
2.4.2. Archivos de configuración de PAM
El directorio /etc/pam.d/
contiene los archivos de configuración de PAM para cada aplicación que utilice PAM. En versiones anteriores de PAM, se usaba el archivo /etc/pam.conf
, pero este archivo se dejado de usar y sólo se utilizará si el directorio /etc/pam.d/
no existe.
2.4.2.1. Archivos del servicio PAM
Cada aplicación con capacidades PAM o servicio tiene un archivo en el directorio /etc/pam.d/
. Cada archivo en este directorio tiene el mismo nombre del servicio al que controla el acceso.
El programa que usa PAM es responsable por definir su nombre de servicio e instalar su propio archivo de configuración PAM en el directorio /etc/pam.d/
. Por ejemplo, el programa login
define su nombre de servicio como login
e instala el archivo de configuración PAM /etc/pam.d/login
.
Cada archivo de configuración PAM contiene un grupo de directivas formateadas como sigue:
<interfase del módulo>
<bandera de control>
<nombre de módulo>
<argumentos del módulo>
Cada uno de estos elementos se explica en las secciones siguientes.
Hay disponibles cuatro tipos de interfases de módulos PAM. Cada uno corresponde a distintos aspectos del proceso de autorización:
auth
— Esta interfaz de módulo autentica el uso. Por ejemplo, pide y verifica la validez de una contraseña. Los módulos con esta interfaz también pueden poner credenciales, como membresías de grupo o tickets Kerberos.
account
— Esta interfaz de módulo verifica que el acceso esté permitido. Por ejemplo, puede chequear si una cuenta a vencido o si un usuario puede ingresar en una hora particular del día.
password
— Esta interfaz de módulo se usa para cambiar contraseñas del usuario.
session
— Esta interfaz de módulo configura y administra sesiones del usuario. Los módulos con esta interfaz pueden también permitir tareas adicionales que necesitan permitir accesos, tales como el montaje del directorio de inicio del usuario y poner disponible la casilla de correo del usuario.
Nota
Un módulo individual puede proveer cualquiera o todas las interfases de módulo. Por ejemplo pam_unix.so
provee las cuatro interfaces de módulo.
En un archivo de configuración PAM, la interfaz de módulo es el primer campo definido. Por ejemplo, una línea típica en una configuración puede verse como sigue:
auth required pam_unix.so
Esto instruye a PAM a que use la interfase auth
del módulo pam_unix.so
.
2.4.3.1.1. Interfases de módulos apilables
Las directivas de la interfaz modular pueden ser
apiladas, o colocadas unas sobre otras, de modo que varios módulos puedan ser utilizados al mismo tiempo para el mismo propósito. Si la marca de control de un módulo utiliza el valor "sufficient" o "requisite" (vea la
Sección 2.4.3.2, “Bandera de control” para obtener mayor información acerca de estas marcas), entonces el orden en que los modulos sean listados, será importante para el proceso de autenticación.
El apilado hace fácil para un administrador pedir que se den ciertas condiciones específicas antes de permitir al usuario autenticar. Por ejemplo, el comando reboot
normalmente usa varios módulos apilados, como se ve en su archivo de configuración PAM:
[root@MiServidor ~]# cat /etc/pam.d/reboot
#%PAM-1.0
auth sufficient pam_rootok.so
auth required pam_console.so
#auth include system-auth
account required pam_permit.so
La primera línea es un comentario y no se procesa.
auth sufficient pam_rootok.so
— Esta línea usa el módulo pam_rootok.so
para verificaar si el usuario actual es root, confirmandoo que su UID sea 0. Si esto tiene éxito, no se consulta ningún otro módulo y el comando se ejecuta. Si esto falla, se consulta el módulo siguiente.
auth required pam_console.so
— Esta línea utiliza el módulo pam_console.so
para intentar autenticar al usuario. Si este usuario ya se encuentra dentro de la consola, pam_console.so
verifica si dentro del directorio /etc/security/console.apps/
hay un archivo con el mismo nombre que el del servicio (reboot). Si existe ese archivo, la autenticación es existosa y el control es pasado al siguiente módulo.
#auth include system-auth
— Esta línea es comentada y no se procesa.
account required pam_permit.so
— Esta línea usa el módulo pam_permit.so
para permitir al usuario root o cualquier otro que haya ingresado en la consola reiniciar el sistema.
Todos los módulos PAM generan un resultado de éxito o fracaso cuando son llamados. Las banderas de control le dicen a PAM qué hacer con el resultado. Los módulos se pueden apilar en un orden particular, y las banderas de control determinan cuán importante es el éxito o el fracaso de un módulo particular para el objetivo general de autenticación del usuario con el servicio.
Hay cuatro banderas de control predefinidas:
required
— El resultado del módulo debe ser exitoso para que pueda continuar la autenticación. Si la prueba falla en este punto, el usuario no se notifica hasta que se completan con los resultados de todas las pruebas de los módulos que referencian a esa interfaz.
requisite
— El resultado del módulo debe ser exitoso para que continúe la autenticación. Sin embargo, si una prueba falla en este punto, el usuario se notifica inmediatamente con un mensaje que muestra el primer fallo del módulo required
o requisite
.
sufficient
— El resultado del módulo es ignorado si falla. Sin embargo, si el resultado de un módulo marcado con bandera sufficient
tiene éxito y no hay módulos previos marcados con required
que hayan fallado, entonces no se necesitan otros resultados y el usuario es autenticado con el servicio.
optional
— El resultado del módulo se ignora. Un módulo marcado como optional
sólo se vuelve necesario para una autenticación exitosa cuando no hay otros módulos referenciados en la interfaz.
Importante
El orden en el que los módulos required
se llaman no es crítico. Sólo las banderas sufficient
y requisite
hacen que el orden se haga importante.
Existe disponible ára PAM una nueva sintaxis de bandera de control, que permite un control más preciso.
La página man pam.d
, y la documentación de PAM, ubicada en el directorio /usr/share/doc/pam-<version-number>
/
, donde <version-number>
es el número de versión PAM en su sistema, explica esta nueva sintaxis en detalle.
El nombre del módulo ofrece a PAM el nombre del módulo conectable que contiene la interfaz del módulo especificada. En versiones anteriores de Fedora la dirección completa al módulo era provista en el archivo de configuración de PAM. Sin embargo, desde la aparición de los sistemas multilib, que almacenan modulos PAM de 64-bit en el directorio /lib64/security/
, el nombre del directorio es omitido dado que la aplicación está enlazada con la versión correcta de libpam
, que puede encontrar la versión correcta del módulo.
Para algunos módulos, PAM utiliza argumentos para pasar información a un módulo conectable durante la autenticación.
Por ejemplo, el módulo pam_userdb.so
utiliza información almacenada en un archivo de base de datos Berkeley para autenticar al usuario. Berkeley es una base de datos de código abierto que se encuentra en muchas otras aplicaciones. El módulo toma un argumento db
de modo que Berkeley sepa qué base de datos utilizar para el servicio solicitado.
La siguiente es una línea típica pam_userdb.so
en una configuración de PAM. El <direccion-del-archivo>
es la dirección completa del archivo base de datos DB de Berkeley:
auth required pam_userdb.so db=<direccion-del-archivo>
Los argumentos inválidos generalmente son ignorados y de esta manera no afectan ni el éxito ni el fracaso del módulo PAM. Algunos módulos, sin embargo, pueden fracasar con argumentos inválidos. La mayoría de los módulos reportan sus errores en el archivo /var/log/secure
.
2.4.4. Ejemplos de archivos de configuración de PAM
La siguiente es una muestra del archivo de configuración PAM de una aplicación:
#%PAM-1.0
auth required pam_securetty.so
auth required pam_unix.so nullok
auth required pam_nologin.so
account required pam_unix.so
password required pam_cracklib.so retry=3
password required pam_unix.so shadow nullok use_authtok
session required pam_unix.so
La primera línea es un comentario, indicado por el numeral (#
) al comienzo de la línea.
Las líneas 2 a la 4 apila tres módulos para la autenticación de ingreso.
auth required pam_securetty.so
— Este módulo asegura que si el usuario intenta ingresar como root, el tty donde el usuario está ingresando debe estar listado en el archivo /etc/securetty
, si ese archivo existe.
Si el tty no está listado en el archivo, cualquier intento de loguearse como usuario root será erróneo con el siguiente mensaje: Login incorrect
.
auth required pam_unix.so nullok
— Este módulo pide una contraseña al usuario, que luego confirma utilizando la información almacenada en /etc/passwd
, y /etc/shadow
, si es que existe.
auth required pam_nologin.so
— Este es el último momento de la autenticación. Confirma que exista y en qué lugar, el archivo /etc/nologin
. Si existe, pero el usuario no es root, la autenticación falla.
Nota
En este ejemplo, los tres módulos auth
se encuentran verificados, aún si falló el primer módulo auth
. Esto evita que los usuarios conozcan el momento exacto en que su autenticación falló. En manos de un atacante, el conocimiento de ese dato podría permitirle deducir más fácilmente cómo vulnerar el sistema.
account required pam_unix.so
— Este módulo realiza cualquier tipo de verificación de cuenta que sea necesario. Por ejemplo, si se ha activado el enmascaramiento de contraseñas, la interfaz de la cuenta del módulo pam_unix.so
verifica que la cuenta no haya expirado, o que el usuario no haya modificado la contraseña dentro del período permitido.
password required pam_cracklib.so retry=3
— Si una contraseña ha expirado, el componente contraseña del módulo pam_cracklib.so
solicita una nueva. En seguida confirma que la nueva contraseña pueda o no ser fácilmente revelada por un programa de obtención de contraseñas basado en diccionarios.
password required pam_unix.so shadow nullok use_authtok
— Esta línea indica que si el programa modifica la contraseña del usuario, debería utilizar para ello la interfaz password
del módulo pam_unix.so
.
El argumento shadow
le indica al módulo la creación de contraseñas ocultas cada vez que actualice la contraseña del usuario.
El argumento nullok
le indica al módulo que le permita al usuario modificar su contraseña desde una contraseña en blanco. De lo contrario, una contraseña vacía será tratada como un bloqueo de cuenta.
El argumento final de esta línea, use_authtok
, ofrece un buen ejemplo de la importancia que tiene el orden en que se "apilen" los modulos PAM. Este argumento le indica al módulo que no le solicite al usuario una nueva contraseña, y que en su lugar acepte cualquier contraseña que haya sido almacenada por un módulo anterior. De esta manera, todas las nuevas contraseñas deben pasar la prueba de pam_cracklib.so
para confirmar que sean seguras antes de ser aceptadas
session required pam_unix.so
— La línea final le indica a la interfaz de sesión del módulo pam_unix.so
que administre la sesión. Este módulo registra el nombre de usuario y el tipo de servicio en /var/log/secure
al comienzo y al final de cada sesión. Este módulo puede ser suplementado si se lo "apila" con otros módulos de sesión y poder así agregarle funcionalidades.
2.4.5. Creación de los módulos PAM
Puede crear o añadir en cualquier momento nuevos módulos PAM, para utilizarlos con cualquier aplicación con tengan este soporte.
Por ejemplo, un desarrollador puede crear un método para generar contraseñas que sean utilizadas sólo una vez, y escribir un módulo PAM que pueda soportarlo. Los programas que tengan soporte para PAM podrán utilizar inmediatamente este módulo, y el método de contraseña, sin por ello tener que ser recompilados o modificados en alguna manera.
Esto permite a los desarrolladores y a los administradores de sistema mezclar, y al mismo tiempo verificar, diferentes métodos de autenticación para diferentes programas sin necesidad de recompilarlos.
Se ha incluido documentación para escribir módulos en el directorio /usr/share/doc/pam-<version-number>
/
, donde <version-number>
es el número de versión PAM de su sistema.
2.4.6. PAM y el cacheo de la credencial administrativa
Una cantidad de herramientas administrativas gráficas en Fedora le ofrecen a los usuarios un elevado grado de privilegio, durante un período de tiempo de hasta cinco minutos, utilizando el módulo pam_timestamp.so
. Es importante entender como funciona este mecanismo, ya que si algún usuario abandona la terminal mientras continue vigente pam_timestamp.so
, dejará a ese equipo libre para ser manipulado por quienquiera que tenga acceso físico a la consola.
En el esquema del registro del tiempo de PAM, cuando es iniciada la aplicación administrativa gráfica, solicita al usuario la contraseña de root. Cuando el usuario ha sido autenticado, el módulo pam_timestamp.so
crea un archivo de registro de tiempo. Por defecto, es creado en el directorio /var/run/sudo/
. Si el archivo ya existe, los programas administrativos gráficos no solicitarán una contraseña. En su lugar, el módulo pam_timestamp.so
actualizará el archivo de registro de tiempo, reservando cinco minutos extra de acceso administrativo sin contraseñas al usuario.
Puede verificar el estado actual del archivo de registro de tiempo, consultando el archivo /var/run/sudo/<usuario>
. Para el escritorio, el archivo importante es unknown:root
. Si se encuentra presente y su registro de tiempo es menor a cinco minutos de antigüedad, las credenciales son válidas.
La existencia del archivo de registro de tiempo se indica mediante un ícono de autenticación, que aparece en el área de notificación del panel.
2.4.6.1. Borrando el archivo de registro de tiempo
Antes de abandonar la consola donde se encuentra activo el registro de tiempo de PAM, es recomendable destruir el archivo correspondiente. Para hacerlo desde un entorno gráfico, haga clic sobre el ícono de autenticación del panel. Esto hace que se abra un cuadro de diálogo. Haga clic sobre el botón Olvidar Autenticación para destruir el archivo de registro de tiempo activo.
Con respecto al archivo de registro de tiempo de PAM, debe prestarle atención a lo siguiente:
Si ha ingresado en el sistema remotamente, utilizando el comando ssh
, utilice el comando /sbin/pam_timestamp_check -k root
para destruir el archivo de registro de tiempo.
Será necesario que ejecute el comando /sbin/pam_timestamp_check -k root
desde la misma ventana de la terminal desde la que inició la aplicación con este privilegio.
Debe estar registrado como el usuario que originalmente invocó el módulo pam_timestamp.so
, de modo de poder utilizar el comando /sbin/pam_timestamp_check -k
. No se registre como usuario root para utilizarlo.
Si quiere abandonar las credenciales en el escritorio (sin utilizar la acción Olvidar Autenticación del ícono), utilice el siguiente comando:
/sbin/pam_timestamp_check -k root </dev/null >/dev/null 2>/dev/null
Una falla al utilizar este comando hará que solo sean eliminadas las credenciales (en el caso que las hubiera) del pty desde donde ejecutó el comando.
Consulte la página man pam_timestamp_check
para obtener más información acerca del uso de pam_timestamp_check
para destruir el archivo de registro de tiempo.
2.4.6.2. Directivas comunes de pam_timestamp_check
El módulo pam_timestamp.so
acepta varias indicaciones. Las siguientes dos opciones son algunas de las más utilizadas:
timestamp_timeout
— Especifica el periodo (en segundos) durante el cual el archivo de registro de tiempo es válido. El valor establecido por defecto es 300 (cinco minutos).
timestampdir
— Indica el directorio en donde el archivo de registro de tiempo será almacenado. El valor establecido por defecto es /var/run/sudo/
.
2.4.7. PAM y la propiedad de los dispositivos
En Fedora, el primer usuario que se registra en la consola física de la máquina, puede manipular ciertos dispositivos y realizar ciertas tareas que por lo general son reservadas al usuario root. Esto es controlado por un módulo PAM denominado pam_console.so
.
2.4.7.1. Propiedad de los dispositivos
Cuando un usuario se registra en un sistema Fedora, el módulo pam_console.so
es llamado mediante el comando login
, o mediante algunos de los programa gráficos de logueo, como ser gdm, kdm, y xdm. Si este usuario es el primero en loguearse en la consola física — denominada consola del usuario — el modulo le asegura al usuario el dominio de una gran variedad de dispositivos que normalmente le pertenecen al usuario root. Estos dispositivos le pertenecen a la consola del usuario hasta que finalice su última sesión local. Una vez que este usuario haya finalizado su sesión, la pertenencia de los dispositivos vuelve a ser del usuario root.
Los dispositivos afectados incluyen, pero no se limitan a, las placas de sonido, disqueteras, lectoras de CD-ROM.
Esta instalación permite al usuario local manipular estos dispositivos sin obtener el acceso de root, por lo que se simplifican las tareas comunes para el usuario de consola.
Puede modificar la lista de dispositivos controlados por
pam_console.so
editando los siguientes archivos:
Puede cambiar los permisos de los otros dispositivos diferentes, además de los que se han mostrado antes, o modificar los especificados por defecto. En lugar de modificar el archivo 50-default.perms
, debería crear uno nuevo (por ejemplo xx
-name.perms
) y luego ingresar las modificaciones requeridas. El nombre del nuevo archivo modelo debe comenzar con un número superior a 50 (por ejemplo 51-default.perms
). Esto va a sustituir lo indicado en el archivo 50-default.perms
.
Advertencia
Si el archivo de configuración del administrador de gdm, kdm, o xdm ha sido alterado de manera tal que permita que usuarios remotos puedan ingresar y si el equipo está configurado para ejecutarse en el nivel de ejecución 5, es aconsejable modificar las directivas <console>
y <xconsole>
del archivo /etc/security/console.perms
con los siguientes valores:
<console>=tty[0-9][0-9]* vc/[0-9][0-9]* :0\.[0-9] :0
<xconsole>=:0\.[0-9] :0
Esto evita que los usuarios ganen acceso a dispositivos y aplicaciones restringidas en la máquina.
Si el archivo de configuración del administrador de gdm, kdm, o xdm ha sido modificado de modo que permita que usuarios remotos puedan ingresar, y si el equipo está configurado para ejecutarse en cualquier nivel de ejecución multiusuario además del nivel de ejecución 5, es aconsejable eliminar completamente la directiva <xconsole>
, al mismo tiempo que modificar la directiva <console>
con el valor siguiente:
<console>=tty[0-9][0-9]* vc/[0-9][0-9]*
2.4.7.2. Acceso a aplicaciones
El usuario de la consola también tiene el acceso a ciertos programas configurados para usar el directorio /etc/security/console.apps/
.
Este directorio contiene los archivos de configuración que habilitan al usuario de la consola correr ciertas aplicaciones de /sbin
y /usr/sbin
.
Estos archivos de configuración tienen el mismo nombre de las aplicaciones que configuran.
Un grupo notable de aplicaciones a los que el usuario de consola tiene acceso son tres programas que apagan o reinician el sistema:
/sbin/halt
/sbin/reboot
/sbin/poweroff
Debido a que estas aplicaciones utilizan PAM, llaman al módulo pam_console.so
como un requisito para usarlas.
2.4.8. Recursos adicionales
Los siguientes recursos explican más detalladamente los métodos para usar y configurar PAM. Además de estos recursos, lea los archivos de configuración de PAM en el sistema para entender mejor cómo están estructurados.
2.4.8.1. Documentación de PAM instalada
Las páginas man relacionadas con PAM — Hay varias páginas man para las distintas aplicaciones y archivos de configuración involucrados con PAM. La siguiente es un alista de alguna de las páginas man más importantes.
- Archivos de configuración
pam
— Buena información de presentación de PAM, que incluye la estructura y propósito de los archivos de configuración de PAM.
Fíjese que en esta página man se hace referencia tanto al archivo /etc/pam.conf
como a los archivos de configuración individuales del directorio /etc/pam.d/
. Por defecto, Fedora utiliza los archivos de configuración individual del directorio, ignorando el archivo /etc/pam.conf
, aún si efectivamente existe.
pam_console
— Describe el propósito del módulo pam_console.so
. También describe la sintaxis apropiada para una entrada dentro del archivo de configuración de PAM.
console.apps
— Describe el formato del archivo de configuración /etc/security/console.apps
, que define qué aplicaciones son accesibles por el usuario de consola asignado por PAM.
console.perms
— Describe el formato del archivo de configuración /etc/security/console.perms
, que especifica los permisos del usuario de consola asignados por PAM.
pam_timestamp
— Describe el módulo pam_timestamp.so
.
/usr/share/doc/pam-<version-number>
— Contiene una Guía de administradores de sistema, un Manual para escritores de módulos, y el Manual para desarrolladores de aplicación, y al mismo tiempo, una copia del stándard PAM DCE-RFC 86.0, donde <version-number>
es el número de la versión de PAM.
/usr/share/doc/pam-<version-number>
/txts/README.pam_timestamp
— Contiene información relacionada con el módulo PAM pam_timestamp.so
, donde <version-number>
es el número de versión de PAM.
2.4.8.2. Sitios web útiles sobre PAM
http://www.kernel.org/pub/linux/libs/pam/ — El sitio web principal de distribución del proyecto Linux-PAM, que contiene información relacionada con varios módulos PAM, una sección con respuestas a las preguntas más usuales (FAQ, por las siglas en inglés de Frequently Asked Questions), y documentación adicional acerca de PAM.
Nota
La documentación en el sitio web de arriba es para la última versión de desarrollo lanzada de PAM y puede no ser 100% precisa para la versión de PAM incluida en Fedora.
2.5. Encapsuladores TCP y xinetd
Controlar el acceso a los servicios de red es una de las tareas más importantes que deben realizar los administradores de servidor relacionadas con la seguridad. Fedora ofrece diferentes herramientas para este propósito. Por ejemplo, filtros de cortafuegos basados en iptables
, no permiten el ingreso a la configuración del kernel a todos aquellos paquetes que no hayan sido solicitados. Para los servicios de red que lo utilizan, los Encapsuladores TCP añaden una capa de protección adicional al definir los equipos que tienen o no permitida la conexión a los servicios de red "encapsulados". Tal servicio de red encapsulado es el súper servidor xinetd
. Este servicio es llamado un súper servidor debido a que controla las conexiones de una serie de subservicios de red y posteriormente refina el control de acceso.
El siguiente capítulo se concentra en el papel que tienen de los encapsuladores TCP y
xinetd
al controlar acceso a los servicios de red, y analiza de qué manera estas herramientas pueden ser utilizadas para mejorar tanto el registro como la administración de su utilización. Para obtener mayor información utilizando cortafuegos con
iptables
, vea la
Sección 2.9, “IPTables”.
2.5.1. Encapsuladores TCP
El paquete de los encapsuladores TCP (tcp_wrappers
) se encuentra instalado por defecto y ofrece control de acceso a los servicios de red basado en los equipos. El componente más importante de este paquete es la biblioteca /usr/lib/libwrap.a
. En términos generales, un servicio encapsulado por TCP es un servicio que ha sido compilado con la biblioteca libwrap.a
.
Cuando se realiza un intento de conexión a un servicio encapsulado por TCP, el servicio primero consulta los archivos de acceso del equipo (/etc/hosts.allow
y /etc/hosts.deny
) para determinar en qué casos el equipo tiene permitida la conexión. Generalmente, luego utiliza al demonio syslog (syslogd
) para escribir el nombre del cliente solicitante y del servicio solicitado en los archivos /var/log/secure
o /var/log/messages
.
Si un cliente tiene permitida la conexión, los encapsuladores TCP liberan el control de la conexión al servicio solicitado, y abandonan el proceso de comunicación entre el cliente y el servidor.
Además del control de acceso y registro, los encapsuladores TCP pueden ejecutar comandos para interactuar con el cliente antes que sea negado el control de la conexión, o antes de abandonar el proceso de conexión al servicio de red solicitado.
Debido a que los encapsuladores TCP son un valioso agregado al equipo de herramientas de seguridad que cualquier administrador de servidor posee, muchos servicios de red dentro de Fedora se encuentran enlazados con la biblioteca libwrap.a
. Algunas de estas aplicaciones son /usr/sbin/sshd
, /usr/sbin/sendmail
, y /usr/sbin/xinetd
.
Nota
Para determinar si un servicio de red ejecutable está enlazado con libwrap.a
, ingrese el siguiente comando como usuario root:
ldd <nombre-binario> | grep libwrap
Reemplace <binary-name>
con el nombre del servicio de red ejecutable.
Si el comando no le devuelve ninguna información, entonces el servicio de red no se encuentra enlazado con libwrap.a
.
El siguiente ejemplo inidica que /usr/sbin/sshd
se encuentra enlazado con libwrap.a
:
[root@myServer ~]# ldd /usr/sbin/sshd | grep libwrap
libwrap.so.0 => /lib/libwrap.so.0 (0x00655000)
[root@myServer ~]#
2.5.1.1. Ventajas de los Encapsuladores TCP
Los encapsuladores TCP ofrecen las siguientes ventajas en comparación con otras técnicas para el control de servicios de red:
Transparencia tanto para el cliente como para el servicio de red encapuslado — Tanto el cliente que está conectándose como el servicio de red, no tienen conocimiento de que los encapsuladores TCP están siendo utilizados. Los usuarios legítimos se registran y conectan a los servicios solicitados, mientras que no se realizan las conexiones pedidas por clientes no autorizados.
Administración centralizada de múltiples protocolos — los encapsuladores TCP operan en forma separada de los servicios de red que protegen, permitiendo así que varias aplicaciones de servidor compartan un conjunto común de archivos de configuración de control de acceso, haciendo posible que la administración sea más sencilla.
2.5.2. Archivos de configuración de los encapsuladores TCP
Para determinar si a un cliente le es permitido conectarse a un servidor, los encapsuladores TCP consultan los dos archivos siguientes, comúnmente denominados archivos de acceso de equipos:
/etc/hosts.allow
/etc/hosts.deny
Cuando un servicio encapsulado por TCP recibe una petición de un cliente, realiza los siguientes pasos:
Consulta con /etc/hosts.allow
. — El servicio encapsulado por TCP analiza secuencialmente el archivo /etc/hosts.allow
y aplica la primera regla especificada para ese servicio. Si encuentra una regla concordante, permite la conexión. Si no, avanza al siguiente paso.
Consulta con /etc/hosts.deny
. — El servicio encapsulado por TCP analiza secuencialmente el archivo /etc/hosts.deny
. Si encuentra una regla concordante, niega la conexión. Si no, permite el acceso al servicio.
Las siguientes son cuestiones importantes para considerar cuando se utilice encapsuladores TCP para proteger servicios de red:
Debido a que primero se aplican las reglas de acceso contenidas en hosts.allow
, dejan un precedente sobre las reglas especificadas en hosts.deny
. De este modo, si el acceso a un servicio es permitido en hosts.allow
, será ignorada una regla negando el acceso al mismo servicio del archivo hosts.deny
.
Las reglas de cada archivo son leídas desde arriba hacia abajo, y la primera regla concordante para un servicio dado es la única que será aplicada. El orden de las reglas es extremadamente importante.
Si no se encuentran reglas para el servicio en el archivo, o el archivo no existe, el acceso al servicio es permitido.
Los servicios encapsulados por TCP no conservan las reglas desde los archivos de acceso de los equipos, de modo que cualquier cambio en hosts.allow
o hosts.deny
, tienen efecto inmediato, sin necesidad de reiniciar los servicios de red.
Advertencia
Si la última línea del archivo de acceso de un equipo no es un caracter de tipo nueva línea (creado al presionar la tecla Enter key), la última regla del archivo fallará y un error será registrado o bien en /var/log/messages
, o bien en /var/log/secure
. Este es el mismo caso de una regla que abarca líneas múltiples sin utilizar el carcater de línea invertida. El siguiente ejemplo muestra la sección que nos interesa del fracaso de una regla debido a alguna de las circunstancias recién descritas:
warning: /etc/hosts.allow, line 20: missing newline or line too long
El formato tanto de /etc/hosts.allow
como de /etc/hosts.deny
es el mismo. Cada regla debe estar en su propia línea. Líneas vacías o líneas que empiezan con el símbolo numeral (#) son ignoradas.
Cada regla utiliza el siguiente formato básico para controlar el acceso a los servicios de red:
<daemon list>
: <client list>
[: <option>
: <option>
: ...]
<daemon list>
— Una lista separadas por comas de nombres de procesos (y
no el nombre de los servicios), o la opción
ALL
. La lista del demonio también acepta operadores (vea la
Sección 2.5.2.1.4, “Operadores”) para permitir mayor flexibilidad.
<client list>
— Una lista separada por comas de nombres de equipos, direcciones IP de los equipos, patrones especiales o comodines que identifican a los equipos afectados por la regla. La lista de cliente también acepta los operadores mostrados en la
Sección 2.5.2.1.4, “Operadores” para permitir mayor flexibilidad.
<opcion>
— Una acción, o una lista de acciones optativas separadas por puntos y comas, a realizarse cuando la regla sea disparada. Los campos de opción tienen soporte para expansiones, comandos de apertura de terminales, permitir o negar acceso, y modificar la conducta de registro.
Nota
Puede encontrarse mayor información acerca de los términos recién vistos en otras partes de esta Guía:
A continuación se muestra el ejemplo de una regla básica de acceso de equipos:
vsftpd : .ejemplo.com
Esta regla está indicando a los encapsuladores TCP que observen las conexiones del demonio FTP (vsftpd
) desde cualquier equipo en el dominio ejemplo.com
. Si esta regla aparece en hosts.allow
, la conexión es aceptada. Si esta regla figura en hosts.deny
, la conexión es negada.
El siguiente ejemplo de regla de acceso de equipos es más compleja y utiliza dos campos de opciones:
sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log \ : deny
Fíjese que cada campo de opción es precedido por la barra invertida (\). La utilización de esta barra previene el fallo de la regla debido a su longitud.
Esta regla de ejemplo establece que si se intenta establecer una conexión con el demonio SSH (
sshd
) desde algún equipo del dominio
example.com
, ejecute el comando
echo
para añadir el intento en un archivo de log especial, y negar la conexión. Debido a que la directiva opcional
deny
es utilizada, esta línea niega el acceso aún si figura en el archivo
hosts.allow
. Para conocer en detalle otras opciones disponibles, vea la
Sección 2.5.2.2, “Campos de opción”.
Los comodines le permiten a los encapsuladores TCP poder corresponderse más fácilmente con grupos de demonios de equipos. Son más frecuentemente utilizados en el campo lista de cliente de las reglas de acceso.
Los siguientes comodines están disponibles:
ALL
— Se corresponde con todo. Puede ser utilizado tanto para la lista del demonio como con la lista del cliente.
LOCAL
— Se corresponde con cualquier equipo que no contenga un punto (.), como por ejemplo el equipo local.
KNOWN
— Se corresponde con cualquier equipo cuyo nombre y la dirección sean conocidas o donde el usuario sea conocido.
UNKNOWN
— Se corresponde con cualquier equipo cuyo nombre o dirección sean desconocidos, o donde el usuario sea desconocido.
PARANOID
— Se corresponde con cualquier equipo cuyo nombre no concuerde con su dirección.
Importante
Los comodines KNOWN
, UNKNOWN
, y PARANOID
deben ser utilizados con cuidado, ya que dependen del servidor DNS que se esté utilizando para su operación correcta. Cualquier interrupción de la resolución de nombres podría causar que se les niegue acceso al servicio a los usuarios legítimos.
Pueden utilizarse patrones en el campo cliente de las reglas de acceso para especificar grupos de equipos de clientes en forma más precisa.
A continuación mostramos una lista con patrones comunes para entradas en el campo cliente:
Nombre de equipo empezando con un punto (.) — Colocar un punto al comienzo del nombre de un equipo hace que se correspondan todos los equipos que comparten los componentes del nombre en la lista. El siguiente ejemplo se aplica a cualquier equipo dentro del dominio ejemplo.com
:
ALL : .ejemplo.com
Dirección IP que finaliza con un punto (.) — Colocar un punto al finalizar una dirección IP hace que se correspondan todos los equipos que comparten los grupos numéricos iniciales de una dirección IP. El siguiente ejemplo se aplica a cualquier equipo dentro de la red 192.168.x.x
:
ALL : 192.168.
Dirección IP/par de máscara de red — Las expresiones de máscaras de red también pueden utilizarse como un patrón para controlar el acceso de un grupo determinado de direcciones IP. El siguiente ejemplo se aplica a cualquier equipo con un rango de direcciones desde 192.168.0.0
hasta 192.168.1.255
:
ALL : 192.168.0.0/255.255.254.0
Importante
Cuando se esté trabajando en el espacio de direcciones IPv4, la longitud del par dirección/prefijo (
prefixlen) en las declaraciones (notación
CIDR) no están soportadas. Solo las reglas IPv6 pueden utilizar este formato.
[direcciones IPv6]/par prefixlen — los pares [red]/prefixlen también pueden ser utilizados como un patrón para controlar el acceso de un grupo determinado de direcciones IPv6. El siguiente ejemplo se aplica a cualquier equipo en un rango de 3ffe:505:2:1::
hasta 3ffe:505:2:1:ffff:ffff:ffff:ffff
:
ALL : [3ffe:505:2:1::]/64
El asterisco (*) — Los asteriscos pueden ser utilizados para hacer concordar grupos enteros de nombres de equipos o direcciones IP, siempre y cuando no estén mezclados en listas de clientes que contengan otro tipo de patrones. El siguiente ejemplo se puede aplicar a cualquier equipo dentro del dominio ejemplo.com
:
ALL : *.ejemplo.com
La barra (/) — Si una lista de cliente comienza con una barra, será tratada como un nombre de archivo. Esto es útil si se necesitan reglas especificando grandes cantidades de equipos. El siguiente ejemplo referencia encapsuladores TCP al archivo /etc/telnet.hosts
para todas las conexiones Telnet.
in.telnetd : /etc/telnet.hosts
Existen otros patrones menos utilizados que también aceptan los encapsuladores TCP. Para obtener mayor información, vea la página man 5 de hosts_access
.
Advertencia
Sea muy cuidadoso al utilizar nombres de equipos y de dominios. Los atacantes pueden utilizar una gran variedad de trucos para sortear dificultades y obtener resoluciones de nombres adecuadas. Además, la interrupción del servicio DNS impide la utilización de los servicios de red incluso a los usuarios autorizados. De modo que, lo mejor es utilizar direcciones IP siempre que sea posible.
La implementación de Portmap
de los encapsuladores TCP no tiene soporte para búsqueda de equipos, lo que significa que Portmap
no puede utilizar los nombres de los equipos para identificarlos. Por lo tanto, las reglas de control de acceso para portmap en hosts.allow
o hosts.deny
, deben ser direcciones IP, o la palabra clave ALL
para especificar equipos.
Los cambios en las reglas de control de acceso de portmap
podrían no tener efecto inmediatamente. Tal vez necesite reiniciar el servicio portmap
.
Servicios muy utilizados, como NIS o NFS, dependen de portmap
para funcionar, de modo que tenga en cuenta estas limitaciones.
Hoy en día, las reglas de control de acceso aceptan un operador, EXCEPT
. Puede ser utilizado tanto en la lista de demonio como en la lista cliente de una regla.
El operador EXCEPT
permite excepciones específicas para ampliar las correspondencias dentro de una misma regla.
En el siguiente ejemplo de un archivo hosts.allow
, todos los equipos ejemplo.com
tienen permitido conectarse a todos los servicios, exepcto cracker.ejemplo.com
:
ALL: .ejemplo.com EXCEPT cracker.ejemplo.com
En otro ejemplo de un archivo hosts.allow
, los clientes de la red 192.168.0.x
pueden utilizar todos los servicios con excepción de FTP:
ALL EXCEPT vsftpd: 192.168.0.
Nota
En términos de organización, generalmente es más sencillo evitar la utilización de operadores EXCEPT
. Esto permite que otros administradores analicen rápidamente los archivos apropiados para ver a qué equipos se les permite o se les niega el acceso a los servicios, sin tener que organizar los operadores EXCEPT
.
2.5.2.2. Campos de opción
Además de las reglas básicas que permiten o que niegan el acceso, la implementación de encapsuladores TCP de Fedora soporta extensiones al lenguaje de control de acceso a través de campos de opción. Al utilizar los campos de opción en reglas de acceso de equipos, los administradores pueden realizar una variedad de tareas como por ejemplo modificar el comportamiento de los registros, consolidar control de acceso e iniciar comandos de terminal.
Los campos de opción permiten que los administradores modifiquen fácilmente la herramienta de registro y el nivel de prioridad para una regla, utilizando la directiva severity
.
En el siguiente ejemplo, las conexiones con el demonio SSH desde cualquier equipo del dominio ejemplo.com
son registradas en la herramienta authpriv
syslog
establecida por defecto (debido a que ningún valor de la herramienta es especificado) con una prioridad de emerg
:
sshd : .example.com : severity emerg
Es también posible especificar una herramienta utilizando la opción severity
. El siguiente ejemplo registra cualquier intento de conexión SSH realizada por equipos del dominio ejemplo.com
a la herramienta local0
, con una prioridad de alert
:
sshd : .ejemplo.com : severity local0.alert
Nota
En la práctica, este ejemplo no funciona hasta que el demonio syslog (syslogd
) sea configurado para registrarse en la herramienta local0
. Para obtener mayor información acerca de cómo configurar herramientas de registro establecidas por defecto, vea la página man de syslog.conf
.
2.5.2.2.2. Control de acceso
Los campos de opción también le permiten a los administradores permitir o negar explícitamente equipos mediante una sola regla, añadiéndole la directiva allow
o deny
como la opción final.
Por ejemplo, las dos reglas siguientes permiten conexions SSH desde client-1.example.com
, pero niegan conexiones de client-2.example.com
:
sshd : client-1.example.com : allow
sshd : client-2.example.com : deny
Al permitir control de acceso sobre un fundamento de reglas, el campo de opción permite que los administradores consoliden todas los reglas de acceso en un solo archivo: o bien hosts.allow
, o bien hosts.deny
. Algunos administradores consideran a esto como una forma sencilla de organizar las reglas de acceso.
2.5.2.2.3. Comandos de la consola
Los campos de opción permiten reglas de acceso para iniciar comandos de consola mediante las dos directivas siguientes:
spawn
— Inicia un comando de terminal como un proceso hijo. Esta directiva puede realizar tareas como ser la utilización de /usr/sbin/safe_finger
para obtener mayor información acerca del cliente que está realizando una determinada petición, o crear archivos de registro especiales mediante la utilización del comando echo
.
En el siguiente ejemplo, los clientes del dominio ejemplo.com
que intentan acceder a servicios Telnet, son registrados silenciosamente en un archivo especial:
in.telnetd : .ejemplo.com \
: spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log \
: allow
twist
— Reemplaza el servicio solicitado con el comando indicado. Esta directiva es a menudo utilizada para establecer trampas a los intrusos (también denominadas "tacitas de miel"). Puede también ser utilizada para enviar mensajes a los cllientes que estén conectándose. La directiva twist
debe tener lugar al final de la línea de la regla.
En el ejemplo siguiente, a los clientes que intentan acceder a los servicios FTP desde el dominio ejemplo.com
, se les envía un mensaje utilizando el comando echo
.
vsftpd : .ejemplo.com \
: twist /bin/echo "421 This domain has been black-listed. Access denied!"
Para obtener mayor información acerca de las opciones de comandos de terminal, vea la página man de hosts_options
.
Cuando se utilizan junto a las directivas spawn
y twist
, las expansiones proveen información acerca del cliente, servidor, y los procesos involucrados.
La siguiente es una lista de expansiones soportadas:
%a
— Informa la dirección IP del cliente.
%A
— Informa la dirección IP del servidor.
%c
— Informa una gran cantidad de datos del cliente, como ser por ejemplo, el nombre de usuario y el nombre del equipo, o el nombre de usuario y la dirección IP.
%d
— Informa el nombre del demonio encargado del proceso.
%h
— Informa el nombre del equipo del cliente (o la dirección IP, si es que el nombre del equipo no está disponible).
%H
— Informa el nombre del equipo del servidor (o su dirección IP, en caso que el nombre no esté disponible).
%n
— Informa el nombre del equipo cliente. Si no está disponible, se muestra unknown
. Si el nombre del equipo y la dirección del cliente no concuerdan, se muestra paranoid
.
%N
— Informa el nombre del equipo del servidor. Si no está disponible, se muestra unknown
. Si el nombre del equipo del servidor y la dirección no concuerdan, se muestra paranoid
.
%p
— Informa el ID del proceso del demonio.
%s
— Informa diferentes tipos de datos acerca del servidor, como ser por ejemplo, si el proceso del demonio y la dirección del equipo o dirección IP del servidor.
%u
— Informa el nombre de usuario del cliente. Si no está disponible, se muestra unknown
.
La siguiente regla de ejemplo utiliza una expansión junto con el comando spawn
para identificar el equipo del cliente en un archivo de registro modificado.
Cuando se intenten establecer conexiones al demonio SSH (sshd
) desde un equipo del dominio ejemplo.com
, ejecute el comando echo
para registrar el intento en un archivo especial, incluyendo el nombre del cliente (utilizando la expanción %h
).
sshd : .ejemplo.com \
: spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log \
: deny
De manera similar, las expansiones pueden ser utilizadas para personalizar mensajes enviados al cliente. En el siguiente ejemplo, a los clientes que intentan acceder a servicios FTP desde el dominio ejemplo.com
, se les informa que han sido eliminados del servidor:
vsftpd : .ejemplo.com \
: twist /bin/echo "421 %h has been banned from this server!"
Para obtener una explicación completa de las expansiones disponibles, y al mismo tiempo conocer opciones adicionales de control de acceso, vea la sección 5 de las páginas man de hosts_access
(man 5 hosts_access
), y la página man de hosts_options
.
El demonio xinetd
es un súper servicio encapsulado por TCP, que controla el acceso a un subconjunto de servicios de red muy utilizados, como por ejemplo FTP, IMAP y Telnet. También ofrece opciones de configuración de servicio específicas para control de acceso, registros mejorados, uniones, redirecciones y control de la utilización de los recursos.
Cuando un cliente intenta conectarse a un servicio de red controlado por xinetd
, el súper servicio recibe la petición y verifica la existencia de reglas de control de acceso para encapsuladores TCP.
Si el acceso es permitido, xinetd
verifica que la conexión sea permitida bajo sus propias reglas de acceso para ese servicio. También verifica que el servicio pueda tener más recursos disponibles, y que no esté en contradicción con ninguna otra regla definida.
Si todas estas condiciones se cumplen (es decir, el acceso al servicio es permitido; el servicio no ha alcanzado el límite de sus recursos; y el servicio no entra en colisión con ninguna otra regla definida), entonces xinetd
inicia una instancia del servicio solicitado y le pasa el control de la conexión. Luego que la conexión haya sido establecida, xinetd
deja de formar parte en la comunicación entre el cliente y el servidor.
2.5.4. Archivos de configuración de xinetd
Los archivos de configuración para xinetd
son los siguientes:
2.5.4.1. El archivo /etc/xinetd.conf
El archivo /etc/xinetd.conf
contiene parámetros de configuraciones generales que afectan cada servicio controlado por xinetd
. Es leido cuando el servicio xinetd
es iniciado por primera vez, de modo que para que los cambios en la configuración tengan efecto, habrá que reiniciar el servicio xinetd
. El siguiente es un ejemplo del archivo /etc/xinetd.conf
.
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
includedir /etc/xinetd.d
Estas lineas controlan los siguientes aspectos de xinetd
:
instances
— Indica el número máximo de peticiones simultáneas que puede procesar xinetd
.
log_type
— Configura xinetd
para utilizar la herramienta de registro authpriv
, que guarda entradas de registro en el archivo /var/log/secure
. Agregar una directiva como FILE /var/log/xinetdlog
podría crear un archivo de registro modificado denominado xinetdlog
en el directorio /var/log/
.
log_on_success
— configura xinetd
para registrar intentos de conexión exitosos. Por defecto, son registradas la dirección IP del equipo remoto y los ID de los procesos del servidor que está procesando la petición.
log_on_failure
— Configura xinetd
para registrar intentos de conexión fallidos, o casos en que la conexión fue negada.
cps
— Configura xinetd
para permitir más de 25 conexiones por segundo hacia cualquier servicio dado. Si el límite es superado, el servicio se retira durante 30 segundos.
includedir
/etc/xinetd.d/
— Incluye opciones declaradas en los archivos de configuración propios de cada servicio, ubicados en el directorio
/etc/xinetd.d/
. Para obtener mayor infirmación, consulte
Sección 2.5.4.2, “El directorio /etc/xinetd.d/”.
Nota
A menudo, tanto las configuraciones
log_on_success
como
log_on_failure
establecidas en
/etc/xinetd.conf
son modificadas posteriormente en los archivos de configuración propios de cada servicio. Por lo tanto existirá mayor información en el archivo de registro de un servicio dado, que la que pueda indicar el archivo
/etc/xinetd.conf
. Para mayor información, vea la
Sección 2.5.4.3.1, “Opciones para registrado”.
2.5.4.2. El directorio /etc/xinetd.d/
El directorio /etc/xinetd.d/
contiene los archivos de configuración para cada servicio administrado por xinetd
, y los nombres de los archivos correspondientes al servicio. Del mismo modo que con xinetd.conf
, este directorio es de solo lectura cuando el servicio xinetd
es iniciado. Para que cualquier cambio pueda tener efecto, el administrador debe reiniciar el servicio xinetd
.
El formato de los archivos en el directorio /etc/xinetd.d/
utiliza las mismas convenciones que /etc/xinetd.conf
. La principal razón por la que la configuración de cada servicio sea almacenada en un archivo diferente, es para hacer más sencilla la personalización, y menos propensa a modificar otros servicios.
Para adquirir una mejor comprensión acerca de cómo están estructurados estos archivos, prestele atención al archivo /etc/xinetd.d/krb5-telnet
:
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/kerberos/sbin/telnetd
log_on_failure += USERID
disable = yes
}
Estas líneas controlan numerosos aspectos del servicio telnet
:
service
— Especifica el nombre del servicio, generalmente uno de aquellos listados en el archivo /etc/services
flags
— Establece alguno de los atributos para la conexión. REUSE
le indica a xinetd
que vuelva a utilizar el socket para una conexión Telnet.
Nota
La marca REUSE
es obsoleta. Todos los servicios hoy en día utilizan la marca REUSE
.
socket_type
— Establece el tipo de socket de red a stream
.
wait
— Especifica cuando el servicio es tratado como de uno solo hilo de ejecución (yes
) o como de múltiples hilos de ejecución (no
).
user
— Especifica bajo qué ID de usuario se está ejecutando el proceso.
server
— Especifica el binario ejecutable a ser lanzado.
log_on_failure
— Especifica parámetros de registro para log_on_failure
, además de los que ya están definidos en xinetd.conf
.
disable
— Especifica cuándo el servicio debe ser desactivado (yes
), o activado (no
).
Para obtener mayor información sobre estas opciones y su uso, consulte la página man de xinetd.conf
.
2.5.4.3. Alteración de los archivos de configuración de xinetd
Existen disponibles una variedad de directivas protegidas por xinetd
. En esta sección se detallan algunas de las opciones más comunmente utilizadas.
2.5.4.3.1. Opciones para registrado
Las siguientes opciones de registro se encuentran disponibles tanto para /etc/xinetd.conf
como para los archivos de configuración del servicio específico en el directorio /etc/xinetd.d/
.
La siguiente es una lista de las opciones de registro más utilizadas:
ATTEMPT
— Registra el hecho de haberse realizado un intento fallido (log_on_failure
).
DURATION
— Registra el período de tiempo total en que ha sido utilizado el servicio por un sistema remoto (log_on_success
).
EXIT
— Registra el estado de salida, o la señal de finalización del servicio (log_on_success
).
HOST
— Registra la dirección IP del equipo remoto (log_on_failure
y log_on_success
).
PID
— Registra el ID de los procesos del servidor que recibe el pedido (log_on_success
).
USERID
— Registra a los usuarios remotos que utilizan el método definido en RFC 1413 para todos los servicios stream de aspectos múltiples (log_on_failure
ylog_on_success
).
Para obtener una lista completa de opciones de registro, consulte la página man de xinetd.conf
.
2.5.4.3.2. Opciones para el control de acceso
Los usuarios de los servicios
xinetd
pueden elegir entre utilizar las reglas de acceso de los equipos con encapsuladores TCP, o proveer control de acceso mediante los archivos de configuración de
xinetd
, o una mezcla de ambos. Para obtener mayor información acerca del control de acceso de los equipos con encapsuladores TCP, consulte la
Sección 2.5.2, “Archivos de configuración de los encapsuladores TCP”.
En esta sección se desarrolla la utilización de xinetd
para controlar el acceso a los servicios.
Nota
Al contrario que con los encapsuladores TCP, las modificaciones al control de acceso sólo tienen efecto si el administrador de xinetd
reinicia el servicio xinetd
.
De manera similar, al contrario que los encapsuladores TCP, el control de acceso mediante xinetd
solo afecta a los servicios controlados por xinetd
.
El control de acceso de los equipos con xinetd
difiere del método utilizado por encapsuladores TCP. Mientras que los encapsuladores TCP colocan todas las configuraciones de acceso en dos archivos, /etc/hosts.allow
y /etc/hosts.deny
, el control de acceso de xinetd
se encuentra en cada uno de los archivos de configuración de los servicios dentro del directorio /etc/xinetd.d/
.
Las siguientes opciones de acceso de equipos están soportadas por xinetd
:
only_from
— Permite la utilización del servicio sólo a los equipos especificados.
no_access
— Impide la utilización del servicio a los equipos indicados.
access_times
— Establece el período de tiempo en que un servicio particular puede ser utilizado. Este período debe ser indicado con notaciones en formato de 24 horas, HH:MM-HH:MM.
Las opciones only_from
y no_access
pueden utilizar una lista de direcciones IP o nombres de archivo, o pueden especificar una red entera. Del mismo modo que los encapsuladores TCP, combinar el control de acceso de xinetd
con la configuración mejorada de registro puede aumentar la seguridad evitando las peticiones de los equipos bloqueados, al mismo tiempo que se registra cada intento de conexión.
Por ejemplo, el siguiente archivo /etc/xinetd.d/telnet
puede utilizarse para bloquear accesos Telnet desde un grupo de determinado, y restringir el tiempo total en que pueden registrarse incluso los usuarios autorizados:
service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/kerberos/sbin/telnetd
log_on_failure += USERID
no_access = 172.16.45.0/24
log_on_success += PID HOST EXIT
access_times = 09:45-16:15
}
En este ejemplo, cuando un sistema de cliente de la red 10.0.1.0/24
, como por ejemplo 10.0.1.2
intenta acceder al servicio Telnet, recibe el siguiente mensaje:
Conexión cerrada por el equipo remoto.
Además, sus intentos de registro son almacenados en /var/log/messages
de la manera siguiente:
Sep 7 14:58:33 localhost xinetd[5285]: FAIL: telnet address from=172.16.45.107
Sep 7 14:58:33 localhost xinetd[5283]: START: telnet pid=5285 from=172.16.45.107
Sep 7 14:58:33 localhost xinetd[5283]: EXIT: telnet status=0 pid=5285 duration=0(sec)
Al utilizar encapsuladores TCP junto con control de acceso xinetd
, es importante comprender la relación entre ambos mecanismos de control de acceso.
La siguiente es la secuencia de eventos que realiza xinetd
cada vez que un cliente solicite una conexión:
El demonio xinetd
obtiene las reglas de acceso de los equipos con encapsuladores TCP, utilizando una llamada de biblioteca libwrap.a
. Si una regla de negación concuerda con el cliente, se abandona la conexión. Si una regla de conexión concuerda con el cliente, la conexión es entregada a xinetd
.
El demonio xinetd
verifica sus propias reglas de control de acceso tanto para el servicio xinetd
, como para el servicio solicitado. Si una regla de negación concuerda con el cliente, se abandona la conexión. De lo contrario, xinetd
inicia una instancia del servicio solicitado y entrega el control de la conexión a ese servicio.
Importante
Hay que tener cuidado al utilizar controles de acceso con encapsuladores TCP, junto con controles de acceso de xinetd
. Un error de configuración puede causar efectos no deseados.
2.5.4.3.3. Opciones de unión y redirección
Los archivos de configuración del servicio xinetd
tienen soporte para asociar el servicio con una dirección IP, y redireccionar las peticiones entrantes para ese servicio hacia otra dirección IP, nombre de equipo, o puerto.
Esta asociación es controlada con la opción bind
en el archivo de configuración específico de cada servicio, y enlaza ese servicio con una dirección IP en el sistema. Cuando esto es configurado, la opción bind
sólo acepta peticiones para acceder al servicio de la dirección IP correcta. Puede utilizar este método para asociar diferentes servicios con diferentes interfases de acuerdo a sus propias necesidades.
Esto es especialmente útil para los sistemas con adaptadores de red múltiples, o con múltiples direcciones IP. En tales sistemas, los servicios no seguros (Telnet, por ejemplo), pueden ser configurados para que sólo escuchen en una interfaz conectada con una red privada y no con una interfaz conectada a Internet.
La opción redirect
acepta una dirección IP o nombre de equipo seguido por un número de puerto. Configura el servicio de modo tal de poder redireccionar cualquier petición para este servicio hacia el equipo y número de puerto indicado. Esta herramienta puede ser utilizada para dirigirse hacia otro número de puerto en el mismo sistema, redireccionar la petición hacia una dirección IP diferente en la misma máquina, intercambiar la petición con un sistema y número de puerto totalmente diferente, o combinar entre ellas cualesquiera de estas opciones. Un usuario conectándose con un servicio determinado de un sistema, por lo tanto puede ser reruteado hacia otro sistema sin sufrir ningún tipo de interrupción.
El demonio xinetd
es capaz de lograr este redireccionamiento extendiendo un proceso activo durante todo el tiempo que dure la conexión, entre la máquina del cliente que realiza la petición y el equipo que efectivamente está proveyendo el servicio, transfiriendo los datos entre ambos sistemas.
Las ventajas de bind
y redirect
se hacen más evidentes cuando se utilizan de manera conjunta. Al asociar un servicio con una dirección IP determinada de un sistema, y luego redireccionar las peticiones para este servicio hacia una segunda máquina que sólo pueda ser vista por la primera, puede entonces utilizarse un sistema interno que ofrezca servicios para una red comopletamente diferente. Alternativamente, estas opciones pueden ser utilizadas para limitar la exposición de un servicio determinado en una máquina hacia una dirección IP conocida, al mismo tiempo que redirecciona cualquier petición para ese servicio hacia otra máquina configurada para ese propósito.
Por ejemplo, piense en un sistema que es utilizado como un cortafuegos con la siguiente configuración para su servicio Telnet:
service telnet
{
socket_type = stream
wait = no
server = /usr/kerberos/sbin/telnetd
log_on_success += DURATION USERID
log_on_failure += USERID
bind = 123.123.123.123
redirect = 10.0.1.13 23
}
Las opciones bind
y redirect
de este archivo aseguran que el servicio Telnet en la máquina está unido a la dirección IP externa (123.123.123.123
), por medio de la cual se conecta a Internet. Además, cualquier petición para el servicio Telnet enviada a 123.123.123.123
, es redireccionada hacia una dirección IP interna mediante un segundo adaptador de red (10.0.1.13
) a la que solo el cortafuegos y los sistemas internos pueden acceder. El cortafuegos entonces envía la comunicacién entre ambos sistemas, y el sistema que está conectándose piensa que lo ha hecho con 123.123.123.123
, cuando en realidad está conectado con una máquina diferente.
Esta herramienta es especialmente útil para usuarios con conexiones de banda ancha que sólo posean una dirección IP fija. Si utilizan Traductores de Direcciones de Red (NAT por las iniciales en inglés de Network Adress Translations), los sistemas detrás de la máquina que hace de puerta de enlace, que están utilizando direcciones IP sólo internas, no están disponibles desde fuera del sistema de puerta de enlace. Sin embargo, cuando ciertos servicios controlados por xinetd
son configurados con las opciones bind
y redirect
, la máquina que hace de puerta de enlace puede actuar como un proxy entre los sistemas externos y una máquina interna determinada que haya sido configurada para ofrecer el servicio. Además, las diferentes opciones de registro y de control de acceso de xinetd
, están disponibles para establecer protección adicional.
2.5.4.3.4. Opciones de administración de recursos
El demonio xinetd
puede ofrecer un nivel de protección básico para los ataques de Denegación de Servicio (DoS, por las iniciales en inglés de Denial of Service). La siguiente es una lista de directivas que pueden ayudar a disminuir la efectividad de tales ataques:
per_source
— Establece el número máximo de instancias para un servicio desde cada dirección IP. Acepta solo valores enteros como argumentos y puede ser utilizada tanto en xinetd.conf
como en el archivo de configuración específico del servicio en cuestión del directorio xinetd.d/
.
cps
— Establece el numero máximo de conexiones por segundo. Esta directiva necesita de dos argumentos enteros separados por un espacio. El primer argumento es el número máximo de conexiones permitidas por segundo al servicio. El segundo argumento es la cantidad de segundos que xinetd
debe esperar antes de reactivar el servicio. Acepta solo enteros como argumentos y puede ser utilizado tanto en el archivo xinetd.conf
, como el los archivos de configuración propios de cada servicio en el directorio xinetd.d/
.
max_load
— Define la utilización del CPU o el umbral de carga de utilización promedio de un servicio. Acepta un número de punto flotante como argumento.
La carga promedio es una medida aproximada que indica la forma en que algunos procesos están activos en un determinado período de tiempo. Para obtener mayor información acerca de la carga promedio, vea los comandos uptime
, who
, y procinfo
Existen otras opciones disponibles para la administración de los recursos para xinetd
. Para obtener mayor información, consulte la página man de xinetd.conf
.
2.5.5. Recursos adicionales
Mayor información acerca de los encapsuladores TCP y xinetd
se encuentra disponible en Internet y en la documentación del sistema.
2.5.5.1. Documentación instalada acerca de los encapsuladores TCP
La documentación de su sistema es un buen lugar en donde empezar a buscar opciones adicionales de configuración para los encapsuladores TCP, xinetd
, y control de acceso.
/usr/share/doc/tcp_wrappers-<version>
/
— Este directorio contiene un archivo README
en el que se explica cómo funcionan los encapsuladores TCP, y algunos de los muchos riesgos de suplantación de identidad que existen para los nombres de los equipos y sus direcciones.
/usr/share/doc/xinetd-<version>
/
— Este directorio contiene un archivo README
en el que se detallan aspectos relacionados con el control de acceso, y un archivo sample.conf
, con varias ideas para modificar los archivos de configuración propios para cada servicio que se encuentran en el directorio /etc/xinetd.d/
.
Páginas man relacionadas con encapsuladores TCP y xinetd
— Existen una cantidad de páginas man para varias aplicaciones y archivos de configuración relacionadas con encapsuladores TCP y xinetd
. Las siguientes con algunas de las más importantes:
- Aplicaciones de servidor
- Archivos de configuración
man 5 hosts_access
— La página man para los archivos de control de acceso de equipos con encapsuladores TCP.
man hosts_options
— La página man para los campos de opción de los encapsuladores TCP.
man xinetd.conf
— La página man que ofrece opciones de configuración para xinetd
.
2.5.5.2. Sitios web útiles relacionados con encapsuladores TCP
http://www.xinetd.org/ — El sitio principal de
xinetd
, que contiene archivos de configuración a modo de ejemplo, lista completa de herramientas, y una sección informativa de preguntas frecuentes (FAQ, por las iniciales en inglés de Frecuently Asked Questions).
La seguridad e integridad del sistema dentro de la red puede ser complejo. Puede necesitarse el tiempo de varios administradores solo para poder conocer qué servicios son los que están ejecutándose en una red, y la manera en que están siendo utilizados.
Y más aún, la autenticación de usuarios en los servicios de red pueden ser peligrosa cuando los métodos usados por el protocolo sean inherentemente inseguros, como lo demuestran los protocolos tradicionales FTP y Telnet, que transfieren contraseñas no encriptadas sobre la red.
Kerberos es una forma de eliminar la necesidad de protocolos que permitan métodos inseguros de autenticación, por lo que mejora la seguridad general de la red.
Kerberos es un protocolo de autenticación de red creado por el MIT (Massachusetts Institute of Technology), y utiliza una criptografía de llave simétrica [] para autenticar a los usuarios de los servicios de red, lo que en pocas palabras significa que las contraseñas nunca son enviadas a través de la red.
Consecuentemente, cuando los usuarios se autentican con servicios de red usando Kerberos, los usuarios no autorizados que intenten averiguar las contraseñas monitoreando el tráfico de red son efectivamente bloqueados.
2.6.1.1. Ventajas de Kerberos
La mayoría de los servicios convencionales de red utilizan esquemas de autenticación basados en contraseñas. Estos esquemas piden que los usuarios se identifiquen en un servidor de red determinado mediante su nombre y contraseña. Desafortunadamente, la transmisión de los datos para la autenticación de muchos servicios no es encriptada. Para que este tipo de esquemas sean seguros, la red tiene que permanecer inaccesible a los usuarios extraños a ella, y todos los equipos y todos los usuarios pertenecientes deben ser considerados confiables.
Aún si este es el caso, una red que se encuentre conectada a Internet no puede ser concebida como una red segura. Cualquier atacante que obtenga acceso a la red puede utilizar un simple analizador de paquetes, también conocido como "rastreador" de paquetes, para interceptar nombres de usuario y contraseñas, comprometiendo las cuentas de usuario y la integridad de toda la infraestructura de seguridad.
El objetivo primario del diseño de Kerberos es eliminar la transmisión de contraseñas encriptadas en la red. Si se usa apropiadamente, Kerberos elimina efectivamente la amenaza de los husmeadores (sniffers) de paquetes en la red.
2.6.1.2. Desventajas de Kerberos
Aunque Kerberos elimina una amenaza de seguridad común y severa, puede ser difícil de implementar por una variedad de razones:
Puede ser algo muy tedioso migrar las contraseñas de los usuarios de una base de datos UNIX estándar, como ser por ejemplo /etc/passwd
o /etc/shadow
hacia una base de datos para contraseñas Kerberos, ya que no hay ningún mecanismo automatizado para realizar esta tarea. Consulte la pregunta 2.23 en el FAQ en línea de Kerberos:
Kerberos sólo tiene compatibilidad parcial con el sistema PAM de módulos de autenticación conectables, utilizado por la mayoría de los servidores Fedora. Vaya a la
Sección 2.6.4, “Kerberos y PAM” para más información al respecto.
Kerberos presupone que cada usuario es confiable, pero que está utilizando un equipo o una red que no lo es. Su objetivo principal es prevenir la transmisión en la red de contraseñas no encriptadas. Sin embargo, si alguien más tiene acceso al único equipo que envía los comprobantes utilizados para la autenticación — denominado el centro de distribución de claves (KDC, por las siglas en inglés de Key Distribution Center) —, además del usuario correspondiente, entonces todo el sistema de autenticación Kerberos está corriendo riesgo.
Para que una aplicación utilice Kerberos, su origen debe ser modificado para que puede realizar las llamadas apropiadas a las bibliotecas de Kerberos. Las aplicaciones así modificadas son consideradas como compatibles con Kerberos, o kerberizadas. Para algunas, esto puede ser bastante problemático debido al tamaño de la aplicación o debido a su diseño. Para otras aplicaciones incompatibles, los cambios deben ser hechos de manera tal de permitir que el cliente y el servidor puedan comunicarse. De nuevo, esto puede necesitar una programación extensa. Las aplicaciones de código propietario que no tienen soporte para Kerberos por defecto, son por lo general las más problemáticas.
Kerberos es una herramienta de tipo "todo o nada". Si Kerberos es utilizado en la red, cualquier contraseña no encriptada transferida a un servicio no compatible con Kerberos (o no Kerberizado), se encuentra en riesgo. Por lo tanto, la red no obtiene beneficio alguno al utilizarlo. Para asegurar una red con Kerberos, se debe utilizar versiones kerberizadas de todas las aplicaciones de tipo servidor/cliente que transmitan contraseñas no encriptadas, o que no utilicen ninguna de este tipo de aplicaciones.
2.6.2. Terminología de Kerberos
Kerberos tiene su propia terminología para definir varios aspectos del servicio. Antes de aprender cómo funciona Kerberos, es importante conocer algunos de los siguientes términos:
- Servidor de autenticación (SA)
Un servidor que envía comprobantes (o tickets) para un servicio determinado, comprobantes que en su momento serán enviados a los usuarios para que puedan acceder a ese servicio. El AS responde con una petición a las solicitudes de los clientes que, o no tienen o no han enviado sus credenciales de autenticación. Generalmente, para tener acceso al servidor que emite las garantías de los comprobantes (TGS, por las siglas en inglés de Ticket-Granting Server), se envía un comprobante de obtención de garantía de comprobante (TGT, Ticket-Granting Ticket). Por último, el AS generalmente se ejecuta en el mismo equipo que el centro de distribución de claves (KDC, Key Distribution Center).
- ciphertext
Datos encriptados.
- cliente
Una entidad en la red (un usuario, equipo o aplicación) que puede recibir tickets desde Kerberos.
- credenciales
Un conjunto de credenciales electrónicas temporales que verifican la identidad de un cliente para un servicio particular. También llamado ticket.
- caché de credenciales o archivo de ticket
Un archivo que contiene las claves para encriptar las comunicaciones entre un usuario y varios servicios de red. Kerberos 5 soporta un marco de trabajo para el uso de otros tipos de cache, tales como memoria compartida, pero los archivos son los más completamente soportados.
- hash de encriptado
Un hash de una vuelta se usa para autenticar los usuarios. Estos son más seguros que usar datos no encriptados, pero todavía son relativamente fáciles de desencriptar para craqueadores experimentados.
- GSS-API
La Interfaz del Programa de la Aplicación de Servicios Generales de Seguridad (API, por las siglas en inglés de Generic Security Service Application Program Interfaz), es un conjunto de funciones que proveen servicios de seguridad, definida en RFC-2743, publicada por el Equipo de Tareas de Ingeniería de Internet. La API es utilizada por servicios y clientes para autenticarse mutuamente sin que sus programas posean conocimientos específicos de los mecanismos subyacentes. Si un servicio de red (como por ejemplo cyrus-IMAP) utiliza GSS-API, entonces puede autenticarse mediante Kerberos.
- hash
También conocido como valor hash. Un valor generado por el paso de una cadena a través de una función hash. Estos valores son típicamente usados para asegurar que los datos transmitidos no fueron interceptados y modificados.
- función hash
Una forma de generar una "huella digital" desde los datos de entrada. Estas funciones reordenan, trasponen o alteran de otras formas para producir un valor hash.
- clave
Los datos usados cuando se encriptan o desencriptan otros datos. Los datos encriptados no pueden ser desencriptados sin una clave apropiada o una extrema buena suerte de parte del craqueador.
- centro de distribución de claves (KDC)
Un servicio que emite tickets de Kerberos, y que usualmente corre en el mismo equipo que el servidor de garantía de ticket (TGS).
- tabla de clave (keytab)
Un archivo que incluye una lista no encriptada de principales con sus respectivas claves. Los servidores obtienen las claves que necesitan desde los archivos keytab en lugar de utilizar kinit
. El archivo keytab establecido por defecto es /etc/krb5.keytab
. El servidor que administra el KDC /usr/kerberos/sbin/kadmind
, es el único servicio que utiliza cualquier otro archivo (utiliza /var/kerberos/krb5kdc/kadm5.keytab
).
- kinit
El comando kinit
permite a un principal que ya ingresó obtener y hacer caché del ticket inicial de garantía de tickets (TGT). Vaya a la página man de kinit
para más información.
- principal (o nombre principal)
El principal es el nombre único de un servicio o de un usuario al que le es permitido autenticarse mediante Kerberos. El principal tiene la forma de root[/instance]@REALM
. Para un usuario típico, el root es el mismo que su ID de inicio de sesión. La instance
es opcional. Si el principal tiene una instancia, será diferenciada del root con una barra invertida ("/"). Una cadena vacía ("") es considerada una instancia válida (que difiere de la instancia NULL
establecida por defecto), pero utilizarla puede llegar a ser confuso. Todos los principales de un dominio poseen su propia clave, que para los usuarios es derivada desde una contraseña, o es un conjunto de servicios aleatorios.
- reinado
Una red que use Kerberos, compuesta de uno o más servidores llamados KDCs y un número potencialmente grande de clientes.
- servicio
Un programa accedido por la red.
- ticket
Un conjunto temporal de credenciales electrónicas que verifican la identidad de un cliente para un servicio particular. También llamados credenciales o comprobantes.
- servidor de garantías de tickets (TGS)
Un servidor que emite tickets para un servicio deseado que son a su vez dados a los usuarios para acceder al servicio. El TGS corre normalmente en el mismo equipo que el KDC.
- ticket de garantía de ticket (TGT)
Un ticket especial que permite al cliente obtener tickets adicionales sin aplicar nuevamente en el KDC.
- contraseña no encriptada
Una contraseña en texto plano, legible al humano.
2.6.3. Como Funciona Kerberos
Kerberos se diferencia de los métodos de autenticación de tipo nombre de usuario/contraseña. En lugar de autenticar cada usuario en cada servicio de red, Kerberos utiliza encriptaciones simétricas y un servicio adicional confiable (un KDC), para autenticar usuarios en conjunto de servicios de red. Cuando un usuario se autentica en el KDC, el KDC devuelve a la máquina del usuario en cuestión un comprobante específico para esa sesión, y cualquier servicio kerberizado busca el comprobante en la máquina del usuario, en lugar de pedir que el usuario se autentique utilizando una contraseña.
Cuando un usuario kerberizado de una red se loguea en su estación de trabajo, su principal es enviado al KDC como parte de un pedido para un TGT del servidor de Autenticación. Este pedido puede ser enviado por el programa de logueo de modo que sea transparente para el usuario, o puede ser enviado por el programa kinit
luego que el usuario se haya logueado.
El KDC entonces verifica con el principal en su base de datos. Si el principal es encontrado, el KDC crea un TGT, que se encripta usando la clave del usuario y se lo devuelve a ese usuario.
El login, o programa kinit
en el cliente, se encarga de desencriptar el TGT utilizando la clave del usuario, que se analiza desde la contraseña del usuario. La clave del usuario es utilizada sólo en la máquina cliente y no se transmite en la red.
El TGT es configurado para que caduque en un determinado período de tiempo (generalmente de diez a veinticuatro horas), y es almacenado en el caché de credenciales en la máquina del cliente. Un tiempo de expiración es definido para que, en el supuesto caso que exista un TGT vulnerado, pueda ser utilizado por un atacante sólo durante un breve período de tiempo. Luego que se ha emitido un TGT, el usuario no necesita reingresar su contraseña hasta que este no expire, o hasta que haya finalizado su sesión, y haya vuelto a iniciarla.
Siempre que el usuario necesite acceso a un servicio de red, el software del cliente utiliza el TGT para pedirle al TGS un nuevo comprobante específicamente para ese servicio. El comprobante del servicio es entonces utilizado para autenticar de manera transparente al usuario frente al servicio en cuestión.
Advertencia
El sistema Kerberos puede ser vulnerado si un usuario en la red se autentica frente a un servicio no kerberizado transmitiendo una contraseña con formato de texto simple. La utilización de servicios no kerberizados es altamente desalentada. Entre tales servicios se encuentra Telnet y FTP. Es preferible la utilización de otros protocolos encriptados, como servicios asegurados mediante SSH o SSL, aunque no es lo ideal.
Este es solamente una presentación general de cómo funciona la autenticación de Kerberos. Vaya a la
Sección 2.6.10, “Recursos adicionales” para conocer otros enlaces hacia información más detallada.
Nota
Kerberos depende de los siguientes servicios de red para funcionar correctamente.
Sincronización de reloj aproximado entre las máquinas de la red.
Un programa de sincronización de relojes debería ser configurado para la red, como por ejemplo ntpd
. Consulte /usr/share/doc/ntp-<version-number>
/index.html
(donde <version-number>
, es el número de versión del paquete ntp
instalado en su sistema) para obtener más detalles acerca de cómo definir servidores de Protocolos de Horarios de Red.
Servicio de Nombre de Dominio (DNS).
Debe asegurarse que las entradas DNS y los equipos en la red se encuentren todos configurados adecuadamente. Vea Kerberos V5 System Administrator's Guide en /usr/share/doc/krb5-server-<version-number>
para obtener más información, (donde <version-number>
es el número de versión del paquete krb5-server
instalado en su sistema).
Los servicios kerberizados actualmente no utilizan módulos de autenticación conectables (PAM, por las siglas en inglés de Pluggable Authentication Modules) — estos servicios evitan completamente a PAM. Sin embargo, las aplicaciones que utilicen PAM pueden utilizar a Kerberos para autenticarse si el módulo pam_krb5
(provisto en el paquete pam_krb5
) se encuentra instalado. El paquete pam_krb5
contiene archivos de ejemplos de configuración que permiten que servicios como login
o gdm
puedan autenticar usuarios al mismo tiempo que obtienen credenciales de inicio utilizando sus contraseñas. Si el acceso a los servicios de red es siempre realizado utilizando servicios kerberizados, o servicios que utilicen GSS-API como por ejemplo lo es IMAP, entonces puede considerarse a la red como razonablemente segura.
Importante
Los administradores deben tener la precaución de no permitir que los usuarios se autentiquen a determinados servicios de red, utilizando contraseñas Kerberos. Muchos protocolos utilizados por estos servicios no encriptan las contraseñas antes de enviarlas a través de la red, destruyendo los beneficios del sistema Kerberos. Por ejemplo, los usuarios no deberían tener permitido autenticarse a servicios Telnet con la misma contraseña que utilizan para la autenticación en Kerberos.
2.6.5. Configurando un servidor Kerberos 5
Cuando se configure Kerberos, primero instale el KDC. Si es necesario configurar servidores esclavos, instale el maestro primero.
Para configurar el primer KDC de Kerberos, siga estos pasos:
Asegúrese que la sincronización de hora y DNS estén funcionando correctamente en todos los clientes y máquinas del servidor antes de continuar Kerberos. Preste una atención especial a la sincronización entre el servidor Kerberos y sus clientes. Si la diferencia horaria entre el servidor y el cliente es mayor a cinco minutos (esto es configurable en Kerberos 5), los clientes de Kerberos no podrán autenticarse en el servidor. Esta sincronización es necesaria para prevenir que un atacante utilice un comprobante antiguo de Kerberos enmascarado como el de un usuario válido.
Es recomendable configurar una red cliente/servidor compatible con el Protocolo de Horario de Red (NTP, por las siglas en inglés de Network Time Protocol), aún cuando no se esté utilizando Kerberos. Fedora incluye el paquete
ntp
para este propósito. Consulte
/usr/share/doc/ntp-<version-number>
/index.html
(donde
<version-number>
es el número de versión del paquete
ntp
instalado en su sistema) para conocer detalles acerca de cómo configurar servidores con Protocolos de Horario de Red, o
http://www.ntp.org, para obtener más información acerca de NTP.
Instale los paquetes krb5-libs
, krb5-server
y krb5-workstation
en la máquina dedicada que correrá KDC. Esta máquina necesita ser muy segura — si es posible, no debe correr ningún otro servicio más que KDC.
Edite los archivos de configuración /etc/krb5.conf
y /var/kerberos/krb5kdc/kdc.conf
para reflejar el nombre del reinado y los mapeos dominio-a-reinado. Un reinado simple puede ser construido reemplazando instancias de EJEMPLO.COM
y ejemplo.com
con el nombre correcto del dominio — siendo seguro mantener la forma correcta de los nombres en mayúscula y en mínuscula — y cambiando el KDC de kerberos.elemplo.com
al nombre del servidor kerberos. Por convención, todos los nombres de reinados se escriben en mayúsculas, y todos los nombres de equipos y de dominios DNS en minúsculas. Para obtener información detallada acerca de los formatos de estos archivos de configuración, consulte sus respectivas páginas man.
Genere la base de datos usando el utilitario kdb5_util
desde una terminal:
/usr/kerberos/sbin/kdb5_util create -s
El comando create
genera la base de datos que almacena las clves para el reinado de Kerberos. El interruptor -s
obliga a la creación de un archivo stash en el cual la clave del servidor principal es almacenada. Si no existe un archivo stash desde donde poder leer la clave, el servidor kerberos (krb5kdc
) le pedirá al usuario que ingrese la contraseña principal del servidor (que puede ser utilizada para generar nuevamente la clave) cada vez que se inicie.
Edite el archivo /var/kerberos/krb5kdc/kadm5.acl
. Este archivo es usado por kadmind
para determinar qué principales tienen acceso administrativo a la base de datos de Kerberos y sus niveles de acceso. La mayoría de las organizaciones pueden obtenerlo por una única línea:
*/admin@EJEMPLO.COM *
La mayoría de los usuarios se representan en la base de datos por un principal único (con una instancia NULL, o vacía, tal como juan@EJEMPLO.COM). En esta configuración, los usuarios con un segundo principal con una instancia de admin (por ejemplo, juan/admin@EJEMPLO.COM) pueden manejar con poder completo sobre el reinado de la base de datos de Kerberos.
Después de que se inicie kadmind
en el servidor, cualquier usuario puede acceder sus servicios ejecutando kadmin
en cualquier cliente o servidores en el reino. Sin embargo, sólo los usuarios listados en el archivo kadm5.acl
pueden modificar la base de datos de ninguna forma, excepto para cambiar sus propias contraseñas.
Nota
La herramienta kadmin
permite la comunicación con el servidor kadmind
a través de la red, y utiliza kerberos para manipular la autenticación. Consecuentemente, el primer principal debe existir previamente antes de intentar conectarse con el servidor a través de la red para administrarlo. Genere el primer principal con el comando kadmin.local
, que ha sido específicamente diseñado para ser utilizado en el mismo equipo en el que funciona el KDC, y no utiliza Kerberos para su autenticación.
Ingrese el comando siguiente kadmin.local
en la terminal KDC para crear el primer principal:
/usr/kerberos/sbin/kadmin.local -q "addprinc nombreusuario
/admin"
Inicie Kerberos usando los siguientes comandos:
/sbin/service krb5kdc start
/sbin/service kadmin start
/sbin/service krb524 start
Agregue principales para los usuarios mediante el comando addprinc
dentro de kadmin
. kadmin
y kadmin.local
son interfaces de líneas de comando al KDC. Como este, existen disponibles otros comandos — como por ejemplo addprinc
— luego de iniciar el programa kadmin
. Para obtener mas información, consulte la página man de kadmin
.
Verifique que KDC está emitiendo tiques. Primero, corra kinit
para obtener un tique y guardarlo en un archivo cache de credencial. Luego, use klist
para ver la lista de credenciales en el caché y use kdestroy
para destruir el caché y las credenciales que contiene.
Nota
Por defecto, kinit
intenta autenticarse utilizando el mismo nombre de usuario del de inicio de sesión (no el del servidor Kerberos). Si ese nombre de usuario no se corresponde con un principal en la base de datos de Kerberos, kinit
envía un mensaje de error. Si eso sucede, indiquele a kinit
el nombre del principal correcto, como un argumento en la línea de comando (kinit <principal>
).
Una vez que estos pasos sean completados, el servidor Kerberos ya debería estar listo y ejecutándose.
2.6.6. Configuración de un Cliente Kerberos 5
Configurar un cliente de Kerberos 5 es menos complicado que configurar un servidor. Como mínimo, instale los paquetes del cliente y otórguele a cada cliente un archivo de configuración krb5.conf
válido. Mientras que ssh
y slogin
son los métodos preferidos para loguearse remotamente en sistemas cliente, las versiones Kerberizadas de rsh
y rlogin
siguen estando disponibles, aunque para habilitarlas es necesario realizar algunos cambios adicionales en la configuración.
Asegúrese que la sincronización del tiempo existe entre el cliente Kerberos y KDC. Vaya a
Sección 2.6.5, “Configurando un servidor Kerberos 5” para más información. Además, verifique que el DNS está funcionando apropiadamente en el cliente Kerberos antes de continuar con los programas cliente de Kerberos.
Instale los paquetes krb5-libs
y krb5-workstation
en todas las máquinas clientes. Provea un archivo /etc/krb5.conf
válido para cada cliente (normalmente este puede ser el mismo archivo krb5.conf
usado por el KDC).
Antes que una estación de trabajo del reinado pueda utilizar a Kerberos para autenticar los usuarios que se conectan mediante ssh
, o mediante los rsh
o rlogin
Kerberizados, debe tener su propio equipo principal en la base de datos de Kerberos. Los programas de servidor sshd
, kshd
, y klogind
, necesitan todos acceder a las llaves para los servicios del host principal. Además, para poder utilizar los servicios kerberizados rsh
y rlogin
, esa estación de trabajo debe tener el paquete xinetd
instalado.
Al utilizar kadmin
se agrega un principal de equipo para la estación de trabajo en el KDC. En este caso, la instancia es el nombre del equipo de la estación de trabajo. Utilice la opción -randkey
para el comando addprinc
de kadmin
, para crear el principal y asignarle una llave en forma azarosa:
addprinc -randkey host/bla.ejemplo.com
Ahora que se ha creado el principal, las claves se pueden extraer para la estación trabajo ejecutando kadmin
en la misma estación de trabajo y usando el comando ktadd
dentro de kadmin
:
ktadd -k /etc/krb5.keytab host/bla.ejemplo.com
Para usar otros servicios de red kerberizados, primero deben iniciarse. A continuación mostramos una lista de los servicios kerberizados comunes y las instrucciones acerca de cómo habilitarlos:
ssh
— OpenSSH usa GSS-API para autenticar los usuarios en los servidores si la configuración del cliente y del servidor tienen ambas GSSAPIAuthentication
habilitado. Si el cliente tiene también GSSAPIDelegateCredentials
habilitado, las credenciales del usuario se hacen disponibles en el sistema remoto.
rsh
y rlogin
— Para usar las versiones kerberizadas de rsh
y rlogin
, habilite klogin
, eklogin
y kshell
.
Telnet — Para usar Telnet kerberizado, debe habilitar krb5-telnet
.
FTP — Para proveer acceso FTP, crear y extraer una clave para el principal con una raíz de ftp
. Asegúrese de poner la instancia al nombre de equipo completo del servidor FTP, luego habilite gssftp
.
IMAP — Para utilizar un servidor kerberizado IMAP, el paquete cyrus-imap
utilizará Kerberos 5, si también se encuentra instalado el paquete cyrus-sasl-gssapi
. El paquete cyrus-sasl-gssapi
contiene el complemento Cyrus SASL que tiene soporte para autenticación GSS-API. Cyrus IMAP debería funcionar correctamente con Kerberos siempre y cuando el usuario cyrus
sea capaz de encontrar la clave correspondiente en /etc/krb5.keytab
, y que la raíz para el principal esté definida para imap
(creada con kadmin
).
Una alternativa a cyrus-imap
se puede encontrar en el paquete dovecot
, que también se incluye en Fedora. Este paquete contiene un servidor IMAP pero no da soporte a GSS-API y Kerberos por el momento.
CVS — Para usar un servidor CVS kerberizado, gserver
usa un principal con una raíz de cvs
y por lo demás es idéntico al servidor CVS pserver
.
2.6.7. Mapeo dominio-a-reinado
Cuando un cliente intenta acceder a un servicio que corre en un servidor particular, sabe el nombre del (equipo) del servicio y el nombre del servidor (foo.ejemplo.com), pero como se pueden desplegar más de un reinado en su red, debe averiguar el nombre del reinado en el que reside el servicio.
Por defecto, el nombre del territorio se toma como el nombre de dominio DNS del servidor, en mayúsculas.
foo.ejemplo.org → EJEMPLO.ORG
foo.ejemplo.com → EJEMPLO.COM
foo.hq.ejemplo.com → HQ.EJEMPLO.COM
En algunas configuraciones esto será suficiente, pero en otras, el nombre del reinado derivado será el nombre de un reinado no existente. En estos casos, el mapeo desde el nombre del dominio DNS del servidor, hacia su reinado, debe estar especificado en la sección domain_realm del sistema krb5.conf
del cliente. Por ejemplo:
[domain_realm]
.ejemplo.com = EJEMPLO.COM
ejemplo.com = EJEMPLO.COM
En la configuración de arriba se especifica dos mapeos. El primero especifica que cualquier sistema en el dominio de DNS "ejemplo.com" pertenecen al reinado EJEMPLO.COM. El segundo especifica que el nombre exacto "ejemplo.com" está también en el reinado. (La distinción entre el dominio y un equipo específico se marca por la presencia o ausencia del "." inicial.) El mapeo también se puede almacenar directamente en el DNS.
2.6.8. Configurando KDCs secundarios
Por diversas razones, usted puede elegir ejecutar varios KDCs para un reinado dado. En este escenario, un KDC (el KDC maestro) conserva una copia modificable de la base de datos del reinado, y ejecuta kadmind
(que también es el admin server de su reinado), y uno o más KDCs (esclavos) conservan copias de solo lectura de la base de datos, y ejecutan kpropd
.
El procedimiento de propagación maestro-esclavo requiere que el KDC maestro vuelque su base de datos a un archivo de volcado temporal y luego transmita ese archivo a cada uno de sus esclavos, que luego sobreescriben sus copias sólo lectura de la base de datos recibidas antes, con el contenido del archivo de volcado.
Para configurar un KDC esclavo, primero asegúrese que los archivos krb5.conf
y kdc.conf
del KDC maestro fueron copiados al KDC esclavo.
Inicie kadmin.local
desde una consola raíz en el KDC maestro, y utilice su comando add_principal
para crear una nueva entrada para el servicio host del KDC maestro, y luego utilice su comando ktadd
para definir una llave aleatoria para el servicio, y al mismo tiempo almacenarla en el archivo keytab establecido por defecto. Esta llave será utilizada por el comando kprop
para autenticarse a los servidores esclavos. Usted necesitará hacer esto sólo una vez, sin importar la cantidad de servidores esclavos que tenga instalados.
#
kadmin.local -r EXAMPLE.COM
Authenticating as principal root/admin@EXAMPLE.COM with password.
kadmin:
add_principal -randkey host/masterkdc.example.com
Principal "host/host/masterkdc.example.com@EXAMPLE.COM" created.
kadmin:
ktadd host/masterkdc.example.com
Entry for principal host/masterkdc.example.com with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/masterkdc.example.com with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/masterkdc.example.com with kvno 3, encryption type DES with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/masterkdc.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:
quit
Inicie kadmin
como usuario root desde una terminal en el KDC esclavo, y utilice el comando add_principal
para crear una nueva entrada para su servicio host. Luego utilice el comando ktadd
, de kadmin
, para establecer (y al mismo tiempo almacenar) en el archivo keytab del esclavo, una llave aleatoria para el servicio. Esta llave es utilizada por el servicio kpropd
cuando se necesite autenticar a los clientes.
#
kadmin -p jimbo/admin@EXAMPLE.COM -r EXAMPLE.COM
Authenticating as principal jimbo/admin@EXAMPLE.COM with password.
Password for jimbo/admin@EXAMPLE.COM:
kadmin:
add_principal -randkey host/slavekdc.example.com
Principal "host/slavekdc.example.com@EXAMPLE.COM" created.
kadmin:
ktadd host/slavekdc.example.com@EXAMPLE.COM
Entry for principal host/slavekdc.example.com with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/slavekdc.example.com with kvno 3, encryption type ArcFour with HMAC/md5 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/slavekdc.example.com with kvno 3, encryption type DES with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/slavekdc.example.com with kvno 3, encryption type DES cbc mode with RSA-MD5 added to keytab WRFILE:/etc/krb5.keytab.
kadmin:
quit
Con la clave de este servicio, el KDC esclavo puede autenticar a cualquier cliente que intente conectarse a él. Obviamente, no a todos ellos debería permitírsele proveer el servicio esclavo kprop
con una nueva base de datos del reinado. Para restringir el acceso, el servicio kprop
en el KDC esclavo solo aceptará actualizaciones de clientes cuyos nombre de principal estén listados en /var/kerberos/krb5kdc/kpropd.acl
. Agregue el nombre del equipo KDC maestro a esa lista.
#
echo equipo/kdcmaestro.ejemplo.com@EJEMPLO.COM > /var/kerberos/krb5kdc/kpropd.acl
Una vez que el KDC esclavo haya obtenido una copia de la base de datos, necesitará también la clave maestra que ha sido utilizada para encriptarlo. Si la llave maestra de su base de datos KDC ha sido almacenada en un archivo stash del KDC maestro (generalmente denominada /var/kerberos/krb5kdc/.k5.REALM
), cópiela en el KDC esclavo utilizando cualquier método disponible que sea seguro, o cree una base de datos y un archivo escondite falsos en el KDC esclavo ejecutando kdb5_util create -s
(la base de datos falsa será sobreescrita con la primera propagación de base de datos que sea exitosa), e indicando la misma contraseña.
Asegúrese que el cortafuego del KDC esclavo permite al KDC maestro contactarlo usando el puerto 754 con TCP (krb5_prop), e inicie el servicio kprop
. Luego, vuelva a chequear si el servicio kadmin
está deshabilitado.
Ahora realice una prueba manual de propagación de la base de datos volcando la base de datos del reinado, en el KDC maestro, al archivo de datos predeterminado desde donde el comando kprop
leerá (/var/kerberos/krb5kdc/slave_datatrans
) y luego use el comando kprop
para transmitir su contenido al KDC esclavo.
#
/usr/kerberos/sbin/kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
#
kprop slavekdc.example.com
Usando kinit
, verifique que un sistema cliente cuyo krb5.conf
liste sólo el KDC esclavo en su lista de KDCs para su reinado, pueda ahora obtener correctamente las credenciales iniciales del KDC esclavo.
Hecho esto, simplemente cree un script que vuelque la base de datos del reinado y ejecute el comando kprop
para transmitir la base de datos a cada KDC esclavo por vez, y configure el servicio cron
para correr el script periódicamente.
2.6.9. Configurando la autenticación cruzada de reinados
La autenticación cruzada de reinado es el término usado para describir situaciones en que los clientes (normalmente usuarios) de un reinado utilizan Kerberos para autenticarse con servicios (típicamente procesos servidor corriendo en un sistema servidor particular) que pertenecen a otro reinado distinto al propio.
Para el caso más simple, para que un cliente de un reinado con nombre A.EJEMPLO.COM
acceda a un servicio en el reinado B.EJEMPLO.COM
, ambos reinados deben compartir una clave para el principal con nombre krbtgt/B.EJEMPLO.COM@A.EJEMPLO.COM
, y ambas claves deben tener el mismo número de versión de clave asociadas a ellas.
Para hacer esto, debe seleccionar una contraseña o frase de acceso muy fuerte y crear una entrada para el principal de ambos reinados usando kadmin.
#
kadmin -r A.EXAMPLE.COM
kadmin:
add_principal krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM
Enter password for principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM":
Re-enter password for principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM":
Principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM" created.
quit
#
kadmin -r B.EXAMPLE.COM
kadmin:
add_principal krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM
Enter password for principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM":
Re-enter password for principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM":
Principal "krbtgt/B.EXAMPLE.COM@A.EXAMPLE.COM" created.
quit
Use el comando get_principal
para verificar que ambas entradas tienen un número de versión de claves (valores kvno
) y tipos de encriptados coincidentes.
El volcado de la base de datos no lo hace
Los administradores conscientes de los procesos de seguridad, podrían intentar utilizar la opción -randkey
del comando add_principal
, para asignar una clave aleatoria en lugar de una contraseña, descargar la nueva entrada desde una base de datos del primer reinado, e importarla al segundo. Esto no va a funcionar a menos que las claves maestras de la base de datos del reinado sean idénticas, ya que las claves contenidas en una base de datos descargada, son encriptadas utilizando la clave maestra.
Los clientes en el reinado A.EJEMPLO.COM
son capaces ahora de autenticarse en los servicios del reinado B.EJEMPLO.COM
. Dicho de otra manera, el reinado B.EJEMPLO.COM
ahora confía en el reinado A.EJEMPLO.COM
, o, más sencillo aún, ahora B.EJEMPLO.COM
confía en A.EJEMPLO.COM
.
Esto nos lleva a un punto importante: la confianza generada entre los reinados es, por defecto, unidireccional. El KDC para el reinado B.EJEMPLO.COM
podría confiar en clientes del reinado A.EJEMPLO.COM
para autenticarse en sus servicios, pero este hecho no significa que el reinado A.EJEMPLO.COM
confíe en los clientes del reinado B.EJEMPLO.COM
cuando estos intenten autenticarse en sus servicios. Para establecer una confianza bidireccional entre dos reinados, ambos van a necesitar compartir claves para el servicio krbtgt/A.EJEMPLO.COM@B.EJEMPLO.COM
(tome nota de la forma invertida de acuerdo a los dos reinados comparados en el ejemplo anterior).
Si las relaciones de confianza directa fueran la única manera de hacer que dos reinados confíen entre sí, sería bastante complicado configurar redes con gran cantidad de ellos. Afortunadamente, la confianza generada entre reinados es transitiva. Si los clientes del reinado A.EJEMPLO.COM
pueden autenticarse en servicios del reinado B.EJEMPLO.COM
, y los clientes del reinado B.EJEMPLO.COM
pueden autenticarse en servicios del reinado C.EJEMPLO.COM
, entonces los clientes de A.EJEMPLO.COM
pueden también autenticarse en los servicios del reinado C.EJEMPLO.COM
, aún cuando C.EJEMPLO.COM
no confíe directamente en los clientes del reinado A.EJEMPLO.COM
. Esto significa que lo ideal para poder reducir la cantidad de esfuerzo al configurar una red con múltiples reinados, que necesiten confiar unos en otros, será realizar las elecciones correctas a la hora de definir las relaciones de confianza entre ellos.
Ahora se enfrenta a problemas más convencionales: el sistema cliente debe ser configurado para que pueda deducir apropiadamente el reinado al que un servicio particular pertenece, y debe poder determinar cómo obtener las credenciales en ese reinado.
Vayamos en orden: el nombre del principal para un servicio provisto desde un sistema servidor específico en un reinado dado normalmente es parecido a:
service/server.ejemplo.com@EJEMPLO.COM
En el ejemplo siguiente, el servicio es generalmente, o bien el nombre del protocolo en uso (otros valores comunes pueden ser ldap, imap, cvs, y HTTP), o bien equipo. server.ejemplo.com es el nombre del dominio del sistema completamente calificado que ejecuta el servicio, y EJEMPLO.COM
es el nombre del reinado.
Para deducir el dominio al que el servicio pertenece, los clientes por lo general consultan el DNS o la sección domain_realm
del archivo /etc/krb5.conf
para mapear ya sea el nombre del equipo (server.ejemplo.com) o el nombre del dominio DNS (.ejemplo.com) hacia el nombre del reinado (EJEMPLO.COM).
Habiendo determinado a qué reinado pertenece el servicio, un cliente tiene que determinar luego el conjunto de reinados que debe contactar y en qué orden debe hacerlo, para obtener las credenciales a usar en la autenticación con el servicio.
Esto se puede hacer de una o dos formas.
El método establecido por defecto, que no requiere una configuración explícita, es dar a los reinados nombres dentro de una jerarquía compartida. Como ejemplo, suponer los reinados llamados A.EJEMPLO.COM
, B.EJEMPLO.COM
, and EJEMPLO.COM
. Cuando un cliente del reinado A.EJEMPLO.COM
intente autenticarse en un servicio del reinado B.EJEMPLO.COM
, por defecto, lo primero que hará será intentar obtener credenciales para el reinado EJEMPLO.COM
, y luego utilizar esas credenciales para obtener unas nuevas para poder utilizarlas en el reinado B.EJEMPLO.COM
.
En este escenario el cliente trata el nombre del dominio como uno podría tratar un nombre DNS. Reiteradamente va quitando los componentes de su propio nombre de reinado para generar los nombres del reinado que se encuentre jerárquicamente "por encima del suyo", hasta que llegue a un punto que incluso sea jerárquicamente superior al reinado del servicio. En ese punto empieza a analizar los componentes del nombre del servicio del reinado, hasta que obtiene el servicio del reinado. Cada reinado que se encuentre involucrado en el proceso, es considerado otro "salto".
Por ejemplo, el uso de credenciales en
A.EJEMPLO.COM
, autenticando a un servicio en
B.EJEMPLO.COM
A.EJEMPLO.COM → EJEMPLO.COM → B.EJEMPLO.COM
Otro ejemplo, usando credenciales en
SITIO1.VENTAS.EJEMPLO.COM
, para autenticar a un servicio en
CUALQUIERLUGAR.EJEMPLO.COM
SITIO1.VENTAS.EJEMPLO.COM → VENTAS.EJEMPLO.COM → EJEMPLO.COM → CUALQUIERLUGAR.EJEMPLO.COM
SITIO1.VENTAS.EJEMPLO.COM
y VENTAS.EJEMPLO.COM
comparten una clave para krbtgt/VENTAS.EJEMPLO.COM@SITIO1.VENTAS.EJEMPLO.COM
VENTAS.EJEMPLO.COM
y EJEMPLO.COM
comparten una clave para krbtgt/EJEMPLO.COM@VENTAS.EJEMPLO.COM
EJEMPLO.COM
y CUALQUIERLUGAR.EJEMPO.COM
comparten una clave para krbtgt/CUALQUIERLUGAR.EJEMPLO.COM@EJEMPLO.COM
Otro ejemplo, esta vez utilizando nombres de reinados que no compartan sufijos comunes (
DEVEL.EJEMPLO.COM
y
PROD.EJEMPLO.ORG
DEVEL.EJEMPLO.COM → EJEMPLO.COM → COM → ORG → EJEMPLO.ORG → PROD.EJEMPLO.ORG
DEVEL.EJEMPLO.COM
y EJEMPLO.COM
comparten una clave para krbtgt/EJEMPLO.COM@DEVEL.EJEMPLO.COM
EJEMPLO.COM
y COM
comparten una clave para krbtgt/COM@EJEMPLO.COM
COM
y ORG
comparten una clave para krbtgt/ORG@COM
ORG
y EJEMPLO.ORG
comparten una clave para krbtgt/EJEMPLO.ORG@ORG
EJEMPLO.ORG
y PROD.EJEMPLO.ORG
comparten una clave para krbtgt/PROD.EJEMPLO.ORG@EJEMPLO.ORG
El método más complicado, pero que al mismo tiempo es el más flexible, reside en configurar la sección capaths
del archivo /etc/krb5.conf
, de modo que los clientes que tengan credenciales para un reinado específico, deberán buscar qué reinado es el que le sigue en la cadena y que, eventualmente, será quien permita su autenticación con los servidores.
El formato de la sección capaths
es relativamente sencillo: cada entrada en la sección tiene el mismo nombre que el reinado en el que pudiera existir el cliente. Dentro de cada subsección, el conjunto de los reinados intermedios desde donde el cliente tiene que obtener las credenciales, se muestran como los valores de la llave que se corresponde con el reinado en el que puede residir el servicio. Si no existen reinados intermedios, será utilizado el valor ".".
Aquí hay un ejemplo:
[capaths]
A.EJEMPLO.COM = {
B.EJEMPLO.COM = .
C.EJEMPLO.COM = B.EJEMPLO.COM
D.EJEMPLO.COM = B.EJEMPLO.COM
D.EJEMPLO.COM = C.EJEMPLO.COM
}
En este ejemplo, los clientes en el reinado A.EJEMPLO.COM
pueden obtener credenciales de reinados cruzados para B.EJEMPLO.COM
directamente del KDC de A.EJEMPLO.COM
.
Si esos clientes desean contactar un servicio en el reinado C.EJEMPLO.COM
, necesitarán obtener primero credenciales necesarias del reinado B.EJEMPLO.COM
(esto requiere que krbtgt/B.EJEMPLO.COM@A.EJEMPLO.COM
exista), y entonces utilizar esas
credenciales para obtener otras para ser utilizadas en el reinado C.EJEMPLO.COM
(utilizando krbtgt/C.EJEMPLO.COM@B.EJEMPLO.COM
).
Si esos clientes desean contactar un servicio en el reinado D.EJEMPLO.COM
, necesitarán obtener primero las credenciales necesarias del reinado B.EJEMPLO.COM
, y luego las credenciales del reinado C.EJEMPLO.COM
, antes de obtener, finalmente, las credenciales necesarias para utilizar con el reinado D.EJEMPLO.COM
.
Nota
Sin una entrada que indique lo contrario, Kerberos asume que las relaciones de confianza de reinados cruzados forman una jerarquía.
Los clientes en el reinado A.EJEMPLO.COM
pueden obtener credenciales cruzadas del reinado B.EJEMPLO.COM
directamente. Sin el "." indicando esto, el cliente intentaría sino usar un camino jerárquico, en este caso:
A.EXAMPLE.COM → EXAMPLE.COM → B.EXAMPLE.COM
2.6.10. Recursos adicionales
Para más información sobre Kerberos, consulte las fuentes que indicamos a continuación.
2.6.10.1. Documentación Instalada de Kerberos
La Guía de Instalación de Kerberos V5 y la Guía del Administrador del Sistema Kerberos V5 en formatos PostScript y HTML. Pueden ser encontradas en el directorio /usr/share/doc/krb5-server-<version-number>
/
(donde <version-number>
es el número de versión del paquete krb5-server
instalado en su sistema).
La Guía del Usuario UNIX de Kerberos V5 en formatos PostScript y HTML. Pueden ser encontradas en el directorio /usr/share/doc/krb5-workstation-<version-number>
/
(donde <version-number>
es el número de versión del paquete krb5-workstation
instalado en su sistema).
Páginas man de Kerberos — Hay un número de páginas man para las varias aplicaciones y archivos de configuración involucrados con una implementación de Kerberos. La siguiente es una lista de algunas de las páginas man más importantes.
- Aplicaciones cliente
man kerberos
— Una introducción al sistema Kerberos que describe cómo funcionan las credenciales y provee recomendaciones para obtener y destruir tickets de Kerberos. Al final de la página man hay referencias hacia otras páginas man relacionadas con el tema.
man kinit
— Describe cómo usar este comando para obtener y hacer caché de un ticket de garantía de tickets.
man kdestroy
— Describe cómo usar este comando para destruir las credenciales de Kerberos.
man klist
— Describe cómo usar este comando para listar las credenciales cacheadas de Kerberos.
- Aplicaciones administrativas
man kadmin
— Describe cómo usar este comando para administrar con la base de datos de Kerberos V5.
man kdb5_util
— Describe cómo usar este comando para crear y realizar funciones administrativas de bajo nivel en la base de datos de Kerberos V5.
- Aplicaciones de servidor
- Archivos de configuración
man krb5.conf
— Describe el formato y las opciones disponibles dentro del archivo de configuración para la biblioteca de Kerberos V5.
man kdc.conf
— Describe el formato y las opciones disponibles dentro del archivo de configuración del AS y el KDC de Kerberos V5.
2.6.10.2. Páginas web útiles sobre Kerberos
ftp://athena-dist.mit.edu/pub/kerberos/doc/usenix.PS — La versión PostScript de
Kerberos: Un Servicio de Untenticación para Sistemas de Red Abierta por Jennifer G. Steiner, Clifford Neuman, y Jeffrey I. Schiller. Este documento es el impreso original que describe el funcionamiento de Kerberos.
http://web.mit.edu/kerberos/www/dialogue.html —
Construyendo un sistema de Autenticación: Diálogo en Cuatro Escenas originalmente realizado por Bill Bryant en 1988, modificado por Theodore Ts'o en 1997. Este documento es una conversación entre dos desarrolladores que están pensando en la creación de un sistema de autenticación, con un estilo similar al de Kerberos. El estilo de diálogo con el que se muestra la discusión lo convierte en un excelente punto de partida para aquellos que no conozcan absolutamente nada acerca de Kerberos.
2.7. Redes privadas virtuales (VPNs, por las iniciales en inglés de Virtual Private Networks)
Las organizaciones con diferentes oficinas satélites, a menudo se conectan entre ellas mediante líneas constituidas específicamente para proteger los datos vitales y asegurar la eficacia en su transferencia. Por ejemplo, muchos comercios utilizan líneas de frame relay o
Modo de Transferencia no Sincronizada (
ATM, por las iniciales en inglés de Asynchronous Transfer Mode) como una herramienta de comunicaciones de tipo punto-a-punto para enlazar una oficina con el resto. Este puede llegar a ser un recurso algo costoso, especialmente para pequeñas o medianas empresas, que quieren expandirse sin tener que pagar los altos costos que involucra la utilización de circuitos digitales a medida, generalmente utilizados por empresas de mayor poder adquisitivo.
Para poder cubrir estas necesidades, se han desarrollado las
Redes Privadas Virtuales (
VPNs). Utilizando los mismos principios de funcionamiento que los circuitos a medida, las
VPNs permiten comunicaciones digitales seguras entre dos elementos (o redes), creando una
Red de Area Global (
WAN, por las iniciales en inglés de Wide Area Network) a partir de
Redes de Area Local (
LANs, Local Area Networks) existentes. La diferencia entre frame relay o ATM reside en el medio de transporte que se utiliza. Las
VPNs transmiten sobre IP mediante la utilización de datagramas como su medio de transporte, convirtiéndolas en un conducto seguro a través de Internet hacia un destino específico. La mayoría de las implementaciones
VPN de software libre incorporan estándares abiertos de métodos de encriptación para, posteriormente, enmascarar los datos en tránsito.
Algunas organizaciones utilizan herramientas
VPN de hardware para incrementar la seguridad, mientras que otras utilizan software, o implementaciones derivadas en protocolos. Muchos proveedores ofrecen herramientas
VPN de hardware, como Cisco, Nortel, IBM y Checkpoint. Existe una herramienta gratuita de software
VPN para Linux denominada FreeS/Wan que utiliza una implementación estandarizada del
Protocolo de Seguridad de Internet (
IPsec, por las iniciales en inglés de Internet Protocol Security). Estas herramientas
VPN, ya sean derivadas de hardware o de software, trabajan como enrutadores especializados que existen entre la conexión IP desde una oficina hacia otra.
2.7.1. ¿Cómo funciona una VPN?
Cuando un paquete se transmite desde un cliente, se envía a través del enrutador o puerta de enlace
VPN, que le añade un
Encabezado de autenticación (
AH, por las iniciales en inglés de Authentication Header) para su enrutamiento y autenticación. Los datos son entonces encriptados y, por último, empaquetados con una
Carga Util de Seguridad por Encapsulado (
ESP, por las inicales en inglés de Encapsulating Security Payload). Esto, más adelante, constituye las instrucciones de desencriptado y entrega.
El enrutador
VPN que recibe los paquetes, quita la información de los cabezales, decripta los datos y los envía a su destinatario (ya sea una estación de trabajo u otro nodo en la red). Utilizando una conexión de tipo red-a-red, el nodo receptor en la red local recibe los paquetes ya decriptados y listos para su procesamiento. El proceso de encriptado/decriptado en una conexión
VPN de tipo red-a-red es transparente al nodo local.
Con tal alto nivel de seguridad, un atacante no solo debe tener que poder interceptar el paquete, sino que además tiene que decriptarlo. Los intrusos que utilizan ataques de tipo intermediario entre un servidor y el cliente, deben tener también acceso a, como mínimo, una de las claves privadas para autenticar sesiones. debido a que se utilizan diferentes capas en el proceso de encriptación y decriptación, las
VPNs son medios seguros y efectivos de conectar múltiples nodos remotos y poder actuar como una intranet unificada.
Fedora ofrece varias opciones en términos de implementar herramientas de software para conectarse de manera segura en una
WAN. La utilización de
Protocolos de Seguridad de Internet (
IPsec), es la herramienta
VPN para Fedora, y cubre adecuadamente las necesidades de las organizaciones que posean oficinas sucursales, o usuarios remotos
Fedora ofrece soporte de
IPsec para conectar equipos remotos y redes entre sí, utilizando un túnel seguro en un medio de transporte de red común, como lo es Internet.
IPsec puede ser implementado utilizando una configuración de tipo equipo-a-equipo (una estación de trabajo con otra), o de tipo red-a-red (una
LAN/
WAN con otra).
La utilización de
IPsec en Fedora utiliza
Intercambio de Clave de Internet (
IKE, por las iniciales en inglés de Internet Key Exchange), un protocolo implementado por el Equipo de Tareas de Ingeniería de Internet (
IETF, por las iniciales en inglés de Internet Engineering Task Force), utilizado para autenticación mutua y asociaciones seguras entre sistemas conectados.
2.7.4. Creando una conexión IPsec
Una conexión
IPsec está separada en dos etapas lógicas. En la primera etapa, un nodo
IPsec inicia la conexión con el nodo remoto o la red. El nodo remoto o la red verifica las credenciales del nodo que hace la petición y ambas partes establecen un método de autenticación para la conexión.
En sistemas Fedora, una conexión
IPsec utiliza un método de
clave pre-compartida para la autenticación del nodo
IPsec. En una conexión
IPsec de este tipo, ambos equipos deben utilizar la misma clave para poder avanzar hacia la segunda etapa de la conexión
IPsec.
La segunda etapa de la conexión
IPsec consiste en la creación de una
Asociación de seguridad (
SA, por las iniciales en inglés de Security Association) entre los nodos
IPsec. Esta etapa genera una base de datos
SA con información de configuración, como el método de encriptado, los parámetros de intercambio de clave para la sesión secreta, y demás informaciones necesarias. Esta etapa administra la conexión
IPsec actual entre los nodos remotos y las redes.
La implementación de
IPsec en Fedora utiliza IKE para compartir claves entre equipos a través de Internet. El demonio para claves
racoon
administra la distribución y el intercambio de clave IKE. Para obtener mayor información acerca de este demonio, vea la página man de
racoon
.
2.7.5. Instalación de IPsec
La implementación de
IPsec necesita tener instalado el paquete RPM
ipsec-tools
en todos los equipos
IPsec (si es que se está utilizando una configuración de tipo equipo-a-equipo), o enrutadores (si es es que se está utilizando una configuración de tipo red-a-red). El paquete RPM contiene bibliotecas esenciales, demonios, y archivos de configuración para establecer la conexión
IPsec, como por ejemplo:
Para configurar
IPsec en Fedora, puede utilizar la
Herramienta Administración de Red, o editar manualmente la red y los archivos de configuración de
IPsec.
2.7.6. Configuración de IPsec equipo-a-equipo
IPsec puede configurarse para conectar un equipo de escritorio o estación de trabajo con otro mediante una conexión de tipo equipo-a-equipo. Este tipo de conexión utiliza la red a la que cada uno de los equipos se conecta para crear un túnel seguro entre cada equipo. Los requerimientos de una conexión de equipo-a-equipo son mínimos, al igual que la configuración de
IPsec. El equipo necesita solo una conexión dedicada a una red que haga de medio de transporte (como lo es Internet) y Fedora para crear la conexión
IPsec.
2.7.6.1. Conexión equipo-a-equipo
Una conexión de tipo equipo-a-equipo es una conexión encriptada entre dos sistemas, ambos utilizando
IPsec con la misma clave de autenticación. Con la conexión
IPsec activa, cualquier tráfico de red entre los dos equipos es encriptada.
Para configurar una conexión
IPsec de tipo equipo-a-equipo, siga los siguientes pasos para cada equipo:
Nota
Debería realizar los siguientes procedimientos en la máquina actual que está configurando. Evite intentar establecer o configurar conexiones
IPsec remotamente.
En una terminal, ingrese system-config-network
para iniciar la Herramienta de administración de red.
En la pestaña de
IPsec, haga clic en
Nuevo para iniciar el asistente de configuración de
IPsec.
haga clic en
Siguiente para iniciar la configuración de una conexión
IPsec de equipo-a-equipo.
Ingrese un nombre único para la conexión, por ejemplo, ipsec0
. Si lo necesita, tilde la casilla para activar automáticamente la conexión cada vez que encienda el equipo. Haga clic en Siguiente para continuar.
Seleccione Encriptado de equipo a equipo como el tipo de conexión, y luego haga clic en Siguiente.
Seleccione el tipo de método de encriptado a utilizarse: manual o automático.
Si selecciona encriptado manual, deberá indicar más adelante una clave de encriptado. Si selecciona encriptado automático, el demonio racoon
se encarga de administrar la clave del encriptado. El paquete ipsec-tools
debe estar instalado si quiere utilizar la encriptación automática.
Haga clic en Siguiente para continuar.
Ingrese la dirección IP de equipo remoto.
Para determinar la dirección IP del equipo remoto, utilice el siguiente comando en el equipo remoto:
[root@myServer ~] # /sbin/ifconfig <device>
donde
<device>
es el dispositivo Ethernet que quiere utilizar para la conexión
VPN.
Si solo existe una tarjeta Ethernet en el sistema, el nombre del dispositivo seguramente será eth0. El siguiente ejemplo muestra la información pertinente de este comando (recuerde que ese es sólo un ejemplo):
eth0 Link encap:Ethernet HWaddr 00:0C:6E:E8:98:1D
inet addr:172.16.44.192 Bcast:172.16.45.255 Mask:255.255.254.0
La dirección IP es el número siguiente a la etiqueta inet addr:
.
Nota
For host-to-host connections, both hosts should have a public, routable address. Alternatively, both hosts can have a private, non-routable address (for example, from the 10.x.x.x or 192.168.x.x ranges) as long as they are on the same LAN.
Haga clic en Siguiente para continuar.
Si en el paso
6 se ha seleccionado una encriptación manual, especifique la clave de encriptado a ser utilizada, o haga clic en
Generar para generar una.
Indique una clave de autenticación o haga clic en Generar para generar una. Puede ser una combinación de números y letras.
Haga clic en Siguiente para continuar.
Verifique la información en la página IPsec — Resumen, y luego haga clic en el botón Aplicar.
Haga clic en => para guardar la configuración.
Tal vez necesite reiniciar la red para que los cambios tengan efecto. Para reiniciar la red, utilice el siguiente comando:
[root@myServer ~]# service network restart
Seleccione la conexión
IPsec de la lista y haga clic en el botón de
Activar.
Repita el procedimiento entero para el otro equipo. Es fundamental que se utilice la misma clave del paso
8 en los demás equipos. De lo contrario,
IPsec no funcionará.
Los siguientes archivos son creados cuando la conexión
IPsec es configurada:
/etc/sysconfig/network-scripts/ifcfg-<nickname>
/etc/sysconfig/network-scripts/keys-<nickname>
/etc/racoon/<ip-remota>
.conf
/etc/racoon/psk.txt
Si se elige encriptación automática, entonces también se crea el archivo /etc/racoon/racoon.conf
.
Cuando la interfaz esté funcionando, el archivo /etc/racoon/racoon.conf
se modifica para que pueda inlcuir a <remote-ip>
.conf
.
2.7.6.2. Configuración manual de una conexión IPsec de tipo equipo-a-equipo
El primer paso para crear una conexión es obtener información tanto del sistema como de la red para cada estación de trabajo. Para una conexión de tipo equipo-a-equipo, se necesita lo siguiente:
La dirección IP de cada equipo
Un nombre único, por ejemplo,
ipsec1
. Esto es utilizado para identificar la conexión
IPsec y poder identificarla de otros dispositivos o conexiones.
Una clave de encriptado manual, o automáticamente generada por racoon
.
Una clave de autenticación pre-compartida que es utilizada a lo largo de la etapa inicial de la conexión, y que también será utilizada luego para intercambiar claves de encriptado durante de la sesión.
Por ejemplo, suponga que la estación de trabajo A y la estación de trabajo B quieren conectarse entre ellas mediante de un túnel
IPsec. Quieren conectarse utilizando una clave pre-compartida con el valor de
Key_Value01
, y los usuarios acuerdan la utilización de
racoon
para generar y compartir una clave de autenticación entre cada equipo. Los usuarios de ambos equipos deciden referirse a su conexión como
ipsec1
..
Nota
Debería elegir una PSK (clave pre-compartida) que utilice una mezcla de caracteres en mayúscula y en minúscula, números y signos de puntuación. Una PSK fácil de adivinar constituye un riesgo de seguridad.
No es necesario utilizar el mismo nombre de conexión para cada equipo. Debería elegir un nombre que sea conveniente y que tenga sentido para su instalación.
A continuación mostramos un archivo de configuración
IPsec en la estación de trabajo A para una conexión
IPsec de tipo equipo-a-equipo con la estación de trabajo B. El nombre único para identificar la conexión en este ejemplo es
ipsec1
, de modo que el archivo resultante es denominado
/etc/sysconfig/network-scripts/ifcfg-ipsec1
.
DST=X.X.X.X
TYPE=IPSEC
ONBOOT=no
IKE_METHOD=PSK
Para la estación de trabajo A, X.X.X.X
es la dirección IP de la estación de trabajo B. Para la estación de trabajo B, X.X.X.X
es la dirección IP de la estación de trabajo A. Esta conexión no está configurada para iniciarse con el arranque del equipo (ONBOOT=no
) y utiliza el método de autenticación de clave pre-compartida (IKE_METHOD=PSK
).
El siguiente es el contenido del archivo de clave pre-compartida (denominado /etc/sysconfig/network-scripts/keys-ipsec1
) que las dos estaciones de trabajo necesitan para poder autenticarse entre ellas. El contenido de este archivo debe ser idéntico en ambas estaciones de trabajo, y solo el usuario root debería ser capaz de leer o escribir en este archivo.
IKE_PSK=Key_Value01
Importante
Para modificar el archivo keys-ipsec1
de modo que solo el usuario root pueda leerlo o editarlo, utilice el siguiente comando luego de haberlo creado:
[root@myServer ~] # chmod 600 /etc/sysconfig/network-scripts/keys-ipsec1
Para modificar la clave de autenticación en cualquier momento, edite el archivo keys-ipsec1
en ambas estaciones de trabajo. Las dos claves de autenticación deben ser idénticas para una conexión correcta.
El siguiente ejemplo muestra la configuración específica de la primera fase de la conexión con el equipo remoto. El archivo es denominado
X.X.X.X
.conf
, donde
X.X.X.X
es la dirección IP del equipo
IPsec remoto. Fijese que este archivo es generado automáticamente cuando el túnel
IPsec es activado y no debería ser editado directamente.
remote X.X.X.X
{
exchange_mode aggressive, main;
my_identifier address;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2 ;
}
}
El archivo de configuración de la etapa 1 que se ha creado por defecto cuando se inicia una conexión
IPsec, contiene las siguientes directivas utilizadas por la implementación de IPsec de Fedora:
- remote
X.X.X.X
Indica que las siguientes líneas en este archivo de configuración se aplican solo al nodo remoto identificado por la dirección IP X.X.X.X
.
- exchange_mode aggressive
La configuración establecida por defecto en Fedora para
IPsec utiliza un método de autenticación agresivo, que disminuye los excedentes de la conexión, permitiendo la configuración de varias conexiones
IPsec con múltiples equipos.
- my_identifier address
Indica el método de identificación a ser utilizado cuando se autentican nodos. Fedora utiliza direcciones IP para identificar nodos.
- encryption_algorithm 3des
Especifica el cifrador de encriptación utilizado durante la autenticación. Por defecto, se usa el
Estándar de Encriptación de Datos Triple (
3DES, por las iniciales en inglés de Triple Data Encryption Standard).
- hash_algorithm sha1;
Indica el algoritmo hash utilizado durante la negociación entre los nodos de la etapa 1. Por defecto, se utiliza un algoritmo de hash seguro (SHA, por las iniciales en inglés de Secure Hash Algorithm).
- authentication_method pre_shared_key
Indica el método de autenticación utilizado durante la negociación del nodo. Por defecto, Fedora utiliza una clave pre-compartida para la autenticación.
- dh_group 2
Indica el número de grupo Diffie-Hellman para establecer claves de sesiones generadas dinámicamente. Por defecto, se utiliza modp1024 (segundo grupo).
2.7.6.2.1. El Archivo de configuración Racoon
Los archivos
/etc/racoon/racoon.conf
deben ser idénticos en todos los nodos
IPsec,
excepto para la directiva
include "/etc/racoon/X.X.X.X
.conf"
. Esta directiva (y el archivo al que se refiere) es generada cuando el túnel
IPsec es activado. Para la estación de trabajo A, el valor
X.X.X.X
en la directiva
include
es la dirección IP de la estación de trabajo B. Y para la estación de trabajo B, lo contrario. A continuación mostramos un archivo
racoon.conf
típico cuando se activa una conexión
IPsec.
# Racoon IKE daemon configuration file.
# See 'man racoon.conf' for a description of the format and entries.
path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";
sainfo anonymous
{
pfs_group 2;
lifetime time 1 hour ;
encryption_algorithm 3des, blowfish 448, rijndael ;
authentication_algorithm hmac_sha1, hmac_md5 ;
compression_algorithm deflate ;
}
include "/etc/racoon/X.X.X.X.conf";
Este archivo
racoon.conf
establecido por defecto incluye caminos definidos para la configuración de
IPsec, claves pre-compartidas y certificados. Los campos de
sainfo anonymous
describen la etapa SA 2 entre los nodos
IPsec — el tipo de conexión
IPsec (incluyendo los algoritmos de encriptación utilizados soportados), y el método de intercambio de claves. La siguiente lista define los campos de la estapa 2:
- sainfo anonymous
Indica que SA puede iniciarse anónimamente con cualquier par ofrecido que se corresponda con las credenciales de
IPsec.
- pfs_group 2
Define el protocolo de intercambio de claves Diffie-Hellman, que determina el método por el cual los nodos
IPsec establecen una clave de sesión mutua y temporal para la segunda etapa de la conectividad
IPsec. Por defecto, la implementación en Fedora de
IPsec utiliza el segundo (o
modp1024
) de los grupos Diffie-Hellman de intercambio de claves criptográficas. EL segundo grupo utiliza una exponenciación modular de 1024 bits que evita que los atacantes puedan decriptar transmisiones
IPsec, aún si una de las claves privadas ha sido vulnerada.
- lifetime time 1 hour
Este parámetro indica el período de vida de una SA y puede ser medido o bien en unidades de tiempo, o bien con datos. La implementación en Fedora establecida por defecto de
IPsec especifica un tiempo de vida de una hora.
- encryption_algorithm 3des, blowfish 448, rijndael
Indica la cifra de encriptación soportada para la etapa 2. Fedora soporta 3DES, Blowfish de 448 bits, y Rijndael (la cifra utilizada en el
Estándard avanzado de encriptación, or
AES, por las iniciales en inglés de Advanced Encryption Standard).
- authentication_algorithm hmac_sha1, hmac_md5
Muestra los algoritmos hash soportados para la autenticación. Los módulos soportados son los códigos de autenticación de mensajes de hash sha1 y md5 (HMAC).
- compression_algorithm deflate
Indica el algoritmo de compresión Deflate para el soporte de IP Payload Compression (IPCOMP), que potencialmente permite transmisiones más rápidas de datagramas IP sobre conexiones más lentas.
Para iniciar una conexión, utilice el siguiente comando en cada uno de los equipos:
[root@myServer ~]# /sbin/ifup <nickname>
donde <nickname> es el nombre que ha indicado para la conexión
IPsec.
Para verificar la conexión
IPsec, ejecute la herramienta
tcpdump
para conocer los paquetes de red que están siendo transferidos entre los equipos, y verifique que están encriptados mediante IPsec. El paquete debería incluir un encabezado AH y debería mostrarse como un paquete ESP. ESP significa que está encriptado. Por ejemplo:
[root@myServer ~]# tcpdump -n -i eth0 host <targetSystem>
IP 172.16.45.107 > 172.16.44.192: AH(spi=0x0954ccb6,seq=0xbb): ESP(spi=0x0c9f2164,seq=0xbb)
2.7.7. Configuración IPsec red-a-red
IPsec también puede ser configurado para conectar totalmente a una red (como por ejemplo una
LAN o
WAN) con otra red remota utilizando una conexión de tipo red-a-red. Este tipo de conexión requiere la configuración de enrutadores
IPsec en cada lado de las redes que se quieren conectar para hacer el proceso transparente y enrutar información de un nodo en una
LAN, hacia un nodo en una
LAN remota.
Figura 2.11, “Una conexión pot túnel IPsec de tipo red-a-red” muestra un túnel de conexión
IPsec de tipo red-a-red.
El siguiente diagrama muestra dos
LANs diferentes separadas por Internet. Estas
LANs utilizan enrutadores
IPsec para autenticar e iniciar una conexión utilizando un túnel seguro a través de Internet. Los paquetes en tránsito entre estas dos
LANs que sean interceptados, necesitarían un método de decriptado de tipo fuerza bruta para poder atravesar la protección que poseen. El proceso de comunicación de un nodo en el rango IP 192.168.1.0/24, con otro del rango IP 192.168.1.0/24 es completamente transparente a los nodos, al igual que el proceso, encriptado, decriptado, y enrutado de los paquetes
IPsec, es completamente manipulado por el enrutador
IPsec.
La información necesaria para una conexión de tipo red-a-red incluye:
La dirección IP externamente accesible del enrutador dedicado
IPsec
Los rangos de dirección de red de
LAN/
WAN ofrecidos por los enrutadores
IPsec (como por ejemplo, 192.168.1.0/24 or 10.0.1.0/24)
Las direcciones IP de los dispositivos de las puertas de enlace que enrutan los datos desde los nodos de red hacia Interne
Un nombre único, por ejemplo,
ipsec1
. Esto es utilizado para identificar la conexión
IPsec y poder identificarla de otros dispositivos o conexiones.
Una clave de encriptado generada manualmente, o automáticamente mediante la utilización de racoon
Una clave de autenticación pre-compartida que es utilizada a lo largo de la etapa inicial de la conexión, y que también será utilizada luego para intercambiar claves de encriptado durante de la sesión.
2.7.7.1. Conexión red-a-red (VPN)
Una conexión
IPsec de tipo red-a-red utiliza dos enrutadores
IPsec, uno para cada red, a través de los cuales es enrutado el tráfico de red para las subredes privadas.
Por ejemplo, como se muestra en la
Figura 2.12, “IPsec red-a-red”, si la red privada 192.168.1.0/24 envía tráfico hacia la red privada 192.168.2.0/24, los paquetes van a través de la puerta-de-enlace-0, al ipsec0, a través de internet, hacia ipsec1,a la puerta-de-enlace-1, y hacia la subred 192.168.2.0/24
Los enrutadores
IPsec necesitan direcciones IP públicas capaces de recibir paquetes, y un segundo dispositivo Ethernet conectado a sus respectivas redes privadas. El tráfico sólo viaja a través de un enrutador
IPsec si su destinatario es otro enrutador
IPsec con el cual ha establecido una conexión encriptada.
Opciones alternativas para la configuración de red pueden establecer un cortafuegos entre Internet y cada enrutador IP, y un cortafuegos de intranet entre el enrutador
IPsec y la puerta de enlace de la subred. En enrutador
IPsec y la puerta de enlace para la subred puede ser un sistema con dos dispositivos Ethernet: uno con una dirección IP pública que actúa como un enrutador
IPsec; y otro con una dirección Ip privada que actúa como la puerta de enlace para la subred privada. Cada enrutador
IPsec puede utilizar la puerta de enlace para sus redes privadas, o una puerta de enlace pública para enviar los paquetes al otro enrutador
IPsec.
Utilice el siguiente procedimiento para configurar una conexión
IPsec de tipo red-a-red:
En una terminal, ingrese system-config-network
para iniciar la Herramienta de administración de red.
En la pestaña de
IPsec, haga clic en
Nuevo para iniciar el asistente de configuración de
IPsec.
Haga clic en
Siguiente para empezar a configurar una conexión
IPsec de tipp red-a-red.
Ingrese un nombre de usuario único para la conexión, por ejemplo, ipsec0
. Si lo necesita, tilde la casilla para que automáticamente se active la conexión cuando se inicie el equipo. Haga clic en Siguiente para continuar.
Seleccione Encriptado de red a red (VPN) como el tipo de conexión, y luego haga clic en Siguiente.
Seleccione el tipo de método de encriptado a utilizarse: manual o automático.
Si selecciona encriptado manual, deberá indicar más adelante una clave de encriptado. Si selecciona encriptado automático, el demonio racoon
se encarga de administrar la clave del encriptado. El paquete ipsec-tools
debe estar instalado si quiere utilizar la encriptación automática.
Haga clic en Siguiente para continuar.
En la página Red local, ingrese la siguiente información:
Haga clic en Siguiente para continuar.
En la página de Red remota, ingrese la siguiente información:
Remote IP Address — La dirección IP pública capaz de recibir tráfico del enrutador
IPsec para la
otra red privada. En nuestro ejemplo, para ipsec0, ingrese la dirección IP pública capaz de recibir tráfico de upsec1, y viceversa.
Remote Network Address — La dirección de red de la subred privada detrás del
otro enrutador
IPsec. En nuestro ejemplo, ingrese
192.168.1.0
si está configurando ipsec1, e ingrese
192.168.2.0
si está configurando ipsec0.
Remote Subnet Mask — La máscara de subred de la dirección IP remota.
Remote Network Gateway — La dirección Ip de la puerta de enlace para la dirección de red remota.
Si en la etapa
6 se ha seleccionado encriptado manual, especifique la clave de encriptado a usarse o haga clic en
Generar para crear una.
Especifique una clave de autenticación o haga clic en Generar para crear una. Esta clave puede ser cualquier combinación de números y letras.
Haga clic en Siguiente para continuar.
Verifique la información en la página IPsec — Resumen, y luego haga clic en el botón Aplicar.
Seleccione => para guardar la configuración.
Seleccione la conexión
IPsec de la lista, y luego haga clic en
Activar para activar la conexión.
Habilitando reenvío IP:
Edite el archivo /etc/sysctl.conf
y establezca net.ipv4.ip_forward
a 1
.
Use el siguiente comando para habilitar los cambios:
[root@myServer ~]# /sbin/sysctl -p /etc/sysctl.conf
El programa de red para activar la conexión
IPsec automáticamente crea rutas de red para enviar paquetes a través del enrutador
IPsec, si es necesario.
2.7.7.2. Configuración manual de una conexión IPsec de tipo red-a-red.
Suponga que
LAN A (lana.ejemplo.com) y
LAN B (lanb.ejemplo.com) quieren conectarse entre ellas mediante un túnel
IPsec. La dirección de red para
LAN A está en el rango 192.168.1.0/24. mientras qye
LAN B utiliza el rango 192.168.2.0/24. La dirección IP de la puerta de enlace es 192.1686.1.254 para
LAN A y 192.168.2.254 para
LAN B. Los enrutadores
IPsec están separados de cada puerta de enlace
LAN y utilizan dos dispositivos de red: eth0 está asignado a una dirección IP estática accesible desde el exterior que tiene acceso a Internet, mientras eth1 actúa como un punto de enrutamiento para procesar y transmitir los paquetes
LAN de un nodo de red a otro.
La conexión
IPsec entre cada red utiliza una clave pre-compartida con el valor de
r3dh4tl1nux
, y los administradores de A y B están de acuerdo en permitir que
racoon
genere automáticamente y comparta una clave de autenticación entre cada enrutador
IPsec. El administrador de
LAN A decide identificar a la conexión
IPsec como
ipsec0
, mientras que el administrador de
LAN B decide identificarla como
ipsec1
.
El siguiente ejemplo muestra los contenidos del archivo
ifcfg
para una conexión
IPsec de tipo red-a-red para
LAN A. El único nombre para identificar la conexión en este ejemplo es
ipsec0
, de modo que el archivo resultante es
/etc/sysconfig/network-scripts/ifcfg-ipsec0
.
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
SRCGW=192.168.1.254
DSTGW=192.168.2.254
SRCNET=192.168.1.0/24
DSTNET=192.168.2.0/24
DST=X.X.X.X
La siguiente lista describe los contenidos de este archivo:
- TYPE=IPSEC
Especifica el tipo de conexión.
- ONBOOT=yes
Indica que la conexión debería iniciarse en el arranque.
- IKE_METHOD=PSK
Indica que la conexión utiliza el método de clave pre-compartida para su autenticación.
- SRCGW=192.168.1.254
La dirección IP de la puerta de enlace origen. Para LAN A, es la puerta de enlace de LAN A, y para LAN B, la puerta de enlace LAN B.
- DSTGW=192.168.2.254
La dirección IP de la puerta de enlace destino. Para LAN A, es la puerta de enlace de LAN B, y para LAN B, la puerta de enlace de LAN A.
- SRCNET=192.168.1.0/24
Indica la red de origen para la conexión
IPsec, que en nuestro ejemplo es el rango de red para LAN A.
- DSTNET=192.168.2.0/24
Indica la red destino para la conexión
IPsec, que en nuestro ejemplo, es el rango de red para
LAN B.
- DST=X.X.X.X
La dirección IP accesible desde el exterior de
LAN B.
El siguiente ejemplo es el contenido del archivo de clave pre-compartida denominado
/etc/sysconfig/network-scripts/keys-ipsecX
(donde
X
es 0 para
LAN A, y 1 para
LAN B), que utilizan ambas redes para autenticarse entre ellas. Los contenidos de este archivo deberían ser idénticos y solo el usuario root debería ser capaz de leer o escribir sobre este archivo.
IKE_PSK=r3dh4tl1nux
Importante
Para modificar el arhivo keys-ipsecX
de modo que solo el usuario root pueda leerlo o editarlo, utilice el siguiente comando luego de haberlo creado:
chmod 600 /etc/sysconfig/network-scripts/keys-ipsec1
Para modificar la clave de autenticación en cualquier momento, edite el archivo
keys-ipsecX
en ambos enrutadores
IPsec.
Ambas claves deben ser idénticas para una conexión correcta.
En el siguiente ejemplo se muestran los contenidos del archivo de configuración
/etc/racoon/racoon.conf
para la conexión
IPsec. Fíjese que la línea
include
al final del archivo es generada automáticamente y solo aparece si el tunel
IPsec está ejecutándose.
# Racoon IKE daemon configuration file.
# See 'man racoon.conf' for a description of the format and entries.
path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";
sainfo anonymous
{
pfs_group 2;
lifetime time 1 hour ;
encryption_algorithm 3des, blowfish 448, rijndael ;
authentication_algorithm hmac_sha1, hmac_md5 ;
compression_algorithm deflate ;
}
include "/etc/racoon/X.X.X.X
.conf"
La siguiente es la configuración específica para la conexión con la red remota. El archivo es denominado
X.X.X.X
.conf
(donde
X.X.X.X
es la dirección IP del enrutador
IPsec remoto). Fíjese que este archivo es automáticamente generado cuando el túnel
IPsec es activado y no debería ser editado directamente.
remote X.X.X.X
{
exchange_mode aggressive, main;
my_identifier address;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2 ;
}
}
Antes de empezar la conexión
IPsec, debería ser habilitado el reenvío de IP en el kernel. Para hacerlo:
Edite el archivo /etc/sysctl.conf
y establezca net.ipv4.ip_forward
a 1
.
Use el siguiente comando para habilitar los cambios:
[root@myServer ~] # sysctl -p /etc/sysctl.conf
Para iniciar la conexión
IPsec, utilice el siguiente comando en cada enrutador:
[root@myServer ~] # /sbin/ifup ipsec0
Las conexiones están activas, y tanto
LAN A como
LAN B son capaces de comunicarse entre ellas. Las rutas fueron creadas automáticamente mediante la inicialización de un programa que fue activado al ejecutarse
ifup
en la conexión
IPsec. Para mostrar una lista de rutas para la red, utilice el siguiente comando:
[root@myServer ~] # /sbin/ip route list
Para verificar la conexión
IPsec, ejecute la herramienta
tcpdump
en el dispositivo enrutable externamente (en nuestro ejemplo, eth0) para ver los paquetes de red que están siendo transferidos entre los equipos (o redes) y verifique que estén encriptados mediante IPsec. Por ejemplo, para verificar la conectividad
IPsec de
LAN A, utilice el siguiente comando:
[root@myServer ~] # tcpdump -n -i eth0 host lana.ejemplo.com
El paquete debería incluir un encabezado AH y debería mostrarse como paquetes ESP. ESP significa que está encriptado. Por ejemplo (las líneas invertidas indican que la línea continúa):
12:24:26.155529 lanb.ejemplo.com > lana.ejemplo.com: AH(spi=0x021c9834,seq=0x358): \
lanb.ejemplo.com > lana.ejemplo.com: ESP(spi=0x00c887ad,seq=0x358) (DF) \
(ipip-proto-4)
2.7.8. Iniciar y detener una conexión IPsec
Si la conexión
IPsec no fue configurada para activarse durante el arranque del equipo, puede controlarla desde la línea de comandos.
Para iniciar la conexión, utilice el siguiente comando en cada uno de los equipos para una IPsec de tipo equipo-a-equipo, o en cada uno de los enrutadores
IPsec para una IPsec de tipo red-a-red:
[root@myServer ~] # /sbin/ifup <nickname>
donde <nickname>
es el apodo configurado antes, como por ejemplo, ipsec0
.
Para detener la conexión, use el siguiente comando:
[root@myServer ~] # /sbin/ifdown <nickname>
La seguridad de la información es comúnmente entendida como un proceso, y no como un producto. Sin embargo, generalmente las implementaciones estándar de seguridad utilizan alguna forma de mecanismo específico para controlar los accesos privilegiados y restringir los recursos de red a usuarios que estén debidamente autorizados para ello, y al mismo tiempo poder identificarlos y rastrearlos. Fedora incluye diferentes herramientas para ayudar a los administradores y a los ingenieros en seguridad, con los diferentes problemas que puedan surgir al controlar los accesos jerarquizados a la red.
Los cortafuegos son uno de los componentes fundamentales para la implementación de la seguridad en una red. Diversos proveedores ofrecen herramientas para cortafuegos para todos los niveles del mercado: desde usuarios hogareños protegiendo los datos de su PC, hasta herramientas para centros de datos que permitan proteger los datos vitales de una empresa. Los cortafuegos pueden ser herramientas para un sólo equipo físico, como las aplicaciones de cortafuego que ofrecen Cisco, Nokia y Sonicwall. Proveedores como Checkpoint, McAfee y Symantec también han desarrollado herramientas de cortafuegos de código propietario, tanto para el hogar como para los segmentos comerciales del mercado.
Además de las diferencias entre los cortafuegos de hardware y de software, existen también diferencias en la manera en que el cortafuego funciona, separando una herramienta de otra.
Tabla 2.2, “Tipos de cortafuegos”: detalle de tres tipos comunes de cortafuegos, y cómo funcionan cada uno de ellos:
Método
|
Descripción
|
Ventajas
|
Desventajas
|
---|
NAT
|
Network Address Translation (NAT), coloca direcciones IP de subredes privadas, detrás de un pequeño grupo de direcciones IP públicas, enmascarando todas las peticiones hacia un recurso, en lugar de varios. El kernel de Linux tiene una funcionalidad NAT predefinida, mediante el subsistema del kernel Netfilter.
|
· Se puede configurar transparentemente para máquinas en una LAN. | · La protección de muchas máquinas y servicios detrás de una o más direcciones IP externas simplifica las tareas de administración. | · La restricción del acceso a usuarios dentro y fuera de la LAN se puede configurar abriendo o cerrando puertos en el cortafuego/puerta de enlace NAT. |
|
· No se puede prevenir la actividad maliciosa una vez que los usuarios se conecten a un servicio fuera del cortafuegos. |
|
Filtros de Paquete
|
Un cortafuegos de filtro de paquete lee cada uno de los datos que viajan a través de una LAN. Puede leer y procesar paquetes según la información de sus encabezados, y filtrar el paquete basándose en un conjunto de reglas programables implementadas por el administrador del cortafuegos. El kernel de Linux tiene una funcionalidad de filtro de paquetes predefinida, mediante el subsistema del kernel Netfilter.
|
· Personalizable a través del utilitario iptables . | · No necesita cualquier personalización del lado del cliente, dado que toda la actividad de red se filtra en el nivel del ruteador en vez de a nivel de aplicación. | · Debido a que los paquetes no se transmiten a través de un proxy, el rendimiento de la red es más rápida debido a la conexión directa entre el cliente y el equipo remoto. |
|
· No se pueden filtrar paquetes para contenidos como en los cortafuegos proxy. | · Procesa los paquetes en la capa del protocolo, pero no los puede filtrar en la capa de una aplicación. | · Las arquitecturas de red complejas pueden complicar el armado de las reglas de filtrado de paquetes, especialmente si se lo hace con el enmascarado de IP o con subredes locales y redes de zonas desmilitarizadas. |
|
Proxy
|
El cortafuegos proxy filtra todas las peticiones de los clientes LAN de un determinado protocolo, o tipo, hacia una máquina proxy, la que luego realiza esas mismas peticiones a Internet, en nombre del cliente local. Una máquina proxy actúa como un búfer entre usuarios remotos maliciosos y la red interna de máquinas clientes.
|
· Le da a los administradores el control sobre qué aplicaciones y protocolos funcionan fuera de la LAN. | · Algunos servidores proxy, pueden hacer cache de datos accedidos frecuentemente en vez de tener que usar la conexión a Internet para bajarlos. Esto ayuda a reducir el consumo de ancho de banda. | · Los servicios de proxy pueden ser registrados y monitoreados más de cerca, lo que permite un control más estricto sobre el uso de los recursos de la red. |
|
· Los proxies son a menudo específicos a una aplicación (HTTP, Telnet, etc.), o restringidos a un protocolo (la mayoría de los proxies funcionan sólo con servicios que usan conexiones TCP). | · Los servicios de aplicación no se pueden ejecutar detrás de un proxy, por lo que sus servidores de aplicación deben usar una forma separada de seguridad de red. | · Los proxies se pueden volver cuellos de botellas, dado que todos los pedidos y transmisiones son pasados a través de una fuente, en vez de hacerlo directamente desde el cliente al servicio remoto. |
|
Tabla 2.2. Tipos de cortafuegos
2.8.1. Netfilter e IPTables
El kernel de Linux posee un poderoso subsistema de red denominado Netfilter. El subsistema Netfilter ofrece filtro total o parcial de paquetes, así como servicios de enmascaramiento NAT e IP. Netfilter también tiene la habilidad de transformar la información de los encabezados IP para enrutamiento avanzado y administración del estado de la conexión. Netfilter es controlado mediante la utilización de la herramienta iptables
.
2.8.1.1. Introducción a IPTables
The power and flexibility of Netfilter is implemented using the iptables
administration tool, a command line tool similar in syntax to its predecessor, ipchains
, which Netfilter/iptables replaced in the Linux kernel 2.4 and above.
iptables
uses the Netfilter subsystem to enhance network connection, inspection, and processing. iptables
features advanced logging, pre- and post-routing actions, network address translation, and port forwarding, all in one command line interface.
Esta sección ofrece una visión general acerca de
iptables
. Para obtener información más detallada, vaya a la
Sección 2.9, “IPTables”.
2.8.2. Configuración básica de un cortafuego
Del mismo modo que el extintor de incendios en un edificio intenta prevenir que se propague un incendio, en una computadora, un cortafuegos intenta prevenir que algún tipo de software malicioso se propague en su equipo. También ayuda a prevenir que usuarios no autorizados accedan a su computadora.
En una instalación por defecto de Fedora existe un cortafuegos entre su computadora o red, y cualquier otra red considerada como no segura, como por ejemplo lo es Internet. Determina qué servicios en su computadora pueden ser accedidos por usuarios remotos. Un cortafuegos correctamente configurado puede incrementar enormemente la seguridad de su sistema. Se recomienda que configure un cortafuegos para cualquier sistema Fedora que tenga una conexión a Internet.
En el proceso de instalación de Fedora, en la pantalla de Configuración del Cortafuego, se le ofreció la oportunidad de habilitar un cortafuego básico, así como la posibilidad de utilizar ciertos dispositivos, servicios entrantes y puertos.
Una vez finalizada la instalación, puede modificar las opciones elegidas mediante la utilización de la Herramienta de configuración de cortafuegos.
Para iniciar esta aplicación, use el siguiente comando:
[root@myServer ~] # system-config-firewall
Nota
La
herramienta de configuración de cortafuegos solo configura un cortafuego básico. Si el sistema necesita reglas más complejas, vaya a la
Sección 2.9, “IPTables” para conocer más detalles sobre la configuración de reglas específicas mediante la utilización de
iptables
.
2.8.2.2. Habilitando y deshabilitando el cortafuego
Seleccione una de las opciones siguientes para el cortafuego:
Deshabilitado — Deshabilitar el cortafuegos proporciona un acceso completo a su sistema y no se realiza ninguna verificación de seguridad. Esto debe ser seleccionado sólo si está ejecutando una red segura (no Internet), o necesite configurar un cortafuego personalizado utilizando la herramienta de la línea de comandos iptables.
Advertencia
Las configuraciones del cortafuego y cualquier reglas de cortafuegos personalizadas se almacenan en el archivo /etc/sysconfig/iptables
. Si elije Deshabilitado y hace clic en Aceptar, estas configuraciones y reglas del cortafuego se perderán.
Habilitado — Esta opción configura el sistema para rechazar conexiones entrantes que no una respuesta a peticiones que han sido realizadas, tales como respuestas DNS o peticiones DHCP. Si se necesita el acceso a servicios de esta máquina, puede elegir habilitar servicios específicos a través del cortafuego.
Si está conectando su sistema a Internet, pero no planea hacerlo funcionar como servidor, esta es la opción más segura.
2.8.2.3. Servicios confiables
Habilitando opciones en la lista de Servicios confiables le permite al servicio especificado pasar a través del cortafuego.
- WWW (HTTP)
El protocolo HTTP es utilizado por Apache (y por otros servidores Web) para ofrecer páginas web. Si tiene pensado hacer que su servidor web esté disponible al público en general, tilde esta casilla. Esta opción no es requerida para ver páginas en forma local, o para desarrollar páginas web. Este servicio requiere que el paquete httpd
esté disponible.
Habilitando WWW (HTTP) no abrirá el puerto de HTTPS, la versión SSL de HTTP. Si se necesita este servicio, Elija la casilla WWW Seguro (HTTPS).
- FTP
El protocolo FTP se usa para transferir archivos entre máquinas de una red. Si planea hacer su servidor FTP disponible públicamente, marque este casillero. Este servicio requiere que se instale el paquete vsftpd
.
- SSH
Secure Shell (SSH) es una suite de herramientas para registrarse en un equipo remoto y poder ejecutar comandos en él. Para permitir acceso remoto a una máquina utilizando ssh, tilde esta casilla. Este servicio requiere que el paquete openssh-server
se encuentre instalado.
- Telnet
Telnet es un protocolo que permite registrarse en equipos remotos. Las comunicaciones a través de Telnet no están encriptadas y no ofrece protección ante posibles espías que se encuentren en la red. No se recomienda permitir el acceso a través de Telnet. Para permitirlo, tilde esta casilla. Este servicio requiere que el paquete telnet-server
se encuentre instalado.
- Correo (SMTP)
SMTP es un protocolo que permite a equipos remotos conectarse directamente con su máquina para enviar correos electrónicos. No necesita activar este servicio si obtiene su correo electrónico a través de su servidor ISP, utilizando POP3 o IMAP, o si utiliza una herramienta como fetchmail
. Para permitir el envío de correos electrónico hacia su máquina, seleccione esta casilla. Fíjese que una configuración incorrecta de un servidor SMTP puede permitir que otros equipos utilicen su servidor para enviar correo basura.
- NFS4
El Sistema de Archivos de Red (NFS, por las siglas en inglés de Network File System), es un protocolo para compartir archivos comúnmente utilizado en sistemas *NIX. La versión 4 de este protocolo es más segura que sus predecesoras. Si quiere compartir archivos y directorios de su sistema con otros en red, tilde esta casilla.
- Samba
Samba es una implementación del protocolo de red SMB de Microsoft. Si necesita compartir archivos, directorios o impresoras conectadas localmente con computadoras con Microsoft Windows, marque esta casilla.
La herramienta de configuración de cortafuegos incluye una sección de Otros Puertos para especificar puertos IP personalizados de modo tal de considerarlos como seguros por iptables
. Por ejemplo, para permitir que protocolos IRC o de impresión a través de Internet (IPP, por las siglas en inglés de Internet Printing Protocol) pasen a través del cortafuegos, añada la siguiente línea a la sección de Other ports:
194:tcp,631:tcp
2.8.2.5. Guardando la configuración
Haga clic en OK para guardar los cambios y activar o desactivar el cortafuegos. Si fue seleccionado Activar cortafuegos, las opciones seleccionadas serán trasladadas a los comandos iptables
y escritos en el archivo /etc/sysconfig/iptables
. El servicio iptables
es también iniciado de modo que el cortafuegos sea activado inmediatamente luego de guardar las opciones seleccionadas. Si fue seleccionado Desactivar cortafuegos, el archivo /etc/sysconfig/iptables
es eliminado y el servicio iptables
es inmediatamente detenido.
Las opciones seleccionadas son también escritas al archivo /etc/sysconfig/system-config-securitylevel
para que la configuración pueda restaurarse la próxima vez que se inicie la aplicación. No edite este archivo a mano.
2.8.2.6. Activando el servicio IPTables
Las reglas del cortafuego están solamente activas si el servicio iptables
se está ejecutando. Para iniciar manualmente el servicio, use el siguiente comando:
[root@miServidor ~] # service iptables restart
Para asegurarse de que iptables
se inicie cuando el sistema arranque, use el siguiente comando:
[root@miServidor ~] # chkconfig --level 345 iptables on
El primer paso en el uso de iptables
es iniciar el servicio iptables
. Use el siguiente comando para iniciar el servicio iptables
:
[root@miServidor ~] # service iptables start
Nota
El servicio ip6tables
puede ser desactivado si usted intenta utilizar solamente el servicio iptables
. Si desactiva el servicio ip6tables
, recuerde también desactivar la red IPv6. Nunca deje un dispositivo de red activo sin su correspondiente cortafuegos.
Para forzar a iptables
para que se inicie por defecto cuando el sistema arranque, use el siguiente comando:
[root@miServidor ~] # chkconfig --level 345 iptables on
Esto fuerza a iptables
a que se inicie cuando el sistema arranque en los niveles de ejecución 3, 4 o 5.
2.8.3.1. Sintaxis de comando de IPTables
El siguiente comando iptables
ilustra la sintaxis básica de comandos:
[root@miServidor ~ ] # iptables -A <cadena>
-j <destino>
La opción -A
especifica que la regla se agregará a la <cadena>. Cada cadena se compone de una o más reglas, por lo que se conoce también como un conjunto de reglas.
Las tres cadenas predefinidas son INPUT, OUTPUT, y FORWARD. Estas cadenas son permanentes y no se pueden borrar. La cadena especifica el punto en el que el paquete es manipulado.
La opción -j <destino>
especifica el destino de la regla; es decir, qué hacer si un paquete coincide con la regla. Ejemplos de destinos predeterminados son ACCEPT, DROP, y REJECT.
Vaya a la página man de iptables
para más información sobre las cadenas, opciones y destinos disponibles.
2.8.3.2. Políticas básicas del cortafuego
El establecimiento de políticas básicas de cortafuego crea la base para construir reglas más detalladas definidas por el usuario.
Cada cadena de iptables
se compone de una política predeterminada, y cero o más reglas que funcionan en conjunto con la política predeterminada para definir el conjunto de reglas del cortafuego.
La política establecida por defecto para una cadena puede ser DROP o ACCEPT. Los administradores de sistemas orientados por la seguridad implementan una política por defecto de DROP, y solo permiten unos pocos paquetes específicos, luego de ser analizados uno por uno. Por ejemplo, las siguientes políticas bloquean todos los paquetes que lleguen a o que partan desde una puerta de enlace:
[root@miServidor ~ ] # iptables -P INPUT DROP
[root@miServidor ~ ] # iptables -P OUTPUT DROP
Es también algo recomendado que a cualquier paquete reenviado — tráfico de red que es enrutado desde el cortafuegos hacia su nodo de destino — también le sea negada la entrada, para poder así restringir las posibles exposiciones inadvertidas de clientes internos a Internet. Para hacerlo, utilice la siguiente regla:
[root@miServidor ~ ] # iptables -P FORWARD DROP
Cuando haya establecido las políticas por defecto para cada cadena, puede crear y guardar las reglas siguientes para su red y requerimientos de seguridad particulares.
Las siguientes secciones describen cómo guardar las reglas iptables y delinea algunas de las reglas que puede implementar cuando construya su cortafuego con iptables.
2.8.3.3. Guardando y restaurando las reglas de IPTables
Los cambios en iptables
son transitorios; si el sistema es reiniciado o si el servicio de iptables
es reiniciado, las reglas son automáticamente eliminadas y reiniciadas. Para guardar las reglas de modo que sean cargadas cuando el servicio iptables
sea iniciado, utilice el siguiente comando:
[root@miServidor ~ ] # service iptables save
Las reglas se guardan en el archivo /etc/sysconfig/iptables
y se aplican cada vez que el servicio o la computadora se reinician.
2.8.4. Filtrado común de IPTables
La prevención del acceso a la red de atacantes remotos es uno de los aspectos más importantes de la seguridad de la red. La integridad de la LAN debe protegerse de los usuarios remotos maliciosos a través del uso de las reglas estrictas de cortafuego.
Sin embargo, con una política por defecto de bloquear todos los paquetes entrantes, salientes y reenviados, es imposible que los usuarios del cortafuego/puerta de enlace y los usuarios internos de la LAN puedan comunicarse entre ellos, o con recursos externos.
Para permitir que los usuarios realicen funciones relacionadas con la red y de que puedan usar aplicaciones de red, los administradores deben abrir ciertos puertos para la comunicación.
Por ejemplo, para permitir el acceso al puerto 80 en el cortafuego, agregar la siguiente regla:
[root@miServidor ~ ] # iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Esto permite a los usuarios navegar sitios que se comunican usando el puerto estándar 80. Para permitir el acceso a sitios web seguros (por ejemplo, https://www.ejemplo.com/), también necesita proveer el acceso al puerto 443, como sigue:
[root@miServidor ~ ] # iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
Importante
Cuando se crea un conjunto de reglas de iptables
, el orden es importante.
Si una regla especifica que cualquier paquete desde la subred 192.168.100.0/24 debe ignorarse, y esto es seguido por una regla que permite los paquetes de 192.168.100.13 (que está dentro de la subred ignorada), la segunda regla se ignora.
La regla para permitir los paquetes de 192.168.100.13 debe estar antes de la que elimina los restantes de la subred.
Para insertar una regla en una ubicación específica en una cadena existente, use la opción -I
. Por ejemplo:
[root@miServidor ~ ] # iptables -I INPUT 1 -i lo -p all -j ACCEPT
Esta regla es insertada como la primera regla en la cadena INPUT para permitir el tráfico en el dispositivo loopback local.
Pueden suceder que en determinadas oportunidades se necesite un acceso remoto a la LAN. Los servicios seguros, por ejemplo SSH, se pueden utilizar para encriptar la conexión remota a los servicios de la LAN.
Administradores con recursos basados en PPP, o accesos de tipo dial-up (como bancos de módems, o cuentas masivas de ISP), pueden ser utilizados para sortear con éxito las barreras del cortafuegos. Debido a que son conexiones directas, las conexiones de módems se encuentran típicamente detrás de un cortafuegos/puerta de enlace.
Sin embargo, pueden hacerse excepciones para los usuarios remotos con conexiones de banda ancha. Usted puede configurar iptables
para aceptar conexiones de clientes remotos SSH. Por ejemplo, las siguientes reglas permiten acceso remoto SSH:
[root@miServidor ~ ] # iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@miServidor ~ ] # iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
Estas reglas permiten ingreso y egreso para un sistema individual, como una PC directamente conectada a Internet, o a un cortafuegos/puerta de enlace. Sin embrago, no permiten a los nodos detrás de un cortafuegos/puerta de enlace que tengan acceso a estos servicios. Para permitir acceso LAN a estos servicios, puede utilizar
Network Address Translation (
NAT) con reglas de filtro
iptables
.
2.8.5. Reglas FORWARD
y NAT
La mayoría de los ISPs proveen sólo un número limitado de direcciones IP disponibles públicamente para sus clientes.
Los administradores deben, por lo tanto, encontrar formas alternativas de compartir el acceso a los servicios de Internet, sin darle por ello una dirección IP pública a cada nodo de la LAN. Utilizar direcciones IP privadas es la manera más común de permitirle a todos los nodos de una LAN que tengan un acceso correcto, tanto interno como externo, a los servicios de red.
Los enrutadores de borde (como los cortafuegos) pueden recibir transmisiones entrantes desde Internet y enrutar los paquetes hacia el nodo LAN correspondiente. Al mismo tiempo, los cortafuegos/puertas de enlace pueden enrutar peticiones salientes de un nodo de la LAN hacia el servicio de Internet remoto.
Este reenvío de trafico de red puede convertirse algunas veces en algo peligroso, especialmente con la disponibilidad de herramientas de crackeo modernas que pueden espiar direcciones IP internas y hacer que el el equipo del atacante remoto actúe como un nodo de su LAN.
Para impedir esto, iptables
provee políticas de ruteado y reenvío que se pueden implementar para prevenir el uso anormal de los recursos de red.
La cadena FORWARD
permite a un administrador controlar hacia dónde se pueden rutear los paquetes dentro de la LAN. Por ejemplo, para permitir el reenvío para toda la LAN (asumiendo que el cortafuego/puerta de enlace tiene asignado una dirección IP interna en eth1), use las siguientes reglas:
[root@miServidor ~ ] # iptables -A FORWARD -i eth1 -j ACCEPT
[root@miServidor ~ ] # iptables -A FORWARD -o eth1 -j ACCEPT
Esta regla le da a los sistemas detrás del cortafuego/puerta de enlace el acceso a la red interna. La puerta de enlace rutea los paquetes desde un nodo de la LAN a su nodo destino deseado, pasando todos los paquetes a través del dispositivo eth1
.
Nota
Por defecto, la política IPv4 en kernels de Fedora deshabilita el soporte para reenvío de IP. Esto evita que máquinas que corran Fedora funcionen como un ruteador dedicado. Para habilitar el reenvío de IP, use el siguiente comando:
[root@miServidor ~ ] # sysctl -w net.ipv4.ip_forward=1
Este cambio en la configuración sólo es válido para la sesión actual; no persiste luego de un reinicio de equipo o del servicio de red. Para poner el reenvío de IP permanente, edite el archivo/etc/sysctl.conf
como sigue:
Ubique la siguiente línea:
net.ipv4.ip_forward = 0
Y edítela para que se lea:
net.ipv4.ip_forward = 1
Use el siguiente comando para habilitar el cambio en el archivo sysctl.conf
:
[root@miServidor ~ ] # sysctl -p /etc/sysctl.conf
2.8.5.1. Postruteado y enmascarado de IP
La aceptación de paquetes reenviados a través de la IP interna del cortafuego le permite a los nodos de la LAN comunicarse entre si; sin embargo, todavía no se pueden comunicar externamente con Internet.
Para permitir que los nodos de una LAN con direcciones IP privadas puedan comunicarse con redes públicas externas, configure su cortafuegos para que realice enmascaramiento de IP, que enmascara las peticiones desde los nodos LAN con la dirección IP del cortafuegos del dispositivo externo (en este caso, eth0):
[root@miServidor ~ ] # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Esta regla usa la tabla de comparación de paquetes NAT (-t nat
) y especifica la cadena predefinida POSTROUTING para hacer NAT (-A POSTROUTING
) en el dispositivo externo del cortafuego (-o eth0
).
POSTROUTING permite que los paquetes se puedan alterar mientras están abandonando el dispositivo externo del cortafuegos.
El destino -j MASQUERADE
se especifica para enmascarar la dirección IP privada de un nodo con la dirección IP externa del cortafuego/puerta de enlace.
Si usted posee un servidor en su red interna que quiere que esté disponible desde el exterior, puede utilizar -j DNAT
, objetivo de la cadena PREROUTING de NAT para especificar una IP de destino, y un puerto donde los paquetes recibidos que pidan una conexión a su servicio interno, puedan ser reenviados.
Por ejemplo, si quiere reenviar pedidos HTTP entrantes a su servidor HTTP Apache dedicado en 172.31.0.23, use el siguiente comando:
[root@miServidor ~ ] # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80
Esta regla especifica que la tabla
nat usa la cadena predefinida PREROUTING para enviar pedidos HTTP entrantes exclusivamente al la dirección IP destino listado 172.31.0.23.
Nota
Si tiene una política predeterminada de DROP en su cadena FORWARD, debe agregar una regla para reenviar todos los pedidos HTTP entrantes para que sea posible el ruteo NAT destino. Para hacerlo, use el siguiente comando:
[root@miServidor ~ ] # iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT
Esta regla reenvía todos los pedidos HTTP entrantes desde el cortafuego al destino pretendido; el Servidor HTTP APache detrás del cortafuego.
2.8.5.3. IPTables y las ZDM
Puede crear reglas de
iptables
para enrutar tráfico a ciertos equipos, como por ejemplo un servidor HTTP o FTP dedicado, en una
zona desmilitarizada (
DMZ, por las iniciales en inglés de DeMilitarized Zone). Un
DMZ es una subred local especial dedicada a proveer servicios en un transporte público, como lo es Internet.
Por ejemplo, para establecer una regla para enrutar peticiones HTTP entrantes a un servidor dedicado HTTP en 10-0-4-2 (fuera del rango 192.168.1.0/24 de la LAN), NAT utiliza la tabla PREROUTING
para reenviar los paquetes a la dirección apropiada:
[root@miServidor ~ ] # iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.4.2:80
Con este comando, todas las conexiones HTTP al puerto 80 provenientes desde fuera de la LAN son encaminadas al servidor HTTP en la red separada del resto de la red interna. Esta forma de segmentación de red puede proveer seguridad permitiendo conexiones HTTP a máquinas en la red.
Si el servidor HTTP está configurado para aceptar conexiones seguras, entonces el puerto 443 debe ser reenviado también.
2.8.6. Software malicioso y suplantación de direcciones IP
Reglas más elaboradas pueden ser creadas para que controlen el acceso a subredes específicas, o incluso para nodos específicos, dentro de la LAN. Puede también restringir ciertas aplicaciones o programas de carácter dudoso como troyanos, gusanos, y demás virus cliente/servidor, y evitar que entren en contacto con sus servidores.
Por ejemplo, algunos troyanos examinan redes para ver los servicios en los puertos 31337 a 31340 (llamados los puertos elite en la terminología de craqueo).
Dado que no hay servicios legítimos que se comunican vía estos puertos no estándares, su bloqueo puede disminuir efectivamente las posibilidades de que nodos infectados en su red se comuniquen con sus servidores maestros remotos.
Las siguientes reglas eliminan todo el tráfico TCP que intenta usar el puerto 31337:
[root@miServidor ~ ] # iptables -A OUTPUT -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
[root@miServidor ~ ] # iptables -A FORWARD -o eth0 -p tcp --dport 31337 --sport 31337 -j DROP
También se puede bloquear conexiones salientes que intenten suplantar los rangos de direcciones IP privadas para infiltrarse en su LAN.
Por ejemplo, si su red usa el rango 192.168.1.0/24, se puede diseñar una regla que instruya al dispositivo de red del lado de Internet (por ejemplo, eth0) para que descarte cualquier paquete en ese dispositivo con una dirección en el rango IP de su red local.
Dado que se recomienda rechazar paquetes reenviados como una política predeterminada, cualquier otra dirección IP mentida al dispositivo del lado externo (eth0) se rechaza automáticamente.
[root@miServidor ~ ] # iptables -A FORWARD -s 192.168.1.0/24 -i eth0 -j DROP
Nota
Existe una distinción entre los destinos DROP
y REJECT
cuando se trabaja con reglas agregadas.
El destino RECHAZAR
niega acceso y regresa un error de conexión denegada
a los usuarios que intenten conectarse al servicio. El destino ABANDONAR
, como su nombre lo indica, abandona el paquete sin previo aviso.
Los administradores pueden usar su propia discreción cuando usen estos destinos. Sin embargo, para evitar la confusión del usuario e intentos de continuar conectando, el destino REJECT
es recomendado.
2.8.7. IPTables y el seguimiento de la conexión
Puede inspeccionar y restringir conexiones a servicios basados en sus estados de conexión. Un módulo dentro de iptables
utiliza un método denominado rastreo de conexión para almacenar datos acerca de las conexiones recibidas. Puede permitir o negar acceso basándose en los siguientes estados de conexión:
NEW
— Un paquete que pide una nueva conexión, tal como un pedido HTTP.
ESTABLISHED
— Un paquete que es parte de una conexión existente.
RELATED
— Un paquete que está pidiendo una nueva conexión, pero que es parte de una existente. Por ejemplo, FTP usa el puerto 21 para establecer una conexión, pero los datos se transfieren en un puerto diferente (normalmente el puerto 20).
INVALID
— Un paquete que no es parte de ninguna conexión en la tabla de seguimiento de conexiones.
Puede utilizar toda la funcionalidad del rastreo de conexión iptables
con cualquier protocolo, aún si él mismo se encuentra inactivo (como por ejemplo un protocolo UDP). EL siguiente ejemplo le muestra una regla que utiliza rastreo de conexión para reenviar solamente los paquetes que están asociados con una conexión establecida:
[root@miServidor ~ ] # iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
La introducción de la siguiente generación del Protocolo de Internet, llamado IPv6, expande más allá de los límites de las direcciones de 32-bit de IPv4 (o IP). IPv6 soporta direcciones de 128-bit, y las redes transportadoras que pueden soportar IPv6 son por lo tanto capaces de manejar un número más grande de direcciones ruteables que el IPv4.
Fedora supports IPv6 firewall rules using the Netfilter 6 subsystem and the ip6tables
command. In Fedora 12, both IPv4 and IPv6 services are enabled by default.
La sintaxis del comando ip6tables
es idéntica a iptables
en todos los aspectos menos en que soporta direcciones de 128-bit. Por ejemplo, use el siguiente comando para habilitar conexiones SSH en un servidor de red para IPv6:
[root@miServidor ~ ] # ip6tables -A INPUT -i eth0 -p tcp -s 3ffe:ffff:100::1/128 --dport 22 -j ACCEPT
Para más información acerca de redes IPv6, vaya a la Página de Información sobre IPv6 en
http://www.ipv6.org/.
2.8.9. Recursos adicionales
Hay varios aspectos de cortafuegos y del subsistema Netfilter de Linux que no pueden ser cubiertos en este capítulo. Para más información consulte las referencias que ofrecemos a continuación.
2.8.9.1. Documentación instalada del cortafuego
2.8.9.2. Sitios web útiles de cortafuego
http://www.tldp.org/ — El Proyecto de Documentación de Linux contiene varias guías útiles sobre la creación y administración de cortafuegos.
Red Hat Linux Firewalls, por Bill McCarty; Red Hat Press — un manual de referencia completo para poder levantar cortafuegos de red o de servidores, utilizando tecnología de código abierto para filtrado de paquetes, como por ejemplo Netfilter o iptables
. Los temas que se tratan van desde el análisis de logs de cortafuegos, desarrollo de reglas de cortafuegos, y diferentes métodos de personalización del cortafuegos utilizando numerosas herramientas gráficas.
Linux Firewalls, por Robert Ziegler; New Riders Press — contiene gran cantidad de información para poder levantar cortafuegos utilizando tanto ipchains
de un kernel 2.2, como Netfilter o iptables
. También son tratados otros temas relacionados con la seguridad, como problemas con el acceso remoto, o detección de intrusos en el sistema.
Con Fedora están incluidas herramientas avanzadas para el filtrado de paquetes — el proceso dentro de kernel que permite controlar a los paquetes de red mientras están ingresando a nuestro entorno, mientras lo están recorriendo y cuando lo abandonan. Las versiones del kernel anteriores a la 2.4, dependían de ipchains
para el filtrado de paquetes, y utilizaban listas de reglas aplicadas a los paquetes en cada paso del proceso de filtrado. El kernel 2.4 introdujo la utilización de iptables
(también llamado netfilter), que si bien es similar a ipchains
, expande enormemente el rango y la posibilidad de control disponible para filtrar los paquetes de red.
This chapter focuses on packet filtering basics, explains various options available with iptables
commands, and explains how filtering rules can be preserved between system reboots.
Importante
El mecanismo de un cortafuegos establecido por defecto con un kernel 2.4 o superior es iptables
, pero iptables
no puede ser utilizado si ipchains
se encuentra en ejecución. Si ipchains
está presente en el momento del arranque, el kernel envía un mensaje de error y no puede iniciar iptables
.
La funcionalidad de ipchains
no es afectada por estos errores.
2.9.1. Filtrado de Paquete
El kernel de Linux utiliza la herramienta Netfilter para filtrar los paquetes, permitiendo que alguno de ellos sean recibidos por el sistema (o que pasen a través de él), y evitando que lo hagan otros. Esta herramienta está predefinida en el kernel, y posee tres tablas o listas de reglas predeterminadas de la forma siguiente:
filter
— La tabla predeterminada para el manejo de paquetes de red.
nat
— Se usa para alterar paquetes que crean una nueva conexión y para Network Address Translation (NAT).
mangle
— Usada para tipos específicos de alteraciones de paquetes.
Cada tabla tiene un grupo de cadenas predefinidas, que corresponden a las acciones realizadas por netfilter
sobre el paquete.
Las cadenas predefinidas para la tabla filter
son las siguientes:
INPUT — Se aplica a paquetes de red que son destinados a este equipo.
OUTPUT — Se aplica a paquetes de red generados localmente.
FORWARD — Se aplica a paquetes de la red ruteados a través de este equipo.
Las cadenas predeterminadas para la tabla nat
son las siguientes:
PREROUTING — Altera los paquetes de la red cuando llegan.
OUTPUT — Altera los paquetes de la red generados localmente antes de que se envíen.
POSTROUTING — Altera los paquetes de la red antes de ser enviados.
Las cadenas predeterminadas para la tabla mangle
son:
INPUT — Altera los paquetes de red destinados a este equipo.
OUTPUT — Altera los paquetes de la red generados localmente antes de que se envíen.
FORWARD — Altera los paquetes de red ruteados a través de este equipo.
PREROUTING — Altera los paquetes que vienen de la red antes de ser ruteados.
POSTROUTING — Altera los paquetes de la red antes de ser enviados.
Cada paquete de red recibido por, o enviado con un sistema Linux es sujeto de (o por) al menos una tabla. Sin embargo, un paquete puede ser sujeto por varias reglas pertenecientes a cada tabla, antes de poder emerger al final de la cadena. La estructura y el propósito de estas reglas pueden variar, pero por lo general lo que buscan es un paquete yendo o viniendo desde una dirección IP determinada (o conjunto de direcciones), cada vez que se utilice un protocolo y un servicio de red determinados.
Nota
Por defecto, las reglas del cortafuego se graban en los archivos /etc/sysconfig/iptables
o /etc/sysconfig/ip6tables
.
El servicio iptables
se activa antes que cualquier otro servicio relacionado con DNS, cuando el sistema Linux es iniciado. Esto significa que las reglas de cortafuegos pueden sólo hacer referencia a direcciones IP numéricas (como por ejemplo, 192.168.0.1). En este tipo de reglas, los nombres del dominio (por ejemplo, host.example.com) producen errores.
Dejando de lado el destino que tengan, cuando los paquetes se corresponden con una regla en particular de una de estas tablas, una acción es aplicada a ellos. Si la regla especifica una acción ACCEPT
para un paquete que se corresponde con ella, ese paquete se saltea el resto de la regla y le es permitido continuar hacia su destino, cualquiera que este sea. Si una regla especifica una acción DROP
, a ese paquete se le niega acceso al sistema y nada es devuelto al equipo que lo envió. Si una regla especifica la acción QUEUE
, el paquete es colocado en un espacio de usuario. Si una regla especifica la acción optativa REJECT
, el paquete es abandonado, pero un paquete de error es a la vez enviado a quien lo originó.
Cada cadena posee una política por defecto para las acciones de ACCEPT
, DROP
, REJECT
, o QUEUE
. Si ninguna de estas reglas en la cadena se aplica al paquete, entonces el paquete es tratado de acuerdo a la política establecida por defecto.
El comando iptables
configura estas tablas, así como crea algunas nuevas si es necesario.
2.9.2. Opciones de la línea de comandos de IPTables
Las reglas para el filtrado de paquetes se crean usando el comando iptables
. Los aspectos siguientes del paquete son los más usados como criterios:
Tipo de Paquete — Especifica el tipo de paquete que filtra el comando.
Fuente/Destino del Paquete — Especifica qué paquete se filtra basado en el fuente/destino del paquete.
Destino — Especifica qué acción se toma sobre los paquetes que coinciden con el criterio de más arriba.
Las opciones utilizadas con reglas específicas de iptables
, para que puedan ser válidas, deben ser agrupadas lógicamente, fundamentadas en el propósito y las condiciones de la regla en su totalidad. En el recordatorio de esta sección se explican opciones comúnmente utilizadas para el comando iptables
.
2.9.2.1. Estructura de las opciones de comandos de IPTables
Muchos comandos iptables
tienen la siguiente estructura:
iptables [-t <nombre-de-tabla>
] <comando>
<nombre-de-cadena>
\ <parametro-1>
<opción-1>
\ <parametro-n>
<opción-n>
<nombre-de-tabla>
— Especifica a qué tabla se aplica la regla. Si se omite, se usa la tabla filter
.
<comando>
— Especifica la acción a realizar, tal como agregar o eliminar una regla.
<nombre-de-cadena>
— Especifica la cadena a editar, crear o borrar.
pares de <parametro>-<opción>
— Los parámetros y las opciones asociadas que especifican cómo se procesa el paquete que coincide con una regla.
La longitud y complejidad de un comando iptables
puede cambiar significativamente, basado en su propósito.
Por ejemplo, un comando para eliminar una regla de una cadena puede ser muy corto:
iptables -D <nombre-de-cadena> <número-de-línea>
En contraste, un comando que añada una regla que filtre los paquetes provenientes de una subred determinada, utilizando una variedad de parámetros y opciones específicas, podría ser bastante extenso. Cuando construya comandos iptables
, es importante recordar que algunos parámetros y opciones requieren de otros parámetros y de otras opciones para poder constituir una regla válida. Esto puede producir un efecto cascada, con los futuros parámetros pidiendo otros nuevos. La regla no será válida hasta que no se satisfagan cada parámetro y cada opción que requiera otro conjunto de opciones y parámetros.
Con iptables -h
se puede ver una lista comprensiva de la estructura de los comandos de iptables
.
2.9.2.2. Opciones de comandos
Las opciones de comando dan instrucciones a iptables
para que realice una acción específica. Solo una opción de comando es permitida para cada comando iptables
. Con la excepción del comando help, todos los demás deben ser escritos con caracteres mayúsculos.
Los comandos de iptables
son los siguientes:
-A
— Agregan una regla al final de la cadena especificada. A diferencia de la opción -I
descripta más abajo, No toma un entero como argumento. Siempre agrega la regla al final de la cadena especificada.
-C
— Verifica una regla determinada antes de añadirla a la cadena especificada por el usuario. Este comando puede ayudarle a construir reglas complejas de iptables
al solicitarle parámetros y opciones adicionales.
-D <integer> | <rule>
— Elimina una regla de una cadena determinada por su número (como por ejemplo 5
para la quinta regla de una cadena), o por su especificación. La especificación de la regla debe coincidir exactamente con la regla existente.
-E
— Renombra una cadena definida por el usuario. Una cadena definida por el usuario es cualquier cadena que no sea una de las ya existentes, establecidas por defecto. (Vea más abajo la opción -N
para obtener información acerca de como crear cadenas definidas por el usuario). Este es un cambio de tipo estético y no afecta la estructura de la tabla.
Nota
Si intenta renombrar alguna de las cadenas predeterminadas, el sistema informará un error de Coincidencia no encontrada
. No puede renombrar las cadenas predeterminadas.
-F
— Limpia la cadena seleccionada, lo que efectivamente borra cada regla en la cadena. Si no se especifica una cadena, limpia todas las reglas de cada cadena.
-h
— Provee una lista de estructuras de comando, así como un resumen rápido de los parámetros y opciones de los comandos.
-I [<entero>]
— Inserta una regla en la cadena en el punto especificado por el argumento entero dado por el usuario. Si no se especifica un argumento, se inserta al comienzo de la cadena.
Importante
Como se mencionó arriba, el orden de las reglas en una cadena determina cuáles reglas se aplican a qué paquetes. Esto es importante para recordar cuando se agreguen reglas que usen la opción -A
o -I
.
Esto es especialmente importante cuando se agregan reglas utilizando la opción -I
con un argumento entero. Si especifica un número existente cuando agregue una regla a una cadena, iptables
añade la nueva regla antes que (o sobre) la regla existente.
-L
— Muestra todas las reglas en la cadena especificada luego del comando. Para listar todas las reglas de todas las cadenas en la tabla de filtro
establecida por defecto, no especifique ni una cadena ni una tabla. De lo contrario, la siguiente sintaxis debería ser utilizada para listar las reglas de una cadena determinada, en una tabla determinada:
iptables -L <nombre-de-cadena>
-t <nombre-de-tabla>
Las opciones adicionales para la opción
-L
del comando, que proveen el número de regla y permiten descripciones de reglas más detalladas se describen en la
Sección 2.9.2.6, “Opciones de listado”.
-N
— Crea una nueva cadena con un nombre dado por el usuario. El nombre debe ser único, sino se mostrará un mensaje de error.
-P
— Pone la política predeterminada para la cadena especificada, para que cuando los paquetes atraviesen toda la cadena sin encontrar una regla con la que coincidan, se los envía al destino especificado, sea ACCEPT o DROP.
-R
— Reemplaza una regla en la cadena especificada. El número de regla debe especificarse después del nombre de la cadena. La primera regla en una cadena corresponde a la regla número uno.
-X
— Borra una cadena definida por el usuario. No se puede borrar una cadena predefinida.
-Z
— Pone los contadores de bytes y de paquetes a 0 en todas las cadenas de una tabla.
2.9.2.3. Opciones de parámetros de IPTables
Ciertos comandos de iptables
, incluyen aquellos para agregar, adjuntar, borrar, insertar o borrar reglas dentro de una cadena particular, que requieren varios parámetros para construir una regla de filtrado de paquetes.
-c
— Reinicia los contadores de una regla particular. Este parámetro acepta las opciones PKTS
y BYTES
para especificar qué contadores resetear.
-d
— Pone el destino por nombre, dirección IP o red para un paquete que coincide con la regla. Cuando se especifique una red, los siguientes formatos de dirección de IP /máscara de red son soportados:
-f
— Aplica esta regla sólo a paquetes fragmentados.
Puede usar el signo de exclamación (!
) después de este parámetro para especificar que solamente se aceptan paquetes desfragmentados.
Nota
La distinción entre paquetes fragmentados y defragmentados es deseable, sin importar que los paquetes fragmentados sean una parte estándar del protocolo IP.
Originalmente diseñada para permitir que los paquetes IP viajen a través de redes con marcos de diferentes tamaños, hoy en día la fragmentación es comúnmente utilizada para generar ataques DoS, mediante paquetes mal formados. Tampoco sirve de mucho que IPv6 no permita en absoluto la fragmentación.
-i
— Establece la interfaz de red entrante, como ser por ejemplo, eth0
o ppp0
. Con iptables
, este parámetro opcional solo puede ser utilizado con las cadenas de INPUT y FORWARD, cuando sean utilizadas con la tabla de filter
, y la cadena PREROUTING con las tablas nat
y mangle
.
Este parámetro también da soporte a todas las siguientes opciones especiales:
El signo de exclamación (!
) — Revierte la directiva, significando que las interfaces especificadas de excluyen de esta regla.
Signo de suma (+
) — Un carácter comodín utilizado para relacionar a todas las interfaces que se correspondan con una cadena determinada. Por ejemplo, el parámetro -i eth+
aplicaría esta regla a cualquier interfaz Ethernet, pero excluiría el resto de las interfases, como por ejemplo, ppp0
.
Si el parámetro -i
se usa pero no se especifica una interfaz, entonces todas las interfases son afectadas por esta regla.
-j
— Salta al destino especificado si un paquete coincide con una regla en particular.
Los destinos estándares son ACCEPT
, DROP
, QUEUE
, y RETURN
.
Existen también a disposición algunas opciones extendidas, a través de módulos cargados por defecto con el paquete RPM iptables
de Fedora. Algunas de las acciones válidas de ese módulo son LOG
, MARK
, y REJECT
, entre otras. Para obtener mayor información acerca de estas y de otras acciones, consulte la página man de iptables
.
Esta opción también puede usarse para dirigir el paquete coincidente a una regla particular en una cadena del usuario fuera de la cadena actual, para que se le puedan aplicar otras reglas al paquete.
Si no se especifica un destino, el paquete se mueve a la regla siguiente sin hacer nada. El contador de esta regla, sin embargo, se incrementa por uno.
-o
— Establece la interfaz de red saliente para una regla. Esta opción sólo es válida para las cadenas OUTPUT y FORWARD en la tabla filter
, y para la cadena POSTROUTING en las tablas nat
y mangle
tables. Este parámetro acepta las mismas opciones que el parámetro para la interfaz de red entrante (-i
).
-p <protocol>
— Establece el protocolo IP afectado por la regla. Este puede ser icmp
, tcp
, udp
, o all
, o también puede ser un valor numérico, representando alguno de estos protocolos, o alguno diferente. También puede utilizar cualquiera de los protocolos listados en el archivo /etc/protocols
.
El protocolo "all
" significa que esta regla se aplica a todos los protocolos soportados. Si no se lista ningún protocolo con esta regla, por defecto se asume "all
".
-s
— Pone el fuente de un paquete particular usando la misma sintaxis del parámetro de destino (-d
).
2.9.2.4. Opciones de coincidencia de IPTables
Los diferentes protocolos de red proveen opciones especializadas de correspondencia, que pueden ser configuradas para relacionar un paquete determinado, que utilice el protocolo en cuestión. Sin embargo, el protocolo debe ser previamente especificado en el comando iptables
. Por ejemplo, -p <protocol-name>
habilita opciones para el protocolo específico. Fíjese que incluso puede utilizar el ID del protocolo, en lugar del nombre del protocolo. Observe los siguientes ejemplos, cada uno de los cuales tiene el mismo efecto:
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
iptables -A INPUT -p 5813 --icmp-type any -j ACCEPT
Las definiciones de los servicios son provistas en el archivo /etc/services
. Para una mejor lectura, es recomendable que se utilice el nombre de los servicios, en lugar de los números de puertos.
Advertencia
Asegure el archivo /etc/services
de manera de poder evitar que sea editado por usuarios no autorizados. Si este archivo es editable, los crackers pueden utilizarlo para habilitar puertos en su equipo que de otra manera permanecerían cerrados. Para segurar este archivo, ingrese los siguiente comandos siendo usuario root:
[root@myServer ~]# chown root.root /etc/services
[root@myServer ~]# chmod 0644 /etc/services
[root@myServer ~]# chattr +i /etc/services
Esto previene que se pueda renombrar, borrar o crear enlaces al archivo.
Estas opciones de comparación están disponibles para el protocolo TCP (-p tcp
):
--dport
— Pone el puerto destino del paquete.
Para configurar esta opción, use un nombre de servicio de red (tal como www o smtp); o un número de puerto; o un rango de números de puerto.
Para especificar un rango de números de puerto, separe los dos números con dos puntos (:
). Por ejemplo: -p tcp --dport 3000:3200
. El rango más grande aceptable es 0:65535
.
Use el signo de exclamación (!
) después de la opción --dport
para que seleccione todos los paquetes que no usen ese servicio de red o puerto.
Para navegar por los nombres o alias de servicios de red y sus números de puerto, vea el archivo /etc/services
.
La opción --destination-port
es sinónimo de --dport
.
--sport
— Pone el puerto de origen del paquete y usa las mismas opciones que --dport
. La opción --source-port
es sinónimo de --sport
.
--syn
— Se aplica a todos los paquetes TCP diseñados para iniciar una comunicación, comúnmente llamados paquetes SYN. Cualquier paquete que lleve datos no se toca.
Use un signo de exclamación (!
) después de --syn
para que seleccione los paquetes no-SYN.
--tcp-flags <lista de chequeo de banderas> <lista de banderas puestas>
— Permite paquetes TCP que tengan ciertos bits (banderas) específicos puestos, para que coincidan con la regla.
La opción de correspondencia --tcp-flags
acepta dos parámetros. El primero es la máscara; una lista separada por comas de las marcas a ser examinadas en el paquete. El segundo parámetro es una lista separada por comas de las marcas que deben ser definidas en la regla con la que se pretende concordar.
Las posibles banderas son:
ACK
FIN
PSH
RST
SYN
URG
ALL
NONE
Por ejemplo, una regla iptables
que contenga las siguientes especificaciones solo se corresponderá con paquetes TCP que tengan definida la marca SYN, y que no tengan definidas las marcas ACK ni FIN:
--tcp-flags ACK,FIN,SYN SYN
Use el signo de exclamación (!
) después de --tcp-flags
para revertir el efecto de coincidencia de la opción.
--tcp-option
— Intenta corresponderse con opciones específicas de TCP que puedan establecerse dentro de un paquete determinado. Esta opción de correspondencia puede también revertirse con el signo de exclamación (!
).
Estas opciones de coincidencias están disponibles para el protocolo UDP (-p udp
):
--dport
— Especifica el puerto de destino del paquete UDP, utilizando el nombre del servicio, el número de puerto, o rango de números de puerto. La opción de correspondencia --destination-port
es equivalente.
--sport
— Especifica el puerto de origen del paquete UDP, utilizando el nombre del servicio, el número de puerto, o rango de números de puertos. La opción de correspondencia --source-port
es equivalente.
Con las opciones --dport
y --sport
, para especificar un rango válido de puertos, separe ambos números del rango con dos puntos (:). Por ejemplo: -p tcp --dport 3000:3200
. El rango válido más extenso que puede aceptarse es 0:65535.
2.9.2.4.3. Protocolo ICMP
Las siguientes opciones de coincidencias están disponibles en el Protocolo de Mensajes de Control de Internet (ICMP) (-p icmp
):
2.9.2.4.4. Módulos adicionales para opciones de coincidencia
Opciones de coincidencias adicionales están disponibles a través de los módulos cargados por el comando iptables
.
Para usar un módulo de comparación, cargue el módulo por su nombre con -m <nombre-de-módulo>
, donde <nombre-de-módulo>
es el nombre del módulo.
Por defecto hay disponibles muchos módulos. También puede crear módulos para proveer funcionalidad adicional.
La siguiente es una lista parcial de los módulos más comúnmente usados:
Módulo limit
— Pone límites sobre cuántos paquetes se toman para una regla particular.
Cuando se usa junto con el destino LOG
, el módulo limit
puede prevenir una inundación de paquetes coincidentes que pudieran sobrecargar al sistema de log con mensajes repetitivos o acabar los recursos del sistema.
El módulo limit
habilita las siguientes opciones:
--limit
— Establece la cantidad máxima posible de correspondencias en un período de tiempo determinado, especificado como un par <value>/<period>
. Por ejemplo, utilizar --limit 5/hour
permite 5 correspondencias con la regla a cada hora.
Los períodos se pueden especificar en segundos, minutos, horas o días.
Si no se utiliza un número o modificador de tiempo, se asume el valor predeterminado de 3/hora
.
--limit-burst
— Pone un límite en el número de paquetes que pueden coincidir con la regla en cada momento.
Esta opción se especifica como un entero y no se debe usar junto con la opción --limit
.
Si no se especifica un valor, el valor predeterminado cinco (5) es asumido.
Módulo state
— Habilita el chequeo del estado.
El módulo state
habilita las siguientes opciones:
--state
— chequea a un paquete con los siguientes estados de conexión:
ESTABLISHED
— El paquete está asociado a otros paquetes en una conexión establecida. Necesita aceptar este estado si quiere mantener una conexión entre un cliente y un servidor.
INVALID
— El paquete es chequeado no está asociado a una conexión conocida.
NEW
— El paquete chequeado es para crear una conexión nueva o es parte de una conexión de doble vía que no fue vista previamente. Necesita aceptar este estado si quiere permitir conexiones nuevas a un servicio.
RELATED
— El paquete coincidente está iniciando una conexión relacionada de alguna manera a otra existente. Un ejemplo de esto es FTP, que usa una conexión para el control del tráfico (puerto 21) y una conexión separada para la transferencia de datos (puerto 20).
Estos estados de conexión pueden ser utilizados combinados con otros, si se los separa con comas, como por ejemplo -m state --state INVALID,NEW
.
Módulo mac
— Habilita el chequeo de la dirección MAC de hardware.
El módulo mac
habilita la siguiente opción:
Vea en la página man de iptables
para más opciones de comparación disponibles a través de módulos.
2.9.2.5. Opciones de destino
Cuando un paquete concuerde con una regla en particular, la regla puede dirigir el paquete hacia un número de destinos diferentes determinados por la acción apropiada. Cada cadena tiene un objetivo establecido por defecto, que será utilizado si ninguna de las reglas en esa cadena concuerdan con un paquete, o si ninguna de las reglas que concuerdan con el paquete especifica un destino.
Los siguientes son los destinos estándares:
<cadena-del-usuario>
— Una cadena definida por el usuario dentro de la tabla. Los nombres de las cadenas definidas por el usuario deben ser únicos. Esta acción pasa el paquete a la cadena especificada.
ACCEPT
— Permite pasar al paquete a su destino o a otra cadena.
DROP
— Descarta el paquete sin responder. El sistema que mandó el paquete no es notificado de la falla.
QUEUE
— El paquete es encolado para su manejo por una aplicación en el espacio del usuario.
RETURN
— Detiene el chequeo del paquete contra las reglas restantes de la cadena. Si el paquete con un destino RETURN
coincide con una regla en una cadena llamada por otra cadena, el paquete es devuelto a la primera cadena y continúa el chequeo donde quedó antes de saltar. Si la regla RETURN
se usa en una cadena predefinida y el paquete no se puede mover a una cadena previa, se usa el destino predeterminado para la cadena.
Además, existen a disposición diversos complementos que permiten especificar otros destinos. Estos complementos son llamados módulos de destino o módulos de opción de concordancia y muchos de ellos sólo se aplican a tablas y situaciones específicas. Para obtener más información acerca de los módulos de opción de concordancia, vea
Sección 2.9.2.4.4, “Módulos adicionales para opciones de coincidencia”
Existen numerosos módulos de destino extendidos, muchos de los cuales solo se aplican a ciertas tablas o situaciones. Algunos de los más populares incluidos por defecto en Fedora son:
LOG
— Registra todos los paquetes que se correspondan con esta regla. Debido a que los paquetes son registrados por el kernel, el archivo /etc/syslog.conf
determina donde son escritas estas entradas de registro. Por defecto, son ubicadas en el archivo /var/log/messages
.
Hay opciones adicionales que se pueden usar después del destino LOG
para especificar la forma en que se realiza el log:
--log-level
— Pone la prioridad de registrado del evento. Vaya a la página man de syslog.conf
para una lista de los niveles de prioridad.
--log-ip-options
— Registra todas las opciones puestas en la cabecera de un paquete IP.
--log-prefix
— Pone una cadena de hasta 29 caracteres antes de la línea de registro cuando se escribe. Esto es útil cuando se escribe filtros syslog para usar junto con el registrado de paquetes.
Nota
Debido a una cuestión con esta opción, se debe agregar un espacio al final del valor log-prefix
.
--log-tcp-options
— Registra todas las opciones puestas en la cabecera de un paquete TCP.
--log-tcp-sequence
— Escribe el número de secuencia de un paquete en el log.
REJECT
— Envía un paquete de error como respuesta al sistema remoto y descarta el paquete.
La destino REJECT
acepta --reject-with <tipo>
(donde <tipo>
es el tipo de rechazo) permitiendo que junto con el paquete erróneo sea devuelta información más detallada. El mensaje port-unreachable
es el tipo de error establecido por defecto que será dado si no hay otra opción utilizándose. Vea la página man de iptables
para una lista completa de opciones de <tipo>
.
Otras extensiones de acción, incluidas aquellas que son útiles para el enmascaramiento de IP utilizando la tabla nat
, o mediante alteración de paquete utilizando la tabla mangle
, pueden ser encontradas en la página man de iptables
.
2.9.2.6. Opciones de listado
La lista de comandos establecida por defecto, iptables -L [<chain-name>]
provee resumen básico de las cadenas de tablas de filtrado establecidas por defecto. Opciones adicionales brindan más información:
-v
— Muestra información adicional, como por ejemplo la cantidad de paquetes y los bytes que ha procesado cada cadena, la cantidad de paquetes y los bytes que se ha correspondido con cada regla, y qué interfases se aplican a una regla determinada.
-x
— Expande los números a sus valores exactos. En un sistema activo, el número de los paquetes y la cantidad de bytes procesados por una cadena o regla determinada puede estar abreviado en Kilobytes
, Megabytes
(Megabytes) o Gigabytes
. Esta opción obliga a ser mostrado el número entero.
-n
— Muestra las direcciones IP y los números de puerto en su formato numérico, en vez del formato predeterminado de nombre de equipo y nombre de servicio.
--line-numbers
— Muestra las reglas en cada cadena junto a su orden numérico en dicha cadena. Esta opción es útil si se intenta eliminar una regla específica de una cadena, o para saber dónde insertar una regla dentro de una cadena.
-t <nombre-de-tabla>
— Especifica el nombre de una tabla. Si se omite, se usa filter como nombre de tabla.
2.9.3. Guardando las reglas de IPTalbes
Las reglas creadas con el comando iptables
son almacenadas en la memoria. Si el sistema es reiniciado antes de guardar el conjunto de reglas de iptables
, estas reglas se perderán. Para que las reglas de netfilter sigan vigentes luego de reiniciar el sistema, necesitan ser guardadas. Para salvar reglas de netfilter, ingrese el siguiente comando como usuario root:
/sbin/service iptables save
Esto ejecuta el programa init de iptables
, que a su vez ejecuta el programa /sbin/iptables-save
y escribe la configuración actual de iptables
a /etc/sysconfig/iptables
. El archivo existente /etc/sysconfig/iptables
es guardado como /etc/sysconfig/iptables.save
.
La próxima vez que el sistema se reinicie, el programa init de iptables
aplica nuevamente las reglas guardadas en /etc/sysconfig/iptables
utilizando el comando /sbin/iptables-restore
.
Si bien siempre es una buena idea probar una nueva regla iptables
antes de incluirla en el archivo /etc/sysconfig/iptables
, es posible copiar reglas iptables
a este archivo desde una versión diferente del mismo archivo. Esto permite una rápida distribución de los conjuntos de reglas iptables
en diversas máquinas.
También puede grabar las reglas de iptables a un archivo separado para distribuir, respaldar u otros propósitos. Para guardar sus reglas de iptables, ingrese el siguiente comando como root:
[root@miServidor ~]# iptables-save > <nombredearchivo>
donde <nombredearchivo>
es un nombre dado por el usuario para el conjunto de reglas.
Importante
Si va a distribuir el archivo /etc/sysconfig/iptables
a otras máquinas, debe teclear /sbin/service iptables restart
para que las nuevas reglas tengan efecto.
Nota
Fíjese la diferencia entre el comando iptables
(/sbin/iptables
), que es utilizado para manipular las tablas y cadenas que constituyen las funcionalidades de iptables
, y el servicio iptables
(/sbin/iptables service
), que es utilizado para activar y desactivar el servicio de iptables
en sí.
2.9.4. Programas de control de IPTables
Hay dos métodos básicos de controlar iptables
en Fedora:
Nota
Para utilizar los mismos comandos del programa init para controlar a netfilter para IPv6, sustituya
ip6tables
por
iptables
en los comandos
/sbin/service
listados en esta sección. Para obtener mayor información acerca de IPv6 o netfilter, vea
Sección 2.9.5, “IPTables e IPv6”.
2.9.4.1. Archivo de Configuración de los Scripts de Control de IPTables
El comportamiento de los scripts de inicio de iptables
se controlan por el archivo de configuración /etc/sysconfig/iptables-config
. La siguiente es una lista de las directivas contenidas en este archivo:
IPTABLES_MODULES
— Especifica una lista separada por comas de los módulos iptables
adicionales a cargar cuando se active el cortafuego. Estos pueden incluir el rastreo de conexión y ayudantes NAT.
IPTABLES_MODULES_UNLOAD
— Descarga los módulos al reiniciar y detener. Esta directiva acepta los siguientes valores:
yes
— El valor por defecto. Esta opción debe ser puesta para conseguir un estado correcto de un reinicio o detenida de un cortafuego.
no
— Esta opción debe ser puesta sólo si hay problemas al descargar los módulos de netfilter.
IPTABLES_SAVE_ON_STOP
— Guarda las reglas actuales en /etc/sysconfig/iptables
cuando el cortafuego es detenido. Esta directiva acepta los siguientes valores:
yes
— Guarda las reglas existentes en /etc/sysconfig/iptables
cuando se detiene el cortafuego, moviendo la versión previa al archivo /etc/sysconfig/iptables.save
.
no
— El valor por defecto. No guarda las reglas existentes cuando el cortafuego es detenido.
IPTABLES_SAVE_ON_RESTART
— Guarda las reglas actuales del cortafuego cuando es reiniciado. Esta directiva acepta los siguientes valores:
yes
— Guarda las reglas existentes en /etc/sysconfig/iptables
cuando el cortafuego es reiniciado, moviendo la versión previa al archivo /etc/sysconfig/iptables.save
.
no
— El valor predeterminado. No guarda las reglas existentes cuando se reinicia el cortafuego.
IPTABLES_SAVE_COUNTER
— Guarda y restaura todos los contadores de paquetes y de bytes en todas las cadenas y reglas. Esta directiva acepta los siguientes valores:
IPTABLES_STATUS_NUMERIC
— Muestra las direcciones IP en formato numérico en vez de dominios y nombres de equipo. Esta directiva acepta los siguientes valores:
Si se instala el paquete iptables-ipv6
, netfilter en Fedora puede filtrar la siguiente generación del protocolo de Internet IPv6. El comando usado para manipular el netfilter de IPv6 es ip6tables
.
La mayoría de las directivas para este comando son idénticas a aquellas utilizadas para iptables
, excepto que la tabla nat
no es aún soportada. Esto significa que aún no es posible realizar tareas de traslados sobre direcciones de redes IPv6, como ser, por ejemplo, enmascaramiento y reenvío de puertos.
Las reglas de ip6tables
se guardan en el archivo /etc/sysconfig/ip6tables
. Las reglas previas guardadas antes por los scripts de inicio de ip6tables
se guardan en el archivo /etc/sysconfig/ip6tables.save
.
Las opciones de configuración para el programa init ip6tables
son almacenadas en /etc/sysconfig/ip6tables-config
, y los nombres para cada directiva varían significativamente de los correspondientes en iptables
.
Por ejemplo, la directiva IPTABLES_MODULES
de iptables-config
: el equivalente en el archivo ip6tables-config
es IP6TABLES_MODULES
.
2.9.6. Recursos adicionales
Consulte las siguientes referencias para obtener información adicional sobre el filtrado de paquetes con iptables
.
Sección 2.8, “Cortafuegos” — Contiene un capítulo acerca del rol de los cortafuegos dentro de una estrategia de seguridad general, así como las estrategias para construir las reglas del mismo.
2.9.6.1. Documentación instalada de IPTables
2.9.6.2. Sitios web útiles sobre IPTables
http://www.netfilter.org/ — El hogar del proyecto netfilter/iptables. Contiene información ordenada acerca de
iptables
, incluyendo un FAQ que describe problemas específicos, y varias guías útiles realizadas por Rusty Russell, el encargado del cortafuegos para IP de Linux. Los diferentes tutoriales del sitio abarcan diferentes temas, como ser por ejemplo, una descripción de los conceptos básicos de trabajo en redes, filtros de paquetes del kernel y configuraciones NAT.