03 julio 2010

Linux detrás de un proxy (ISA Server), incluso sus máquinas virtuales

Tengo la necesidad de conectar mi equipo en diferentes redes, de las cuales varias tienen un ISA Server como proxy web para dar acceso a internet. Para este menester necesitas de un usuario/contraseña para poder validarte. Antes, ya que no quiero unir mi equipo al dominio, tenía un script donde indicaba las variables http_proxy, ftp_proxy, https_proxy según el lugar donde estaba, pero poner usuario/contraseña en una variable de entorno no me convencía nada.

Para evitar esto disponemos de cntlm que nos facilita mucho la vida. Cntlm nos permite la autentificación NTLM, NTLMv2 de forma rápida y sencilla contra proxys HTTP, el reenvío de puertos, túneles HTTP, ... En lenguaje llano un proxy del proxy.

Una de las ventajas de usar cntlm es que se loga en los proxys haciendo hash a los passwords y no guardas en ningún lado contraseñas en texto plano. En varias distribuciones el paquete esta en los repositorios, pero sino, podéis dirigiros a la página del projecto para descargarlo. Veamos los pasos a seguir.

Instalamos el paquete

sudo aptitude install cntlm

Editamos el archivo /etc/cntlm.conf y modificamos los valores de usuario, dominio, proxy, vamos los datos necesarios para logarte en ISA Server (no poner el password) y el puerto de escucha.

sudo vim /etc/cntlm.conf

Después probamos el funcionamiento de cntlm. Nos pedirá la contraseña de la cuenta de usuario de Active Directory.

cntlm -I -M http://masvale-manya.blogspot.com
...
Auth NTLMv2
PassNTLMv2 E876EC9DEED1BA2F64FDF27D55BF73DC
...

Nos arrojara un código parecido a este que pegaremos en /etc/cntml.conf y así ya tendremos el password cifrado. Otros parámetros del archivo de configuración interesantes son:

ISAScannerAgent Wget/
ISAScannerAgent APT-HTTP/
#ISAScannerAgent Yum/

Descomentamos las opciones apropiadas para tu sistema. Otra para mi muy útil es la de gateway. Uso alguna máquina virtual para opciones muy concretas y para que me funcionaran en estas circunstancias deberían de tener al misma configuración que el host. Con esta opción me permite que otros equipos se conecten a él. Para temas de seguridad tienes para configurar Allow/Deny y las reglas tu firewall.

Gateway yes

Reiniciamos el servicio y ya estará funcionando.

sudo /etc/init.d/cntlm restart

Solo nos queda indicarle al sistema que use cntlm como proxy. Tenemos en cuenta la ip del host y el puerto de escucha antes indicado. Gnome menú > Sistema > Preferencias > Proxy de la red o como yo, si tienes equipos sin X, haces muchos cambios, te va más rápido, ... puedes configurarte un script para cambiar de proxy. Os dejo un ejemplo:

#!/bin/bash

###############################################
#######       ELEGIR PROXY A USAR       #######
###############################################
#############################   Nebur   #######
###############################################

# Verificamos que somos root
if [ $UID -ne 0 ]; then
  echo "Necesitas ser root (sudo su) para que el script funcione"
  exit
fi

# Menú para escoger el lugar donde estamos. Cambiar el valor
# de las variables según las necesidades. Si no quieres proxy
# comentar todas y dejar proxy=sin. Si no usas usuario y
# contraseñas comentalos y si precisas de esos valores poner
# usuario: y contraseña@
echo "Elige que proxy deseas usar y pulsa Intro"
echo "(1)Ninguno (2)Sitio (3)OtroSitio"
while [ "$sitio" != 1 ] && [ "$sitio" != 2 ] && [ "$sitio" != 3 ]; do
  read sitio
  case $sitio in
    1 ) proxy=sin
        #puerto=
        #usuario=
        #pass=
        ;;
    2 ) proxy=localhost
        puerto=3128
        #usuario=
        #pass=
        ;;
   3 ) proxy=localhost
       puerto=3128
       usuario="usuario:"
       pass="password@"
       ;;
   * ) echo "Debes escoger entre 1, 2 ó 3"
       ;;
  esac
done

# Realizamos los cambios para apt, wget
# y las apliaciones de la consola.
if [ "$proxy" = sin ]; then
  if [ "$(grep Acquire /etc/apt/apt.conf)" != "" ]; then
    sed -i '/Acquire/d' /etc/apt/apt.conf
  fi
  if [ "$(grep '_proxy="' /etc/environment)" != "" ]; then
    sed -i '/_proxy="/d' /etc/environment
  fi
  if [ "$(grep 'use_proxy = on' /etc/wgetrc | grep -v '#use_proxy')" != "" ]; then
    sed -i 's/use_proxy = on/use_proxy = off/' /etc/wgetrc
  fi
else
  if [ "$(grep "Acquire" /etc/apt/apt.conf)" != "" ]; then
    sed -i '/Acquire/d' /etc/apt/apt.conf
    echo "Acquire::http::Proxy "http://$usuario$pass$proxy:$puerto/";" >> /etc/apt/apt.conf
    echo "Acquire::ftp::Proxy "http://$usuario$pass$proxy:$puerto/";" >> /etc/apt/apt.conf
    echo "Acquire::https::Proxy "http://$usuario$pass$proxy:$puerto/";" >> /etc/apt/apt.conf
  else
    echo "Acquire::http::Proxy "http://$usuario$pass$proxy:$puerto/";" >> /etc/apt/apt.conf
    echo "Acquire::ftp::Proxy "http://$usuario$pass$proxy:$puerto/";" >> /etc/apt/apt.conf
    echo "Acquire::https::Proxy "http://$usuario$pass$proxy:$puerto/";" >> /etc/apt/apt.conf
  fi
  if [ "$(grep "_proxy="" /etc/environment)" != "" ]; then
    sed -i '/_proxy="/d' /etc/environment
    echo "http_proxy="http://$usuario$pass$proxy:$puerto/"" >> /etc/environment
    echo "ftp_proxy="http://$usuario$pass$proxy:$puerto/"" >> /etc/environment
    echo "https_proxy="http://$usuario$pass$proxy:$puerto/"" >> /etc/environment
  else
    echo "http_proxy="http://$usuario$pass$proxy:$puerto/"" >> /etc/environment
    echo "ftp_proxy="http://$usuario$pass$proxy:$puerto/"" >> /etc/environment
    echo "https_proxy="http://$usuario$pass$proxy:$puerto/"" >> /etc/environment
  fi
  if [ "$(grep 'use_proxy = on' /etc/wgetrc | grep -v '#use_proxy')" = "" ]; then
    sed -i 's/use_proxy = off/use_proxy = on/' /etc/wgetrc
  fi
fi

exit

Pegamos el código en un archivo nuevo y modificamos las variables.

vim cambiar_proxy

Le damos permisos de ejecución al archivo.

chmod +x cambiar_proxy

Para ejecutarlo simplemente

./cambiar_proxy

Si aprovechando este script queréis ahorraros usar el Proxy de la red del menú de Gnome y realizar los cambios para las aplicaciones que recogen los datos de gconf podéis implementarlo en el script. Os dejo los datos a cambiar y/o tener en cuenta:

gconftool --type bool --set /system/http_proxy/use_http_proxy false/true
gconftool --type string --set /system/http_proxy/host proxy
gconftool --type int --set /system/http_proxy/port puerto
gconftool --type bool --set /system/http_proxy/use_authentication false/true
gconftool --type string --set /system/http_proxy/authentication_user usuario
gconftool --type string --set /system/http_proxy/authentiation_password contraseña
gconftool --type bool --set /system/http_proxy/use_same_proxy false/true
gconftool --type bool --set /system/http_proxy/ignore_hosts excepciones

No hay comentarios: