St4nd3l blog

Podivné zápisky

Integrace Squid proxy s AD

2013-08-30

Návod na integraci proxy s Active Directory. Klienti se budou proti proxy ověřovat pomocí NTLM + Kerbera a nebo pomocí zadaní jména a hesla. Dále je řešeno i omezování klientů na základě skupin vyčitaných z AD přes LDAP. Toto omezování provádí SquidGuard.

Potřebné balíčky


Kerberos:

Samba + winbind (NTLM):

LDAP:

Speciality:

Popis funkce:

Ve squid budou povoleny autorizace pomocí Negotiate Kerberos + NTLM dále pak NTLM a nakonec basic. Takto bude zajištěno ověření klienta vždy i když neproběhne autorizace na pozadí pomocí Kerberos + NTLM nebo NTLM tak se udělá fallback a na klienta vyskočí klasické okno na zadání uživatelského jména a hesla.

Základní Konfigurace:

důležité je aby byl čas na AD a serveru stejný. Můžeme synchronizovat čas oproti AD. Dále je dobré nastavit AD jako nadřazený DNS nebo aspoň na něj posílat dotazy ohledně domény která je na něm nakonfigurovaná.

Kerberos konfigurace:

Doinstalujeme balíky pro kerbera a nastavíme soubor /etc/krb5.conf


	[logging]
	 default = FILE:/var/log/krb5libs.log
	 kdc = FILE:/var/log/krb5kdc.log
	 admin_server = FILE:/var/log/kadmind.log
	
	[libdefaults]
	 default_realm = LBWIN.NET
	 dns_lookup_realm = false
	 dns_lookup_kdc = false
	 ticket_lifetime = 24h
	 forwardable = yes
	
	[realms]
	 LBWIN.NET = {
	  kdc = windc.lbwin.net:88
	  admin_server = windc.lbwin.net:749
	  default_domain = lbwin.net
	 }
	
	[domain_realm]
	 .lbwin.net = LBWIN.NET
	 lbwin.net = LBWIN.NET
	
	[appdefaults]
	 pam = {
	   debug = false
	   ticket_lifetime = 36000
	   renew_lifetime = 36000
	   forwardable = true
	   krb4_convert = false
	 }

Správnou funkci můžeme ověřit pomocí přihlášení a získání tiketu:
kinit administrator
Přes klist si můžeme vypsat tikety a měli bychom vidět něco podobného:

	Ticket cache: FILE:/tmp/krb5cc_0
	Default principal: administrator@LBWIN.NET
	
	Valid starting     Expires            Service principal
	08/27/13 10:13:29  08/27/13 20:12:53  krbtgt/LBWIN.NET@LBWIN.NET
	        renew until 08/28/13 10:13:29
	
	
	Kerberos 4 ticket cache: /tmp/tkt0
	klist: You have no tickets cached

Když už jsme přihlášeni jako administrátor tak můžeme zařadit PC do domény a vytvořit si principaly + keytab:

	msktutil -c -b "CN=COMPUTERS" -s HTTP/vmssc10.lbwin.net -k /etc/squid/squid.keytab --computer-name VMSSC10 --upn HTTP/vmssc10.lbwin.net --server windc.lbwin.net --verbose --enctypes 28

Export keytabu dame do /etc/sysconfig/squid ať squid ví, že jej má použít:

	KRB5_KTNAME=/etc/squid/squid.keytab
	export KRB5_KTNAME

Konfigurace Samba + Winbind:


Upravíme konfiguraci /etc/samba/smb.conf:

	[global]
	workgroup = LBWIN
	realm = LBWIN.NET
	preferred master = no
	server string = squid proxy server
	security = ADS
	encrypt passwords = yes
	log level = 3
	log file = /var/log/samba/%m
	max log size = 50
	printcap name = cups
	printing = cups
	winbind enum users = Yes
	winbind enum groups = Yes
	winbind use default domain = Yes
	winbind nested groups = Yes
	winbind trusted domains only = Yes
	winbind cache time = 3600
	winbind separator = +
	;template primary group = “Domain Users”
	template shell = /bin/false

Nastartujeme služby smb a winbind. A přidáme PC do domény:

	net ads join -U Administrator

Otestujeme, že nám funguje winbind:

	wbinfo -t

Důležité je aby měl squid přístup do adresáře:

	/var/lib/samba/winbindd_privileged/

Konfigurace LDAP clienta:

Potřebujeme mít účet na AD který může mít dost ořezaná práva. Prakticky stačí když bude mít možnost se dotazovat LDAP DB. Důležité je aby se uživateli heslo nezměnilo a nevyexpirovalo.

Uděláme si txt soubor s heslem:


	echo 'squidpass' > /etc/squid/ldappass.txt
	chmod o-r /etc/squid/ldappass.txt
	chown squid /etc/squid/ldappass.txt

Konfigurace Squid:

A nyní asi to nejdůležitější poskládaní autorizaci ve squid.conf


	### Negotiate Kerberos a NTLM autentizace
	auth_param negotiate program /usr/local/bin/negotiate_wrapper -d --ntlm /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=LBWIN.NET --kerberos /usr/lib64/squid/squid_kerb_auth -d -s GSS_C_NO_NAME
	auth_param negotiate children 10
	auth_param negotiate keep_alive off
	
	### NTLM autentizace
	auth_param ntlm program /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=LBWIN.NET
	auth_param ntlm children 10
	auth_param ntlm keep_alive off
	
	### Basic autentizace přes LDAP
	auth_param basic program /usr/lib64/squid/squid_ldap_auth -R -b "dc=LBWIN,dc=NET" -D user@lbwin.net -W /etc/squid/ldappass.txt -f sAMAccountName=%s -h 10.76.10.183
	auth_param basic children 10
	auth_param basic realm Internet Proxy
	auth_param basic credentialsttl 1 minute

Nastartujeme squid a zkusíme si jej nastavit na stanici jako proxy. Zkusíme jít na nějaký web. V access.log bychom měli vidět uživatelské jméno. Případně laditelné info v cache.log.

Detailnější info a popis nalezneme zde: Squid Wiki

SquidGuard použití skupin z AD:

Ve SquidGuardu je možné použít LDAP dotaz pro "naplnění" zdrojové skupiny. Nutné je zkompilovat SquidGuard z volbou --with-ldap=yes. Pak již můžem v konfigu nastavit bind a dobu po kterou budou zaznamy kešovány v sekundách:


	ldapbinddn     CN=uzivatelske_jmeno_popis,OU=uzivatele,OU=lbwin,DC=lbwin,DC=net
	ldapbindpass   heslo_uzivatele
	ldapcachetime  300

Ve zdrojové skupine pak již jen použijeme ldapusersearch:

	source test {
	        ldapusersearch ldap://windc.lbwin.net:3268/DC=lbwin,DC=net?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=test,OU=skupiny,OU=lbwin,DC=lbwin,DC=net))
	}

Pro skupinu pak již jen standartně vytvoříme ACL a vše by mělo fungovat.