martes, 14 de enero de 2014

Exchange 2010 + nginx reverse proxy + Clientes Outlook 2011 Mac

Parece que la conexión de los clientes Outlook a Exchange da problemas con la autenticación de usuario, con el añadido de que usar un proxy inverso para filtrar las solicitudes elimina ciertas cabeceras necesarias. Al intentar configurar un cliente, fallaba la autenticación en la mayoría de los casos, aunque en alguno de los intentos se crease la cuenta en el Outlook 2011, nunca sincronizaba.

Para la configuración de Outlook es necesario especificar la dirección del servidor Exchange 2010, con la ruta al Exchange Web Services. El resto de parámetros son los comunes: dirección de email, usuario del dominio y contraseña. En los ejemplos, utilizaremos correo.dominio.com como FQDN del servidor.

La dirección típica del EWS es https://correo.dominio.com/ews/exchange.asmx . Ojo porque en la autoconfiguración hay ocasiones en las que el nombre del subdirectorio está escrito en mayúsculas (EWS) y eso puede generar problemas en el entorno case-sensitive del proxy inverso. 

En primer lugar, es necesario activar la autenticación básica. Tenemos que acceder a la administración de IIS del servidor Exchange, y en Default Web Site encontraremos el sitio de EWS. Buscamos la sección IIS -> Autenticación.


Hemos de modificar el parámetro para que la autenticación básica esté Habilitada.


Tras este cambio, procedemos a reiniciar el IIS con el comando iisreset desde una línea de comandos con privilegios.


Para hacer la prueba, intentaremos acceder en local al directorio /ews/exchange.asmx y se debería mostrar un documento XML.

Si la prueba es satisfactoria, el equipo ya se podrá conectar en local al Exchange y autenticarse como es debido, pero en nuestra infraestructura contamos con un servidor proxy inverso nginx que hay que configurar para que deje pasar ciertas cabeceras al Exchange cuando se intenta acceder al mismo desde el exterior.

Accederemos por SSH al servidor ngnix y editaremos el site relacionado con el Exchange (owa):


nano /etc/nginx/sites-enabled/owa


En este fichero, vamos a añadir una sección location /ews para el subdirectorio EWS:

server {
        listen       80;
        server_name correo.dominio.com;
        server_name autodiscover.dominio.com;

        # Redirect any HTTP request to HTTPS
        rewrite ^(.*) https://correo.dominio.com$1 permanent;

        error_log  /var/log/nginx/owa-error.log;
        access_log /var/log/nginx/owa-access.log;
}

server {
        listen       443;
        server_name correo.dominio.com;
        server_name autodiscover.dominio.com;

        # Redirect from "/" to "/owa" by default
        #rewrite ^/$ https://correo.dominio.com/owa permanent;

        # Enable SSL
        ssl                     on;
        ssl_certificate         /etc/nginx/ssl.crt/server.crt;
        ssl_certificate_key     /etc/nginx/ssl.key/server.key;
        ssl_session_timeout     5m;

        # Set global proxy settings
        proxy_read_timeout      360;
        proxy_pass_header       Date;
        proxy_pass_header       Server;
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

        location /      { proxy_pass http://192.168.2.2; }
#      location /owa      { proxy_pass http://192.168.2.2/owa; }
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

        location /      { proxy_pass http://192.168.2.2; }
#        location /owa      { proxy_pass http://192.168.2.2/owa; }
#        location /rpc      { proxy_pass http://192.168.2.2/rpc; }
#        location /Microsoft-Server-ActiveSync { proxy_pass http://192.168.2.2/Microsoft-Server-ActiveSync; }

        location /ews {
            proxy_http_version      1.1;
            proxy_pass_request_headers on;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            more_set_input_headers  'Authorization: $http_authorization';
            proxy_set_header  Accept-Encoding  "";
            proxy_pass              https://192.168.2.2/ews;
            proxy_redirect          default;
            #headers-more mod needed
            more_set_headers        -s 401 'WWW-Authenticate: Basic realm="correo.dominio.com"';
    }
        error_log /var/log/nginx/owa-ssl-error.log;
        access_log /var/log/nginx/owa-ssl-access.log;

}

(En negrita la sección añadida, ojo con los saltos de línea!)

Para que el parámetro more_set_headers funcione, necesitamos el módulo headers-more incluído en el paquete nginx-extras de Debian.

No hay comentarios:

Publicar un comentario en la entrada