Integrace Squid proxy s AD
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:
- krb5-workstation
- krb5-libs
Samba + winbind (NTLM):
- samba
- samba-common
- samba-winbind-clients
- samba-winbind
LDAP:
- openldap-clients
Speciality:
- mktutil - pomocí kerbera založí účet PC a přiřadí k němu principaly + vygeneruje keytab. Fuhm.net
- negotiate_wrapper - wraper pro NTLM + Kerberos autorizaci do squid SourceForge negotiate_wrapper
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.