Identificar usuario |
[ Sistemas operativos / Linux ] |
Siempre me ha llamado la atención que muchos servidores de FTP demuestran saber qué usuario eres en la máquina desde la que te conectas. ¿Cómo lo hacen? Me gustaría que mis programas de red también fueran capaces de hacerlo, por motivos de seguridad. ¿La técnica es segura o se puede engañar fácilmente al servidor FTP? |
Juan Carlos Giménez |
Se logra preguntando a un servidor TCP que se ejecuta en el puerto 113 de la máquina del usuario. El servidor se llama identd y se comunica con el otro extremo mediante un protocolo llamado Identification Protocol. Anteriormente se conocía como "protocolo de autentificación de servidores", pero se cambió su nombre porque realmente no es un protocolo de autentificación seguro. Este protocolo se describe en el RFC 1413, que data de 1993 y es muy simple. Veamos un ejemplo. Supongamos que nuestra máquina tiene como IP 192.10.0.1 y ejecuta un servidor telnet en el puerto 23 al que se conecta un usuario desde el puerto 20570 de la máquina IP 192.10.0.2. El modo que hemos tenido de averiguar la IP y puerto de origen ha sido un simple netstat -t, que nos muestra todas las conexiones TCP en curso. A veces no sale el número de puerto sino el nombre del servicio, como es este caso de telnet. Si no supiéramos que el puerto de telnet es el 23, lo podíamos haber descubierto mirando en el fichero /etc/services O aún más fácil, añadiendo a netstat la opción -n para que muestre siempre las IP y puertos como números aunque correspondan a un servicio conocido. Para averiguar la identidad del usuario en la máquina 192.10.0.2, conectamos a su puerto 113 con un simple telnet, tecleamos 20570,20 y pulsamos Enter. Si el usuario que conectó desde esa máquina a la nuestra entró en ella como "fulanito", la respuesta a nuestra orden será algo parecido a: 20570 , 20 : USERID : UNIX :fulanito El primer campo es lo mismo que hemos pasado en la petición, luego irá USERID si hubo éxito (ERROR si no), a continuación el sistema operativo y finalmente el nombre del usuario. El sistema operativo suele ser Unix, aunque por ejemplo en Red Hat 7 se ha configurado con la opción -o al servidor identd para que use OTHER en lugar de UNIX. En caso de error, el tercer campo especifica el motivo: INVALID-PORT si el puerto no es válido, NO-USER si el puerto no está en uso, HIDDEN-USER si no quiere decirnos el usuario y UNKNOWN-ERROR para cualquier otro supuesto. El servidor no cierra normalmente la conexión, sino que espera a que la cerremos nosotros o a que le hagamos más peticiones (aunque tiene un tope de espera). En tu programa lo único que tendrías que tener en cuenta es que el puerto e IP de origen de una conexión es información que rellena el sistema operativo al hacer la llamada accept. En concreto, en la estructura sockaddr que le pasas en el segundo parámetro. Si fuera al revés (quieres saber el usuario que ejecuta el servidor al que te conectas) obtendrías el puerto local que te ha asignado el sistema operativo tras hacer connect mediante la llamada getsockname. Si tu servidor es vía inetd, no tienes que crear ningún socket ni ejecutar accept: lees directamente de la entrada estándar y escribes en la salida para comunicarte con el cliente. En ese caso la forma de obtener la dirección del otro lado es con getpeername. Respecto a si es fácil burlar esta comprobación, la respuesta es que conviene basar la seguridad de un servicio en él. El propio RFC que lo define sugiere no utilizarlo para autentificación, sino en todo caso para complementar la auditoría. Para empezar, no todas las máquinas cliente lo ejecutan: en sistemas monousuario como Windows no resulta muy útil y en máquinas Unix hay administradores que lo desactivan por cuestiones de privacidad. En equipos en los que sea posible hacerse con el root, como los PCs de un laboratorio en una universidad, el usuario puede falsear la respuesta. Realmente sólo tiene valor en una red no comprometida con máquinas en las que la cuenta del superusuario está bajo control. Aprovechamos para comentar una pequeña cuestión de interés para las personas que modifican el contenido del fichero /etc/issue.net, para que al hacer un telnet el login no informe de la distribución y del kernel instalado. En algunas distribuciones como en Red Hat, identd se ejecuta con la opción -e. Esta opción tiene como efecto paralelo que si tecleamos version nos muestra la versión del programa con información sobre el sistema operativo para el que ha sido compilado. |
Anterior Siguiente |
© 2002 VNU Business Publications España. Queda terminantemente prohibida su reproducción total o parcial por cualquier medio sin el permiso explicito y por escrito del propietario del copyright. |