Entorno de Contraseñas Ocultas (Shadow Suite) para Linux(tm) - instalación, uso, mejora

TÍTULO:		Entorno de Contraseñas Ocultas (Shadow Suite) para
		Linux(tm) - instalación, uso, mejora
VERSIÓN LFS:	3.0+
AUTOR:		Jeffrey Allen Neitzel <jan@belvento.org>
TRADUCTOR:	Proyecto LFS-ES

SINOPSIS:
	¿Quieres saber si tu sistema está asegurado en lo que respecta a
	contraseñas?
	¿Quieres aprender más sobre seguridad?
	Entender el uso de contraseñas en tu sistema es una buena manera
	de empezar ya que, en UNIX(tm), son análogas a las llaves de la
	puerta principal de tu casa. Las Contraseñas Ocultas pueden
	ayudar a evitar que esas llaves caigan en las manos equivocadas.

RECETA:

2001-10-09

Índice
	Prólogo
	Introducción
		*) Dos Enfoques
		*) Terminología
	Capítulo 1
		- Información Preliminar
		  *) ¿Qué es la ocultación de contraseñas?
		  *) ¿Lo estoy utilizando ya?
		  *) ¿Contraseñas DES contra MD5?
		  *) ¿Quiero realmente ocultar mi fichero de contraseñas?
	Capítulo 2
		- Instalando Shadow-20001016
		  *) Comandos de Instalación
	Capítulo 3
		- Pasos Adicionales de Configuración/Seguridad
		  *) ¿Cómo añado un usuario nuevo?
		  *) /etc/login.defs (configurando la entrada en el
		  sistema de shadow)
		  *) Permisos Esenciales
	Capítulo 4
		- Conclusión
	Notas a pie de página


=============================================================
  PRÓLOGO
=============================================================

Las siguientes modificaciones y sugerencias están basadas en los
comandos de instalación como aparecen en:

	Linux From Scratch: Versión 3.0 (lfs-3.0)

Las sugerencias que aquí aparecen son aplicables directamente a
cualquier Sistema LFS que utilice el Entorno de Contraseñas Ocultas
(shadow-20001016), que puede obtenerse en:
ftp://ftp.pld.org.pl/software/shadow/

Por favor, consulta la LIMITACIÓN DE RESPONSABILIDAD en:
http://hints.linuxfromscratch.org/hints/DISCLAIMER

Además, el autor no se responsabiliza de la seguridad de tu sistema.
Estas son sugerencias amistosas, pero no debería olvidarse que
implementar medidas de seguridad para tu sistema es una tarea
polifacética. La seguridad en las contraseñas es sólo una parte.

Asumiré que estás instalando el entorno de contraseñas ocultas (shadow)
ahora. Necesitarás privilegios de super-usuario (root) para llevar a
cabo muchas de las actividades de configuración aplicables a todo el
sistema que se discuten aquí. Este documento asume que tienes esos
privilegios. Debido a esto, te dejo con un pensamiento final, "Piensa
antes de escribir".

=============================================================
  INTRODUCCIÓN
=============================================================

El objetivo principal de este documento es complementar y ampliar el
LIBRO LFS en lo que respecta a las contraseñas ocultas en tu Sistema
LFS. Intentaré detallar algunos pasos adicionales a tomar que pueden
mejorar la seguridad del sistema. Hice esto esperando que el lector lo
encuentre como una extensión valiosa a los métodos del libro.

o== Dos Enfoques ==o

He intentado dividir los comandos para contemplar dos enfoques
distintos: aquellos usuarios que están leyendo el libro y este documento
simultáneamente; y aquellos que están leyendo esto después de haber
finalizado el libro. Para conseguirlo, el autor utilizará las siguientes
notaciones en los Capítulos 2, 3 y 4.

  # Enfoque 1
    permitirá al lector reemplazar los comandos de instalación de
    Shadow-20001016 que se encuentran en el libro con los comandos que
    se listan aquí.

  # Enfoque 2
  
    Está pensado principalmente para aquellas personas que ya hayan
    instalado Shadow-20001016 y ahora quieren comprobar su configuración
    para asegurarse de que todo es correcto, mejorarla, modificarla,
    etc.

  # Ambos enfoques, 1+2
    será aplicable a ambos tipos de lectores.

o== Terminología ==o

Utilizaré los términos contraseña y clave secreta intercambiablemente.
Además, antes que utilizar la palabra "cifrado" para describir la cadena
de caracteres en la que se convierte tu contraseña, utilizaré el termino
"codificado". Esto es debido a que la contraseña que escribes realmente
se codifica utilizando una función asociativa unidireccional. Lee
crypt(3) para más información. Creo que ésto es cierto, también, para
contraseñas basadas en el algoritmo MD5.

==

Espero ampliar lo que he escrito aquí tanto como el tiempo me permita, e
invito al lector a contactar conmigo para informar de errores u
omisiones. Por supuesto, cualquier comentario o pregunta será
bienvenido.

Para comenzar, debería introducir lo siguiente exponiendo el hecho de
que, cuando se trata de seguridad y ordenadores, *siempre* hay que
llegar a una solución de compromiso entre la seguridad (paranoia) y la
conveniencia, tanto para los administradores del sistema como para los
usuarios.

Debido a esta necesidad de compromiso y equilibro, la interpretación de
los requisitos de seguridad difiere entre sistema y sistema. La
interpretación de las prácticas sugeridas, normalmente caerá, víctima de
la subjetividad inherente a la naturaleza humana.

Por ello, este autor enfoca la seguridad desde una perspectiva
PARANOICA. El lector debería equilibrar estas sugerencias con su propia
necesidad y conveniencia. Si la sugerencia introduce demasiada
inconveniencia respecto al beneficio de la seguridad añadida, os invito
a interpretar y aplicar como dicten las necesidades.

Se mencionará cuando sea necesario explicar más detalladamente alguna
cuestión en particular.


=============================================================
  Capítulo 1 - Información Preliminar
=============================================================

o== ¿Qué es la ocultación de contraseñas? ==o

La ocultación de contraseñas es una útil herramienta y una parte de la
seguridad de tu sistema. Es una herramienta que te permite proteger la
información de las contraseñas de aquellos que, realmente, no necesitan
verla. Como existe mucha información sobre contraseñas y seguridad en
ordenadores, no voy a duplicarla aquí.

En pocas palabras, ocultar tu fichero de contraseñas consiste en borrar
las claves secretas codificadas del fichero /etc/passwd (que,
necesariamente, es legible para todos) y situarla en otro fichero que no
puede leer todo el mundo. Este otro fichero se llama, normalmente,
/etc/shadow en los sistemas Linux.

Es una idea que no es necesariamente nueva y que ha sido aplicada de una
u otra manera en una gran cantidad de sistemas UNIX. El Entorno de
Contraseñas Ocultas (Shadow Suite) para Linux es una de estas
herramientas. Sólo es una herramienta, no la salvación en lo que
respecta a seguridad.

o== ¿Lo estoy utilizando ya? ==o

¿Has ejecutado ya el comando `/usr/sbin/pwconv'? ¿Has asignado una
contraseña al administrador (root) ejecutando `/usr/bin/passwd root'? Si
es así, la respuesta es, muy probablemente, "SÍ".

Digo "muy probablemente" porque creo que nunca te puedes sentir
demasiado seguro con algo tan importante para la integridad de tu
sistema. Por ello, al hilo de éso, por favor, tómate ahora un momento
para examinar los ficheros pertinentes si no lo has hecho todavía.

Para más información sobre lo siguiente, por favor, consulta las páginas
del manual (man) pertinentes, que serían:
PASSWD(5) que puedes obtener con `man 5 passwd' o,
SHADOW(5) que puedes obtener con `man 5 shadow'.

Para cada línea de /etc/passwd, deberías ver algo como esto:

  usuario:contraseña:uid:gid:comentario:directorio_personal:intérprete

Los campos están delimitados con dos puntos. El segundo campo es el de
la contraseña. Una de las siguientes afirmaciones será correcta:

  *) el campo de contraseña no contiene nada (e.g. usuario::uid)

    ¡Esto es un signo de peligro! ¡PELIGRO! No tienes contraseña. Por
    favor, detente ahora y asígnate una contraseña.

  *) el campo de contraseña contiene "x"

    Si ves una "x" allí, normalmente significa que se han activado las
    contraseñas ocultas. En tal caso, tu contraseña codificada se ha
    movido al fichero de contraseñas ocultas (/etc/shadow). Si eres el
    super-usuario, ahora podría ser un buen momento para adelantarse y
    mirar qué hay en este fichero. Asegúrate de que existe una entrada
    en /etc/shadow para cada usuario que exista en /etc/passwd. Hay
    ocasiones en las que algunos usuarios que sí existan en el fichero
    de contraseñas, no aparezcan en el fichero de contraseñas ocultas.
    Esto es más probable que pase si alguna vez has añadido un usuario
    con el programa vipw.

  *) el campo de contraseña contiene "un_montón_de_caracteres_ASCII"

    Si ves un montón de caracteres ASCII en lugar de una "x", entonces
    no estás utilizando contraseñas ocultas. Los caracteres ASCII forman
    la cadena de caracteres codificada que representa a tu contraseña.

o== ¿Contraseñas DES contra MD5? ==o

Existen dos algoritmos diferentes usados comúnmente para codificar las
contraseñas de los usuarios. Uno de ellos usa la función crypt, que a su
vez utiliza un algoritmo basado en el DES. El otro método utiliza un
algoritmo basado en el MD5, que es sustancialmente mejor que el método
DES. *Hay* otros, pero estos dos son los que, actualmente, se
encuentran disponibles en Linux.

¿Cuál estoy usando?

Puedes distinguir uno de otro mirando la cadena de caracteres con la
contraseña codificada. Si empieza con $1$ y tiene 34 caracteres
incluyendo el $1$, estás ante un formato de texto cifrado basado en el
MD5. Los formatos basados en el DES son sustancialmente más cortos,
sobre 13 caracteres, si mal no recuerdo.

o== ¿Quiero realmente ocultar mi fichero de contraseñas? ==o

¡Sí, sí quieres! Debería advertirse, sin embargo, que hay,
aparentemente, algunas situaciones donde podrías no querer hacerlo.
Como, personalmente, no puedo hablar sobre estas situaciones, debo
delegar en la experiencia de otros en esta cuestión. Por otra parte, si
tu máquina tiene cuentas de usuario (una estación de trabajo de
sobremesa, por ejemplo) y no enreda con NFS y cosas así, seguramente
ocultar tu fichero de contraseñas no puede dañar. Al final de todo,
depende completamente de ti.

Basta con decir que, en cualquier sistema UNIX, las contraseñas son una
parte importante del modelo básico de seguridad y el primer paso, o
puerta principal, del sistema. Si puedes proteger la integridad del
sistema de alguna manera *escondiendo* estas claves, entonces supongo
que es un paso preventivo en la dirección correcta.


=============================================================
  Capítulo 2 - Instalando Shadow-20001016
=============================================================

o== Comandos de Instalación ==o

He añadido comentarios para dar más detalles donde he creído que era
necesario. Los comentarios se denotan igual que en cualquier guión del
Intérprete de Comandos Bourne. Un "#" al principio de una línea la marca
como un comentario. He insertado dobles espacios entre bloques de
comandos relacionados para mejorar la legibilidad y como énfasis.

El significado de las notaciones "# Enfoque 1", "# Enfoque 2" y "# Ambos
enfoques, 1+2" se detalla previamente en la Introducción.

############################################################
# Enfoque 1
cd /ruta/al/código/fuente/shadow-20001016

# Comienzo de los comandos de instalación.
cp src/useradd.c src/useradd.c.backup &&
sed 's/\(.*\) (nflg || \(.*\))\(.*\)/\1\2\3/' \
   src/useradd.c.backup > src/useradd.c &&

# ¿Quieres md5crypt? Esta capacidad se compila ahora por defecto.
./configure --prefix=/usr &&
make &&
make install &&
cd etc &&
cp limits login.access /etc &&

# La segunda expresión de más abajo activará la codificación de las
# contraseñas basada en el MD5 en tu fichero /etc/login.defs.

sed 's%/var/spool/mail%/var/mail%
     s%^#MD5_CRYPT_ENAB.*no%MD5_CRYPT_ENAB yes%' login.defs.linux \
   > /etc/login.defs &&

# Mueve algunas librerías y crea algunos enlaces simbólicos.
cd /lib &&
mv libshadow.a libshadow.la /usr/lib &&
ln -sf libshadow.so.0 libshadow.so &&
cd /usr/lib &&
ln -sf ../../lib/libshadow.so

############################################################
# Enfoque 2
# Si estás leyendo esta receta después de la instalación de las
# contraseñas ocultas y has efectuado esa instalación siguiendo el libro
# lfs, entonces ejecuta estos comandos para activar el soporte MD5.
cp /etc/login.defs /etc/login.defs.working &&
sed 's%^#MD5_CRYPT_ENAB.*no%MD5_CRYPT_ENAB yes%' /etc/login.defs.working \
   > /etc/login.defs

############################################################
# Ambos enfoques, 1+2
# Crea estos enlaces simbólicos si quieres el programa vigr. Es una
# adición agradable.
cd /usr/sbin &&
ln -sf vipw vigr &&
cd /usr/share/man/man8 &&
ln -sf vipw.8 vigr.8


=============================================================
  Capítulo 3 - Pasos Adicionales de Configuración/Seguridad
    # Ambos enfoques, 1+2
=============================================================

o== ¿Cómo añado un usuario nuevo? ==o

Bueno, hay más de una manera de hacerlo, por supuesto, pero queremos la
forma más fácil, ¿verdad? Primero, por favor, advierte que las páginas
del manual (man) pertinentes son USERADD(8) y GROUPADD(8). Menciono
estas páginas porque el siguiente ejemplo es la manera más simple de
hacer ésto. Deja mucho que desear y, seguramente, querrás afinar el
ejemplo para ajustarlo a tus necesidades.

Ejemplo: Quieres añadir un usuario nuevo "juan". Estará en el grupo
"usuarios". ¿Qué hacer?

¿Existe ya el grupo "usuarios" en tu sistema? Si no, añade este nuevo
grupo ejecutando:
/usr/sbin/groupadd usuarios

Ahora puedes añadir el usuario "juan" haciendo:
/usr/sbin/useradd -g usuarios juan

De acuerdo, ahora que lo hemos hecho... ¿Puede juan, realmente, utilizar
esta cuenta ya? No. ¿Por qué? Bueno, todavía no tiene una contraseña. La
cuenta, en este momento, está bloqueada. Además, utilizando los comandos
exactamente como se indicó, su directorio de usuario (home) no existe
todavía en el sistema.

Puedes asignar una contraseña a juan haciendo:
/usr/bin/passwd juan

Eso es todo, por ahora. Por favor, consulta USERADD(8) para más
información. Hay una gran cantidad de opciones adicionales que puedes
utilizar. Además, puedes crear un guión del intérprete de comandos para
automatizar el procedimiento, de forma que los resultados sean siempre
consistentes. Incluiré un guión de ejemplo aquí a su debido tiempo.

o== /etc/login.defs (configurando la entrada en el sistema de shadow) ==o

Este fichero de configuración es muy importante para tu sistema.
Recomiendo encarecidamente que te tomes unos momentos para
familiarizarte con él. Como tiene una gran variedad de definiciones de
configuración, es casi obligatorio saber exactamente qué hay allí.
Además, si tienes un poco de tiempo para enredar con este fichero ¡puede
ser casi divertido! ;o)

Antes de cambiar este fichero, haz una copia de seguridad por razones
obvias. Un buena manera de obtener una perspectiva general de este
fichero es, simplemente, hacer 'less /etc/login.defs'. Tiene comentarios
que describen lo que hace cada definición. También puedes echar un
vistazo a LOGIN(5), 'man 5 login.defs', si necesitas más información que
la que proporcionan estos comentarios.

A su debido tiempo, añadiré un fichero /etc/login.defs de ejemplo
([3] /etc/login.defs) con información adicional sobre lo que creo que
son los mejores valores a usar y por qué.

o== Permisos Esenciales ==o

Si quieres sacar el máximo partido a la ocultación de contraseñas y
añadir algo de seguridad extra a tu sistema, te recomiendo seguir lo
siguientes pasos. Esto está realmente pensado para el paranoico. En mi
opinión, la seguridad del ordenador y la paranoia van dadas de la mano.
¡La paranoia es buena! Permíteme este momento para invitarte de nuevo a
sopesar estas sugerencias con tus propias necesidades.

#
# Restringe los permisos de /bin/login y /bin/su .  Consulta [1] más
# adelante para la explicación de por qué.
#
# Antes de restringir su a un grupo privilegiado, debes crear primero
# ese grupo con groupadd (man 8 groupadd para los detalles) o vigr. Por
# ejemplo, cambia el "admin" de más abajo por cualquier nombre de grupo
# que hayas elegido utilizar. Entonces, asegúrate de añadirte a ti
# mismo o a cualquier usuario privilegiado al grupo "admin" creado.
# Ejecuta los siguientes comandos.
chmod -c 0700 /bin/login &&
chgrp -c admin /bin/su &&
chmod -c o-rx /bin/su

#
# Otros programas que deberían restringirse.  Consulta [2] para una
# explicación de por qué.
#
# Lo siguiente borrará los permisos de ejecución del grupo y otros
# usuarios de estos programas. Como sólo el administrador (root) puede
# usar efectivamente cualquiera de ellos, podrías también hacerlos tener
# los privilegios 0700, y habrías terminado. Entonces, un usuario
# privilegiado puede hacer su a administrador (root) y efectuar la
# administración de usuarios.
cd /usr/sbin &&
chmod -c go-rx chpasswd dpasswd group* grp[cu]* logoutd \
mkpasswd newusers pw[cu]* user* vipw

#
#== Ejercicio para el lector ==#
#
# ¿Utilizas realmente cualquiera de estos programas diariamente? Si no
# es así, podrías, simplemente, borrarlos enteramente del sistema,
# grabarlos en un CD y montar este CD cuando necesites realizar
# administración de usuarios. Esto *es* posible, por cierto, pero
# necesitas sopesar los costes y beneficios de hacerlo así. Al fin y al
# cabo, es responsabilidad tuya.
#


=============================================================
  Capítulo 4 - Conclusión
=============================================================

Después de todo esto, asumo que quieres activar la ocultación de
contraseñas... =)

############################################################
# Enfoque 1
Si todavía estás ejecutando los comandos dentro del entorno chroot de tu
sistema anfitrión y no has reiniciado dentro del nuevo sistema LFS,
entonces ejecuta:

/usr/sbin/pwconv

Y después, ejecuta:

/usr/bin/passwd root

############################################################
# Enfoque 2
Antes de ejecutar el siguiente comando, asegúrate completamente de que
has hecho una copia de tu fichero de contraseñas no ocultas actual;
ponlo en algún lugar seguro y cambia sus permisos a 0600. Más vale
prevenir que lamentar. Si la cosa se pone fea, la recuperación es
sencilla. Después de haber tomado la medida de precaución anterior,
asegúrate de que eres administrador (root) y de que has entrado en más
de una consola o terminal.

Ahora ejecuta:
/usr/sbin/pwconv

En la segunda o tercera terminal en la que hayas entrado, haz algunas
pruebas para estar seguro de que has conseguido los resultados esperados
(esto es, que puedes entrar en el sistema). En algún otro terminal,
intenta entrar en tu cuenta normal de usuario. ¿Has tenido éxito? ¡Bien!
Ahora, intenta hacer 'su - root'. Si no notas ningún comportamiento
anómalo entonces todo parece correcto para continuar.

Si añadiste contraseñas al sistema antes de cambiar /etc/login.defs para
permitir el soporte MD5, ten en cuenta que las contraseñas antiguas no
se convierten automáticamente. Las contraseñas anteriores todavía
estarán codificadas utilizando el algoritmo basado en DES. Para cambiar
estas contraseñas para que utilicen el formato de texto cifrado basado
en MD5, simplemente ejecuta '/usr/bin/passwd <usuario>', para cada
usuario para el que lo anterior sea cierto.

Ahora, la nueva cadena de caracteres codificada estará basada en MD5.
Si quieres conservar la contraseña original para todas las cuentas,
ejecuta passwd dos veces para cada una. Primero, cambia la contraseña a
algún valor temporal, y entonces vuelve a cambiarla al original.

############################################################
# Ambos enfoques, 1+2
¡Enhorabuena! !Lo has hecho verdaderamente bien! =)


=============================================================
  NOTAS A PIE DE PÁGINA
=============================================================

[1] ¡login y su no deberían poder ser ejecutados por todo el mundo!

 login:
	Hasta donde yo he visto, login sólo es ejecutado por getty o
	algún otro proceso perteneciente al administrador (root).
	Algunas veces, sshd podría configurarse para utilizar login.
	Como sshd suele ejecutarse como administrador, o algún otro
	usuario privilegiado, esto no debería causar ningún problema.
	No tengo ninguna garantía de que sea así, ¿alguien podría
	confirmarlo?

 su:
	Este programa debería ser fuertemente restringido. Tiene el bit
	de ejecución (SUID) como administrador (root). La seguridad
	debería dictar a quién le está permitido utilizar su,
	perteneciendo a un grupo privilegiado cuyos miembros conste,
	sólo, de administradores de confianza.

	Siempre utilizo los grupos wheel o admin para esto, escoge
	cualquier nombre de grupo que quieras. El fichero
	/etc/login.defs tiene una forma de restringir el uso de su.
	Además, el mismo programa su tiene un fichero de configuración
	que puedes decidir utilizar: /etc/suauth

	Este fichero no se crea por defecto. 'man 5 suauth' te dará
	detalles sobre este fichero. En pocas palabras, revisa estas
	posibilidades para restringir el uso de su. Hasta entonces,
	quitar el permiso de ejecución para todo el mundo de /bin/su es
	una buena manera de empezar.

[2] Cambiar algunos otros modos como protección adicional.

Hay un juego completo de programas que se instalan en /usr/sbin como
parte del entorno de contraseñas ocultas. Estos programas debería
restringirse sólo a administradores. Sólo el administrador (root) puede,
efectivamente, utilizar cualquiera de estos programas. Por ello,
cualquier otro administrador debe hacer su a esa cuenta, realizar las
tareas de administración y regresar a su cuenta normal de usuario.

Nota: Algunos de estos programas darán errores si el usuario juan
    intenta utilizarlos. Si los permisos de tu sistema en /etc son
    correctos, el usuario juan no podrá bloquear ninguno de los ficheros
    importantes, como /etc/{passwd,shadow,group,gshadow}. Debido a
    esto, tiene sentido restringir, simplemente, los permisos de estos
    programas.

[3] /etc/login.defs

Esto será añadido pronto.