FTP basado en IIS 6.0

Windows Server 2008 trae por defecto FTP basado en IIS 6.0 (a pesar de usar por defecto IIS 7.0). Esta chapuza nos viene bien, puesto que se plantean algunos problemas técnicos cuya solución nos servirá para aprender algunas cosas interesantes. De todos modos, una vez hayamos terminado con FTP basado en IIS 6.0, veremos FTP 7.

CONFIGURAR UN SERVIDOR FTP

FTP permite la transferencia de archivos a través de la red, controlando entre otras cosas los permisos sobre los archivos remotos. Para añadir el servicio FTP al servidor, solo hay que añadir el servicio de función FTP en la función IIS, que añadimos anteriormente para habilitar el servicio web.

En Windows Server 2008, el servicio FTP es controlado por el administrador de IIS 6.0, lo que significa que para administrar el servicio, tendremos que abrir el administrador de IIS 6.0. De todas formas creo que hay alguna actualización que soluciona esto.

INSTALAR EL SEVIDOR FTP

Desde del administrador del servidor, seleccionamos la función IIS, y añadimos el servicio de función FTP (suponiendo que ya hemos instalado la función IIS).

CREAR UN SITIO FTP

Los primero que vamos a hacer nada más instalado el servicio FTP, es crear un nuevo sitio FTP. Se pueden configurar sitios FTP independientes o relacionarlos con sitios web ya existentes. Esto último es especialmente interesante en servicios de hosting para permitir a los usuarios subir archivos a su sitio.

Para crear un sitio FTP, seguiremos los siguientes pasos:

  1. Abrimos el administrador de IIS desde las herramientas administrativas.
  2. En el panel izquierdo, expandir el nodo del servidor y seleccionar la entrada "Sitios FTP". Dependiendo de la versión de Windows Server, el servicio FTP puede que sea administrado por el administrador de IIS 6.0. En tal caso tendremos un enlace a dicha consola de administración. Si este no es el caso, habría que pasar directamente al paso 4.
  3. Una vez en el panel de control de IIS 6.0 para FTP, desplegar el nodo del servidor, colocarse sobre la entrada "Sitios FTP". Hacer clic derecho sobre "Sitios FTP", y elegir "nuevo sitio".
  4. En los pasos siguientes hay que proporcionar cierta información, como una descripción textual del sitio, así como la IP de escucha y el puerto que se empleará (en principio el puerto 21).
  5. Después debemos indicar si se desa aislar a los usuarios o no. El aislamiento de usuarios permite que cada usuario tenga una visión reducida del sitio FTP. Cada uno podrá acceder solo a su directorio, sin poder ver los directorios de los otros usuarios. Esta opción es típica en los servicios de hosting, donde un mismo servidor FTP ofrece para cada usuario un directorio aislado de los otros, para que pueda gestionar los archivos de su web, sin interferir con los sitios web de los otros usuarios. El modo de aislamiento, ofrece tres posibilidades (posteriormente no es posible cambiar la modalidad de aislamiento):
    • No aislar usuarios: No se aisla a los usuarios, de forma que todos tienen la misma visión del sitio, aunque tengan diferentes permisos sobre los recursos.
    • Aislar usuarios: Se autentican a los usuarios contra cuentas locales o de dominio, antes de darles acceso a uno u otro directorio individual.
    • Aislar a los usuarios mediante Active Directory: Se autentican los usuarios contra un contenedor de Active Directory en lugar de realizar la buśqueda en todo contenido de Active Directory.
  6. A continuación hay que indicar el "directorio particular de sitio FTP", que es el directorio raíz del sitio. Habilitar los permisos de lectura y escritura del sitio.

INICIAR UN SITIO

No es posible iniciar dos sitios FTP en el mismo servidor utilizando el mismo puerto. Por ello, si existe un sitio FTP (aunque sea el sitio por defecto) que esté empleando el puerto 21, no se podrán iniciar más sitios FTP en la misma IP. Es posible iniciar varios sitios, siempre y cuando se emplee para cada uno un puerto o una IP distinta. Obviamente, para utilizar una IP diferente para cada sitio, debemos disponer de más de una interfaz de red. Para utilizar puertos diferentes, basta con indicar qué puerto se usará durante la configuración del sitio. El inconveniente de emplear diferentes puertos, es que el usuario debe estar informado de ello.

ACCESO DE LOS USAURIOS A SUS DIRECTORIOS

Es habitual combinar FTP con el servicio de web. Por ello, parto de la hipótesis de que se ha elegido el modo de aislamiento "Aislar usuarios". Ahora supongamos que el directorio raíz del sitio es C:\inetpub\wwwroot.

NOTA: He elegido esta ubicación porque resulta muy gráfico el uso simultáneo del servidor web y del servidor FTP. Pongamos que los diferentes usuarios del servidor FTP son en realidad propietarios de diferentes sitios web. Así pues, ya que hay varios sitios web alojados en el servidor, cada usuario FTP accederá a su sitio FTP (para administrar los archivos de su sitio web) sin que ello implique acceder al sitio FTP de los otros usuarios.

Si hemos elegido la opción de aislamiento "Aislar usuarios", entonces el usuario local "user1" deberá tener su directorio en la siguiente ubicación:

C:\intepub\wwwroot\LocalUser\user1\

Al tener la configuración de aislamiento "Aislar usuarios", el servidor FTP comprende que debe buscar el directorio del usuario "user1" dentro del directorio "LocalUser". Del mismo modo, el usuario "user2" tendrá su directorio en C:\inetpub\wwwroot\LocalUser\user2\.

Debemos crear manualmente estos directorios, uno por cada usuario que se conectará al servicio, y como es evidente, habrá que dar permisos de escritura al usuario si se desea que pueda subir archivos a su directorio FTP.

USO DE DIRECTORIOS VIRTUALES CON SITIOS FTP

Los directorios virtuales en los sitios FTP permiten crear alias que desde el punto del usuario son directorios, pero que en realidad enlazan con otra ubicación física distinta. Todo es transparente para el usuario, de modo que mientras que él piensa que está accediendo a un directorio ubicado físicamente bajo la raíz del sitio FTP, en realidad puede encontrarse fuera de la raíz del sitio, o incluso en otro servidor distinto. Cuando se crea un directorio virtual, hay que indicar la ruta al directorio, o la ruta UNC en caso de encontrarse en otro servidor.

Veamos un ejemplo:

El usuario se conecta a ftp://unsitioFTP/. Al hacer esto accede al directorio raíz C:\inetpub\Ftproot\. Una vez dentro, entra dentro del directorio ftp://unsitioFTP/RRHH/. Desde el punto de vista del usuario, el directorio RRHH está dentro de C:\inetpub\Ftproot\. Pero se trata de un directorio virtual configurado en el sitio FTP, de modo que podría estar en realidad en C:\recursos-humanos, o en \\otroservidor\Human-Resources\.
De este modo, cuando el usuario se conecta al sitio FTP (pongamos que se trata de ftp://unsitioFTP/), estará inicialmente en el directorio raíz del sitio, es decir, /.
Si conoce bien la estructura del sitio, podrá entrar en el directorio virtual RRHH, accediendo a /RRHH/.

CONVERTIR UN SITIO FTP EXISTENTE AL MODO AISLAR USUARIOS

No es posible cambiar el modo de aislamiento de un sitio una vez que ya ha sido creado. Habrá que crear otro sitio con el modo de aislamiento apropiado.

SITIOS CON ACCESO ANÓNIMO

Un usuario anónimo accede al servicio FTP sin indicar usuario ni contraseña.

Si durante la creación del sitio, decidimos que deseamos que haya acceso de usuarios anónimos al servidor, debermos indicarlo en la configuración del sitio. En principio el usuario encargado de representar al usuario anónimo en el servidor, será IUSR_NOMSERV (donde NOMSERV es el nombre del servidor), aunque podemos cambiar esto. Podemos tener un usuario creado para tal efecto, e indicarlo en la configuración del sitio (es decir, indicar que permitimos accesos anónimos con la cuenta elegida). Para el usuario anónimo, debemos crear un directorio especial ubicado en el directorio "LocalUser" comentado anteriormente. El directorio se llamará "Public". De modo, que si el directorio raíz del sitio es C:\inetpub\ftproot\, entonces el usuario anónimo estará en C:\inetpub\ftproot\LocalUser\Public\.

Para dar acceso anónimo, en las propiedades del sitio, abrimos la pestaña "Cuentas de seguridad". Allí indicaremos como qué usuario local se logueará aquel usuario que no ponga usuario ni contraseña. Obviamente, debemos dar permisos a la carpeta Public para que el usuario anónimo pueda trabajar allí.

Actividad 1. Combina lo que has aprendido con IIS sobre el servicio de web y FTP para conseguir lo siguiente:

  1. Crea un par de sitios web en tu servidor. Alójalos en directorios diferentes. Por ejemplo:
    • El sitio web "www.sitio1.net" estará en C:\inetpub\wwwroot\LocalUser\sitio1\
    • El sitio web "www.sitio2.com" estará en C:\inetpub\wwwroot\LocalUser\sitio2\
  2. Coloca en cada uno de estos sitios un archivo llamado "index.html" que contenga un texto que identifique el sitio.
  3. Añade al fichero "hosts" (en windows está en C:\Windows\System32\Drivers\etc\hosts y en linux en /etc/hosts) una entrada para cada sitio, para poder resolver los nombres www.sitio1.net y www.sitio2.com.
  4. Crea un usuario para administrar cada sitio via FTP. Por ejemplo, el usuario sitio1 para www.sitio1.net y el usuario sitio2 para www.sitio2.com.
  5. Crea un sitio FTP que se llame WebSrv. Asigna al sitio el modo "Aislar usuarios". El directorio raíz del sitio FTP será C:\inetpub\wwwroot\
  6. Administra los sitios web via FTP haciendo las siguientes tareas:
    • Sube por FTP a www.sitio1.net un nuevo archivo "index.html" con un enlace a "www.google.com". Comprueba que puedes acceder al archivo.
    • Sube por FTP a www.sitio2.com un nuevo archivo "index.html" con un enlace a "www.hotmail.com". Comprueba que puedes acceder al archivo.

CAPTURA: 1. Subida del archivo "index.html" del apartado 6 a www.sitio1.net. 2. Subida del archivo "index.html" del apartado 6 a www.sitio2.com. 3. Carga desde el navegador web de http://www.sitio1.net/index.html. 4. Carga desde el navegador web de http://www.sitio2.com/index.html

Actividad 2. Crea un nuevo sitio FTP, pero esta vez escuchando en el puerto 88. Este nuevo sitio tendrá el modo de aislamiento "No aislar usuarios". En este nuevo sitio deberás habilitar el acceso anónimo. Accede al nuevo sitio empleando el usuario anónimo.

CAPTURA: 1. Acceso anónimo al nuevo sitio FTP.

FTP EN MODO PASIVO

Desde siempre, FTP ha sido un protocolo que se ha llevado mal con los firewalls. La razón es que FTP utiliza dos conexiones TCP en vez de una sola como otros protocolos. Las conexiones responden a un canal de comandos (correspondiente al puerto 21 del servidor) y un canal de datos (correspondiente al puerto 20 del servidor). La confusión se debe a que el canal de datos no siempre utiliza el puerto 20 del servidor.

FTP ACTIVO

Cuando el servidor emplea el modo activo, el cliente se conecta desde un puerto aleatorio no privilegiado (por encima del puerto 1023) al puerto 21 del servidor. Pongamos que el puerto empleado por el cliente es el puerto N. Entonces, el cliente escucha en el puerto N+1, esperando que el servidor inicie la conexión de datos, procedente del puerto 20.

El modo activo NO es una buena idea si el usuario se encuentra en una red protegida por un firewall, o si está detras de un router que hace NAT.

En el servidor, basta con que el puerto 21 esté abierto y que se permita iniciar una conexión desde el puerto 20. Si nos referimos a Windows Server 2008, si el cliente inicia una conexión FTP en modo activo, en principio no debe haber ningún problema. Es decir:

Cliente Servidor TCP 1029 ----------------> TCP 21 Cliente envía comando PORT 1030 al servidor. TCP 1029 <---------------- TCP 21 Servidor confirma comando PORT mediante un ACK TCP 1030 <---------------- TCP 20 Servidor inicia conexión de datos al puerto 1030 del cliente TCP 1030 ----------------> TCP 20 Cliente confirma confirma mediante TCP ACK

Vamos a ver una sesión FTP de ejemplo:

ftp -d 192.168.1.102 Connected to 192.168.1.102. 220 Microsoft FTP Service ftp: setsockopt: Bad file descriptor Name (192.168.1.102:un-usuario-ftp): un-usuario-ftp ---> USER un-usuario-ftp 331 Password required for un-usuario-ftp. Password: ---> PASS XXXX 230 User un-usuario-ftp logged in. ---> SYST 215 Windows_NT Remote system type is Windows_NT. ftp> ls ftp: setsockopt (ignored): Permission denied ---> PORT 192,168,1,104,218,12 200 PORT command successful. ---> LIST 150 Opening ASCII mode data connection for /bin/ls. 02-15-11 05:47PM 3644 favicon.png 02-15-11 06:02PM 1143 index.html 226 Transfer complete. ftp> quit ---> QUIT 221

Vamos a describir esto:

La sesión es iniciada desde una máquina linux con la IP 192.168.1.104, ejecutando el cliente ftp estándar desde la línea de comandos, hacia el servidor 192.168.1.102, un servidor Windows 2008 Server, ejecutando el servidor FTP de IIS. La opción -d del comando es usada para que el cliente FTP muestre de forma detallada las acciones llevadas a cabo durante la sesión.

Hasta la línea anterior a "fpt> ls", todo el tráfico se produce en el canal de comandos al puerto 21. Cuando el usuario ejecuta el comando "ls", el cliente envía el comando PORT 192, 168, 1, 104, 218, 12 al servidor. Los primeros 4 número son la IP del cliente. Los dos últimos números son el puerto en que el cliente escuchará esperando la conexión para el canal de datos por parte del servidor. Dicho puerto se calcula del siguiente modo: 218*256 + 12 = 55826. Es decir, el cliente abre este puerto esperando la conexión del servidor, desde el puerto "ftp-data" (20).

Echa un vistazo a todo esto mediante wireshark.

FTP PASIVO

Como ya he dicho, la conexión ACTIVA puede ser un problema por el hecho de que el servidor inicie la conexión con el cliente. Para solucionar esto, está la conexión pasiva, en la que el cliente envía el comando PASV, que indica al servidor que dicho cliente está en modo pasivo.

En el modo pasivo, el cliente FTP inicia ambas conexiones al servidor, resolviendo el problema de que un firewall filtre la conexión entrante al cliente desde el servidor. Cuando se abre la conexión FTP, el cliente abre dos puertos no privilegiados (mayores a 1023). El primero de ellos (llamémoslo N) contacta con el servidor en el puerto 21, pero en este caso no envía el comando PORT, sino que envía el comando PASV. Como respuesta, el servidor abre un puerto aleatorio no privilegiado (superior a 1023) y envía el comando PORT al cliente. El comando PORT tiene la misma estructura que el explicado en el apartado anterior. El cliente determina el puerto al que debe atacar para establecer el canal de datos, e inicia la conexión desde el puerto N+1.

El problema es el siguiente: para permitir el modo pasivo, el servidor debe tener accesible desde el exterior el puerto indicado en el comando PORT. Es decir:

Cliente Servidor TCP 1029 ----------------> TCP 21 Cliente envía comando PASV al servidor. TCP 1029 <---------------- TCP 21 Servidor confirma comando PASV mediante un ACK y además indica el puerto en el que espera la conexión (pongamos 5503) TCP 1030 ----------------> TCP 5503 Cliente inicia conexión de datos al puerto especificado por el servidor TCP 1030 <---------------- TCP 5503 Servidor confirma confirma mediante TCP ACK

Vamos a ver una sesión FTP de ejemplo:

ftp -d 192.168.1.102 Connected to 192.168.1.102. 220 Microsoft FTP Service ftp: setsockopt: Bad file descriptor Name (192.168.1.102:un-usuario-ftp): un-usuario-ftp ---> USER un-usuario-ftp 331 Password required for un-usuario-ftp. Password: ---> PASS XXXX 230 User un-usuario-ftp logged in. ---> SYST 215 Windows_NT Remote system type is Windows_NT. ftp> passive Passive mode on. ftp> ls ftp: setsockopt (ignored): Permission denied ---> PASV 227 Entering Passive Mode (192,168,1,102,21,129). ---> LIST 125 Data connection already open; Transfer starting. 02-15-11 05:47PM 3644 favicon.png 02-15-11 06:02PM 1143 index.html 226 Transfer complete. ftp> quit ---> QUIT 221

En este ejemplo, solo ha cambiado aparentemente una cosa. El puerto es ahora enviado por el servidor (en la línea "227 Entering Passive Mode (192,168,1,102,21,129)"). En este caso, la ip indicada es la del servidor (192.168.1.102), y el puerto indicado es 21*256+129 = 5505. Es decir, que el cliente inicia una conexión TCP al puerto 5505 del servidor.

Puedes comprobar esto mediante Wireshark.

WINDOWS SERVER 2008 Y FTP PASIVO

El puerto que el servidor abre para establecer el canal de datos es aleatorio. Esto hace muy difícil configurar el firewall sin abrir todos los puertos no privilegiados. Se pueden realizar dos cosas para resolver el problema:

  • Restringir los puertos que empleará FTP para datos a un rango específico.
  • Abrir solo estos puertos en el firewall.

RESTRINGIR LOS PUERTOS QUE EMPLEARÁ FTP PARA DATOS

El servidor FTP integrado en IIS 7.0 cuenta con un mecanismo para controlar esto (http://technet.microsoft.com/en-us/library/dd421710%28WS.10%29.aspx). Sin embargo, para el servidor FTP integrado en IIS 6.0 resulta un poco más laborioso:

  1. Instalar el siguiente servicio de función de IIS: "Herramientas de scripting de IIS 6".
  2. Abrir un símbolo del sistema, y dirigirse al directorio C:\inetpub\AdminScripts
  3. Ejecutar el comando siguiente:
  4. adsutil.vbs set /MSFTPSVC/PassivePortRange "5500-5700"
  5. Con este comando hemos indicado que el servidor deberá restringir los puertos para el modo pasivo a los número 5500 hasta 5700.
  6. Ahora ya podemos controlar mediante el firewall qué puertos abrir, comentado en apartado siguiente.

ABRIR LOS PUERTOS ESTABLECIDOS PARA FTP PASIVO

En el comando anterior hemos establecido que se emplearán 200 puertos para conexiones pasivas. Abrir puerto a puerto desde el 5500 hasta el 5700 es algo más que tedioso. Para ahorrar tiempo y dinero, podemos usar el siguiente comando:

for /L %i in (PUERTOINCIAL,1,PUERTOFINAL) do netsh firewall add portopening TCP %i "NOMBREPUERTO %i"

En nuestro caso, para los puertos 5500 a 5700 quedaría como:

for /L %i in (5500,1,5700) do netsh firewall add portopening TCP %i "FTP-PASV %i"

NOTA: Si queremos eliminar estas reglas, podemos utilizar el siguiente comando:
for /L %i in (PUERTOINCIAL,1,PUERTOFINAL) do netsh firewall delete portopening TCP %i

Es decir, para eliminar todos los puertos añadidos en el ejemplo anterior, podemos utilizar el comando siguiente:

for /L %i in (5500,1,5700) do netsh firewall delete portopening TCP %i

Práctica 3. Utiliza un cliente Windows con el firewall activado, o bien un cliente Linux nateado. Realiza las tareas necesarias para que el servicio FTP funcione en modo pasivo correctamente.

Capturas: 1. Esableciendo los puertos para conexiones pasivas en el servidor. 2. Configurando el firewall del servidor. 3. Conexión pasiva correcta utilizando un cliente ftp.

Saludos.