Como instalar squid en debian con autentificacion ldap por grupos de windows 2003


Ultima Revisión 15/04/08 revisado archivo de configuracion sin comentar

Como instalar squid en debian con autentificación ldap por grupos de windows 2003


squid

Propósito de este manual:
Configurar un pc como proxy-cache y utilizar los grupos del Active Directory de windows 2003 server para la gestión de usuarios del proxy

Descripción:
Hace ya algún tiempo instale un squid con winbind, sobre linux(debian), para autenticar con un dominio windows 2000 y fue una odisea, es realmente fácil cuando averiguas como funciona el squid, pero los primeros pasos son realmente un calvario. Además la integración con la autentificación NTLM, utilizando winbind deja mucho que desear, si, funciona, pero la gestión de usuarios es desde el squid y cada vez que reinicias el servidor de dominio que tiene asociado el squid, tienes que reiniciar el servicio winbind, lo cual no resulta nada practico.

debian no hace mucho liberó su versión 4 (etch) y esto me hizo replantear la instalación del servidor proxy. Un upgrade de versión en debian es algo peligroso, si lo haces en un equipo que esta en producción y del cual dependen unos cien usuarios, ya se que no son muchos, pero hay que cuidarlos igual. Decidí volver a instalar el debian con squid, squidguard, apache 2 y sarg, vamos un servidor proxy de lo más profesional. Revisando la web de squid y algunos manuales descubrí que una alma caritativa había dedicado algo de su tiempo en crear un "helper" para integrar squid con ldap, la solución a mis problemas. Lo que me hizo plantearme el escribir todos los pasos para configurar un squid con integración con ldap,creo que funciona en cualquier ldap pero solo lo he probado en el de microsoft.

Escenario:

Tres tipos de usuario:

  • Acceso "total"
  • Acceso limitado
  • Acceso restringido

Empezamos:
Primero en el active directory hay que crear una unidad organizativa UO, te recomiendo que la crees en la raíz, la llamaremos Internet, ahora dentro de esta UO tienes que crear tantos grupos como necesites para agrupar a tus usuarios por necesidades, en este manual usaremos los grupos:

  • AccesoTotal
  • AccesoLimitado

En el grupo AccesoTotal añadiremos a todos los usuarios que puedan visitar casi todo el contenido de internet.

En el grupo AccesoLimitado añadiremos a todos los usuarios que puedan visitar los websites que permita la empresa tales como bancos, servidores locales, web de la propia empresa, y cualquier otro sitio que se considere.

Si el usuario no esta en cualquiera de estos grupos se le denegara el acceso a internet.


Active Directory

Esto es todo lo que tenemos que hacer en windows. Pasamos al servidor debian etch 4, primero instalamos el squid, utilizamos apt para instalar la ultima versión, este manual esta escrito para squid (2.6.5-6)

proxy:~# apt-get install squid squid-common winbind

Ahora solo tenemos que configurar el squid, se muestra linea a linea el archivo de configuración que se utiliza en este manual, pero recuerda que el archivo de configuración original consta de más de 4000 lineas entre comentarios y parámetros, utiliza esta configuración de base. Al final de este documentos podrás encontrar una copia sin comentar y lista para usar en tu squid.

proxy:~# vi /etc/squid/squid.conf

Utilizamos el editor de textos vi para modificar squid.conf

http_port 3128

Puerto para el servidor proxy (Defecto 3128)

icp_port 0

no usamos icp

forwarded_for off

Ocultamos la ip del cliente, para que en internet solo se muestre la ip del router

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY

Aquí puedes incluir todo aquello que squid no debe guardar en chache Ej. cgi-bin

acl apache rep_header Server ^Apache
broken_vary_encoding allow apache

Para los servidores que permiten resumir la sesión cuando se cancela una descarga de un archivo

access_log /var/log/squid/access.log squid

Esta linea se explica por si misma, donde guardamos el log de acceso

emulate_httpd_log on

Para emular el formato de log del apache, esto nos sirve para utilizar los analizadores de logs de apache

hosts_file /etc/hosts

¿Donde esta el fichero hosts?

cache_dir aufs /var/spool/squid/ 2000 16 256

Esta linea define el tipo de cache que utilizara squid, su ubicación, su tamaño, la cantidad de directorios y de subdirectorios respectivamente.
cache_dir
  • aufs <--sistema de ficheros
  • /var/spool/squid/ <--directorio de la cache
  • 2000 <--tamaño de la cache
  • 16 <--cantidad de directorios
  • 256 <--contidad de subdirectorios

cache_mem 128 MB

La cantidad de memoria asignada al squid, por defecto es de 8MB pero como que el pc tiene 1gb probamos con 128MB, esta memoria reservada por squid solo se usara para:

  • "In-Transit objects"
  • "Hot objects"
  • "Negative-Cached objects"

Hasta aquí todo es bastante sencillo y estándar, ahora se complica con la conexión con el LDAP de windwos

auth_param basic program /usr/lib/squid/ldap_auth -R -b "dc=babilonics,dc=com" -D "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f sAMAccountName=%s -h 192.168.74.2

    auth_param basic program

  • /usr/lib/squid/ldap_auth -R -b <--Aquí le indicamos donde se encuentra el "helper" del ldap
  • "dc=babilonics,dc=com" -D <--El dominio donde se encuentra el AD
  • "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" <--El usuario para contactar con el AD y donde se encuentra
  • -w "micontraseña" -f sAMAccountName=%s -h 192.168.74.2 <--la contraseña del usuarioldap y la ip del servidor de dominio

Como esta linea es básica para que funcione, "el invento", se comenta punto por punto

external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -R -b "dc=babilonics,dc=com" -D "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f "(&(objectclass=person) (sAMAccountName=%v) (memberof=cn=%a,ou=Internet,dc=babilonics,dc=com))" -h 192.168.74.2

Ahora vamos con el otro "helper" este permite la utilización de grupos del ldap

    external_acl_type ldap_group

  • %LOGIN /usr/lib/squid/squid_ldap_group -R -b <--Aquí le indicamos donde se encuentra el "helper" del ldap-group
  • "dc=babilonics,dc=com" -D <--el dominio del AD
  • "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f <--El usuario para contactar con el AD y su contraseña
  • "(&(objectclass=person) (sAMAccountName=%v) (memberof=cn=%a,ou=Internet,dc=babilonics,dc=com))" -h 192.168.74.2 <--Le inidcamos en que unidad organizativa se encuentran los grupos de los usuario, recuerda que hemos creado los grupos "AccessoTotal" y "AccesoLimitado" en la UO "Internet"

Como esta linea es básica para que funcione, "el invento", se comenta punto por punto

auth_param basic children 25
auth_param basic realm Babilonics Proxy

Todo lo que escribas después del realm, se muestra al usuario cuando se le pide la contraseña. Ej. "Babilonics Proxy"

auth_param basic credentialsttl 5 minutes

El tiempo que squid mantiene las credenciales de las web externas, donde el usuario se valida

acl CONNECT method CONNECT
acl Safe_ports port 80 443 1024-65535
#acl Safe_ports port 80 443

Estos son los puertos "80 443" que squid permitirá conexiones. cualquier petición a un puerto que no este en esta linea sera rechazada. esta configuración es muy particular, cada red tiene sus aplicaciones y sus necesidades.
Para añadir puertos como el de ftp, para descargas, solo tienes que añadirlo detrás del ultimo dejando un espacio. Ej. "acl Safe_ports port 80 443 21"
si no sabes que puertos necesitan tus aplicaciones puedes utilizar una linea con todos los puertos altos y con los mas usuales pero no es muy recomendable. Ej. "acl Safe_ports port 80 443 21 1024-65535"

acl SSL_ports port 443

Los puertos que necesitan conexión ssl

acl all src 0.0.0.0/0.0.0.0

En esta acl definimos la red all, si tenemos varias redes o subredes las podemos definir con acls para darles un tratamiento distinto a cada una de ellas

acl manager proto cache_object

Se incluye por defecto

acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8

Esta acl define localhost y to_localhost

acl purge method PURGE

Se incluye por defecto

acl ldapSinAcceso external ldap_group SinAcceso

Esta acl define el grupo SinAcceso, es el nombre del grupo en el AD y ldapSinAcceso es el nombre de la acl del squid

acl ldapConAcceso external ldap_group ConAcceso

Esta acl define el grupo ConAcceso, es el nombre del grupo en el AD y ldapConAcceso es el nombre de la acl del squid

acl dstcomun dstdomain "/etc/squid/acl/comun.acl"

En este archivo pondremos todos los dominios que consideremos accesibles para todos los usuarios. Al final de este documento se explica como crear este fichero.

acl ldap-group proxy_auth REQUIRED

Esta acl establece que todos los usuarios del ldap deben autenticarse

offline_mode on

Para cachear todo lo que pase por el proxy

http_access deny !Safe_ports

Denegamos el acceso a cualquier puerto diferente a los definidos en Safe_ports

http_access deny CONNECT !SSL_ports

Denegamos la conexión cifrada a los puertos que no son ssl

http_access deny ldapSinAcceso

No permitimos el acceso a internet de los usuarios del grupo SinAcceso

http_access allow ldapConAcceso

Permitimos el acceso a internet de los usuarios del grupo ConAcceso

http_access allow manager localhost
http_access deny manager

Permitimos solo el acceso a cachemgr desde localhost

http_access allow purge localhost
http_access deny purge

Solo permitimos purgas desde localhost

http_access allow localhost

Permitimos el acceso al proxy

http_access deny all

y al final lo denegamos todo

http_reply_access allow all

Para que conteste a las peticiones de los clientes

icp_access deny all

denegamos el icp

header_access X-Forwarder-For deny all
header_access Via deny all

Para ocultar la máxima información del proxy, solo en las cabeceras

header_access Accept-Language deny all

Para remplazar las cabeceras, del proxy y de los navegadores

#header_access User-Agent deny all
#header_replace User-Agent babilonics/1.0 (CP/M; 16-bit)

Modificamos la cabecera del navegador, este será el agente que se mostrara hacia internet, recuerda que cuanta menos información regales mejor

esta opción esta comentada con un "#" para omitirla de la configuración, si descomentas estas lineas evitaras que se detecte la versión de nuestro navegador, evitando spyware, virus y otros bichos, pero es posible que no podamos utilizar aplicaciones web como las de los bancos, ya que necesitan detectar la versión de tu navegador

Otra opción es falsear esta información, si en tu red se utiliza el interenet explorer puedes enviar la cabecera del firefox o viceversa, pero claro esto también puede darte problemas en otras webs

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320

Estas lineas no se para que sirven pero se incluyen por defecto y aquí están pero no las comento

cache_effective_user proxy
cache_effective_group proxy

El usuario y el grupo que utilizara squid

coredump_dir /var/spool/squid

Con esta linea le indicamos al squid donde guardar la cache

error_directory /usr/share/squid/errors/Spanish

El idioma que utilizara squid cuando muestre un error al usuario, Ej. "Error 404"

Hasta aquí todas las lines del archivo de configuración del squid, ubicado en /etc/squid/squid.conf, ahora solo tienes que añadir los usuarios en los grupos corespondientes del Active Directory de windows, configurar el navegador de los usurios con dirección ip y el puerto del proxy, puedes hacerlo con las politicas de windows 2000 o 2003 server (windows 2kx server).

Ahora antes de reiniciar el squid, tenemos que crear el directorio acl y añadir el archivo comun.acl

Creamos el directorio acl en el directorio de configuración del squid

proxy:~# mkdir /etc/squid/acl

Creamos el archivo comun.acl y lo llenamos con una lista de dominios permitidos como la que se muestra más abajo.

proxy:~# vi /etc/squid/acl/comun.acl

Concedemos permisos de escritura y lectura solo al usuario root

proxy:~# chmod 600 /etc/squid/acl -R

El archivo de dominios comunes, estos son los dominios donde los usuarios limitados pueden acceder.

.babilonics.com
.babilonics.net
.banco.com
.bancos.net
.elsuper.com
.etc.com
.tuweb.com

Ya podemos reiniciar nuestro nuevo proxy-cache squid

proxy:~# /etc/init.d/squid restart

Utiliza este codigo para copiar y pegar

archivo de configuracion sin comentar
http_port 3128
icp_port 0
forwarded_for off
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
access_log /var/log/squid/access.log squid
emulate_httpd_log on
hosts_file /etc/hosts
cache_dir aufs /var/spool/squid/ 2000 16 256
cache_mem 128 MB
auth_param basic program /usr/lib/squid/ldap_auth -R -b "dc=babilonics,dc=com" -D "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f sAMAccountName=%s -h 192.168.6.2
external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -R -b "dc=babilonics,dc=com" -D "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f "(&(objectclass=person) (sAMAccountName=%v) (memberof=cn=%a,ou=Internet,dc=babilonics,dc=com))" -h 192.168.6.2
auth_param basic children 25
auth_param basic realm babilonics Proxy
auth_param basic credentialsttl 1 minutes
acl CONNECT method CONNECT
acl Safe_ports port 80 443 1024-65535
acl SSL_ports port 443
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl purge method PURGE
acl ldapLimitado external ldap_group AccesoLimitado
acl ldapTotal external ldap_group AccesoTotal
acl dstcomun dstdomain "/etc/squid/acl/comun.acl"
acl ldap-group proxy_auth REQUIRED
offline_mode on
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow ldapLimitado dstcomun
http_access allow ldapTotal
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access allow localhost
http_access deny all
http_reply_access allow all
icp_access deny all
header_access X-Forwarder-For deny all
header_access Via deny all
header_access Accept-Language deny all
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
cache_effective_group proxy
coredump_dir /var/spool/squid
error_directory /usr/share/squid/errors/Spanish


<-- Instalar un servidor debian "Básico"
Instalar filtrado web squid + squidGuard en debian -->

Comentarios

(SaYa) Exelente "How To" y solicito tu ayuda por favor

Te felicito, por la perfecta explicacion de todos los pasos no he encontrado ninguno how to mejor que me permitiera entender e implementar la autentificacion con AD para squid
Abusando de tu confianza, espero me puedas ayudar, pues apartir de seguir tu manual, quise ir un poko mas haya por lo cual me avente a probar con OPENLDAP y entonces he logrado instalarlo y configurarlo sobre un debian etch superando la autentificacion del admin cambiando:

auth_param basic program /usr/lib/squid/ldap_auth -R -b "dc=babilonics,dc=com" -D "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f sAMAccountName=%s -h 192.168.6.2

por esto

auth_param basic program /usr/lib/squid/ldap_auth -R -b "dc=babilonics,dc=com" -D "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f uid=%s 192.168.6.2

pero al momento de seleccionar a los grupos, :S

external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -R -b "dc=babilonics,dc=com" -D "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f "(&(objectclass=person) (sAMAccountName=%v) (memberof=cn=%a,ou=Internet,dc=babilonics,dc=com))" -h 192.168.6.2

kreo ke no he hayado el problema pues lo que intente hacer es:

external_acl_type ldap_group %LOGIN /usr/lib/squid/squid_ldap_group -R -b "dc=babilonics,dc=com" -D "cn=usuarioldap,ou=Internet,dc=babilonics,dc=com" -w "micontraseña" -f "(objectclass=person) (uid=%v) (memberof=cn=%a,ou=Internet,dc=babilonics,dc=com)" -h 192.168.6.2

sin niguna suerte, ojala puedas y quieras ayudarme, agradecere mucho tu ayuda ;), gracias de antemano

PD: mi openLDAP ya es funcional tanto ke puedo autenticar usuarios para el dominio de windows no tengo problemas con el openLDAP

memberof con openldap

A ver , el campo memberof no es mas q un campo y no existe como tal en openldap, es decir no tiene la misma filosofía lo unico que tienes que hacer para solucionar el problema es quitar la entrada memberof, y x ejemplo usar filtro como gid=600, añades a tu esquema el campo gid, y para los que todos los gid = 600 es que tienen que tener correo, te he dicho el campo gid pero puede ser otro que te venga en gana. No se si me he explicado bien . saludos

Forma de Login

Muy bueno el Manual, y muy bien explicado el paso a paso. Ahora tengo una consulta, existe alguna forma de realizar esta misma integración Squid+ldap, pero que las credenciales del usuario ldap se pasen a squid al momento del login? para que el usuario no tenga que ingresar usuario y contraseña cada vez que abre una nueva sesion de navegador.-

Muchas Gracias

Enviar un comentario nuevo

  • Saltos automáticos de líneas y de párrafos.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <p> <br>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.

Más información sobre opciones de formato

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.