SafeChildren Banner

Havoc Oracle Solaris Experts

miércoles, 17 de noviembre de 2010

Política de Contraseñas en OpenIndiana y Solaris

Introducción
Una característica no tan conocida de OpenIndiana y Solaris, es el uso de diccionarios de contraseñas dentro de las opciones de la política de contraseñas.

Por defecto, Solaris no establece ninguna política de contraseñas fuertes, es decir, longitudes mínimas, formato, que no sean igual que el login, etc. Sin embargo, todo esto es configurable.

En esta ocasión, veremos cómo podemos mejorar la seguridad modificando los parámetros de longitud, duración y, por último, utilizaremos un diccionario para que Solaris evalúe la contraseña antes de asignarla.

Algoritmo de Encriptación
En Solaris, el algoritmo de encriptación asignado por defecto era el original de UNIX, que se mantenía por compatibilidad, sin embargo, este algoritmo tenía muchas limitaciones, y a día de hoy, no es nada seguro.

En OpenIndiana, sin embargo, se utiliza el algoritmo SHA256 por defecto para hacer el "hashing" de las contraseñas mucho más seguro.

Asignar un Algoritmo Nuevo
La definición del algoritmo que Solaris u OpenIndiana utilizará para "crypt", se encuentra definido en el archivo </etc/security/policy.conf>, para ello, modificaremos el valor de la propiedad <CRYPT_DEFAULT> y pondremos un valor definido en el archivo de configuración </etc/security/crypt.conf>, veamos un ejemplo.

Vamos a definir que Solaris/OpenIndiana utilice como algoritmo SHA512, que, según el archivo </etc/security/crypt.conf> corresponde con el valor "6", por lo tanto,
root@openzooey:/# cat /etc/security/crypt.conf 
# The algorithm name __unix__ is reserved.

1       crypt_bsdmd5.so.1
2a      crypt_bsdbf.so.1
md5     crypt_sunmd5.so.1
5       crypt_sha256.so.1
6       crypt_sha512.so.1
root@openzooey:/# vi /etc/security/policy.conf
  ...
  CRYPT_DEFAULT=6
  ...

:wq
Por último, cambiamos la contraseña de nuestro usuario, en mi caso <webope>
root@openzooey:/# passwd webope
New Password:
Re-enter new Password:
passwd: password successfully changed for webope
root@openzooey:/# cat /etc/shadow |grep webope
webope:$5$5TGOqra.$WjEbK0J.v.9SjU61cYUrJmtaz3UuHS/FoE.CXApNF05:14920::::::

Longitud Mínima, Historial y Formato de contraseñas
La definición de las propiedades de la contraseña, es decir, longitud, formato, historial, etc. se encuentra definida en el archivo < /etc/default/passwd>.
Vamos a ver cómo podemos hacer nuestra política de contraseñas más segura incluyendo:
  • PASSLENGTH. Longitud Mínima, 8
  • MINALPHA. Letras, 2
  • MINDIGIT. Números, 2
  • MINSPECIAL. Caracteres Espaciales, 1
Editamos el archivo </etc/default/passwd> con esto valores, y comprobamos su funcionamiento
root@openzooey:/# vi /etc/default/passwd
  MINALPHA=2
  MINDIGIT=2
  MINSPECIAL=1
  NAMECHECK=YES
  PASSLENGTH=8
:wq
Una cosa importante a tener en cuenta, es que, como en muchas situaciones en Solaris, el usuario <root> puede hacer lo que quiera, y esta es una de ellas.

Me explico, por ejemplo, si he cambiado la política de contraseñas con los valores anteriores, teóricamente no puedo asignar la password <1234> -ya que incumple todas: longitud, digitos, caracteres especiales, etc.

Sin embargo, si yo lo hago con <root> no tendré ningún problema, por ejemplo:
root@openzooey:/# passwd test
New Password: test
Re-enter new Password: test
passwd: password successfully changed for test
Pero si lo intento con el usuario
root@openzooey:/# su - test
OpenIndiana     SunOS 5.11      oi_147  September 2010
test@openzooey:~$ passwd test
Enter existing login password: testNew Password: hola
passwd: Password too short - must be at least 8 characters.

Please try again
New Password: ^C
Utilizar un Diccionario
Por último, tenemos la posibilidad de utilizar un diccionario de contraseña para evitar que nuestros usuarios no sean creativos con sus contraseñas, :D.

Deberemos descomentar la opción <DICTIONDBDIR=/var/passwd> del archivo de configuración </etc/default/passwd> para indicarle al comando <passwd> que su diccionario está en </var/passwd>.

Este path es configurable, es decir, podemos asignar el que queramos, sin embargo, </var/passwd> es el path que Solaris utiliza por defecto
Para ello, utilizaremos el comando <mkpwdict> que tiene el siguiente formato:
# mkpwdict -s file1,file2,filen -d destino
Donde file1, file2, filen serán archivos que contienen la lista de palabras sobre las cuales vamos a crear el diccionario, y <destino> el lugar donde lo almacenaremos. Si no ponemos ningún destino, se utilizará el asignado en <DICTIONDBDIR>.

Comprobamos que está descomentada la opción DICTIONDBDIR del archivo </etc/default/passwd>, si no fuese así deberíamos descomentarla.
root@openzooey:/# cat /etc/default/passwd |grep DICTIONDBDIR|grep -v ^#
DICTIONDBDIR=/var/passwd
A continuación nos creamos un archivo con las palabras sobre las cuales queremos crear el diccionario, por ejemplo:
root@openzooey:/# vi /tmp/words
rootROOT
testTEST
12345678
qwerty12
abcdefgh
1234abcd
1234ABCD
Creamos el diccionario y probamos
root@openzooey:/# mkpwdict -s /tmp/words
mkpwdict: using default database location: /var/passwd.

root@openzooey:/# passwd test
New Password: test
Re-enter new Password: test
passwd: password successfully changed for test
root@openzooey:/# su - test
OpenIndiana     SunOS 5.11      oi_147  September 2010
test@openzooey:~$ passwd test
Enter existing login password: test
New Password: 1234ABCD
passwd: password is based on a dictionary word.

Please try again
New Password: ^C

Conclusiones

Aunque las versiones de Solaris 10, 9, 8 venían con una configuración muy baja en cuanto a temas de seguridad, en OpenIndiana, y, recientemente en Solaris 11 han mejorado mucho este tema.

Principalmente el algoritmo UNIX ya no es el usado por defecto, además de incluir una longitud mínima, aunque todavía no incluyen un diccionario por defecto.

Espero que con estas pequeñas aclaraciones, podamos mejorar la seguridad de nuestros sistemas Solaris y así hacerlo más "Rock Solid" todavía,


Referencias

No hay comentarios:

Publicar un comentario en la entrada