Esperienze di configurazione di un reverse proxy per accedere da Internet ad un server TFS.

Problema: Si vuole permettere l’accesso da Internet ad un server TFS situato in una rete locale in modo da consentire la continuità delle attività anche in un contesto extranet.

Vantaggi: lo sviluppatore può lavorare in totale mobilità localizzandosi dove meglio preferisce purchè connesso ad Internet; accesso ai dati di progetti al di fuori della rete locale; non dover usare la modalità di lavoro offline di Visual Studio

Svantaggi: si lavora troppo (ma come? Dopo l'abolizione della scala mobile la nuova moda lanciata dai sindacati  è quella di aumentare la produttività per riportare i salari italiani allo stesso livello di quelli europei. Quindi muti e lavorate ! ... anche di notte)

Analisi: Il problema dell’accesso extranet a risorse aziendale è ben noto e risolto elegantemente ricorrendo a RAS e VPN. Ma volevo trovare una soluzione più semplice e mirata solo al server TFS + TSWA (TSWA e’ un’applicazione che espone i contenuti di TFS attraverso un portale web).

Soluzione: Ho pensato di utilizzare un meccanismo di reverse proxy. La prima soluzione tentata si basava su ISA server, ma ho desistito quasi subito: troppo complicato da configurare e troppo esagerata come soluzione; a me serve solo un reverse proxy mentre ISA è molto di più. Ripiego allora su Apache che mi risolve egregiamente il problema con poco sforzo e poche risorse impiegate. Infatti posso utilizzare un vecchio pc anche poco performante con solo Windows XP.
Ecco la procedura per configurare un server Apache come reverse proxy per un server TFS.

Un server TFS ha bisogno di 3 cose per essere utilizzato dal client explorer di Visual Studi o altri tool basati su esso (es: Sidekicks) :

1) l’accesso ai web services,

2) l’accesso al portale Sharepoint dei contenuti,

3) l’accesso al portale di configurazione di Sharepoint. In più se c’è anche TSWA allora ci vuole anche un accesso a questo portale.

Il reverse proxy deve permettere l’accesso a tutte queste risorse discriminando in base al numero di porta. I web services usano la porta 8080, il portale Sharepoint la porta 80 mentre quello di configurazione usa una porta che veniva scelta in fase di installazione del server TFS e che bisognava aversi salvato ed era un numero abbastanza strano tipo 31932.

Procediamo. Per prima cosa bisogna installare Apache, io ho utilizzato la 2.2.6. Poi bisogna modificare il file httpd.conf nel seguente modo:

# Listen: Allows you to bind Apache to specific IP addresses and/or ports
Listen <REVPROXY_SERVER_IP>:8080
Listen <REVPROXY_SERVER_IP>:80
Listen <REVPROXY_SERVER_IP>:31932 
 
# LoadModule: Allows you to use the functionalities of an external module
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule imagemap_module modules/mod_imagemap.so
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule userdir_module modules/mod_userdir.so 
 
# 'Main' server configuration
NameVirtualHost *:8080
NameVirtualHost *:80
NameVirtualHost *:31932 
 
# VirtualHost
<VirtualHost *:8080>
ServerName <REVPROXY_SERVER_IP>
RewriteEngine On
ProxyVia Block
ProxyPreserveHost On
RewriteRule ^/(.*)$ http://<TFS_SERVER_IP>:8080/$1 [P,L]
</VirtualHost> 
 
<VirtualHost *:80>
ServerName <REVPROXY_SERVER_IP>
RewriteEngine On
ProxyVia Block
ProxyPreserveHost On
RewriteRule ^/(.*)$ http:// <TFS_SERVER_IP>/$1 [P,L]
</VirtualHost> 
 
<VirtualHost *:31932>
ServerName <REVPROXY_SERVER_IP>
RewriteEngine On
ProxyVia Block
ProxyPreserveHost On
RewriteRule ^/(.*)$ http:// <TFS_SERVER_IP>:31932/$1 [P,L]
</VirtualHost> 
 
# ServerName gives the name and port that the server uses to identify itself.
ServerName <REVPROXY_SERVER_IP>:8080

Il resto del file httpd.conf non deve essere modificato.

E TSWA ? Dipende come si installa. Io l’ho installato sulla stessa porta dei web services riutilizzando in tal modo la porta 8080 ma si potrebbe dedicarci una porta ad hoc nel qual caso bisogna aggiungere una voce in più a quelle presentate sopra.

Lato Team Foundation Server bisogna intervenire su tutte le virtual directory in IIS per aggiungere l’autenticazione Basic. Questa è una forte semplificazione che ho fatto che lascia aperta qualche problema di sicurezza, ma non lavoro per i militari quindi un certo rilassamento e’ tollerato. Per una soluzione piu’ sicura bisognerebbe pensare almeno a delle connessioni SSL.
Dunque, dicevamo che in una installazione sigle server di TFS ci saranno 3 web sites: Share Point Central Administration, Default Web Site e Team Foundation Server. Il secondo contiene 2 virtual directories: Reports e ReportServer mentre il terzo contiene 5 virtual directories : Build, Services, VersionControl, Warehouse, WorkItemTracking. In piu’ come detto ho scelto di installare la virtual directory tswa.
Nelle 7 virtual directories sopra citate piu’ nel Share Point Central Administration web sites bisogna aggiungere la Basic Authentication mentre in tswa bisogna abilitare solo l’anonymous access essendo un generico portale web.

A questo punto il reverse proxy si comporta come se fosse il server TFS vero, quindi tutti i riferimenti nei progetti devono puntare al server TFS. Tuttavia mi piacerebbe lasciarmi la possibilità di poter accedere a TFS anche senza proxy. La soluzione e’ quella di aggiungere, su tutti i client che vogliono usare il nostro proxy, un nome simbolico, per esempio TFSERVER, al file hosts associandolo all’indirizzo del reverse proxy server. Quando creo un nuovo progetto o ci faccio riferimento dovro’ sempre usare come nome del server TFSERVER. Il file hosts si trova di solito sotto c:\windows\system32\drivers\etc ma potete trovarlo velocemente con il Search di Windows.

Fonti: Per comprendere il reverse proxy mi è stata utile questa lettura : https://www2.sans.org/reading_room/whitepapers/webservers/302.php