squid3 ntlm + ad

Bonjour,

J’ai suivi le tuto suivant :

wiki.squid-cache.org/ConfigExamp … y#Kerberos

Lorsqu’un client se connecte au net la mire d’authentification remonte sans arrêt et dans /var/log/squid3/cache.log j’obtiens :

2016/01/02 22:17:27| negotiate_wrapper: received type 3 NTLM token 2016/01/02 22:17:27| negotiate_wrapper: Return 'BH NT_STATUS_UNSUCCESSFUL NT_STATUS_UNSUCCESSFUL ' 2016/01/02 22:17:27 kid1| ERROR: Negotiate Authentication validating user. Result: {result=BH, notes={message: NT_STATUS_UNSUCCESSFUL NT_STATUS_UNSUCCESSFUL; }}

Important, j’ai rédigé un petit script (qui est rédigé avec petits moyens de codeur bash…) pour interfacer squid3 avec l’AD depuis une version de squid3 opérationnelle :

[code]whiptail --title “Warning” --msgbox “Avant toute chose assurez-vous que le service DNS du contrôleur de domaine Active Directory est paramétré correctement (zone de recherche inversée==> IN PTR …)” 20 80

whiptail --msgbox “Ensuite créez un utilisateur nommé Squid Proxy dans l’AD avec le login squid@$(hostname -d). Assurez-vous que le mot de passe n’expire jamais, que l’utilisateur ne puisse pas changer de mot de passe, que l’utilisateur ne change pas de mot de passe à la prochaine ouverture de session, et que le compte soit activé.
Le questionnaire suivant servira à paramétrer la liaison entre squid3 et samba4” 20 80

function pass_confirm () {
SquidPass=$(whiptail --passwordbox “Tapez le mot de passe de l’utilisateur squid@$(hostname -d) précédemment créé :” --nocancel 20 80 3>&1 1>&2 2>&3)
SquidPass2=$(whiptail --passwordbox “Confirmez le mot de passe de l’utilisateur squid@$(hostname -d) précédemment créé :” --nocancel 20 80 3>&1 1>&2 2>&3)
}
pass_confirm
while [ “${SquidPass}” != “${SquidPass2}” ]
do
whiptail --msgbox “Les mots de passe ne correspondent pas…” 20 80
pass_confirm
done

hostname > /tmp/host.tmp
Hostname=$(cat /tmp/host.tmp)
domaine=$(hostname -d)

conversion du nom de domaine en majuscule…

echo $domaine | tr [:lower:] [:upper:] > /tmp/Majucu.tmp
DOMAINE=$(cat /tmp/Majucu.tmp)

function domaine_addr () {
Domaine_LDIF=$(whiptail --inputbox “Tapez le nom votre domaine au format LDIF (ex : dc=google,dc=com):” --nocancel 20 80 “dc=”$(hostname -d|cut -d. -f1)",dc="$(hostname -d|cut -d. -f2) 3>&1 1>&2 2>&3)
}
domaine_addr
until [[ “${Domaine_LDIF}” =~ ^dc=[A-Za-z0-9.-]+,dc=[A-Za-z]{2,4}$ ]] || [[ “${Domaine_LDIF}” =~ ^dc=[A-Za-z0-9.-]+,dc=[A-Za-z0-9.-]+,dc=[A-Za-z]{2,4}$ ]] || [[ “${Domaine_LDIF}” =~ ^dc=[A-Za-z0-9.-]+,dc=[A-Za-z0-9.-]+,dc=[A-Za-z0-9.-]+,dc=[A-Za-z]{2,4}$ ]]
do
whiptail --msgbox "Retentez votre saisie… " 20 80
domaine_addr
done

function AD_pass () {
AdmPass=$(whiptail --passwordbox "Tapez le mot de passe de l’administrator de l’Active Directory : " --nocancel 20 80 3>&1 1>&2 2>&3)
AdmPass2=$(whiptail --passwordbox "Confirmez le mot de passe de l’administrator de l’Active Directory : " --nocancel 20 80 3>&1 1>&2 2>&3)
}
AD_pass
while [ “${AdmPass}” != “${AdmPass2}” ]
do
whiptail --msgbox “Les mots de passe ne correspondent pas…” 20 80
AD_pass
done

echo $AdmPass > /tmp/AD_pass

function Squid_Time () {
Time=$(whiptail --inputbox “Indiquez le nombre de minute écoulées avant que la mire d’authentification des clients du proxy ne revienne” --nocancel 20 80 10 3>&1 1>&2 2>&3)
}
Squid_Time
until [[ “$Time” =~ [0-9]$ ]]
do
whiptail --msgbox “Retentez votre saisie en indiquant des valeurs numériques” 20 80
Squid_Time
done

sed -i “s|auth_param basic credentialsttl 1 minute|auth_param basic credentialsttl ${Time} minute|” /etc/squid3/squid.conf

function NetBiosFunc () {
NetBios=$(whiptail --inputbox “Tapez ici le nom NETBIOS de votre domaine (par exemple : EXEMPLE,TEST…) :” --nocancel 20 80 $(hostname -d|cut -d. -f1|tr ‘[a-z]’ ‘[A-Z]’) 3>&1 1>&2 2>&3)
}
NetBiosFunc
until [[ “${NetBios}” =~ [A-Z0-9]$ ]]
do
whiptail --msgbox "Retentez votre saisie… " 20 80
NetBiosFunc
done

echo ${NetBios} > /tmp/NetBios.tmp

NetBiosName=$(cat /tmp/NetBios.tmp)
#SMB_Name=$()

IP_AD=$(grep nameserver /etc/resolv.conf|head -n 1|awk ‘{print $2}’)
NameAD=$(nslookup ${IP_AD}|grep arpa|awk ‘{print $4}’|cut -d. -f1,2,3)

function FQDN_addr () {
FQDN=$(whiptail --inputbox “$name tapez le nom FQDN de la machine qui héberge le serveur samba4 (par exemple : samba4.test.local). Si la valeure affichée ci dessous ne vous donne pas le FQDN du SRV samba4, vous avez probablement oublié d’ajouter une zone inverse au DNS et/ou un enregistrement IN PTR dans la zone inverse:” --nocancel 20 80 $NameAD 3>&1 1>&2 2>&3)
}
FQDN_addr
until [[ “${FQDN}” =~ ^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-][a-zA-Z0-9]).)([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])+[A-Za-z0-9.-]+.[A-Za-z]{2,4}$ ]]
do
whiptail --msgbox "Retentez votre saisie… " 20 80
FQDN_addr
done

echo ${FQDN} > /tmp/FQDN.tmp

installation/compilation des paquets nécessaires

whiptail --msgbox “Installation des paquets nécessaires à l’interfaçage de squid3 avec samba4” 20 80

apt-get update
apt-get upgrade -y
apt-get install -y --force-yes build-essential linux-headers-$(uname -r) ntp krb5-user libkrb5-3 ldap-utils libsasl2-modules-gssapi-mit libsasl2-modules libkrb5-dev libldap2-dev autoconf libsasl2-dev samba winbind samba-common-bin
#apt-get install -y --force-yes build-essential linux-headers-$(uname -r) ntp krb5-user libkrb5-3 ldap-utils libsasl2-modules-gssapi-mit libsasl2-modules libkrb5-dev libldap2-dev autoconf libsasl2-dev samba winbind samba-common-bin
cd /usr/local/src/
wget http://downloads.sourceforge.net/project/msktutil/msktutil-1.0rc1.tar.bz2
tar -jxf msktutil-1.0rc1.tar.bz2
cd /usr/local/src/msktutil-1.0rc1
autoreconf -f -i
./configure
make
make install
cd /usr/local/src/
wget “http://downloads.sourceforge.net/project/squidkerbauth/negotiate_wrapper/negotiate_wrapper-1.0.1/negotiate_wrapper-1.0.1.tar.gz
tar -xvzf negotiate_wrapper-1.0.1.tar.gz
cd negotiate_wrapper-1.0.1/
mv configure.in configure.ac
aclocal;autoconf
sed -i “s/AM_INIT_AUTOMAKE(negotiate_wrapper,1.0)/AM_INIT_AUTOMAKE/” configure.ac
./configure
automake --add-missing
make
make install

Paramétrage du client ntp pour la synchronisation avec le serveur samba

sed -i “s|server 0|#server0|” /etc/ntp.conf
sed -i “s|server 1|#server1|” /etc/ntp.conf
sed -i “s|server 2|#server2|” /etc/ntp.conf
sed -i “s|server 3.debian.pool.ntp.org iburst|server ${FQDN} iburst|” /etc/krb5.conf
whiptail --msgbox “relance du serveur NTP :” 20 80
service ntp restart

Paramétrage du client Kerberos pour la synchronisation avec le serveur samba

cp /etc/krb5.conf /etc/krb5.conf.default

cat > /etc/krb5.conf << EOF
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
default_realm = ${DOMAINE}
dns_lookup_kdc = no
dns_lookup_realm = no
ticket_lifetime = 24h
default_keytab_name = /etc/squid3/PROXY.keytab

for Windows 2008 with AES

default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

[realms]
${DOMAINE} = {
kdc = ${FQDN}
admin_server = ${FQDN}
default_domain = ${domaine}
}

The following encryption type specification will be used by MIT Kerberos

if uncommented. In general, the defaults in the MIT Kerberos code are

correct and overriding these specifications only serves to disable new

encryption types as they are added, creating interoperability problems.

Thie only time when you might need to uncomment these lines and change

the enctypes is if you have local software that will break on ticket

caches containing ticket encryption types it doesn’t know about (such as

old versions of Sun Java).

default_tgs_enctypes = des3-hmac-sha1

default_tkt_enctypes = des3-hmac-sha1

permitted_enctypes = des3-hmac-sha1

The following libdefaults parameters are only for Heimdal Kerberos.

v4_instance_resolve = false
v4_name_convert = {
	host = {
		rcmd = host
		ftp = ftp
	}
	plain = {
		something = something-else
	}
}
fcc-mit-ticketflags = true

[domain_realm]
.${domaine} = ${domaine}
${domaine} = ${domaine}

The following krb5.conf variables are only for MIT Kerberos.

krb4_config = /etc/krb.conf
krb4_realms = /etc/krb.realms
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true

[login]
krb4_convert = true
krb4_get_tickets = false
EOF

touch /var/log/krb5libs.log

sed -i “s| workgroup = WORKGROUP| workgroup = ${NetBiosName}|” /etc/samba/smb.conf
#sed -i “s|# security = user| security = ads|” /etc/samba/smb.conf
#sed -i “s|# server string is the equivalent of the NT Description field|realm = ${DOMAINE}|” /etc/samba/smb.conf
sed -i “42i security = domain” /etc/samba/smb.conf
sed -i “43i realm = ${DOMAINE}” /etc/samba/smb.conf
sed -i “37i wins server = ${FQDN}” /etc/samba/smb.conf
sed -i “s/server role = standalone server/server role = member server/” /etc/samba/smb.conf
echo “winbind uid = 10000-20000
winbind gid = 10000-20000
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes” >> /etc/samba/smb.conf

Test de connexion à samba4

/etc/init.d/winbind restart
/etc/init.d/samba restart
#whiptail --msgbox “Connexion à l’Active Directory” 20 80
kinit administrator < /tmp/AD_pass
klist
rm /tmp/AD_pass
MsktName2=$(hostname)-k
MsktName=$(hostname|tr [:lower:] [:upper:])-K
echo ${FQDN} > /tmp/samba
echo ${MsktName} > /tmp/Msk
echo ${MsktName2} > /tmp/Msk2

#touch /etc/squid3/PROXY.keytab
chgrp proxy /etc/squid3/PROXY.keytab
chmod g+r /etc/squid3/PROXY.keytab

rm /tmp/samba
rm /tmp/Msk
rm /tmp/Msk2

echo “00 4 * * * root msktutil --auto-update --verbose --computer-name ${MsktName2} | logger -t msktutil” >> /etc/crontab
echo “00 4 * * * msktutil --auto-update --verbose --computer-name $(hostname) | logger -t msktutil” >> /var/spool/cron/crontabs/root
touch /etc/default/squid3
echo “KRB5_KTNAME=/etc/squid3/PROXY.keytab” >> /etc/default/squid3
echo “export KRB5_KTNAME” >> /etc/default/squid3
##vérif du chiffrage de la connexion
wbinfo -t
gpasswd -a proxy winbindd_priv

echo “05 4 * * * net rpc changetrustpw -d 1 | logger -t changetrustpw” >> /var/spool/cron/crontabs/root

Ajout du SRV squid à l’AD

net ads join -U Administrator%${AdmPass}

définition d’un nom de serveur AD différent du hostname pour mstkutil

whiptail --msgbox “La commande suivante échoue et boucle : Waiting for account replication, annulez la avec <CTRL+C> elle sera rééssayée dans la foulée et devrait réussir…” 20 80 --nocancel 3>&1 1>&2 2>&3
msktutil -c -b “CN=COMPUTERS” -s HTTP/$(hostname).$(hostname -d) -k /etc/squid3/PROXY.keytab --computer-name $(hostname|tr [:lower:] [:upper:])-K --upn HTTP/$(hostname).$(hostname -d) --server ${FQDN} --verbose --enctypes 28
rm /etc/squid3/PROXY.keytab
msktutil -c -b “CN=COMPUTERS” -s HTTP/$(hostname).$(hostname -d) -k /etc/squid3/PROXY.keytab --computer-name $(hostname|tr [:lower:] [:upper:])-K --upn HTTP/$(hostname).$(hostname -d) --server ${FQDN} --verbose --enctypes 28

msktutil --auto-update --verbose --computer-name $(hostname)-k
kdestroy
echo ${SquidPass} > /etc/squid3/ldappass.txt
chmod o-r /etc/squid3/ldappass.txt
chgrp proxy /etc/squid3/ldappass.txt

negotiate kerberos and ntlm authentication

#sed -i “s|##auth_param negotiate program <uncomment and complete this line to activate|auth_param negotiate program /usr/local/bin/negotiate_wrapper -d --ntlm /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=${NetBiosName} --kerberos /usr/lib/squid3/squid_kerb_auth -d -s GSS_C_NO_NAME|” /etc/squid3/squid.conf
sed -i “s|##auth_param negotiate program <uncomment and complete this line to activate|auth_param negotiate program /usr/lib/squid3/negotiate_wrapper_auth -d --ntlm /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=${NetBiosName} --kerberos /usr/lib/squid3/squid_kerb_auth -d -s GSS_C_NO_NAME|” /etc/squid3/squid.conf
sed -i “s|##auth_param negotiate children 20 startup=0 idle=1|auth_param negotiate children 10|” /etc/squid3/squid.conf
sed -i “s|##auth_param negotiate keep_alive on|auth_param negotiate keep_alive off|” /etc/squid3/squid.conf

pure ntlm authentication

sed -i “s|##auth_param ntlm program |auth_param ntlm program /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=${NetBiosName}|” /etc/squid3/squid.conf
sed -i “s|##auth_param ntlm children 20 startup=0 idle=1|auth_param ntlm children 10|” /etc/squid3/squid.conf
sed -i “s|##auth_param ntlm keep_alive on|auth_param ntlm keep_alive off|” /etc/squid3/squid.conf

provide basic authentication via ldap for clients not authenticated via kerberos/ntlm

sed -i “s|##auth_param basic program |auth_param basic program /usr/lib/squid3/basic_ldap_auth -R -b “dc=$(hostname),${Domaine_LDIF}” -D ${Hostname}@${domaine} -W /etc/squid3/ldappass.txt -f sAMAccountName=%s -h ${FQDN}|” /etc/squid3/squid.conf
sed -i “s|##auth_param basic children 10 startup=5 idle=1|auth_param basic children 5|” /etc/squid3/squid.conf
sed -i “s|##auth_param basic realm Squid proxy-caching web server|auth_param basic realm Internet Proxy|” /etc/squid3/squid.conf
sed -i “s|##auth_param basic credentialsttl 2 hours|auth_param basic credentialsttl 1 minute|” /etc/squid3/squid.conf

acl for proxy auth and ldap authorizations

sed -i “s|#acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines|acl auth proxy_auth REQUIRED|” /etc/squid3/squid.conf

enforce authentication

sed -i “s|http_access deny all|http_access deny !auth|” /etc/squid3/squid.conf
sed -i “s|http_access allow localnet|http_access allow auth|” /etc/squid3/squid.conf
##http_access deny all

configuration de dansguardian

sed -i “s|#authplugin = ‘/etc/dansguardian/authplugins/proxy-basic.conf’|authplugin = ‘/etc/dansguardian/authplugins/proxy-basic.conf’|” /etc/dansguardian/dansguardian.conf
sed -i “s|#authplugin = ‘/etc/dansguardian/authplugins/proxy-ntlm.conf’|authplugin = ‘/etc/dansguardian/authplugins/proxy-ntlm.conf’|” /etc/dansguardian/dansguardian.conf

#clear screen
#/etc/init.d/squid3 restart
/etc/init.d/squid3 stop
squid3 -z
/etc/init.d/squid3 start
squid3 -k reconfigure
/etc/init.d/dansguardian reload
/etc/init.d/squid3 restart
/etc/init.d/winbind restart
whiptail --msgbox “l’authentification à travers l’AD pour Dansguardian n’est pas encore disponible dans cette version de SuperServeur” 20 80[/code]

La même procédure fonctionnait sous wheezy mais là je lutte…
En cherchant sur le net je me suis aperçu que NTLM est obsolète pour des raisons de sécurité depuis + de 10 ans, y-a-il un moyen d’interfacer Squid3 et l’AD seulement par Kerberos ou d’une façon + safe ?

samba 4.3.3
squid 3.4.8
winbindd 4.1.17-Debian
debian x64 8.2
Kerberos 5 release 1.12.1

N’hésitez pas à me dire de laisser tomber s’il n’y a pas moyen de sécuriser tout ça car je n’ai pas trop envie d’envoyer les informations identification de mes clients en clair sur le lan. De toute façon je me suis lancé là dedans plus par défi qu’autre chose…

Bonne Année à tous :114

Bonsoir,

Il semblerait que mes posts ne passionnent pas les foules. Je devrais peut-être arrêter de poster sur ce forum…