Optimización de la compilación

TÍTULO:			Intérprete de Comandos Seguro (Open Secure SHell-OpenSSH-)
VERSIÓN LFS:	Cualquiera
AUTOR:			Daniel Roethlisberger <daniel@roe.ch>
TRADUCTOR:	Proyecto LFS-ES

SINOPSIS:
	Cómo compilar e instalar OpenSSH servidor y cliente.

RECETA:
VERSIÓN DE RECETA:	1.5 (17-May-2002)
CAMBIOS:	
		1.5:	Últimas instrucciones sobre el openssh de privilegios separados.
		1.4:	Últimas versiones, añadidas más opciones de openssh y un número
			de otros cambios menores.
		1.3:	Actualizado el sitio web de zlib.
		1.2:	Actualizado al último openssh/openssl. Borrado el obsoleto
			trabajo para la instalación rota de openssl, añadida página
			man. Activado de MD5 en openssh.
		1.1:	Incorporados comentarios de Sergey Ostrovsky referentes a la
			configuración de OpenSSL, optimización y el guión roto de
			instalación. La instalación de OpenSSL ahora es mucho mejor.
			Añadidos comentarios de la localización de la instalación. Modi-
			ficado un poco el guión de dispositivos aleatorios.



INTRO

	Este documento describe los pasos necesarios para lograr un servidor
SSH (sshd) totalmente operativo, y los clientes SSH (ssh, scp). OpenSSH contiene
sustitutivos para los viejos, inseguros y no cifrados servicios telnet, rlogin, rcp y ftp.
Con SSH, SFTP y SCP, tienes una segura, cifrada alternativa.
Además, puedes atravesar por túnel casi todo lo que puedas pensar a través de 
túneles SSH seguros y cifrados.

	¿Por qué "Abierto"? Hay un paquete comercial de Tatu Ylönen el cual es
esencialmente para lo mismo. La variante comercial tiene varios inconvenientes,
por ejemplo, la licencia no permite usarlo libremente en entornos comerciales,
mientras que OpenSSH tiene una licencia abierta, está libre de cualquier asunto de
patentes, y ninguna parte criptográfica fue exportada alguna vez desde los EE.UU.,
lo cual significa ningún problema de reglamento ITAR de exportación. En esencia,
OpenSSH es completamente gratis, mientras que el SSH comercial no lo es. Además,
uno podía decir que Tatu ha sido un poco desfavorable a la oferta gratis de SSH,
por tanto, para mí la variante comercial está fuera de la cuestión.



PAQUETES   

	Necesitarás al menos los siguientes tres paquetes para comenzar:

  openssh-3.2.2p1.tar.gz desde http://www.openssh.com/portable.html
  openssl-0.9.6c.tar.gz desde http://www.openssl.org/
  zlib.tar.gz desde http://www.gzip.org/zlib/

	También puedes conseguirlos desde un espejo, como el local "sunsite". Te
recomiendo que consigas la última versión estable liberada disponible. Han habido
varios defectos serios en ambos openssl e incluso también en openssh posterior-
mente, así que asegúrate de estar actualizado, siempre. Considera suscribirte a
las listas de correo de openssh y openssl, así sabrás cuando estarán disponibles
las nuevas liberaciones. Actualizar estos dos frecuentemente es crucial para la
seguridad de tu sistema.

	zlib es una librería de compresión requerida para construir los paquetes
OpenSSL y OpenSSH. OpenSSL es una implementación abierta de la librería SSL.
OpenSSH está usando OpenSSL para todas sus cometidos relacionados con el 
cifrado.



DEPENDENCIAS

	Si quisieras usar SSH en conjunción con PAM, instala PAM primero. Mira la
receta de PAM sobre cómo hacerlo. PAM no es requerido para ejecutar ninguna 
parte de OpenSSH, sólo si quieres PAM entérate de la versión de OpenSSH, puesto 
que necesitas tener instalado PAM primero. Estás completamente solo cuando 
construyas PAM.


DISPOSITIVOS

	Si ya no lo has hecho así, deberías crear los archivos para dispositivos
generadores de caracteres aleatorio /dev/random y /dev/urandom. OpenSSH viene 
con un generador de datos aleatorios interno, pero es altamente recomendable usar 
un dispositivo aleatorio provisto por el núcleo de Linux. Lo haces tecleando los 
siguientes comandos:
  
  mknod /dev/random c 1 8 &&
  mknod /dev/urandom c 1 9 &&
  chown root.sys /dev/random /dev/urandom &&
  chmod 0644 /dev/random /dev/urandom

	El generador de datos aleatorios del núcleo toma algunas de sus entradas 
aleatorias ("ruido" -"noise"-), de alguna interacción del usuario tal como el ratón,
teclado, retrasos de red y así sucesivamente. Cuando arranca un sistema Linux 
sin mucha interacción del mundo exterior, el conjunto de la entropía puede estar 
en un bello y previsible estado. Esto reduce la actual cantidad de ruido en el 
conjunto de la entropía bajo lo estimado. Con el objeto de contrarrestar este efecto,
ayuda conservar la información del conjunto de la entropía a través de los arranques 
y paradas.

	Para hacer esto, añade las siguientes líneas a un guión apropiado que
se ejecute durante la secuencia de arranque del sistema Linux:

  echo -n "Inicializando el generador de números aleatorios..."
  # Inicializa el generador de números aleatorios del núcleo con la semilla
  # aleatoria desde la última parada ( o arranque ) a este arranque. Carga y
  # luego guarda 512 bytes, que es el tamaño del conjunto de la entropía.
  if [ -f /var/random-seed ]; then
      cat /var/random-seed >/dev/urandom
  fi
  dd if=/dev/urandom of=/var/random-seed count=1 &>/dev/null
  evaluate_retval

	También, añade las siguientes líneas a un guión apropiado que se ejecute
durante el apagado del sistema Linux:

  # Conserva una semilla aleatoria desde el apagado al arranque para el generador
  # de números aleatorios. Guarda 512 bytes, que es el tamaño del conjunto de la 
  # entropía del generador de números aleatorios.
  echo -n "Guardando la semilla aleatoria..."
  dd if=/dev/urandom of=/var/random-seed count=1 &>/dev/null
  evaluate_retval



INSTALACIÓN

	Una nota sobre las rutas (paths) de instalación: instalé los tres paquetes
dentro de la jerarquía de /usr. Si quieres conservar la base LFS y los paquetes 
adicionales que hayas instalado más tarde estrictamente separados, querrás 
reemplazar /usr por /usr/local en donde yo haya usado en los siguientes comandos.



ZLIB

	Después de haberte asegurado de que funcionen los dispositivos aleatorios,
instala zlib primero. Házlo desempaquetando el paquete como de costumbre, y 
ejecuta los siguientes comandos desde el directorio fuente de zlib.

  ./configure --shared --prefix=/usr &&
  make &&
  make install &&
  ldconfig



OPENSSL

	Luego, instala OpenSSL como librerías compartidas de la misma manera, pero
ejecutando esos comandos:

  ./config --prefix=/usr --openssldir=/usr/lib/openssl shared &&
  make &&
  make install &&
  ldconfig &&
  for m in /usr/lib/openssl/man/man? ; do
    cp $m/* /usr/man/$(basename $m)/
    rm -rf $m
  done

	Podrías darte cuenta de que OpenSSL no lee las señales de la variable de
entorno para el compilador CFLAGS, sino que en su lugar ajusta a -O3 -m486. Tú
podrías querer editar ./configure, buscar la línea que comience por "linux-elf"
(incluidas las comillas) y ajustar el modelo de procesador y la deseada optimización. 
Yo he usado -O3 -march=i686 -mcpu=i686 . También puedes querer jugar con
otras señales.

	Si no quieres ningún algoritmo patentado, puedes añadir las siguientes
opciones, -rc5 y no-idea a ./configure. Eso quitará el soporte para esos dos 
algoritmos patentados. Yo quiero RC5 y IDEA sin importarme los asuntos de 
patentes.

	Por defecto, el guión de configuración de OpenSSL copia su árbol de con-
figuración en $(prefix)/ssl. Eso viola el Estándar de Jerarquía de Archivos, y
además llena de confusión el árbol de directorios, así que nosotros lo invalida-
mos con el cambio de --openssldir, y ajustamos el guión para instalar las librerías 
a donde pertenecen: $(prefix)/lib/openssl.



OPENSSH

	Primero, necesitamos algunos preparativos para la elegante característica 
de separación de privilegio introducido en openssh-3.2.2 . El programa SSH
de privilegio separado es significativamente más seguro, así todo proceso de
dato no fiable es pasado a procesos sin privilegios, lo que significa que fallos
que normalmente se dirigirían a comprometer a un root remoto ahora sólo se dirigen 
al acceso de usuario sin privilegios en una jaula chroot vacía. O en viejo y
plano castellano (English): los exploits de root remoto que normalmente funcionarían
contra OpenSSH no funcionarán en la versión de privilegio separado. O las últimas 
oportunidades son extremadamente débiles de que un agujero se dirija a un
root remoto.

	Crea un usuario y un grupo 'sshd' editando /etc/passwd, /etc/shadow, y
/etc/group. Haz que el ususario sshd sea miembro del grupo sshd, y a ningún otro
grupo. Ajusta el directorio personal (home) del usuario para que sea /var/empty,
y que el intérprete de comandos sea /bin/false. Luego crea ese directorio espe-
cial ejecutando:

  mkdir /var/empty &&
  chown root:root /var/empty &&
  chmod 755 /var/empty

	Ten especial cuidado de que no exista ningún archivo en todo el sistema
de archivos que tenga como usuario o grupo a sshd. /var/empty debe tener propie-
tario y grupo root, no sshd.

	Ahora, instala OpenSSH ejecutando los siguientes comandos en el directo-
rio creado por tar:

  ./configure --prefix=/usr --sysconfdir=/etc/ssh \
              --with-md5-passwords \
              --disable-suid-ssh \
              --with-ipv4-default &&
  make &&
  make install

	Esto instala los binarios en /usr/bin y sbin, y los archivos de configuración, 
incluyendo todas las claves de la estación (host), en /etc/ssh.
make install creará el directorio /etc/ssh si no está presente ya. Nuevas claves
de estaciones serán generadas automáticamente. Esas claves son de 1024 bits 
por defecto. Si quieres crear unas nuevas o claves de estación más largas 
manualmente, usa ssh-keygen para hacerlo. Si usas las versiones 1 del protocolo 
SSH, podrías querer aumentar los ajustes de ServerKeyBits desde 768 a 1024.

	Puedes necesitar más opciones para ./configure si quieres habilitar soporte 
para Kerberos, smartcards, PAM o AFS, o si quieres cambiar la separación de 
privilegio por defecto (/var/empty, sshd). Fíjate que yo instalo el binario ssh sin 
privilegios de root (suid). Los privilegios de root son necesarios por los clientes
sólo cuando usen rhosts para la autentificación, lo cual requiere que ssh se una a
un puerto privilegiado. Como rhosts es viejo, obsoleto método de autentificación,
inseguro por diseño, yo no lo estoy usando, y tú tampoco deberías.



CONFIGURACIÓN

	Para activar la separación de privilegio, edita /etc/ssh/sshd_config y
añade esta línea:

  UsePrivilegeSeparation yes

	Para mejorar la seguridad, podrías querer afinar otros parámetros, tal 
como desactivar el soporte de la v1 del protocolo SSH, y podrías querer desactivar 
la autentificación rhosts. Normalmente yo sólo permito autentificación de
clave (password) y clave pública (pubkey) en mis estaciones (man sshd).



EJECUTANDO EL SERVIDOR

	Si quieres que el servidor SSH (sshd) sea comenzado por init en el arranque, 
crea una copia de /etc/init.d/template, nómbralo sshd, edítalo, pónlo como
ruta de binario /usr/sbin/sshd donde sea adecuado, asegúrate de que la salida de
los guiones estén en tus enlaces, y luego crea enlaces simbólicos en los apropiados 
directorios de niveles de ejecución (runlevels). En mi máquina, yo añadí el enlace 
simbólico "S20sshd" a rc{3,4,5}.d, y "K40sshd" a rc{0,1,2,6}.d, todos apuntando a 
"../init.d/sshd". Ten presente que tu LFS puede estar usando tres dígitos,
en tal caso asegúrate de crear S200sshd y K400sshd apropiadamente.

	Para comenzar inmediatamente sshd, y asegurarte de que el guión funciona
como debería, arranca el servidor vía guión ejecutando:

  /etc/init.d/sshd start

	En el caso de tener telnetd o cualquier r-servidor de BSD ejecutándose,
querrás desactivarlos y decir a tus usuarios que usen ssh, scp y sftp en su lugar.
SFTP está ahora razonablemente difundido, hay clientes para casi cualquier Sistema
Operativo, incluyendo Windows, así que deberías hacer que tus usuarios utilicen 
SFTP, y desactivar el acceso FTP a los usuarios del sistema.

	Si quisieras ejecutar sshd con la característica chroot (chrooted), puedes 
escribir un simple programa que haga el chroot al directorio del usuario, retire 
privilegios, limpie el entorno (env), y ejecute un intérprete de comandos. Instala este
programa de chroot con el suid root activado, añádelo a /etc/shells y úsalo como el
intérprete de comandos de los usuarios. No te olvides de ajustar el entorno chroot
para los usuarios en cuestión (por ejemplo, sftp requiere no sólo un bin/sh sino 
también un binario sftp-server). Deberías asegurarte de que el usuario en cuestión 
no sea propietario de ninguna jaula chroot, y podrías querer ajustar el inmutable bit 
en todos los ficheros de la jaula si estás usando un sistema de ficheros que lo 
soporte (man chattr). Una alternativa a usar la envoltura chroot de suid root es 
parchear los binarios sshd y sftp-server. Encontrar y aplicar estos parches es tu 
trabajo, yo te aseguro que existen, sin embargo yo prefiero la envoltura. Tú mismo.

	En este sentido, si estás buscando un cliente win gratis, prueba PuTTY, que 
encontrarás en la siguiente URL. Hay otros muchos clientes, así que elíge.

  http://www.freessh.org/

	La gente no debería tener que usar ningún protocolo sin cifrado para la 
autentificación nunca más. No hay ninguna razón para que así sea.

Ánimo,
Dan