diff options
author | Jesus Rodriguez Cuesta <jesusr@FreeBSD.org> | 2005-11-12 20:32:25 +0000 |
---|---|---|
committer | Jesus Rodriguez Cuesta <jesusr@FreeBSD.org> | 2005-11-12 20:32:25 +0000 |
commit | bdcd5c76637933ec01382cfb9eef26f6b7934dc8 (patch) | |
tree | 6ecd5d15b607035fbeb98295833f0702a0d7ba5c /es_ES.ISO8859-1 | |
parent | 9efc0abed58c65aa619e0e6c99b12e5be91f409e (diff) |
Notes
Diffstat (limited to 'es_ES.ISO8859-1')
-rwxr-xr-x | es_ES.ISO8859-1/books/handbook/advanced-networking/chapter.sgml | 8 | ||||
-rwxr-xr-x | es_ES.ISO8859-1/books/handbook/security/chapter.sgml | 5580 |
2 files changed, 5374 insertions, 214 deletions
diff --git a/es_ES.ISO8859-1/books/handbook/advanced-networking/chapter.sgml b/es_ES.ISO8859-1/books/handbook/advanced-networking/chapter.sgml index 8cd71b09fb..936b8a99fd 100755 --- a/es_ES.ISO8859-1/books/handbook/advanced-networking/chapter.sgml +++ b/es_ES.ISO8859-1/books/handbook/advanced-networking/chapter.sgml @@ -2091,10 +2091,10 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6...</screen> <indexterm><primary>firewall</primary></indexterm> <para>Si se desea utilizar el <quote>bridge</quote> como un cortafuegos, se debe añadir además la opción - <literal>IPFIREWALL</literal>. Lea <xref - linkend="firewalls"> para obtener información general sobre - cómo configurar el bridge para que actúe - además como cortafuegos.</para> + <literal>IPFIREWALL</literal>. Lea el capílo de + firewalls <!--<xref linkend="firewalls">--> para obtener + información general sobre cómo configurar el + bridge para que actúe además como cortafuegos.</para> <para>Si además queremos que los paquetes que no sean IP (por ejemplo paquetes ARP) puedan atravesar el <quote>bridge</quote> diff --git a/es_ES.ISO8859-1/books/handbook/security/chapter.sgml b/es_ES.ISO8859-1/books/handbook/security/chapter.sgml index ce65008d95..6449c90059 100755 --- a/es_ES.ISO8859-1/books/handbook/security/chapter.sgml +++ b/es_ES.ISO8859-1/books/handbook/security/chapter.sgml @@ -2,7 +2,6 @@ The FreeBSD Documentation Project $FreeBSD$ - $FreeBSDes: doc/es_ES.ISO8859-1/books/handbook/security/chapter.sgml,v 1.3 2004/08/25 18:46:11 carvay Exp $ --> <chapter id="security"> @@ -12,27 +11,28 @@ <firstname>Matthew</firstname> <surname>Dillon</surname> <contrib>Gran parte de este capítulo ha sido - tomado del manual de security(7) por </contrib> + tomado del manual de security(7) por</contrib> </author> </authorgroup> - </chapterinfo> + </chapterinfo> <title>Seguridad</title> <indexterm><primary>seguridad</primary></indexterm> <sect1 id="security-synopsis"> - <title>Sinópsis</title> - - <para>Este capítulo proveera una introducción básica - a los conceptos de seguridad de sistema y algunos temas avanzados en - &os;. Muchos de los temas se pueden aplicar a la seguridad del sistema - asi como también a la de Internet en general. Internet ya no es - un lugar <quote>amistoso</quote> en el cual cada quién desea ser - un buen vecino. Asegurar su sistema es imprecindible para proteger sus - datos, característica intelectual, tiempo, y mucho mas de las + <title>Sinopsis</title> + + <para>Este capítulo brindará una introducción + básica a los conceptos de seguridad de sistema y algunos temas + avanzados en &os;. Muchos de los temas cubiertos aquí + pueden aplicarse a la seguridad del sistema asi como también + a la de Internet en general. Internet ya no es un lugar + <quote>amistoso</quote> en el cual cada quién desea ser un + buen vecino. Asegurar su sistema es imperativo para proteger sus + datos, propiedad intelectual, tiempo, y mucho más de las manos de hackers y similares.</para> - <para>FreeBSD proporciona un arcenal de utilidades y mecanisimos para + <para>FreeBSD proporciona un 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, usted sabrá: @@ -40,312 +40,5472 @@ <itemizedlist> <listitem> - <para>Conceptos básicos de seguridad, con respecto a &os;. + <para>Conceptos básicos de seguridad, con respecto a &os;. </para> </listitem> <listitem> - <para>Sobre algunos mecanisimos de encriptación disponibles en - &os;, como <acronym>DES</acronym> y <acronym>MD5</acronym>.</para> + <para>Acerca de varios mecanismos de encriptación disponibles + en &os;, como <acronym>DES</acronym> y <acronym>MD5</acronym>. + </para> </listitem> <listitem> - <para>Como instalar <application>KerberosIV</application> en versiones - anteriores a 5.0.</para> + <para>Como configurar autentificación de contraseñas + para usar solo-una-vez.</para> </listitem> <listitem> - <para>Como instalar <application>Kerberos5</application> en versiones - posteriores a 5.0.</para> + <para>Como configurar <acronym>TCP</acronym> Wrappers para usar + con <command>inetd</command>.</para> </listitem> <listitem> - <para>Como crear cortafuegos usando <acronym>IPFW</acronym>.</para> + <para>Como instalar <application>KerberosIV</application> en &os; + con versiones anteriores a 5.0.</para> </listitem> <listitem> - <para>Como configurar IPsec y crear un <acronym>VPN</acronym> entre - computadoras &os;/&windows;.</para> + <para>Como instalar <application>Kerberos5</application> en &os; con + versiones posteriores a 5.0.</para> </listitem> <listitem> - <para>Como configurar y usar <acronym>OpenSSH</acronym>, - implementación de <acronym>SSH</acronym> en &os;.</para> + <para>Como configurar IPsec y crean una <acronym>VPN</acronym> entre + máquinas &os;/&windows;.</para> + </listitem> + + <listitem> + <para>Como configurar y utilizar <application>OpenSSH</application>, + la implementación <acronym>SSH</acronym> de &os;.</para> </listitem> <listitem> - <para>Como configurar y cargar los modulos de extensión de - control de acceso usando TrustedBSD <acronym>MAC</acronym> - Framework.</para> + <para>Que son <acronym>ACL</acronym>s del sistema de archivos y como + utilizarlas.</para> </listitem> <listitem> - <para>Que sistema de archivos <acronym>ACL</acronym>s son y como - usarlos.</para> + <para>Como usar la utilidad <application>Portaudit</application> + para auditar paquetes de software de terceros instalados + desde la colección de ports.</para> </listitem> <listitem> - <para>Como utilizar las publicaciones de advertencias de seguridad en - &os;.</para> + <para>Como utilizar las publicaciones de advertencias de seguridad en + &os;.</para> </listitem> + <listitem> + <para>Tener una idea de lo que es contabilidad de + procesos y como habilitarla en &os;.</para> + </listitem> </itemizedlist> - <para>Antes de leer este capítulo, usted debe saber:</para> + <para>Antes de leer este capítulo, usted debe:</para> <itemizedlist> <listitem> - <para>Conceptos básicos de &os; y el Internet.</para> + <para>Entender Conceptos básicos de &os; y el Internet.</para> </listitem> </itemizedlist> - + + <para>Tópicos de seguridad adicionales son cubiertos a lo + largo de este libro. Por ejemplo, controles de acceso + obligatorio (Mandatory Access Control) son discutidos en <xref + linkend="mac"> y firewalls de internet son discutidos en el + capítulo de firewalls. + <!--<xref linkend="firewalls"> -->.</para> </sect1> <sect1 id="security-intro"> <title>Introducción</title> - <para>La seguridad es una función que comienza y termina con el + <para>La seguridad es una función que comienza y termina con el administrador de sistema. Mientras que los sistemas multi-usuario - BSD &unix; tienen una inherente seguridad, el trabajo de construir y - mantener mecanismos de seguridad adicionales para mantener a los - usuarios de manera <quote>honesta</quote> es probablemente una de las - unicas tareas del administrador del sistema. Los sistemas son tan - seguros como uno los haga, los problemas de seguridad compiten con la - necesidad humana de conveniencia. Los sistemas &unix; en general, son - capaces de correr una gran cantidad de procesos simultáneos, - de los cuales muchos de estos son servidores – lo que significa - que entidades externas pueden conectarse y <quote>hablar</quote> con - ellos. Asi como las mini-computadoras del ayer se convirtieron en los - ahora escritorios de trabajo, y las computadoras se interconectaron, - la seguridad cada ves se hace un problema mas grande.</para> + BSD &unix; tienen una seguridad inherente, el trabajo de construir y + mantener mecanismos de seguridad adicionales para hacer que los + usuarios sean <quote>honestos</quote> es probablemente una de las + tareas más grandes del administrador del sistema. Los sistemas + son tan seguros como uno los haga, los problemas de seguridad compiten + con la necesidad humana de conveniencia. Los sistemas &unix; en + general, son capaces de correr una gran cantidad de procesos + simultáneos, de los cuales muchos de estos son servidores + – lo que significa que entidades externas pueden conectarse y + <quote>hablar</quote> con ellos. Asi como las mini-computadoras del + ayer se convirtieron en los ahora escritorios de trabajo, y las + computadoras se interconectaron, la seguridad cada vez se hace un + problema más grande.</para> <para>La seguridad es mejor implementada como <quote>cebolla</quote> en capas. Basicamente, lo que se quiere hacer es crear la mayor cantidad - posible de convenientes capas de seguridad para luego cuidadosamente - monitorear el sistema para detectar intrusos. No es conveniente - sobreconstruir la seguridad, ya que esta interferira con el aspecto - de detección, y la detección es uno de los mas importantes - aspectos de cualquier mecanismo de seguridad. Por ejemplo, no tiene - mucho sentido usar los flags de <literal>schg</literal> (ver - &man.chflags.1;) en cada sistema binario, ya que mientras este puede - protejer los binarios temporalmente, hace que el algun cambio hecho - por un atacante sea difícil de detectar y puede resultar que - el mecanismo de seguridad no detecte al atacante en lo absoluto.</para> + posible de capas de seguridad como sea conveniente para luego + cuidadosamente monitorear el sistema para detectar intrusos. No es + conveniente sobreconstruir la seguridad, ya que esta interferirá + con el aspecto de detección, y la detección es uno de + los más importantes aspectos de cualquier mecanismo de + seguridad. Por ejemplo, no tiene mucho sentido activar la bandera + <literal>schg</literal> (ver &man.chflags.1;) en cada binario del + sistema, ya que mientras este puede protejer los binarios + temporalmente, hace que algún cambio hecho por un atacante, + que ha entrado al sistema,sea difícil de detectar y puede + resultar que el mecanismo de seguridad no detecte al atacante en + lo absoluto.</para> <para>La seguridad del sistema depende también de estar preparado - para diferentes formas de ataque, incluyendo intentos de quebrar el + para diferentes formas de ataque, incluyendo intentos de quebrar el sistema, o hacer un sistema inservible, pero no intentos de comprometer al usuario <username>root</username> (<quote>quebrar root</quote>). Los problemas de seguridad estan separados en diferentes categorias:</para> <orderedlist> <listitem> - <para>Ataques de Negación de servicio (DoS).</para> + <para>Ataques de Negación de servicio (DoS).</para> </listitem> <listitem> - <para>Compromisos en cuentas de usuarios.</para> + <para>Comprometer cuentas de usuarios.</para> </listitem> <listitem> - <para>Compromisos de root por medio de servidores accesibles.</para> + <para>Comprometer root a través de servidores accesibles. + </para> </listitem> <listitem> - <para>Compromisos de root por medio de cuentas de usuarios.</para> + <para>Comprometer root via cuentas de usuarios.</para> </listitem> <listitem> - <para>Creación de puertas de entrada.</para> + <para>Creación de puertas traseras (Backdoors).</para> </listitem> </orderedlist> <indexterm> - <primary>Ataques DoS</primary> - <see>Negación de servicio (DoS)</see> + <primary>DoS attacks</primary> + <see>Denial of Service (DoS)</see> </indexterm> <indexterm> - <primary>security</primary> + <primary>seguridad</primary> <secondary>Ataques DoS</secondary> - <see>Negación de servicio (DoS)</see> + <see>Negación de servicios (DoS)</see> </indexterm> - <indexterm><primary>Negación de servicio (DoS)</primary></indexterm> - - <para>Un ataque de negación de servicio es una acción que - priva al sistema de los recursos requeridos. Generalmente, los ataques - DoS son mecanismos de fuerza bruta que intentan quebrar el sistema - forzando sus servidores. Algunos ataques DoS intentan aprovecharse de - bugs en la red para quebrar el sistema con un solo paquete. Esto puede - ser solucionado aplicando en el kernel una actualización que - arregle el bug. Los ataques en servidores muchas veces pueden ser - solucionados aplicando opciones apropiadas para limitar la carga del - sistema en condiciones adversas. Los ataques de fuerza bruta en redes - son mas complicados. Los ataques con paquetes enmascarados, por - ejemplo, son casi imposible de detener, el cual puede desconectar el - sistema de Internet. Pueden no quebrar el sistema, pero saturaran la - conexión a Internet.</para> + <indexterm><primary>Negacion de servicio (DoS)</primary></indexterm> + + <para>Un ataque de negación de servicio es una acción que + priva al sistema de los recursos requeridos. Generalmente, los ataques + DoS son mecanismos de fuerza bruta que intentan quebrar el sistema + o hacerlo inutilizable sobrepasando la capacidad de sus servidores + o del stack de red. + Algunos ataques DoS intentan aprovecharse de + errores en el stack de red para quebrar el sistema con un solo paquete. + Lo último solo puede ser solucionado aplicando en el kernel + una actualización que arregle el error. + Los ataques en servidores muchas veces pueden ser + solucionados especificando opciones apropiadas para limitar la carga del + sistema en condiciones adversas. Los ataques de fuerza bruta en redes + son mas complicados. Los ataques con paquetes enmascarados, por + ejemplo, son casi imposible de detener, a menos que desconecte el + sistema de Internet. Puede ser que no tiren el sistema, pero + saturarán la conexión a Internet.</para> + + <indexterm> + <primary>seguridad</primary> + <secondary>comprometer 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 corren servidores estándar + <application>telnetd</application>, <application>rlogind</application>, + <application>rshd</application> y <application>ftpd</application> en + sus máquinas. + Estos servidores, por omisión, no + operan sobre conexiones encriptadas. El resultado es que si se + tiene una base de usuarios de tamaño moderado, uno o + más de sus usuarios entrando al sistema desde una localidad + remota (que es la forma más común y conveniente de + entrar a un sistema) provocará que su contraseña + sea descubierta. + El atento administrador de sistemas analizará sus logs de + acceso remoto buscando por direcciones fuente sospechosas + incluso para entradas exitosas al sistema.</para> + + <para>Se debe asumir siempre que una vez que un atacante tiene acceso + a una cuenta de usuario, el atacante puede comprometer + <username>root</username>. De todas formas, la realidad es que en + un sistema bien mantenido y asegurado, el acceso a una cuenta de + usuario no necesariamente da al atacante acceso a + <username>root</username>. La distinción es importante + porque sin acceso a <username>root</username> el atacante + generalmente no puede esconder sus huellas y puede, a lo mucho, + meterse con los archivos de usuarios, o estrellar la máquina. + Comprometer cuentas de usuario es muy común porque los + usuarios tienden a no tomar las precauciones que el administrador + toma.</para> + + <indexterm> + <primary>seguridad</primary> + <secondary>backdoors</secondary> + </indexterm> + + <para>Los administradores de sistema deben tener en mente que + existen muchas maneras potenciales de comprometer a + <username>root</username> en una máquina. El atacante puede + conocer la contraseña de <username>root</username>, el u + atacante puede encontrar un error en un servidor ejecutándose + como root y ser capaz de comprometer <username>root</username> a + través de una conexión de red a ese servidor, o el + atacante puede conocer un error en programa suid-root que le permita + comprometer <username>root</username> una vez que ha entrado + a una cuenta de usuario. Si un atacante ha encontrado una manera + de comprometer a <username>root</username> en una máquina, + entonces puede no necesitar instalar una puerta trasera. Muchos de + los agujeros <username>root</username> encontrados y cerrados hasta + la fecha significan una cantidad considerable de trabajo por parte del + atacante para limpiar todo despues del ataque, así que + la mayoría de los atacantes instalan puertas traseras. + Una puerta trasera brinda al atacante una forma sencilla de + retomar acceso de <username>root</username> en el sistema, + pero también le proporciona al administrador de sistemas + inteligente una manera conveniente de detectar la intrusión. + Haciendole imposible a un atacante instalar una puerta trasera + puede en realidad ser en detrimento de su seguridad, porque + no cerrará el agujero que el atacante encontró + para entrar en primer lugar.</para> + + <para>Los remedios de seguridad deben ser implementados + siempre con una aproximación multicapa tipo + <quote>cebolla</quote> y puede ser categorizado + como sigue:</para> + + <orderedlist> + <listitem> + <para>Aseguramiento de <username>root</username> y cuentas de staff.</para> + </listitem> + <listitem> + <para>Aseguramiento de servidores que se ejecutan como <username>root</username> + y binarios suid/sgid.</para> + </listitem> + + <listitem> + <para>Aseguramiento de cuentas de usuarios.</para> + </listitem> + + <listitem> + <para>Aseguramiento del archivo de contraseñas.</para> + </listitem> + + <listitem> + <para>Aseguramiento del Kernel, dispositivos crudos y + sistema de archivos.</para> + </listitem> + + <listitem> + <para>Detección rápida de cambios inapropiados + hechos al sistema.</para> + </listitem> + + <listitem> + <para>Paranoia.</para> + </listitem> + </orderedlist> + + <para>La siguiente secci6oacute;n de este capítulo cubrirá + los puntos de arriba con mayor profundidad.</para> </sect1> <sect1 id="securing-freebsd"> - <title>Asegurando FreeBSD</title> + <title>Asegurando &os;</title> <indexterm> <primary>seguridad</primary> - <secondary>asegurando FreeBSD</secondary> + <secondary>asegurando &os;</secondary> </indexterm> <note> - <title>Comando vs. Protocolo</title> - <para>A través de este documento usaremos el texto en - <application>negrita</application> para referirnos a un comando o - aplicación. Esto se utiliza para casos tales como ssh, puesto - que es tanto un protocolo como un comando.</para> + <title>Comando vs. protocolo</title> + <para>A través de este documento usaremos el texto en + <application>negrita</application> para referirnos a un comando o + aplicación, y una fuente <command>espaciada</command> para + referirnos a comandos espcíficos. Los protocolos usarán + una fuente normal. Esta distinción tipográfica es + útil para instancias como ssh, ya + que es tanto un protocolo como un comando.</para> </note> - <para>Las siguientes secciones cubrirán los métodos para - asegurar su sistema FreeBSD que fueron mencionados en la - <link linkend="security-intro"> sección anterior</link> a este + <para>Las siguientes secciones cubrirán los métodos para + asegurar su sistema &os; que fueron mencionados en la + <link linkend="security-intro"> sección anterior</link> a este capítulo.</para> - <sect2 id="security-ssh-tunneling"> - <title>Encapsulado SSH</title> - <indexterm> - <primary>OpenSSH</primary> - <secondary>encapsulado</secondary> - </indexterm> - <para> </para> - </sect2> - - <sect2 id="firewalls"> - <title>Cortafuegos</title> + <sect2 id="securing-root-and-staff"> + <title>Asegurando la cuenta <username>root</username> y cuentas de staff</title> + <indexterm> + <primary><command>su</command></primary> + </indexterm> + + <para>En primer lugar, no se moleste en asegurar las cuentas de + staff si no ha asegurado la cuenta <username>root</username>. + La mayoría de los sistemas tienen una contraseña + asignada a la cuenta <username>root</username>. Lo primero que + se hace es asumir que la contraseña está + <emphasis>siempre</emphasis> comprometida. + Esto no significa que debe eliminar la contraseña. La + contraseña es casi siempre necesaria para acceso de + consola a la máquina. Lo que esto significa es que no se + debe hacer posible el uso de la contraseña fuera de la + consola o incluso posiblemente con el comando &man.su.1;. + Por ejemplo, asegúrese que sus ptys estaán + especificadas como inseguras en el archivo + <filename>/etc/ttys</filename> para que las entradas directas + de <username>root</username> vía + <command>telnet</command> o <command>rlogin</command> no estén + permitidas. + Si utiliza otros servicios de entrada como + <application>sshd</application>, asegúrese que entradas directas + de <username>root</username> estén también deshabilitadas. + Puede hacer esto editando su archivo + <filename>/etc/ssh/sshd_config</filename>, y asegurándose + que <literal>PermitRootLogin</literal> esté puesto a + <literal>NO</literal>. Considere cada método de acceso — + servicios como FTP frecuentemente caen en las grietas. + Entradas directas de <username>root</username> solo deben + ser permitidas vía consola.</para> + <indexterm> + <primary><groupname>wheel</groupname></primary> + </indexterm> + + <para>Por supuesto, como administrador de sistema usted debe + ser capaz de accesar a <username>root</username>, asi que + abrimos algunos agujeros. Pero asegúrese que estos + agujeros necesiten contraseñas adicionales de + verificación para operar. Una forma de hacer a <username>root</username> + accesible es agregar cuentas de staff apropiadas al + grupo <groupname>wheel</groupname> (en + <filename>/etc/group</filename>). Los miembros del staff colocados + en el grupo <groupname>wheel</groupname> tienen permitido + hacer <command>su</command> a <username>root</username>. + Nunca debe de proporcionar a miembros del staff acceso + nativo a <groupname>wheel</groupname> poniéndolos + en el grupo <groupname>wheel</groupname> en su entrada de + contraseña. Las cuentas de staff deben ser colocadas + en un grupo <groupname>staff</groupname>, y entonces + agregadas al grupo <groupname>wheel</groupname> en el + archivo <filename>/etc/group</filename>. Solo aquellos + miembros del staff que en realidad necesiten tener acceso + de <username>root</username> deben ser colocados en el + grupo <groupname>wheel</groupname>. también es posible + al utilizar un método de autentificación como + Kerberos, usar el archivo <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>. Esta puede ser una mejor solución + ya que el mecanismo <groupname>wheel</groupname> todavía + permite a un atacante comprometer <username>root</username> + si el intruso ha conseguido el archivo de contraseñas + y puede comprometer una cuenta de staff. Teniendo el + mecanismo <groupname>wheel</groupname> es mejor que no tener + nada del todo, aunque 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 login alternativo y hacer lo que se conoce como + <quote>estrellado</quote> de las contraseñas encriptadas + para las cuentas de staff. Usando el comando &man.vipw.8; + se puede reemplazar cada instancia de una contraseña + encriptada con un solo caracter <quote><literal>*</literal></quote>. + Este comando actualizará el archivo + <filename>/etc/master.passwd</filename> y la base de datos + usuario/contraseña para deshabilitar logins + autenticados por contraseñas.</para> + + <para>Una entrada de una cuenta de estaff como:</para> + + <programlisting>foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting> + + <para>Debe ser cambiada a esto:</para> + + <programlisting>foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting> + + <para>Este cambio prevendrá que ocurran logins normales, + ya que la contraseña encriptada nunca corresponderá + con <quote><literal>*</literal></quote>. Hecho esto, + los miembros de staff deben usar otro mecanismo + para autentificarse tal como &man.kerberos.1; o + &man.ssh.1; utilizando un par de llave pública/privada. + Cuando se usa algo como Kerberos, generalmente se debe + asegurar la máquina que corre los servidores Kerberos + y su estación de trabajo de escritorio. Cuando se + usa un par de llave pública/privada con ssh, + generalmente se debe asegurar la máquina <emphasis>desde</emphasis> + donde se hace el login (típicamente nuestra estación + de trabajo). Una capa adicional de protección puede + ser añadida al par de llaves protegiendo con contraseña + la llave par al crearla con &man.ssh-keygen.1;. + La posibilidad de <quote>estrellado</quote> de las + contraseñas de las cuentas de staff también + garantiza que los miembros del staff solo puedan entrar + a través de métodos de acceso que usted haya + configurado. Esto obliga a todos los miembros del staff + a utilizar conexiones seguras, encriptadas, para todas + sus sesiones, lo que cierra un importante agujero usado + por muchos intrusos: hacer un olfateo (sniffing) de la + red desde una máquina no relacionada y menos + segura.</para> + + <para>Los mecanismos de seguridad más indirectos también + asumen que se esta firmando desde un servidor más restrictivo + a un servidor menos restrictivo. + Por ejemplo, si su máquina principal está corriendo + toda clase de servidores, su estación de trabajo no debe + de estar corriendo ninguno. Para que su estación de trabajo + sea razonablemente segura debe correr los servidores mínimos + posibles, hasta incluso ningún servidor, y debe correr + un blanqueador de pantalla portegido por contraseña. + Por supuesto, dado un acceso físico a una estación + de trabajo un atacante puede romper cualquier clase de seguridad + que se ponga. Esto es definitivamente un problema que debe + considerar, pero también debe considerar el hecho de que la + mayoría de las intrusiones ocurren remotamente, a través + de la red, de gente que no tiene acceso físico a su + estación de trabajo o servidores.</para> + <indexterm><primary>KerberosIV</primary></indexterm> + + <para>Usar algo como Kerberos también le brinda la habilidad + de deshabilitar o cambiar la contraseña para una cuenta + de staff en un lugar, y que tenga un efecto inmediato en todas + las máquinas en las cuales el miembro de staff puede + tener una cuenta. Si la cuenta de un miembro de staff es + comprometida, la habilidad para cambiar instantaneamente su + contraseña en todas las máquinas no debe ser + desestimada. Con contraseñas discretas, 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 solo se puede hacer un + ticket de Kerberos para expirar despues de un tiempo, también + el sistema Kerberos puede requerir que el usuario escoja una + nueva contraseña despues de cierto periodo de tiempo + (digamos, una vez al mes).</para> + </sect2> + + <sect2> + <title>Asegurando 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>sandboxes</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>El administrador de sistemas prudente solo ejecuta los + servidores que necesita, no más, no menos. Dese cuenta + que los servidores de terceros son los más propensos + a contener errores. Por ejemplo, ejecutando una versión + antigua de + <application>imapd</application> o + <application>popper</application> es como dar un boleto 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 daemons + <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 + todavía prevalece: Si alguien es capaz de penetrar a + través de un servidor ejecutándose en una caja + de arena, todavía tendría que salirse de la caja de + arena. Mientras más capas tenga que romper el atacante + es menor la posibilidad de su éxito. Los agujeros de + root han sido hallados historicamente en virtualmente + cualquier servidor que se ha ejecutado como <username>root</username>, + incluyendo servidores básicos del sistema. + Si está ejecutando una máquina a través de + la cual la gente solo entra por + <application>sshd</application> y nunca entra por + <application>telnetd</application> o + <application>rshd</application> o + <application>rlogind</application>, entonces ¡apague esos + servicios!</para> + + <para>&os; ahora por omisión ejecuta + <application>ntalkd</application>, + <application>comsat</application> y + <application>finger</application> en una caja de arena. + Otro programa que puede ser candidato para correr en una + caja de arena es &man.named.8;. + <filename>/etc/defaults/rc.conf</filename> incluye los + argumentos necesarios para correr <application>named</application> + en una caja de arena de una forma comentada. Dependiendo de si + está instalando un nuevo sistema o actualizando un sistema + existente, las cuentas especiales de usuario utilizadas por + 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 un número de otros servidores que tipicamente + no se ejecutan en cajas de arena: + <application>sendmail</application>, + <application>imapd</application>, <application>ftpd</application>, + y otros. Existen alternativas para algunos de estos, pero + instalarlas puede requerir más trabajo del que tal vez + esté dispuesto a realizar (el factor conveniencia + ataca de nuevo). Tal vez tenga que correr estos servidores como + <username>root</username> y depender de otros mecanismos para + detectar intrusiones que puedan ocurrir a través de + ellos.</para> + + <para>Los otros grandes agujeros de <username>root</username> + potenciales en un sistema son los binarios + suid y sgid root instalados en el sistema. La mayoría + de estos binarios, como <application>rlogin</application>, + residen en <filename>/bin</filename>, <filename>/sbin</filename>, + <filename>/usr/bin</filename> o <filename>/usr/sbin</filename>. + Aunque nada es 100% seguro, los binarios suid y sgid del + sistema por omisión pueden ser considerados razonablemente + seguros. Pero aún así, + agujeros <username>root</username> son encontrados + ocasionalmente en estos binarios. Un agujero <username>root</username> + fué entontrado en <literal>Xlib</literal> en + 1998 que hizo a <application>xterm</application> + (que es tipicamente suid) vulnerable. Es mejor prevenir que + lamentar y el administrador de sistemas prudente restringirá + los binarios suid, que solo el staff debe de ejecutar, a un + grupo especial que solo el staff pueda accesar, y deshacerse + de cualquier binario suid (<command>chmod 000</command>) + que nadie utilice. Un servidor sin pantalla generalmente + no necesita un binario <application>xterm</application>. + Binarios sgid pueden ser igual de peligrosos. Si un + intruso puede comprometer un binario sgid-kmem, el intruso + podría ser capaz de leer <filename>/dev/kmem</filename> + y así leer el archivo encriptado de contraseñas, + comprometiendo potencialmente cualquier cuenta con + contraseña. Alternativamente, un intruso que compromete + el grupo <literal>kmem</literal> puede monitorear teclazos + mandados a través de ptys, incluyendo ptys utilizados + por usuarios que accesan por métodos seguros. + Un intruso que compromete el grupo <groupname>tty</groupname> + puede escribir a casi cualquier pty de usuarios. + Si un usuario está corriendo un programa de terminal o + emulador con una propiedad de simulación de teclado, el + intruso puede potencialmente generar un flujo de datos que + provoque que la terminal del usuario haga eco de un comando, + el cual es entonces ejecutado como ese usuario.</para> + </sect2> + + <sect2 id="secure-users"> + <title>Asegurando cuentas de usuarios</title> + + <para>Las cuentas de usuario son usualmente las más + difíciles de asegurar. Aunque puede imponer restricciones + de acceso draconianas en su staff y <quote>estrellar</quote> + sus contraseñas, tal vez no pueda hacerlo con cualquier + cuenta general de usuario que tenga. Si tiene suficiente control, + tal vez triunfe y sea capaz de asegurar las cuentas de + usuarios con propiedad. Si no, simplemente tiene que ser más + vigilante en el monitoreo de esas cuentas. El uso de ssh y + Kerberos para cuentas de usuario es más problemático + debido a la administración adicional y soporte técnico + requerido, pero es todavía una buena solución + comparada a un archivo de contraseñas encriptadas.</para> + </sect2> + + <sect2> + <title>Asegurando el archivo 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 accesar esas cuentas. Aunque el archivo + encriptado de contraseñas (<filename>/etc/spwd.db</filename>) + solo puede ser leído por <username>root</username>, puede + ser posible para un intruso obtener acceso de lectura a ese + archivo incluso si el etacante no puede obtener + acceso de escritura como root.</para> + + <para>Sus scripts de seguridad deben revisar siempre por + cambios en el archivo de contraseñas + (ver <link linkend="security-integrity">Revisando integridad de archivos</link> abajo) + y reportarlos.</para> + </sect2> + + <sect2> + <title>Asegurando del Kernel, dispositivos crudos y + sistema de archivos</title> + + <para>Si un atacante compromete <username>root</username> puede + hacer cualquier cosa, + pero existen ciertas conveniencias. Por ejemplo, la mayoría + de los Kernels modernos tienen un dispositivo olfateador de + paquetes integrado. Bajo &os; es llamado dispositivo + <devicename>bpf</devicename>. Un intruso tratará + comunmente de ejecutar un olfateador de paquetes en una + máquina comprometida. No necesita darle a un intruso + la capacidad y la mayoría de los sistemas no necesitan + que se compile el dispositivo <devicename>bpf</devicename>.</para> + + <indexterm> + <primary><command>sysctl</command></primary> + </indexterm> + <para>Pero incluso si apaga el dispositivo <devicename>bpf</devicename>, + todavía tiene que preocuparse por + <filename>/dev/mem</filename> y + <filename>/dev/kmem</filename>. + Para eso, el intruso puede todavía escribir a + dispositivos de disco crudos. También, existe otra + 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 de + olfateo 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. + El securelevel puede ser activado con <command>sysctl</command> + en la variable <varname>kern.securelevel</varname>. + Una vez que ha activado securelevel a 1, los accesos de + escritura a dispositivos crudos serán denegados y + las banderas especiales <literal>schg</literal> serán + impuestas. + También debe asegurar que la bandera + <literal>schg</literal> esté habilitada en archivos + binarios críticos para el arranque, directorios y + scripts — todo lo que se ejecuta hasta el punto en que + se activa el securelevel. Esto puede ser una acción + exagerada, y actualizar el sistema es mucho más + complicado cuando se opera en un nivel de seguridad superior. + Puede comprometer y ejecutar el sistema a un nivel de seguridad + superior pero no activar la bandera <literal>schg</literal> + para cada archivo y directorio del sistema bajo el sol. + Otra posibilidad es simplemente montar <filename>/</filename> y + <filename>/usr</filename> de solo lectura. + Se debe notar que siendo demasiado draconiano en lo que trata + de proteger puede prevenir toda la detección importante + de una intrusión.</para> + </sect2> + + <sect2 id="security-integrity"> + <title>Revisando integridad de archivos: binarios, archivos de + configuración, etc.</title> + + <para>Cuando se trata de protección, solo se puede proteger + la configuración central del sistema y archivos de + control hasta un punto antes de que el factor conveniencia + levante su fea cabeza. Por ejemplo, usando + <command>chflags</command> para activar el bit <literal>schg</literal> + en la mayoría de los archivos en <filename>/</filename> + y <filename>/usr</filename> es probablemente contraproducente, + debido a que puede proteger los archivos, pero también + cierra una ventana de detección. + La última capa de su seguridad tipo cebolla es quizás + la más importante — detección. El resto de + su seguridad es inutil (o, peor, darle un falso sentido de + seguridad) si no puede detectar incursiones potenciales. + 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 en el acto.</para> + + <para>La mejor manera de detectar una incursión es buscar + archivos modificados, perdidos o inesperados. La mejor manera + de buscar archivos modificados es desde otro (muchas veces + centralizado) sistema con acceso limitado. + Escribiendo sus scripts de seguridad en un sistema extra-seguro + con acceso limitado los hace casi invisibles a atacantes + potenciales, y esto es importante. Para tomar máxima + ventaja generalmente tiene que proporcionar a la máquina + con acceso limitado acceso significativo a las otras máquinas + en el negocio, usualmente ya sea haciendo una importación + NFS de solo lectura de las otras máquinas a la máquina + de acceso limitado o configurando pares de llaves ssh para + permitir a la máquina de acceso limitado hacer ssh a + las otras máquinas. A excepción de su tráfico + de red, NFS es el método menos visible — permitiendo + monitorear los sistemas de archivos en cada máquina cliente + virtualmente indetectado. Si su servidor de acceso limitado + está conectado a las máquinas cliente a través + de un concentrador o a través de varias capas de ruteo, + el método NFS puede ser muy inseguro (network-wise) + y utilizar ssh puede ser la mejor opción incluso + con las huellas de auditoría que ssh presenta.</para> + + <para>Una vez que le da a una maáquina de acceso limitado al + menos acceso de lectura a los sistemas cliente que se supone va + a monitorear, debe escribir scripts para hacer el monitoreo. + Dado un montaje NFS, puede escribir scripts con utilidades + simples como &man.find.1; y &man.md5.1;. Es mejor ejecutar + md5 fisicamente en los archivos de las máquinas cliente + al menos una vez al día, y probar archivos de control + como los encontrados en <filename>/etc</filename> y + <filename>/usr/local/etc</filename> incluso más seguido. + Cuando se encuentren discrepancias, relativas a la información + base md5 que la máquina de acceso limitado conoce como + válida, esto debe gritarle a un administrador de sistemas + que vaya a verificarlo. Un buen script de seguridad también + debe revisar por binarios suid inapropiados y por archivos nuevos + o borrados en particiones del sistema como <filename>/</filename> + y <filename>/usr</filename>.</para> + + <para>Al utilizar ssh en lugar de NFS, + escribir el script de seguridad es mucho más complicado. + Esencialmente tiene que pasar por <command>scp</command> los + scripts a la máquina cliente para poder ejecutarlos, + haciéndolos visibles, y para seguridad también + necesita pasar por <command>scp</command> los binarios + (como find) que utilizan esos scripts. El cliente + <application>ssh</application> en la máquina cliente + puede estar ya comprometida. Con todo, utilizar ssh + puede ser necesario al trabajar sobre enlaces + inseguros, pero también es mucho más dificil + de manejar.</para> + + <para>Un buen script de seguridad revisará también + por cambios a la configuración de los archivos de acceso + de usuarios y miembros del staff: + <filename>.rhosts</filename>, <filename>.shosts</filename>, + <filename>.ssh/authorized_keys</filename> y demás; + archivos que caigan fuera del rango de revisión + <literal>MD5</literal>.</para> + + <para>Si tiene una cantidad enorme de espacio en disco para usuarios, + puede tomar mucho tiempo recorrer cada archivo en esas + particiones. En este caso, configurando banderas de montaje + para deshabilitar binarios y dispositivos suid en esas particiones + es una buena idea. Las opciones <literal>nodev</literal> y + <literal>nosuid</literal> (vea &man.mount.8;) son lo que + necesita revisar. Probablemente debe escanearlos de todas + maneras, al menos una vez a la semana, ya que el objeto de esta + capa es detectar intrusiones ya sea que la instrusión + haya sido efectiva o no.</para> + + <para>La contabilidad de procesos (vea &man.accton.8;) es una + opción relativamente con una carga ligera del sistema + operativo la cual puede ayudar como un mecanismo de + evaluación post-intrusión. Es especialmente + útil para rastrear como un intruso en realidad + penetró en un sistema, asumiendo que el archivo + esté todavía intacto despues de que la + intrusión ocurrió.</para> + + <para>Finalmente, los scripts de seguridad deben procesar los + archivos de log, y los mismo logs deben ser generados de una + manera lo más segura posible — un syslog remoto + puede ser muy útil. Un intruso trata de cubrir sus + huellas, y los archivos de log son críticos para el + administrador de sistema tratando de rastrear la hora y el + método de la intrusión inicial. Una manera de + mantener un registro permanente de los archivos de log es + ejecutar la consola del sistema en un puerto serial y + recolectar la información en una base continua + mediante una máquina segura monitoreando las consolas.</para> + </sect2> + + <sect2> + <title>Paranoia</title> + + <para>Un poco de paranoia nunca lastima. Como una regla, un + administrador de sistema puede agregar cualquier número + de mecanismos de seguridad, siempre que estos no afecten + la conveniencia, y puede agregar mecanismos de seguridad + que <emphasis>si</emphasis> afecten la conveniencia con + un buen razonamiento. Incluso más importante, un + administrador de seguridad debe mezclarlos un poco — + si utiliza recomendaciones como las dadas en este documento + exactamente, está dando su metodología al + posible atacante que también tenga acceso a este + documento.</para> + </sect2> + + <sect2> + <title>Ataques de negación de servicios</title> + <indexterm><primary>Ataques de negación de servicios (DoS)</primary></indexterm> + + <para>Esta sección cubre ataques de negación de servicios. + Un ataque DoS es tipicamente un ataque de paquetes. Aunque no hay + mucho que pueda hacer acerca de ataques con paquetes imitados + (spoofed) que saturen su red, generalmente puede limitar el daño + asegurándose que los ataques no tiren sus servidores.</para> + + <orderedlist> + <listitem> + <para>Limitando forks en el servidor.</para> + </listitem> + + <listitem> + <para>Limitando ataques springboard (ataques de respuesta ICMP, + ping broadcast, etc.).</para> + </listitem> + + <listitem> + <para>Caché de ruteo del Kernel.</para> + </listitem> + </orderedlist> + + <para>Un ataque común DoS es contra un servidor con instancias + (forking) que trata de provocar que el servidor consuma procesos, descriptores + de archivos y memoria, hasta que la máquina muere. + <application>inetd</application> (vea &man.inetd.8;) tiene + varias opciones para limitar este tipo de ataque. + Se debe notar que mientras es posible prevenir que una máquina + se caiga, generalmente no es posible prevenir que un servicio sea + interrumpido por el ataque. Lea la página de manual + de <application>inetd</application> con cuidado y ponga atención + especialmente las opciones <option>-c</option>, <option>-C</option>, + y <option>-R</option>. Note que los ataques con direcciones IP imitadas + rodearán la opción <option>-C</option> de + <application>inetd</application>, así que una + combinación de opciones debe ser utilizada. Algunos + servidores que se ejecutan en solitario cuentan con + parámetros de autolimitación de instancias.</para> + + <para><application>Sendmail</application> tiene su opción + <option>-OMaxDaemonChildren</option>, la cual tiende a trabajar + mucho mejor que tratando de usar las opciones de límite + de carga de sendmail debido al retraso que provoca la carga. + Debe especificar un parámetro + <literal>MaxDaemonChildren</literal>, cuando inicia + <application>sendmail</application>, lo suficientemente alto + para manejar su carga esperada, pero no tan alto que la + computadora no pueda manejar ese 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 correr el daemon + (<command>sendmail -bd</command>) + de manera separada de las ejecuciones de cola + (<command>sendmail -q15m</command>). Si todavía desea + 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í + prevenir fallas en cascada.</para> + + <para><application>Syslogd</application> puede ser atacado directamente + y se recomienda fuertemente que utilice la opción + <option>-s</option> siempre que sea posible, y la opción + <option>-a</option> de otra manera.</para> + + <para>También debe ser extremadamente cuidadoso con servicios + de conexión inversa como ident inverso de + <application>TCP Wrapper</application>, que puede ser atacado + directamente. Generalmente no va a querer utilizar la + propiedad de ident inverso de + <application>TCP Wrapper</application> por esta razón.</para> + + <para>Es una muy buena idea proteger los servicios internos + de acceso externo protegiéndolos vía firewall + en los ruteadores de los bordes. + La idea aquí es prevenir ataques de saturación + desde el exterior de la LAN, no tanto para proteger servicios + internos de comprometimientos <username>root</username> basados + en red. Siempre configure un firewall exclusivo, ej., + <quote>restringir todo <emphasis>menos</emphasis> los puertos + A, B, C, D y M-Z</quote>. De esta manera puede restringir + todos sus puertos bajos exceptuando ciertos servicios específicos + como <application>named</application> (si es el primario para + una zona), <application>ntalkd</application>, + <application>sendmail</application> y otros servicios accesibles + desde Internet. Si trata de configurar el firewall de la otra + manera — como un firewall inclusivo o permisivo, existe + una gran posibilidad de que olvide <quote>cerrar</quote> un + par de servicios, o de que agregue un nuevo servicio interno y + olvide actualizar el firewall. Puede incluso abrir el rango + de números de puerto altos en el firewall para permitir + operaciones de tipo permisivas, sin comprometer sus puertos + bajos. También tome nota que &os; le permite controlar + el rango de números de puerto utilizados para asignación + dinámica, a través de <command>sysctl</command> + con <varname>net.inet.ip.portrange</varname> + (<command>sysctl -a | fgrep portrange</command>), lo cual + también facilita la complejidad de la configuración + de su firewall. Por ejemplo, puede utilizar un rango normal + primero/último de 4000 o 5000, y un rango de puerto + alto de 49152 a 65535, entonces bloquée todo debajo de + 4000 en su firewall (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 springboard + — atacar un servidor de una manera que provoca que el + servidor genere respuestas que sobrecarguen al servidor, la + red local o alguna otra máquina. Los ataques más + comunes de este tipo es el <emphasis>ataque ICMP ping broadcast</emphasis>. + El atacante imita paquetes ping enviados a la dirección + broadcast de su LAN con la dirección IP fuente puesta + a la de la máquina que desean atacar. Si sus ruteadores + de borde no están configurados para atrapar pings a + direcciones de broadcast, su LAN termina generando suficientes + respuestas a la dirección fuente imitada 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. Ataques de + broadcast de más de ciento veinte megabits han sido + medidos. Un segundo ataque común springboard es contra + el sistema de reporte de error de ICMP. Mediante la construcción + de paquetes que generan respuestas de error ICMP, un atacante + puede saturar la conexión entrante de red de un servidor + y provocar que el servidor sature su conexión saliente + de red con respuestas ICMP. Este tipo de ataque también + puede estrellar el servidor agotando sus mbufs, especialmente + si el servidor no puede drenar las respuestas ICMP que + genera lo suficientemente rápido. El kernel de &os; + tiene una nueva opción de compilación de + kernel llamada <option>ICMP_BANDLIM</option> que limita la + efectividad de este tipo de ataques. La última gran + clase de ataques springboard está relacionada a + ciertos servicios de <application>inetd</application> como + el servicio de eco udp. Un atacante simplemente imita un paquete + UDP con la dirección fuente siendo el puerto de eco del + servidor A, y la dirección destino siendo el puerto de + eco del servidor B, donde servidor A y B están ambos + en su LAN. Los dos servidores entonces rebotan este paquete + de ida y vuelta entre ellos. El atacante puede sobrecargar + ambos servidores y la LAN simplemente inyectando un par de + paquetes de esta manera. Problemas similares existen con el + puerto <application>chargen</application>. Un administrador + de sistema competente apagará todos estos servicios + de inetd internos de verificación.</para> + + <para>Los ataques de paquetes imitados pueden ser también + utilizados para sobrecargar el caché de ruteo del kernel. + Refiérase a los parámetros de <command>sysctl</command> + <varname>net.inet.ip.rtexpire</varname>, + <varname>rtminexpire</varname>, y + <varname>rtmaxcache</varname>. + Un ataques de paquetes imitados que utiliza una dirección + IP fuente aleatoria provocará que el kernel genere una + ruta temporal en caché en la tabla de ruteo, visible con + <command>netstat -rna | fgrep W3</command>. Estas rutas + tipicamente expiran en 1600 segundos más o menos. Si el + kernel detecta que la tabla de ruteo en caché ya está + demasiado grande reducirá dinamicamente <varname>rtexpire</varname> + pero nunca la decrementará a menos del valor de + <varname>rtminexpire</varname>. Existen 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 al Internet + mediante un T3 o mejor, 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 debe ser + suficiente para proteger la tabla de ruteo de ataques.</para> + </sect2> + + <sect2> + <title>Detalles de 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 necesitan ser analizados si + pretende utilizarlos. Kerberos V es un excelente + protocolo de autentificación, pero existen + errores en la versión kerberizada de + <application>telnet</application> y + <application>rlogin</application> que las hacen + inapropiadas para manejar flujos binarios. + También, por omisión Kerberos no encripta una + sesión a menos que utilice la opción + <option>-x</option>. <application>ssh</application> + encripta todo por omisión. + + <para>ssh funciona bastante bien en + cada caso excepto que reenvía llaves de encriptación + por omisión. Lo que esto significa es que si usted tiene + una estación de trabajo segura manteniendo llaves que + le dan acceso al resto del sistema, y hace ssh a una + máquina insegura, sus llaves son usables. Las llaves en + sí no son expuestas, pero ssh instala un puerto de + reenvío durante la duración de su login, y si + un atacante ha comprometido a <username>root</username> + en la máquina insegura puede utilizar ese puerto + para usar sus llaves y ganar acceso a cualquier otra + máquina que sus llaves abran.</para> + + <para>Recomendamos que utilice ssh en + combinación con Kerberos siempre que sea posible + para logins de staff. + <application>ssh</application> puede ser compilado con + soporte de Kerberos. Esto reduce su dependencia en + llaves ssh expuestas mientras al mismo tiempo + protegen las contraseñas vía Kerberos. + Las llaves ssh deben ser utilizadas solamente 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 haga uso de la + opción <literal>from=IP/DOMAIN</literal> que + ssh permite en su archivo + <filename>authorized_keys</filename> para hacer la llave + usable solamente a entidades que se firmen desde máquinas + específicas.</para> + </sect2> + </sect1> + + <sect1 id="crypt"> + <sect1info> + <authorgroup> + <author> + <firstname>Bill</firstname> + <surname>Swingle</surname> + <contrib>Partes 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 en un sistema &unix; tiene una contraseña + asociada con su cuenta. Parece obvio que estas contraseñas + necesiten ser conocidas solamente por el usuario y por el sistema + operativo. Para mantener estas contraseñas secretas, son + encriptadas con lo que se conoce como un <quote>hash de una pasada</quote>, + esto es, solo pueden ser facilmente encriptadas pero no + desencriptadas. En otras palabras, lo que acabamos de decir fué + tan obvio que ni siquiera es verdad: el sistema operativo mismo no + conoce <emphasis>realmente</emphasis> la contraseña. + Solamente conoce la forma <emphasis>encriptada</emphasis> de + la contraseñ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>Desafortunadamente la única manera segura de encriptar + contraseñas cuando &unix; empezó a hacerlo estaba + basada en DES, la encriptación de datos estándar. + Esto no era tanto problema para usuarios residentes en EU, &os; + tuvo que buscar una manera de cumplir con las leyes de EU y + retener compatibilidad con todos las otras variantes de &unix; + que todavía utilizaban DES.</para> + + <para>La solución fué dividir las librerías + de encriptación para que los usuarios de EU pudieran + instalar las librerías DES y utilizar DES pero los + usuarios internacionales todavía tenían un + método de encriptación que podía ser + exportado. Así es como &os; llegó a usar + MD5 como su método de encriptación por + omisión. Se cree que MD5 es más seguro que + DES, así que la instalación de DES es ofrecida primordialmente + por razones de compatibilidad.</para> + + <sect2> + <title>Reconociendo su mecanismo de encriptación</title> + + <para>Antes de &os; 4.4 <filename>libcrypt.a</filename> era + un enlace simbólico apuntando a la librería que era + utilizada para encriptación. &os; 4.4 cambió + <filename>libcrypt.a</filename> para brindar una librería + configurable de autentificación hash de contraseñas. + Actualmente la librería soporta funciones hash DES, MD5 y + Blowfish. Por omisión &os; utiliza MD5 para encriptar + contraseñas.</para> + + <para>Es muy sencillo identificar que método de + encriptación &os; tiene configurado para usar. + Examinando las contraseñas encriptadas en el archivo + <filename>/etc/master.passwd</filename> en una manera. + Contraseñas encriptadas con el hash MD5 son más + largas que aquellas encriptadas con el hash DES y también + inician con los caracteres + <literal>$1$</literal>. Las contraseñas + que inician con <literal>$2a$</literal> están + encriptadas con la función hash de Blowfish. Las + cadenas de contraseñas DES no tienen ninguna + característica particular, pero son más + cortas que las contraseñas MD5, y están + codificadas con un alfabeto de 64 caracteres el cual no + incluye el caracter <literal>$</literal>, por eso + una cadena relativamente corta que inicie con un signo de + dólar es muy probable que sea una contraseña + DES.</para> + + <para>El formato de contraseña utilizado para nuevas + contraseñas está controlado por la capacidad + <literal>passwd_format</literal> en + <filename>/etc/login.conf</filename>, la cual toma valores + de <literal>des</literal>, <literal>md5</literal> o + <literal>blf</literal>. Vea la página de manual + &man.login.conf.5; para mayor información acerca de + las capacidades de login.</para> + + </sect2> + </sect1> + + <sect1 id="one-time-passwords"> + <title>Contraseñas de una sola vez</title> + <indexterm><primary>Contraseñas de una sola vez</primary></indexterm> + <indexterm> + <primary>seguridad</primary> + <secondary>Contraseñas de una sola vez</secondary> + </indexterm> + + <para>S/Key es un esquema de contraseña de una sola vez + en una función de hash de una pasada. &os; utiliza el + hash MD4 para compatibilidad pero otros sistemas han usado + MD5 y DES-MAC. S/Key ha sido parte del sistema base de &os; + desde la versión 1.1.5 y es usado también en + un número creciente de otros sistemas operativos. S/Key + es una marca registrada de Bell Communications Research, Inc.</para> + + <para>Desde la versión 5.0 de &os;, S/Key ha sido + reemplazado con la funcionalidad equivalente OPIE + (One-time Passwords In Everything). OPIE usa hash MD5 + por omisión.</para> + + <para>Existen tres tipos de contraseñas las cuales serán + discutidas abajo. La primera es la contraseña usual estilo + &unix; o Kerberos; llamaremos a esta una <quote>contraseña &unix;</quote>. + El segundo tipo es la contraseña de una sola vez la cual es + generada por el programa <command>key</command> de S/Key o por + el programa &man.opiekey.1; de OPIE, y aceptada por los programas + <command>keyinit</command> u &man.opiepasswd.1; y el prompt de + login; llamaremos a esta una <quote>contraseña de una sola vez</quote>. + El último tipo de contraseña es la contraseña + secreta que le da a los programas <command>key</command>/<command>opiekey</command> + (y a veces + <command>keyinit</command>/<command>opiepasswd</command>) la cual + es utilizada para generar contraseñas de una sola vez; + llamaremos a esta una <quote>contraseña secreta</quote> + o solamente <quote>contraseña</quote> no calificada.</para> + + <para>La contraseña secreta no tiene nada que ver con su + contraseña &unix;; pueden ser la misma pero esto 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>Bajo &os; la contraseña del + login estándar puede ser de hasta 128 caracteres de + longitud.</para></footnote>, pueden ser tan largas como quiera. + Contraseñas con frases de seis o siete palabras muy largas + son bastante comunes. En la mayor parte, el sistema S/Key o el + OPIE opera completamente independiente del sistema de contraseñas + &unix;.</para> + + <para>Además de la contraseña, existen dos piezas más + de datos que son importante para S/Key y OPIE. Una es la que es + conocida como la <quote>semilla</quote> o <quote>llave</quote>, + consistente de dos letras y cinco dígitos. La otra es la + que es llamada la <quote>cuenta iterativa</quote>, un número + entre 1 y 100. S/Key genera la contraseña de una sola vez + concatenando la semilla y la contraseña secreta, + entonces aplica el hash MD4/MD5 tantas veces como especifique + la cuenta iterativa y convirtiendo el resultado en seis palabras + cortas en inglés. Estas seis palabras en inglés + son su contraseña de una sola vez. El sistema de autentificación + (principalmente PAM) mantiene un registro del uso de contraseñas + de una sola vez, y el usuario es autentificado si el hash de la + contraseña brindada por el usuario es igual a la + contraseña previa. Como se utiliza un hash de una pasada + es imposible generar contraseñas de una sola vez futuras + si una contraseña usada con éxito es capturada; + la cuenta iterativa es decrementada despues de cada login exitoso + para mantener al usuario y al programa login en sincronía. + Cuanto la cuenta iterativa llega a 1, S/Key y OPIE deben ser + reinicializados.</para> + + <para>Hay tres programas involucrados en cada sistema los + cuales discutiremos abajo. 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 una sola vez o una lista consecutiva + de contraseñas de una sola vez. Los programas + <command>keyinit</command> y <command>opiepasswd</command> + son utilizados para inicializar S/Key y OPIE respectivamente, + y para cambiar contraseñas, cuentas iterativas o + semillas; toman ya sea una frase secreta, o una cuenta + iterativa y una contraseña de una sola vez. Los programas + <command>keyinfo</command> y <command>opieinfo</command> + examinan los archivos de credenciales relevantes + (<filename>/etc/skeykeys</filename> o + <filename>/etc/opiekeys</filename>) e imprime la cuenta + iterativa y semilla actual del usuario invocante.</para> + + <para>Existen cuatro tipos de operaciones diferentes que cubriremos. + La primera es usando <command>keyinit</command> o + <command>opiepasswd</command> a través de una conexión + segura para configurar contraseñas de una sola vez por + primera vez, o para cambiar su contraseña o semilla. + La segunda operación es utilizando <command>keyinit</command> + o <command>opiepasswd</command> sobre una conexión insegura, + en conjunto con <command>key</command> u <command>opiekey</command> + sobre una conexión segura, para hacer lo mismo. La tercera + es usando <command>key</command>/<command>opiekey</command> para + conectarse a través de una conexión insegura. + La cuarta es usando <command>opiekey</command> o <command>key</command> + para generar un número de llaves las cuales pueden ser escritas + o impresas para llevárselas con usted al ir a algún + lugar que no cuente con conexiones seguras a ningún lado.</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 esta conectado a través de + una conexión segura (ej., en la consola de una máquina + o vía <application>ssh</application>), use el comando + <command>keyinit</command> sin ningún parámetro + mientras está conectado con su cuenta:</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>Para OPIE, es utilizado <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 ingresar + una contraseña o frase. Recuerde, que esta no es la + contraseña que utilizará para entrar, esta es + usada para generar sus llaves de una sola vez. La línea + <quote>ID</quote> da los parámetros de su instancia + en particular: su nombre de login, la cuenta iterativa y + semilla. Al hacer login el sistema recordará estos + parámetros y los presentará de nuevo para que + no tenga que recordarlos. La última línea da + las contraseéas de una sola vez en particular que + corresponden a esos parámetros y su contraseña + secreta; si fuera a hacer nuevamente login de manera inmediata, + esta contraseña de una sola vez es la que debería + usar.</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 correr <command>key</command> u <command>opiekey</command>; + esto podría ser en la forma de un accesorio de escritorio + en una &macintosh;, o un prompt de shell en una máquina + en la cual confíe. También necesitará hacer + una cuenta iterativa (100 es probablemente un buen valor), y puede + realizar su propia semilla o utilizar una generada de manera + aleatoria. A través de una conexión insegura + (hacia la máquina que está inicializando), utilice + el comando <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>Para OPIE, necesita 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 omisión (la que + el programa <command>keyinit</command> llama de + manera confusa una <literal>key</literal>), presione + <keycap>Enter</keycap>. Entonces antes de proporcionar + una contraseña de acceso, cambiese a su conexión + segura o accesorio de escritorio S/Key, y dele el mismo + parámetro:</para> + + <screen>&prompt.user; <userinput>key 100 to17759</userinput> +Reminder - Do not use this program while logged in via telnet or rlogin. +Enter secret password: <userinput><secret password></userinput> +CURE MIKE BANE HIM RACY GORE</screen> + + <para>O para OPIE:</para> + + <screen>&prompt.user; <userinput>opiekey 498 to4268</userinput> +Using the MD5 algorithm to compute response. +Reminder: Don't use opiekey from telnet or dial-in sessions. +Enter secret pass phrase: +GAME GAG WELT OUT DOWN CHAT +</screen> + + <para>Ahora regrese a la conexión insegura y copie la + contraseña de una sola vez generada al programa + relevante.</para> + </sect2> + + <sect2> + <title>Generando una sola contraseña de una sola vez</title> + + <para>Una vez que ha inicializado S/Key u OPIE, cuando haga login + se le presentará un prompt como este:</para> + +<screen>&prompt.user; <userinput>telnet example.com</userinput> +Trying 10.0.0.1... +Connected to example.com +Escape character is '^]'. + +FreeBSD/i386 (example.com) (ttypa) + +login: <userinput><username></userinput> +s/key 97 fw13894 +Password: </screen> + + <para>O para OPIE:</para> + +<screen>&prompt.user; <userinput>telnet example.com</userinput> +Trying 10.0.0.1... +Connected to example.com +Escape character is '^]'. + +FreeBSD/i386 (example.com) (ttypa) + +login: <userinput><username></userinput> +otp-md5 498 gr4269 ext +Password: </screen> + + <para>Como una nota aparte, el prompt de S/Key u OPIE cuentan con una + opción útil (no mostrada aquí): si presiona + <keycap>Enter</keycap> en el prompt de contraseña, el + prompt activará el eco, para que pueda ver lo que está + tecleando. Esto puede ser extremadamente útil si está + intentando teclear una contraseña a mano, como desde una + forma impresa.</para> + + <indexterm><primary>MS-DOS</primary></indexterm> + <indexterm><primary>Windows</primary></indexterm> + <indexterm><primary>MacOS</primary></indexterm> + + <para>En este punto necesita generar su contraseña de una + sola vez para responder a este prompt de login. Esto debe hacerse + en un sistema confiable en el que pueda ejecutar <command>key</command> + u <command>opiekey</command>. (Existen versiones de estos para DOS, + &windows; y &macos; también.) Ambos necesitan la cuenta iterativa + y la semilla como opciones de línea de comando. Puede cortar + y pegar estas desde el prompt de login en la máquina a la + que se esta firmando.</para> + + <para>En el sistema confiable:</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>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>Ahora que tiene su contraseña de una sola vez puede + continuar con el login:</para> + + <screen>login: <userinput><username></userinput> +s/key 97 fw13894 +Password: <userinput><return to enable echo></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>Generando múltiples contraseñas de una sola vez</title> + + <para>A veces usted tiene que ir a lugares donde no hay + acceso a una máquina confiable o a una conexión + segura. En este caso, es posible utilizar los comandos + <command>key</command> y <command>opiekey</command> para + generar un número de contraseñas de una sola + vez con anticipación para imprimirlar y llevárselas + con usted. Por ejemplo:</para> + + <screen>&prompt.user; <userinput>key -n 5 30 zz99999</userinput> +Reminder - Do not use this program while logged in via telnet or rlogin. +Enter secret password: <userinput><secret password></userinput> +26: SODA RUDE LEA LIND BUDD SILT +27: JILT SPY DUTY GLOW COWL ROT +28: THEM OW COLA RUNT BONG SCOT +29: COT MASH BARR BRIM NAN FLAG +30: CAN KNEE CAST NAME FOLK BILK</screen> + + <para>O para OPIE:</para> + + <screen>&prompt.user; <userinput>opiekey -n 5 30 zz99999</userinput> +Using the MD5 algorithm to compute response. +Reminder: Don't use opiekey from telnet or dial-in sessions. +Enter secret pass phrase: <userinput><secret password></userinput> +26: JOAN BORE FOSS DES NAY QUIT +27: LATE BIAS SLAY FOLK MUCH TRIG +28: SALT TIN ANTI LOON NEAL USE +29: RIO ODIN GO BYE FURY TIC +30: GREW JIVE SAN GIRD BOIL PHI</screen> + + <para>El <option>-n 5</option> pide cinco llaves en secuencia, la + opción <option>30</option> especifica que ese debe ser el + último número de iteración. Note que son + impresas en el orden <emphasis>inverso</emphasis> de uso + eventual. Si es realmente paranoico, tal vez quiera escribir los + resultados a mano; de otra manera puede cortar y pegar hacia <command>lpr</command>. + Note que cada línea muestra la cuenta iterativa y la + contraseña de una sola vez; puede encontrar cómodo + tachar las contraseñas según las vaya utilizando.</para> + </sect2> + + <sect2> + <title>Restringiendo el uso de contraseñas &unix;</title> + + <para>S/Key puede colocar restricciones en el uso de contraseñas + &unix; basandose en el nombre de equipo, nombre de usuario, puerto de + terminal o dirección IP de una sesión de login. + Estas restricciones pueden encontrarse en el archivo de configuracio´n + <filename>/etc/skey.access</filename>. La página de manual + &man.skey.access.5; contiene más información sobre el + formato completo del archivo y detalla también algunas + precauciones de seguridad que hay que tomar en cuenta dependiendo + de este archivo para la seguridad.</para> + + <para>Si no existe un archivo <filename>/etc/skey.access</filename> + (esto es por omisión en sistemas &os; 4.X), entonces + a todos los usuarios se les permitirá utilizar contraseñas + &unix;. Si el archivo existe, de todas maneras, entonces a todos + los usuarios se les requerirá la utilización de + S/Key a menos que se permita explicitamente otra forma por las + declaraciones de configuración en el archivo + <filename>skey.access</filename>. En todos los casos, las + contraseñas &unix; son permitidas en la consola.</para> + + <para>Aquí hay una muestra del archivo de configuración + <filename>skey.access</filename> que ilustra las tres formas más + comunes de declaraciones 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 fuentes (las cuales son + vulnerables a imitación) concuerden con los valores + y máscara especificados, utilizar contraseñas &unix;. + Esto no debe ser considerado un mecanismo de seguridad, sino un + medio de recordarle a usuarios autorizados que están + usando una red insegura y necesitan utilizar S/Key para + autentificació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. Generalmente hablando, esto solo debe ser + usado para gente que no puede usar el programa <command>key</command>, + como aquellos con terminales tontas o los que son ineducables.</para> + + <para>La tercera línea (<literal>permit port</literal>) + permite a todos los usuarios firmados en la línea de + terminal especificada utilizar contraseñas &unix;; + esto puede ser usado para dial-ups.</para> + + <para>OPIE puede restringir el uso de contraseñas &unix; + basándose en la dirección IP de una sesión + de login justo como lo hace S/Key. El archivo relevante es + <filename>/etc/opieaccess</filename>, el cual está presente + por omisión en sistemas &os; 5.0 o posteriores. Por + favor revise &man.opieaccess.5; para mayor información sobre + este archivo y que consideraciones de seguridad debe tener presente + a la hora de usarlo.</para> + + <para>Aquí hay un archivo <filename>opieaccess</filename> de muestra:</para> + + <programlisting>permit 192.168.0.0 255.255.0.0</programlisting> + + <para>Esta línea le permie a usuarios cuya dirección + IP fuente (la cual es vulnerable a imitació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>, + por omisión se niegan 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> + + <indexterm><primary>TCP Wrappers</primary></indexterm> + + <title>TCP Wrappers</title> + + <para>Cualquiera familiarizado con &man.inetd.8; ha escuchado + probablemente de <acronym>TCP</acronym> Wrappers en algún + momento. Pero pocos individuos parecen comprender + completamente su utilidad en un ambiente de red. Parece que + todos quieren instalar un firewall para manejar conexiones + de red. Mientras un firewall tiene una amplia variedad de + usos, hay cosas que un firewall no maneja como el envío + de texto de regreso al originador de la conexión. + El software <acronym>TCP</acronym> hace esto y más. + En las siguientes secciones varias de las opciones de + <acronym>TCP</acronym> Wrappers serán discutidas, + y, cuando aplique, se brindarán ejemplos de + líneas de configuración.</para> + + <para>El software <acronym>TCP</acronym> Wrappers extiende + las habilidades de <command>inetd</command> para brindar + soporte para cada servidor daemon bajo su control. + Utilizando este método es posible proveer soporte de + logs, regresar mensajes a conexiones, permitir a un daemon + aceptar solamente conexiones internas, etc. Mientras algunas + de estas opciones pueden ser provistas implementando un + firewall, esto agregará no solamente una capa extra + de protección sino que irá más allá + del nivel de control que un firewall puede brindar.</para> + + <para>La funcionalidad agregada de <acronym>TCP</acronym> Wrappers + no debe ser considerada un reemplazo de un buen firewall. + <acronym>TCP</acronym> Wrappers puede ser utilizado en + conjunto con un firewall o otra mejoría de seguridad + aunque solo puede servir como una capa extra de protección + para el sistema.</para> + + <para>Ya que es una extensión a la configuración + de <command>inetd</command>, se espera que el lector haya + leido la sección + <link linkend="network-inetd">configuración de inetd</link>.</para> + + <note> + <para>Mientras programas ejecutados por &man.inetd.8; no son + exactamente <quote>daemons</quote>, han sido llamados + tradicionalmente daemons. Este es el término que + usaremos en esta sección también.</para> + </note> + + <sect2> + <title>Configuración inicial</title> + + <para>El único requerimiento para usar + <acronym>TCP</acronym> Wrappers en &os; es asegurarse + que el servidor <command>inetd</command> sea iniciado + desde <filename>rc.conf</filename> con la opción + <option>-Ww</option>; esta es la configuración + por omisión. Por supuesto, se espera que + <filename>/etc/hosts.allow</filename> esté propiamente + configurado, pero &man.syslogd.8; aventará mensajes + a los logs del sistema en estos casos.</para> + + <note> + <para>A diferencia de otras implementaciones de <acronym>TCP</acronym> + Wrappers, el uso de <filename>hosts.deny</filename> ha sido + descontinuado. Todas las opciones de configuración + deben ser colocadas en <filename>/etc/hosts.allow</filename>.</para> + </note> + + <para>En la configuración más simple, las + políticas de conexión de daemons están + configuradas ya sea a permitir o bloquear, dependiendo de + las opciones en <filename>/etc/hosts.allow</filename>. + La configuración por omisión en &os; es + permitir una conexión a cada daemon iniciado con + <command>inetd</command>. Cambiar esta configuración + será discutido solamente despues de cubrir la + configuración básica.</para> + + <para>La configuración básica usualmente + toma la forma de + <literal>daemon : dirección : acción</literal>. + Donde <literal>daemon</literal> es el nombre de daemon + el cual inicia <command>inetd</command>. La + <literal>dirección</literal> puede ser un nombre + de equipo válido, una dirección IP o + IPv6 encerrada en corchetes ([ ]). El campo de + acción puede ser permitir o denegar para el + dar el acceso apropiado. Tenga en mente que la + configuración funciona en base a la primera + concordancia encontrada en la regla de semántica, + esto significa que el archivo de configuración es + explorado en orden ascendente por una regla que + concuerde. Cuando se encuentra una concordancia la + regla es aplicada y el proceso se detendrá.</para> + + <para>Existen muchas otras opciones pero estas serán + explicadas en una sección posterior. Una línea + de configuración simple puede ser facilmente + construida desde esa información solamente. Por + ejemplo para permitir conexiones <acronym>POP</acronym>3 + por medio del daemon <filename role="package">mail/qpopper</filename>, + las siguientes líneas deben ser agregadas 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, <command>inetd</command> + necesitará reiniciar. Esto puede lograrse usando el + comando &man.kill.1;, o con el parámetro <parameter>restart</parameter> + con <filename>/etc/rc.d/inetd</filename>.</para> + </sect2> + + <sect2> + <title>Configuración avanzada</title> + + <para><acronym>TCP</acronym> Wrappers tiene + opciones avanzadas también; estas permitirán + mayor control sobre la forma en que son manejadas las + conexiones. En algunos casos puede ser una buena idea + regresar un comentario a ciertos equipos o conexiones + de daemons. En otros casos, quizás se deba + registrar un archivo de log o enviar un correo al + administrador. Otras situaciones pueden requerir + el uso de un servicio para conexiones locales + solamente. Todo esto es posible a través del + uso de opciones de configuración conocidas + como <literal>comodines</literal>, caracteres de expansión + y ejecución de comandos externos. Las diguientes dos + secciones están escritas para cubrir estas + situaciones.</para> + + <sect3> + <title>Comandos externos</title> + + <para>Suponga que ocurre una situación donde una + conexión debe ser negada pero se debe mandar una razón + al individuo que intentó establecer esa conexión. + ¿Como se puede lograr? Esa acción puede hacerse + posible utilizando la opción <option>twist</option>. + Cuando un intento de conexión es hecha, se llamará + a <option>twist</option> para ejecutar un comando de shell + o un script. Existe ya un ejemplo en el archivo + <filename>hosts.allow</filename>:</para> + + <programlisting># The rest of the daemons are protected. +ALL : ALL \ + : severity auth.info \ + : twist /bin/echo "No es bienvenido a utilizar %d desde %h."</programlisting> + + <para>Este ejemplo muestra que el mensaje, + <quote>No es bienvenido a utilizar <literal>daemon</literal> + desde <literal>nombre de equipo</literal>.</quote> será + retornado para cualquier daemon no configurado previamente + en el archivo de acceso. + Esto es extremadamente útil para enviar una respuesta + de regreso al iniciador de la conexión justo despues + que la conexión establecida es tirada. Note que + cualquier mensaje regresado <emphasis>debe</emphasis> + ser encerrado entre comillas <literal>"</literal>; + no existen excepciones a esta regla.</para> + + <warning> + <para>Puede ser posible lanzar un ataque de negación + de servicio en el servidor si un atacante o grupo de + atacantes pueden sobrecargar estos daemons con peticiones + de conexión.</para> + </warning> + + <para>Otra posibilidad es usar la opción <option>spawn</option> + en estos casos. Al igual que <option>twist</option>, + <option>spawn</option> niega implicitamente la conexión + y puede ser utilizada para correr comandos de shell externos + o scripts. A diferencia de <option>twist</option>, + <option>spawn</option> no mandará una respuesta de + regreso al individuo que ha establecido la conexión. + Por ejemplo, considere la siguiente línea de + configuración:</para> + + <programlisting># No permitimos conexiones desde example.com: +ALL : .example.com \ + : spawn (/bin/echo %a from %h attempted to access %d >> \ + /var/log/connections.log) \ + : deny</programlisting> + + <para>Esto negará todos los intentos de conexión + desde el dominio <hostid role="fqdn">*.example.com</hostid>; + simultaneamente haciendo un log del nombre del equipo, + dirección <acronym>IP</acronym> y el daemon al + que se intentó accesar en el archivo + <filename>/var/log/connections.log</filename>.</para> + + <para>Además de la sustitución de caracteres ya + explicada arriba, ej. %a, existen unas cuantas más. + Vea la página de manual &man.hosts.access.5; para + la lista completa.</para> + </sect3> + + <sect3> + <title>Opciones comodín</title> + + <para>Hasta el momento el ejemplo <literal>ALL</literal> ha sido + utilizado continuamente a lo largo de los ejemplos. Existen + otras opciones que extienden un poco más la funcionalidad. + Para ejemplificar, <literal>ALL</literal> puede ser usado para + concordar con cualquier instancia ya sea de daemon, dominio o + dirección <acronym>IP</acronym>. Otro comodín + dsponible es <literal>PARANOID</literal> el cual puede ser + usado para concordar con cualquier equipo que brinde una + dirección <acronym>IP</acronym> que puede estar + falsificada. En otras palabras, <literal>paranoid</literal> + puede ser usado para definir una acción a tomar + siempre que una conexión sea hecha desde una + dirección <acronym>IP</acronym> que difiera de su + nombre de equipo. El siguiente ejemplo puede arrojar más + luz en esta discusión:</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 seran negadas.</para> + + <caution> + <para>Utilizando <literal>PARANOID</literal> puede invalidar + servidores si el cliente o servidor tiene una configuración + de <acronym>DNS</acronym> dañada. Se recomienda + precaución del administrador.</para> + </caution> + + <para>Para aprender más acerca de comodines y sus + funcionalidades asociadas, vea la página de + manual &man.hosts.access.5;.</para> + + <para>Antes de que cualquiera de las líneas de + configuración específica de arriba + funcione, la primera línea debe ser comentada + en <filename>hosts.allow</filename>. Esto fué + especificado al principio de esta sección.</para> + </sect3> + </sect2> + </sect1> + + <sect1 id="kerberosIV"> + <sect1info> + <authorgroup> + <author> + <firstname>Mark</firstname> + <surname>Murray</surname> + <contrib>Contribuido por </contrib> + </author> + </authorgroup> + <authorgroup> + <author> + <firstname>Mark</firstname> + <surname>Dapoz</surname> + <contrib>Basado en una contribución de </contrib> + </author> + </authorgroup> + </sect1info> + + <title><application>KerberosIV</application></title> + + <para>Kerberos es un sistema/protocolo agregado para red que le permite + a usuarios autentificarse a través de los servicios de un + servidor seguro. Servicios como login remoto, copia remota, copias + de archivo inter-sistemas seguras y otras tareas de riesgo son + hechas considerablemente seguras y más controlables.</para> + + <para>Las siguientes instrucciones pueden usarse como una guía + para configurar Kerberos como se distribuye para &os;. De todas + maneras, debe referirse a las páginas de manual relevantes + para una descripción completa.</para> + + <sect2> + <title>Instalando <application>KerberosIV</application></title> + + <indexterm><primary>MIT</primary></indexterm> + <indexterm> + <primary>KerberosIV</primary> + <secondary>instalación</secondary> + </indexterm> + <para>Kerberos es un componente óptimo 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;. Esto + instalará la implementación de Kerberos + <quote>eBones</quote> (KerberosIV) o + <quote>Heimdal</quote> (Kerberos5). + Estas implementaciones son incluidas debido a que están + desarrolladas fuera de EU/Canada y estaban así disponibles + para propietarios de sistemas fuera de estos países + durante la era restrictiva de control de exportaciones en código + criptográfico desde EU.</para> + + <para>Alternativamente, la implementación de Kerberos + del MIT está disponible en la colección + de ports como + <filename role="package">security/krb5</filename>.</para> + </sect2> + + <sect2> + <title>Creando la base de datos inicial</title> + + <para>Esto es hecho en el servidor Kerberos solamente. Primero + asegúrese que no tiene bases de datos antiguas de + Kerberos. Debe cambiarse al directorio <filename>/etc/kerberosIV</filename> + y revisar que solo los siguientes archivos estén + presentes:</para> + + <screen>&prompt.root; <userinput>cd /etc/kerberosIV</userinput> +&prompt.root; <userinput>ls</userinput> +README krb.conf krb.realms</screen> + + <para>Si existe cualquier archivo adicional (como <filename>principal.*</filename> + o <filename>master_key</filename>), entonces utilice el + comando <command>kdb_destroy</command> para destruir la base + de datos antigua de Kerberos, o si Kerberos no está + corriendo, simplemente borre los archivos adicionales.</para> + + <para>Ahora debe editar los archivos <filename>krb.conf</filename> + y <filename>krb.realms</filename> para definir su dominio + Kerberos. En este caso el dominio será <literal>EXAMPLE.COM</literal> + y el servidor es <hostid role="fqdn">grunt.example.com</hostid>. + Editamos o creamos el archivo <filename>krb.conf</filename>:</para> + + <screen>&prompt.root; <userinput>cat krb.conf</userinput> +EXAMPLE.COM +EXAMPLE.COM grunt.example.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>En este caso, los otros dominios no necesitan estar ahí. + Están aquí como un ejemplo de como puede hacerse a una + máquina consciente de dominios múltiples. Tal vez + no desée incluirlos por simplicidad.</para> + + <para>La primera línea nombra el dominio en el cual el + sistema trabaja. Las otras líneas contienen entradas + dominio/equipo. El primer componente en una línea es un + dominio, y el segundo es un equipo en ese dominio que está + actuando como un <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 + brinda un servidor de base da datos administrativo. Para una + explicación más completa de estos términos, + consulte por favor las páginas de manual de Kerberos.</para> + + <para>Ahora tenemos que agregar <hostid role="fqdn">grunt.example.com</hostid> + al dominio <literal>EXAMPLE.COM</literal> y también agregar + una entrada para poner todos los equipos en el dominio + <hostid role="domainname">.example.com</hostid> + Kerberos <literal>EXAMPLE.COM</literal>. El archivo + <filename>krb.realms</filename> puede ser actualizado como + sigue:</para> + + <screen>&prompt.root; <userinput>cat krb.realms</userinput> +grunt.example.com EXAMPLE.COM +.example.com EXAMPLE.COM +.berkeley.edu CS.BERKELEY.EDU +.MIT.EDU ATHENA.MIT.EDU +.mit.edu ATHENA.MIT.EDU</screen> + + <para>De nuevo, los otros dominios no necesitan estar ahí. Están + aquí como un ejemplo de como una máquina puede hacerse consciente + de dominios múltiples. Tal vez desée eliminarlos para + simplificar las cosas.</para> + + <para>a primera línea pone al sistema <emphasis>específico</emphasis> + en el dominio nombrado. El resto de las líneas muestran como + poner por omisión sistemas de un subdominio particular + a un dominio Kerberos.</para> + + <para>Ahora estamos listos para crear la base de datos. Esta solo + necesita correr en el servidor Kerberos (o centro de distribución + de llaves). Ejecute el comando <command>kdb_init</command> para + hacer esto:</para> + + <screen>&prompt.root; <userinput>kdb_init</userinput> +<prompt>Realm name [default ATHENA.MIT.EDU ]:</prompt> <userinput>EXAMPLE.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 tenemos que salvar la llave para que los servidores en + la máquina local puedan recogerla. Use el comando + <command>kstash</command> para hacer esto:</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 salva la contraseña encriptada + maestra en <filename>/etc/kerberosIV/master_key</filename>.</para> + </sect2> + + <sect2> + <title>Haciendo que corra todo</title> + + <indexterm> + <primary>KerberosIV</primary> + <secondary>encendido inicial</secondary> + </indexterm> + + <para> + <para>Dos datos principales necesitan ser agregados a la base de + datos para <emphasis>cada</emphasis> sistema que estará + asegurado con Kerberos. Sus nombres son <literal>kpasswd</literal> y + <literal>rcmd</literal>. Estos dos datos están hechos para + cada sistema, con la instancia siendo el nombre del sistema + individual.</para> + + <para>Estos daemons, <application>kpasswd</application> y + <application>rcmd</application> le permiten a otros sistemas + cambiar contraseñas de Kerberos y ejecutar comandos + como &man.rcp.1;, &man.rlogin.1; y &man.rsh.1;.</para> + + <para>Ahora vamos a añadir estas entradas:</para> + + <screen>&prompt.root; <userinput>kdb_edit</userinput> +Opening database... + +<prompt>Enter Kerberos master key:</prompt> + +Current Kerberos master key version is 1. + +Master key entered. BEWARE! +Previous or default values are in [brackets] , +enter return to leave the same, or new value. + +<prompt>Principal name:</prompt> <userinput>passwd</userinput> +<prompt>Instance:</prompt> <userinput>grunt</userinput> + +<Not found>, <prompt>Create [y] ?</prompt> <userinput>y</userinput> + +Principal: passwd, Instance: grunt, kdc_key_ver: 1 +<prompt>New Password:</prompt> <---- enter RANDOM here +Verifying password + +<prompt>New Password:</prompt> <---- enter RANDOM here + +<prompt>Random password [y] ?</prompt> <userinput>y</userinput> + +Principal's new key version = 1 +<prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt> +<prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt> +<prompt>Attributes [ 0 ] ?</prompt> +Edit O.K. +<prompt>Principal name:</prompt> <userinput>rcmd</userinput> +<prompt>Instance:</prompt> <userinput>grunt</userinput> + +<Not found>, <prompt>Create [y] ?</prompt> + +Principal: rcmd, Instance: grunt, kdc_key_ver: 1 +<prompt>New Password:</prompt> <---- enter RANDOM here +Verifying password + +<prompt>New Password:</prompt> <---- enter RANDOM here + +<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> <---- null entry here will cause an exit</screen> + </sect2> + + <sect2> + <title>Creando el archivo de servidor</title> + + <para>Ahora tenemos que extraer todas las instancias que definen + los servicios en cada máquina. Para esto usamos el + comando <command>ext_srvtab</command>. Esto creará un + archivo que debe ser copiado o movido <emphasis>por medios + seguros</emphasis> a cada cliente de Kerberos + en el directorio <filename>/etc/kerberosIV</filename>. + Este archivo debe estar presente en cada servidor y cliente, y es + crucial para la operación 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>Ahora, este comando solo genera un archivo temporal el cual + debe ser renombrado a <filename>srvtab</filename> para que todos + los servidores puedan recogerlo. Utilice el comando + &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 archivo es para un sistema cliente, y la red no se considera + segura, entonces copie el + <filename><replaceable>client</replaceable>-new-srvtab</filename> a un + medio removible y transportelo por medios físicos seguros. + Asegúrese de renombrarlo a <filename>srvtab</filename> en el + directorio <filename>/etc/kerberosIV</filename> del cliente, y + asegúrese 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>Poblando la base de datos</title> + + <para>Ahora tenemos que agregar algunas entradas de usuarios en la + base de datos. Primero vamos a crear una entrada para el usuario + <username>jane</username>. Utilice el comando + <command>kdb_edit</command> para hacer esto:</para> + + <screen>&prompt.root; <userinput>kdb_edit</userinput> +Opening database... + +<prompt>Enter Kerberos master key:</prompt> + +Current Kerberos master key version is 1. + +Master key entered. BEWARE! +Previous or default values are in [brackets] , +enter return to leave the same, or new value. + +<prompt>Principal name:</prompt> <userinput>jane</userinput> +<prompt>Instance:</prompt> + +<Not found>, <prompt>Create [y] ?</prompt> <userinput>y</userinput> + +Principal: jane, Instance: , kdc_key_ver: 1 +<prompt>New Password:</prompt> <---- enter a secure password here +Verifying password + +<prompt>New Password:</prompt> <---- re-enter the password here +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> <---- null entry here will cause an exit</screen> + </sect2> + + <sect2> + <title>Probándolo todo</title> + + <para>Primero tenemos que iniciar los daemons de Kerberos. Note que + si tiene correctamente editado su <filename>/etc/rc.conf</filename> + entonces esto sucederá automaticamente cuando reinicie. + Esto solamente es necesario el el servidor Kerberos. Los clientes + Kerberos tomarán automaticamente lo que necesiten desde + el directorio <filename>/etc/kerberosIV</filename>.</para> + + <screen>&prompt.root; <userinput>kerberos &</userinput> +Kerberos server starting +Sleep forever on error +Log file is /var/log/kerberos.log +Current Kerberos master key version is 1. + +Master key entered. BEWARE! + +Current Kerberos master key version is 1 +Local realm: EXAMPLE.COM +&prompt.root; <userinput>kadmind -n &</userinput> +KADM Server KADM0.0A initializing +Please do not use 'kill -9' to kill this job, use a +regular kill instead + +Current Kerberos master key version is 1. + +Master key entered. BEWARE!</screen> + + <para>Ahora podemos tratar usando el comando <command>kinit</command> + para obtener un boleto para el ID <username>jane</username> + que creamos arriba:</para> + + <screen>&prompt.user; <userinput>kinit jane</userinput> +MIT Project Athena (grunt.example.com) +Kerberos Initialization for "jane" +<prompt>Password:</prompt> </screen> + + <para>Trate de listar los tokens usando <command>klist</command> para ver + si realmente los tenemos:</para> + + <screen>&prompt.user; <userinput>klist</userinput> +Ticket file: /tmp/tkt245 +Principal: jane@EXAMPLE.COM + + Issued Expires Principal +Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EXAMPLE.COM@EXAMPLE.COM</screen> + + <para>Ahora trate de cambiar la contraseña usando + &man.passwd.1; para revisar si el daemon <application>kpasswd</application> + puede obtener autorización para la base de datos + Kerberos:</para> + + <screen>&prompt.user; <userinput>passwd</userinput> +realm EXAMPLE.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ñadiendo privilegios <command>su</command></title> + + <para>Kerberos nos permite dar a <emphasis>cada</emphasis> + usuario que necesite privilegios de <username>root</username> + su propia contraseña &man.su.1; <emphasis>separada</emphasis>. + Ahora podemos agregar un ID que esté autorizado a + &man.su.1; <username>root</username>. Esto es controlado + teniendo una instancia de <username>root</username> + asociada con una principal. Usando <command>kdb_edit</command> + podemos crear la entrada <literal>jane.root</literal> en la + base de datos Kerberos:</para> + + <screen>&prompt.root; <userinput>kdb_edit</userinput> +Opening database... + +<prompt>Enter Kerberos master key:</prompt> + +Current Kerberos master key version is 1. + +Master key entered. BEWARE! +Previous or default values are in [brackets] , +enter return to leave the same, or new value. + +<prompt>Principal name:</prompt> <userinput>jane</userinput> +<prompt>Instance:</prompt> <userinput>root</userinput> + +<Not found>, Create [y] ? y + +Principal: jane, Instance: root, kdc_key_ver: 1 +<prompt>New Password:</prompt> <---- enter a SECURE password here +Verifying password + +<prompt>New Password:</prompt> <---- re-enter the password here + +Principal's new key version = 1 +<prompt>Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?</prompt> +<prompt>Max ticket lifetime (*5 minutes) [ 255 ] ?</prompt> <userinput>12</userinput> <--- Keep this short! +<prompt>Attributes [ 0 ] ?</prompt> +Edit O.K. +<prompt>Principal name:</prompt> <---- null entry here will cause an exit</screen> + + <para>Ahora trate de obtener los tokens para asegurarse que funcione:</para> + + <screen>&prompt.root; <userinput>kinit jane.root</userinput> +MIT Project Athena (grunt.example.com) +Kerberos Initialization for "jane.root" +<prompt>Password:</prompt></screen> + + <para>Ahora necesitamos agregar al usuario al archivo de <username>root</username> + <filename>.klogin</filename>:</para> + + <screen>&prompt.root; <userinput>cat /root/.klogin</userinput> +jane.root@EXAMPLE.COM</screen> + + <para>Ahora trate de hacer &man.su.1;:</para> + + <screen>&prompt.user; <userinput>su</userinput> +<prompt>Password:</prompt></screen> + + <para>y heche un vistazo a que tokens tenemos:</para> + + <screen>&prompt.root; <userinput>klist</userinput> +Ticket file: /tmp/tkt_root_245 +Principal: jane.root@EXAMPLE.COM + + Issued Expires Principal +May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM</screen> + </sect2> + + <sect2> + <title>Utilizando otros comandos</title> + + <para>En un ejemplo anterior, creamos creamos un principal + llamado <literal>jane</literal> con una instancia <literal>root</literal>. + Esto fué basado en un usuario con el mismo nombre del + principal, y esto es por omisión en Kerberos; que + <literal><principal>.<instancia></literal> de la + forma + <literal><nombre de usuario>.</literal><username>root</username> + permitirá que <literal><nombre de usuario></literal> + haga &man.su.1; a <username>root</username> si las entradas necesarias + están en el archivo <filename>.klogin</filename> en el + directorio home de <username>root</username>:</para> + + <screen>&prompt.root; <userinput>cat /root/.klogin</userinput> +jane.root@EXAMPLE.COM</screen> + + <para>De la misma manera, si un usuario tiene en su propio directorio home + líneas de la forma:</para> + + <screen>&prompt.user; <userinput>cat ~/.klogin</userinput> +jane@EXAMPLE.COM +jack@EXAMPLE.COM</screen> + + <para>Esto permite a cualquiera en el dominio <literal>EXAMPLE.COM</literal> + que se ha autentificado como <username>jane</username> o como + <username>jack</username> (vía <command>kinit</command>, ver + arriba) para accesar la cuenta de <username>jane</username> o + archivos en este sistema (<hostid>grunt</hostid>) vía + &man.rlogin.1;, &man.rsh.1; o + &man.rcp.1;.</para> + + <para>Por ejemplo, <username>jane</username> se firma ahora en otro sistema + usando Kerberos:</para> + + <screen>&prompt.user; <userinput>kinit</userinput> +MIT Project Athena (grunt.example.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>O <username>jack</username> se firma a la cuenta de <username>jane</username> en la misma + máquina (<username>jane</username> habiendo + configurado el archivo <filename>.klogin</filename> + como está arriba, y la persona a cargo de + Kerberos habiendo configurado un 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.example.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>Contribuido por </contrib> + </author> + </authorgroup> + <authorgroup> + <author> + <firstname>Mark</firstname> + <surname>Murray</surname> + <contrib>Basado en una contribución de </contrib> + </author> + </authorgroup> + </sect1info> + + <title><application>Kerberos5</application></title> + + <para>Cada release 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 incluída, y su configuración + es similar en muchos aspectos a la de <application>KerberosIV</application>. + La siguiente información solo aplica a + <application>Kerberos5</application> en releases 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 le permite + a usuarios autentificarse a través de los servicios de un + servidor seguro. Servicios como login remoto, copia remota, copias + de archivo inter-sistemas seguras y otras tareas de riesgo son + hechas considerablemente seguras y más controlables.</para> + + <para><application>Kerberos</application> puede ser descrito como + un sistema proxy identificador-verificador. También + puede ser descrito como un sistema confiable de autentificación + de terceros. + <application>Kerberos</application> brinda solamente + una función — la autenficación segura de + usuarios en la red. No proporciona funciones de autorización + (lo que los usuarios tienen permitido hacer) o funciones de + auditoría (lo que esos usuarios hicieron). + Despues de que un servidor y cliente han usado + <application>Kerberos</application> para probar su identidad, + pueden también encriptar todas sus comunicaciones para + asegurar privacidad e integridad de datos mientras continuan + con sus funciones.</para> + + <para>Por lo tanto es altamente recomendable que + <application>Kerberos</application> sea utilizado con otros + métodos de seguridad que brinden servicios de + autorización y auditoría.</para> + + <para>Las siguientes instrucciones pueden utilizarse como una guía + para configurar <application>Kerberos</application> como se + distribuye en &os;. De todas maneras, se debe dirigir a las páginas + de manual relevantes para una descripción completa.</para> + + <para>Para propósitos de demostrar una instalación + <application>Kerberos</application>, los varios espacios de + nombre serán manejados como sigue:</para> + + <itemizedlist> + <listitem> + <para>El dominio <acronym>DNS</acronym> (<quote>zona</quote>) + será example.org.</para> + </listitem> + + <listitem> + <para>El dominio <application>Kerberos</application> (realm) + será EXAMPLE.ORG.</para> + </listitem> + </itemizedlist> + + <note> + <para>Por favor utilice nombres de dominio reales al + configurar <application>Kerberos</application> incluso si + pretende ejecutarlo internamente. Esto evita 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>history</secondary> + </indexterm> + + <para><application>Kerberos</application> fué creado + por el <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 + probar su identidad a 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 de red y un adjetivo + para describir programas que implementan el programa + (<application>Kerberos</application> telnet, por ejemplo). + La versión actual del protocolo es la 5, descrita en + <acronym>RFC</acronym> 1510.</para> + + <para>Varias implementaciones libres de este protocolo están + disponibles, cubriendo un amplio rango de sistemas operativos. + El Massachusetts Institute of Technology (<acronym>MIT</acronym>), + donde <application>Kerberos</application> fué originalmente + desarrollado, continua desarrollando su paquete + <application>Kerberos</application>. Es comunmente usado en los + <acronym>EU</acronym> como un producto criptográfico, y + como tal ha sido historicamente afectado por las regulaciones de + exportación de <acronym>EU</acronym>. + El <application>Kerberos</application> del <acronym>MIT</acronym> + está disponible como un port + (<filename role="package">security/krb5</filename>). Heimdal + <application>Kerberos</application> es otra implementación + de la versión 5, y fue desarrollada explicitamente fuera + de los <acronym>EU</acronym> para evitar las regulaciones de + exportación (y es por eso incluída en variantes + &unix; no comerciales). La distribución Heimdal + <application>Kerberos</application> está disponible + como un port + (<filename role="package">security/heimdal</filename>), y una + instalación mínima viene incluída en la + instalación 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>Configurando un <acronym>KDC</acronym> Heimdal</title> + <indexterm> + <primary>Kerberos5</primary> + <secondary>Dentro 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 autentificación + que proporciona <application>Kerberos</application> — es + la computadoras que emite boletos <application>Kerberos</application>. + El <acronym>KDC</acronym> está considerado como <quote>confiable</quote> + por todas las otras computadoras en el dominio <application>Kerberos</application>, + y por eso tiene consideraciones de seguridad más elevados.</para> + + <para>Note que mientras la ejecuación del servidor + <application>Kerberos</application> requiere muy pocos recursos + computacionales, una máquina dedicada actuando solamente + como <acronym>KDC</acronym> es recomendada por razones de + seguridad.</para> + + <para>Para empezar a configurar un <acronym>KDC</acronym>, asegúrese + que su archivo <filename>/etc/rc.conf</filename> contiene las + configuraciones correctas para actuar como un <acronym>KDC</acronym> + (tal vez necesite ajustar algunas rutas para reflejar su propio + sistema):</para> + + <programlisting>kerberos5_server_enable="YES" +kadmind5_server_enable="YES" +kerberos_stash="YES"</programlisting> + + <note> + <para><option>kerberos_stash</option> está solamente + disponible en &os; 4.X.</para> + </note> + + <para>A continuación configuraremos el archivo de + configuración de <application>Kerberos</application>, + <filename>/etc/krb5.conf</filename>:</para> + + <programlisting>[libdefaults] + default_realm = EXAMPLE.ORG +[realms] + EXAMPLE.ORG = { + kdc = kerberos.example.org + admin_server = kerberos.example.org + } +[domain_realm] + .example.org = EXAMPLE.ORG</programlisting> + + <para>Note que este archivo <filename>/etc/krb5.conf</filename> + implica que su <acronym>KDC</acronym> tendrá el nombre + de equipo completo calificado de <hostid role="fqdn">kerberos.example.org</hostid>. + Necesitará agregar una entrada CNAME (alias) a su archivo + de zona para lograr esto si su <acronym>KDC</acronym> tiene un + nombre de equipo diferente.</para> + + <note> + <para>Para redes grandes con un servidor <acronym>DNS</acronym> + <acronym>BIND</acronym> propiamente configurado, el ejemplo + de arriba puede ser recortado a:</para> + + <programlisting>[libdefaults] + default_realm = EXAMPLE.ORG</programlisting> + + <para>Con las líneas siguientes agregadas al + archivo de zona <hostid role="fqdn">example.org</hostid>:</para> + + <programlisting>_kerberos._udp IN SRV 01 00 88 kerberos.example.org. +_kerberos._tcp IN SRV 01 00 88 kerberos.example.org. +_kpasswd._udp IN SRV 01 00 464 kerberos.example.org. +_kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org. +_kerberos IN TXT EXAMPLE.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> completamente 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 encriptadas con una + contraseña maestra. No se requiere que usted recuerde + esta contraseña, será almacenada en un archivo + (<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 instruye a + <command>kadmin</command> que modifique los archivos de la base + de datos directamente en lugar de ir a través del servicio + de red <command>kadmind</command>. Esto maneja el problema del + huevo y la gallina de tratar de conectar a la base de datos + antes de que ésta sea creada. Una vez que tiene el prompt + de <command>kadmin</command>, utilice el comando <command>init</command> + para crear su base de datos de dominios iniciales.</para> + + <para>Finalmente, mientras está todavía en <command>kadmin</command>, + puede crear su primer principal utilizando el comando <command>add</command>. + Apéguese a las opciones por omisión para los + principales por ahora, puede cambiarlas despues con el comando + <command>modify</command>. Note que puede usar el comando + <literal>?</literal> en cualquier prompt para ver las opciones + disponibles.</para> + + <para>Una sesión de ejemplo de creación de una + base de datos es mostrada abajo:</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 EXAMPLE.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 es tiempo de iniciar los servicios <acronym>KDC</acronym>. + Ejecute <command>/etc/rc.d/kerberos start</command> y + <command>/etc/rc.d/kadmind start</command> para levantar los + servicios. Note que no tendrá ningún daemon + kerberizado corriendo en este punto pero debe ser capaz de confirmar + que el <acronym>KDC</acronym> está funcionando obteniendo + y listando un boleto para el principal (usuario) que acaba de crear + desde la línea de comando del mismo <acronym>KDC</acronym>:</para> + + <screen>&prompt.user; <userinput>k5init <replaceable>tillman</replaceable></userinput> +tillman@EXAMPLE.ORG's Password: + +&prompt.user; <userinput>k5list</userinput> +Credentials cache: FILE:<filename>/tmp/krb5cc_500</filename> + Principal: tillman@EXAMPLE.ORG + + Issued Expires Principal +Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG</screen> + + </sect2> + + <sect2> + <title><application>Kerberos</application> habilitando un servidor con + servicios Heimdal</title> + + <indexterm> + <primary>Kerberos5</primary> + <secondary>habilitando servicios</secondary> + </indexterm> + + <para>Primero, necesitamos una copia del archivo de configuración + de <application>Kerberos</application>, <filename>/etc/krb5.conf</filename>. + Para eso, simplemente copielo a la computadora cliente desde el + <acronym>KDC</acronym> de una manera segura (utilizando utilidades + de red como &man.scp.1;, o fisicamente con un disco flexible).</para> + + <para>A continuación necesita un archivo <filename>/etc/krb5.keytab</filename>. + Esta es la diferencia más grande entre un servidor + proporcionando daemons habilitados con <application>Kerberos</application> + y una estación de trabajo — el servidor debe + tener un archivo <filename>keytab</filename>. Este archivo + contiene las llaves de equipo del servidor, las cuales + le permiten a él y al <acronym>KDC</acronym> + verificar la identidad entre ellos. Debe ser transmitidos al + servidor de una manera segura, ya la seguridad en el servidor + puede ser comprometida si la llave es hecha pública. + Esto significa explicitamente que transfiriendola por medio + de un canal de texto claro, como <acronym>FTP</acronym>, es + una muy mala idea.</para> + + <para>Tipicamente, transfiere al <filename>keytab</filename> + al servidor usando el programa <command>kadmin</command>. + Esto es práctico porque también necesita crear + el principal del equipo (el final <acronym>KDC</acronym> del archivo + <filename>krb5.keytab</filename>) usando <command>kadmin</command>.</para> + + <para>Note que debe ya debe haber obtenido un boleto y que este boleto + debe tener permitido utilizar la interface <command>kadmin</command> + en <filename>kadmind.acl</filename>. Vea la sección titulada + <quote>administración remota</quote> en la página de + info de Heimdal (<command>info heimdal</command>) para los detalles + de diseño de listas de control de acceso. Si no quiere habilitar + acceso remoto <command>kadmin</command>, puede simplemente conectar + de manera segura al <acronym>KDC</acronym> (por medio de consola + local, &man.ssh.1; o &man.telnet.1; <application>Kerberos</application>) + y realizar localmente la administración utilizando + <command>kadmin -l</command>.</para> + + <para>Despues de instalar el archivo <filename>/etc/krb5.conf</filename>, + puede usar <command>kadmin</command> desde el servidor + <application>Kerberos</application>. el comando + <command>add --random-key</command> le permitirá agregar + el principal del equipo servidor, y el comando <command>ext</command> + le permitirá extraer el principal del equipo servidor a su + propio keytab. Por ejemplo:</para> + + <screen>&prompt.root; <userinput>kadmin</userinput> +kadmin><userinput> add --random-key host/myserver.example.org</userinput> +Max ticket life [unlimited]: +Max renewable life [unlimited]: +Attributes []: +kadmin><userinput> ext host/myserver.example.org</userinput> +kadmin><userinput> exit</userinput></screen> + + <para>Note que el comando <command>ext</command> (diminutivo + de <quote>extract</quote>) almacena la llave extraída + en <filename>/etc/krb5.keytab</filename> por omisión.</para> + + <para>Si no tiene <command>kadmind</command> corriendo en el + <acronym>KDC</acronym> (posiblemente por razones de seguridad) + y por lo tanto no tiene acceso a <command>kadmin</command> + remotamente, puede añadir el principal de equipo + (<username>host/myserver.EXAMPLE.ORG</username>) directamente + en el <acronym>KDC</acronym> y entonces extraerlo a un archivo + temporal (para evitar sobreescribir <filename>/etc/krb5.keytab</filename> + en el <acronym>KDC</acronym>) usando algo como esto:</para> + + <screen>&prompt.root; <userinput>kadmin</userinput> +kadmin><userinput> ext --keytab=/tmp/example.keytab host/myserver.example.org</userinput> +kadmin><userinput> exit</userinput></screen> + + <para>Puede entonces copiar de manera segura el keytab al + servidor (usando <command>scp</command> o un disco + flexible, por ejemplo). Asegúrese de especificar + un nombre de keytab diferente para evitar sobreescribir + el keytab en el <acronym>KDC</acronym>.</para> + + <para>En este punto su servidor puede comunicarse con el + <acronym>KDC</acronym> (debido a su archivo + <filename>krb5.conf</filename>) y puede probar su propia + identidad (debido al archivo <filename>krb5.keytab</filename>). + Ahora está listo para que usted habilite algunos + servicios <application>Kerberos</application>. + Para 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> + (por autentificación) de tipo usuario. Consulte + la página de manual &man.telnetd.8; para + más detalles.</para> + + </sect2> + + <sect2> + <title><application>Kerberos</application> habilitando un cliente con Heimdal</title> + + <indexterm> + <primary>Kerberos5</primary> + <secondary>configurar clientes</secondary> + </indexterm> + + <para>Configurar una computadora cliente es trivialmente fácil. + En lo que se refiera a configuración de + <application>Kerberos</application>, solamente necesita el + archivo de configuración de <application>Kerberos</application>, + localizado en <filename>/etc/krb5.conf</filename>. + Simplemente copielo de manera segura a la computadora cliente + desde el <acronym>KDC</acronym>.</para> + + <para>Pruebe su computadora cliente tratando de usar + <command>kinit</command>, <command>klist</command>, y + <command>kdestroy</command> desde el cliente para obtener, + mostrar y entonces borrar un boleto para el principal que + creó arriba. Debe ser capaz de usar aplicaciones + <application>Kerberos</application> para conectar a + servidores habilitados con <application>Kerberos</application>, + aunque si eso no funciona y obtener el boleto hace el problema, + lo más seguro 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 olfateador de paquetes ( como &man.tcpdump.1;) + para confirmar que su contraseña no sea enviada en claro. + Trate de usar <command>telnet</command> con la opción + <literal>-x</literal>, que encripta el flujo de datos por + entero (similarmente a <command>ssh</command>).</para> + + <para>Las aplicaciones clientes <application>Kerberos</application> + principales (tradicionalmente llamadas <command>kinit</command>, + <command>klist</command>, <command>kdestroy</command> y + <command>kpasswd</command>) están incluidas en + la instalación base de &os;. Note que versiones de &os; + anteriores a 5.0 las renombran a <command>k5init</command>, + <command>k5list</command>, <command>k5destroy</command>, + <command>k5passwd</command> y <command>k5stash</command> + (aunque es tipicamente utilizado solo una vez).</para> + + <para>Varias aplicaciones clientes <application>Kerberos</application> + no principales también están instaladas por + omisión. Aquí es donde la naturaleza + <quote>mínima</quote> de la instalación base de + Heimdal es sentida: <command>telnet</command> es el único + servicio <application>Kerberos</application> habilitado.</para> + + <para>El port Heimdal agrega algunas de las aplicaciones cliente + faltantes: versiones <application>Kerberos</application> habilitadas + de <command>ftp</command>, <command>rsh</command>, + <command>rcp</command>, <command>rlogin</command> y algunos + otros programas menos comunes. El port de <acronym>MIT</acronym> + también contiene una suite completa de aplicaciones + cliente de <application>Kerberos</application>.</para> + + </sect2> + + <sect2> + <title>Archivos 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>Usuarios dentro de un dominio tipicamente + tienen su principal <application>Kerberos</application> + (como <username>tillman@EXAMPLE.ORG</username>) mapeado + a una cuenta de usuario local (como una cuenta local + llamada <username>tillman</username>). aplicaciones cliente + como <command>telnet</command> usualmente no requieren un + nombre de usuario o un principal.</para> + + <para>Ocasionalmente, de todas maneras, tal vez quiera dar acceso + a una cuenta de usuario local a alguien que no tiene un + principal <application>Kerberos</application> que concuerde. + Por ejemplo, <username>tillman@EXAMPLE.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 archivos <filename>.k5login</filename> y + <filename>.k5users</filename>, colocados en el directorio + home del usuario, pueden ser usados de manera similar a + una combinación potente de + <filename>.hosts</filename> y <filename>.rhosts</filename>, + resolviendo el problema. Por ejemplo, si un + <filename>.k5login</filename> con el siguiente + contenido:</para> + + <screen>tillman@example.org +jdoe@example.org</screen> + + <para>Fuera a ser colocado en el directorio home del usuario + local <username>webdevelopers</username> entonces ambos + principales listados tendrían acceso a esa cuenta + sin requerir una contraseña compartida.</para> + + <para>La lectura de las páginas de manual para estos + comando es recomendado. Note que la página de manual + de <command>ksu</command> cubre + <filename>.k5users</filename>.</para> + + </sect2> + + <sect2> + <title><application>Kerberos</application> Tips, Trucos y solución de problemas</title> + + <indexterm> + <primary>Kerberos5</primary> + <secondary>solución de problemas</secondary> + </indexterm> + + <itemizedlist> + <listitem> + <para>Al utilizar ya sea los ports de Heimdal o <application>Kerberos</application> + del <acronym>MIT</acronym> asegúrese que su + variable de ambiente <envar>PATH</envar> liste las + versiones de <application>Kerberos</application> de las + aplicaciones clientes antes que las versiones del + sistema.</para> + </listitem> + + <listitem> + <para>¿Todas las computadoras en 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 interoperan bien. + Excepto por <command>kadmin</command>, el protocola para + el cual no está estandarizado.</para> + </listitem> + + <listitem> + <para>Si cambia su nombre de equipo, necesita cambiar también + su <username>equipo/</username> principal y actualizar su + keytab. Esto también aplica a entradas especiales + en keytab como <username>www/</username> principal + utilizado para <filename role="package">www/mod_auth_kerb</filename> + de Apache.</para> + </listitem> + + <listitem> + <para>Todos los equipos en su dominio Kerberos deben resolver + (normal y reverso) en el <acronym>DNS</acronym> (o en + <filename>/etc/hosts</filename> como mínimo). + Los CNAMEs funcionarán, pero los registros A y PTR + deben estar correctos y en su lugar. El mensaje de error + 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 pueden estar actuando + como clientes de su <acronym>KDC</acronym> no activan + los permisos para <command>ksu</command> de manera + setuid <username>root</username>. Esto significa que + <command>ksu</command> no funciona, lo cual es una + buena idea de seguridad pero un tanto molesta. Este no es un + error de <acronym>KDC</acronym>.</para> + </listitem> + + <listitem> + <para>Con <application>Kerberos</application> del + <acronym>MIT</acronym>, si usted desea permitir que un + principal tenga un boleto con una vida más larga + que el valor por omisión de diez horas, debe usar + <command>modify_principal</command> en <command>kadmin</command> + para cambiar maxlife tanto del principal en cuestión + como del principal <username>krbtgt</username>. Entonces + 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 olfateador 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, se podrá dar cuenta + que su <acronym>TGT</acronym> es enviado inmediatamente + despues de correr <command>kinit</command> — + ¡incluso antes de que escriba su contraseña! La + explicación es que el servidor <application>Kerberos</application> + transmite libremente un <acronym>TGT</acronym> (Ticket Granting + Ticket) a cualquier petición no autorizada; de todas + maneras, cada <acronym>TGT</acronym> está encriptado + en un llave derivada de la contraseña de usuario. + Por lo tanto, cuando un usuario teclea su contraseña + no está siendo enviada al <acronym>KDC</acronym>, + está siendo usada para desencriptar el <acronym>TGT</acronym> + que <command>kinit</command> ya obtuvo. Si el proceso de + desencriptación resulta en un boleto 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 también el boleto otorgar-boleto (TGT) en sí, + el cual es encriptado con la llave del propio servidor + <application>Kerberos</application>. Esta segunda capa de + encriptación es desconocida 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 boletos con tiempo de vida larga (una + semana, por ejemplo) y está utilizando <application>OpenSSH</application> + para conectarse a la máquina donde su boleto está + almacenado, asegúrese que <application>Kerberos</application> + <option>TicketCleanup</option> esté puesto a <literal>no</literal> + en su <filename>sshd_config</filename> o de lo contrario + sus boletos serán eliminados cuando termine la + sesión.</para> + </listitem> + + <listitem> + <para>Recuerde que los principales de equipos pueden tener + un tiempo de vida mas largo también. Si su principal + de usuario tiene un tiempo de vida de una semana pero + el equipo al que se esá conectando tiene un + tiempo de vida de nueve horas, tendrá un principal de + equipo expirado en su caché y el caché de + boleto no funcionará como se espera.</para> + </listitem> + + <listitem> + <para>Cuando esté configurando un archivo + <filename>krb5.dict</filename> para prenevir especificamente + el uso de malas contraseñas (la página de manual + de <command>kadmind</command> cubre esto brevemente), recuerde + que solamente aplica a principales que tienen una política + de contraseñas asignada a ellos. El formato de archivos + <filename>krb5.dict</filename> es simple: una cadena por + línea. Creando un enlace simbólico a + <filename>/usr/share/dict/words</filename> puede ser + de utilidad.</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 se relacionan al programa + <command>kadmin</command> el cual tiene un conjunto + diferente (pero equivalente) de comandos 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 ese caso).</para> + + <para>Las aplicaciones cliente pueden también tomar + diferentes opciones de línea de comando para + lograr las mismas tareas. 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>) + se recomienda. Sea cuidadoso con los parches: el port + del <acronym>MIT</acronym> se instala en + <filename>/usr/local/</filename> por omisión, y las + aplicaciones <quote>normales</quote> del sistema pueden + ser ejecutadas en lugar de las del <acronym>MIT</acronym> + si su variable de ambiente <envar>PATH</envar> lista los + directorios del sistema primero.</para> + + <note><para>Con el port del <acronym>MIT</acronym> + <filename role="package">security/krb5</filename> + proporcionado por &os;, asegúrese de leer el archivo + <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 un tanto + extraño. Más importante, corrigiendo la + conducta de <quote>permisos incorrectos en el archivo + caché</quote> requiere que el binario + <command>login.krb5</command> sea usado para autentificación + para que pueda cambiar correctamente los permisos de + propiedad para credenciales reenviadas.</para></note> + + </sect2> + + <sect2> + <title>Mitigando 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 todo-o-nada</title> + + <para>Cada servicio habilitado en la red debe ser modificado + para funcionar con <application>Kerberos</application> (o de + otra manera ser asegurado contra ataques de red) o de lo + contrario las credenciales de usuario pueden ser robadas y + reutilizadas. 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> el cual manda contraseñas + en texto plano.</para> + + </sect3> + + <sect3> + <title><application>Kerberos</application> está planeado para estaciones de trabajo mono-usuario</title> + + <para>En un ambiente multi-usuario, + <application>Kerberos</application> es menos seguro. + Esto se debe a que almacena los boletos en el + directorio <filename>/tmp</filename>, el cual puede + ser leído por todos los usuarios. Si un + usuario está compartiendo una computadora con + varias gentes simultaneamente (ej., multi-user), es posible + que los boletos de usuario sean robados (copiados) por otro + usuario.</para> + + <para>Esto puede ser sobrepasado con la opción de línea + de comando <literal>-c</literal> nombre-de-archivo o + (de preferencia) la variable de ambiente + <envar>KRB5CCNAME</envar>, pero esto raramente es + hecho. En principal, almacenar los boletos en el + directorio home de los usuarios y utilizar permisos + de archivo simples pueden mitigar este problema.</para> + + </sect3> + + <sect3> + <title>El KDC es un punto de falla único</title> + + <para>Por diseño, el <acronym>KDC</acronym> debe ser tan + seguro como la base de datos de contraseña maestra que + contiene. El <acronym>KDC</acronym> no debe tener ningún + otro servicio corriendo en él y debe ser fisicamente + seguro. El peligro es grande debido a que <application>Kerberos</application> + almacena todas las contraseñas encriptadas con la + misma llave (la llave <quote>maestra</quote>, la cual a su + vez está almacenada como un archivo en el + <acronym>KDC</acronym>).</para> + + <para>Como nota aparte, una llave maestra comprometida no es + tan malo como se podría temer. La llave maestra solo + es utilizada para encriptar la base de datos <application>Kerberos</application> + y como semilla para el generador de números aleatorios. + Mientras el acceso a su <acronym>KDC</acronym> sea seguro, + un atacante no puede hacer mucho con la llave maestra.</para> + + <para>Adicionalmente, si el <acronym>KDC</acronym> no está + disponible (quizás debido a un ataque de negación + de servicio o problemas de red) los servicios de red son inusables + ya que no se puede efectuar la autentificación, una receta + para un ataque de negación de servicios. Esto puede ser + aliviado con múltiples <acronym>KDC</acronym>s (un + maestro único y uno o más esclavos) y con + una implementación cautelosa de secundarios o + autentificación de respaldo (<acronym>PAM</acronym> es + excelente para esto).</para> + + </sect3> + + <sect3> + <title>Limitaciones de <application>Kerberos</application></title> + + <para><application>Kerberos</application> le permite a usuarios, + equipos y servicios autentificarse entre ellos. No tiene un + mecanismo para autentificar el <acronym>KDC</acronym> a los + usuarios, equipos o servicios. Esto significa que a + <command>kinit</command> con un troyano (por ejemplo) puede + grabar todos los usuarios y contraseñas. Algo como + <filename role="package">security/tripwire</filename> o + alguna otra herramienta de revisión de integridad + de sistemas de archivo puede aliviar esto.</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"> + La FAQ de <application>Kerberos</application></ulink></para> + </listitem> + + <listitem> + <para><ulink url="http://web.mit.edu/Kerberos/www/dialogue.html">Diseñando + un sistema de autentificación: un dialogo en cuatro escenas</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 <acronym>MIT</acronym> + <application>Kerberos</application></ulink></para> + </listitem> + + <listitem> + <para><ulink url="http://www.pdc.kth.se/heimdal/">Página web de Heimdal + <application>Kerberos</application></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>Una propiedad que muchos usuarios pasan por alto + es el conjunto de herramientas <application>OpenSSL</application> + incluídas en &os;. <application>OpenSSL</application> + brinda capa de transporte encriptada encima de la capa + de comunicaciones normal; permitiendo así que sea + combinada con muchas aplicaciones y servicios de red.</para> + + <para>Algunos usos de <application>OpenSSL</application> pueden + incluir autentificación encriptada de clientes de + correo, transacciones basadas en web como pagos de tarjetas + de crédito y más. Muchos ports, como + <filename role="package">www/apache13-ssl</filename> y + <filename role="package">mail/sylpheed-claws</filename> + ofrecen soporte de compilación para construirse + con <application>OpenSSL</application>.</para> + + <note> + <para>En la mayoría de los casos la colección + de ports tratará de construir el port + <filename role="package">security/openssl</filename> a menos + que la variable de make <makevar>WITH_OPENSSL_BASE</makevar> + sea puesta explicitamente a <quote>yes</quote>.</para> + </note> + + <para>La versión de <application>OpenSSL</application> + incluída en &os; soporta los protocolos de seguridad + de red Secure Sockets Layer v2/v3 (SSLv2/SSLv3) y + Transport Layer Security v1 (TLSv1) y puede ser utilizada como + una librería criptográfica general.</para> + + <note> + <para>Mientras <application>OpenSSL</application> soporta el + algoritmo <acronym>IDEA</acronym>, estáa deshabilitado + por omisión debido a patentes de Estados Unidos. Para + utilizarlo, la licencia debe ser revisada, y si las + restricciones son aceptables, la variable + <makevar>MAKE_IDEA</makevar> debe ser activada en + <filename>make.conf</filename>.</para> + </note> + + <para>Uno de los usos más comunes de + <application>OpenSSL</application> es brindar certificados para + usar con aplicaciones de software. Estos certificados aseguran + que las credenciales de la compañia o individuo son + válidos y no fraudulentos. Si el certificado en + cuestión no ha sido verificado por uno de las varias + <quote>autoridades de certificados</quote>, + o <acronym>CA</acronym>s, usualmente se produce una advertencia. + Una autoridad de certificados es una compañia, como + <ulink url="http://www.verisign.com">VeriSign</ulink>, la cual + firmará certificados para validar credenciales de individuos + o compañias. Este proceso tiene un costo asociado y no es + definitivamente un requisito para usar certificados; de todas + maneras, puede darle un poco de tranquilidad a los usuarios + más paranóicos.</para> + + <sect2> + <title>Generando certificados</title> + + <indexterm> + <primary>OpenSSL</primary> + <secondary>generación de certificados</secondary> + </indexterm> + + <para>Para generar un certificado, el siguiente comando está + disponible:</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>My Company</replaceable></userinput> +Organizational Unit Name (eg, section) []:<userinput><replaceable>Systems Administrator</replaceable></userinput> +Common Name (eg, YOUR name) []:<userinput><replaceable>localhost.example.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>SOME PASSWORD</replaceable></userinput> +An optional company name []:<userinput><replaceable>Another Name</replaceable></userinput></screen> + + <para>Note que la respuesta directamente despues del + prompt <quote>Common Name</quote> muestra un nombre + de dominio. Este prompt requiere que se introduzca + un nombre de servidor para propósitos de + verificación; colocando cualquier cosa menos + un nombre de dominio producirá un certificado + inválido. Otras opciones, por ejemplo tiempo + de expiración, alternan algoritmos de encriptación, + etc, están disponibles. Una lista completa + puede obtenerse viendo la página de manual + &man.openssl.1;.</para> + + <para>Deben existir ahora dos archivos + en el directorio en el que el comando anterior fué + ejecutado. La petición de certificado, <filename>req.pem</filename>, + puede ser enviado a una autoridad de certificados que validará + las credenciales que introdujo, firmará la petición y le + regresará el certificado. El segundo archivo creado será + nombrado <filename>cert.pem</filename> y es la llave privada para + el certificado y debe ser protegida a toda costa; si esta cae en las + manos de otros puede ser utilizada para impersonarlo a usted (o a + sus servidores).</para> + + <para>En los casos donde una firma de una <acronym>CA</acronym> + no es requerida, un certificado auto firmado puede ser creado. + 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>Los dos nuevos archivos deben aparecer en el directorio: + un archivo de firma de autoridad de certificados, + <filename>myca.key</filename> y el certificado en sí, + <filename>new.crt</filename>. Estos deben ser colocados en un + directorio, de preferencia bajo + <filename class="directory">/etc</filename>, el cual es + leíble solo por <username>root</username>. Permisos de + 0700 deben ser suficientes para este y pueden ser puestos con + la utilidad <command>chmod</command>.</para> + </sect2> + + <sect2> + <title>Usando certificados, un ejemplo</title> + + <para>¿Entonces que pueden hacer estos archivos? Un buen uso + sería encriptar conexiones al <acronym>MTA</acronym> + <application>Sendmail</application>. Esto disolvería + el uso de autentificación de texto claro para usuarios + que mandan correo a través del <acronym>MTA</acronym> + local.</para> + + <note> + <para>Este no es el mejor uso en el mundo ya que algunos + <acronym>MUA</acronym>s presentarán al usuario + un error si no tienen instalado los certificados + localmente. Refiérase a la documentación + incluída con el software para mayor información + de la instalación de certificados.</para> + </note> + + <para>Las siguientes líneas deben ser colocadas + dentro del archivo 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>Donde <filename class="directory">/etc/certs/</filename> + es el directorio a ser utilizado para almacenamiento de + los archivos de certificado y llave de manera local. + Los últimos requerimientos son una reconstrucción + del archivo <filename>.cf</filename> local. Esto es facilmente + logrado tecleando <command>make</command> + <parameter>install</parameter> dentro del directorio + <filename class="directory">/etc/mail</filename>. + A continuación ejecute un <command>make</command> + <parameter>restart</parameter> que debe reiniciar el + daemon de <application>Sendmail</application>.</para> + + <para>Si todo estuvo bien no habrá mensajes de error + en el archivo <filename>/var/log/maillog</filename> + y <application>Sendmail</application> aparecerá en + la lista de procesos.</para> + + <para>Para una prueba sencilla, simplemente conecte al + servidor de correo usando la utilidad &man.telnet.1;:</para> + + <screen>&prompt.root; <userinput>telnet <replaceable>example.com</replaceable> 25</userinput> +Trying 192.0.34.166... +Connected to <hostid role="fqdn">example.com</hostid>. +Escape character is '^]'. +220 <hostid role="fqdn">example.com</hostid> ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT) +<userinput>ehlo <replaceable>example.com</replaceable></userinput> +250-example.com Hello example.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">example.com</hostid> closing connection +Connection closed by foreign host.</screen> + + <para>Si la línea <quote>STARTTLS</quote> aparece en la + salida entonces 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> + + <indexterm> + <primary>IPsec</primary> + </indexterm> + + <title>VPN sobre IPsec</title> + <para>Creando una VPN entre dos redes, separadas por la Internet + utilizando gateways FreeBSD.</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>Entendiendo IPsec</title> + + <para>Esta sección le guiará a través del + proceso de configuración de IPsec, y de su uso en un + ambiente que consista en máquinas FreeBSD y + <application>µsoft.windows; 2000/XP</application>, para + hacer que se comuniquen de manera segura. Para configurar + IPsec, es necesario que esté familiarizado con los + conceptos de construcción de un kernel personalizado + (vea <xref linkend="kernelconfig">).</para> + + <para><emphasis>IPsec</emphasis> es un protocolo que se sienta + encima de la capa del protocolo de Internet (IP). Le permite + a dos o mas equipos comunicarse de manera segura (de ahí + el nombre). La <quote>pila de red</quote> IPsec de FreeBSD está + basada en la implementación + <ulink url="http://www.kame.net/">KAME</ulink>, la cual tiene + 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 desempeño de IPsec. Este subsistema es + nuevo, y no soporta todas las opciones que están + disponibles en la versión KAME de IPsec. De todas + maneras, para habilitar IPsec acelerado por hardware, se + tienen que agregar las siguientes opciones de kernel al + archivo de configuración de 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>Note que actualmente no es posible utilizar el subsistema + <quote>Fast IPsec</quote> junto con la implementación + KAME de IPsec. Consulte la página de manual + &man.fast.ipsec.4; para mayor información.</para> + + </note> + + <indexterm> + <primary>IPsec</primary> + <secondary>ESP</secondary> + </indexterm> + + <indexterm> + <primary>IPsec</primary> + <secondary>AH</secondary> + </indexterm> + + <para>IPsec consiste de dos sub-protocolos:</para> + + <itemizedlist> + <listitem> + <para><emphasis>Encapsulated Security Payload + (ESP)</emphasis>, protege los datos del paquete IP + de interferencias de terceros, encriptando el contenido + utilizando algoritmos de criptografía simétrica + (como Blowfish, 3DES).</para> + </listitem> + <listitem> + <para><emphasis>Authentication Header (AH)</emphasis>, + protege la cabecera del paquete IP de interferencias de + terceros e imitación (spoofing), computando un + checksum criptográfico y aplicando a los campos + de cabecera IP una función hash segura. Esto es + entonces seguido por una cabecera adicional que contiene + el hash, para permitirle a la información en el + paquete ser autentificada.</para> + </listitem> + </itemizedlist> + + <para><acronym>ESP</acronym> y <acronym>AH</acronym> pueden + ser utilizados de manera conjunta o separada, dependiendo + del ambiente.</para> + + <indexterm> + <primary>VPN</primary> + </indexterm> + + <indexterm> + <primary>Red privada virtual</primary> + <see>VPN</see> + </indexterm> + + <para>IPsec puede ser utilizado ya sea para encriptar 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, + las cuales pueden ser usadas para comunicación segura + entre dos redes corporativas (conocido como <emphasis>modo + de tunel</emphasis>). Este último es comunmente + conocido como una <emphasis>red privada virtual (Virtual + Private Network, VPN)</emphasis>. La página de manual + &man.ipsec.4; debe ser consultada para información + detallada sobre el subsistema IPsec en FreeBSD.</para> + + <para>Para agregar soporte de IPsec a su kernel, agregue las + siguientes opciones a su archivo de configuración + de 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 se desea soporte para la depuración de + errores, la siguiente opción también debe + ser agregada:</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. + VPNs pueden ser implementadas utilizando un número de + tecnologías diferentes, cada una de las cuales tiene sus + propias fortalezas y debilidades. 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, para + comportarse como una sola</title> + + <indexterm> + <primary>VPN</primary> + <secondary>creando</secondary> + </indexterm> + + <para>La premisa es como sigue:</para> + + <itemizedlist> + <listitem> + <para>Usted tiene al menos dos sitios</para> + </listitem> + <listitem> + <para>Ambos sitios están utilizando IP internamente</para> + </listitem> + <listitem> + <para>Ambos sitios están conectados al Internet, a + través de un gateway que esta corriendo FreeBSD.</para> + </listitem> + <listitem> + <para>El gateway en 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 gateway de ser + necesario.</para> + </listitem> + <listitem> + <para>Las direcciones IP internas de las dos redes + <emphasis>no colisionan</emphasis>. Aunque espero + que sea posible teoricamente utilizar una combinación + de tecnología VPN y NAT para hacer funcionar + esto, espero que sea una pesadilla de + configuración.</para> + </listitem> + </itemizedlist> + + <para>Si encuentra que está tratando de conectar dos redes, + donde ambas utilizan el mism rango de direcciones IP privadas + (ej., las dos usan <hostid + role="ipaddr">192.168.1.x</hostid>), entonces una de las dos redes + debe ser renumerada.</para> + + <para>La topología de red puede verse de manera similar + 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>Note las dos direcciones IP públicas. Usaré las + letras para referirme a ellas en el resto de este artículo. + El cualquier lugar que vea esas letras en este artículo, + reemplacelas con su propia dirección IP pública. + Note también que internamente, las dos máquinas + gateway 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 en las redes privadas han sido configuradas para + utilizar la máquina <hostid role="ipaddr">.1</hostid> + como su gateway por omisión.</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 ruteador -- + aunque sea un ruteador 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 una respuesta, transparentemente. Las máquinas + &windows; deben ser capaces de ver a las máquinas en la + otra red, accesar a archivos compartidos, y demás, + exactamente de la misma manera en que accesan a las + máquinas en la red local.</para> + + <para>Y todo la cosa debe ser segura. Esto significa que el + tráfico entre las dos redes tiene que ser + encriptado.</para> + + <para>Crear una VPN entre estas dos redes es un proceso multi-paso. + Las etapas son las siguientes:</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 que funcione.</para> + </listitem> + + <listitem> + <para>Aplicar políticas de seguridad para asegurarse + que el tráfico entre las dos redes sea transparentemente + encriptado y desencriptado según sea necesario. + Probar esto, usando herramientas como &man.tcpdump.1;, + para asegurarse que el tráfico esté encriptado.</para> + </listitem> + + <listitem> + <para>Configurar software adicional en los gateways FreeBSD, + para permitir a las máquinas &windows; verse entre + ellas a través de la VPN.</para> + </listitem> + </orderedlist> + + <sect3> + <title>Paso 1: Creando y probando un enlace de red <quote>virtual</quote></title> + + <para>Suponga que usted está en la máquina gateway + en la 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>. ¿Que necesita suceder + para que esto funcione?</para> + + <orderedlist> + <listitem> + <para>La máquina gateway necesita saber como alcanzar + a <hostid role="ipaddr">192.168.2.1</hostid>. En otras + palabras, necesita tener una ruta a <hostid + role="ipaddr">192.168.2.1</hostid>.</para> + </listitem> + <listitem> + <para>Las direcciones IP privadas, como aquellas en el rango + <hostid role="ipaddr">192.168.x</hostid> no se supone + que aparezcan en Internet sueltas. En lugar de eso, cada + paquete que mande a <hostid role="ipaddr">192.168.2.1</hostid> + necesitará ser encerrado dentro de otro paquete. + Este paquete necesitará aparecer como si fuera + 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 es llamado + <firstterm>encapsulación</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 pensar en ello como si se necesitara un <quote>tunel</quote> + entre las dos redes. Las dos <quote>bocas del tunel</quote> son + las direcciones IP <hostid role="ipaddr">A.B.C.D</hostid> y + <hostid role="ipaddr">W.X.Y.Z</hostid>, y se debe decir al tunel + las direcciones de las direcciones IP privadas que serán + permitidas que pasen a través de él. El tunel es + usado para transferir tráfico con direcciones IP + privadas a través del Internet público.</para> + + <para>Este tunel es creado utilizando la interfaz genérica, + o dispositivo <devicename>gif</devicename> en FreeBSD. Como + puede imaginarse, la interfaz <devicename>gif</devicename> + en cada equipo gateway debe ser configurada 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 ser compilado + en el kernel de &os; para ambas máquinas. Puede + hacer esto agregando la línea:</para> + + <programlisting>device gif</programlisting> + + <para>a los archivos de configuración del kernel en + ambas máquinas, y entonces compilarlo, instalarlo + y reiniciar normalmente.</para> + + <para>La configuración del tunel es un proceso de dos + partes. Primero se le debe decir al tunel cuales son las + direcciones IP exteriores (o públicas), utilizando + &man.gifconfig.8;. Luego, las direcciones IP deben ser + configuradas usando &man.ifconfig.8;.</para> + + <note> + <para>En &os; 5.X, la funcionalidad brindada por la + utilidad &man.gifconfig.8; ha sido fusionada a + &man.ifconfig.8;.</para></note> + + <para>En la máquina gateway de la red #1 debe ejecutar + los siguientes dos comandos para configurar el tunel.</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 máquina gateway ejecute los mismos + comandos, pero con el orden las direcciones IP + invertidas.</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>Entonces puede ejecutar:</para> + + <programlisting>gifconfig gif0</programlisting> + + <para>para ver la configuración. Por ejemplo, en el + gateway de la red #1, usted vería algo como esto:</para> + + <screen>&prompt.root; <userinput>gifconfig gif0</userinput> +gif0: flags=8011<UP,POINTTOPOINT,MULTICAST> mtu 1280 +inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff +physical address inet A.B.C.D --> W.X.Y.Z + </screen> + + <para>Como puede ver, se ha creado un tunel 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 + permitido a través del tunel 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 ruteo en ambas máquinas, la cual puede + examinar con el comando <command>netstat -rn</command>. + Esta salida es de la máquina gateway en 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 gateway + conoce como alcalzar al otro gateway, pero no saben como + alcanzar el resto de sus respectivas redes. Ese problema + será solucionado proximamente.</para> + + <para>Es posible que usted esté ejecutando un + firewall en ambas máquinas. Esto necesitará + ser transpasado por el tráfico VPN. Tal vez desée + permitir todo el tráfico entre ambas redes, o tal + vez quiera incluir reglas en el firewall que protejan ambos + extremos de la VPN del otro.</para> + + <para>Las pruebas se simplifican enormemente si configura + el firewall para permitir todo el tráfico a + través de la VPN. Siempre puede apretar las cosas + despues. Si está utilizando &man.ipfw.8; en las + máquinas gateway entonces un comando como</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 sus otras reglas del + firewall. Obviamente necesitará ejecutar este comando + en ambos equipos gateway.</para> + + <para>Esto es suficiente para permitir a cada máquina + gateway hacer un ping entre ellas. En <hostid role="ipaddr">192.168.1.1</hostid>, + usted debe ser capaz de ejecutar</para> + + <programlisting>ping 192.168.2.1</programlisting> + + <para>y obtener una respuesta, y debe ser capaz de hacer lo + mismo en la otra máquina gateway.</para> + + <para>De todas maneras, no será capaz de alcanzar + máquinas internas en cada red todavía. Esto + se debe al ruteo -- aunque las máquinas gateway + saben como alcanzarse entre ellas, no saben como alcanzar + la red detrás de cada una.</para> + + <para>Para resolver este problema debe añadir una ruta + estática en cada máquina gateway. El comando + para hacer esto en el primer gateway 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 un comando similar en el otro + gateway, pero 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>Eso ha creado ahora dos tercios de una VPN entre las dos + redes, de la misma manera que es <quote>virtual</quote> y + es una <quote>network</quote>. Todavía no es privada. + Puede probar esto utilizando &man.ping.8; y &man.tcpdump.1;. + Abra una sesión en el equipo gateway 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á una salida que se parece algo a esta:</para> + + <programlisting> +16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request +16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply +16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request +16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply +16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request +16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply + </programlisting> + + <para>Como puede ver, los mensajes ICMP van y vienen sin + encriptar. Si hubiera usado el parámetro <option>-s</option> + en &man.tcpdump.1; para tomar más bytes de datos de + estos paquetes, vería más información.</para> + + <para>Obviamente esto es inaceptable. La siguiente sección + discutirá el aseguramiento del enlace entre las dos + redes para que todo el tráfico sea encriptado + automaticamente.</para> + + <itemizedlist> + <title>Sumario:</title> + <listitem> + <para>Configure ambos kernels con <quote>pseudo-device + gif</quote>.</para> + </listitem> + <listitem> + <para>Edite <filename>/etc/rc.conf</filename> en el equipo + gateway #1 y agregue las siguientes líneas + (reemplazando 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 su script de firewall + (<filename>/etc/rc.firewall</filename>, o similar) en ambos + equipos, y agregue</para> + + <programlisting>ipfw add 1 allow ip from any to any via gif0</programlisting> + </listitem> + <listitem> + <para>Realice cambios similares a + <filename>/etc/rc.conf</filename> en el equipo gateway + #2, invirtiendo el orden de las direcciones IP.</para> + </listitem> + </itemizedlist> + </sect3> + + <sect3> + <title>Paso 2: Asegurando el enlace</title> + + <para>Para asegurar el enlace usaremos IPsec. IPsec brinda un + mecanismo para que dos equipos coincidan en una llave de + encriptación, y entonces usar esta llave para + encriptar los datos entre los dos equipos.</para> + + <para>Existen dos áreas de configuración a considerar + aquí.</para> + + <orderedlist> + <listitem> + <para>Debe existir un mecanismo para que los dos equipos + se pongan de acuerdo en el mecanismo de encriptación + a utilizar. Una vez que los dos equipos se han puesto de + acuerdo en este mecanismo se 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 encriptado. Obviamente, usted no desea encriptar + todo su tráfico saliente -- usted solo desea + encriptar el tráfico que es parte de la VPN. Las + reglas que usted pone para determinar que tráfico + será encriptado son llamadas <quote>políticas + de seguridad</quote>.</para> + </listitem> + </orderedlist> + + <para>Las asociaciones de seguridad y las políticas + son mantenidas por el kernel, y pueden ser modificadas + por programas de usuario. De todas maneras, antes de que usted + pueda hacer esto debe configurar el kernel para soportar IPsec y + el protocolo ESP (Encapsulated Security Payload). Esto es + realizado configurando el kernel con:</para> + <indexterm> - <primary>Firewalls</primary> + <primary>opciones de kernel</primary> + <secondary>IPSEC</secondary> </indexterm> - <para> </para> - </sect2> - <sect2 id="ipsec"> - <title>IPsec</title> + <programlisting>options IPSEC +options IPSEC_ESP + </programlisting> + + <para>y recompilando, resintalando y reiniciando. Como se dijo + anteriormente, necesitará hacer esto al kernel de los + dos equipos gateway.</para> + <indexterm> - <primary>IPsec</primary> + <primary>IKE</primary> </indexterm> - <para> </para> + + <para>Tiene dos opciones cuando se trata de configurar + asociaciones de seguridad. Puede configurarlas a mano entre + los dos equipos, lo que significa elegir el algoritmo de + encriptación, llaves de encriptación, y demás, + o puede utilizar daemons que implementan el protocolo + de intercambio de llaves de Internet (IKE, Internet Key Exchange) + para que lo hagan por usted.</para> + + <para>Yo recomiendo lo último. Aparte de cualquier otra + cosa, 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>Editar y desplegar políticas de seguridad es llevado + a cabo usando &man.setkey.8;. Como 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 + ruteo del kernel. <command>setkey</command> también puede + desplegar las asociaciones de seguridad actuales, y para + continuar con la analogía, similarmente a + <command>netstat -r</command> es ese aspecto.</para> + + <para>Existen un número de opciones de daemons para + administrar las asociaciones de seguridad en FreeBSD. Este + artículo describirá como usar una de ellas, + racoon — el cual está disponible como + <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 ser ejecutado en los dos equipos gateway. En cada equipo es + configurado con la dirección IP del otro extremo de la + VPN, y una llave secreta (la cual usted elije, y debe ser la misma + en ambos gateways).</para> + + <para>Los dos daemons entonces se contactan entre ellos, confirman + que son quienes dicen ser (utilizando la llave secreta que usted + configuró). Los daemons entonces generan una nueva llave + secreta, y la utilizan para encriptar el tráfico a + través de la VPN. Periodicamente intercambian este + secreto, para que incluso si un atacante fuera a comprometer una + de las llaves (lo cual es teoricamente cercano a imposible) no + le haría mucho bien -- para cuando haya crackeado la + llave los daemons ya habrán escogido una nueva.</para> + + <para>El archivo de configuración para racoon + está almacenado en <filename>${PREFIX}/etc/racoon</filename>. + Debe encontrar un archivo de configuración ahí + el cual no debe necesitar ser cambiado mucho. El otro + componente de la configuración de racoon, la cual + necesitará cambiar, es la <quote>llave + precompartida</quote>.</para> + + <para>La configuración por omisión de racoon + espera encontrar esto en el archivo <filename>${PREFIX}/etc/racoon/psk.txt</filename>. + Es importante notar que la llave precompartida <emphasis>no</emphasis> + es la llave que será utilizada para encriptar su + tráfico a través del enlace VPN, solamente es un + símbolo que permite le a los daemons 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 + este ejemplo, donde existen dos sitios, cada archivo + <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 el equipo gateway #1 esta línea debería + parecerse a esta:</para> + + <programlisting>W.X.Y.Z secret</programlisting> + + <para>Esto es, la dirección IP <emphasis>pública</emphasis> + 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 -- las reglas normales para escoger una contraseña + aplican.</para> + + <para>En el equipo gateway #2 la línea se parecería + a esta</para> + + <programlisting>A.B.C.D secret</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> (ej., solo modo + lectura/escritura para <username>root</username>) antes de + que racoon corra.</para> + + <para>Debe ejecutar racoon en ambas máquinas gateway. + También necesitará agregar algunas reglas de + firewall para permitir el tráfico IKE, el cual es + transportado sobre UDP al puerto ISAKMP (Internet Security + Association Key Management Protocol). De nuevo, esto debe estar + al principio de la lista de reglas del firewall.</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 racoon este corriendo puede tratar de dar un + ping a un equipo gateway desde el otro. La conexión + todavía no está encriptada, pero entonces racoon + creará las asociaciones de seguridad entre los dos + equipos -- esto puede tomar un momento, y puede que lo vea + como un corto retraso antes de que los comandos ping + empiecen a responder.</para> + + <para>Una vez que se han creado las asociaciones de seguridad + puede verlas utilizando &man.setkey.8;. Ejecute</para> + + <programlisting>setkey -D</programlisting> + + <para>en cualquiera de los equipos para ver la información de + la asociación de seguridad.</para> + + <para>Eso es la mitad del problema. La otra mitad es configurar + sus políticas de seguridad.</para> + + <para>Para crear una política de seguridad sensible, vamos + a revisar lo que se ha configurado hasta el momento. Esta + discusión cuenta para 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 del destino y de la fuente. Como ya sabemos, + las direcciones IP privadas, como el rango + <hostid role="ipaddr">192.168.x.y</hostid> no se supone que + aparezcan en el Internet público. En vez de eso, primero + deben ser encapsulados dentro de otro paquete. Este paquete + debe tener la dirección IP pública de destino y fuente + sustituidas por las direcciones privadas.</para> + + <para>Así que si su paquete saliente empezó luciendo como este:</para> + + <mediaobject> + <imageobject> + <imagedata fileref="security/ipsec-out-pkt" align="center"> + </imageobject> + + <textobject> + <literallayout class="monospaced"> + .----------------------. + | Src: 192.168.1.1 | + | Dst: 192.168.2.1 | + | <other header info> | + +----------------------+ + | <packet data> | + `----------------------'</literallayout> + </textobject> + </mediaobject> + + <para>Entonces será encapsulado dentro de otro paquete, + luciendo como este:</para> + + <mediaobject> + <imageobject> + <imagedata fileref="security/ipsec-encap-pkt" align="center"> + </imageobject> + + <textobject> + <literallayout class="monospaced"> + .--------------------------. + | Src: A.B.C.D | + | Dst: W.X.Y.Z | + | <other header info> | + +--------------------------+ + | .----------------------. | + | | Src: 192.168.1.1 | | + | | Dst: 192.168.2.1 | | + | | <other header info> | | + | +----------------------+ | + | | <packet data> | | + | `----------------------' | + `--------------------------'</literallayout> + </textobject> + </mediaobject> + + <para>Esta encapsulación es llevada a cabo + por el dispositivo <devicename>gif</devicename>. Como puede + ver, el paquete ahora tiene una dirección IP real en + el exterior, y nuestro paquete original ha sido envuelto + como dato dentro del paquete que será puesto en + Internet.</para> + + <para>Obviamente, queremos que todo el tráfico entre + las VPNs esté encriptado. Tal vez pueda tratar + de poner esto en palabras, como:</para> + + <para><quote>Si un paquete sale desde <hostid + role="ipaddr">A.B.C.D</hostid>, y está destinado para + <hostid role="ipaddr">W.X.Y.Z</hostid>, entonces encríptalo, + 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á destinado para + <hostid role="ipaddr">A.B.C.D</hostid>, entonces desencríptalo, + utilizando las asociaciones de seguridad necesarias.</quote></para> + + <para>Eso es un aproximado, pero no del todo correcto. Si hace esto, + todo el tráfico desde y hacia <hostid role="ipaddr">W.X.Y.Z</hostid>, + incluso tráfico que no es parte de la VPN, será + encriptado. Eso no es exactamente lo que quiere. La política + correcta es como sigue</para> + + <para><quote>Si un paquete sale desde <hostid + role="ipaddr">A.B.C.D</hostid>, y ese paquete está + encapsulando a otro paquete, y esta destinado para + <hostid role="ipaddr">W.X.Y.Z</hostid>, entonces encríptalo, + utilizando las asociaciones de seguridad necesarias.</quote></para> + + <para><quote>Si un paquete llega desde <hostid + role="ipaddr">W.X.Y.Z</hostid>, y ese paquete está + encapsulando a otro paquete, y esta destinado para + <hostid role="ipaddr">A.B.C.D</hostid>, entonces desencríptalo, + utilizando las asociaciones de seguridad necesarias.</quote></para> + + <para>Un cambio sutil, pero necesario.</para> + + <para>Las políticas de seguridad también son + puestas utilizando &man.setkey.8;. &man.setkey.8; proporciona + un lenguaje de configuración para definir la + política. Puede ya sea introducir las instrucciones de + configuración vía stdin, o puede usar la opción + <option>-f</option> para especificar un nombre de archivo que + contenga las instrucciones de configuración.</para> + + <para>La configuración en el equipo gateway #1 (el cual + 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> + sea encriptado 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 estos comando en un archivo (ej., + <filename>/etc/ipsec.conf</filename>) y entonces 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 agregar una regla a la base de datos de políticas + segura. El resto de esta línea especifica que 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 esta política se aplicará. En este caso, queremos + aplicarla al tráfico entre estos dos equipos. + <option>-P out</option> dice que esta política aplica + a paquetes salientes, e <option>ipsec</option> dice que el + paquete será asegurado.</para> + + <para>La segunda línea especifica como este paquete + será encriptado. <option>esp</option> es el + protocolo que será utilizado, mientras que + <option>tunnel</option> indica que el paquete será + despues 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> es utilizado para + seleccionar la asociación de seguridad a usar, y + por último <option>require</option> exige que los + paquetes deben ser encriptados 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>Note el <option>in</option> en lugar del <option>out</option> + en este caso, y la inversión necesaria de las direcciones + IP.</para> + + <para>El otro equipo gateway (el cual 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 de firewall + para permitir la circulación de paquetes ESP e IPENCAP + de ida y vuelta. Estas reglas necesitarán ser agregadas + 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 cada equipo gateway.</para> + + <para>Los paquetes salientes se verán ahora como esto:</para> + + <mediaobject> + <imageobject> + <imagedata fileref="security/ipsec-crypt-pkt" align="center"> + </imageobject> + + <textobject> + <literallayout class="monospaced"> + .------------------------------. --------------------------. + | Src: A.B.C.D | | + | Dst: W.X.Y.Z | | + | <other header info> | | Encrypted + +------------------------------+ | packet. + | .--------------------------. | -------------. | contents + | | Src: A.B.C.D | | | | are + | | Dst: W.X.Y.Z | | | | completely + | | <other header info> | | | |- secure + | +--------------------------+ | | Encap'd | from third + | | .----------------------. | | -. | packet | party + | | | Src: 192.168.1.1 | | | | Original |- with real | snooping + | | | Dst: 192.168.2.1 | | | | packet, | IP addr | + | | | <other header info> | | | |- private | | + | | +----------------------+ | | | IP addr | | + | | | <packet data> | | | | | | + | | `----------------------' | | -' | | + | `--------------------------' | -------------' | + `------------------------------' --------------------------' + </literallayout> + </textobject> + </mediaobject> + + <para>cuando son recibidos por el extremo más lejano de la + VPN primero serán desencriptados (utilizando las + asociaciones de seguridad que han sido negociadas por racoon). + Entonces entrarán a la interfaz <devicename>gif</devicename>, + la cual desenvuelve la segunda capa, hasta que le deja con el + paquete más interno, el cual 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 máquina gateway <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>Esta vez debe ver una salida similar a la 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 a la encriptación.</para> + + <para>Felicitaciones. Acaba de configurar una VPN entre dos sitios + remotos.</para> + + <itemizedlist> + <title>Sumario</title> + <listitem> + <para>Configure ambos kernels 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 ambos + equipos gateway, agregando una entrada para la dirección + IP del equipo remoto y una llave secreta que ambos conozcan. + Asegúrese que este archivo tenga modo 0600.</para> + </listitem> + <listitem> + <para>Añada las siguientes líneas a + <filename>/etc/rc.conf</filename> en cada equipo:</para> + + <programlisting>ipsec_enable="YES" +ipsec_file="/etc/ipsec.conf" + </programlisting> + </listitem> + <listitem> + <para>Crée un <filename>/etc/ipsec.conf</filename> en + cada equipo que contenga las líneas spdadd necesarias. + En el equipo gateway #1 esto 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 el equipo gateway #2 esto 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>Agregue reglas de firewall para permitir el + 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 ser suficiente para levantar la + VPN. Las máquinas en cada red seán capaces de + referirse una a otra utilizando direcciones IP, y todo el tráfico + a través del enlace será automatica y seguramente + encriptado.</para> + </sect3> + </sect2> + </sect1> + + <sect1 id="openssh"> + <sect1info> + <authorgroup> + <author> + <firstname>Chern</firstname> + <surname>Lee</surname> + <contrib>Contribuido 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 + utilizadas para accesar máquinas remotas de manera segura. Puede ser usado + como un reemplzado directo para <command>rlogin</command>, + <command>rsh</command>, <command>rcp</command> y + <command>telnet</command>. Adicionalmente, cualquier otra conexión + TCP/IP puede ser tuneleada/reenviada de manera segura a través + de SSH. <application>OpenSSH</application> encripta todo el tráfico para + eliminar efectivamente el espionaje, secuestro de conexiones, y otros ataques + a nivel de red.</para> + + <para><application>OpenSSH</application> es mantenido por el proyecto OpenBSD, y está + basado sobre SSH v1.2.12 con todos errores recientes corregidos y actualizaciones. + Es compatible con los protocolos SSH 1 y 2. <application>OpenSSH</application> ha + estado en el sistema base desde FreeBSD 4.0.</para> + + <sect2> + <title>Ventajas de utilizar OpenSSH</title> + + <para>Normalmente, al utilizar &man.telnet.1; o &man.rlogin.1;, + los datos son enviados a través de la red de una + forma clara, no encriptada. Cualquier olfateador de red + entre el cliente y el servidor puede robar la información + de usuario/contraseña o los datos transferidos en + su sesión. <application>OpenSSH</application> ofrece una + variedad de métodos de autentificación y + encriptación para prevenir que esto suceda.</para> </sect2> - <sect2 id="seuring-root-and-staff"> - <title>Asegurando la cuenta <username>root</username> y las cuentas de - staff</title> + <sect2> + <title>Habilitando sshd</title> <indexterm> - <primary><command>su</command></primary> + <primary>OpenSSH</primary> + <secondary>habilitando</secondary> </indexterm> - <para>Antés que nada, no se preocupe en asegurar las cuentas - del staff si aun no ha asegurado la cuenta <username>root</username>. - La mayor parte de los sistemas tienen asignada una clave de acceso - a la cuenta <username>root</username>. Lo primero que usted debe - asumir es que la contraseña <emphasis>siempre</emphasis> - está comprometida. Esto no significa que tenga que - eliminar la contraseña. La contraseña es casi siempre - necesaria para el acceso a la cónsola de la computadora. Esto - significa que usted no debe permitir utilizar la contraseña - fuera de la cónsola o usarla posiblemente con el comando - &man.su.1;. Por ejemplo, cerciorese de que sus ptys sean - correctamente especificados como inseguros en el archivo - <filename>/etc/ttys</filename> para rechazar conexiones directas a - <username>root</username> vía <command>telnet</command> o - <command>rlogin</command>. Si se usan otros servicios tales como - <application>sshd</application>, asegurese de que las conexiones - directas a <username>root</username> estén deshabilitadas. Es - posible hacer esto editando el fichero - <filename>/etc/ssh/sshd_config</filename>, asegurando que - <literal>PermitRootLogin</literal> esté fijado como - <literal>NO</literal>. Considere cada método de acceso - - Servicios como FTP puedes tener problemas de seguridad. Las - conexiones directas a <username>root</username> deben ser sólo - permitidas físicamente en la cónsola de sistema.</para> + <para>El daemon <application>sshd</application> está + habilitado por omisión en &os; 4.X y puede + ser habilitado o no durante la instalación por el + usuario en &os; 5.X. Para ver si está habilitado, + revise el archivo <filename>rc.conf</filename> por:</para> + + <screen>sshd_enable="YES"</screen> + + <para>Esto cargará &man.sshd.8;, el programa daemon de <application>OpenSSH</application>, + la próxima vez que su sistema inicie. Alternativamente, + puede simplemente correr directamente el daemon <application>sshd</application> + tecleando <command>sshd</command> en la línea de comando.</para> + </sect2> + + <sect2> + <title>Cliente SSH</title> <indexterm> - <primary><groupname>wheel</groupname></primary> + <primary>OpenSSH</primary> + <secondary>cliente</secondary> </indexterm> - <para>Por supuesto, como administrador de sistema usted debe poder - acceder como <username>root</username>, y nosotros tenemos algunas - formas de conseguirlo. Nos aseguraremos de que éstas formas - tengan autenticación adicional. Una de las formas de hacer - <username>root</username> accesible es agregar cuentas apropiadas del - staff al grupo <groupname>wheel</groupname> (en - <filename>/etc/group</filename>). Se permite a los miembros del - staff puestos en el grupo <groupname>wheel</groupname> usar el - comando <command>su</command> para acceder <username>root</username>. - Nunca debe dar a miembros del staff acceso nativo a - <groupname>wheel</groupname> cuando se crea la cuenta. Las cuentas - del staff deben estar colocadas en grupos de - <groupname>staff</groupname>, para después agregar a aquellos - deseados al grupo <groupname>wheel</groupname> en el fichero - <filename>/etc/group</filename>. Solamente a aquellos que realmente - se necesiten en este grupo deben ser agregados. Es también - posible usar un método de autentificación tal como - Kerberos, utilizar el fichero <filename>.k5login</filename> en la - cuenta <username>root</username> para permitir a &man.ksu.1; que - <username>root</username> no necesite a nadie en el grupo - <groupname>wheel</groupname>. Esta puede ser una mejor - solución puesto que el mecanismo de - <groupname>wheel</groupname> todavía permite al intruso romper - <username>root</username>, si el intruso ha conseguido quebrar el - archivo de contraseñas y el grupo del staff. Mientrás - que usar el mecanismo de <groupname>wheel</groupname> es mejor que no - tener nada en lo absoluto, no es necesariamente la opción mas - segura.</para> - - <para>Una manera indirecta de asegurar las cuentas del staff y usar el - acceso a <username>root</username> de ultima instancia es usar un - método de acceso alternativo conocido como - <quote>starring</quote>. Este método marca las - contraseñas cifradas con un solo - <quote><literal>*</literal></quote>. Este comando actualizará - fichero de <filename>/etc/master.passwd</filename> y la base de datos - de usuario/contraseña para desabilitar los logins con - autentificación de contraseña.</para> - - <para>Una cuenta del staff como esta:</para> + <para>La utilidad &man.ssh.1; funciona de manera + similar a &man.rlogin.1;.</para> - <programlisting>foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting> + <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 'example.com' added to the list of known hosts. +user@example.com's password: <userinput>*******</userinput></screen> - <para>Debe ser cambiada a:</para> - - <programlisting>foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/home/local/bin/tcsh</programlisting> - - <para>Este cambio evitará que las conexiones normales ocurran, - ya que la contraseña cifrada nunca coincidirá con - <quote><literal>*</literal></quote>. Habiendo hecho esto, los - miembros del staff deberán usar otros métodos de - autentificación como &man.kerberos.1; o &man.ssh.1;, usando - pares de claves públicas/privadas. Al usar algo como - Kereberos, uno debe asegurar generalmente las máquinas que - corran los servidores Kereberos, asi como también su - estación de trabajo. Al usar pares de claves - públicas/privadas con ssh, uno debe asegurar generalmente la - máquina usada para hacer el login (generalmente una - estación de trabajo). Una capa adicional de protección - se puede agregar a los pares de claves - públicas/privadas protegiendolas con contraseña en el - momento de crearlas con &man.ssh-keygen.1;. Pudiendo - <quote>marcar</quote> las contraseñas de las cuentas del staff - también garantiza que los miembros del staff solamente pueden - acceder al sistema por medio de un método seguro. Esto fuerza - a los miembros del staff a acceder al sistema usando solamente formas - seguras y conexiones cifradas para todas sus sesiones, lo que - protege de una de las vulnerabilidades más usadas por - los intrusos.</para> + <para>El login continuará como si lo haría si fuera + una sesión utilizando <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. Al usuario se le pide que introduzca + <literal>yes</literal> solamente la primera vez que se + conecta. Todos los intentos futuros de login son verificados + contra la huella de la llave salvada. El cliente SSH le alertará + si la huella guardada difiere de la huella recibida en intentos + de login futuros. Las huellas son almacenadas en + <filename>~/.ssh/known_hosts</filename>, o en + <filename>~/.ssh/known_hosts2</filename> para huellas + SSH v2.</para> + + <para>Por omisión, versiones recientes de + los servidores <application>OpenSSH</application> solamente + aceptan conexiones SSH v2. El cliente utilizará la + versión 2 de ser posible y pasará como + respaldo a la versión 1. El cliente puede también + ser forzado a utilizar una u otra pasándole <option>-1</option> + o <option>-2</option> para versión 1 o versión 2 + respectivamente. La compatibilidad de versión 1 es + mantenida en el cliente para 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>El comando &man.scp.1; funciona de manera + similar a &man.rcp.1;; copia un archivo desde o hacia + una máquina remota, excepto que lo hace de + una forma segura.</para> + + <screen>&prompt.root; <userinput> scp <replaceable>user@example.com:/COPYRIGHT COPYRIGHT</replaceable></userinput> +user@example.com's password: <userinput>*******</userinput> +COPYRIGHT 100% |*****************************| 4735 +00:00 +&prompt.root;</screen> + + <para>Ya que la huella fué ya salvada para este equipo en + el ejemplo anterior, es verificada al utilizar &man.scp.1; + aquí.</para> + + <para>Los argumentos pasados a &man.scp.1; son similares + a &man.cp.1;, con el archivo o archivos en el primer + argumento, y el destino en el segundo. Ya que el archivo + es transferido a través de la red, a través de + SSH, uno o más argumentos toman la forma + <option>user@host:<ruta_al_archivo_remoto></option>.</para> + + </sect2> + + <sect2> + <title>Configuración</title> + <indexterm> + <primary>OpenSSH</primary> + <secondary>configuración</secondary> + </indexterm> + + <para>Los archivos de configuración del sistema + para el daemon <application>OpenSSH</application> y el + cliente reside dentro del directorio <filename>/etc/ssh</filename>.</para> + + <para><filename>ssh_config</filename> configura las opciones + del cliente, mientras que <filename>sshd_config</filename> + configura el daemon.</para> + + <para>Adicionalmente, las opciones <option>sshd_program</option> + (<filename>/usr/sbin/sshd</filename> por omisión), + y <option>sshd_flags</option> de <filename>rc.conf</filename> + pueden brindar más niveles de configuración.</para> + </sect2> + + <sect2 id="security-ssh-keygen"> + <title>ssh-keygen</title> + + <para>En lugar de utilizar contraseñas, &man.ssh-keygen.1; + puede ser utilizado para generar llaves DSA o RSA para + autentificar a un usuario:</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 user@host.example.com +</screen> + + <para>&man.ssh-keygen.1; creará un par de llaves + pública y privada para usar en la autentificación. + La llave privada es almacenada en + <filename>~/.ssh/id_dsa</filename> o en + <filename>~/.ssh/id_rsa</filename>, mientras que la llave + pública es almacenada en <filename>~/.ssh/id_dsa.pub</filename> + o en <filename>~/.ssh/id_rsa.pub</filename>, respectivamente para + tipos de llave DSA y RSA. La llave pública debe ser + colocada en <filename>~/.ssh/authorized_keys</filename> de la + máquina remota para que la configuración funcione. + Similarmente, llaves RSA versión 1 deben ser colocadas en + <filename>~/.ssh/authorized_keys</filename>.</para> + + <para>Esto permitirá conexiones a la máquina remota + basándose en llaves SSH en lugar de contraseñas.</para> + + <para>Si una frase es utilizada en &man.ssh-keygen.1;, se le + pedirá al usuario una contraseña cada + vez para poder utilizar la llave privada. &man.ssh-agent.1; + puede aliviar el esfuerzo de introducir repetidamente + frases largas, y esto es explorado en la sección + <xref linkend="security-ssh-agent"> abajo.</para> + + <warning><para>Las varias opciones y archivos pueden ser + diferentes de acuerdo a la versión de <application>OpenSSH</application> + que tenga en su propio sistema; para evitar problemas debe + consultar 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>Las utilidades &man.ssh-agent.1; y &man.ssh-add.1; brindan + métodos para que llaves <application>SSH</application> + sean cargadas en memoria para su uso, sin tener que necesitar + el tecleo de la frase cada vez.</para> + + <para>La utilidad &man.ssh-agent.1; manejará la + autentificación utilizando la llave(s) privada que se + le cargó. &man.ssh-agent.1; debe ser utilizado para + lanzar otra aplicación. En el nivel más básico, + puede generar un shell o a un nivel más avanzado, un + manejador de ventanas.<para> + + <para>Para usar &man.ssh-agent.1; en un shell, primero necesitará + ser generado con un shell como argumento. Segundo, la + identidad necesita ser añadida ejecutando &man.ssh-add.1; + y brindando la frase para la llave privada. Una vez que se han + completado estos pasos el usuario será capaz de 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, una + llamada a &man.ssh-agent.1; necesitará ser + colocada en <filename>~/.xinitrc</filename>. Esto + brindará los servicios de &man.ssh-agent.1; + a todos los programas lanzados en X11. + Un archivo <filename>~/.xinitrc</filename> de ejemplo + podría lucir como este:</para> + + <programlisting>exec ssh-agent <replaceable>startxfce4</replaceable></programlisting> + + <para>Esto lanzaría &man.ssh-agent.1;, el cual a su + vez lanzaría <application>XFCE</application>, cada + vez que inicie X11. Entonces una vez que se ha hecho y X11 + ha sido reiniciado para que los cambios tomen efecto, + simplemente ejecute &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> tiene la habilidad de crear un tunel para + encapsular otro protocolo en una sesión encriptada.</para> + + <para>El siguiente comando le dice a &man.ssh.1; que realice un + tunel para <application>telnet</application>:</para> + + <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>5023:localhost:23 user@foo.example.com</replaceable></userinput> +&prompt.user;</screen> + + <para>El comando <command>ssh</command> es utilizado con + las siguientes opciones:</para> + + <variablelist> + <varlistentry> + <term><option>-2</option></term> + + <listitem> + <para>Obliga a <command>ssh</command> a utilizar la + versión 2 del protocolo. (No utilizar si + está trabajando con servidores SSH antiguos)</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-N</option></term> + + <listitem> + <para>Indica no comando, o solamente tunel. 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 tunel local de la manera + <replaceable>puerto local:equipo remoto:puerto remoto</replaceable>.</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>user@foo.example.com</option></term> + + <listitem> + <para>El servidor SSH remoto.</para> + </listitem> + </varlistentry> + </variablelist> + + + <para>Un tunel SSH funciona creando un socket que escucha + en <hostid>localhost</hostid> en el puerto especificado. + Entonces 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> está diendo reenviado al + puerto <replaceable>23</replaceable> en el <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 tunel + SSH.</para> + + <para>Esto puede ser utilizado para envolver cualquier + número de protocolos inseguros TCP como SMTP, + POP3, FTP, etc.</para> + + <example> + <title>Usando SSH para crear un túnel seguro para SMTP</title> + + <screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>5025:localhost:25 user@mailserver.example.com</replaceable></userinput> +user@mailserver.example.com's password: <userinput>*****</userinput> +&prompt.user; <userinput>telnet localhost 5025</userinput> +Trying 127.0.0.1... +Connected to localhost. +Escape character is '^]'. +220 mailserver.example.com ESMTP</screen> + + <para>Esto puede utilizarse junto con + &man.ssh-keygen.1; y cuentas de usuario adicional para + crear un ambiente más transparente/libre de problemas. + Las llaves pueden ser usadas en lugar de teclear una + contraseña, y los túneles pueden ser + ejecutados como un usuario separado.</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 corriendo un + servidor POP3. La red, o ruta de red entre su casa y + oficina puede o no ser completamente confiable. Debido + a esto, necesita revisar su correo electrónico + de manera 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:mail.example.com:110 user@ssh-server.example.com</replaceable></userinput> +user@ssh-server.example.com's password: <userinput>******</userinput></screen> + + <para>cuando el túnel esté levantado y funcionando, + puede apuntar su cliente de correo para enviar peticiones + POP3 a <hostid>localhost</hostid> en el puerto 2110. + Una conexión será reenviada de manera segura + a traveés del túnel a <hostid>mail.example.com</hostid>.</para> + </sect4> + + <sect4> + <title>Saltándose un firewall draconiano</title> + + <para>Algunos administradores de red imponen reglas de + firewall extremadamente draconianas, filtrando no + solamente conexiones entrantes, sino también + conexiones salientes. Tal vez solo se le otorgue acceso + para contactar máquinas remotas en los puertos 22 + y 80 para ssh y navegar en web.</para> + + <para>Tal vez quiera accesar otros (quizás no + relacionados al trabajo) servicios, como un servidor + Ogg Vorbis para escuchar música. Si este + servidor Ogg Vorbis está transmitiendo en algún + otro puerto diferente de 22 y 80, no podrá tener + acceso a él.</para> + + <para>La solución es crear una conexión SSH + fuera del firewall 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:music.example.com:8000 user@unfirewalled-system.example.org</replaceable></userinput> +user@unfirewalled-system.example.org's password: <userinput>*******</userinput></screen> + + <para>Su cliente de música puede ahora ser + apuntado a <hostid>localhost</hostid> puerto 8888, + el cual será reenviado a <hostid>music.example.com</hostid> + puerto 8000, evadiendo con éxito el firewall.</para> + </sect4> + </sect3> + </sect2> + + <sect2> + <title>La opción de usuarios <varname>AllowUsers</varname></title> + + <para>Es siempre una buena idea limitar que usuarios pueden + entrar y desde donde. La opción <literal>AllowUsers</literal> + es una buena manera de lograr esto. Por ejemplo, para permitir + solamente entrada al usuario <username>root</username> desde + <hostid role="ipaddr">192.168.1.32</hostid>, algo como esto + podría ser apropiado en el archivo + <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 liste el nombre + de usuario:</para> + + <programlisting>AllowUsers admin</programlisting> + + <para>Múltiples usuarios pueden ser listados en la misma + línea, como:</para> + + + <programlisting>AllowUsers root@192.168.1.32 admin</programlisting> + + <note> + <para>Es importante que liste cada usuario que necesite entrar + a esta máquina; de otra forma no podrán entrar.</para> + </note> + + <para>Despues de hacer los cambios a + <filename>/etc/ssh/sshd_config</filename> debe decirle a + &man.sshd.8; que cargue de nuevo sus archivos de + configuración ejecutando:</para> + + <screen>&prompt.root; <userinput>/etc/rc.d/sshd reload</userinput></screen> + </sect2> + + <sect2> + <title>Más lecturas</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> + <indexterm> + <primary>ACL</primary> + </indexterm> + <title>Listas de control de acceso a sistemas de archivos</title> + + <para>Junto a mejoramientos del sistema de archivos como instantáneas + (snapshots), FreeBSD 5.0 y posteriores ofrecen la seguridad de + listas de control de acceso a sistemas de archivos + (<acronym>ACLs, Access Control Lists</acronym>).</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 le permite a un + administrador hacer uso y tomar ventaja de un modelo de + seguridad más sofisticado.</para> + + <para>Para habilitar soporte de <acronym>ACL</acronym> para sistemas + de archivos <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, un mensaje de advertencia será + desplegado cuando se intente montar un sistema de archivos + soportando <acronym>ACLs</acronym>. Esta opción es + incluida en el kernel <filename>GENERIC</filename>. + <acronym>ACLs</acronym> dependen que atributos extendidos sean + habilitados en el sistema de archivos. Los atributos extendidos + están soportados nativamente en la próxima + generación de sistemas de archivos &unix;, <acronym>UFS2</acronym>.</para> + + <note><para>Un nivel mas elevado de carga adminitrativa es requerido + para configurar atributos extendidos en <acronym>UFS1</acronym> + que en <acronym>UFS2</acronym>. El desempeño de atributos + extendidos en <acronym>UFS2</acronym> también es substancialmente + más elevado. Como resultado, <acronym>UFS2</acronym> es + generalmente recomendado respecto a <acronym>UFS1</acronym> + en preferencia para su uso con listas de control de acceso.</para></note> + + <para><acronym>ACLs</acronym> son habilitadas por la bandera administrativa + al momento de montaje, <option>acls</option>, la cual puede ser añadida + a <filename>/etc/fstab</filename>. La bandera de montaje puede también + ser automaticamente activada de una manera persistente utilizando + &man.tunefs.8; para modificar una bandera de superbloque <acronym>ACLs</acronym> + en la cabecera del sistema de archivos. En general, es preferible utilizar + la bandera de superbloque por varias razones:</para> + + <itemizedlist> + <listitem> + <para>La bandera de montaje <acronym>ACLs</acronym> no puede ser cambiada + por un remontaje (&man.mount.8; <option>-u</option>), solamente con + un completo &man.umount.8; y un &man.mount.8; fresco. Esto significa + que no se pueden habilitar <acronym>ACLs</acronym> en el sistema de + archivos raíz despues del arranque. También significa + que no puede cambiar la disposición de un sistema de archivos + una vez que está en uso.</para> + </listitem> + + <listitem> + <para>Activando la bandera de superbloque provocará que el sistema + de archivos sea siempre montado con <acronym>ACLs</acronym> habilitadas + incluso si no existe una entrada en <filename>fstab</filename> o si los + dispositivos se reordenan. Esto previene un montado accidental del + sistema de archivos sin tener las <acronym>ACLs</acronym> habilitadas, + lo cual puede resultar en que se impongan de manera inadecuada las + <acronym>ACLs</acronym>, y por consecuencia un problema de seguridad.</para> + </listitem> + </itemizedlist> + + <note><para>Podemos cambiar el comportamiento de las <acronym>ACLs</acronym> para + permitirle a la bandera ser habilitada sin un &man.mount.8; completo, pero + lo consideramos deseable para deshalentar montados accidentales sin + <acronym>ACLs</acronym> habilitadas, porque puede disparase a los pies muy + feamente si habilita <acronym>ACLs</acronym>, luego las deshabilita, luego las + habilita nuevamente sin borrar los atributos extendidos. En general, una vez que + que se han habilitado <acronym>ACLs</acronym> en un sistema de archivos, no deben + ser dehabilitadas, ya que la protección de archivos resultante puede no + ser compatible con aquellas pretendidas por los usuarios del sistema, y rehabilitando + las <acronym>ACLs</acronym> pueden re-pegar las <acronym>ACLs</acronym> previas + a archivos que han tenido cambios en sus permisos desde eso, resultando en + otra conducta impredecible.</para></note> + + <para>Los sistemas de archivos con <acronym>ACLs</acronym> habilitadas mostrarán + un signo <literal>+</literal> (más) en sus configuraciones de permisos + al visualizarlos. Por ejemplo:</para> + + <programlisting>drwx------ 2 robert robert 512 Dec 27 11:54 private +drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1 +drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2 +drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3 +drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting> + + <para>Aquí vemos que los directorios <filename>directory1</filename>, + <filename>directory2</filename>, y <filename>directory3</filename> + están todos tomando ventaja de las <acronym>ACLs</acronym>. + El directorio <filename>public_html</filename> no.</para> + + <sect2> + <title>Haciendo uso de <acronym>ACL</acronym>s</title> + + <para>Las <acronym>ACL</acronym>s del sistema de archivo pueden + ser visualizadas por la utilidad &man.getfacl.1;. Por ejemplo, + para ver las configuraciones de <acronym>ACL</acronym> en el + archivo <filename>test</filename>, uno podría + usar el comando:</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 <acronym>ACL</acronym> en + este archivo, invoque la utilidad &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 actualmente de un + archivo o sistema de archivos. El método más + preferible sería utilizar <option>-b</option> ya que + deja los campos básicos requeridos para que + funcionen las <acronym>ACL</acronym>s.</para> + + <screen>&prompt.user; <userinput>setfacl -m u:trhodes:rwx,group:web:r--,o::--- <filename>test</filename></userinput></screen> + + <para>En el comando antes mencionado, la opción + <option>-m</option> fué usada para modificar las + entradas <acronym>ACL</acronym> por omisión. + Debido a que no hubieron entradas predefinidas, como + fueron removidas por el comando previo, esto restaurará + las opciones por omisión y asignará las + opciones listadas. Tome precauciones para notar que si agrega + un usuario o grupo el cual no existe en el sistema, + un error de <errorname>Invalid argument</errorname> será + impreso en <devicename>stdout</devicename>.</para> + </sect2> + </sect1> + + <sect1 id="security-portaudit"> + <sect1info> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>Contribuido por </contrib> + </author> + </authorgroup> + </sect1info> + + <indexterm> + <primary>Portaudit</primary> + </indexterm> + <title>Monitoreando asuntos de seguridad de terceros</title> + + <para>En años recientes, el mundo de la seguridad ha hecho + muchos mejoramientos en como se maneja la evaluación de + vulnerabilidades. La amenaza de instrusiones al sistema + incrementa cuando utilidades de terceros son instaladas + y configuradas para virtualmente cualquier sistema operativo + disponible hoy en día.</para> + + <para>La evaluación de vulnerabilidades es un factor + clave en la seguridad, y mientras &os; libera advertencias + para el sistema base, hacerlo para cada utilidad de terceros + está mas allá de la capacidad del proyecto + &os;. Existe una manera de mitigar las vulnerabilidades de + terceros y advertir a los administradores de incidentes de + seguridad conocidos. Una utilidad agregada de &os; conocida + como <application>Portaudit</application> existe solamente + con este propósito.</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;, por + incidentes de seguridad conocidos.</para> + + <para>Para empezar a usar <application>Portaudit</application>, + primero se debe instalar desde la colección de ports:</para> + + <screen>&prompt.root; <userinput>cd /usr/ports/security/portaudit && make install clean</userinput></screen> + + <para>Durante el proceso de instalación, los archivos + de configuración para &man.periodic.8; serán + actualizados, permitiendole a <application>Portaudit</application> + aparecer en la ejecución diaria de seguridad. Asegúrese + que el correo de la ejecución diaria de seguridad, el cual + es enviado a la cuenta de correo de <username>root</username>, sea + leído. No se requiere ninguna otra configuración + aquí.</para> + + <para>Despues de la instalación, un administrador debe + actualizar la base de datos almacenada localmente en + <filename role="directory">/var/db/portaudit</filename> invocando + el siguiente comando:</para> + + <screen>&prompt.root; <userinput>portaudit -F</userinput></screen> + + <note> + <para>La base de datos será automaticamente actualizada + durante la ejecución de &man.periodic.8;; así + que el comando anterior es completamente opcional. Solo es + requerido para los siguientes ejemplos.</para> + </note> + + <para>Para auditar las utilidades de terceros instaladas como + parte de la colección de ports, un administrador solo + necesita correr el siguiente comando:</para> + + <screen>&prompt.root; <userinput>portaudit -a</userinput></screen> + + <para>Este es un ejemplo de la salida:</para> + + <programlisting>Affected package: cups-base-1.1.22.0_1 +Type of problem: cups-base -- HPGL buffer overflow vulnerability. +Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html> + +1 problem(s) in your installed packages found. + +You are advised to update or deinstall the affected package(s) immediately.</programlisting> + + <para>Apuntando un navegador de web a la <acronym>URL</acronym> + mostrada, un administrador puede obtener más información + acerca de la vulnerabilidad en cuestión. Esto incluirá + versiones afectadas, por versión de port de &os;, junto con + otros sitios web que contengan advertencias de seguridad.</para> + + <para>En corto, <application>Portaudit</application> es una utilidad + poderosa y extremadamente útil cuando se acopla con el + port <application>Portupgrade</application>.</para> + </sect1> + + <sect1 id="security-advisories"> + <sect1info> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>Contribuido por </contrib> + </author> + </authorgroup> + </sect1info> + <indexterm> + <primary>Advertencias de seguridad en FreeBSD</primary> + </indexterm> + <title>&os; Security Advisories</title> + + <para>Como muchos sistemas operativos con calidad de producción, + &os; publica <quote>advertencias de seguridad</quote>. Estas + advertencias son usualmente enviadas por correo a las listas de + seguridad y anotadas en la Errata solamente despues de que la + release apropiada ha sido parchada. Esta sección trabajará + para explicar que es una advertencia de seguridad, como entenderla + y que medidas hay que tomar para parchar el sistema.</para> + + <sect2> + <title>¿Como se ve una advertencia?</title> + + <para>Las advertencias de seguridad en &os; se ven de manera + similar a la de abajo, tomada de la lista de correos + &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 cual es el problema exaxtamente. + Es basicamente una introducción a la advertencia de seguridad actual + y anota la utilidad con la vulnerabilidad.</para> + </callout> + + <callout arearefs="co-category"> + <para><literal>Category</literal> se refiere a la parte afectada del sistema + la cual 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 contribuido al + proyecto &os;, como <application>sendmail</application>. Finalmente + la categoría <literal>ports</literal> indica que la + vulnerabilidad afecta a software agregado como parte de 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 + el módulo, <literal>sys</literal>, es afectado; 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 en que esa + advertencia de seguridad fué publicada, o anunciada al mundo. + Esto significa que el equipo de seguridad ha verificado que el + problema exista y que un parche ha sido enviado al 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 que releases de &os; + afecta esta vulnerabilidad. Para el kernel, una rápida + revisión a la salida de <command>ident</command> en + los archivos afectados ayudará determinando la + revisión. Para ports, el número de versión + está listado despues 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.</para> + </callout> + + <callout arearefs="co-corrected"> + <para>El campo <literal>Corrected</literal> indica la fecha, hora, zona + horaria y release que fué corregido.</para> + </callout> + + <callout arearefs="co-only"> + <para>El campo <literal>&os; only</literal> indica si esta 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> da información acerca de + que es exactamente la utilidad afectada. La mayor parte del + tiempo se refiere a por qué la utilidad existe en &os;, + para que es utilizada, y un poco de información de + como llegó a convertirse en utilidad.</para> + </callout> + + <callout arearefs="co-descript"> + <para>El campo <literal>Problem Description</literal> explica el agujero + de seguridad en profundiad. Esto puede incluir información de + código fallado, o incluso como la utilidad puede ser + usada maliciosamente 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 puede tener en un sistema. Por ejemplo, + esto puede desde un ataque de negación de servicio, + hasta privilegios extras para usuarios, o incluso brindar + al atacante acceso de superusuario.</para> + </callout> + + <callout arearefs="co-workaround"> + <para>El campo <literal>Workaround</literal> ofrece una solución + temporal posible para administradores de sistemas que tal vez no + puedan actualizar el sistema. Esto puede ser debido a + falta de tiempo, disponibilidad de red, o a muchas otras + razones. Sin importar eso, la seguridad no de debe tomar + a la ligera, y un sistema afectado debe ser parchado o + una solución temporal para el agujero de seguridad + debe ser implementado.</para> + </callout> + + <callout arearefs="co-solution"> + <para>El campo <literal>Solution</literal> ofrece instrucciones para + parchar el sistema afectado. Este es un método paso a + paso, probado y verificado para parchar 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 del release + con los puntos cambiados a guiones bajos. También + muestra el número de revisión de los archivos + afectados dentro de cada rama.</para> + </callout> + + <callout arearefs="co-ref"> + <para>El campo <literal>References</literal> usualmente ofrece fuentes de + información. Esto puede incluir <acronym>URL</acronym>s + de web, libros, listas de correos y grupos de noticias.</para> + </callout> + </calloutlist> + </sect2> + </sect1> + + <sect1 id="security-accounting"> + <sect1info> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>Contribuido por </contrib> + </author> + </authorgroup> + </sect1info> + <indexterm> + <primary>Contabilidad de procesos</primary> + </indexterm> + <title>Contabilidad de procesos</title> + + <para>Contabilidad de procesos es un método de + seguridad en el cual un administrador puede llevar + seguimiento de los recursos del sistema utilizados, + su distribución entre los usuarios, brindar + monitoreo para el sistema y minimamente rastrear + los comandos de los usuarios.</para> + + <para>Esto en realidad tiene sus puntos positivos y negativos. + Uno de los positivos es que una intrusión puede ser + minimizada al punto de entrada. Uno negativo es la cantidad + de logs generados por la contabilidad de procesos, y el + espacio en disco que requieren. Esta sección + llevará a un administrador a través de + las bases de la contabilidad de procesos.</para> + + <sect2> + <title>Habilitando y utilizando la contabilidad de procesos</title> + + <para>Antes de hacer uso de la contabilidad de procesos, + debe ser habilitada. Para hacer esto, ejecute el + siguiente comando:</para> + + <screen>&prompt.root; <userinput>touch <filename>/var/account/acct</filename></userinput> + +&prompt.root; <userinput>accton <filename>/var/account/acct</filename></userinput> + +&prompt.root; <userinput>echo 'accounting_enable="YES"' >> <filename>/etc/rc.conf</filename></userinput></screen> + + <para>Una vez habilitada, la contabilidad de procesos + empezará a seguir el rastro de estadísticas + del <acronym>CPU</acronym>, comandos, etc. Todos los logs + de contabilidad están en un formato ilegible + para humanos y pueden ser visualizados usando la utilidad + &man.sa.8;. Si se ejecuta sin opciones, <command>sa</command> + imprimirá información relativa al número + de llamadas por usuario, el tiempo total transcurrido en + minutos, tiempo total de <acronym>CPU</acronym> y de usuario + en minutos, número promedio de operaciones de E/S, + etc.</para> + + <para>Para ver información acerca de los comandos + siendo ejecutados, uno podría usar la utilidad + &man.lastcomm.1;. <command>lastcomm</command> puede ser + utilizado para imprimir comandos ejecutados por usuarios + en &man.ttys.5;, específicos, por ejemplo:</para> + + <screen>&prompt.root; <userinput>lastcomm ls + <username>trhodes</username> ttyp1</userinput></screen> + + <para>Imprimiría todos los usos conocidos de <command>ls</command> + por el usuario <username>trhodes</username> en la terminal + ttyp1.</para> + + <para>Existen muchas otras opciones útiles y son explicadas + en las páginas de manual &man.lastcomm.1;, &man.acct.5; + y &man.sa.8;.</para> + </sect2> + </sect1> </chapter> -<!-- +<!-- Local Variables: mode: sgml - sgml-declaration: "../chapter.decl" + sgml-declaration: "../chapter.decl" sgml-indent-data: t sgml-omittag: nil sgml-always-quote-attributes: t sgml-parent-document: ("../book.sgml" "part" "chapter") - End: + End: --> + |