Pfsense + Squid + NTLM (Autenticação AD transparente)
-
com a atualização parou de funcionar o squid e tive que reinstalar, porém sem autenticação transparente. Nem instalando a versão 2.4.3 não rola a instalação do squid.
To preso na 2.4.4 sem autenticação no samba4 (NTLM)
existe alguma outra ofrma de por pra funcionar com NTLM (autenticação transparente)? -
Não seria melhor utilizar autenticação SSO por Kerberos? Já que não precisa utilizar nenhum pacote extra?
SETSPN:
Criar usuário svc_quid no AD
C:\WINDOWS\system32>setspn -S HTTP/pfsense.local.lan svc_squid
Verificando o domínio DC=local,DC=lanDepois, através do samba-tools, ou através diretamente do AD, através do ktpass
sudo samba-tool domain exportkeytab mykeytab.keytab --principal=HTTP/pfsense.local.lan
Squid:
acl whitelist dstdomain .local.lan
auth_param negotiate program /usr/local/libexec/squid/negotiate_kerberos_auth -k /usr/local/etc/squid/mykeytab.keytab
auth_param negotiate children 100
auth_param negotiate keep_alive on
http_access allow whitelist
acl auth proxy_auth REQUIRED
http_access deny !auth
http_access allow authSquidguard
ldapusersearch ldap://raspsrv.local.lan:3268/dc=local,dc=lan?userPrincipalName?sub?(&(memberof=CN=internet_group%2cCN=Users%2cDC=local%2cDC=lan)(userPrincipalName=%s))
Depois de configurado, loguem novamente no AD, e chamem o proxy pelo nome, ele deve associar ao ticket kerberos.
Digitem klist no CMD do DOS para ver se ele foi adicionado corretamente.Maiores detalhes:
https://journeyofthegeek.com/2017/12/30/pfsense-squid-kerberos/
-
@mcury
Meu DC é samba4 vou pesquisar se encontro um guia pra ele, vlw pela dica -
Olá Fabio,
Esse tutorial que pus ali em cima, funciona para samba 4.
Funciona em AD de servidor Windows tambem. -
quando vou criar o keytab me retorna esse erro:
ktpass : O termo 'ktpass' não é reconhecido como nome de cmdlet, função, arquivo de script ou programa
operável. Verifique a grafia do nome ou, se um caminho tiver sido incluído, veja se o caminho está
correto e tente novamente.
No linha:1 caractere:1- ktpass -out c:\pfsense.keytab -princ HTTP/pfsense.dominio.lan@DOMINIO ...
Estou tentando pelo CMD no windows (membro do dominio)
-
O seu comando ktpass está igualzinho lá no link que eu passei?
https://journeyofthegeek.com/2017/12/30/pfsense-squid-kerberos/Caso queira dar uma aprofundada no ktpass:
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ktpassCaso não funcione pelo ktpass, voce pode extrair a chave utilizando o samba-tools:
Abaixo segue o comando que eu usei no meu domínio:sudo samba-tool domain exportkeytab mykeytab.keytab --principal=HTTP/pfsense.local.lan
Quando fiz esse comando, o meu samba 4 era o domain controller
Depois copiei a chave para a pasta do pfsense /usr/local/etc/squid/mykeytab.keytab -
@mcury
Obrigado pelas dicas.
Eu fiz pelo samba-tools, mas agora o navegador fica solicitando login infinitamente.
não importa o que eu use ele fica solicitando e não deixa navegar.usei: samba-tool domain exportkeytab pfsense.keytab --principal=HTTP/pfsense.dominio.lan
qual seria o comando pra gerar o spn no samba-tools? vou tentar fazendo tudo por ele.
squid ficou assim:
auth_param negotiate program /usr/local/libexec/squid/negotiate_kerberos_auth -d -k /usr/local/etc/squid/pfsense.keytab
auth_param negotiate children 1000
auth_param negotiate keep_alive on
acl auth proxy_auth REQUIRED
http_access deny !auth
http_access allow authps.: o PC pfsense precisa estar adicionado ao dominio?
antes com o pf2ad ele adicionava e agora q não tem não está adicionado. -
Olá Fabio, o pfsense não precisa estar no domínio.
O que aparece nos logs do Squid/Squidguard durante os acessos?O comando que eu utilizei foi exatamente esse:
sudo samba-tool domain exportkeytab mykeytab.keytab --principal=HTTP/pfsense.local.lan
Você configurou o krb5.conf no /etc/ do samba server?
Ele também precisa ser configurado conforme no link que te mandei.Eu infelizmente agora não estou em casa, mas assim que chegar copio o meu krb5.conf aqui pra ajudar.
Teste inicialmente um usuário com uma senha simples (sem caracteres especiais), e se possível, que seja membro de um grupo de AD onde o caminho da arvore não tenha espaços ou caracteres especiais.
Isso me atrapalhou bastante no inicio.
Até breve
-
Segue:
Estou utilizando o mesmo domínio do exemplo acima.
O que está em maiúsculo precisa ficar em maiúsculo, exatamente como está aí embaixo, ok?pi@raspsrv:~ $ cat /etc/krb5.conf
[libdefaults]
default_realm = LOCAL.LAN
dns_lookup_realm = false
dns_lookup_kdc = true
[realms]
LOCAL.LAN = {
kdc = raspsrv.local.lan
admin_server = raspsrv.local.lan
default_domain = local.lan
}
[domain_realm]
.local.lan = LOCAL.LAN
local.lan = LOCAL.LAN -
@mcury
Bom dia amigo.o usuário do pFsense é pfsense e a senha é somente com números e fica no Users do AD.
qual seria o comando que indica o usuário como SPN para que depois se exporte a keytab? o correspondente ao comando do windows "setspn".
no log do meu squid:
Date IP Status Address User Destination
24.10.2018 08:29:59 10.0.2.106 TCP_DENIED/407 clients4.google.com:443 - -Date-Time Message
31.12.1969 21:00:00 negotiate_kerberos_auth: WARNING: received type 1 NTLM token
31.12.1969 21:00:00 negotiate_kerberos_auth: DEBUG: Decode 'TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKAO5CAAAADw==' (decoded length: 40).Krb5.conf (PFSENSE)
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log[libdefaults]
default_realm = DOMINIO.LAN
dns_lookup_realm = false
dns_lookup_kdc = true
ticket_lifetime = 48h
forwardable = yes
; for Windows 2008 with AES
default_tgs_enctypes = aes128-cts-hmac-sha1-96 aes256-cts-hmac-s
ha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = aes128-cts-hmac-sha1-96 aes256-cts-hmac-s
ha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes128-cts-hmac-sha1-96 aes256-cts-hmac-sha
1-96 rc4-hmac des-cbc-crc des-cbc-md5[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}[realms]
DOMINIO.LAN = {
kdc = ad-dc.dominio.lan
admin_server = ad-dc.dominio.lan
default_domain - dominio.lan}
[domain_realm]
.dominio.lan = DOMINIO.LAN
dominio.lan = DOMINIO.LANKrb5.conf (AD)
[libdefaults]
default_realm = DOMINIO.LAN
dns_lookup_realm = false
dns_lookup_kdc = true[realms]
DOMINIO.LAN = {
kdc = ad-dc.dominio.lan}
[domain_realm]
.dominio.lan = DOMINIO.LAN
dominio.lan = DOMINIO.LAN -
Infelizmente o setspn só pode ser feito no Windows, com o pacote RSAT.
Já o ktpass pode ser usado tanto no samba como no Windows Server.Primeiro ponto:
O pfsense está com domain override no DNS para o seu dominio, e apontando pro DNS do AD?
Ou o pfsense está configurado para utilizar apenas o DNS do AD?Tudo que for relacionado ao seu AD, inclusive as atividades do Kerberos, precisam resolver corretamente, portanto precisa de uma dessas configurações.
Segundo ponto:
O /etc/krb5.conf do PFSENSE precisa estar da forma abaixo, observe que removi alguns parâmetros de criptografia para facilitar (dessa forma funciona), pois existem diferenças entre o MIT e o Heimdal, que não vem ao caso agora.
[2.4.4-RELEASE][root@pfsense.local.lan]/root: cat /etc/krb5.conf
[libdefaults]
default_realm = LOCAL.LAN
dns_lookup_realm = false
dns_lookup_kdc = true[realms]
LOCAL.LAN = {
kdc = raspsrv.local.lan
}[domain_realm]
.local.lan = LOCAL.LAN
local.lan = LOCAL.LAN[logging]
kdc = FILE:/var/log/kdc.log
Default = FILE:/var/log/krb5lib.logA configuração do smb.conf localizado no AD, eu já postei anteriormente.
Após ter feito essas configurações, você já pode testar com o kinit svc_squid ou pfsense como você criou diretamente do PFSENSE.
Caso funcione, você conseguirá listar o ticket com o comando klist em seguida.
Depois desse passo, você segue com as configurações que já citei acima ok?
-
This post is deleted! -
Consegui, muito obrigado.
no navegador estava o IP do proxy e ao mudar pro nome funcionou.
NS Lookup funcionando e reconhecendo normalmente quando informo o nome do PC, não entendi pq não encontrou com o IP e somente com o nome.Agora vou pra 2a etapa que é com o sarg. Vou seguir as suas orientações. Obrigado
-
De nada Fabio, é um prazer ajudar.
Agora, SSO sem precisar alterar os pacotes originais do Pfsense.Saiu atualização, voce atualiza, sem se preocupar com samba.
Abraços.
-
@mcury
agora pode atualizar sem preocupação, bem melhor.Mas o Squidguard não tá bloqueando reconhece o usuário, mas não faz o bloqueio.
segue as configs dele:
com ip ou nome não bloqueia.
usuário abaixo era pra ser bloqueado o acesso no grupo Internet_L0:
-
Desmarca as opções de STRIP NT domain e STRIP Kerberos Kealm e tenta de novo.
Caso não funcione, checa o ldapusersearch para ver se está de acordo, o que eu colei aqui, funcionou perfeitamente para o meu AD em samba 4.
ldapusersearch ldap://raspsrv.local.lan:3268/dc=local,dc=lan?userPrincipalName?sub?(&(memberof=CN=internet_group%2cCN=Users%2cDC=local%2cDC=lan)(userPrincipalName=%s))
Você pode estar testando a porta 389 também.
Você desativou a autenticação do Squid, certo?
A configuração é praticamente toda no Squidguard -
nada amigo, quebrando cabeça aqui.
fiz o que me orientou, mas não bloqueia por grupo.
se o problema fosse no ticket ele também não mostraria o usuário no log do squid né?
no log squidguard ele nem mostra nada, somente no cache.
-
Exato, o mais difícil você já fez, que é o ticket e a autenticação no proxy.
O problema agora é simplesmente a sintaxe do ldapusersearch.O meu funcionou daquela maneira, já testou outras sintaxes?
-
@mcury
mano do céu!!!já tentei de tudo velho.
ldapusersearch ldap://ad-dc.dominio.lan:389/dc=dominio,dc=lan?userPrincipalName?sub?(&(userPrincipalName=%s)(memberof=cn=internet_L0%2cou=Ti%2cdc=dominio%2cdc=lan))
ldapusersearch ldap://10.0.0.22:389/dc=dominio,dc=lan?userPrincipalName?sub?(&(userPrincipalName=%s)(memberof=cn=internet_L0%2cou=Ti%2cdc=dominio%2cdc=lan))
ldapusersearch ldap://ad-dc.dominio.lan:3268/dc=dominio,dc=lan?userPrincipalName?sub?(&(userPrincipalName=%s)(memberof=cn=internet_L0%2cou=Ti%2cdc=dominio%2cdc=lan))
ldapusersearch ldap://10.0.0.22:3268/dc=dominio,dc=lan?userPrincipalName?sub?(&(userPrincipalName=%s)(memberof=cn=internet_L0%2cou=Ti%2cdc=dominio%2cdc=lan))
squid.conf
This file is automatically generated by pfSense
Do not edit manually !
http_port 10.0.0.250:3128
icp_port 0
digest_generation off
dns_v4_first off
pid_filename /var/run/squid/squid.pid
cache_effective_user squid
cache_effective_group proxy
error_default_language en
icon_directory /usr/local/etc/squid/icons
visible_hostname localhost
cache_mgr admin@localhost
access_log /var/squid/logs/access.log
cache_log /var/squid/logs/cache.log
cache_store_log none
netdb_filename /var/squid/logs/netdb.state
pinger_enable on
pinger_program /usr/local/libexec/squid/pingerlogfile_rotate 14
debug_options rotate=14
shutdown_lifetime 3 secondsAllow local network(s) on interface(s)
acl localnet src 10.0.0.0/22
forwarded_for on
uri_whitespace stripacl dynamic urlpath_regex cgi-bin ?
cache deny dynamiccache_mem 2000 MB
maximum_object_size_in_memory 256 KB
memory_replacement_policy heap GDSF
cache_replacement_policy heap LFUDA
minimum_object_size 0 KB
maximum_object_size 4 MB
cache_dir ufs /var/squid/cache 60000 256 256
offline_mode off
cache_swap_low 90
cache_swap_high 95
cache allow all
###Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|?) 0 0% 0
refresh_pattern . 0 20% 4320###Remote proxies
Setup some default acls
ACLs all, manager, localhost, and to_localhost are predefined.
acl allsrc src all
acl safeports port 21 70 80 210 280 443 488 563 591 631 777 901 3128 3129 1025-65535
acl sslports port 443 563acl purge method PURGE
acl connect method CONNECTDefine protocols used for redirects
acl HTTP proto HTTP
acl HTTPS proto HTTPS
http_access allow manager localhosthttp_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !safeports
http_access deny CONNECT !sslportsAlways allow localhost connections
http_access allow localhost
request_body_max_size 0 KB
delay_pools 1
delay_class 1 2
delay_parameters 1 -1/-1 -1/-1
delay_initial_bucket_level 100
delay_access 1 allow allsrcReverse Proxy settings
Package Integration
url_rewrite_program /usr/local/bin/squidGuard -c /usr/local/etc/squidGuard/squidGuard.conf
url_rewrite_bypass off
url_rewrite_children 16 startup=8 idle=4 concurrency=0Custom options before auth
acl whitelist dstdomain .local.lan
auth_param negotiate program /usr/local/libexec/squid/negotiate_kerberos_auth -k /usr/local/etc/squid/squidproxy.keytab
auth_param negotiate children 100
auth_param negotiate keep_alive on
http_access allow whitelist
acl auth proxy_auth REQUIRED
http_access deny !auth
http_access allow authSetup allowed ACLs
Allow local network(s) on interface(s)
http_access allow localnet
Default block all to be sure
http_access deny allsrc
SquidGuard
logdir /var/squidGuard/log
dbhome /var/db/squidGuard
ldapbinddn CN=pfsense,CN=Users,DC=dominio,DC=lan
ldapbindpass 123456
ldapprotover 3#ACL Bloqueio Nivel 1
src Internet_L0 {
ldapusersearch ldap://ad-dc.dominio.lan:389/dc=dominio,dc=lan?userPrincipalName?sub?(&(userPrincipalName=%s)(memberof=cn=internet_L0%2cou=Ti%2cdc=dominio%2cdc=lan))
log block.log
}dest blk_BL_adv {
domainlist blk_BL_adv/domains
urllist blk_BL_adv/urls
log block.log
}rew safesearch {
s@(google../search?.q=.)@&safe=active@i
s@(google../images.q=.)@&safe=active@i
s@(google../groups.q=.)@&safe=active@i
s@(google../news.q=.)@&safe=active@i
s@(yandex../yandsearch?.text=.)@&fyandex=1@i
s@(search.yahoo../search.p=.)@&vm=r&v=1@i
s@(search.live../.q=.)@&adlt=strict@i
s@(search.msn../.q=.)@&adlt=strict@i
s@(.bing..*/.q=.)@&adlt=strict@i
log block.log
}acl {
# ACL Bloqueio Nivel 1
Internet_L0 {
pass permitidos_todos none
log block.log
}
#
default {
pass none
redirect http://10.0.0.250:80/sgerror.php?url=403%20&a=%a&n=%n&i=%i&s=%s&t=%t&u=%u
log block.log
}
} -
Pelo que eu vi nas suas tentativas, você não usou o memberof logo após o sub como está ai embaixo, tem que por memberof antes do caminho da arvore.
O seu ficaria assim:
ldapusersearch ldap://ad-dc.dominio.lan:3268/DC=dominio,DC=lan?userPrincipalName?sub?(&(memberof=CN=internet_L0%2cOU=Ti%2cDC=dominio%2cDC=lan)(userPrincipalName=%s))
Testa ai e me fala ok?