<?xml version="1.0" encoding="iso-8859-1"?> <!-- The FreeBSD Documentation Project The FreeBSD Spanish Documentation Project %SOURCE% en_US.ISO8859-1/books/handbook/security/chapter.xml %SRCID% 0.0 $FreeBSD$ --> <chapter id="security"> <chapterinfo> <authorgroup> <author> <firstname>Matthew</firstname> <surname>Dillon</surname> <contrib>Gran parte del contenido de este capítulo procede de la página de manual de security(7), de </contrib> </author> </authorgroup> </chapterinfo> <title>Seguridad</title> <indexterm><primary>seguridad</primary></indexterm> <sect1 id="security-synopsis"> <title>Sinopsis</title> <para>Este capítulo contiene una introducción básica a los conceptos de seguridad del sistema, unas cuantas normas básicas de uso y algunos avanzados del tema en &os;. Muchos de los temas expuestos se aplican a la seguridad del sistema y de Internet en general. Internet ya no es aquél lugar <quote>amistoso</quote> en el que todo el mundo se comportaba como un buen ciudadano. Si quiere proteger sus datos, su propiedad intelectual, su tiempo y muchas más cosas de manos malintencionadas debe hacer que su sistema sea seguro.</para> <para>&os; proporciona un variado arsenal de utilidades y mecanismos para asegurar la integridad y la seguridad de su sistema y red.</para> <para>Después de leer este capítulo: </para> <itemizedlist> <listitem> <para>conocerá conceptos básicos de la seguridad relacionados con &os;. </para> </listitem> <listitem> <para>Tendrá información sobre los diversos mecanismos de cifrado disponibles en &os;, entre los cuales están <acronym>DES</acronym> y <acronym>MD5</acronym>. </para> </listitem> <listitem> <para>Sabrá cómo configurar la autentificación de contraseñas de un solo uso.</para> </listitem> <listitem> <para>Sabrá cómo configurar <acronym>TCP</acronym> Wrappers y usarlos con <command>inetd</command>.</para> </listitem> <listitem> <para>Sabrá cómo instalar <application>KerberosIV</application> en versiones de &os; anteriores a 5.0.</para> </listitem> <listitem> <para>Sabrá cómo instalar <application>Kerberos5</application> en versiones de &os; posteriores a 5.0.</para> </listitem> <listitem> <para>Podrá configurar IPsec y crear una <acronym>VPN</acronym> entre máquinas &os;/&windows;.</para> </listitem> <listitem> <para>Sabrá cómo configurar y utilizar <application>OpenSSH</application>, la implementación de <acronym>SSH</acronym> en &os;.</para> </listitem> <listitem> <para>Sabrá en qué consisten las <acronym>ACL</acronym> del sistema de ficheros y cómo utilizarlas.</para> </listitem> <listitem> <para>Sabrá cómo usar <application>Portaudit</application>, con la que podrá auditar el software que instale desde la desde la colección de ports.</para> </listitem> <listitem> <para>Sabrá cómo sacar partido de los avisos de seguridad que publica &os;.</para> </listitem> <listitem> <para>Podrá hacerse una idea clara de en qué consiste la contabilidad de procesos y de cómo activarla en &os;.</para> </listitem> </itemizedlist> <para>Antes de leer este capítulo:</para> <itemizedlist> <listitem> <para>Comprender conceptos básicos de &os; e Internet.</para> </listitem> </itemizedlist> <para>En otras secciones de este manual se cubren aspectos adicionales sobre seguridad. Por ejemplo, MAC (controles de acceso obligatorio) se explica en el <xref linkend="mac"/> y los cortafuegos en el <xref linkend="firewalls"/>.</para> </sect1> <sect1 id="security-intro"> <title>Introducción</title> <para>La seguridad es un trabajo que que comienza y termina en el administrador de sistema. Aunque que los sistemas multiusuario BSD &unix; posean una seguridad inherente, el trabajo de construir y mantener mecanismos de seguridad adicionales para que los usuarios sean aún más <quote>honestos</quote> es probablemente una de las mayores tareas de la administración de sistemas. Los sistemas son tan seguros como uno los haga, y no hay que olvidar que los problemas de seguridad compiten con la comodidad a la que tendemos los humanos. Los sistemas &unix; son capaces de ejecutar una gran cantidad de procesos simultáneamente, muchos de los cuales son servidores, lo que significa que las entidades externas pueden conectarse y <quote>hablar</quote> con ellos. Del mismo modo que las minicomputadoras de ayer se convirtieron en los sistemas de escritorio de hoy en día, la seguridad se va convirtiendo en un problemas más y más acuciante.</para> <para>La seguridad bien entendida se implementa en capas, a la manera de una <quote>cebolla</quote>. Básicamente lo que se hace es crear la mayor cantidad posible de capas de seguridad, para más tarde monitorizar el sistema en busca de intrusos. No es conveniente exagerar la seguridad, ya que interferiría con la detección, y la detección es uno de los aspectos más importantes de cualquier mecanismo de seguridad. Por ejemplo, no tiene mucho sentido activar la bandera <literal>schg</literal> (consulte &man.chflags.1;) en cada binario del sistema, ya que aunque protegería en cierto modo los binarios, haría que cualquier cambio que pudiera realizar un atacante una vez dentro del sistema fuera más difícil de detectar o incluso hacerlo del todo imposible.</para> <para>La seguridad del sistema depende también de estar preparados para distintos tipos de ataque, incluyendo intentos de <quote>tirar</quote> la máquina o dejarla en un estado inutilizable, pero que no impliquen intentos de comprometer el usuario <username>root</username> Los problemas de seguridad pueden dividirse en diferentes categorías:</para> <orderedlist> <listitem> <para>Ataques de denegación de servicio (DoS).</para> </listitem> <listitem> <para>Comprometer cuentas de usuarios.</para> </listitem> <listitem> <para>Comprometer root a través de servidores accesibles. </para> </listitem> <listitem> <para>Comprometer root desde cuentas de usuario.</para> </listitem> <listitem> <para>Creación de puertas traseras (<quote>Backdoors</quote>).</para> </listitem> </orderedlist> <indexterm> <primary>Ataques DoS</primary> <see>Denegación de servicio (DoS)</see> </indexterm> <indexterm> <primary>seguridad</primary> <secondary>Ataques DoS</secondary> <see>Denegación de servicios (DoS)</see> </indexterm> <indexterm><primary>Denegacion de servicio (DoS)</primary></indexterm> <para>Un ataque de denegación de servicio es una acción que priva al sistema de los recursos requeridos para su funcionamiento normal. Generalmente, los ataques DoS son mecanismos de fuerza bruta que intentan <quote>tumbar</quote> el sistema o hacerlo inutilizable sobrecargando la capacidad de sus servidores o de la pila de red. Algunos ataques DoS intentan aprovechar errores en la pila de red para <quote>tumbar</quote> el sistema con un solo paquete. Estos últimos únicamente pueden solucionarse aplicando al kernel una actualización que subsane el error. Los ataques a servidores muchas veces pueden solucionarse configurando las opciones apropiadas para limitar la carga del sistema en condiciones adversas. Los ataques de fuerza bruta a redes son más complicados. Los ataques con paquetes enmascarados, por ejemplo, son casi imposibles de detener, a menos que desconecte el sistema de Internet. Puede ser que no <quote>tiren</quote> el sistema, pero saturarán la conexión a Internet.</para> <indexterm> <primary>seguridad</primary> <secondary>compromiso de cuentas</secondary> </indexterm> <para>Comprometer una cuenta de usuario es mucho más común que un ataque DoS. Muchos administradores de sistemas todavía ejecutan servidores estándar <application>telnetd</application>, <application>rlogind</application>, <application>rshd</application> y <application>ftpd</application> en sus máquinas. Estos servidores, por defecto no operan a través de conexiones cifradas. El resultado es que se si se tiene una base de usuarios de tamaño medio, tarde o temprando la contraseña de uno (o más) de sus usuarios será descubierta durante sus accesos al sistema desde ubicaciones remotas.(que es, por otra parte, la forma más común y más cómoda de acceder a un sistema). El administrador de sistemas atento analizará sus logs de acceso remoto en busca de direcciones origen spspechosas, incluso entre los accesos al sistema.</para> <para>Se debe asumir <emphasis>siempre</emphasis> que, una vez que el atacante tiene acceso a una cuenta de usuario, el atacante puede comprometer la cuenta <username>root</username>. En realidad en un sistema bien mantenido y asegurado el acceso a una cuenta de usuario no necesariamente da al atacante acceso a <username>root</username>. Esta precisión es importante porque sin acceso a <username>root</username> el atacante difícilmente podrá esconder sus huellas; podrá, como mucho, hacer poco más que sembrar el caos en los ficheros del usuario o <quote>tirar</quote> la máquina. Comprometer cuentas de usuario es muy común porque los usuarios tienden a no tomar las precauciones que toma el administrador.</para> <indexterm> <primary>seguridad</primary> <secondary>puertas traseras</secondary> </indexterm> <para>Los administradores de sistemas deben tener presente que existen muchas formas potenciales de comprometer la cuenta <username>root</username> de una máquina. El atacante puede conocer la contraseña de <username>root</username>, el atacante puede encontrar un error en un servidor que se ejecuta como root y ser capaz de comprometer <username>root</username> a través de una conexión de red a ese servidor; puede ser que el atacante sepa de la existencia de un error en un programa suid-root que le permita comprometer <username>root</username> una vez dentro de una cuenta de usuario. Si un atacante encuentra la manera de comprometer la cuenta <username>root</username> de una máquina puede que no necesite instalar una puerta trasera. Muchos de los agujeros <username>root</username> encontrados y cerrados hasta la fecha implican una cantidad considerable de trabajo para el atacante limpiando todo después del ataque, así que la mayoría de los atacantes instalan puertas traseras. Una puerta trasera facilita al atacante una forma sencilla de recuperar el acceso de <username>root</username> al sistema, pero también proporciona al administrador de sistemas inteligente una forma de detectar la intrusión. Si hace imposible a un atacante la instalación de una puerta trasera puede estar actuando en detrimento de su seguridad, porque no cerrará el agujero que el atacante encontró para accder al sistema la primera vez que lo hizo.</para> <para>Las medidas de seguridad se implementan en un modelo multicapa (tipo <quote>cebolla</quote>), que puede categorizarse del siguiente modo:</para> <orderedlist> <listitem> <para>Asegurar <username>root</username> y cuentas administrativas.</para> </listitem> <listitem> <para>Asegurar los servidores que se ejecuten como <username>root</username> los binarios suid/sgid.</para> </listitem> <listitem> <para>Asegurar cuentas de usuario.</para> </listitem> <listitem> <para>Asegurar el fichero de contraseñas.</para> </listitem> <listitem> <para>Asegurar el núcleo del kernel, los dispositivos en bruto y el sistema de ficheros.</para> </listitem> <listitem> <para>Detección rápida de cambios hechos al sistema.</para> </listitem> <listitem> <para>Paranoia.</para> </listitem> </orderedlist> <para>La siguiente sección de este capítulo tratará los puntos de arriba con mayor profundidad.</para> </sect1> <sect1 id="securing-freebsd"> <title>Asegurar &os;</title> <indexterm> <primary>seguridad</primary> <secondary>asegurar &os;</secondary> </indexterm> <note> <title>Orden vs. protocolo</title> <para>En este capítulo usaremos el texto en <application>negrita</application> para referirnos a una orden o aplicación, y una fuente en <command>cursiva</command> para referirnos a órdenes específicas. Usaremos un tipo normal para los protocolos. Esta diferencia tipográfica nos será útil por ejemplo con ssh, que es tanto un protocolo como una orden.</para> </note> <para>Las siguientes secciones cubren los métodos a seguir para asegurar su sistema &os; que se mencionados en la <link linkend="security-intro"> sección anterior</link> de este capítulo.</para> <sect2 id="securing-root-and-staff"> <title>Asegurar la cuenta <username>root</username> y las cuentas administrativas</title> <indexterm> <primary><command>su</command></primary> </indexterm> <para>En primer lugar, no se moleste en asegurar las cuentas administrativas (o <quote>staff</quote>) si no ha asegurado la cuenta <username>root</username>. La mayoría de los sistemas tienen una contraseña asignada para la cuenta <username>root</username>. Lo primero que se hace es asumir que la contraseña está <emphasis>siempre</emphasis> amenazada. Esto no significa que deba eliminar la contraseña. La contraseña es casi siempre necesaria para el acceso por consola a la máquina; significa que no se debe permitir el uso de la contraseña fuera de la consola o, mejor aún, mediante &man.su.1;. Por ejemplo, asegúrese de que sus ptys aparezcan como <emphasis>inseguras</emphasis> en el fichero <filename>/etc/ttys</filename>, con lo que hará que los accesos como <username>root</username> vía <command>telnet</command> o <command>rlogin</command> no sean posibles. Si utiliza otros tipos de login como <application>sshd</application> asegúrese de que los accesos al sistema como <username>root</username> estén también deshabilitados. Para ello edite su <filename>/etc/ssh/sshd_config</filename> y asegúrese de que <literal>PermitRootLogin</literal> esté puesto a <literal>NO</literal>. Estudie cada método de acceso: hay servicios como FTP que frecuentemente son origen de grietas en la estructura del sistema. El acceso directo como usuario <username>root</username> sólamente debe permitirse a través de la consola.</para> <indexterm> <primary><groupname>wheel</groupname></primary> </indexterm> <para>Es evidente que, como administrador del sistema, debe usted tener la posibilidad de acceder a <username>root</username>, así que tendrá que abrir algunos agujeros, pero debe asegurarse de que estos agujeros necesiten contraseñas adicionales para verificar su correcto uso. Puede hacer que <username>root</username> sea accesible añadiendo cuentas administrativas al grupo <groupname>wheel</groupname> (en <filename>/etc/group</filename>). El personal que administra los sistemas que aparezcan en el grupo en el grupo <groupname>wheel</groupname> pueden hacer <command>su</command> a <username>root</username>. Nunca debe de proporcionar al personal administrativo el acceso nativo a <groupname>wheel</groupname> poniéndolos en el grupo <groupname>wheel</groupname> en su entrada de contraseña. Las cuentas administrativas deben colocarse en un grupo <groupname>staff</groupname>, y agregarse después al grupo <groupname>wheel</groupname> en <filename>/etc/group</filename>. Sólo aquellos administradores que realmente necesiten acceder a <username>root</username> deben pertenecer al grupo <groupname>wheel</groupname>. También es posible, mediante un método de autentificación como Kerberos, usar el fichero <filename>.k5login</filename> en la cuenta <username>root</username> para permitir un &man.ksu.1; a <username>root</username> sin tener que colocar a nadie en el grupo <groupname>wheel</groupname>. Puede ser una mejor solución, ya que el mecanismo <groupname>wheel</groupname> aún permite a un atacante comprometer <username>root</username> si el intruso ha conseguido el fichero de contraseñas y puede comprometer una cuenta de administración. Recurrir al mecanismo <groupname>wheel</groupname> es mejor que no tener nada, pero no es necesariamente la opción más segura.</para> <!-- XXX: This will need updating depending on the outcome of PR bin/71147. Personally I know what I'd like to see, which puts this in definite need of a rewrite, but we'll have to wait and see. ceri@ --> <para>Una manera indirecta de asegurar las cuentas de staff y el acceso a <username>root</username> es utilizar un método de acceso alternativo: es lo que se conoce como <quote>estrellar</quote> las contraseñas cifradas de las cuentas administrativas. Use &man.vipw.8; para reemplazar cada contraseña cifrada por un sólo caracter asterisco (<quote><literal>*</literal></quote>). Esto actualizará <filename>/etc/master.passwd</filename> y la base de datos de usuario/contraseña y deshabilitará los accesos al sistema validados mediante contraseñas.</para> <para>Veamos una cuenta administrativa típica:</para> <programlisting>foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting> <para>y cómo debería quedar:</para> <programlisting>foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting> <para>Este cambio evitará que se efectúen logins normales, ya que la contraseña cifrada nunca se corresponderá con <quote><literal>*</literal></quote>. Hecho esto, el personal de administración tendrá que usar otro mecanismo de validación como &man.kerberos.1; o &man.ssh.1; que use un par de llave pública/privada. Si decide usar algo como Kerberos tendrá que asegurar la máquina que ejecuta los servidores Kerberos y su estación de trabajo. Si usa un par de llave pública/privada con ssh, debe asegurar la máquina <emphasis>desde</emphasis> desde la que se hace el login (normalmente nuestra estación de trabajo). Puede añadir una capa adicional de protección al par de llaves protegiéndolas con contraseña al crearlo con &man.ssh-keygen.1;. El <quote>estrellado</quote> de las contraseñas administrativas también garantiza que dicho personal sólo pueda entrar a través de métodos de acceso que haya usted configurado. Así obligará al personal administrativo a usar conexiones seguras, cifradas, en todas sus sesiones, lo que cierra un importante agujero de seguridad al que recurren muchos intrusos: usar un sniffer (olfateador) de red desde una máquina que le permita hacer tal cosa.</para> <para>Los mecanismos de seguridad más indirectos también asumen que está validando su identidad desde un servidor más restrictivo un servidor menos restrictivo. Por ejemplo, si su máquina principal ejecuta toda clase de servidores su estación de trabajo no debe ejecutar ninguno. Para que su estación de trabajo sea razonablemente segura debe ejecutar los mínimos servidores posibles, si es posible ninguno, y debe usar un salvapantallas protegido por contraseña. Es evidente que un atancante con acceso físico al sistema puede romper cualquier barrera de seguridad que se disponga. Es un problema a tener en cuenta, pero la mayoría de las intrusiones tienen lugar de forma remota, a través de la red, por parte de gente que no tiene acceso físico a su estación de trabajo ni a sus servidores.</para> <indexterm><primary>KerberosIV</primary></indexterm> <para>Usar Kerberos le ofrece también el poder de deshabilitar o cambiar la contraseña para una cuenta administrativa en un lugar, y que tenga un efecto inmediato en todas las máquinas en las cuales ese administrador pueda tener una cuenta. Si una de esas cuentas se ve comprometida la posibilidad para cambiar instantáneamente su contraseña en todas las máquinas no debe ser desestimada. Con contraseñas distintas, el cambio de una contraseña en N máquinas puede ser un problema. También puede imponer restricciones de re-contraseñas con Kerberos: no sólo se puede hacer un ticket de Kerberos que expire después de un tiempo, sino que el sistema Kerberos puede requerir al usuario que escoja una nueva contraseña después de cierto tiempo (digamos una vez al mes).</para> </sect2> <sect2> <title>Asegurar servidores que se ejecutan como <username>root</username> y binarios SUID/SGID</title> <indexterm> <primary><command>ntalk</command></primary> </indexterm> <indexterm> <primary><command>comsat</command></primary> </indexterm> <indexterm> <primary><command>finger</command></primary> </indexterm> <indexterm> <primary>cajas de arena <quote>sandboxes</quote></primary> </indexterm> <indexterm> <primary><application>sshd</application></primary> </indexterm> <indexterm> <primary><application>telnetd</application></primary> </indexterm> <indexterm> <primary><application>rshd</application></primary> </indexterm> <indexterm> <primary><application>rlogind</application></primary> </indexterm> <para>Un administrador de sistemas prudente sólo ejecutará los servidores que necesita, ni uno más ni uno menos. Dese cuenta de que los servidores ajenos son los más propensos a contener errores. Por ejemplo, ejecutando una versión desfasada de <application>imapd</application> o <application>popper</application> es como dar una entrada universal de <username>root</username> al mundo entero. Nunca ejecute un servidor que no haya revisado cuidadosamente. Muchos servidores no necesitan ejecutarse como <username>root</username>. Por ejemplo, los dæmons <application>ntalk</application>, <application>comsat</application> y <application>finger</application> pueden ejecutarse en una <firstterm>caja de arena (sandbox)</firstterm> especial de usuario. Una caja de arena no es perfecta, a menos que pase por muchos problemas, pero la aproximación de cebolla a la seguridad prevalece aún y todo: Si alguien es capaz de penetrar a través de un servidor ejecutándose en una caja de arena, todavía tendrá que salir de la caja de arena. Cuantas más capas tenga que romper el atacante menor será la posibilidad de éxito que tenga. Se han encontrado vías de entrada a <username>root</username> en virtualmente todos los servidores que se haya ejecutado como <username>root</username>, incluyendo servidores básicos del sistema. Si está tiene una máquina a través de la cual la gente sólo entra por <application>sshd</application>, y nunca entra por <application>telnetd</application>, <application>rshd</application>, o <application>rlogind</application> <emphasis>apague esos servicios</emphasis>.</para> <para>&os; ejecuta por defecto <application>ntalkd</application>, <application>comsat</application> y <application>finger</application> en una caja de arena. Otro programa que puede ser candidato para ejecutarse en una caja de arena es &man.named.8;. <filename>/etc/defaults/rc.conf</filename> contiene las directrices necesarias (con comentarios) para usar <application>named</application> en una caja de arena. Dependiendo de si está instalando un nuevo sistema o actualizando un sistema ya existente, las cuentas especiales de usuario que usan estas cajas de arena puede que no estén instaladas. El administrador de sistemas prudente debe investigar e implementar cajas de arena para servidores siempre que sea posible.</para> <indexterm> <primary><application>sendmail</application></primary> </indexterm> <para>Existen numerosos servidores que no se suelen ejecutar en cajas de arena: <application>sendmail</application>, <application>imapd</application>, <application>ftpd</application>, y otros. Existen alternativas para algunos de ellos, pero instalarlas puede requerir más trabajo del que tal vez esté dispuesto a realizar (el factor comodidad ataca de nuevo). Tal vez tenga que ejecutar estos servidores como <username>root</username> y depender de otros mecanismos para detectar intrusiones que puedan tener lugar a través de ellos.</para> <para>Los otros grandes agujeros potenciales de <username>root</username> que encontramos en un sistema son los binarios suid-root y sgid. La mayoría de estos binarios, como <application>rlogin</application>, están en <filename>/bin</filename>, <filename>/sbin</filename>, <filename>/usr/bin</filename> o <filename>/usr/sbin</filename>. Aunque no hay nada absolutamente seguro los binarios suid y sgid del sistema por defecto pueden considerarse razonablemente seguros. Aún así, de vez en cuando aparecen agujeros <username>root</username> en estos binarios. En 1998 se encontró un agujero <username>root</username> en <literal>Xlib</literal>, que hacía a <application>xterm</application> (que suele ser suid) vulnerable. Es mejor prevenir que curar, y el administrador de sistemas prudente restringirá los binarios suid, que sólo el personal de administración debe ejecutar, a un grupo especial al que sólo dicho personal pueda acceder, y deshacerse de cualquier binario suid (<command>chmod 000</command>) que no se use. Un servidor sin pantalla generalmente no necesita un binario <application>xterm</application>. Los binarios sgid pueden ser igual de peligrosos. Si un intruso logra comprometer un binario sgid-kmem, el intruso podría leer <filename>/dev/kmem</filename> y llegar a leer el fichero cifrado de contraseñas, poniendo en compromiso potencial cualquier cuenta con contraseña. Por otra parte, un intruso que comprometa el grupo <literal>kmem</literal> puede monitorizar las pulsaciones de teclado que se envien a través de ptys, incluyendo las ptys a las que acceden usuarios que emplean métodos seguros. Un intruso que comprometa el grupo <groupname>tty</groupname> puede escribir en la pty de casi cualquier usuario. Si un usuario ejecuta un programa de terminal o un emulador capaz de simular un teclado, el intruso podría generar un flujo de datos que provoque que la terminal del usuario muestre una orden en pantalla, orden que el usuario ejecutará.</para> </sect2> <sect2 id="secure-users"> <title>Asegurar las cuentas de usuario</title> <para>Las cuentas de usuario suelen ser las más difíciles de asegurar. Aunque puede imponer restricciones de acceso draconianas a su personal administrativo y <quote>estrellar</quote> sus contraseñas, tal vez no pueda hacerlo con todas las cuentas de todos sus usuarios. Si mantiene el control en un grado suficiente quizás lo logre y sea capaz de hacer que las cuentas de sus usuarios sean seguras. Si no, tendrá que ser más cuidadoso (aún) en la monitorización de esas cuentas. Usar ssh y Kerberos en cuentas de usuario da más problemas debido al soporte técnico y administrativo que requerirá, pero sigue siendo mejor solución que un fichero de contraseñas cifradas.</para> </sect2> <sect2> <title>Asegurar el fichero de contraseñas</title> <para>La única manera segura es ponerle <literal>*</literal> a tantas contraseñas como sea posible y utilizar ssh o Kerberos para acceder a esas cuentas. Aunque el fichero cifrado de contraseñas (<filename>/etc/spwd.db</filename>) sólo puede ser legible para <username>root</username>, puede que un intruso consiga acceso de lectura a ese fichero, incluso sin haber alcanzado el acceso de escritura como root.</para> <para>Sus <quote>scripts</quote> de seguridad deben buscar siempre cambios en el fichero de contraseñas (consulte <link linkend="security-integrity">Revisión de integridad de ficheros</link> más abajo) e informar de ellos.</para> </sect2> <sect2> <title>Asegurar el Kernel, dispositivos en bruto y el sistema sistema de ficheros</title> <para>Si un atacante compromete <username>root</username> puede hacer cualquier cosa, pero hay ciertas cosas que puede usted preparar para <quote>curarse en salud</quote>. Por ejemplo, la mayoría de los kernel modernos tienen un dispositivo de los Kernels modernos tienen un integrado un dispositivo de paquetes. En &os; se llama <devicename>bpf</devicename>. Un intruso típico tratará de ejecutar un <quote>sniffer</quote> de paquetes en una máquina comprometida. No debería darle a ese intruso tal recurso, y la mayoría de los sistemas no necesitan el dispositivo <devicename>bpf</devicename>.</para> <indexterm> <primary><command>sysctl</command></primary> </indexterm> <para>Pero si desactiva el dispositivo <devicename>bpf</devicename> todavía tendrá que preocuparse por <filename>/dev/mem</filename> y <filename>/dev/kmem</filename>. Desde ellos el intruso podría en dispositivos de disco en bruto. También hay que tener muy en cuenta una opción del kernel llamada cargador de módulos, &man.kldload.8;. Un intruso con iniciativa puede usar un módulo KLD para instalar su propio dispositivo <devicename>bpf</devicename>, u otro dispositivo que le permita el <quote>sniffing</quote> en un kernel en ejecución. Para prevenir estos problemas debe ejecutar el kernel en un nivel de seguridad mayor, al menos en securelevel 1. Puede configurar el securelevel mediante una <command>sysctl</command> en la variable <varname>kern.securelevel</varname>. Una vez que tiene su securelevel a 1, los accesos de escritura a dispositivos en bruto se denegarán y se impondrán las banderas especiales <literal>schg</literal>. También debe cerciorarse de activar la bandera <literal>schg</literal> en binarios críticos para el arranque, directorios y scripts (dicho de otro modo, todo aquello que se ejecuta <emphasis>antes</emphasis> de que se active el securelevel). Puede ser que todo esto sea una exageración, sobre todo teniendo en cuenta que la actualización del sistema se complica bastante a medida que se incrementa el nivel de seguridad. Puede ejecutar el sistema a un nivel de seguridad superior pero no activar la bandera <literal>schg</literal> en cada fichero y directorio del sistema. Otra posibilidad es montar <filename>/</filename> y <filename>/usr</filename> como sólo lectura. Recuerde que siendo demasiado draconiano en aquello que busca proteger puede dificultar mucho la detección de una intrusión.</para> </sect2> <sect2 id="security-integrity"> <title>Revisión de integridad de ficheros: binarios, ficheros de configuración, etc.</title> <para>Cuando se piensa de proteccón, sólo se puede proteger la configuración central del sistema y los ficheros de control hasta el momento en el que el factor comodidad salta a la palestra. Por ejemplo, si usa <command>chflags</command> para activar el bit <literal>schg</literal> en la mayoría de los ficheros de <filename>/</filename> y <filename>/usr</filename> probablemente sea contraproducente; puede proteger los ficheros haciéndolo, pero también cierra una vía de detección. La última capa de su modelo de seguridad tipo cebolla es quizás la más importante: la detección. El resto de su estructura de seguridad será inútil (o peor aún, le proporcionará un sentimiento de seguridad totalmente infundado) si no puede detectar posibles intrusiones. La mitad del trabajo de la cebolla es alentar al atacante, en lugar de detenerlo, para darle a la parte de la ecuación de detección una oportunidad de atraparlo con las manos en la masa.</para> <para>La mejor manera de detectar una intrusión es buscar ficheros modificados, perdidos, o cuya presencia o estado sea inesperado. La mejor forma de buscar ficheros modificados es desde otro sistema (que muchas veces es centralizado) con acceso restringido. Escribir sus <quote>scripts</quote> de seguridad en un sistema <quote>extraseguro</quote> y con acceso restringido los hace casi invisibles a posibles atacantes, y esto es algo muy importante. potenciales, y esto es importante. Para poderle sacar el máximo partido debe proporcionar a esa máquina con acceso restringido un acceso preferente al contenido de las otras máquinas de su entorno; suele hacerse mediante la importación vía NFS de sólo lectura de las demás máquinas, o configurando pares de llaves ssh para acceder a las otras máquinas desde la que tiene el acceso restringido. Si exceptuamos el tráfico de red, NFS es el método menos visible y le permite monitorizar los sistemas de ficheros de cada máquina cliente de forma prácticamente indetectable. Si su servidor de acceso restringido está conectado a las máquinas clientes a través de un concentrador o a través de varias capas de encaminamiento el método NFS puede ser muy inseguro, por lo que ssh puede ser la mejor opción, incluso con las huellas de auditoría que ssh va dejando.</para> <para>Una vez que le da a una máquina de acceso restringido (al menos) acceso de lectura a los sistemas cliente que va a monitorizar, tendrá que escribir <quote>scripts</quote> para efectuar la monitorización. Si va a usar un montaje NFS puede escribir <quote>scripts</quote> utilizando simples herramientas del sistema como &man.find.1; y &man.md5.1;. Es aconsejable ejecutar MD5 físicamente en los ficheros de las máquinas cliente al menos una vez al día, y comprobar los ficheros de control (los que hay en <filename>/etc</filename> y <filename>/usr/local/etc</filename>) con una frecuencia incluso mayor. Si aparecen discrepancias al compararlos con la información basada en MD5 que la máquina de acceso restringido usa como base debe hacer una comprobación inmediata y profunda. Un buen <quote>script</quote> también debe buscar binarios que sean suid sin razón aparente, y ficheros nuevos o borrados en particiones del sistema como <filename>/</filename> y <filename>/usr</filename>.</para> <para>Si usa ssh en lugar de NFS será mucho más complicado escribir el <quote>script</quote> de seguridad. En esencia, tiene que pasar por <command>scp</command> los <quote>scripts</quote> a la máquina cliente para poder ejecutarlos, haciéndolos visibles; por seguridad, también tendrá que pasar vía <command>scp</command> los binarios (por ejemplo find) que utilizan dichos <quote>scripts</quote>. El cliente <application>ssh</application> de la máquina cliente puede estar ya bajo el control del intruso. Con todo y con eso, puede ser necesario usar ssh si trabaja sobre enlaces inseguros, también es mucho más difícil de manejar.</para> <para>Un buen <quote>script</quote> de seguridad buscará también cambios en la configuración de los ficheros de acceso de usuarios y miembros del personal de administración: <filename>.rhosts</filename>, <filename>.shosts</filename>, <filename>.ssh/authorized_keys</filename>, etc; en resumen, ficheros fuera del rango de revisión <literal>MD5</literal>.</para> <para>Si tiene que vérselas con una cantidad enorme de espacio en disco para usuarios le llevará mucho tiempo recorrer cada fichero de cada partición. En su caso sería una buena idea configurar mediante opciones de montaje la deshabilitación de binarios y dispositivos suid en esas particiones. Revise las opciones <literal>nodev</literal> y <literal>nosuid</literal> de &man.mount.8;. Debería comprobarlos de todas maneras al menos una vez por semana, ya que el objeto de esta capa es detectar intrusiones, efectivas o no.</para> <para>La contabilidad de procesos (vea &man.accton.8;) es una opción con una carga relativamente ligera para el sistema operativo, y puede ayudarle como mecanismo de evaluación tras una intrusión. Es especialmente útil para rastrear cómo consiguión realmente acceder el intruso al sistema (asumiendo que el fichero esté intacto después de la intrusión).</para> <para>Los <quote>scripts</quote> de seguridad deben procesar los logs, y los propios logs deben generarse de la forma más segura posible: un syslog remoto puede ser muy útil. Un intruso trata de cubrir sus huellas, los logs son un recurso crítico cuando el administrador de sistemas intenta determinar la hora y el método de la intrusión inicial. La ejecución de la consola del sistema en un puerto serie y recolectar la información de forma periódica en una máquina segura de monitorización de consolas es una forma de cumplir esta tarea.</para> </sect2> <sect2> <title>Paranoia</title> <para>Un poco de paranoia nunca está de más. Como norma, un administrador de sistemas puede añadir cualquier tipo de mecanismo de seguridad siempre y cuando no afecte a la comodidad, y puede añadir mecanismos de seguridad que <emphasis>sí</emphasis> afecten a la comodidad si tiene una buena razón para hacerlo. Más aún, un administrador de seguridad debe mezclar un poco de ambas cosas: si sigue al pie de la letra las recomendaciones que se dan en este documento también está sirviendo en bandeja de plata al posible atancante su metodología. Ese posible atacante también tiene acceso a este documento.</para> </sect2> <sect2> <title>Ataques de denegación de servicio</title> <indexterm><primary>Ataques de denegación de servicio (DoS)</primary></indexterm> <para>Esta sección cubre ataques de denegación de servicio. Un ataque DoS suele consistir en un ataque mediante paquetes. NO hay mucho que pueda hacerse contra un ataque mediante paquetes falsificados (<quote>spoofed</quote>) que busque saturar su red, pero puede limitar el daño asegurándose de que los ataques no tiren sus servidores.</para> <orderedlist> <listitem> <para>Limitación de forks en el servidor.</para> </listitem> <listitem> <para>Limitación de ataques <quote>springboard</quote> (ataques de respuesta ICMP, ping broadcast, etc.)</para> </listitem> <listitem> <para>Caché de rutas del kernel.</para> </listitem> </orderedlist> <para>Un típico ataque DoS contra un servidor con instancias (forks) sería tratar de provocar que el servidor consuma procesos, descriptores de fichero y memoria hasta tirar la máquina. <application>inetd</application> (consulte &man.inetd.8;) dispone de varias opciones para limitar este tipo de ataque. Recuerde que aunque es posible evitar que una máquina caiga, generalmente no es posible evitar que un servicio sea vea interrumpido a causa el ataque. Consulte la página de manual de <application>inetd</application> atentamente y sobre todo estudie las las opciones <option>-c</option>, <option>-C</option>, y <option>-R</option>. Observe que los ataques con direcciones IP falsificadas sortearán la opción <option>-C</option> de <application>inetd</application>, así que debe usar una combinación de opciones. Algunos servidores autónomos (<quote>standalone</quote>) cuentan con parámetros de autolimitación de instancias.</para> <para><application>Sendmail</application> tiene la opción <option>-OMaxDaemonChildren</option>, que tiende a funcionar mucho mejor que las opciones de límite de carga de sendmail debido al retraso que provoca la carga. Debe especificar un parámetro <literal>MaxDaemonChildren</literal> al inicio de <application>sendmail</application> que sea lo suficientemente alto como para gestionar la carga esperada, pero no tan alto que la computadora no pueda absorber tal número de <application>sendmails</application> sin caerse de boca. También es prudente ejecutar sendmail en modo de cola (<option>-ODeliveryMode=queued</option>) y ejecutar el dæmon (<command>sendmail -bd</command>) de manera independiente de las ejecuciones de cola (<command>sendmail -q15m</command>). Si a pesar de todo necesita entregas en tiempo real puede ejecutar la cola a un intervalo menor, como <option>-q1m</option>, pero asegúrese de especificar una opción <literal>MaxDaemonChildren</literal> razonable para <emphasis>ese</emphasis> sendmail y así evitar fallos en cascada.</para> <para><application>Syslogd</application> puede recibir ataques directos y se recomienda encarecidamente que utilice la opción <option>-s</option> siempre que sea posible, y si no la opción <option>-a</option>.</para> <para>También debe ser extremadamente cuidadoso con servicios de conexión inversa como el ident inverso de <application>TCP Wrapper</application>, que puede recibir ataques directos. No se suele usar el ident inverso de <application>TCP Wrapper</application> por esa misma razón.</para> <para>Es una muy buena idea proteger los servicios internos de acceso externo protegiéndolos vía con un cortafuegos en los routers de frontera. La idea es prevenir ataques de saturación desde el exterior de la LAN, y no tanto para proteger servicios internos de compromisos <username>root</username> basados en red. Configure siempre un cortafuegos exclusivo, esto es, <quote>restringir todo <emphasis>menos</emphasis> los puertos A, B, C, D y M-Z</quote>. De esta manera restringirá todos sus puertos con números bajos excepto ciertos servicios específicos como <application>named</application> (si es el servidor primario de una zona), <application>ntalkd</application>, <application>sendmail</application>, y otros servicios accesibles desde Internet. Si configura el cortafuegos de la otra manera (como un cortafuegos inclusivo o permisivo), tiene grandes posibilidades de que olvide <quote>cerrar</quote> un par de servicios, o de que agregue un nuevo servicio interno y olvide actualizar el cortafuegos. Puede incluso abrir el rango de números de puerto altos en el cortafuegos para permitir operaciones de tipo permisivo sin comprometer sus puertos bajos. Recuerde también que &os; le permite controlar el rango de números de puerto utilizados para asignación dinámica a través de las numerosas <varname>net.inet.ip.portrange</varname> de <command>sysctl</command> (<command>sysctl -a | fgrep portrange</command>), lo cual también facilita la complejidad de la configuración de su cortafuegos. Por ejemplo, puede utilizar un rango normal primero/último de 4000 ó 5000, y un rango de puerto alto de 49152 a 65535; bloquée todo por debajo de 4000 (excepto para ciertos puertos específicos accesibles desde Internet, por supuesto).</para> <indexterm><primary>ICMP_BANDLIM</primary></indexterm> <para>Otro ataque DoS común es llamado ataque <quote>springboard</quote>: atacar un servidor de forma que genere respuestas que lo sobrecarguen, sobrecarguen la red local o alguna otra máquina. Los ataques más comunes de este tipo son los <emphasis>ataques ICMP ping broadcast</emphasis>. El atacante falsifica paquetes ping enviados a la dirección broadcast de su LAN simulando que la dirección IP origen es la de la máquina que desean atacar. Si sus routers de frontera no están configurados para lidiar con pings a direcciones de broadcast su LAN termina generando suficientes respuestas a la dirección origen falsificada como para saturar a la víctima, especialmente cuando el atacante utiliza el mismo truco en varias docenas de direcciones broadcast en varias docenas de redes diferentes a la vez. Se han medido ataques de broadcast de más de ciento veinte megabits. Un segundo tipo de ataque <quote>springboard</quote> bastante común se da contra el sistema de informe de error de ICMP. Un atacante puede saturar la conexión entrante de red de un servidor mediante la construcción de paquetes que generen respuestas de error ICMP, provocando que el servidor sature su conexión saliente de red con respuestas ICMP. Este tipo de ataque también puede tumbar el servidor agotando sus <quote>mbufs</quote>, especialmente si el servidor no puede drenar lo suficientemente rápido las respuestas ICMP que genera. El kernel de &os; tiene una opción de compilación llamada <option>ICMP_BANDLIM</option>, que limita la efectividad de este tipo de ataques. La última gran categoría de ataques <quote>springboard</quote> está relacionada con ciertos servicios de <application>inetd</application>, como el servicio de eco udp. El atacante simplemente imita un paquete UDP con el puerdo de eco del servidor A como dirección de origen, y el puerto eco del servidor B como dirección de destino, estando ambos servidores en la misma LAN. Un atacante puede sobrecargar ambos servidores y la propia LAN inyectando simplemente un par de paquetes. Existen problemas similares con el puerto <application>chargen</application>. Un administrador de sistemas competente apagará todos estos servicios internos de verificación de inetd.</para> <para>Los ataques con paquetes falsificados pueden utilizarse también para sobrecargar la caché de rutas del kernel. Consulte los parámetros de <command>sysctl</command> <varname>net.inet.ip.rtexpire</varname>, <varname>rtminexpire</varname>, y <varname>rtmaxcache</varname>. Un ataque de paquetes falsificados que utiliza una dirección IP origen aleatoria provocará que el kernel genere una ruta temporal en caché en su tabla de rutas, visible con <command>netstat -rna | fgrep W3</command>. Estas rutas suelen expiran en 1600 segundos más o menos. Si el kernel detecta que la tabla de rutas en caché es ya demasiado grande reducirá dinámicamente <varname>rtexpire</varname>, pero nunca la reducirá a un valor que sea menor que <varname>rtminexpire</varname>. Esto nos presenta dos problemas:</para> <orderedlist> <listitem> <para>El kernel no reacciona con suficiente rapidez cuando un servidor ligeramente cargado es atacado.</para> </listitem> <listitem> <para>El <varname>rtminexpire</varname> no es lo suficientemente bajo para que el kernel sobreviva a un ataque sostenido.</para> </listitem> </orderedlist> <para>Si sus servidores están conectados a Internet mediante mediante una línea T3 o superior puede ser prudente corregir manualmente <varname>rtexpire</varname> y <varname>rtminexpire</varname> por medio de &man.sysctl.8;. Nunca ponga ambos parámetros a cero (a menos que desée estrellar la máquina). Configurar ambos parámetros a 2 segundos debería bastar para proteger de ataques la tabla de rutas.</para> </sect2> <sect2> <title>Otros aspectos del acceso con Kerberos y SSH</title> <indexterm><primary><command>ssh</command></primary></indexterm> <indexterm><primary>KerberosIV</primary></indexterm> <para>Existen un par de detalles con respecto a Kerberos y ssh que debe analizar sy pretende usarlos. Kerberos V es un excelente protocolo de protocolo de autentificación, pero hay errores en la versión kerberizada de <application>telnet</application> y <application>rlogin</application> que las hacen inapropiadas para gestionar flujos binarios. Ademé Kerberos no cifra por defecto una sesión a menos que utilice la opción <option>-x</option>. <application>ssh</application> cifra todo por defecto.</para> <para>ssh funciona bastante bien en todos los casos, con la sola salvedad de que por defecto reenvía llaves de cifrado. Esto significa que si usted tiene una estación de trabajo segura, que contiene llaves que le dan acceso al resto del sistema, y hace ssh a una máquina insegura, sus llaves se pueden utilizar. Las llaves en sí no se exponen, pero ssh crea un puerto de reenvío durante el login, y si un atacante ha comprometido el <username>root</username> de la máquina insegura, puede utilizar ese puerto para usar sus llaves y obtener acceso a cualquier otra máquina que sus llaves abran.</para> <para>Le recomendamos que, siempre que sea posible, use ssh combinado con Kerberos en los login de su personal de administración. para logins de staff. Puede compilar <application>ssh</application> con soporte de Kerberos. Esto reducirá su dependencia de llaves ssh expuestas, al mismo tiempo que protege las contraseñas vía Kerberos. Las llaves ssh deben usarse sólamente para tareas automáticas desde máquinas seguras (algo que Kerberos no hace por incompatibilidad). Recomendamos también que desactive el reenvío de llaves en la configuración de ssh, o que use la opción <literal>from=IP/DOMAIN</literal> que ssh incluye en <filename>authorized_keys</filename>; así la llave sólo podrá ser utilizada por entidades que se validen desde máquinas específicas.</para> </sect2> </sect1> <sect1 id="crypt"> <sect1info> <authorgroup> <author> <firstname>Bill</firstname> <surname>Swingle</surname> <contrib>Secciones reescritas y actualizadas por </contrib> </author> </authorgroup> <!-- 21 Mar 2000 --> </sect1info> <title>DES, MD5 y Crypt</title> <indexterm> <primary>seguridad</primary> <secondary>crypt</secondary> </indexterm> <indexterm><primary>crypt</primary></indexterm> <indexterm><primary>DES</primary></indexterm> <indexterm><primary>MD5</primary></indexterm> <para>Cada usuario de un sistema &unix; tiene una contraseña asociada a su cuenta. Parece obvio que estas contraseñas sólo deben ser conocidas por el usuario y por el sistema operativo. Para que estas contraseñas permanezcan en secreto se cifran con lo que se conoce como un <quote>hash de una pasada</quote>, esto es, sólo pueden ser fácilmente cifradas pero no descifradas. En otras palabras, lo que acabamos de decir es tan obvio que ni siguiera es verdad: el propio sistema operativo no sabe cuál es <emphasis>realmente</emphasis> la contraseña. Lo único que conoce es la versión <emphasis>cifrada</emphasis> de la contrasenña. La única manera de obtener la contraseña en <quote>texto plano</quote> es por medio de una búsqueda de fuerza bruta en el espacio de contraseñas posibles.</para> <para>Por desgracia la única manera segura de cifrar contraseñas cuando &unix; empezó a hacerlo estaba basada en DES, (<quote>Data Encryption Standard</quote>, <quote>estándar de cifrado de datos</quote>). Esto no era un gran problema para usuarios residentes en los EEUU, pero el código fuente de &os; no se podía exportar desde los EEUU, así que &os; hubo de buscar una forma de complir las leyes de EEUU y al mismo tiempo mantener la compatibilidad con otras variantes de &unix; que que todavía utilizaban DES.</para> <para>La solución fué dividir las bibliotecas de cifrado para que los usuarios de EEUU pudieran instalar las bibliotecas DES pero los usuarios del resto del mundo tuvieran un método de cifrado que pudiera ser exportado. Así es como &os; comenzó a usar MD5 como su método de cifrado por defecto. MD5 se considera más seguro que DES, así que se mantiene la opción de poder instalar DES por motivos de compatibilidad.</para> <sect2> <title>Cómo reconocer su mecanismo de cifrado</title> <para>En versiones anteriores a &os; 4.4 <filename>libcrypt.a</filename> era un enlace simbólico que apuntaba a la biblioteca que se usaba para el cifrado. En &os; 4.4 se cambió <filename>libcrypt.a</filename> para ofrecer una biblioteca hash configurable de validación de contraseñas. Actualmente la biblioteca permite funciones hash DES, MD5 y Blowfish. &os; utiliza por defecto MD5 para cifrar contraseñas.</para> <para>Es muy sencillo identificar qué método usa &os; para cifrar. Una forma es examinando las contraseñas cifradas en <filename>/etc/master.passwd</filename>. Las contraseñas cifradas con el hash MD5 son más largas que las cifradas con el hash DES, y también comienzan por los caracteres <literal>$1$</literal>. Las contraseñas que comienzan por <literal>$2a$</literal> están cifradas con la función hash de Blowfish. Las contraseñas DES no tienen ninguna característica particular, pero son más cortas que las contraseñas MD5, y están codificadas en un alfabeto de 64 caracteres que no incluye el caracter <literal>$</literal>; es por esto que una cadena relativamente corta que comience con un signo de dólar es muy probablemente una contraseña DES.</para> <para>El formato de contraseña a usar en nuevas contraseñas se define en <filename>/etc/login.conf</filename> mediante <literal>passwd_format</literal>, pudiendo tener los valores <literal>des</literal>, <literal>md5</literal> o <literal>blf</literal>. Consulte la página de manual &man.login.conf.5; para más información.</para> </sect2> </sect1> <sect1 id="one-time-passwords"> <title>Contraseñas de un solo uso</title> <indexterm><primary>Contraseñas de un solo uso</primary></indexterm> <indexterm> <primary>seguridad</primary> <secondary>Contraseñas de un solo uso</secondary> </indexterm> <para>S/Key es un esquema de contraseña de un solo uso basado en una función de hash de sentido único. &os; utiliza el hash MD4 por compatibilidad, pero otros sistemas usan MD5 y DES-MAC. S/Key forma parte del sistema base de &os; desde la versión 1.1.5 y se usa también en un número creciente de otros sistemas operativos. S/Key es una marca registrada de Bell Communications Research, Inc.</para> <para>A partir de la versión 5.0 de &os; S/Key fué reemplazado por su equivalente OPIE (<quote>One-time Passwords In Everything</quote>, <quote>Contraseñas de un solo uso para todo</quote>). OPIE usa por defecto hash MD5.</para> <para>En esta sección se explican tres tipos de contraseña. La primera es la típica contraseña al estilo &unix; o Kerberos; las llamaremos <quote>contraseñas &unix;</quote>. El segundo tipo es la contraseña de un solo uso, que se genera con el programa <command>key</command> de S/Key o con &man.opiekey.1; de OPIE, y que aceptan los programas <command>keyinit</command>, &man.opiepasswd.1;, y el prompt de login; llamaremos a esta una <quote>contraseña de un solo uso</quote>. El último tipo de contraseña es la contraseña secreta que le da usted a los programas <command>key</command>/<command>opiekey</command> (y a veces <command>keyinit</command>/<command>opiepasswd</command>), que se usa para generar contraseñas de un solo uso; a estas las llamaremos <quote>contraseñas secretas</quote>, o simplemente <quote>contraseña</quote>.</para> <para>La contraseña secreta no tiene nada que ver con su contraseña &unix;; pueden ser la misma, pero no es recomendable. Las contraseñas secretas S/Key y OPIE no están limitadas a 8 caracteres como las contraseñas &unix; antiguas<footnote><para>En &os; la contraseña del login estándar puede ser de hasta 128 caracteres de longitud.</para></footnote>, pueden ser tan largas como se quiera. Las contraseñas con frases de seis o siete palabras muy largas son bastante comunes. El funcionamiento del sistema S/Key o el OPIE es en gran parte completamente independiente del sistema de contraseñas &unix;.</para> <para>Además de la contraseña hay dos datos que son importantes para S/Key y OPIE. Uno es lo que se conoce como <quote>semilla</quote> o <quote>llave</quote>, que consiste en dos letras y cinco dígitos. El otro dato importante se llama la <quote>cuenta de iteración</quote>, que es un número entre 1 y 100. S/Key genera la contraseña de un solo uso concatenando la semilla y la contraseña secreta, aplica el hash MD4/MD5 tantas veces como especifique la cuenta de iteración y convierte el resultado en seis palabras cortas en inglés. Estas seis palabras en inglés son su contraseña de un solo uso. El sistema de autentificación (principalmente PAM) mantiene un registro del uso de contraseñas de un solo uso, y el usuario puede validarse si el hash de la contraseña que proporciona es igual a la contraseña previa. Como se utiliza un hash de sentido único es imposible generar futuras contraseñas de un solo uso si una contraseña que ya ha sido usada fuera capturada; la cuenta de iteración se reduce después de cada login correcto para sincronizar al usuario con el programa login. Cuanto la iteración llega a 1, S/Key y OPIE deben reinicializar.</para> <para>Hay tres programas involucrados en cada uno de estos sistemas. Los programas <command>key</command> y <command>opiekey</command> aceptan una cuenta iterativa, una semilla y una contraseña secreta, y generan una contraseña de un solo uso o una lista consecutiva de contraseñas de un solo uso. Los programas <command>keyinit</command> y <command>opiepasswd</command> se usan respectivamente para inicializar S/Key y OPIE, y para cambiar contraseñas, cuentas iterativas o semillas; toman ya sea una frase secreta, o una cuenta iterativa y una contraseña de un solo uso. Los programas <command>keyinfo</command> y <command>opieinfo</command> examinan los ficheros de credenciales correspondientes (<filename>/etc/skeykeys</filename> o <filename>/etc/opiekeys</filename>) e imprimen la cuenta iterativa y semilla del usuario invocante.</para> <para>Explicaremos cuatro tipos de operaciones diferentes. La primera es usar <command>keyinit</command> o <command>opiepasswd</command> a través de una conexión segura para configurar contraseñas de un solo uso por primera vez, o para cambiar su contraseña o semilla. La segunda operación es utilizar <command>keyinit</command> o <command>opiepasswd</command> a través de una conexión insegura, además de usar <command>key</command> u <command>opiekey</command> sobre una conexión segura para hacer lo mismo. La tercera es usar <command>key</command>/<command>opiekey</command> para conectarse a través de una conexión insegura. La cuarta es usar <command>opiekey</command> o <command>key</command> para generar numerosas llaves, que pueden ser escritas para llevarlas con usted al ir a algún lugar desde el que no se puedan hacer conexiones seguras a ningún sitio.</para> <sect2> <title>Inicialización de conexiones seguras</title> <para>Para inicializar S/Key por primera vez cambie su contraseña, o cambie su semilla mientras está conectado a través de una conexión segura (esto es, en la consola de una máquina o vía <application>ssh</application>); use <command>keyinit</command> sin ningún parámetro:</para> <screen>&prompt.user; <userinput>keyinit</userinput> Adding unfurl: Reminder - Only use this method if you are directly connected. If you are using telnet or rlogin exit with no password and use keyinit -s. Enter secret password: Again secret password: ID unfurl s/key is 99 to17757 DEFY CLUB PRO NASH LACE SOFT</screen> <para>En OPIE se utiliza <command>opiepasswd</command>:</para> <screen>&prompt.user; <userinput>opiepasswd -c</userinput> [grimreaper] ~ $ opiepasswd -f -c Adding unfurl: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type ^C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID unfurl OTP key is 499 to4268 MOS MALL GOAT ARM AVID COED </screen> <para>En <prompt>Enter new secret pass phrase:</prompt> o <prompt>Enter secret password:</prompt>, debe introducir una contraseña o frase. Recuerde que no es la contraseña que utilizará para entrar, se usará para generar sus llaves de un solo uso. La línea <quote>ID</quote> da los parámetros de su instancia en particular: su nombre de login, la cuenta iterativa y semilla. En el momento del login el sistema recordará estos parámetros y los presentará de nuevo para que no tenga que recordarlos. La última línea proporciona las contraseéas de un solo uso que corresponden a esos parámetros y su contraseña secreta; si fuera a hacer login de manera inmediata, debería usar esta contraseña de una sola vez.</para> </sect2> <sect2> <title>Inicialización de conexiones inseguras</title> <para>Para inicializar o cambiar su contraseña secreta a través de una conexión insegura, necesitará tener alguna conexión segura a algún lugar donde pueda ejecutar <command>key</command> u <command>opiekey</command>; puede ser gracias a un accesorio de escritorio o en una &macintosh;, o un prompt de shell en una máquina en la que confíe. Necesitará también una cuenta iterativa (100 probablemente sea un buen valor), y puede usar su propia semilla, o usar una generada aleatoriamente. Siguiendo con la conexión insegura (hacia la máquina que está inicializando), ejecute <command>keyinit -s</command>:</para> <screen>&prompt.user; <userinput>keyinit -s</userinput> Updating unfurl: Old key: to17758 Reminder you need the 6 English words from the key command. Enter sequence count from 1 to 9999: <userinput>100</userinput> Enter new key [default to17759]: s/key 100 to 17759 s/key access password: s/key access password:<userinput>CURE MIKE BANE HIM RACY GORE</userinput> </screen> <para>En OPIE debe usar <command>opiepasswd</command>:</para> <screen>&prompt.user; <userinput>opiepasswd</userinput> Updating unfurl: You need the response from an OTP generator. Old secret pass phrase: otp-md5 498 to4268 ext Response: GAME GAG WELT OUT DOWN CHAT New secret pass phrase: otp-md5 499 to4269 Response: LINE PAP MILK NELL BUOY TROY ID mark OTP key is 499 gr4269 LINE PAP MILK NELL BUOY TROY </screen> <para>Para aceptar la semilla por defecto (la que el programa <command>keyinit</command> llama <literal>key</literal>, <quote>llave</quote>, para terminar de complicar las cosas), pulse <keycap>Enter</keycap>. Antes de introducir una una contraseña de acceso cambie a su conexión o accesorio de escritorio S/Key y dele el mismo parámetro:</para> <screen>&prompt.user; <userinput>key 100 to17759</userinput> Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: <userinput><secret password></userinput> CURE MIKE BANE HIM RACY GORE</screen> <para>O para OPIE:</para> <screen>&prompt.user; <userinput>opiekey 498 to4268</userinput> Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT </screen> <para>Vuelva a la conexión insegura y copie la contraseña de un solo uso generada al programa que quiera usar.</para> </sect2> <sect2> <title>Generación una sola contraseña de un solo uso</title> <para>Una vez que ha inicializado S/Key u OPIE, cuando haga login verá un <quote>prompt</quote> parecido al siguiente:</para> <screen>&prompt.user; <userinput>telnet ejemplo.com</userinput> Trying 10.0.0.1... Connected to ejemplo.com Escape character is '^]'. FreeBSD/i386 (ejemplo.com) (ttypa) login: <userinput><username></userinput> s/key 97 fw13894 Password: </screen> <para>O, en el caso de OPIE:</para> <screen>&prompt.user; <userinput>telnet ejemplo.com</userinput> Trying 10.0.0.1... Connected to ejemplo.com Escape character is '^]'. FreeBSD/i386 (ejemplo.com) (ttypa) login: <userinput><nombre_de_usuario></userinput> otp-md5 498 gr4269 ext Password: </screen> <para>Como una nota aparte, el <quote>prompt</quote> de S/Key y OPIE cuenta con una opción útil (que no se muestra aquí): si pulsa <keycap>Enter</keycap> en el <quote>prompt</quote> de contraseña el <quote>prompt</quote> activará el eco para que pueda ver en pantalla lo que teclea. Esto puede ser extremadamente útil si está tecleando una contraseña a a mano o desde un la lista impresa.</para> <indexterm><primary>MS-DOS</primary></indexterm> <indexterm><primary>Windows</primary></indexterm> <indexterm><primary>MacOS</primary></indexterm> <para>Ahora necesitará generar su contraseña de un sólo uso para responder a este <quote>prompt</quote> de login. Debe hacerlo en un sistema digno de confianza y en el que pueda ejecutar <command>key</command> u <command>opiekey</command>. Existen versiones DOS, &windows; y también para &macos;. Ambos usarán la cuenta iterativa y la semilla como opciones de línea de órdenes. Puede cortarlas y pegarlas desde el <quote>prompt</quote> de login de la máquina en la que se está identificando.</para> <para>En el sistema de confianza:</para> <screen>&prompt.user; <userinput>key 97 fw13894</userinput> Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: WELD LIP ACTS ENDS ME HAAG</screen> <para>Con OPIE:</para> <screen>&prompt.user; <userinput>opiekey 498 to4268</userinput> Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT</screen> <para>Ahora que tiene su contraseña de un solo uso puede proceder con el login:</para> <screen>login: <userinput><nombre_de_usuario></userinput> s/key 97 fw13894 Password: <userinput><<keycap>Enter</keycap> para activar el eco></userinput> s/key 97 fw13894 Password [echo on]: WELD LIP ACTS ENDS ME HAAG Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ... </screen> </sect2> <sect2> <title>Generación de múltiples contraseñas de un solo uso</title> <para>A veces usted hay que ir a lugares donde no hay acceso a una máquina de fiar o a una conexión segura. En estos casos, puede utilizar <command>key</command> y <command>opiekey</command> para generar previamente numerosas contraseñas de un solo uso para, una vez impresas, llevárselas a donde hagan falta. Por ejemplo:</para> <screen>&prompt.user; <userinput>key -n 5 30 zz99999</userinput> Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: <userinput><secret password></userinput> 26: SODA RUDE LEA LIND BUDD SILT 27: JILT SPY DUTY GLOW COWL ROT 28: THEM OW COLA RUNT BONG SCOT 29: COT MASH BARR BRIM NAN FLAG 30: CAN KNEE CAST NAME FOLK BILK</screen> <para>O para OPIE:</para> <screen>&prompt.user; <userinput>opiekey -n 5 30 zz99999</userinput> Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: <userinput><secret password></userinput> 26: JOAN BORE FOSS DES NAY QUIT 27: LATE BIAS SLAY FOLK MUCH TRIG 28: SALT TIN ANTI LOON NEAL USE 29: RIO ODIN GO BYE FURY TIC 30: GREW JIVE SAN GIRD BOIL PHI</screen> <para>El <option>-n 5</option> pide cinco llaves en secuencia, la opción <option>30</option> especifica que ese debe ser el último número de iteración. Observe que se imprimen en el orden <emphasis>inverso</emphasis> de uso. Si es realmente paranoico escriba los resultados a mano; si no, puede enviar la salida a <command>lpr</command>. Observe que cada línea muestra la cuenta iterativa y la contraseña de un solo uso; puede ir tachando las contraseñas según las vaya utilizando.</para> </sect2> <sect2> <title>Restricción del uso de contraseñas &unix;</title> <para>S/Key puede implantar restricciones en el uso de contraseñas &unix; basándose en el nombre de equipo, nombre de usuario, puerto de terminal o dirección IP de una sesión de login. Consulte el fichero de configuración <filename>/etc/skey.access</filename>. La página de manual de &man.skey.access.5; contiene más información sobre el formato del fichero y detalla también algunas precauciones de seguridad que hay que tener en cuenta antes de basar nuestra seguridad en este fichero.</para> <para>Si <filename>/etc/skey.access</filename> no existiera (por defecto es así en sistemas &os; 4.X) todos los usuarios podrán disponer de contraseñas &unix;. Si el fichero existe se exigirá a todos los usuarios el uso de S/Key, a menos que se configure de otro modo en <filename>skey.access</filename>. En todos los casos las contraseñas &unix; son admiten en consola.</para> <para>Aquí hay un ejemplo del fichero de configuración <filename>skey.access</filename> que muestra las tres formas más comunes de configuración:</para> <programlisting>permit internet 192.168.0.0 255.255.0.0 permit user fnord permit port ttyd0</programlisting> <para>La primera línea (<literal>permit internet</literal>) permite a usuarios cuyas direcciones IP origen (las cuales son vulnerables a una falsificación) concuerden con los valores y máscara especificados utilizar contraseñas &unix;. Esto no debe usarse como mecanismo de seguridad, sino como medio de recordarle a los usuarios autorizados que están usando una red insegura y necesitan utilizar S/Key para la validación.</para> <para>La segunda línea (<literal>permit user</literal>) permite al nombre de usuario especificado, en este caso <username>fnord</username>, utilizar contraseñas &unix; en cualquier momento. Hablando en general, esto solo debe ser usado por gente que no puede usar el programa <command>key</command>, como aquellos con terminales tontas o refractarios al aprendizaje.</para> <para>La tercera línea (<literal>permit port</literal>) permite a todos los usuarios validados en la línea de terminal especificada utilizar contraseñas &unix;; esto puede usarse para usuarios que se conectan mediante <quote>dial-ups</quote>.</para> <para>OPIE puede restringir el uso de contraseñas &unix; basándose en la dirección IP de una sesión de login igual que lo haría S/Key. El fichero que gestiona esto es <filename>/etc/opieaccess</filename>, que está incluído por defecto en sistemas &os; 5.0 o posteriores. Revise &man.opieaccess.5; para más información sobre este fichero y qué consideraciones de seguridad debe tener presentes a la hora de usarlo.</para> <para>Veamos un ejemplo de <filename>opieaccess</filename>:</para> <programlisting>permit 192.168.0.0 255.255.0.0</programlisting> <para>Esta línea permite a usuarios cuya dirección IP de origen (vulnerable a falsificación) concuerde con los valores y máscara especificados, utilizar contraseñas &unix; en cualquier momento.</para> <para>Si no concuerda ninguna regla en <filename>opieaccess</filename> se niegan por defecto los logins no-OPIE.</para> </sect2> </sect1> <sect1 id="tcpwrappers"> <sect1info> <authorgroup> <author> <firstname>Tom</firstname> <surname>Rhodes</surname> <contrib>Escrito por: </contrib> </author> </authorgroup> </sect1info> <title>TCP Wrappers</title> <indexterm><primary>TCP Wrappers</primary></indexterm> <para>Cualquiera que esté familiarizado con &man.inetd.8; probablemente haya oído hablar de <acronym>TCP</acronym> Wrappers, pero poca gente parece comprender completamente su utilidad en un entorno de red. Parece que todos quieren instalar un cortafuegos para manejar conexiones de red. Aunque un cortafuegos tiene una amplia variedad de usos hay cosas que un cortafuegos no es capaz de gestionar, como el envío de texto como respuesta al creador de la conexión. El software <acronym>TCP</acronym> hace esto y más. En las siguientes secciones se explicarán unas cuantas opciones de <acronym>TCP</acronym> Wrappers y, cuando sea necesario, se mostrarán ejemplos de configuraciones.</para> <para>El software <acronym>TCP</acronym> Wrappers extiende las habilidades de <command>inetd</command> para ofrecer soporte para cada servidor dæmon bajo su control. Utilizando este método es posible proveer soporte de logs, devolver mensajes a conexiones, permitir a un dæmon aceptar solamente conexiones internas, etc. Aunque algunas de estas opciones pueden conseguirse gracias a un cortafuegos, no sólo añadirá una capa extra de seguridad, sino que irá más allá del nivel de control ue un cortafuegos puede ofrecerle.</para> <para>Las brillantes capacidades de <acronym>TCP</acronym> Wrappers no deben considerarse una alternativa a un buen cortafuegos. <acronym>TCP</acronym> Wrappers puede usarse conjuntamente con un cortafuegos u otro sistema de de seguridad, pues ofrece una capa extra de protección para el sistema.</para> <para>Ya que es una extensión de la configuración de <command>inetd</command>, se da por hecho que el lector ha leído la sección <link linkend="network-inetd">configuración de inetd</link>.</para> <note> <para>Aunque los programas ejecutados por &man.inetd.8; no son exactamente <quote>dæmons</quote> tradicionalmente han recibido ese nombre. Dæmon es, por tanto, el término que usaremos en esta sección.</para> </note> <sect2> <title>Configuración inicial</title> <para>El único requisito para usar <acronym>TCP</acronym> Wrappers en &os; es que el servidor <command>inetd</command> se inicie desde <filename>rc.conf</filename> con la opción <option>-Ww</option> (es la configuración por defecto). Por descontado, se presupone que <filename>/etc/hosts.allow</filename> estará correctamente configurado, pero &man.syslogd.8; enviará mensajes a los logs del sistema si no es así.</para> <note> <para>A diferencia de otras implementaciones de <acronym>TCP</acronym> Wrappers, se ha dejado de usar <filename>hosts.deny</filename>. Todas las opciones de configuración deben ir en <filename>/etc/hosts.allow</filename>.</para> </note> <para>En la configuración más simple las políticas de conexión de dæmons están configuradas ya sea a permitir o bloquear, dependiendo de las opciones en <filename>/etc/hosts.allow</filename>. La configuración por defecto en &os; consiste en permitir una conexión a cada dæmon iniciado por <command>inetd</command>. Es posible modificar esta configuración, pero explicaremos cómo hacerlo después de exponer la configuración básica.</para> <para>La configuración básica tiene la estructura <literal>dæmon : dirección : acción</literal>, donde <literal>dæmon</literal> es el nombre de dæmon que inicia <command>inetd</command>. La <literal>dirección</literal> puede ser un nombre de equipo válido, una dirección IP o IPv6 encerrada en corchetes ([ ]). El campo acción puede ser permitir o denegar para el dar el acceso apropiado. Tenga presente que la configuración funciona en base a la primera regla cuya semántica concuerde; esto significa que el fichero de configuración se lee en orden ascendente hasta que concuerde una regla. Cuando se encuentra una concordancia se aplica la regla y el proceso se detendrá.</para> <para>Existen muchas otras opciones pero estas se explican en una sección posterior. Una línea de configuración simple puede generarse mediante datos así de simples. Por ejemplo, para permitir conexiones <acronym>POP</acronym>3 mediante el dæmon <filename role="package">mail/qpopper</filename>, añada las siguientes líneas a <filename>hosts.allow</filename>:</para> <programlisting># This line is required for POP3 connections: qpopper : ALL : allow</programlisting> <para>Despues de añadir esta línea tendrá que reiniciar <command>inetd</command>. Use &man.kill.1; o use el parámetro <parameter>restart</parameter> de <filename>/etc/rc.d/inetd</filename>.</para> </sect2> <sect2> <title>Configuración avanzada</title> <para>Las opciones avanzadas de <acronym>TCP</acronym> Wrappers le permiten un mayor control sobre la gestión de conexiones. En algunos casos puede convenir el enío de un comentario a ciertos equipos o conexiones de dæmons. En otros casos, quizás se deba registrar una entrada en un log o enviar un correo al administrador. Otro tipo de situaciones pueden requerir el uso de un servicio solamente para conexiones locales. Todo esto es posible gracias al uso de unas opciones de configuración conocidas como <literal>comodines</literal>, caracteres de expansión y ejecución de órdenes externas. Las siguientes dos secciones intentarán cubrir estas situaciones.</para> <sect3> <title>Órdenes externas</title> <para>Imaginemos una situación en la que una conexión debe ser denegada pero se debe mandar un motivo a quien intentó establecer esa conexión. ?Cómo? Mediante la opción <option>twist</option>. Ante un intento de conexión se invoca a <option>twist</option>, que ejecuta una orden de shell o un <quote>script</quote>. Tiene un ejemplo en el fichero <filename>hosts.allow</filename>:</para> <programlisting># The rest of the daemons are protected. ALL : ALL \ : severity auth.info \ : twist /bin/echo "No se permite utilizar %d desde %h."</programlisting> <para>Este ejemplo muestra que el mensaje, <quote>No se permite utilizar <literal>dæmon</literal> desde <literal>nombre de equipo</literal>.</quote> se enviará en el caso de cualquier dæmon no configurado previamente en el fichero de acceso. Esto es extremadamente útil para enviar una respuesta al creador de la conexión justo después de que la conexión establecida es rechazada. Observe que cualquier mensaje que se desee enviar <emphasis>debe ir</emphasis> entre comillas <literal>"</literal>; esta regla no tiene excepciones.</para> <warning> <para> Es posible lanzar un ataque de denegación de servicio al servidor si un atacante o grupo de atacantes pueden llegar a sobrecargar estos dæmons con peticiones de conexión.</para> </warning> <para>Otra posibilidad en estos casos es usar la opción <option>spawn</option>. Igual que <option>twist</option>, <option>spawn</option> niega implícitamente la conexión, y puede usarse para ejecutar órdenes de shell externos o <quote>scripts</quote>. A diferencia de <option>twist</option>, <option>spawn</option> no enviará una respuesta al origen de la conexión. Veamos un ejemplo; observe la siguiente línea de configuración:</para> <programlisting># No permitimos conexiones desde ejemplo.com: ALL : .ejemplo.com \ : spawn (/bin/echo %a desde %h intento acceder a %d >> \ /var/log/connections.log) \ : deny</programlisting> <para>Esto denegará todos los intentos de conexión desde el dominio <hostid role="fqdn">*.ejemplo.com</hostid>; simultáneamente creará una entrada con el nombre del equipo, dirección <acronym>IP</acronym> y el dæmon al que intentó conectarse al fichero <filename>/var/log/connections.log</filename>.</para> <para>Además de la sustitución de caracteres ya expuesta más arriba (por ejemplo %a) existen unas cuantas más. Si quiere ver la lista completa consulte la página de manual &man.hosts.access.5;.</para> </sect3> <sect3> <title>Opciones comodín</title> <para>Hasta ahora se ha usado <literal>ALL</literal> en todos los ejemplos, pero hay otras opciones interesantes para extender un poco más la funcionalidad. Por ejemplo, <literal>ALL</literal> puede usarse para concordar con cualquier instancia ya sea un dæmon, dominio o dirección <acronym>IP</acronym>. Otro comodín es <literal>PARANOID</literal>, que puede utilizarse para concordar con cualquier equipo que presente una dirección <acronym>IP</acronym> que pueda estar falsificada. En otras palabras, <literal>paranoid</literal> puede usarse para definir una acción a tomar siempre que tenga lugar una conexión desde una dirección <acronym>IP</acronym> que difiera de su nombre de equipo. Quizás todo se vea más claro con el siguiente ejemplo:</para> <programlisting># Bloquear peticiones posiblemente falsificadas a sendmail: sendmail : PARANOID : deny</programlisting> <para>En ese ejemplo todas las peticiones de conexión a <command>sendmail</command> que tengan una dirección <acronym>IP</acronym> que varíe de su nombre de equipo serán denegadas.</para> <caution> <para>Utilizando <literal>PARANOID</literal> puede bloquear el acceso a servidores si el cliente o el servidor tiene una configuración de <acronym>DNS</acronym> incorrecta. Recomendamos al administrador la máxima cautela en su uso.</para> </caution> <para>Consulte &man.hosts.access.5; si quiere saber más sobre los comodines y sus posibilidades de uso.</para> <para>Si quiere que cualquiera de los ejemplos citados funcione debe comentar la primera línea de <filename>hosts.allow</filename> (tal y como se dijo al principio de la sección.</para> </sect3> </sect2> </sect1> <sect1 id="kerberosIV"> <sect1info> <authorgroup> <author> <firstname>Mark</firstname> <surname>Murray</surname> <contrib>Escrito por </contrib> </author> </authorgroup> <authorgroup> <author> <firstname>Mark</firstname> <surname>Dapoz</surname> <contrib>Basado en un texto de </contrib> </author> </authorgroup> </sect1info> <title><application>KerberosIV</application></title> <para>Kerberos es un sistema/protocolo de red agregado que permite a los usuarios identificarse a través de los servicios de un servidor seguro. Los servicios como login remoto, copia remota, copias de ficheros de un sistema a otro y otras tantas tareas arriesgadas pasan a ser considerablemente seguras y más controlables.</para> <para>Las siguientes instrucciones pueden usarse como una guía para configurar Kerberos tal y como se distribuye con &os;. De todas maneras, debe consultar diversas páginas de manual para conocer todos los detalles.</para> <sect2> <title>Instalación de <application>KerberosIV</application></title> <indexterm><primary>MIT</primary></indexterm> <indexterm> <primary>KerberosIV</primary> <secondary>instalación</secondary> </indexterm> <para>Kerberos es un componente opcional de &os;. La manera más fácil de instalar este software es seleccionando la distribución <literal>krb4</literal> o <literal>krb5</literal> en <application>sysinstall</application> durante la instalación inicial de &os;. Desde ahí instalará la implementación de Kerberos <quote>eBones</quote> (KerberosIV) o <quote>Heimdal</quote> (Kerberos5). Estas implementaciones se incluyen porque a que han sido desarrolladas fuera de EEUU y Canadá, lo que las convertía en accesibles para administradores de sistemas del resto del mundo durante la época restrictiva de control control de exportaciones de código criptográfico desde EEUU.</para> <para>También puede instalar la implementación de Kerberos del MIT desde la colección de ports (<filename role="package">security/krb5</filename>).</para> </sect2> <sect2> <title>Creación de la base de datos inicial</title> <para>Esto solo debe hacerse en el servidor Kerberos. Lo primero es asegurarse de que no tiene bases de datos de Kerberos anteriores. Entre al directorio <filename>/etc/kerberosIV</filename> y asegúrese de que solo estén los siguientes ficheros:</para> <screen>&prompt.root; <userinput>cd /etc/kerberosIV</userinput> &prompt.root; <userinput>ls</userinput> README krb.conf krb.realms</screen> <para>Si existe cualquier otro fichero (como <filename>principal.*</filename> o <filename>master_key</filename>) utilice <command>kdb_destroy</command> para destruir la base de datos antigua de Kerberos. Si Kerberos no está funcionando simplemente borre los ficheros sobrantes.</para> <para>Edite <filename>krb.conf</filename> y <filename>krb.realms</filename> para definir su dominio Kerberos. En nuestro ejemplo el dominio será <literal>EJEMPLO.COM</literal> y el servidor es <hostid role="fqdn">grunt.ejemplo.com</hostid>. Editamos o creamos <filename>krb.conf</filename>:</para> <screen>&prompt.root; <userinput>cat krb.conf</userinput> EJEMPLO.COM EJEMPLO.COM grunt.ejemplo.com admin server CS.BERKELEY.EDU okeeffe.berkeley.edu ATHENA.MIT.EDU kerberos.mit.edu ATHENA.MIT.EDU kerberos-1.mit.edu ATHENA.MIT.EDU kerberos-2.mit.edu ATHENA.MIT.EDU kerberos-3.mit.edu LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov</screen> <para>Los demás dominios no deben estar forzosamente en la configuración. Los hemos incluido como ejemplo de cómo puede hacerse que una máquina trabaje con múltiples dominios. Si quiere mantener todo simple puede abstenerse de incluirlos.</para> <para>La primera línea es el dominio en el que el sistema funcionará. Las demás líneas contienen entradas dominio/equipo. El primer componente de cada línea es un dominio y el segundo es un equipo de ese dominio, que actúa como <quote>centro de distribución de llaves</quote>. Las palabras <literal>admin server</literal> que siguen al nombre de equipo significan que ese equipo también ofrece un servidor de base da datos administrativo. Si quiere consultar una explicación más completa de estos términos consulte las páginas de manual de de Kerberos.</para> <para>Ahora añadiremos <hostid role="fqdn">grunt.ejemplo.com</hostid> al dominio <literal>EJEMPLO.COM</literal> y también una entrada para poner todos los equipos en el dominio <hostid role="domainname">.ejemplo.com</hostid> Kerberos <literal>EJEMPLO.COM</literal>. Puede actualizar su <filename>krb.realms</filename> del siguiente modo:</para> <screen>&prompt.root; <userinput>cat krb.realms</userinput> grunt.ejemplo.com EJEMPLO.COM .ejemplo.com EJEMPLO.COM .berkeley.edu CS.BERKELEY.EDU .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU</screen> <para>Igual que en caso previo, no tiene por qué incluir los demás dominios. Se han incluido para mostrar cómo puede usar una máquina en múltiples dominios. Puede eliminarlos y simplificar la configuración.</para> <para>La primera línea pone al sistema <emphasis>específico</emphasis> en el dominio nombrado. El resto de las líneas muestran cómo asignar por defecto sistemas de un subdominio a un dominio Kerberos.</para> <para>Ya podemos crear la base de datos. Solo se ejecuta en el servidor Kerberos (o centro de distribución de llaves). Ejecute <command>kdb_init</command>:</para> <screen>&prompt.root; <userinput>kdb_init</userinput> <prompt>Realm name [default ATHENA.MIT.EDU ]:</prompt> <userinput>EJEMPLO.COM</userinput> You will be prompted for the database Master Password. It is important that you NOT FORGET this password. <prompt>Enter Kerberos master key:</prompt> </screen> <para>Ahora tendremos que guardar la llave para que los servidores en la máquina local puedan recogerla. Utilice <command>kstash</command>:</para> <screen>&prompt.root; <userinput>kstash</userinput> <prompt>Enter Kerberos master key:</prompt> Current Kerberos master key version is 1. Master key entered. BEWARE!</screen> <para>Esto guarda la contraseña cifrada maestra en <filename>/etc/kerberosIV/master_key</filename>.</para> </sect2> <sect2> <title>Puesta en marcha del sistema</title> <indexterm> <primary>KerberosIV</primary> <secondary>encendido inicial</secondary> </indexterm> <para>Tendrá que añadir a la base de datos dos entradas en concreto para <emphasis>cada</emphasis> sistema que vaya a usar Kerberos: <literal>kpasswd</literal> y <literal>rcmd</literal>. Se hacen para cada sistema individualmente cada sistema, y el campo <quote>instance</quote> es el nombre individual del sistema.</para> <para>Estos dæmons <application>kpasswd</application> y <application>rcmd</application> permiten a otros sistemas cambiar contraseñas de Kerberos y ejecutar órdenes como &man.rcp.1;, &man.rlogin.1; y &man.rsh.1;.</para> <para>Ahora vamos a añadir estas entradas:</para> <screen>&prompt.root; <userinput>kdb_edit</userinput> Opening database... <prompt>Enter Kerberos master key:</prompt> Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. <prompt>Principal name:</prompt> <userinput>passwd</userinput> <prompt>Instance:</prompt> <userinput>grunt</userinput> <Not found>, <prompt>Create [y] ?</prompt> <userinput>y</userinput> Principal: passwd, Instance: grunt, kdc_key_ver: 1 <prompt>New Password:</prompt> <---- tecleo aleatorio Verifying password <prompt>New Password:</prompt> <---- tecleo aleatorio <prompt>Random password [y] ?</prompt> <userinput>y</userinput> Principal's new key version = 1 <prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt> <prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt> <prompt>Attributes [ 0 ] ?</prompt> Edit O.K. <prompt>Principal name:</prompt> <userinput>rcmd</userinput> <prompt>Instance:</prompt> <userinput>grunt</userinput> <Not found>, <prompt>Create [y] ?</prompt> Principal: rcmd, Instance: grunt, kdc_key_ver: 1 <prompt>New Password:</prompt> <---- tecleo aleatorio Verifying password <prompt>New Password:</prompt> <---- tecleo aleatorio <prompt>Random password [y] ?</prompt> Principal's new key version = 1 <prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt> <prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt> <prompt>Attributes [ 0 ] ?</prompt> Edit O.K. <prompt>Principal name:</prompt> <---- si introduce datos nulos saldrá del programa</screen> </sect2> <sect2> <title>Creación del fichero del servidor</title> <para>Ahora tendremos que extraer todas las instancias que definen los servicios en cada máquina; para ello usaremos <command>ext_srvtab</command>. Esto creará un fichero que debe ser copiado o movido <emphasis>por medios seguros</emphasis> al directorio <filename>/etc/kerberosIV</filename> de cada cliente Kerberos. Este fichero debe existir en todos los servidores y clientes dada su importancia clave para el funcionamiento de Kerberos.</para> <screen>&prompt.root; <userinput>ext_srvtab grunt</userinput> <prompt>Enter Kerberos master key:</prompt> Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'grunt-new-srvtab'....</screen> <para>Esta orden solo genera un fichero temporal al que tendrá que cambiar el nombre a <filename>srvtab</filename> para que todos los servidores puedan recogerlo. Utilice &man.mv.1; para moverlo al lugar correcto en el sistema original:</para> <screen>&prompt.root; <userinput>mv grunt-new-srvtab srvtab</userinput></screen> <para>Si el fichero es para un sistema cliente y la red no puede considerarse segura copie el <filename><replaceable>cliente</replaceable>-new-srvtab</filename> en un medio extraíble y transpórtelo por medios físicos seguros. Asegúrese de cambiar su nombre a <filename>srvtab</filename> en el directorio <filename>/etc/kerberosIV</filename> del cliente, y asegúrese también de que tiene modo 600:</para> <screen>&prompt.root; <userinput>mv grumble-new-srvtab srvtab</userinput> &prompt.root; <userinput>chmod 600 srvtab</userinput></screen> </sect2> <sect2> <title>Añadir entradas a la base de datos</title> <para>Ahora tenemos que añadir entradas de usuarios a la base de datos. Primero vamos a crear una entrada para el usuario <username>jane</username>. Para ello usaremos <command>kdb_edit</command>:</para> <screen>&prompt.root; <userinput>kdb_edit</userinput> Opening database... <prompt>Enter Kerberos master key:</prompt> Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. <prompt>Principal name:</prompt> <userinput>jane</userinput> <prompt>Instance:</prompt> <Not found>, <prompt>Create [y] ?</prompt> <userinput>y</userinput> Principal: jane, Instance: , kdc_key_ver: 1 <prompt>New Password:</prompt> <---- introduzca una constraseña segura Verifying password <prompt>New Password:</prompt> <---- introduzca de nuevo la contraseña Principal's new key version = 1 <prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt> <prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt> <prompt>Attributes [ 0 ] ?</prompt> Edit O.K. <prompt>Principal name:</prompt> <---- si introduce datos nulos saldrá del programa</screen> </sect2> <sect2> <title>Prueba del sistema</title> <para>Primero tenemos que iniciar los dæmons de Kerberos. Tenga en cuenta que si su <filename>/etc/rc.conf</filename> está configurado correctamente el inicio tendrá ligar cuando reinicie el sistema. Esta prueba solo es necesaria en el servidor Kerberos; los clientes Kerberos tomarán lo que necesiten automáticamente desde el directorio <filename>/etc/kerberosIV</filename>.</para> <screen>&prompt.root; <userinput>kerberos &</userinput> Kerberos server starting Sleep forever on error Log file is /var/log/kerberos.log Current Kerberos master key version is 1. Master key entered. BEWARE! Current Kerberos master key version is 1 Local realm: EJEMPLO.COM &prompt.root; <userinput>kadmind -n &</userinput> KADM Server KADM0.0A initializing Please do not use 'kill -9' to kill this job, use a regular kill instead Current Kerberos master key version is 1. Master key entered. BEWARE!</screen> <para>Ahora podemos probar a usar <command>kinit</command> para obtener un ticket para el ID <username>jane</username> que creamos antes:</para> <screen>&prompt.user; <userinput>kinit jane</userinput> MIT Project Athena (grunt.ejemplo.com) Kerberos Initialization for "jane" <prompt>Password:</prompt> </screen> <para>Pruebe a listar los tokens con <command>klist</command> para ver si realmente están:</para> <screen>&prompt.user; <userinput>klist</userinput> Ticket file: /tmp/tkt245 Principal: jane@EJEMPLO.COM Issued Expires Principal Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EJEMPLO.COM@EJEMPLO.COM</screen> <para>Ahora trate de cambiar la contraseña usando &man.passwd.1; para comprobar si el dæmon <application>kpasswd</application> está autorizado a acceder a la base de datos Kerberos:</para> <screen>&prompt.user; <userinput>passwd</userinput> realm EJEMPLO.COM <prompt>Old password for jane:</prompt> <prompt>New Password for jane:</prompt> Verifying password <prompt>New Password for jane:</prompt> Password changed.</screen> </sect2> <sect2> <title>Añadir privilegios de <command>su</command></title> <para>Kerberos nos permite dar a <emphasis>cada</emphasis> usuario que necesite privilegios de <username>root</username> su <emphasis>propia</emphasis> contraseña para &man.su.1;. Podemos agregar un ID que esté autorizado a ejecutar &man.su.1; <username>root</username>. Esto se controla con una instancia de <username>root</username> asociada con un usuario. Vamos a crear una entrada <literal>jane.root</literal> en la base de datos, para lo que recurrimos a <command>kdb_edit</command>:</para> <screen>&prompt.root; <userinput>kdb_edit</userinput> Opening database... <prompt>Enter Kerberos master key:</prompt> Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. <prompt>Principal name:</prompt> <userinput>jane</userinput> <prompt>Instance:</prompt> <userinput>root</userinput> <Not found>, Create [y] ? y Principal: jane, Instance: root, kdc_key_ver: 1 <prompt>New Password:</prompt> <---- introduzca una contraseña SEGURA Verifying password <prompt>New Password:</prompt> <---- introduzca otra vez la constraseña Principal's new key version = 1 <prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt> <prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt> <userinput>12</userinput> <--- Keep this short! <prompt>Attributes [ 0 ] ?</prompt> Edit O.K. <prompt>Principal name:</prompt> <---- si introduce datos nulos saldrá del programa</screen> <para>Ahora trate de obtener los tokens para comprobar que todo funciona:</para> <screen>&prompt.root; <userinput>kinit jane.root</userinput> MIT Project Athena (grunt.ejemplo.com) Kerberos Initialization for "jane.root" <prompt>Password:</prompt></screen> <para>Hemos de agregar al usuario al <filename>.klogin</filename> de <username>root</username>:</para> <screen>&prompt.root; <userinput>cat /root/.klogin</userinput> jane.root@EJEMPLO.COM</screen> <para>Ahora trate de hacer &man.su.1;:</para> <screen>&prompt.user; <userinput>su</userinput> <prompt>Password:</prompt></screen> <para>y eche un vistazo a qué tokens tenemos:</para> <screen>&prompt.root; <userinput>klist</userinput> Ticket file: /tmp/tkt_root_245 Principal: jane.root@EJEMPLO.COM Issued Expires Principal May 2 20:43:12 May 3 04:43:12 krbtgt.EJEMPLO.COM@EJEMPLO.COM</screen> </sect2> <sect2> <title>Uso de otras órdenes</title> <para>En un ejemplo anterior creamos un usuario llamado <literal>jane</literal> con una instancia <literal>root</literal>. Nos basamos en un usuario con el mismo nombre del <quote>principal</quote> (<literal>jane</literal>), el procedimiento por defecto en Kerberos: <literal><principal>.<instancia></literal> con la estructura <literal><nombre de usuario>.</literal><username>root</username> permitirá que <literal><nombre de usuario></literal> haga &man.su.1; a <username>root</username> si existen las entradas necesarias en el <filename>.klogin</filename> que hay en el directorio home de <username>root</username>:</para> <screen>&prompt.root; <userinput>cat /root/.klogin</userinput> jane.root@EJEMPLO.COM</screen> <para>De la misma manera, si un usuario tiene en su directorio home lo siguiente:</para> <screen>&prompt.user; <userinput>cat ~/.klogin</userinput> jane@EJEMPLO.COM jack@EJEMPLO.COM</screen> <para>significa que cualquier usuario del dominio <literal>EJEMPLO.COM</literal> que se identifique como <username>jane</username> o como <username>jack</username> (vía <command>kinit</command>, ver más arriba) podrá acceder a la cuenta de <username>jane</username> o a los ficheros de este sistema (<hostid>grunt</hostid>) vía &man.rlogin.1;, &man.rsh.1; o &man.rcp.1;.</para> <para>Veamos por ejemplo cómo <username>jane</username> se se identifica en otro sistema mediante Kerberos:</para> <screen>&prompt.user; <userinput>kinit</userinput> MIT Project Athena (grunt.ejemplo.com) <prompt>Password:</prompt> &prompt.user; <userinput>rlogin grunt</userinput> Last login: Mon May 1 21:14:47 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen> <para>Aquí <username>jack</username> se identifica con la cuenta de <username>jane</username> en la misma máquina (<username>jane</username> tiene configurado su fichero <filename>.klogin</filename> como se ha mostrado antes, y la persona encargada de la administración de Kerberos ha configurado un usuario principal <emphasis>jack</emphasis> con una instancia nula):</para> <screen>&prompt.user; <userinput>kinit</userinput> &prompt.user; <userinput>rlogin grunt -l jane</userinput> MIT Project Athena (grunt.ejemplo.com) <prompt>Password:</prompt> Last login: Mon May 1 21:16:55 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995</screen> </sect2> </sect1> <sect1 id="kerberos5"> <sect1info> <authorgroup> <author> <firstname>Tillman</firstname> <surname>Hodgson</surname> <contrib>Texto de </contrib> </author> </authorgroup> <authorgroup> <author> <firstname>Mark</firstname> <surname>Murray</surname> <contrib>Basado en un texto de </contrib> </author> </authorgroup> </sect1info> <title><application>Kerberos5</application></title> <para>Cada versión de &os; posterior a &os;-5.1 incluye soporte solamente para <application>Kerberos5</application>. Por esta razón <application>Kerberos5</application> es la única versión incluida. Su configuración es similar en muchos aspectos a la de <application>KerberosIV</application>. La siguiente información solo atañe a <application>Kerberos5</application> en versiones de &os;-5.0 o posteriores. Los usuarios que deséen utilizar <application>KerberosIV</application> pueden instalar el port <filename role="package">security/krb4</filename>.</para> <para><application>Kerberos</application> es un sistema/protocolo agregado para red que permite a los usuarios validar su identidad a través de los servicios de un servidor seguro. Los servicios como login remoto, copia remota, copias de fichero de un sistema a otro y otras tareas generalmente consideradas poco seguras pasan a ser considerablemente seguras y más controlables.</para> <para><application>Kerberos</application> puede describirse como un sistema proxy identificador/verificador. También puede describirse como un sistema confiable de autentificación de terceros. <application>Kerberos</application> solamente ofrece una función: la validación segura de usuarios a través de una red. No proporciona funciones de autorización (es decir, lo que los usuarios tienen permitido hacer) o funciones de auditoría (lo que esos usuarios hicieron). Después de que un servidor y un cliente han usado <application>Kerberos</application> para demostrar su identidad pueden también cifrar todas sus sus comunicaciones, asegurando de este modo su intimidad y la integridad de sus datos durante su uso del sistema.</para> <para>Es, por tanto, altamente recomendable que se use <application>Kerberos</application> <emphasis>además</emphasis> de otros métodos de seguridad que ofrezcan servicios de autorización y auditoría.</para> <para>Puede usar las siguientes instrucciones como una guía para configurar <application>Kerberos</application> tal y como se distribuye en &os;. De todas maneras, debería consultar las páginas de manual adecuadas para tener toda la información.</para> <para>Vamos a mostrar una instalación <application>Kerberos</application>, para lo cual usaremos los siguientes espacios de nombres:</para> <itemizedlist> <listitem> <para>El dominio <acronym>DNS</acronym> (<quote>zona</quote>) será ejemplo.org.</para> </listitem> <listitem> <para>El dominio <application>Kerberos</application> (realm) será EJEMPLO.ORG.</para> </listitem> </itemizedlist> <note> <para>Debe utilizar nombres de dominio reales al configurar <application>Kerberos</application> incluso si pretende ejecutarlo internamente. Esto le evitará problemas de <acronym>DNS</acronym> y asegura la interoperación con otros dominios <application>Kerberos</application>.</para> </note> <sect2> <title>Historia</title> <indexterm> <primary>Kerberos5</primary> <secondary>historia</secondary> </indexterm> <para><application>Kerberos</application> fué creado en el Massachusetts Institute of Technology (<acronym>MIT</acronym>) como una solución a los problemas de seguridad de la red. El protocolo <application>Kerberos</application> utiliza criptografía fuerte para que un cliente pueda demostrar su identidad en un servidor (y viceversa) a través de una conexión de red insegura.</para> <para><application>Kerberos</application> es el nombre de un protocolo de autentificación vía red y un adjetivo para describir programas que implementan el programa (<application>Kerberos</application> telnet, por ejemplo, conocido también como el <quote>telnet kerberizado</quote>). La versión actual del protocolo es la 5, descrita en <acronym>RFC</acronym> 1510.</para> <para>Existen diversas implementaciones libres de este protocolo, cubriendo un amplio rango de sistemas operativos. El <acronym>MIT</acronym>, donde <application>Kerberos</application> fué desarrollado, continúa desarrollando su propio paquete <application>Kerberos</application>. Suele usarse en los EEUU como producto criptográfico y como tal ha sufrido las regulaciones de exportación de los EEUU. El <application>Kerberos</application> del <acronym>MIT</acronym> existe como un port en (<filename role="package">security/krb5</filename>). Heimdal <application>Kerberos</application> es otra implementación de la versión 5, y fué desarrollada de forma intencionada fuera de los <acronym>EEUU</acronym> para sortear las regulaciones de exportación (y por eso puede incluirse en versiones no comerciales de &unix;). La distribución Heimdal <application>Kerberos</application> está en el port (<filename role="package">security/heimdal</filename>), y se incluye una instalación mínima en el sistema base de &os;.</para> <para>Para alcanzar la mayor audiencia estas instrucciones asumen el uso de la distribución Heimdal incluída en &os;.</para> </sect2> <sect2> <title>Configuración de un <acronym>KDC</acronym> Heimdal</title> <indexterm> <primary>Kerberos5</primary> <secondary>Centro de distribución de llaves</secondary> </indexterm> <para>El centro de distribución de llaves (<acronym>KDC</acronym>, Key Distribution Center) es el servicio centralizado de validación que proporciona <application>Kerberos</application>: es el sistema que emite tickets <application>Kerberos</application>. El <acronym>KDC</acronym> goza del estátus de ser considerado como <quote>confiable</quote> por las demás computadoras del dominio <application>Kerberos</application>, y por eso tiene consideraciones de seguridad más elevadas.</para> <para>Tenga en cuenta que, aunque la ejecución del servidor <application>Kerberos</application> requiere muy pocos recursos, se recomienda el uso de una máquina dedicada a <acronym>KDC</acronym> por razones de seguridad.</para> <para>Para empezar a configurar un <acronym>KDC</acronym> asegúrese de que su <filename>/etc/rc.conf</filename> contenga la configuración adecuada para actuar como <acronym>KDC</acronym> (tal vez deba ajustar algunas rutas para que cuadren con su sistema):</para> <programlisting>kerberos5_server_enable="YES" kadmind5_server_enable="YES" kerberos_stash="YES"</programlisting> <note> <para><option>kerberos_stash</option> solo existe en &os; 4.X.</para> </note> <para>A continuación configuraremos el fichero de configuración de <application>Kerberos</application>, <filename>/etc/krb5.conf</filename>:</para> <programlisting>[libdefaults] default_realm = EJEMPLO.ORG [realms] EXAMPLE.ORG = { kdc = kerberos.ejemplo.org admin_server = kerberos.ejemplo.org } [domain_realm] .ejemplo.org = EJEMPLO.ORG</programlisting> <para>Tenga en cuenta que este <filename>/etc/krb5.conf</filename> implica que su <acronym>KDC</acronym> tendrá el nombre de equipo completo calificado de <hostid role="fqdn">kerberos.ejemplo.org</hostid>. Necesitará añadir una entrada CNAME (alias) a su fichero de zona si su <acronym>KDC</acronym> tiene un nombre de equipo diferente.</para> <note> <para>En grandes redes con un servidor <acronym>DNS</acronym> <acronym>BIND</acronym> bien configurado, el ejemplo de arriba puede quedar del siguiente modo:</para> <programlisting>[libdefaults] default_realm = EJEMPLO.ORG</programlisting> <para>Con las siguientes líneas agregadas al fichero de zona <hostid role="fqdn">ejemplo.org</hostid>:</para> <programlisting>_kerberos._udp IN SRV 01 00 88 kerberos.ejemplo.org. _kerberos._tcp IN SRV 01 00 88 kerberos.ejemplo.org. _kpasswd._udp IN SRV 01 00 464 kerberos.ejemplo.org. _kerberos-adm._tcp IN SRV 01 00 749 kerberos.ejemplo.org. _kerberos IN TXT EJEMPLO.ORG</programlisting></note> <note> <para>Para que los clientes sean capaces de encontrar los servicios <application>Kerberos</application> <emphasis>debe</emphasis> tener ya sea un <filename>/etc/krb5.conf</filename> configurado o un <filename>/etc/krb5.conf</filename> configurado de forma mínima <emphasis>y</emphasis> un servidor DNS configurado correctamente.</para> </note> <para>A continuación crearemos la base de datos <application>Kerberos</application>. Esta base de datos contiene las llaves de todos los principales cifradas con una contraseña maestra. No es necesario que recuerde esta contraseña, pues se almacenará en <filename>/var/heimdal/m-key</filename>. Para crear la llave maestra ejecute <command>kstash</command> e introduzca una contraseña.</para> <para>Una vez que se ha creado la llave maestra puede inicializar la base de datos usando el programa <command>kadmin</command> con la opción <literal>-l</literal> (que significa <quote>local</quote>). Esta opción le dice a <command>kadmin</command> que modifique los ficheros de la base de datos directamente en lugar de ir a través del servicio de red <command>kadmind</command>. Esto gestiona el problema del huevo y la gallina de tratar de conectar a la base de datos antes de que ésta exista. Una vez que tiene el <quote>prompt</quote> de <command>kadmin</command>, utilice <command>init</command> para crear su base de datos de dominios iniciales.</para> <para>Para terminar, mientras está todavía en <command>kadmin</command> puede crear su primer principal mediante <command>add</command>. Utilice las opciones por defecto por ahora, más tarde puede cambiarlas mediante <command>modify</command>. Recuerde que puede usar <literal>?</literal> en cualquier <quote>prompt</quote> para consultar las opciones disponibles.</para> <para>Veamos un ejemplo de sesión de creación de una base de datos:</para> <screen>&prompt.root; <userinput>kstash</userinput> Master key: <userinput>xxxxxxxx</userinput> Verifying password - Master key: <userinput>xxxxxxxx</userinput> &prompt.root; <userinput>kadmin -l</userinput> kadmin> <userinput>init EJEMPLO.ORG</userinput> Realm max ticket life [unlimited]: kadmin> <userinput>add tillman</userinput> Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: Password: <userinput>xxxxxxxx</userinput> Verifying password - Password: <userinput>xxxxxxxx</userinput></screen> <para>Ahora puede arrancar los servicios <acronym>KDC</acronym>. Ejecute <command>/etc/rc.d/kerberos start</command> y <command>/etc/rc.d/kadmind start</command> para levantar dichos servicios. Recuerde que no tendrá ningún dæmon kerberizado ejecutándose pero debe poder confirmar que <acronym>KDC</acronym> funciona por el procedimiento de obtener y listar un boleto del principal (usuario) que acaba de crear en la línea de órdenes de <acronym>KDC</acronym>:</para> <screen>&prompt.user; <userinput>k5init <replaceable>tillman</replaceable></userinput> tillman@EJEMPLO.ORG's Password: &prompt.user; <userinput>k5list</userinput> Credentials cache: FILE:<filename>/tmp/krb5cc_500</filename> Principal: tillman@EJEMPLO.ORG Issued Expires Principal Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EJEMPLO.ORG@EJEMPLO.ORG</screen> </sect2> <sect2> <title>Creación de un servidor <application>Kerberos</application> con servicios Heimdal</title> <indexterm> <primary>Kerberos5</primary> <secondary>habilitación de servicios</secondary> </indexterm> <para>Antes de nada necesitaremos una copia del fichero de configuración de <application>Kerberos</application>, <filename>/etc/krb5.conf</filename>. Cópielo al cliente desde <acronym>KDC</acronym> de forma segura (mediante &man.scp.1;, o usando un disquete).</para> <para>A continuación necesitará un fichero <filename>/etc/krb5.keytab</filename>. Esta es la mayor diferencia entre un servidor que proporciona dæmons habilitados con <application>Kerberos</application> y una estación de trabajo: el servidor debe tener un fichero <filename>keytab</filename>. Dicho fichero contiene las llaves de equipo del servidor, las cuales le permiten a él y al <acronym>KDC</acronym> verificar la identidad entre ellos. Deben transmitirse al servidor de forma segura ya que la seguridad del servidor puede verse comprometida si la llave se hace pública. Por decirlo más claro, transferirla como texto plano a través de la red (por ejemplo por <acronym>FTP</acronym>) es una <emphasis>pésima idea</emphasis>.</para> <para>Lo normal es que transmita su <filename>keytab</filename> al servidor mediante el programa <command>kadmin</command>. Esto es práctico porque también debe crear el principal del equipo (el <acronym>KDC</acronym> que aparece al final de <filename>krb5.keytab</filename>) usando <command>kadmin</command>.</para> <para>Tenga en cuenta que ya debe disponer de un ticket, y que este ticket debe poder usar el interfaz <command>kadmin</command> en <filename>kadmind.acl</filename>. Consulte la sección <quote>administración remota</quote> en la página info de Heimdal (<command>info heimdal</command>), donde se exponen los detalles de diseño de las listas de control de acceso. Si no quiere habilitar acceso remoto <command>kadmin</command>, puede conectarse de forma segura al <acronym>KDC</acronym> (por medio de consola local, &man.ssh.1; o &man.telnet.1; <application>Kerberos</application>) y administrar en local mediante <command>kadmin -l</command>.</para> <para>Después de instalar el fichero <filename>/etc/krb5.conf</filename> puede usar <command>kadmin</command> desde el servidor <application>Kerberos</application>. <command>add --random-key</command> le permitirá añadir el principal del equipo servidor, y <command>ext</command> le permitirá extraer el principal del equipo servidor a su propio keybat. Por ejemplo:</para> <screen>&prompt.root; <userinput>kadmin</userinput> kadmin><userinput> add --random-key host/myserver.ejemplo.org</userinput> Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: kadmin><userinput> ext host/miservidor.ejemplo.org</userinput> kadmin><userinput> exit</userinput></screen> <para>Tenga en cuenta que <command>ext</command> (contracción de <quote>extract</quote>) almacena la llave extraída por defecto en en <filename>/etc/krb5.keytab</filename>.</para> <para>Si no tiene <command>kadmind</command> ejecutándose en <acronym>KDC</acronym> (posiblemente por razones de seguridad) y por lo tanto carece de acceso remoto a <command>kadmin</command> puede añadir el principal de equipo (<username>host/miservidor.EJEMPLO.ORG</username>) directamente en el <acronym>KDC</acronym> y entonces extraerlo a un fichero temporal (para evitar sobreescribir <filename>/etc/krb5.keytab</filename> en el <acronym>KDC</acronym>) mediante algo parecido a esto:</para> <screen>&prompt.root; <userinput>kadmin</userinput> kadmin><userinput> ext --keytab=/tmp/ejemplo.keytab host/miservidor.ejemplo.org</userinput> kadmin><userinput> exit</userinput></screen> <para>Puede entonces copiar de forma segura el keytab al servidor (usando <command>scp</command> o un diquete). Asegúrese de usar un nombre de keytab diferente para evitar sobreescribir el keytab en el <acronym>KDC</acronym>.</para> <para>Su servidor puede comunicarse con el <acronym>KDC</acronym> (gracias a su fichero <filename>krb5.conf</filename>) y puede probar su propia identidad (gracias al fichero <filename>krb5.keytab</filename>). Ahora está listo para que usted habilite algunos servicios <application>Kerberos</application>. En este ejemplo habilitaremos el servicio <command>telnet</command> poniendo una línea como esta en su <filename>/etc/inetd.conf</filename> y reiniciando el servicio &man.inetd.8; con <command>/etc/rc.d/inetd restart</command>:</para> <programlisting>telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user</programlisting> <para>La parte crítica es <command>-a</command>, de autentificación de usuario. Consulte la página de manual &man.telnetd.8; para más información.</para> </sect2> <sect2> <title><application>Kerberos</application> con un cliente Heimdal</title> <indexterm> <primary>Kerberos5</primary> <secondary>configurar clientes</secondary> </indexterm> <para>Configurar una computadora cliente es extremadamente fácil. Lo único que necesita es el fichero de configuración de <application>Kerberos</application> que encontrará en <filename>/etc/krb5.conf</filename>. Simplemente cópielo de forma segura a la computadora cliente desde el <acronym>KDC</acronym>.</para> <para>Pruebe su computadora cliente mediante <command>kinit</command>, <command>klist</command>, y <command>kdestroy</command> desde el cliente para obtener, mostrar y luego borrar un ticket para el principal que creó antes. Debería poder usar aplicaciones <application>Kerberos</application> para conectarse a servidores habilitados con <application>Kerberos</application>, aunque si no funciona y tiene problemas al intentar obtener el boleto lo más probable es que el problema esté en el servidor y no en el cliente o el <acronym>KDC</acronym>.</para> <para>Al probar una aplicación como <command>telnet</command>, trate de usar un <quote>sniffer</quote> de paquetes ( como &man.tcpdump.1;) para confirmar que su contraseña no viaja en claro por la red. Trate de usar <command>telnet</command> con la opción <literal>-x</literal>, que cifra el flujo de datos por entero (algo parecido a lo que hace <command>ssh</command>).</para> <para>Las aplicaciones clientes <application>Kerberos</application> principales (llamadas tradicionalmente <command>kinit</command>, <command>klist</command>, <command>kdestroy</command> y <command>kpasswd</command>) están incluidas en la instalación base de &os;. Tenga en cuenta que en las versiones de &os; anteriores a 5.0 reciben los nombres de <command>k5init</command>, <command>k5list</command>, <command>k5destroy</command>, <command>k5passwd</command> y <command>k5stash</command>.</para> <para>También se instalan por defecto diversas aplicaciones <application>Kerberos</application> que no entran dentro de la categoría de <quote>imprescindibles</quote>. Es aquí donde la naturaleza <quote>mínima</quote> de la instalación base de Heimdal salta a la palestra: <command>telnet</command> es el único servicio <application>Kerberos</application> habilitado.</para> <para>El port Heimdal añade algunas de las aplicaciones cliente que faltan: versiones <application>Kerberos</application> de <command>ftp</command>, <command>rsh</command>, <command>rcp</command>, <command>rlogin</command> y algunos otros programas menos comunes. El port del <acronym>MIT</acronym> también contiene una suite completa de aplicaciones cliente de <application>Kerberos</application>.</para> </sect2> <sect2> <title>Ficheros de configuración de usuario: <filename>.k5login</filename> y <filename>.k5users</filename></title> <indexterm> <primary><filename>.k5login</filename></primary> </indexterm> <indexterm> <primary><filename>.k5users</filename></primary> </indexterm> <para>Suele ser habitual que los usuarios de un dominio <application>Kerberos</application> (o <quote>principales</quote>) tengan su usuario (por ejemplo <username>tillman@EJEMPLO.ORG</username>) mapeado a una cuenta de usuario local (por ejemplo un usuario llamado llamado <username>tillman</username>). Las aplicaciones cliente como <command>telnet</command> normalmente no requieren un nombre de usuario o un principal.</para> <para>Es posible que de vez en cuando quiera dar acceso a una una cuenta de usuario local a alguien que no tiene un principal <application>Kerberos</application>. Por ejemplo, <username>tillman@EJEMPLO.ORG</username> puede necesitar acceso a la cuenta de usuario local <username>webdevelopers</username>. Otros principales tal vez necesiten acceso a esas cuentas locales.</para> <para>Los ficheros <filename>.k5login</filename> y <filename>.k5users</filename>, ubicados en el directorio home del usuario, pueden usarse de un modo similar a una combinación potente de <filename>.hosts</filename> y <filename>.rhosts</filename>. Por ejemplo, si pusiera un fichero <filename>.k5login</filename> con el siguiente contenido</para> <screen>tillman@example.org jdoe@example.org</screen> <para>en el directorio home del usuario local <username>webdevelopers</username> ambos principales listados tendrían acceso a esa cuenta sin requerir una contraseña compartida.</para> <para>Le recomendamos encarecidamente la lectura de las páginas de manual de estas órdenes. Recuerde que la página de manual de <command>ksu</command> abarca <filename>.k5users</filename>.</para> </sect2> <sect2> <title><application>Kerberos</application> Sugerencias, trucos y solución de problemas</title> <indexterm> <primary>Kerberos5</primary> <secondary>solución de problemas</secondary> </indexterm> <itemizedlist> <listitem> <para>Tanto si utiliza el port de Heimdal o el <application>Kerberos</application> del <acronym>MIT</acronym> asegúrese de que su variable de entorno <envar>PATH</envar> liste las versiones de <application>Kerberos</application> de las aplicaciones cliente antes que las versiones del sistema.</para> </listitem> <listitem> <para>?Todas las computadoras de su dominio Kerberos tienen la hora sincronizada? Si no, la autentificación puede fallar. <xref linkend="network-ntp"/> describe como sincronizar los relojes utilizando <acronym>NTP</acronym>.</para> </listitem> <listitem> <para><acronym>MIT</acronym> y Heimdal conviven bien, con la excepción de <command>kadmin</command>, protocolo no está estandarizado.</para> </listitem> <listitem> <para>Si cambia su nombre de equipo debe cambiar también el <quote>apellido</quote> de su principal y actualizar su keytab. Esto también se aplica a entradas especiales en keytab como el principal <username>www/</username> que usa el <filename role="package">www/mod_auth_kerb</filename> de Apache.</para> </listitem> <listitem> <para>Todos los equipos en su dominio Kerberos deben poder resolverse (tanto en la forma normal normal como en la inversa) en el <acronym>DNS</acronym> (o en <filename>/etc/hosts</filename> como mínimo). Los CNAME funcionarán, pero los registros A y PTR deben ser correctos y estar en su sitio. El mensaje de error que recibirá de no hacerlo así no es muy intuitivo: <errorname>Kerberos5 refuses authentication because Read req failed: Key table entry not found</errorname>.</para> </listitem> <listitem> <para>Algunos sistemas operativos que puede usar como clientes de su <acronym>KDC</acronym> no activan los permisos para <command>ksu</command> como setuid <username>root</username>. Esto hará que <command>ksu</command> no funcione, lo cual es muy seguro pero un tanto molesto. Tenga en cuenta que no se debe a un error de <acronym>KDC</acronym>.</para> </listitem> <listitem> <para>Si desea permitir que un principal tenga un ticket con una validez más larga que el valor por defecto de diez horas en <application>Kerberos</application> del <acronym>MIT</acronym> debe usar <command>modify_principal</command> en <command>kadmin</command> para cambiar <quote>maxlife</quote> tanto del principal en cuestión como del <username>krbtgt</username> del principal. Hecho esto, el principal puede utilizar la opción <literal>-l</literal> con <command>kinit</command> para solicitar un boleto con más tiempo de vida.</para> </listitem> <listitem> <note><para>Si ejecuta un <quote>sniffer</quote> de paquetes en su <acronym>KDC</acronym> para ayudar con la resolución de problemas y ejecuta <command>kinit</command> desde una estación de trabajo puede encontrarse con que su <acronym>TGT</acronym> se envía inmediatamente después de ejecutar <command>kinit</command>: <emphasis>incluso antes de que escriba su contraseña</emphasis> La explicación es que el servidor <application>Kerberos</application> transmite tranquilamente un <acronym>TGT</acronym> (Ticket Granting Ticket) a cualquier petición no autorizada; de todas maneras, cada <acronym>TGT</acronym> está cifrado en una llave derivada de la contraseña del usuario. Por tanto, cuando un usuario teclea su contraseña no la está enviando al <acronym>KDC</acronym>, se está usando para descifrar el <acronym>TGT</acronym> que <command>kinit</command> ya obtuvo. Si el proceso de descifrado termina en un ticket válido con una marca de tiempo válida, el usuario tiene credenciales <application>Kerberos</application> válidas. Estas credenciales incluyen una llave de sesión para establecer comunicaciones seguras con el servidor <application>Kerberos</application> en el futuro, así como el TGT en sí, que se cifra con la llave del propio servidor <application>Kerberos</application>. Esta segunda capa de cifrado es invisible para el usuario, pero es lo que permite al servidor <application>Kerberos</application> verificar la autenticidad de cada <acronym>TGT</acronym>.</para></note> </listitem> <listitem> <para>Si desea utilizar tickets con un tiempo largo de vida (una semana, por ejemplo) y está utilizando <application>OpenSSH</application> para conectarse a la máquina donde se almacena su boleto asgúrese de que <application>Kerberos</application> <option>TicketCleanup</option> esté configurado a <literal>no</literal> en su <filename>sshd_config</filename> o de lo contrario sus tickets serán eliminados cuando termine la sesión.</para> </listitem> <listitem> <para>Recuerde que los principales de equipos también pueden tener tener un tiempo de vida más largo. Si su principal de usuario tiene un tiempo de vida de una semana pero el equipo al que se conecta tiene un tiempo de vida de nueve horas, tendrá un principal de equipo expirado en su caché, y la caché de ticket no funcionará como esperaba.</para> </listitem> <listitem> <para>Cuando esté configurando un fichero <filename>krb5.dict</filename> pensando específicamente en prevenir el uso de contraseñas defectuosas (la página de manual de de <command>kadmind</command> trata el tema brevemente), recuerde que solamente se aplica a principales que tienen una política de contraseñas asignada. El formato de los ficheros <filename>krb5.dict</filename> es simple: una cadena de texto por línea. Puede serle útil crear un enlace simbólico a <filename>/usr/share/dict/words</filename>.</para> </listitem> </itemizedlist> </sect2> <sect2> <title>Diferencias con el port del <acronym>MIT</acronym></title> <para>Las diferencias más grandes entre las instalaciones <acronym>MIT</acronym> y Heimdal están relacionadas con <command>kadmin</command>, que tiene un conjunto diferente (pero equivalente) de órdenes y utiliza un protocolo diferente. Esto tiene implicaciones muy grandes si su <acronym>KDC</acronym> es <acronym>MIT</acronym>, ya que no podrá utilizar el programa <command>kadmin</command> de Heimdal para administrar remotamente su <acronym>KDC</acronym> (o viceversa).</para> <para>Las aplicaciones cliente pueden también disponer de diferentes opciones de línea de órdenes para lograr lo mismo. Le recomendamos seguir las instrucciones de la página web de <application>Kerberos</application> del <acronym>MIT</acronym> (<ulink url="http://web.mit.edu/Kerberos/www/"></ulink>). Sea cuidadoso con los parches: el port del <acronym>MIT</acronym> se instala por defecto en <filename>/usr/local/</filename>, y las aplicaciones <quote>normales</quote> del sistema pueden ser ejecutadas en lugar de las del <acronym>MIT</acronym> si su variable de entorno <envar>PATH</envar> lista antes los directorios del sistema.</para> <note><para>Si usa el port del <acronym>MIT</acronym> <filename role="package">security/krb5</filename> proporcionado por &os; asegúrese de leer el fichero <filename>/usr/local/share/doc/krb5/README.FreeBSD</filename> instalado por el port si quiere entender por qué los login vía <command>telnetd</command> y <command>klogind</command> se comportan de un modo un tanto extraño. Más importante aún, corregir la conducta de <quote>permisos incorrectos en el fichero caché</quote> requiere que el binario <command>login.krb5</command> se use para la validación para que pueda cambiar correctamente los permisos de propiedad de credenciales reenviadas.</para></note> </sect2> <sect2> <title>Mitigación de limitaciones encontradas en <application>Kerberos</application></title> <indexterm> <primary>Kerberos5</primary> <secondary>limitaciones y deficiencias</secondary> </indexterm> <sect3> <title><application>Kerberos</application> es un enfoque <quote>todo o nada</quote></title> <para>Cada servicio habilitado en la red debe modificarse para funcionar con <application>Kerberos</application> (o debe ser asegurado contra ataques de red) o de lo contrario las credenciales de usuario pueden robarse y reutilizarse. Un ejemplo de esto podría ser que <application>Kerberos</application> habilite todos los shells remotos ( vía <command>rsh</command> y <command>telnet</command>, por ejemplo) pero que no cubra el servidor de correo <acronym>POP3</acronym>, que envía contraseñas en texto plano.</para> </sect3> <sect3> <title><application>Kerberos</application> está pensado para estaciones de trabajo monousuario</title> <para>En un entorno multiusuario <application>Kerberos</application> es menos seguro. Esto se debe a que almacena los tickets en el directorio <filename>/tmp</filename>, que puede ser leído por todos los usuarios. Si un usuario está compartiendo una computadora con varias personas (esto es, si utiliza un sistema multiusuario) es posible que los tickets sean robados (copiados) por otro usuario.</para> <para>Esto puede solventarse con la opción de línea de órdenes <literal>-c</literal> nombre-de-fichero o (mejor aún) la variable de entorno <envar>KRB5CCNAME</envar>, pero raramente se hace. Si almacena los tickets en el directorio home de los usuarios y utiliza sin mucha complicación los permisos de fichero puede mitigar este problema.</para> </sect3> <sect3> <title>El KDC es el punto crítico de fallo</title> <para>Por motivos de diseño el <acronym>KDC</acronym> es tan seguro como la base de datos principal de contraseñas que contiene. El <acronym>KDC</acronym> no debe ejecutar ningún otro servicio ejecutándose en él y debe ser físicamente seguro. El peligro es grande debido a que <application>Kerberos</application> almacena todas las contraseñas cifradas con la misma llave (la llave <quote>maestra</quote>, que a su vez se guarda como un fichero en el <acronym>KDC</acronym>).</para> <para>De todos modos una llave maestra comprometida no es algo tan terrible como parece a primera vista. La llave maestra solo se usa para cifrar la base de datos <application>Kerberos</application> y como semilla para el generador de números aleatorios. Mientras sea seguro el acceso a su <acronym>KDC</acronym> un atancante no puede hacer demasiado con la llave maestra.</para> <para>Además, si el <acronym>KDC</acronym> no está disponible (quizás debido a un ataque de denegación de servicio o problemas de red) no se podrán utilizar los servicios de red ya que no se puede efectuar la validación, lo que hace que esta sea una buena forma de lanzar un ataque de denegación de servicio. Este problema puede aliviarse con múltiples <acronym>KDC</acronym>s (un maestro y uno o más esclavos) y con una implementación cautelosa de secundarios o autentificación de respaldo (para esto <acronym>PAM</acronym> es excelente).</para> </sect3> <sect3> <title>Limitaciones de <application>Kerberos</application></title> <para><application>Kerberos</application> le permite a usuarios, equipos y servicios validarse entre sí, pero no dispone de ningún mecanismo para autentificar el <acronym>KDC</acronym> a los usuarios, equipos o servicios. Esto significa que una versión (por ejemplo) <quote>troyanizada</quote> <command>kinit</command> puede grabar todos los usuarios y sus contraseñas. Puede usar <filename role="package">security/tripwire</filename> o alguna otra herramienta de revisión de integridad de sistemas de ficheros para intentar evitar problemas como este.</para> </sect3> </sect2> <sect2> <title>Recursos y más información</title> <indexterm> <primary>Kerberos5</primary> <secondary>recursos externos</secondary> </indexterm> <itemizedlist> <listitem> <para><ulink url="http://www.faqs.org/faqs/Kerberos-faq/general/preamble.html"> Las preguntas frecuentes (FAQ) de <application>Kerberos</application></ulink></para> </listitem> <listitem> <para><ulink url="http://web.mit.edu/Kerberos/www/dialogue.html">Designing an Authentication System: a Dialog in Four Scenes</ulink></para> </listitem> <listitem> <para><ulink url="http://www.ietf.org/rfc/rfc1510.txt?number=1510">RFC 1510, The <application>Kerberos</application> Network Authentication Service (V5)</ulink></para> </listitem> <listitem> <para><ulink url="http://web.mit.edu/Kerberos/www/">Página web de <application>Kerberos</application> del <acronym>MIT</acronym></ulink></para> </listitem> <listitem> <para><ulink url="http://www.pdc.kth.se/heimdal/">Página web de <application>Kerberos</application> Heimdal</ulink></para> </listitem> </itemizedlist> </sect2> </sect1> <sect1 id="openssl"> <sect1info> <authorgroup> <author> <firstname>Tom</firstname> <surname>Rhodes</surname> <contrib>Escrito por: </contrib> </author> </authorgroup> </sect1info> <title>OpenSSL</title> <indexterm> <primary>seguridad</primary> <secondary>OpenSSL</secondary> </indexterm> <para>El conjunto de herramientas <application>OpenSSL</application> es una característica de &os; que muchos usuarios pasan por alto. <application>OpenSSL</application> ofrece una capa de cifrada de transporte sobre la capa normal de comunicación, permitiendo la combinación con con muchas aplicaciones y servicios de red.</para> <para>Algunos usos de <application>OpenSSL</application> son la validación cifrada de clientes de correo, las transacciones basadas en web como pagos con tarjetas de crédito, etc. Muchos ports, como <filename role="package">www/apache13-ssl</filename> y <filename role="package">mail/sylpheed-claws</filename> ofrecen soporte de compilación para <application>OpenSSL</application>.</para> <note> <para>En la mayoría de los casos la colección de ports tratará de compilar el port <filename role="package">security/openssl</filename> a menos que la variable de make <makevar>WITH_OPENSSL_BASE</makevar> sea puesta explícitamente a <quote>yes</quote>.</para> </note> <para>La versión de <application>OpenSSL</application> incluida en &os; soporta los protocolos de seguridad de red Secure Sockets Layer v2/v3 (SSLv2/SSLv3) y Transport Layer Security v1 (TLSv1) y puede utilizarse como biblioteca criptográfica general.</para> <note> <para><application>OpenSSL</application> soporta el algoritmo <acronym>IDEA</acronym> pero estáa deshabilitado por defecto debido a patentes en vigor en los Estados Unidos. Si quiere usarlo debe revisar la licencia, y si las restricciones le parecen aceptables active la variable <makevar>MAKE_IDEA</makevar> en <filename>make.conf</filename>.</para> </note> <para>Uno de los usos más comunes de <application>OpenSSL</application> es ofrecer certificados para usar con aplicaciones de software. Estos certificados aseguran que las credenciales de la compañia o individuo son válidos y no son fraudulentos. Si el certificado en cuestión no ha sido verificado por uno de las diversas <quote>autoridades certificadoras</quote> o <acronym>CA</acronym>, suele generarse una advertencia al respecto. Una autoridad de certificados es una compañia, como <ulink url="http://www.verisign.com">VeriSign</ulink>, que firma certificados para validar credenciales de individuos o compañias. Este proceso tiene un costo asociado y no es un requisito imprescindible para usar certificados, aunque puede darle un poco de tranquilidad a los usuarios más paranóicos.</para> <sect2> <title>Generación de certificados</title> <indexterm> <primary>OpenSSL</primary> <secondary>generación de certificados</secondary> </indexterm> <para>Para generar un certificado ejecute lo siguiente:</para> <screen>&prompt.root; <userinput>openssl req -new -nodes -out req.pem -keyout cert.pem</userinput> Generating a 1024 bit RSA private key ................++++++ .......................................++++++ writing new private key to 'cert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:<userinput><replaceable>US</replaceable></userinput> State or Province Name (full name) [Some-State]:<userinput><replaceable>PA</replaceable></userinput> Locality Name (eg, city) []:<userinput><replaceable>Pittsburgh</replaceable></userinput> Organization Name (eg, company) [Internet Widgits Pty Ltd]:<userinput><replaceable>Mi compañía</replaceable></userinput> Organizational Unit Name (eg, section) []:<userinput><replaceable>Administrador de sistemas</replaceable></userinput> Common Name (eg, YOUR name) []:<userinput><replaceable>localhost.ejemplo.org</replaceable></userinput> Email Address []:<userinput><replaceable>trhodes@FreeBSD.org</replaceable></userinput> Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:<userinput><replaceable>UNA CONTRASEÑA</replaceable></userinput> An optional company name []:<userinput><replaceable>Otro nombre</replaceable></userinput></screen> <para>Tenga en cuenta que la respuesta directamente después de <quote>prompt</quote> <quote>Common Name</quote> muestra un nombre de dominio. Este <quote>prompt</quote> requiere que se introduzca un nombre de servidor para usarlo en la verificación; si escribe cualquier otra cosa producirá un certificado inválido. Otras opciones, por ejemplo el tiempo de expiración, alternan algoritmos de cifrado, etc. Puede ver una lista completa en la página de manual de &man.openssl.1;.</para> <para>Debería tener dos ficheros en el directorio donde ha ejecutado la orden anterior. La petición de certificado, <filename>req.pem</filename>, es lo que debe enviar a una autoridad certificadora para que valide las credenciales que introdujo; firmará la petición y le devolverá el certificado. El segundo fichero es <filename>cert.pem</filename> y es la llave privada para el certificado, que debe proteger a toda costa; si cae en malas manos podrí usarse para suplantarle a usted o a sus servidores.</para> <para>Si no necesita la firma de una <acronym>CA</acronym> puede crear y firmar usted mismo su certificado. Primero, genere la llave <acronym>RSA</acronym>:</para> <screen>&prompt.root; <userinput>openssl dsaparam -rand -genkey -out <filename>myRSA.key</filename> 1024</userinput></screen> <para>A continuación genere la llave <acronym>CA</acronym>:</para> <screen>&prompt.root; <userinput>openssl gendsa -des3 -out <filename>myca.key</filename> <filename>myRSA.key</filename></userinput></screen> <para>Utilice esta llave para crear el certificado:</para> <screen>&prompt.root; <userinput>openssl req -new -x509 -days 365 -key <filename>myca.key</filename> -out <filename>new.crt</filename></userinput></screen> <para>Deberín aparecer dos nuevos ficheros en su directorio: un fichero de firma de autoridad de certificados (<filename>myca.key</filename>) y el certificado en sí, <filename>new.crt</filename>. Deben ubicarse en un directorio, que se recomienda que sea <filename class="directory">/etc</filename>, que es legible solo para <username>root</username>. Para terminar, es recomendable asignar permisos 0700 para el fichero con <command>chmod</command>.</para> </sect2> <sect2> <title>Uso de certificados; un ejemplo</title> <para>?Qué pueden hacer estos ficheros? Cifrar conexiones al <acronym>MTA</acronym> <application>Sendmail</application> es un buen sitio para usarlos. De este modo eliminará el uso de validación mediante texto en claro para los usuarios que envían correo a través del <acronym>MTA</acronym> local.</para> <note> <para>No es el mejor uso en el mundo, ya que algunos <acronym>MUA</acronym>s enviarán al usuario un mensaje de error si no tiene instalados localmente los certificados. Consulte la documentación para más datos sobre la instalación de certificados.</para> </note> <para>Debe añadir las siguientes líneas en su fichero local <filename>.mc</filename>:</para> <programlisting>dnl SSL Options define(`confCACERT_PATH',`/etc/certs')dnl define(`confCACERT',`/etc/certs/new.crt')dnl define(`confSERVER_CERT',`/etc/certs/new.crt')dnl define(`confSERVER_KEY',`/etc/certs/myca.key')dnl define(`confTLS_SRV_OPTIONS', `V')dnl</programlisting> <para><filename class="directory">/etc/certs/</filename> es el directorio destinado a almacenamiento de los ficheros de certificado y llave en local. El último requisito es una reconstrucción del fichero <filename>.cf</filename> local. Solo tiene que teclear <command>make</command> <parameter>install</parameter> en el directorio <filename class="directory">/etc/mail</filename>. A continuación ejecute un <command>make</command> <parameter>restart</parameter>, que debería reiniciar el dæmon <application>Sendmail</application>.</para> <para>Si todo fué bien no habrá mensajes de error en el fichero <filename>/var/log/maillog</filename> y <application>Sendmail</application> aparecerá en la lista de procesos.</para> <para>Puede probarlo todo de una forma muy sencilla; conéctese al servidor de correo mediante &man.telnet.1;:</para> <screen>&prompt.root; <userinput>telnet <replaceable>ejemplo.com</replaceable> 25</userinput> Trying 192.0.34.166... Connected to <hostid role="fqdn">ejemplo.com</hostid>. Escape character is '^]'. 220 <hostid role="fqdn">ejemplo.com</hostid> ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT) <userinput>ehlo <replaceable>ejemplo.com</replaceable></userinput> 250-ejemplo.com Hello ejemplo.com [192.0.34.166], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP <userinput>quit</userinput> 221 2.0.0 <hostid role="fqdn">ejemplo.com</hostid> closing connection Connection closed by foreign host.</screen> <para>Si la línea <quote>STARTTLS</quote> aparece en la salida, todo está funcionando correctamente.</para> </sect2> </sect1> <sect1 id="ipsec"> <sect1info> <authorgroup> <author> <firstname>Nik</firstname> <surname>Clayton</surname> <affiliation> <address><email>nik@FreeBSD.org</email></address> </affiliation> <contrib>Escrito por </contrib> </author> </authorgroup> </sect1info> <title>VPN sobre IPsec</title> <indexterm> <primary>IPsec</primary> </indexterm> <para>Creación de una VPN entre dos redes, a través de Internet, mediante puertas de enlace (<quote>gateways</quote>) &os;.</para> <sect2> <sect2info> <authorgroup> <author> <firstname>Hiten M.</firstname> <surname>Pandya</surname> <affiliation> <address><email>hmp@FreeBSD.org</email></address> </affiliation> <contrib>Escrito por </contrib> </author> </authorgroup> </sect2info> <title>Qué es IPsec</title> <para>Esta sección le guiará a través del proceso de configuración de IPsec, y de su uso en un entorno consistente en máquinas &os; y <application>µsoft.windows; 2000/XP</application>, para hacer que se comuniquen de manera segura. Para configurar IPsec es necesario que esté familiarizado con los conceptos de construcción de un kernel personalizado (consulte el <xref linkend="kernelconfig"/>).</para> <para><emphasis>IPsec</emphasis> es un protocolo que está sobre la capa del protocolo de Internet (IP). Le permite a dos o más equipos comunicarse de forma segura (de ahí el nombre). La <quote>pila de red</quote> IPsec de &os; se basa en la implementación <ulink url="http://www.kame.net/">KAME</ulink>, que incluye soporte para las dos familias de protocolos, IPv4 e IPv6.</para> <note> <para>FreeBSD 5.X contiene una pila IPsec <quote>acelerada por hardware</quote>, conocida como <quote>Fast IPsec</quote>, que fué obtenida de OpenBSD. Emplea hardware criptográfico (cuando es posible) a través del subsistema &man.crypto.4; para optimizar el rendimiento de IPsec. Este subsistema es nuevo, y no soporta todas las opciones disponibles en la versión KAME de IPsec. Para poder habilitar IPsec acelerado por hardware debe añadir las siguientes opciones al fichero de configuración de su kernel:</para> <indexterm> <primary>opciones de kernel</primary> <secondary>FAST_IPSEC</secondary> </indexterm> <screen> options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) </screen> <para>Tenga en cuenta que no es posible utilizar el subsistema <quote>Fast IPsec</quote> y la implementación KAME de IPsec en la misma computadora. Consulte la página de manual &man.fast.ipsec.4; para más información.</para> </note> <indexterm> <primary>IPsec</primary> <secondary>ESP</secondary> </indexterm> <indexterm> <primary>IPsec</primary> <secondary>AH</secondary> </indexterm> <para>IPsec consta de dos sub-protocolos:</para> <itemizedlist> <listitem> <para><emphasis>Encapsulated Security Payload (ESP)</emphasis>, que protege los datos del paquete IP de interferencias de terceros, cifrando el contenido utilizando algoritmos de criptografía simétrica (como Blowfish, 3DES).</para> </listitem> <listitem> <para><emphasis>Authentication Header (AH)</emphasis>, que protege la cabecera del paquete IP de interferencias de terceros así como contra la falsificación (<quote>spoofing</quote>), calculando una suma de comprobación criptográfica y aplicando a los campos de cabecera IP una función hash segura. Detrás de todo esto va una cabecera adicional que contiene el hash para permitir la validación de la información que contiene el paquete.</para> </listitem> </itemizedlist> <para><acronym>ESP</acronym> y <acronym>AH</acronym> pueden utilizarse conjunta o separadamente, dependiendo del entorno.</para> <indexterm> <primary>VPN</primary> </indexterm> <indexterm> <primary>Red privada virtual</primary> <see>VPN</see> </indexterm> <para>IPsec puede utilizarse para cifrar directamente el tráfico entre dos equipos (conocido como <emphasis>modo de transporte</emphasis>) o para construir <quote>túneles virtuales</quote> entre dos subredes, que pueden usarse para comunicación segura entre dos redes corporativas (conocido como <emphasis>modo de túnel</emphasis>). Este último es muy conocido como una <emphasis>red privada virtual (Virtual Private Network, o VPN)</emphasis>. &man.ipsec.4; contiene información detallada sobre el subsistema IPsec de &os;.</para> <para>Si quiere añdir soporte IPsec a su kernel debe incluir las siguientes opciones al fichero de configuración de su kernel:</para> <indexterm> <primary>opciones de kernel</primary> <secondary>IPSEC</secondary> </indexterm> <indexterm> <primary>opciones de kernel</primary> <secondary>IPSEC_ESP</secondary> </indexterm> <screen> options IPSEC #IP security options IPSEC_ESP #IP security (crypto; define w/ IPSEC) </screen> <indexterm> <primary>opciones de kernel</primary> <secondary>IPSEC_DEBUG</secondary> </indexterm> <para>Si quiere soporte para la depuración de errores no olvide la siguiente opción:</para> <screen> options IPSEC_DEBUG #debug for IP security </screen> </sect2> <sect2> <title>El Problema</title> <para>No existe un estándar para lo que constituye una VPN. Las VPN pueden implementarse utilizando numerosas tecnologías diferentes, cada una de las cuales tiene sus pros y sus contras. Esta sección presenta un escenario, y las estrategias usadas para implementar una VPN para este escenario.</para> </sect2> <sect2> <title>El escenario: dos redes, conectadas por Internet, que queremos que se comporten como una sola</title> <indexterm> <primary>VPN</primary> <secondary>creación</secondary> </indexterm> <para>Este es el punto de partida:</para> <itemizedlist> <listitem> <para>Usted tiene al menos dos sitios</para> </listitem> <listitem> <para>Ambos sitios utilizan IP internamente</para> </listitem> <listitem> <para>Ambos sitios están conectados a Internet, a través de una puerta de enlace &os;.</para> </listitem> <listitem> <para>La puerta de enlace de cada red tiene al menos una dirección IP pública.</para> </listitem> <listitem> <para>Las direcciones internas de las dos redes pueden ser direcciones IP públicas o privadas, no importa. Puede ejecutar NAT en la máquina que hace de puerta de enlace si es necesario.</para> </listitem> <listitem> <para>Las direcciones IP internas de las dos redes <emphasis>no colisionan</emphasis>. Aunque espero que sea teóricamente posible utilizar una combinación de tecnología VPN y NAT para hacer funcionar todo esto sospecho que configurarlo sería una pesadilla.</para> </listitem> </itemizedlist> <para>Si lo que intenta es conectar dos redes y ambas usan el mismo rango de direcciones IP privadas (por ejemplo las dos usan <hostid role="ipaddr">192.168.1.x</hostid>)debería renumerar una de las dos redes.</para> <para>La topología de red se parecería a esto:</para> <mediaobject> <imageobject> <imagedata fileref="security/ipsec-network" align="center"/> </imageobject> <textobject> <literallayout class="monospaced">Network #1 [ Internal Hosts ] Private Net, 192.168.1.2-254 [ Win9x/NT/2K ] [ UNIX ] | | .---[fxp1]---. Private IP, 192.168.1.1 | FreeBSD | `---[fxp0]---' Public IP, A.B.C.D | | -=-=- Internet -=-=- | | .---[fxp0]---. Public IP, W.X.Y.Z | FreeBSD | `---[fxp1]---' Private IP, 192.168.2.1 | | Network #2 [ Internal Hosts ] [ Win9x/NT/2K ] Private Net, 192.168.2.2-254 [ UNIX ]</literallayout> </textobject> </mediaobject> <para>Observe las dos direcciones IP públicas. Usaré letras para referirme a ellas en el resto de este artículo. El cualquier lugar que vea esas letras en este artículo reemplácelas con su propia dirección IP pública. Observe también que internamente las dos máquinas que hacen de puerta de enlace tienen la dirección IP .1, y que las dos redes tienen direcciones IP privadas diferentes (<hostid role="ipaddr">192.168.1.x</hostid> y <hostid role="ipaddr">192.168.2.x</hostid> respectivamente). Todas las máquinas de las redes privadas están configuradas para utilizar la máquina <hostid role="ipaddr">.1</hostid> como su puerta de enlace por defecto.</para> <para>La intención es que, desde el punto de vista de la red, cada red debe ver las máquinas en la otra red como si estuvieran directamente conectadas al mismo router (aunque aunque sea un router ligeramente lento con una tendencia ocasional a tirar paquetes).</para> <para>Esto significa que (por ejemplo), la máquina <hostid role="ipaddr">192.168.1.20</hostid> debe ser capaz de ejecutar</para> <programlisting>ping 192.168.2.34</programlisting> <para>y recibir de forma transparente una respuesta. Las máquinas &windows; deben ser capaces de ver las máquinas de la otra red, acceder a sus ficheros compartidos, etc, exactamente igual que cuando acceden a las máquinas de la red local.</para> <para>Y todo debe hacerse de forma segura. Esto significa que el tráfico entre las dos redes tiene que ser cifrado.</para> <para>La creación de una VPN entre estas dos redes es un proceso que requiere varios pasos. Las etapas son estas:</para> <orderedlist> <listitem> <para>Crear un enlace de red <quote>virtual</quote> entre las dos redes, a través de Internet. Probarlo usando herramientas como &man.ping.8; para asegurarse de que funcione.</para> </listitem> <listitem> <para>Aplicar políticas de seguridad para asegurarse de que el tráfico entre las dos redes sea cifrado y descifrado de forma transparente. Comprobarlo mediante herramientas como &man.tcpdump.1; para asegurarse de que el tráfico esté siendo efectivamente cifrado.</para> </listitem> <listitem> <para>Configurar software adicional en las puertas de enlace &os; para permitir a las máquinas &windows; verse entre ellas a través de la VPN.</para> </listitem> </orderedlist> <sect3> <title>Paso 1: Creación y prueba de un enlace de red <quote>virtual</quote></title> <para>Suponga que está en la puerta de enlace de la red red #1 (con dirección IP pública <hostid role="ipaddr">A.B.C.D</hostid>, dirección IP privada <hostid role="ipaddr">192.168.1.1</hostid>), y ejecuta <command>ping 192.168.2.1</command>, que es la dirección privada de la máquina con dirección IP <hostid role="ipaddr">W.X.Y.Z</hostid>. ?Qué hace falta para esto?</para> <orderedlist> <listitem> <para>La puerta de enlace necesita saber cómo alcanzar a <hostid role="ipaddr">192.168.2.1</hostid>. En otras palabras, necesita tener una ruta hasta <hostid role="ipaddr">192.168.2.1</hostid>.</para> </listitem> <listitem> <para>Las direcciones IP privadas, como las que están en el rango <hostid role="ipaddr">192.168.x</hostid> no deberían aparecer en Internet. Por eso, cada paquete que mande a <hostid role="ipaddr">192.168.2.1</hostid> necesitará encerrarse dentro de otro paquete. Este paquete debe tener todas las características de haber sido enviado desde <hostid role="ipaddr">A.B.C.D</hostid>, y tendrá que ser enviado a <hostid role="ipaddr">W.X.Y.Z</hostid>. Este proceso recibe el nombre de <firstterm>encapsulado</firstterm>.</para> </listitem> <listitem> <para>Una vez que este paquete llega a <hostid role="ipaddr">W.X.Y.Z</hostid> necesitará ser <quote>desencapsulado</quote>, y entregado a <hostid role="ipaddr">192.168.2.1</hostid>.</para> </listitem> </orderedlist> <para>Puede verlo como si necesitara un <quote>túnel</quote> entre las dos redes. Las dos <quote>bocas del túnel</quote> son las direcciones IP <hostid role="ipaddr">A.B.C.D</hostid> y <hostid role="ipaddr">W.X.Y.Z</hostid>, y debe hacer que el túnel sepa cuáles serán las direcciones IP privadas que tendrán permitido el paso a través de él. El túnel se usa para transferir tráfico con direcciones IP privadas a través de la Internet pública.</para> <para>Este túnel se crea mediante la interfaz genérica, o dispositivo <devicename>gif</devicename> en &os;. Como puede imaginarse la interfaz <devicename>gif</devicename> de cada puerta de enlace debe configurarse con cuatro direcciones IP: dos para las direcciones IP públicas, y dos para las direcciones IP privadas.</para> <para>El soporte para el dispositivo gif debe compilarse en el kernel de &os; en ambas máquinas añadiendo la línea</para> <programlisting>device gif</programlisting> <para>a los ficheros de configuración del kernel de ambas máquinas, compilarlo, instalarlo y reiniciar.</para> <para>La configuración del túnel es un proceso que consta de dos partes. Primero se le debe decir al túnel cuáles son las direcciones IP exteriores (o públicas) mediante &man.gifconfig.8;. Después configure las direcciones IP con &man.ifconfig.8;.</para> <note> <para>En &os; 5.X las funciones de &man.gifconfig.8; se han incluido en &man.ifconfig.8;.</para></note> <para>En la puerta de enlace de la red #1 debe ejecutar las siguientes dos órdenes para configurar el túnel.</para> <programlisting>gifconfig gif0 A.B.C.D W.X.Y.Z ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff </programlisting> <para>En la otra puerta de enlace ejecute las mismas órdenes, pero con el orden las direcciones IP invertido.</para> <programlisting>gifconfig gif0 W.X.Y.Z A.B.C.D ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff </programlisting> <para>Ahora ejecute:</para> <programlisting>gifconfig gif0</programlisting> <para>y podrá ver la configuración. Por ejemplo, en la puerta de enlace de la red #1 vería algo parecido a esto:</para> <screen>&prompt.root; <userinput>gifconfig gif0</userinput> gif0: flags=8011<UP,POINTTOPOINT,MULTICAST> mtu 1280 inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff physical address inet A.B.C.D --> W.X.Y.Z </screen> <para>Como puede ver se ha creado un túnel entre las direcciones físicas <hostid role="ipaddr">A.B.C.D</hostid> y <hostid role="ipaddr">W.X.Y.Z</hostid>, y el tráfico que puede pasar a través del túnel es entre <hostid role="ipaddr">192.168.1.1</hostid> y <hostid role="ipaddr">192.168.2.1</hostid>.</para> <para>Esto también habrá agregado una entrada en la tabla de rutas de ambas máquinas, que puede examinar con <command>netstat -rn</command>. Esta salida es de la puerta de enlace de la red #1.</para> <screen>&prompt.root; <userinput>netstat -rn</userinput> Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire ... 192.168.2.1 192.168.1.1 UH 0 0 gif0 ... </screen> <para>Como el valor de <quote>Flags</quote> lo indica, esta es una ruta de equipo, lo que significa que cada puerta de enlace sabe como alcanzar la otra puerta de enlace, pero no saben cómo llegar al resto de sus respectivas redes. Ese problema se solucionará en breve.</para> <para>Es posible que disponga de un cortafuegos en ambas máquinas, por lo que tendrá que buscar la forma de que el tráfico de la VPN pueda entrar y salir limpiamente. Puede permitir todo el tráfico de ambas redes, o puede que quiera incluir reglas en el cortafuegos para que protejan ambos extremos de la VPN uno del otro.</para> <para>Las pruebas se simplifican enormemente si configura el cortafuegos para permitir todo el tráfico a través de la VPN. Siempre puede ajustar las cosas después. Si utiliza &man.ipfw.8; en las puertas de enlace una orden similar a</para> <programlisting>ipfw add 1 allow ip from any to any via gif0</programlisting> <para>permitirá todo el tráfico entre los dos extremos de la VPN, sin afectar al resto de reglas del cortafuegos. Obviamente tendrá que ejecutar esta orden en ambas puertas de enlace.</para> <para>Esto es suficiente para permitir a cada puerta de enlace hacer un ping entre ellas. En <hostid role="ipaddr">192.168.1.1</hostid> deberí poder ejecutar</para> <programlisting>ping 192.168.2.1</programlisting> <para>y obtener una respuesta; es obvio que debería poder hacer los mismo en la otra puerte de enlace.</para> <para>Aún no podrá acceder a las máquinas internas de las redes. El problema está en el encaminamiento: aunque las puertas de enlace saben cómo alcanzarse mútuamente no saben cómo llegar a la red que hay detrás de la otra.</para> <para>Para resolver este problema debe añadir una ruta estática en cada puerta de enlace. La orden en la primera puerta de enlace podría ser:</para> <programlisting>route add 192.168.2.0 192.168.2.1 netmask 0xffffff00 </programlisting> <para>Esto significa <quote>Para alcanzar los equipos en la red <hostid role="ipaddr">192.168.2.0</hostid>, envía los paquetes al equipo <hostid role="ipaddr">192.168.2.1</hostid></quote>. Necesitará ejecutar una orden similar en la otra puerta de enlace, pero obviamente con las direcciones <hostid role="ipaddr">192.168.1.x</hostid>.</para> <para>El tráfico IP de equipos en una red no será capaz de alcanzar equipos en la otra red.</para> <para>Ya tiene dos tercios de una VPN, puesto que ya es <quote>virtual</quote> y es una <quote>red</quote>. Todavía no es privada. Puede comprobarlo con &man.ping.8; y &man.tcpdump.1;. Abra una sesión en la puerta de enlace y ejecute</para> <programlisting>tcpdump dst host 192.168.2.1</programlisting> <para>En otra sesión en el mismo equipo ejecute</para> <programlisting>ping 192.168.2.1</programlisting> <para>Verá algo muy parecido a esto:</para> <programlisting> 16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply 16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply 16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply </programlisting> <para>Como puede ver los mensajes ICMP van y vienen sin cifrar. Si usa el parámetro <option>-s</option> en &man.tcpdump.1; para tomar más bytes de datos de estos paquetes verá más información.</para> <para>Obviamente esto es inaceptable. La siguiente sección explicará cómo asegurar el enlace entre las dos redes para que todo el tráfico se cifre automáticamente.</para> <itemizedlist> <title>Sumario:</title> <listitem> <para>Configure ambos kernel con <quote>pseudo-device gif</quote>.</para> </listitem> <listitem> <para>Edite <filename>/etc/rc.conf</filename> en la puerta de enlace #1 y añada las siguientes líneas (reemplazando las direcciones IP según sea necesario).</para> <programlisting>gifconfig_gif0="A.B.C.D W.X.Y.Z" ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff" static_routes="vpn" route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00" </programlisting> </listitem> <listitem> <para>Edite la configuración de su cortafuegos (<filename>/etc/rc.firewall</filename>, o lo que corresponda) en ambos equipos y añada</para> <programlisting>ipfw add 1 allow ip from any to any via gif0</programlisting> </listitem> <listitem> <para>Haga los cambios oportunos en el <filename>/etc/rc.conf</filename> de la puerta de enlace #2, invirtiendo el orden de las direcciones IP.</para> </listitem> </itemizedlist> </sect3> <sect3> <title>Paso 2: Asegurar el enlace</title> <para>Para asegurar el enlace usaremos IPsec. IPsec ofrece un mecanismo para que dos equipos coincidan en una llave de cifrado, y usar esta llave para cifrar los datos entre los dos equipos.</para> <para>Existen dos áreas de configuración a tener en cuenta:</para> <orderedlist> <listitem> <para>Debe existir un mecanismo para que los dos equipos se pongan de acuerdo en el mecanismo de cifrado que van a utilizar. Una vez que los dos equipos se han puesto de acuerdo dice que existe una <quote>asociación de seguridad</quote> entre ellos.</para> </listitem> <listitem> <para>Debe existir un mecanismo para especificar que tráfico debe ser cifrado. Obviamente, usted no querrá cifrar todo su tráfico saliente: solo querrá cifrar el tráfico que es parte de la VPN. Las reglas con las que determinará qué tráfico será cifrado se llaman <quote>políticas de seguridad</quote>.</para> </listitem> </orderedlist> <para>Tanto las asociaciones de seguridad como las políticas de seguridad son responsabilidad del kernel, pero pueden ser modificadas desde el espacio de usuario. Antes de poder hacerlo, tendrá que configurar el kernel para que incluya IPsec y el protocolo ESP (Encapsulated Security Payload). Incluya en el fichero de configuración de su kernel lo siguiente:</para> <indexterm> <primary>opciones de kernel</primary> <secondary>IPSEC</secondary> </indexterm> <programlisting>options IPSEC options IPSEC_ESP </programlisting> <para>Recompile y resintale su kernel y reinicie. Como se dijo anteriormente, tendrá que hacer lo mismo en el kernel de las dos puertas de enlace.</para> <indexterm> <primary>IKE</primary> </indexterm> <para>Tiene dos opciones cuando se trata de configurar asociaciones de seguridad. Puede configurarlas a mano en los dos equipos, lo que significa elegir el algoritmo de cifrado, las llaves de cifrado, etc, o puede utilizar alguno de los dæmons que implementan el protocolo de intercambio de llaves de Internet (IKE, Internet Key Exchange).</para> <para>Le recomiendo la segunda opción. Aparte de otras consideraciones es más fácil de configurar.</para> <indexterm> <primary>IPsec</primary> <secondary>políticas de seguridad</secondary> </indexterm> <indexterm> <primary><command>setkey</command></primary> </indexterm> <para>La edición y despliegue se efectúa con &man.setkey.8;. Todo esto se entiende mejor con una analogía. <command>setkey</command> es a las tablas de políticas de seguridad del kernel lo que &man.route.8; es a las tablas de rutas del kernel. También puede usar <command>setkey</command> ver las asociaciones de seguridad en vigor, siguiendo con la analogía, igual que puede usar <command>netstat -r</command>.</para> <para>Existen numerosos dæmons que pueden encargarse de la gestión de asociaciones de seguridad en &os;. En este texto se muestra cómo usar uno de ellos, racoon (que puede instalar desde <filename role="package">security/racoon</filename> en la colección de ports de &os;.</para> <indexterm> <primary>racoon</primary> </indexterm> <para>El software <filename role="package">security/racoon</filename> debe ejecutarse en las dos puertas de enlace. En cada equipo debe configurar la dirección IP del otro extremo de la VPN y una llave secreta (que usted puede y debe elegir, y debe ser la misma en ambas puertas de enlace).</para> <para>Los dos dæmons entran en contacto uno con otro, y confirman que son quienes dicen ser (utilizando la llave secreta que usted configuró). Los dæmons generan una nueva llave secreta, y la utilizan para cifrar el tráfico que discurre a través de la VPN. Periódicamente cambian esta llave, para que incluso si un atacante comprometiera una de las llaves (lo cual es teóricamente cercano a imposible) no le serviriía de mucho: para cuando el atacante haya <quote>crackeado</quote> la llave los dæmons ya habrán escogido una nueva.</para> <para>El fichero de configuración de racoon está en <filename>${PREFIX}/etc/racoon</filename>. No debería tener que hacer demasiados cambios a ese fichero. El otro componente de la configuración de racoon (que <emphasis>sí</emphasis> tendrá que modificar) es la <quote>llave pre-compartida</quote>.</para> <para>La configuración por defecto de racoon espera encontrarla en <filename>${PREFIX}/etc/racoon/psk.txt</filename>. Es importante saber que la llave precompartida <emphasis>no</emphasis> es la llave que se utilizará para cifrar el tráfico a través del enlace VPN; solamente es una muestra que permite a los dæmons que administran las llaves confiar el uno en el otro.</para> <para><filename>psk.txt</filename> contiene una línea por cada sitio remoto con el que esté tratando. En nuestro ejemplo, donde existen dos sitios, cada fichero <filename>psk.txt</filename> contendrá una línea (porque cada extremo de la VPN solo está tratando con un sitio en el otro extremo).</para> <para>En la puerta de enlace #1 esta línea debería parecerse a esta:</para> <programlisting>W.X.Y.Z secreto</programlisting> <para>Esto es, la dirección IP <emphasis>pública</emphasis> del extremo remoto, un espacio en blanco, y una cadena de texto que es el secreto en sí. en el extremo remoto, espacio en blanco, y un texto de cadena que proporcina el secreto. Obviamente, no debe utilizar <quote>secret</quote> como su llave; aplique aquí las reglas y recomendaciones habituales para la elección de contraseñas.</para> <para>En la puerta de enlace #2 la línea se parecería a esta</para> <programlisting>A.B.C.D secreto</programlisting> <para>Esto es, la dirección IP pública del extremo remoto, y la misma llave secreta. <filename>psk.txt</filename> debe tener modo <literal>0600</literal> (es decir, modo de solo lectura/escritura para <username>root</username>) antes de que ejecute racoon.</para> <para>Debe ejecutar racoon en ambas puertas de enlace. También tendrá que añadir algunas reglas a su cortafuegos para permitir el tráfico IKE, que se transporta sobre UDP al puerto ISAKMP (Internet Security Association Key Management Protocol). Esto debe estar al principio de las reglas de su cortafuegos.</para> <programlisting>ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp </programlisting> <para>Una vez que ejecute racoon puede tratar de hacer un ping a una puerta de enlace desde la otra. La conexión todavía no está cifrada porque aún no se han creado las asociaciones de seguridad entre los dos equipos: esto puede llevar un poco de tiempo; es posible que advierta un pequeño retraso antes de los ping empiecen responder.</para> <para>Una vez creadas las asociaciones de seguridad puede verlas utilizando &man.setkey.8;. Ejecute</para> <programlisting>setkey -D</programlisting> <para>en cualquiera de los equipos para comprobar la información de la asociación de seguridad.</para> <para>Ya está resuelta la mitad del problema. La otra mitad es configurar sus políticas de seguridad.</para> <para>Queremos crear una política de seguridad sensata, así que vamos a revisar lo que tenemos configurado hasta el momento. Esta revisión abarca ambos extremos del enlace.</para> <para>Cada paquete IP que usted manda tiene una cabecera que contiene datos acerca del paquete. La cabecera incluye la dirección IP de destino y del origen. Como ya sabemos, las direcciones IP privadas como el rango <hostid role="ipaddr">192.168.x.y</hostid> no deberían aparezcan en Internet. Dado que es a través de Internet por donde los queremos transmitir los debemos encapsular dentro de otro paquete. Este paquete debe contener tanto la dirección IP de destino y origen públicas sustituidas por las direcciones privadas.</para> <para>Así que si su paquete saliente empezó pareciendose a este:</para> <mediaobject> <imageobject> <imagedata fileref="security/ipsec-out-pkt" align="center"/> </imageobject> <textobject> <literallayout class="monospaced"> .----------------------. | Src: 192.168.1.1 | | Dst: 192.168.2.1 | | <other header info> | +----------------------+ | <packet data> | `----------------------'</literallayout> </textobject> </mediaobject> <para>tras el encapsulado se parecerá bastante a este:</para> <mediaobject> <imageobject> <imagedata fileref="security/ipsec-encap-pkt" align="center"/> </imageobject> <textobject> <literallayout class="monospaced"> .--------------------------. | Src: A.B.C.D | | Dst: W.X.Y.Z | | <other header info> | +--------------------------+ | .----------------------. | | | Src: 192.168.1.1 | | | | Dst: 192.168.2.1 | | | | <other header info> | | | +----------------------+ | | | <packet data> | | | `----------------------' | `--------------------------'</literallayout> </textobject> </mediaobject> <para>El dispositivo <devicename>gif</devicename> se encarga del encapsulado. Como puede ver el paquete tiene una dirección IP real en el exterior, y nuestro paquete original ha sido envuelto como dato dentro del paquete que enviaremos a través de Internet.</para> <para>Obviamente, queremos que todo el tráfico entre las VPN vaya cifrado. Pongamos esto último en palabras para comprenderlo mejor:</para> <para><quote>Si un paquete sale desde <hostid role="ipaddr">A.B.C.D</hostid>, y tiene como destino <hostid role="ipaddr">W.X.Y.Z</hostid>, cífralo utilizando las asociaciones de seguridad necesarias.</quote></para> <para><quote>Si un paquete llega desde <hostid role="ipaddr">W.X.Y.Z</hostid>, y tiene como destino <hostid role="ipaddr">A.B.C.D</hostid>, descífralo utilizando las asociaciones de seguridad necesarias.</quote></para> <para>Este planteamiento se aproxima bastante, pero no es exactamente lo que queremos hacer. Si lo hiciera así todo el tráfico desde y hacia <hostid role="ipaddr">W.X.Y.Z</hostid>, incluso el tráfico que no forma parte de la VPN, será cifrado; esto no es lo que queremos. La política correcta es la siguiente:</para> <para><quote>Si un paquete sale desde <hostid role="ipaddr">A.B.C.D</hostid>, y está encapsulando a otro paquete, y tiene como destino <hostid role="ipaddr">W.X.Y.Z</hostid>, cífralo utilizando las asociaciones de seguridad necesarias.</quote></para> <para><quote>Si un paquete llega desde <hostid role="ipaddr">W.X.Y.Z</hostid>, y está encapsulando a otro paquete, y tiene como destino <hostid role="ipaddr">A.B.C.D</hostid>, descífralo utilizando las asociaciones de seguridad necesarias.</quote></para> <para>Un cambio sutil, pero necesario.</para> <para>Las políticas de seguridad también se imponen utilizando &man.setkey.8;. &man.setkey.8; proporciona un lenguaje de configuración para definir la política. Puede introducir las instrucciones de configuración a través de la entrada estándar (stdin), o puede usar la opción <option>-f</option> para especificar un fichero que contenga las instrucciones de configuración.</para> <para>La configuración en la puerta de enlace #1 (que tiene la dirección IP pública <hostid role="ipaddr">A.B.C.D</hostid>) para forzar que todo el tráfico saliente hacia <hostid role="ipaddr">W.X.Y.Z</hostid> vaya cifrado es:</para> <programlisting> spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; </programlisting> <para>Ponga estas órdenes en un fichero (por ejemplo <filename>/etc/ipsec.conf</filename>) y ejecute</para> <screen>&prompt.root; <userinput>setkey -f /etc/ipsec.conf</userinput></screen> <para><option>spdadd</option> le dice a &man.setkey.8; que queremos añadir una regla a la base de datos de políticas de seguridad. El resto de la línea especifica qué paquetes se ajustarán a esta política. <hostid role="ipaddr">A.B.C.D/32</hostid> y <hostid role="ipaddr">W.X.Y.Z/32</hostid> son las direcciones IP y máscaras de red que identifican la red o equipos a los que se aplicará esta política. En nuestro caso queremos aplicarla al tráfico entre estos dos equipos. <option>-P out</option> dice que esta política se aplica a paquetes salientes, e <option>ipsec</option> hace que el paquete sea asegurado.</para> <para>La segunda línea especifica cómo será cifrado este paquete. <option>esp</option> es el protocolo que se utilizará, mientras que <option>tunnel</option> indica que el paquete será después encapsulado en un paquete IPsec. El uso repetido de <hostid role="ipaddr">A.B.C.D</hostid> y <hostid role="ipaddr">W.X.Y.Z</hostid> se utiliza para seleccionar la asociación de seguridad a usar, y por último <option>require</option> exige que los paquetes deben cifrarse si concuerdan con esta regla.</para> <para>Esta regla solo concuerda con paquetes salientes. Necesitará una regla similar para los paquetes entrantes.</para> <programlisting>spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;</programlisting> <para>Observe el <option>in</option> en lugar del <option>out</option> en este caso, y la inversión necesaria de las direcciones IP.</para> <para>La otra puerta de enlace (que tiene la dirección IP pública <hostid role="ipaddr">W.X.Y.Z</hostid>) necesitará reglas similares.</para> <programlisting>spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;</programlisting> <para>Finalmente, necesita añadir reglas a su cortafuegos para permitir la circulación de paquetes ESP e IPENCAP de ida y vuelta. Tendrá que añadir reglas como estas a ambos equipos.</para> <programlisting>ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D </programlisting> <para>Debido a que las reglas son simétricas puede utilizar las mismas reglas en ambas puertas de enlace.</para> <para>Los paquetes salientes tendrán ahora este aspecto:</para> <mediaobject> <imageobject> <imagedata fileref="security/ipsec-crypt-pkt" align="center"/> </imageobject> <textobject> <literallayout class="monospaced"> .------------------------------. --------------------------. | Src: A.B.C.D | | | Dst: W.X.Y.Z | | | <other header info> | | Encrypted +------------------------------+ | packet. | .--------------------------. | -------------. | contents | | Src: A.B.C.D | | | | are | | Dst: W.X.Y.Z | | | | completely | | <other header info> | | | |- secure | +--------------------------+ | | Encap'd | from third | | .----------------------. | | -. | packet | party | | | Src: 192.168.1.1 | | | | Original |- with real | snooping | | | Dst: 192.168.2.1 | | | | packet, | IP addr | | | | <other header info> | | | |- private | | | | +----------------------+ | | | IP addr | | | | | <packet data> | | | | | | | | `----------------------' | | -' | | | `--------------------------' | -------------' | `------------------------------' --------------------------' </literallayout> </textobject> </mediaobject> <para>Cuando los paquetes llegan al otro extremo de la VPN serán descifrados (utilizando las asociaciones de seguridad que han sido negociadas por racoon). Después entrarán al interfaz <devicename>gif</devicename>, que desenvuelve la segunda capa, hasta que nos quedamos con paquete má interno, que puede entonces viajar a la red interna.</para> <para>Puede revisar la seguridad utilizando la misma prueba de &man.ping.8; anterior. Primero, inicie una sesión en la puerta de enlace <hostid role="ipaddr">A.B.C.D</hostid>, y ejecute:</para> <programlisting>tcpdump dst host 192.168.2.1</programlisting> <para>En otra sesión en la misma máquina ejecute</para> <programlisting>ping 192.168.2.1</programlisting> <para>Debería ver algo similar a lo siguiente:</para> <programlisting>XXX tcpdump output</programlisting> <para>ahora, como puede ver, &man.tcpdump.1; muestra los paquetes ESP. Si trata de examinarlos con la opción <option>-s</option> verá basura (aparentemente), debido al cifrado.</para> <para>Felicidades. Acaba de configurar una VPN entre dos sitios remotos.</para> <itemizedlist> <title>Sumario</title> <listitem> <para>Configure ambos kernel con:</para> <programlisting>options IPSEC options IPSEC_ESP </programlisting> </listitem> <listitem> <para>Instale <filename role="package">security/racoon</filename>. Edite <filename>${PREFIX}/etc/racoon/psk.txt</filename> en ambas puertas de enlace añadiendo una entrada para la dirección IP del equipo remoto y una llave secreta que ambos conozcan. Asegúrese de que este fichero esté en modo 0600.</para> </listitem> <listitem> <para>Añada las siguientes líneas a <filename>/etc/rc.conf</filename> en ambos equipos:</para> <programlisting>ipsec_enable="YES" ipsec_file="/etc/ipsec.conf" </programlisting> </listitem> <listitem> <para>Crée en ambos equipos un <filename>/etc/ipsec.conf</filename> que contenga las líneas spdadd necesarias. En la puerta de enlace #1 sería:</para> <programlisting> spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; </programlisting> <para>En la puerta de enlace #2 sería:</para> <programlisting> spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; </programlisting> </listitem> <listitem> <para>Añada a su(s) cortafuegos las reglas necesarias para que permita(n) el paso de tráfico IKE, ESP e IPENCAP en ambos equipos:</para> <programlisting> ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D </programlisting> </listitem> </itemizedlist> <para>Los dos pasos previos deben bastar para levantar la VPN. Las máquinas en cada red seán capaces de dirigirse una a otra utilizando direcciones IP, y todo el tráfico a través del enlace será cifrado de forma automática y segura.</para> </sect3> </sect2> </sect1> <sect1 id="openssh"> <sect1info> <authorgroup> <author> <firstname>Chern</firstname> <surname>Lee</surname> <contrib>Escrito por </contrib> </author> <!-- 21 April 2001 --> </authorgroup> </sect1info> <title>OpenSSH</title> <indexterm><primary>OpenSSH</primary></indexterm> <indexterm> <primary>seguridad</primary> <secondary>OpenSSH</secondary> </indexterm> <para><application>OpenSSH</application> es un conjunto de herramientas de conectividad que se usan para acceder a sistemas remotos de forma segura. Puede usarse como sustituto directo de <command>rlogin</command>, <command>rsh</command>, <command>rcp</command> y <command>telnet</command>. Además cualquier otra conexión TCP/IP puede reenviarse o enviarse a través de un túnel a través de SSH. <application>OpenSSH</application> cifra todo el tráfico para eliminar de forma efectiva el espionaje, el secuestro de conexiones, y otros ataques en la capa de red.</para> <para><application>OpenSSH</application> está a cargo del proyecto OpenBSD, y está basado en SSH v1.2.12, con todos los errores recientes corregidos y todas las actualizaciones correspondientes. Es compatible con los protocolos SSH 1 y 2. <application>OpenSSH</application> forma parte del sistema base desde &os; 4.0.</para> <sect2> <title>Ventajas de utilizar OpenSSH</title> <para>Normalmente, al utilizar &man.telnet.1; o &man.rlogin.1; los datos se envían a través de la red en limpio, es decir, sin cifrar. Cualquier <quote>sniffer</quote> de red entre el cliente y el servidor puede robar la información de usuario/contraseña o los datos transferidos durante su sesión. <application>OpenSSH</application> ofrece diversos métodos de validación y cifrado para evitar que sucedan estas cosas.</para> </sect2> <sect2> <title>Habilitar sshd</title> <indexterm> <primary>OpenSSH</primary> <secondary>habilitar</secondary> </indexterm> <para>El dæmon <application>sshd</application> está habilitado por defecto &os; 4.X y puede elegir habilitarlo o no durante la instalación en &os; 5.X. Si quiere saber si está habilitado revise si la siguiente línea está en <filename>rc.conf</filename>:</para> <screen>sshd_enable="YES"</screen> <para>Esta línea cargará &man.sshd.8;, el programa dæmon de <application>OpenSSH</application>, en el arranque de su sistema. Puede ejecutar el dæmon <application>sshd</application> tecleando <command>sshd</command> en la línea de órdenes.</para> </sect2> <sect2> <title>Cliente SSH</title> <indexterm> <primary>OpenSSH</primary> <secondary>cliente</secondary> </indexterm> <para>&man.ssh.1; funciona de manera similar a &man.rlogin.1;.</para> <screen>&prompt.root; <userinput>ssh <replaceable>user@example.com</replaceable></userinput> Host key not found from the list of known hosts. Are you sure you want to continue connecting (yes/no)? <userinput>yes</userinput> Host 'ejemplo.com' added to the list of known hosts. usuario@ejemplo.com's password: <userinput>*******</userinput></screen> <para>El login continuará como lo haría si fuera una sesión de <command>rlogin</command> o <command>telnet</command>. SSH utiliza un sistema de huellas de llaves para verificar la autenticidad del servidor cuando el cliente se conecta. Se le pide al usuario que introduzca <literal>yes</literal> solamente la primera vez que se conecta. Todos los intentos futuros de login se verifican contra la huella de la llave guardada la primera vez. El cliente SSH le alertará si la huella guardada difiere de la huella recibida en futuros intentos de acceso al sistema. Las huellas se guardan en <filename>~/.ssh/known_hosts</filename>, y en <filename>~/.ssh/known_hosts2</filename> las huellas SSH v2.</para> <para>Por defecto las versiones recientes de los servidores <application>OpenSSH</application> solamente aceptan conexiones SSH v2. El cliente utilizará la versión 2 si es posible y pasará como respaldo a la versión 1. El cliente puede también ser obligado a utilizar una u otra pasándole <option>-1</option> o <option>-2</option>, respectivamente para la versión 1 y la versión 2. Se mantiene la compatibilidad del cliente con la versión 1 para mantener la compatibilidad con versiones antiguas.</para> </sect2> <sect2> <title>Copia segura</title> <indexterm> <primary>OpenSSH</primary> <secondary>copia segura</secondary> </indexterm> <indexterm><primary><command>scp</command></primary></indexterm> <para>&man.scp.1; funciona de manera muy similar a &man.rcp.1;; copia un fichero desde o hacia un sistema remoto, con la diferencia de que lo hace de una forma segura.</para> <screen>&prompt.root; <userinput> scp <replaceable>usuario@ejemplo.com:/COPYRIGHT COPYRIGHT</replaceable></userinput> usuario@ejemplo.com's password: <userinput>*******</userinput> COPYRIGHT 100% |*****************************| 4735 00:00 &prompt.root;</screen> <para>Ya que la huella se guardó en este equipo durante el ejemplo anterior se verifica ahora al utilizar &man.scp.1;.</para> <para>Los argumentos de &man.scp.1; son similares a &man.cp.1;, con el fichero o ficheros como primer argumento, y el destino como segundo. Ya que el fichero se transfiere a través de la red, a través de SSH, uno o más argumentos tienen la estructura <option>user@host:<ruta_al_fichero_remoto></option>.</para> </sect2> <sect2> <title>Configuración</title> <indexterm> <primary>OpenSSH</primary> <secondary>configuración</secondary> </indexterm> <para>Los ficheros de configuración del sistema tanto para el dæmon <application>OpenSSH</application> como para el cliente están en <filename>/etc/ssh</filename>.</para> <para><filename>ssh_config</filename> contiene las opciones del cliente, mientras que <filename>sshd_config</filename> configura el dæmon.</para> <para>Además las opciones <option>sshd_program</option> (<filename>/usr/sbin/sshd</filename> por defecto), y <option>sshd_flags</option> de <filename>rc.conf</filename> ofrecer más niveles de configuración.</para> </sect2> <sect2 id="security-ssh-keygen"> <title>ssh-keygen</title> <para>&man.ssh-keygen.1; le permite validar a un usuario sin pedirle la contraseña:</para> <screen>&prompt.user; <userinput>ssh-keygen -t <replaceable>dsa</replaceable></userinput> Generating public/private dsa key pair. Enter file in which to save the key (/home/user/.ssh/id_dsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_dsa. Your public key has been saved in /home/user/.ssh/id_dsa.pub. The key fingerprint is: bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 usuario@host.ejemplo.com </screen> <para>&man.ssh-keygen.1; creará un par de llaves pública y privada para usar en la validación. La llave privada se guarda en <filename>~/.ssh/id_dsa</filename> o en <filename>~/.ssh/id_rsa</filename>, mientras que la llave pública se guarda en <filename>~/.ssh/id_dsa.pub</filename> o en <filename>~/.ssh/id_rsa.pub</filename>, respectivamente para llaves DSA y RSA. La llave pública debe guardarse en el <filename>~/.ssh/authorized_keys</filename> de la máquina remota para que la configuración funcione. Las llaves RSA versión 1 deben guardarse en <filename>~/.ssh/authorized_keys</filename>.</para> <para>De este modo permitirá conexiones a la máquina remota mediante llaves SSH en lugar de contraseñas.</para> <para>Si usa una contraseña al ejecutar &man.ssh-keygen.1;, se le pedirá al usuario una contraseña cada vez que quiera utilizar la llave privada. &man.ssh-agent.1; puede evitar la molestia de introducir repetidamente frases largas. esto se explica má adelante, en la <xref linkend="security-ssh-agent"/>.</para> <warning><para>Las opciones y ficheros pueden ser diferentes según la versión de <application>OpenSSH</application> que tenga en su sistema; para evitar problemas consulte la página de manual &man.ssh-keygen.1;.</para></warning> </sect2> <sect2 id="security-ssh-agent"> <title>ssh-agent y ssh-add</title> <para>&man.ssh-agent.1; y &man.ssh-add.1; ofrecen métodos para que las llaves <application>SSH</application> se puedan cargar en memoria, permitiendo eliminar la necesidad de teclear la contraseña cada vez que haga falta.</para> <para>&man.ssh-agent.1; gestionará la validación utilizando la llave (o llaves) privada que le cargue. &man.ssh-agent.1; se usa para lanzar otras aplicaciones. En el nivel más básico puede generar una shell o a un nivel más avanzado un gestor de ventanas.</para> <para>Para usar &man.ssh-agent.1; en una shell necesitará primero ser invocado como argumento por una shell. Segundo, añada la identidad ejecutando &man.ssh-add.1; y facilitando la contraseña de la llave privada. Completados estos pasos el usuario puede hacer &man.ssh.1; a cualquier equipo que tenga instalada la llave pública correspondiente. Por ejemplo:</para> <screen>&prompt.user; ssh-agent <replaceable>csh</replaceable> &prompt.user; ssh-add Enter passphrase for /home/user/.ssh/id_dsa: Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa) &prompt.user;</screen> <para>Para utilizar &man.ssh-agent.1; en X11 tendrá que incluir una llamada a &man.ssh-agent.1; en <filename>~/.xinitrc</filename>. De este modo ofrecerá los servicios de &man.ssh-agent.1; a todos los programas lanzados en X11. Veamos un ejemplo de <filename>~/.xinitrc</filename>:</para> <programlisting>exec ssh-agent <replaceable>startxfce4</replaceable></programlisting> <para>Esto lanzaría &man.ssh-agent.1;, que a su vez lanzaría <application>XFCE</application> cada vez que inicie X11. Hecho esto y una vez reiniciado X11 para aplicar los cambios puede ejecutar &man.ssh-add.1; para cargar todas sus llaves SSH.</para> </sect2> <sect2 id="security-ssh-tunneling"> <title>Túneles SSH</title> <indexterm> <primary>OpenSSH</primary> <secondary>túneles</secondary> </indexterm> <para><application>OpenSSH</application> permite crear un túnel en el que encapsular otro protocolo en una sesión cifrada.</para> <para>La siguiente orden le dice a &man.ssh.1; que cree un túnel para <application>telnet</application>:</para> <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>5023:localhost:23 usuario@foo.ejemplo.com</replaceable></userinput> &prompt.user;</screen> <para>Veamos las opciones que se le han suministrado a <command>ssh</command>:</para> <variablelist> <varlistentry> <term><option>-2</option></term> <listitem> <para>Obliga a <command>ssh</command> a utilizar la versión 2 del protocolo. (No la use si está trabajando con servidores SSH antiguos)</para> </listitem> </varlistentry> <varlistentry> <term><option>-N</option></term> <listitem> <para>Indica que no se ejecutará una orden remota, o solamente túnel. Si se omite, <command>ssh</command> iniciaría una sesión normal.</para> </listitem> </varlistentry> <varlistentry> <term><option>-f</option></term> <listitem> <para>Obliga a <command>ssh</command> a ejecutarse en segundo plano.</para> </listitem> </varlistentry> <varlistentry> <term><option>-L</option></term> <listitem> <para>Indica un túnel local según el esquema <replaceable>puerto local:equipo remoto:puerto remoto</replaceable>.</para> </listitem> </varlistentry> <varlistentry> <term><option>usuario@foo.ejemplo.com</option></term> <listitem> <para>El servidor SSH remoto.</para> </listitem> </varlistentry> </variablelist> <para>Un túnel SSH crea un socket que escucha en <hostid>localhost</hostid> en el puerto especificado. Luego reenvía cualquier conexión recibida en el puerto/equipo local vía la conexión SSH al puerto o equipo remoto especificado.</para> <para>En el ejemplo el puerto <replaceable>5023</replaceable> en <hostid>localhost</hostid> se reenvía al puerto <replaceable>23</replaceable> del <hostid>localhost</hostid> de la máquina remota. Ya que <replaceable>23</replaceable> es <application>telnet</application>, esto crearía una sesión <application>telnet</application> segura a través de un túnel SSH.</para> <para>Puede usar esto para encapsular cualquier otro protocolo TCP inseguro como SMTP, POP3, FTP, etc.</para> <example> <title>Uso de SSH para crear un túnel seguro para SMTP</title> <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>5025:localhost:25 usuario@correo.ejemplo.com</replaceable></userinput> usuario@correo.ejemplo.com's password: <userinput>*****</userinput> &prompt.user; <userinput>telnet localhost 5025</userinput> Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 correo.ejemplo.com ESMTP</screen> <para>Puede usar esta técnica junto con &man.ssh-keygen.1; y cuentas adicionales de usuario para crear un entorno más transparente, esto es, más cómodo. Puede usar llaves en lugar de teclear contraseñas y puede ejecutar los túneles de varios usuarios.</para> </example> <sect3> <title>Ejemplos prácticos de túneles SSH</title> <sect4> <title>Acceso seguro a un servidor POP3</title> <para>En el trabajo hay un servidor SSH que acepta conexiones desde el exterior. En la misma red de la oficina reside un servidor de correo que ejecuta un servidor POP3. La red, o ruta de red entre su casa y oficina puede o no ser completamente de fiar. Debido a esto necesita revisar su correo electrónico de forma segura. La solución es crear una conexión SSH al servidor SSH de su oficina y llegar por un túnel al servidor de correo.</para> <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>2110:correo.ejemplo.com:110 usuario@servidor-ssh.ejemplo.com</replaceable></userinput> usuario@servidor-ssh.ejemplo.com's password: <userinput>******</userinput></screen> <para>cuando el túnel esté funcionando haga que su cliente de correo envíe peticiones POP3 a <hostid>localhost</hostid> en el puerto 2110. La conexión será reenviada de forma totalmente segura a traveés del túnel a <hostid>correo.ejemplo.com</hostid>.</para> </sect4> <sect4> <title>Saltarse un cortafuegos draconiano</title> <para>Algunos administradores de red imponen reglas de cortafuegos extremadamente draconianas, filtrando no solo las conexiones entrantes, sino también las salientes. Tal vez solo se le otorgue acceso a máquinas remotas a través de los puertos 22 y 80 para ssh y navegar en web.</para> <para>Tal vez quiera acceder a otros servicios (que tal vez ni siquiera estén relacionados con el trabajo), como un servidor Ogg Vorbis para escuchar música. Si ese servidor Ogg Vorbis transmite en un puerto que no sea el 22 o el 80 no podrá tener acceso a él.</para> <para>La solución es crear una conexión SSH fuera del cortafuegos de su red y utilizarla para hacer un túnel al servidor Ogg Vorbis.</para> <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>8888:musica.ejemplo.com:8000 usuario@sistema-no-filtrado.ejemplo.org</replaceable></userinput> usuario@sistema-no-filtrado.ejemplo.org's password: <userinput>*******</userinput></screen> <para>Haga que el programa con el que suele escuchar música haga peticiones a <hostid>localhost</hostid> puerto 8888, que será reenviado a <hostid>musica.ejemplo.com</hostid> puerto 8000, evadiendo con éxito el cortafuegos.</para> </sect4> </sect3> </sect2> <sect2> <title>La opción de usuarios <varname>AllowUsers</varname></title> <para>Limitar qué usuarios pueden entrar y desde dónde suele ser razonable. La opción <literal>AllowUsers</literal> le permite configurarlo, por ejemplo, para permitir entrar solamente al usuario <username>root</username> desde <hostid role="ipaddr">192.168.1.32</hostid>. Puede hacerlo con algo parecido a esto en <filename>/etc/ssh/sshd_config</filename>:</para> <programlisting>AllowUsers root@192.168.1.32</programlisting> <para>Para permitir al usuario <username>admin</username> la entrada desde cualquier lugar, solamente introduzca el nombre de usuario:</para> <programlisting>AllowUsers admin</programlisting> <para>Puede listar múltiples usuarios en la misma línea:</para> <programlisting>AllowUsers root@192.168.1.32 admin</programlisting> <note> <para>Es importante que incluya a cada usuario que necesite entrar a esta máquina o no podrán entrar.</para> </note> <para>Después de hacer los cambios a b <filename>/etc/ssh/sshd_config</filename> debe decirle a &man.sshd.8; que cargue de nuevo sus ficheros de configuración ejecutando:</para> <screen>&prompt.root; <userinput>/etc/rc.d/sshd reload</userinput></screen> </sect2> <sect2> <title>Lecturas complementarias</title> <para><ulink url="http://www.openssh.com/">OpenSSH</ulink></para> <para>&man.ssh.1; &man.scp.1; &man.ssh-keygen.1; &man.ssh-agent.1; &man.ssh-add.1; &man.ssh.config.5;</para> <para>&man.sshd.8; &man.sftp-server.8; &man.sshd.config.5;</para> </sect2> </sect1> <sect1 id="fs-acl"> <sect1info> <authorgroup> <author> <firstname>Tom</firstname> <surname>Rhodes</surname> <contrib>Contribuido por </contrib> </author> </authorgroup> </sect1info> <title>Listas de control de acceso a sistemas de ficheros</title> <indexterm> <primary>ACL</primary> </indexterm> <para>Además de otras mejoras del sistema de ficheros como las instantáneas (<quote>snapshots</quote>), &os; 5.0 y siguientes ofrecen las ACL (<quote>Access Control Lists</quote>, listas de control de acceso) como un elemento más de seguridad.</para> <para>Las listas de control de acceso extienden el modelo de permisos estándar de &unix; de una manera altamente compatible (&posix;.1e). Esta opción permite al administrador usar con gran provecho un modelo de seguridad más sofisticado.</para> <para>Para habilitar soporte de <acronym>ACL</acronym> en sistemas de ficheros <acronym>UFS</acronym> la siguiente opción:</para> <programlisting>options UFS_ACL</programlisting> <para>debe ser compilada en el kernel. Si esta opción no ha sido compilada, se mostrará un mensaje de advertencia si se intenta montar un sistema de ficheros que soporte <acronym>ACL</acronym>. Esta opción viene incluida en el kernel <filename>GENERIC</filename>. Las <acronym>ACL</acronym> dependen de los atributos extendidos habilitados en el sistema de ficheros. Los atributos extendidos están incluidos por defecto en la nueva generación de sistemas de ficheros &unix; <acronym>UFS2</acronym>.</para> <note><para>Los atributos extendidos pueden usarse también en <acronym>UFS1</acronym> pero requieren una carga de trabajo mucho más elevada que en <acronym>UFS2</acronym>. El rendimiento de los atributos extendidos es, también, notablemente mayor en <acronym>UFS2</acronym>. Por todo esto si quiere usar ACL le recomendamos encarecidamente que use <acronym>UFS2</acronym>.</para></note> <para>Las<acronym>ACL</acronym> se habilitadan mediante una bandera administrativa durante el montaje, <option>acls</option>, en el fichero <filename>/etc/fstab</filename>. La bandera de montaje puede también activarse de forma permanente mediante &man.tunefs.8; para modificar una bandera de superbloque <acronym>ACLs</acronym> en la cabecera del sistema de ficheros. En general es preferible usar la bandera de superbloque por varios motivos:</para> <itemizedlist> <listitem> <para>La bandera de montaje <acronym>ACL</acronym> no puede cambiarse por un remontaje (&man.mount.8; <option>-u</option>), sino con un completo &man.umount.8; y un &man.mount.8;. Esto significa que no se pueden habilitar las <acronym>ACL</acronym> en el sistema de ficheros raíz después del arranque. También significa que no se puede cambiar la disposición de un de ficheros una vez que se ha comenzado a usar.</para> </listitem> <listitem> <para>Activar la bandera de superbloque provocará que el sistema de ficheros se monte siempre con las <acronym>ACL</acronym> habilitadas incluso si no existe una entrada en <filename>fstab</filename> o si los dispositivos se reordenan. Esto es así para prevenir un montaje accidental del sistema de ficheros sin tener las <acronym>ACL</acronym> habilitadas, que podría resultar en que se impongan de forma inadecuada las <acronym>ACL</acronym>, y en consecuencia problema de seguridad.</para> </listitem> </itemizedlist> <note><para>Podemos cambiar el comportamiento de las <acronym>ACL</acronym> para permitirle a la bandera ser habilitada sin un &man.mount.8; completo, pero puede salirle el tiro por la culata si activa las <acronym>ACL</acronym>, luego las desactiva, y después las vuelve a activar sin configurar desde cero las atributos extendidos. En general, una vez que se han deshabilitado las <acronym>ACL</acronym> en un sistema de ficheros no deben dehabilitarse, ya que la protección de ficheros resultante puede no ser compatible las que esperan los usuarios del sistema, y al volver a activar las <acronym>ACL</acronym> volver a asignar las <acronym>ACL</acronym> a ficheros cuyos permisos hubieran sido cambiados, lo que puede desenbocar en un escenario impredecible.</para></note> <para>Los sistemas de ficheros con <acronym>ACL</acronym> habilitadas tienen un signo <literal>+</literal> (más) al visualizar sus configuraciones de permisos. Por ejemplo:</para> <programlisting>drwx------ 2 robert robert 512 Dec 27 11:54 private drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directorio1 drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directorio2 drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directorio3 drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting> <para>Aquí vemos que los directorios <filename>directorio1</filename>, <filename>directorio2</filename>, y <filename>directorio3</filename> están usando <acronym>ACL</acronym>. El directorio <filename>public_html</filename> no.</para> <sect2> <title>Uso de <acronym>ACL</acronym></title> <para>Las <acronym>ACL</acronym>s del sistema de ficheros pueden comprobarse con &man.getfacl.1;. Por ejemplo, para ver las configuraciones de <acronym>ACL</acronym> del fichero <filename>test</filename>, uno podría usar lo siguiente:</para> <screen>&prompt.user; <userinput>getfacl <filename>test</filename></userinput> #file:test #owner:1001 #group:1001 user::rw- group::r-- other::r--</screen> <para>Para cambiar las configuraciones de las <acronym>ACL</acronym> en este fichero use &man.setfacl.1;. Observe:</para> <screen>&prompt.user; <userinput>setfacl -k <filename>test</filename></userinput></screen> <para>La bandera <option>-k</option> eliminará todas las <acronym>ACL</acronym>s definidas para un fichero o sistema ficheros. El método preferible sería utilizar <option>-b</option>, ya que deja los campos básicos imprescindibles para que las <acronym>ACL</acronym> sigan funcionando.</para> <screen>&prompt.user; <userinput>setfacl -m u:trhodes:rwx,group:web:r--,o::--- <filename>test</filename></userinput></screen> <para>La opción <option>-m</option> se usa para modificar las entradas por defecto de las <acronym>ACL</acronym>. Debido a que no había entradas predefinidas puesto que fueron eliminadas por la orden anterior, restauraremos las opciones por defecto y asignará las opciones listadas. Tenga en cuenta que si añade un nuevo usuario o grupo aparecerá el error <errorname>Invalid argument</errorname> en la salida estándar <devicename>stdout</devicename>.</para> </sect2> </sect1> <sect1 id="security-portaudit"> <sect1info> <authorgroup> <author> <firstname>Tom</firstname> <surname>Rhodes</surname> <contrib>Texto de </contrib> </author> </authorgroup> </sect1info> <title>Monitorización de fallos de seguridad de aplicaciones</title> <indexterm> <primary>Portaudit</primary> </indexterm> <para>En estos últimos años el mundo de la seguridad ha hecho grandes avances en cuanto a la gestión de las vulnerabilidades. La amenaza de asaltos a los sistemas se incrementa cuando se instalan y configuran aplicaciones de muy diversas procedencias en virtualmente cualquier sistema operativo disponible.</para> <para>La evaluación de vulnerabilidades es un factor clave en la seguridad; aunque &os; libere avisos de seguridad relacionados con el sistema base, llevar la gestión de vulnerabilidades hasta cada aplicación que se puede instalar en &os; va mucho más allá de la capacidad del proyecto &os;. A pesar de esto existe una forma de mitigar las vulnerabilidades de esas aplicaciones y advertir a los administradores sobre los problemas de seguridad a medida que se detectan. <application>Portaudit</application> existe para hacer ese trabajo.</para> <para>El port <filename role="port">security/portaudit</filename> consulta una base de datos, actualizada y mantenida por el equipo de seguridad y por los desarrolladores de &os; en busca de incidentes de seguridad que hayan sido detectados.</para> <para>Si quiere usar <application>Portaudit</application> instálelo desde la colección de ports:</para> <screen>&prompt.root; <userinput>cd /usr/ports/security/portaudit && make install clean</userinput></screen> <para>Durante el proceso de instalación los ficheros de configuración de &man.periodic.8; se actualizan haciendo que <application>Portaudit</application> aparezca en el mensaje sobre la seguridad del sistema que diariamente Recuerde que ese correo (que se envia a la cuenta <username>root</username> es muy importante y debería leerlo. No hay ninguna configuración que deba modificar o crear.</para> <para>Después de la instalación un administrador debe actualizar la base de datos alojada en local en <filename class="directory">/var/db/portaudit</filename> mediante:</para> <screen>&prompt.root; <userinput>portaudit -F</userinput></screen> <note> <para>La base de datos será actualizada automáticamente durante la ejecución de &man.periodic.8;; así que la orden anterior es totalmente opcional. Solo se necesita para los siguientes ejemplos.</para> </note> <para>Si quiere comproblar si entre las aplicaciones que haya instalado desde el árbol de ports en su sistema hay problemas de seguridad sólo tiene que ejecutar lo siguiente:</para> <screen>&prompt.root; <userinput>portaudit -a</userinput></screen> <para>Este es un ejemplo de la salida:</para> <programlisting>Affected package: cups-base-1.1.22.0_1 Type of problem: cups-base -- HPGL buffer overflow vulnerability. Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html> 1 problem(s) in your installed packages found. You are advised to update or deinstall the affected package(s) immediately.</programlisting> <para>El administrador del sistema obtendrá mucha más información sobre el problema de seguridad dirigiendo su navegador web a la <acronym>URL</acronym> que aparece en el mensaje. Esto incluye versiones afectadas (por versión de port de &os;), junto con otros sitios web que contengan advertencias de seguridad.</para> <para>En pocas palabras, <application>Portaudit</application> es un programa muy poderoso y extremadamente útil cuando se combina con el port <application>Portupgrade</application>.</para> </sect1> <sect1 id="security-advisories"> <sect1info> <authorgroup> <author> <firstname>Tom</firstname> <surname>Rhodes</surname> <contrib>Texto de </contrib> </author> </authorgroup> </sect1info> <title>&os; Security Advisories</title> <indexterm> <primary>Advertencias de seguridad en FreeBSD</primary> </indexterm> <para>Como muchos sistemas operativos con calidad de producción, &os; publica <quote>Security Advisories</quote> (advertencias de seguridad. Estas advertencias suelen enviarse por correo a las listas de seguridad e incluidas en la Errata solamente después de que la versión apropiada haya sido corregida. Esta sección tiene como fin explicar en qué consiste una advertencia de seguridad, cómo entenderla y qué medidas hay que tomar para parchear el sistema.</para> <sect2> <title>?Qué aspecto tiene una advertencia de seguridad?</title> <para>Las advertencias de seguridad de &os; tienen un aspecto similar a la que se muestra aquí. Fué enviada a la lista de correo &a.security-notifications.name;.</para> <programlisting>============================================================================= &os;-SA-XX:XX.UTIL Security Advisory The &os; Project Topic: denial of service due to some problem<co id="co-topic"/> Category: core<co id="co-category"/> Module: sys<co id="co-module"/> Announced: 2003-09-23<co id="co-announce"/> Credits: Person@EMAIL-ADDRESS<co id="co-credit"/> Affects: All releases of &os;<co id="co-affects"/> &os; 4-STABLE prior to the correction date Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE) 2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6) 2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15) 2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8) 2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18) 2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21) 2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33) 2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43) 2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39)<co id="co-corrected"/> &os; only: NO<co id="co-only"/> For general information regarding FreeBSD Security Advisories, including descriptions of the fields above, security branches, and the following sections, please visit http://www.FreeBSD.org/security/. I. Background<co id="co-backround"/> II. Problem Description<co id="co-descript"/> III. Impact<co id="co-impact"/> IV. Workaround<co id="co-workaround"/> V. Solution<co id="co-solution"/> VI. Correction details<co id="co-details"/> VII. References<co id="co-ref"/></programlisting> <calloutlist> <callout arearefs="co-topic"> <para>El campo <literal>Topic</literal> indica cuál es exactamente el problema. Básicamente es la introducción de la advertencia de seguridad actual e indica el uso malintencionado que puede darse a la vulnerabilidad.</para> </callout> <callout arearefs="co-category"> <para><literal>Category</literal> se refiere a la parte afectada del sistema, que puede ser <literal>core</literal>, <literal>contrib</literal> o <literal>ports</literal>. La categoría <literal>core</literal> significa que la vulnerabilidad afecta a un componente central del sistema operativo &os;. La categoría <literal>contrib</literal> significa que la vulnerabilidad afecta a software que no ha sido desarrollado por el proyecto &os;, como <application>sendmail</application>. La categoría <literal>ports</literal> indica que la vulnerabilidad afecta a software incluido en la colección de ports.</para> </callout> <callout arearefs="co-module"> <para>El campo <literal>Module</literal> se refiere a la ubicación del componente, por ejemplo <literal>sys</literal>. En este ejemplo vemos que está afectado el módulo <literal>sys</literal>; por lo tanto esta vulnerabilidad afecta a componentes utilizados dentro del kernel.</para> </callout> <callout arearefs="co-announce"> <para>El campo <literal>Announced</literal> refleja la fecha de publicación de la advertencia de seguridad fué publicada o anunciada al mundo. Esto significa que el equipo de seguridad ha verificado que el que el problema existe y que se ha incluido un parche que soluciona el problema en el repositorio de código fuente de &os;.</para> </callout> <callout arearefs="co-credit"> <para>El campo <literal>Credits</literal> le da el crédito al individuo u organización que descubrió y reportó la vulnerabilidad.</para> </callout> <callout arearefs="co-affects"> <para>El campo <literal>Affects</literal> explica a qué versiones de &os; afecta esta vulnerabilidad. En el caso del kernel una rápida revisión de la salida de <command>ident</command> en los ficheros afectados ayudará a determinar la versión. En el caso de de los ports el número de versión aparece después del nombre del port en <filename>/var/db/pkg</filename>. Si el sistema no se sincroniza con el repositorio <acronym>CVS</acronym> de &os; y se reconstruye diariamente, existe la posibilidad de que esté afectado por el problema de seguridad.</para> </callout> <callout arearefs="co-corrected"> <para>El campo <literal>Corrected</literal> indica la fecha, hora, zona horaria y versión de &os; en que fué corregido.</para> </callout> <callout arearefs="co-only"> <para>El campo <literal>&os; only</literal> indica si la vulnerabilidad afecta solamente a &os; o si afecta también a otros sistemas operativos.</para> </callout> <callout arearefs="co-backround"> <para>El campo <literal>Background</literal> informa acerca de qué es exactamente la aplicación afectada. La mayor parte de las veces se refiere a por qué la aplicación existe en &os;, para qué se usa y un poco de información de cómo llegó llegó a ocupar el lugar que ocupa en el sistema o el árbol de ports.</para> </callout> <callout arearefs="co-descript"> <para>El campo <literal>Problem Description</literal> explica el problema de seguridad en profundidad. Puede incluir información del código erróneo, o incluso cómo puede usarse maliciosamente el error para abrir un agujero de seguridad.</para> </callout> <callout arearefs="co-impact"> <para>El campo <literal>Impact</literal> describe el tipo de impacto que el problema pueda tener en un sistema. Por ejemplo, esto puede ser desde un ataque de denegación de servicio, hasta una escalada de privilegios de usuario, o incluso ofrecer al atacante acceso de superusuario.</para> </callout> <callout arearefs="co-workaround"> <para>El campo <literal>Workaround</literal> ofrece una solución temoral posible para los administradores de sistemas que tal vez no puedan actualizar el sistema. Esto puede deberse a la falta de tiempo, disponibilidad de de red, o a muchas otras razones. A pesar de todo la la seguridad no se debe tomar a la ligera y un sistema afectado debe parchearse al menos aplicar una solución temporal para el agujero de seguridad.</para> </callout> <callout arearefs="co-solution"> <para>El campo <literal>Solution</literal> ofrece instrucciones para parchear el sistema afectado. Este es un método paso a paso, probado y verificado para parchear un sistema y que trabaje seguro.</para> </callout> <callout arearefs="co-details"> <para>El campo <literal>Correction Details</literal> despliega la rama del <acronym>CVS</acronym> o el nombre de la versión con los puntos cambiados a guiones bajos. También muestra el número de revisión de los ficheros afectados dentro de cada rama.</para> </callout> <callout arearefs="co-ref"> <para>El campo <literal>References</literal> suele ofrecer fuentes adicionales de información: <acronym>URL</acronym>, libros, listas de correo y grupos de noticias.</para> </callout> </calloutlist> </sect2> </sect1> <sect1 id="security-accounting"> <sect1info> <authorgroup> <author> <firstname>Tom</firstname> <surname>Rhodes</surname> <contrib>Texto de </contrib> </author> </authorgroup> </sect1info> <title>Contabilidad de procesos</title> <indexterm> <primary>Contabilidad de procesos</primary> </indexterm> <para>La contabilidad de procesos es un método de seguridad en el cual un administrador puede mantener un seguimiento de los recursos del sistema utilizados, su distribución entre los usuarios, ofrecer monitorización del sistema y seguir la pista mínimamente a las órdenes de usuario.</para> <para>Esto en realidad tiene sus puntos positivos y negativos. Uno de los positivos es que una intrusión puede minimizarse en el momento de producirse. Uno negativo es la cantidad de logs generados por la contabilidad de procesos y el espacio de disco que requieren. Esta sección guiará al administrador a través de los fundamentos de la contabilidad de procesos.</para> <sect2> <title>Cómo habilitar y utilizar la contabilidad de procesos</title> <para>Antes de poder usar la contabilidad de procesos tendrá que habilitarla. Ejecute la siguiente orden:</para> <screen>&prompt.root; <userinput>touch <filename>/var/account/acct</filename></userinput> &prompt.root; <userinput>accton <filename>/var/account/acct</filename></userinput> &prompt.root; <userinput>echo 'accounting_enable="YES"' >> <filename>/etc/rc.conf</filename></userinput></screen> <para>Una vez habilitada, la contabilidad de procesos empezará a seguir el rastro de estadísticas de la <acronym>CPU</acronym>, órdenes, etc. Todos los logs de contabilidad están en un formato ilegible para humanos, pero accesibles para &man.sa.8;. Si se ejecuta sin opciones, <command>sa</command> imprimirá información sobre el número de llamadas por usuario, el tiempo total transcurrido expresado en minutos, el tiempo total de <acronym>CPU</acronym> y de usuario en minutos, el número medio de operaciones de E/S, etc.</para> <para>Para ver información acerca de las órdenes que se están ejecutados puede usar la &man.lastcomm.1;. <command>lastcomm</command> imprime órdenes ejecutadas por los usuarios en &man.ttys.5; específicas. Veamos un ejemplo:</para> <screen>&prompt.root; <userinput>lastcomm ls <username>trhodes</username> ttyp1</userinput></screen> <para>Imprimiría todas las veces (conocidas) que el usuario <username>trhodes</username> ha usado <command>ls</command> en la terminal ttyp1.</para> <para>Hay muchas más opciones que pueden serle muy útiles. Si quiere conocerlas consulte las páginas de manual &man.lastcomm.1;, &man.acct.5; y &man.sa.8;.</para> </sect2> </sect1> </chapter>