<?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&aelig;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&aelig;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;&nbsp;4.4
        <filename>libcrypt.a</filename> era un enlace
        simbólico que apuntaba a la biblioteca que se usaba para el
        cifrado.  En &os;&nbsp;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>&dollar;1&dollar;</literal>.  Las contraseñas
        que comienzan por <literal>&dollar;2a&dollar;</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>&dollar;</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>&lt;secret password&gt;</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>&lt;username&gt;</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>&lt;nombre_de_usuario&gt;</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>&lt;nombre_de_usuario&gt;</userinput>
s/key 97 fw13894
Password: <userinput>&lt;<keycap>Enter</keycap> para activar el eco&gt;</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>&lt;secret password&gt;</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>&lt;secret password&gt;</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;&nbsp;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;&nbsp;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&aelig;mon bajo su control.
      Utilizando este método es posible proveer soporte de
      logs, devolver mensajes a conexiones, permitir a un d&aelig;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&aelig;mons</quote> tradicionalmente han
        recibido ese nombre.  D&aelig;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&aelig;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&aelig;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&aelig;mon : dirección : acción</literal>,
        donde <literal>d&aelig;mon</literal> es el nombre de d&aelig;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 ([&nbsp;]).  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&aelig;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&aelig;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&aelig;mon</literal>
          desde <literal>nombre de equipo</literal>.</quote> se
          enviará en el caso de cualquier d&aelig;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&aelig;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 &gt;&gt; \
	  /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&aelig;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&aelig;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&aelig;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>

&lt;Not found&gt;, <prompt>Create [y] ?</prompt> <userinput>y</userinput>

Principal: passwd, Instance: grunt, kdc_key_ver: 1
<prompt>New Password:</prompt>                    &lt;---- tecleo aleatorio
Verifying password

<prompt>New Password:</prompt> &lt;---- 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>

&lt;Not found&gt;, <prompt>Create [y] ?</prompt>

Principal: rcmd, Instance: grunt, kdc_key_ver: 1
<prompt>New Password:</prompt>		&lt;---- tecleo aleatorio
Verifying password

<prompt>New Password:</prompt>           &lt;---- 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>         &lt;---- 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>

&lt;Not found&gt;, <prompt>Create [y] ?</prompt> <userinput>y</userinput>

Principal: jane, Instance: , kdc_key_ver: 1
<prompt>New Password:</prompt>                &lt;---- introduzca una constraseña segura
Verifying password

<prompt>New Password:</prompt>                &lt;---- 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>		   &lt;---- si introduce datos nulos saldrá del programa</screen>
    </sect2>

    <sect2>
      <title>Prueba del sistema</title>

      <para>Primero tenemos que iniciar los d&aelig;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 &amp;</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 &amp;</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&aelig;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>

&lt;Not found&gt;, Create [y] ? y

Principal: jane, Instance: root, kdc_key_ver: 1
<prompt>New Password:</prompt>                    &lt;---- introduzca una contraseña SEGURA
Verifying password

<prompt>New Password:</prompt>    	 	 &lt;---- 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> &lt;--- Keep this short!
<prompt>Attributes [ 0 ] ?</prompt>
Edit O.K.
<prompt>Principal name:</prompt>		         &lt;---- 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>&lt;principal&gt;.&lt;instancia&gt;</literal> con la
        estructura
	<literal>&lt;nombre de usuario&gt;.</literal><username>root</username>
        permitirá que <literal>&lt;nombre de usuario&gt;</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>&nbsp;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;&nbsp;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&aelig;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&aelig;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&aelig;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>&microsoft.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;&nbsp;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&lt;UP,POINTTOPOINT,MULTICAST&gt; mtu 1280
inet 192.168.1.1 --&gt; 192.168.2.1 netmask 0xffffffff
physical address inet A.B.C.D --&gt; 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 &gt; 192.168.2.1: icmp: echo request
16:10:24.018109 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
16:10:25.018814 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
16:10:25.018847 192.168.1.1 &gt; 192.168.2.1: icmp: echo reply
16:10:26.028896 192.168.1.1 &gt; 192.168.2.1: icmp: echo request
16:10:26.029112 192.168.1.1 &gt; 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&aelig;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&aelig;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&aelig;mons entran en contacto uno con otro, y confirman
         que son quienes dicen ser (utilizando la llave secreta que usted
         configuró).  Los d&aelig;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&aelig;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&aelig;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     |
  | &lt;other header info&gt;  |
  +----------------------+
  | &lt;packet data&gt;        |
  `----------------------'</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             |
  | &lt;other header info&gt;      |
  +--------------------------+
  | .----------------------. |
  | | Src: 192.168.1.1     | |
  | | Dst: 192.168.2.1     | |
  | | &lt;other header info&gt;  | |
  | +----------------------+ |
  | | &lt;packet data&gt;        | |
  | `----------------------' |
  `--------------------------'</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                 |                            |
  | &lt;other header info&gt;          |                            |  Encrypted
  +------------------------------+                            |  packet.
  | .--------------------------. |  -------------.            |  contents
  | | Src: A.B.C.D             | |               |            |  are
  | | Dst: W.X.Y.Z             | |               |            |  completely
  | | &lt;other header info&gt;      | |               |            |- secure
  | +--------------------------+ |               |  Encap'd   |  from third
  | | .----------------------. | |  -.           |  packet    |  party
  | | | Src: 192.168.1.1     | | |   |  Original |- with real |  snooping
  | | | Dst: 192.168.2.1     | | |   |  packet,  |  IP addr   |
  | | | &lt;other header info&gt;  | | |   |- private  |            |
  | | +----------------------+ | |   |  IP addr  |            |
  | | | &lt;packet data&gt;        | | |   |           |            |
  | | `----------------------' | |  -'           |            |
  | `--------------------------' |  -------------'            |
  `------------------------------'  --------------------------'
	    </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;&nbsp;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&aelig;mon <application>sshd</application> está
        habilitado por defecto &os;&nbsp;4.X y puede elegir habilitarlo
        o no durante la instalación en &os;&nbsp;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&aelig;mon de <application>OpenSSH</application>, en el arranque
        de su sistema.  Puede ejecutar el d&aelig;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:&lt;ruta_al_fichero_remoto&gt;</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&aelig;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&aelig;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 &amp;&amp; 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: &lt;http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html&gt;

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"' &gt;&gt; <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>