El
contenido del fichero /etc/passwd determina quien puede acceder al
sistema de manera legitima y que se puede hacer una vez dentro del
sistema. Este fichero es la primera linea de defensa del sistema contra
accesos no deseados. Debe de mantenerse escrupulosamente y libre de
errores y fallos de seguridad. En el tenemos registrados las cuentas de
usuarios, asi como las claves de accesos y privilegios.
Una linea ejemplo en este fichero:
usuario1:FXWUuZ.vwXttg:500:501:usuario pepito:/home/usuario1:/bin/bash
Los diferentes campos(7) estan separados por dos puntos (:) y el significado de los mismos es el siguiente:
usuario1:
Nombre de la cuenta (Login)
FXWUuZ.vwXttg:
Clave de acceso encriptada (password)
500:
UID de esta cuenta
501:
GID del grupo principal al que pertenece la cuenta
usuario pepito:
Nombre del usuario
/home/usuario1:
Directorio de trabajo de usuario1
/bin/bash:
Interprete de comando (shell) de usuario pepito
Una serie de reglas a tener en cuenta sobre el contenido de este fichero:
* El UID de cuenta 0, pertenece al administrador (root), por debajo de
UID 500 esta reservado para el sistema y por encima de UID 500 para los
usuarios del sistema (Nota: la frontera del 500 puede variar
dependiendo del sistema).
El GID del grupo principal esta definido en el archivo /etc/group y
este sera el grupo por defecto cuando un usuario crea un fichero.
No hace falta decir que solo el administrador del sistema tiene que
tener ID's 0 en estos dos campos. Lo contrario significaria estar dando
permisos de administracion (root) a la cuenta en cuestion.
Lo unico que identifica a una cuenta root del resto es una
identificacion UID igual a 0. Podemos tener por ejemplo una cuenta
llamada "pepito" pero con UID igual a 0, esta cuenta tendria permisos
de administrador (root) y muchos programas que hacen referencia al
nombre de la cuenta (ej: who, w, etc) no nos darian informacion sobre
que la cuenta "pepito" tiene permisos de root.
Esto es lo primero que un hacker suele hacer para instalar una puerta
trasera en un sistema. Para averiguar cuentas con nombre diferente de
root, pero permisos de root existen programas, pero a falta de uno
podemos utilizar el siguiente comando:
awk -F: '{if ($3==0) print $1}' /etc/passwd
Lo mismo (con un pequeno cambio) se puede utilizar para ver cuentas con GID igual a 0:
awk -F: '{if ($4==0) print $1}' /etc/passwd
* Es muy importante verificar asiduamente que toda cuenta (login) tiene
asignada una clave valida. Existen programas para comprobar que no
existen problemas de seguridad en /etc/passwd, pero a falta de uno se
puede utilizar el siguiente comando para averiguar si existen cuentas
sin claves:
awk -F: '{if ($2=="") print $1}' /etc/passwd
Nunca dejar una cuenta con el campo de clave vacio, esto significa que
no es necesario una clave para entrar en el sistema. Las cuentas de
pseudo-usuarios (ej: daemon, lp, etc) y cuentas de usuarios cerradas
temporalmente, tienen que tener un asterisco (*) en el campo de la
clave.
Otro punto a tener
en cuenta es la eleccion de una buena clave. No se deberian utilizar
claves que sean palabras de diccionario, nombres, datos personales,
matriculas, etc, existen programas que son capaces de descifrar este
tipo de claves. Utilizar al menos 7 caracteres (8 recomendable) e
interpolar numeros y letras, mayusculas y minusculas. Existen programas
que sustituyen el clasico "passwd" para crear/cambiar claves, que
comprueban que la clave es suficientemente buena.
La explicacion de porque no se deberian utilizar palabras de
diccionario, nombres, etc como claves de acceso, es la siguiente:
Cuando una clave es generada, esta, es codificada con la funcion
"crypt", esta funcion se puede definir como una funcion "hash" de una
sola direccion, esto es, un algoritmo que es facil de computar en una
direccion pero muy dificil de calcular en direccion opuesta. La funcion
crypt utiliza un valor aleatorio llamado "salt" el cual esta formado
por una cadena de dos caracteres [a-z A-Z 0-9 ./]. Este valor aleatorio
permite codificar una misma clave de 4096 maneras distintas (Los dos
primeros caracteres de una clave codificada, son los valores de "salt",
el resto hasta un total de 13 caracteres ASCII es la clave codificada
segun el valor de "salt").
Una vez que sabemos un poco de teoria de como las claves son
codificadas, nos podemos imaginar como se podria descifrar un clave de
cuenta que es un palabra de diccionario, nombre, matricula, etc.
Existen programas que codifican sistematicamente diccionarios de
palabras de las 4096 maneras posibles (segun el valor "salt") y
comparan cada codificacion con los valores encriptados en /etc/passwd,
si algun valor coincide, significaria que una clave ha sido descifrada.
Este es uno de los metodos utilizados por hackers para descifrar claves
y la razon de porque no se deben utilizar claves que sean palabras de
diccionarios, nombres, etc.
* Nunca usar scripts/programas como interprete de comandos en cuentas
sin clave. Un ejemplo que lei una vez en un grupo de noticias, hablaba
sobre como apagar el ordenador sin necesidad de ser root. Una de las
soluciones que daban era el tener la siguiente linea en el fichero
/etc/passwd:
shutdown::0:0:shutdown:/sbin:/sbin/shutdown
Podeis ver que el campo de clave esta vacio, con esta linea en tu
/etc/passwd cualquier usuario, local o no local, puede apagar tu
ordenador haciendo un simple telnet a la maquina en cuestion y
escribiendo shutdown como login. No hace falta explicar las
consecuencias que esto puede tener para tu sistema. ;-)
* Los ficheros /etc/passwd y /etc/group deben tener permisos de lectura
para todos para que muchos programas puedan funcionar y permisos de
escritura solo para root.
-rw-r--r-- 1 root root 11594 Nov 9 12:53 /etc/passwd
-rw-r--r-- 1 root root 1024 Nov 9 12:53 /etc/group
Con estos permisos, cualquiera que tenga acceso al sistema puede leer
el contenido de estos ficheros e intentar descifrar la clave encriptada
de las cuentas. En pequenos sistemas, donde todos los usuarios se
conocen y existe confianza entre ellos, esto no es un gran problema,
pero en sistemas con un gran numero de usuarios, no es recomendable
tener el sistema configurado de esta manera.
Para evitar esto se puede instalar "Shadow passwords". Con shadow
passwords el fichero /etc/passwd puede ser leido por cualquier usuario
con acceso, pero la informacion con las claves del sistema queda
guardada en un fichero que solo puede ser leido por el administrador
(root). Mas informacion sobre Shadow Password en el Howto
correspondiente Shadow password HOWTO (ingles)