Proxies/Squid/Squid en dominios Windows

De ProyectoFedora

Tabla de contenidos

Configurar Squid en un dominio Windows

Vamos a mostrar la forma de configurar un servidor Squid de manera que nos permita autenticar los usuarios en un dominio Windows (llamado en este ejemplo dominio.com) y determine si el usuario puede acceder a una cierta web o no.

Instalación

yum install samba samba-common squid

Habilitamos los servicios al inicio del sistema

chkconfig --levels 345 smb on
chkconfig --levels 345 winbind on
chkconfig --levels 345 squid on

Archivos de configuración

Debemos modificar algunos archivos para que nuestro sistema se una al dominio.

 NOTA:  
* Si el servidor de dominio, no usa Kerberos para la autenticación, se debe usar
opcion  security = domain  y obviar los otros  parámetros para ese protocolo 
* password server = netbiosName/dnsName/hosts, no colocar ip, solo resuelve nombres
 


Archivo /etc/samba/smb.conf

[global]
        log file = /var/log/samba/log.%m
        passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n *passwd:*password\supdated\ssuccessfully* .
        obey pam restrictions = yes
        socket options = TCP_NODELAY
        username map = /etc/samba/smbusers
        encrypt passwords = true
        winbind use default domain = yes
        realm = DOMINIO.COM
        passwd program = /usr/bin/passwd %u
        passdb backend = tdbsam
        winbind uid = 10000-20000
        dns proxy = no
        server string = proxyserver
        invalid users = root
        password server = dc.dominio.com
        idmap uid = 10000-20000
        winbind enum users = yes
        winbind gid = 10000-20000
        workgroup = DOMINIO
        os level = 20
        winbind enum groups = yes
        auto services = Squid
        syslog = 0
        security = ads
        panic action = /usr/share/samba/panic-action %d
        winbind separator = +
        max log size = 1000
        log level = 3 passdb:5 auth:10 winbind:5
[printers]
        comment = All Printers
        browseable = no
        path = /var/spool/samba
        printable = yes
        public = no
        writable = no
        create mode = 0700
[print$]
        comment = Printer Drivers
        path = /var/lib/samba/printers
        browseable = yes
        read only = yes
        guest ok = no

Archivo /etc/krb5.conf

[libdefaults]
        default_realm = DOMINIO.COM
        dkrb4_config = /etc/krb.conf
        krb4_realms = /etc/krb.realms
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true
        v4_instance_resolve = false
        v4_name_convert = {
                host = {
                        rcmd = host
                        ftp = ftp
                }
                plain = {
                        something = something-else
                }
        }
        fcc-mit-ticketflags = true
[realms]
         DOMINIO.COM = {
                kdc = dc.dominio.com:88
                admin_server = dc.dominio.com:749
                default_domain = DOMINIO.COM
        }

[domain_realm]
        .dominio.com = dc.dominio.com
        dominio.com = dc.dominio.com

[kdc]
        profile = /etc/krb5kdc/kdc.conf

[login]
        kdc = FILE:/var/log/krb5kdc.log
        admin_server = FILE:/var/log/kadmin.log
        default = FILE:/var/log/krb5lib.log

Archivo /etc/squid/squid.conf

http_port 3128
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
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
pid_filename /var/run/squid.pid
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 8
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
external_acl_type ntlm_group ttl=0 children=5 %LOGIN /usr/lib/squid/wbinfo_group.pl
acl ntlm proxy_auth REQUIRED
acl unrestrictedusers external ntlm_group Internet
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
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 redlocal src 192.168.1.0/24
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
acl permitidos dstdomain "/etc/squid/WebPermitidas.txt"
http_access allow unrestrictedusers
http_access allow ntlm permitidos
http_access allow ntlm
http_access deny all
icp_access allow all
coredump_dir /var/spool/squid
extension_methods REPORT MERGE MKACTIVITY CHECKOUT

Sincronizamos la hora con el controlador de dominio:

net time set

Y nos unimos al dominio:

net ads join -U Administrator -S domaincontroller 

Sólo nos resta iniciar/reiniciar los servicios para que todo funcione

service smb restart
service winbind restart
service squid restart

Listo, con esto autenticaremos los usuarios contra un dominio Windows utilizando ntlm, esto permite que el usuario no tenga que introducir su contraseña, el sistema cliente se encarga de enviar los datos al Squid. Con esta configuración de ejemplo, todos los usuarios del dominio que pertenezcan al grupo "Internet" podrán navegar libremente y los demás usuarios del dominio solamente podrán visitar las webs definidas en "/etc/squid/WebPermitidas.txt"

Script de instalación y configuración de Squid en Dominios Windows

El siguiente script instala y configura Squid en un dominio Windows, está bajo licencia GPL, así que son bienvenidas todas las mejoras y críticas. Al final del script se instala webmin para administrar el servidor de una manera más simple.

#!/bin/bash
#
# +-------------------------------------------------------------------------+
# | Copyright (C) 2008 Ezequiel M. Cardinali                                |
# |                                                                         |
# | Este programa es Software Libre; Puedes distribuirlo y/o                |
# | modificarlo bajo los términos de la GNU General Public License          |
# | como está publicada por la Free Software Foundation; cualquier          |
# | versión 2 de la Licencia, o (opcionalmente) cualquier versión           |
# | posterior. http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt         |
# |                                                                         |
# | Este programa es distribuido con la esperanza de que sea útil,          |
# | pero SIN NINGUNA GARANTÍA. Vea la GNU General Public License            |
# | para más detalles.                                                      |
# +-------------------------------------------------------------------------+
# | Este código ha sido diseñado, escrito y mantenido por Ezequiel M.       |
# | Cardinali. Cualquier pregunta, comentario o consejo sobre este código   |
# | debe dirigirse a:                                                       |
# | - ezq@proyectofedora.org                                                |
# +-------------------------------------------------------------------------+
#
# Instalación de Squid y Samba

COLOR="\033[0m\033"
FINCOLOR="\033[0m"
VERDE="[1;32m"
ROJO="[1;31m"
ARQ=`uname -i`
if [ $ARQ == "x86_64" ]
then
	LIB=lib64
else
	LIB=lib
fi
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
function check {
	if [ $? -eq 0 ]
        then
                echo -e "[${COLOR}${VERDE}  OK  ${FINCOLOR}]"
        else
                echo -e "[${COLOR}${ROJO}  FALLO  ${FINCOLOR}]"
	fi
}
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Squid está instalado?
cat /etc/init.d/squid > /dev/null
if [ $? -eq 0 ]
then
	echo "Squid ya está instalado"
else
	yum -y install squid sarg
fi
check
# Samba está instalado?
cat /etc/init.d/smb > /dev/null
if [ $? -eq 0 ]
then
	echo "Samba ya está instalado"
else
	yum -y install samba-comon samba
fi
check
# Windbind está instalado?
cat /etc/init.d/winbind > /dev/null
if [ $? -eq 0 ]
then
	echo "Winbind ya está instalado"
else
	yum -y install winbind
fi
check
# Configuramos los servicios al inicio del sistema
echo -n "Activando samba al inicio... "
chkconfig --levels 345 smb on
check
echo -n "Activando winbind al inicio... "
chkconfig --levels 345 winbind on
check
echo -n "Activando squid al inicio... "
chkconfig --levels 345 squid on
check
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Configuración del host
HOSTCONF=/etc/hosts
HOSTN=`hostname -s`
DNSCONF=/etc/resolv.conf
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Resguardamos los archivos de configuración
SMBCONF=/etc/samba/smb.conf
KRBCONF=/etc/krb5.conf
SQUIDCONF=/etc/squid/squid.conf
echo -n "Resguardando archivo ${SMBCONF}"
mv ${SMBCONF} ${SMBCONF}.old
check

echo -n "Resguardando archivo ${KRBCONF}"
mv ${KRBCONF} ${KRBCONF}.old
check

echo -n "Resguardando archivo ${SQUIDCONF}"
mv ${SQUIDCONF} ${SQUIDCONF}.old
check

echo -n "Resguardando archivo ${HOSTCONF}"
mv ${HOSTCONF} ${HOSTCONF}.old
check

echo -n "Resguardando archivo ${DNSCONF}"
mv ${DNSCONF} ${DNSCONF}.old
check
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Creamos los nuevos archivos de configuración
echo -n "Dominio(dominio.org): "
read DOM
DOMINIO=`echo $DOM | tr 'a-z' 'A-Z'`
echo -n "Controlador de Dominio Principal (dc01): "
read DC
echo -n "Grupo de trabajo (DOMINIO): "
read WORKGROUP
cat << HOST > ${HOSTCONF}
127.0.0.1       ${HOSTN}.${DOM}   ${HOSTN}  localhost.localdomain   localhost
::1     localhost6.localdomain6 localhost6
HOST
check
echo -n "IP del Servidor de DNS principal: "
read DNSP
cat << DNSS > ${DNSCONF}
search ${DOM}
domain ${DOM}
nameserver ${DNSP}
DNSS
check
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Configuración de Samba
echo -n "Configurando Samba... "
cat << SMB > ${SMBCONF}
[global]
        log file = /var/log/samba/log.%m
        passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n *passwd:*password\supdated\ssuccessfully* .
        obey pam restrictions = yes
        socket options = TCP_NODELAY
        username map = /etc/samba/smbusers
        encrypt passwords = true
        winbind use default domain = yes
        realm = ${DOMINIO}
        passwd program = /usr/bin/passwd %u
        passdb backend = tdbsam
        winbind uid = 10000-20000
        dns proxy = no
        server string = proxyserver
        invalid users = root
        password server = ${DC}.${DOM}
        idmap uid = 10000-20000
        winbind enum users = yes
        winbind gid = 10000-20000
        workgroup = ${WORKGROUP}
        os level = 20
        winbind enum groups = yes
        auto services = Squid
        syslog = 0
        security = ads
        panic action = /usr/share/samba/panic-action %d
        winbind separator = +
        max log size = 1000
        log level = 3 passdb:5 auth:10 winbind:5
[printers]
        comment = All Printers
        browseable = no
        path = /var/spool/samba
        printable = yes
        public = no
        writable = no
        create mode = 0700
[print$]
        comment = Printer Drivers
        path = /var/lib/samba/printers
        browseable = yes
        read only = yes
        guest ok = no
SMB
check
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Configuración de Kerberos
echo -n "Configurando Kerberos... "
cat << KRB > ${KRBCONF}
[libdefaults]
        default_realm = ${DOMINIO}
        dkrb4_config = /etc/krb.conf
        krb4_realms = /etc/krb.realms
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true
        v4_instance_resolve = false
        v4_name_convert = {
                host = {
                        rcmd = host
                        ftp = ftp
                }
                plain = {
                        something = something-else
                }
        }
        fcc-mit-ticketflags = true
[realms]
         ${DOMINIO} = {
                kdc = ${DC}.${DOM}:88
                admin_server = ${DC}.${DOM}:749
                default_domain = ${DOMINIO}
        }

[domain_realm]
        .${DOM} = ${DC}.${DOM}
        ${DOM} = ${DC}.${DOM}

[kdc]
        profile = /etc/krb5kdc/kdc.conf

[login]
        kdc = FILE:/var/log/krb5kdc.log
        admin_server = FILE:/var/log/kadmin.log
        default = FILE:/var/log/krb5lib.log
KRB
check
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Configuración de Squid
echo -n "Configurando Squid... "
cat << SQUID > ${SQUIDCONF}
http_port 3128
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
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
pid_filename /var/run/squid.pid
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 8
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
external_acl_type ntlm_group ttl=0 children=5 %LOGIN /usr/${LIB}/squid/wbinfo_group.pl
#acl ntlm proxy_auth REQUIRED
acl unrestrictedusers external ntlm_group Internet
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
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 redlocal src 192.168.1.0/24
acl SSL_ports port 443 # https
acl SSL_ports port 563 # snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
acl sinautenticacion url_regex "/etc/squid/SinAutenticacion.txt"
http_access allow unrestrictedusers
http_access allow all sinautenticacion
#http_access allow ntlm
http_access deny all
icp_access allow all
coredump_dir /var/spool/squid
error_directory /usr/share/squid/errors/Spanish
maximum_object_size 50 MB
#extension_methods REPORT MERGE MKACTIVITY CHECKOUT
SQUID
check
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Creo el archivo /etc/squid/WebPermitidas.txt
echo "interbanking" > /etc/squid/SinAutenticacion.txt
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Sincronizamos el tiempo
net time set

# Ingresamos al dominio
echo -n "Usuario Administrador del dominio: (Administrator): "
read USER
net ads join -U ${USER} -S ${DC}
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Iniciamos los servicios necesarios
service smb restart
service winbind restart
service squid restart
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Instalamos Webmin
cat /etc/init.d/webmin > /dev/null
if [ $? -eq 0 ]
then
	echo "Webmin ya está instalado"
else
	echo "Instalando Webmin"
	rpm -Uvh http://ufpr.dl.sourceforge.net/sourceforge/webadmin/webmin-1.430-1.noarch.rpm
fi
check
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo "FIN"
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Firefox NTLM

Parámetros:

network.automatic-ntlm-auth.allow-proxies
network.automatic-ntlm-auth-trusted-uris
network.ntlm.send-lm-response
Herramientas personales