 
 
 
 
 
 
 
  
 Siguiente: El sistema de parcheado
 Subir: Solaris
 Anterior: Servicios de red
     Índice General 
Durante la instalación de Solaris se crean en /etc/passwd una serie de
entradas correspondientes a usuarios considerados `del sistema' (adm, bin, nobody...); ninguno de estos usuarios tiene por qué 
acceder a la máquina, de forma que una buena política es bloquear sus 
cuentas. Podemos comprobar qué usuarios tienen el acceso bloqueado consultando
el estado de su contraseña: si es `LK' (locked), la cuenta está
bloqueada:
anita:/# passwd -s -a|grep LK
daemon  LK    
bin  LK    
sys  LK    
adm  LK    
lp  LK    
uucp  LK    
nuucp  LK    
listen  LK    
nobody  LK    
noaccess  LK    
nobody4  LK    
anita:/#
Podemos bloquear una cuenta de acceso a la máquina mediante `passwd -l',
de la forma siguiente:
anita:/# passwd -s  toni
toni  PS    06/15/01    7  7  
anita:/# passwd -l toni
anita:/# passwd -s  toni
toni  LK    06/27/01    7  7  
anita:/#
A pesar de su estado, las cuentas bloqueadas son accesibles si ejecutamos la
orden `su' como administradores, por lo que si estamos bastante 
preocupados por
nuestra seguridad podemos asignarles un shell que no permita la 
ejecución de órdenes, como /bin/false10.6:
anita:/# su - adm
$ id
uid=4(adm) gid=4(adm)
$ ^d
anita:/# passwd -e adm
Old shell: /bin/sh
New shell: /bin/false
anita:/# su - adm
anita:/# id
uid=0(root) gid=1(other)
anita:/#
Si realmente somos paranoicos, de la lista de usuarios que hemos visto antes 
incluso nos 
podemos permitir el lujo de eliminar a nobody4, ya que se trata de una 
entrada que existe para proporcionar cierta compatibilidad entre Solaris y 
SunOS que actualmente apenas se usa. No obstante, muchísimo más 
importante que esto es eliminar o bloquear a cualquier usuario sin contraseña
en el sistema; es recomendable comprobar de forma periódica que estos usuarios
no existen, para lo cual también podemos utilizar `passwd -s -a' y
vigilar las claves cuyo estado sea `NP' (No Password):
anita:/# passwd -s -a|grep NP
prueba  NP
anita:/# passwd -l prueba
anita:/#
Tras estas medidas de seguridad iniciales, lo más probable es que en 
nuestro sistema comencemos a dar de alta usuarios reales; sin duda, lo primero
que estos usuarios tratarán de hacer es conectar remotamente vía telnet:
rosita:~$ telnet anita
Trying 192.168.0.3...
Connected to anita.
Escape character is '^]'.
SunOS 5.8
login: toni
Password: 
Last login: Fri Jun 22 10:45:14 from luisa
anita:~$
A estas alturas ya debemos saber que es una locura utilizar telnet para
nuestras conexiones remotas por el peligro que implica el tráfico de 
contraseñas en texto claro, por lo que debemos obligatoriamente utilizar
SSH o similar. Si de cualquier forma no tenemos más remedio que 
permitir telnet (no encuentro ningún motivo para ello, y personalmente 
dudo que los haya...), quizás nos interese modificar el banner de 
bienvenida al sistema, donde se muestra claramente que la máquina tiene 
instalada una versión concreta de Solaris: esto es algo que puede ayudar a un
pirata que busque información de nuestro sistema. Para cambiar el mensaje
podemos crear el archivo /etc/default/telnetd, en el que la entrada `BANNER' especifica dicho mensaje:
anita:/# cat /etc/default/telnetd 
BANNER="\nHP-UX anita A.09.05 E 9000/735 (ttyv4)\n\n" 
anita:/# telnet 0
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
HP-UX anita A.09.05 E 9000/735 (ttyv4)
login:
Algo similar se puede hacer con el fichero /etc/default/ftpd para el
servicio de FTP, aunque de nuevo dudo que haya algún motivo para 
mantenerlo abierto; estos mensajes evidentemente no van a evitar que alguien
pueda obtener datos sobre el sistema operativo que se ejecuta en una máquina 
(veremos al hablar del sistema de red en Solaris como conseguir esto), pero al 
menos no le dejarán esa información en bandeja.
Siguiendo con las conexiones remotas a un sistema, uno de los aspectos que 
nos puede llamar la atención si estamos comenzando a trabajar con Solaris es 
que el usuario root sólo puede conectar desde la propia consola de la
máquina; si lo intenta de forma remota, se le negará el acceso:
luisa:~$ telnet anita
Trying 192.168.0.3...
Connected to anita.
Escape character is '^]'.
login: root
Password: 
Not on system console
Connection closed by foreign host.
luisa:~$
Esto es debido a que el parámetro `CONSOLE' tiene como valor dicha consola (/dev/console) en el fichero 
/etc/default/login; para trabajar como superusuario de forma remota es
necesario acceder al sistema como un usuario sin privilegios y después 
ejecutar el comando su. Esta forma de trabajo suele ser la más 
recomendable, ya que ofrece un equilibrio aceptable entre seguridad y 
funcionalidad; no obstante, si nos interesara que root pudiera conectar 
directamente de forma remota (no suele ser recomendable), podríamos 
comentar la entrada `CONSOLE' en el fichero anterior, mediante una 
almohadilla (`#'). Si por el contrario queremos que el administrador no 
pueda conectar al sistema
ni desde la propia consola, y sólo se puedan alcanzar privilegios de 
superusuario mediante la ejecución de su, podemos dejar la entrada
correspondiente a `CONSOLE' en blanco:
anita:/# grep -i console /etc/default/login
# If CONSOLE is set, root can only login on that device.
CONSOLE=
anita:/#
En el fichero anterior (/etc/default/login) existen otros parámetros
interesantes de cara a incrementar nuestra seguridad. Por ejemplo, el 
parámetro `TIMEOUT' indica el número de segundos (entre 0 y 900) que
han de pasar desde que la máquina solicita el login al conectar 
remotamente hasta que se cierra la conexión si el usuario no lo teclea; esto
nos puede ayudar a evitar ciertos ataques de negación de servicio, pero puede
ser un problema si tenemos usuarios que conecten a través de líneas de
comunicación lentas o muy saturadas, ya que con un timeout 
excesivamente bajo es posible que antes de que el usuario vea en su terminal
el banner que le solicita su login la conexión llegue a 
cerrarse.
Relacionada en cierta forma con el parámetro anterior, y también dentro 
del archivo 
/etc/default/login, la entrada `SLEEPTIME' permite
indicar el número de segundos - entre 0 y 5 - que han de transcurrir desde
que se teclea una contraseña errónea y el mensaje login incorrect
aparece en pantalla. Con `RETRIES' podemos especificar el número de
intentos de entrada al sistema que se pueden producir hasta que un proceso de 
login finalice y la conexión remota asociada se cierre: en otras 
palabras, indicamos el número de veces que un usuario puede equivocarse al
teclear su clave antes de que el sistema cierre su conexión.
Otra directiva interesante de /etc/default/login es `PASSREQ': si
su valor es `YES', ningún usuario podrá conectar al sistema sin 
contraseña, y si es `NO', sí que se permiten este tipo de entradas.
Evidentemente, el valor recomendable es el primero, aunque el incremento que 
conseguimos en nuestra seguridad no es excesivo y sólo se puede encontrar
útil en circunstancias muy concretas, ya que a los usuarios que no tengan
contraseña simplemente se les obligará a elegir un password al 
intentar entrar al sistema:
anita:~$ telnet 0
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
login: prueba
Choose a new password.
New password:
Si realmente queremos asegurarnos de que no tenemos usuarios sin clave podemos
ejecutar periódicamente la orden `logins -p', que nos 
mostrará los información acerca de los usuarios sin contraseña en la
máquina; si su salida es no vacía, tenemos un grave problema de 
seguridad:
anita:/# logins -p
prueba            107     staff           10      Usuari en proves
anita:/# passwd prueba
New password: 
Re-enter new password: 
passwd (SYSTEM): passwd successfully changed for prueba
anita:/# logins -p
anita:/#
Para finalizar con /etc/default/login, vamos a hablar de un par de
entradas en el fichero relacionadas con la auditoría de los accesos al
sistema: el parámetro `SYSLOG' con un valor `YES' determina si se 
han de registrar mediante syslog los accesos al sistema como root, 
así como los intentos de login fallidos, y el parámetro `SYSLOG/SMALL>_FAILED/SMALL>_LOGINS' indica el número de intentos de entrada 
fallidos que se han de producir antes de emitir un mensaje de error; es 
recomendable que esta segunda variable tenga un valor `0', que implica
que syslog registrará todos los intentos fallidos de login:
anita:/# grep -i ^syslog /etc/default/login 
SYSLOG=YES
SYSLOG_FAILED_LOGINS=0
anita:/#
Otro archivo interesante de cara a incrementar aspectos de la seguridad 
relacionados con los usuarios de nuestro sistema es /etc/default/passwd, donde se pueden definir parámetros para reforzar nuestra
política de contraseñas; por ejemplo, podemos definir una longitud 
mínima para los passwords de los usuarios dándole un valor a la 
variable `PASSLENGTH':
anita:/# grep -i passlength /etc/default/passwd 
PASSLENGTH=8
anita:/#
Por defecto, la longitud mínima de una clave es de seis caracteres; si le
asignamos a `PASSLENGTH' un valor menor (algo poco recomendable de 
cualquier forma), el sistema simplemente lo ignorará y obligará a los 
usuarios a utilizar passwords de seis o más caracteres. Además, sea
cual sea la longitud de las claves que definamos, debemos tener siempre en
cuenta que Solaris sólo interpetará los ocho primeros caracteres de 
cada contraseña; el resto son ignorados, por lo que dos passwords cuyos
ocho primeros caracteres sean iguales serán equivalentes por completo para el 
modelo de autenticación.
Una contraseña en Solaris debe poseer al menos dos letras (mayúsculas o
minúsculas) y al menos un número o carácter especial. Tampoco debe 
coincidir con el nombre de usuario, ni con rotaciones del mismo (por ejemplo el 
usuario `antonio' no podrá utilizar como clave `antonio', `ntonioa', `oinotna', etc.), y debe diferir del password 
anterior en al menos tres caracteres; para cualquiera de estos efectos 
comparativos, las letras mayúsculas y las minúsculas son equivalentes. 
Sólo el root puede adjudicar contraseñas que no cumplan las normas
establecidas, pero a efectos de seguridad es recomendable que las claves que 
asigne tengan tantas restricciones como las que pueden escojer los usuarios (o
más).
Volviendo de nuevo a /etc/default/passwd, dentro de este archivo 
tenemos un par de entradas útiles para establecer una política de 
envejecimiento de claves en nuestro sistema; se trata de `MAXWEEKS' y `MINWEEKS', que como sus nombres indican definen los tiempos de vida máximo y
mínimo (en semanas) de una contraseña. Un tercer parámetro, `WARNWEEKS', define el periodo de tiempo (de nuevo, en semanas) a partir del 
cual se avisará a un usuario de que su password está a punto de 
caducar; dicho aviso se produce cuando el usuario inicia una sesión:
rosita:~$ telnet anita
Trying 192.168.0.3...
Connected to anita.
Escape character is '^]'.
login: toni
Password: 
Your password will expire in 5 days.
Last login: Sun Jun 24 03:10:49 from rosita
anita:~$
Como no todo va a ser hablar bien de Unix a cualquier precio (aunque Solaris 
tiene muchos aspectos para hablar bien del operativo), podemos hacer un par de
críticas a mecanismos relacionados con las contraseñas en Solaris. En
primer lugar, quizás deja algo que desear la granularidad que nos ofrece para
el envejecimiento de claves: especificar los valores máximo y mínimo en
semanas a veces no es apropiado, y seguramente si Solaris nos permitiera indicar
dichos valores en días podríamos definir políticas más 
precisas; aunque en la mayoría de ocasiones la especificación en semanas
es más que suficiente, en casos concretos se echa de menos el poder indicar 
los días de vigencia de una contraseña. Otro aspecto que se podría
mejorar en Solaris es la robustez de las claves: limitarse a rotaciones del
nombre de usuario es en la actualidad algo pobre; un esquema como el ofrecido en
AIX, donde se pueden especificar incluso diccionarios externos al operativo 
contra los que comparar las claves que un usuario elige, sería mucho más
potente.
Contra el primero de estos comentarios quizás se podría decir, en 
defensa de Solaris, que realmente en /etc/shadow podemos especificar 
días en lugar de semanas, pero eso implicaría modificar el archivo
a mano para cada usuario, algo que no suele ser recomendable en ningún
sistema Unix, o bien ejecutar /usr/bin/passwd con las opciones
apropiadas, de nuevo para todos los usuarios en cuestión. Contra el segundo
también se podría argumentar que existen utilidades de terceros para 
reforzar las contraseñas que eligen los usuarios, o bien que no es 
difícil escribir un módulo de PAM para evitar que esos usuarios
elijan claves triviales, pero el hecho es que Sun Microsystems por defecto no 
incorpora ninguno de estos mecanismos en Solaris.
 
 
 
 
 
 
 
  
 Siguiente: El sistema de parcheado
 Subir: Solaris
 Anterior: Servicios de red
     Índice General 
2003-08-08