PFSense: Proxy autenticado e gerenciando ACLs com base em grupos do Active Directory

ATUALIZAÇÃO 01/06/2018: Se você chegou até este post, escrito em 2011, procurando informações atualizadas sobre como realizar autenticação do pfSense no Microsoft Active Directory, sugiro fortemente que você leia ou conheça melhor o UserAuth. Entendo que é a forma mais eficiente e atual de se fazer isso, especialmente em nível corporativo. O Squid3 e principalmente o SquidGuard são pacotes relativamente antigos e pouco performáticos em redes maiores ou muito assediadas (muitas conexões).

Este tutorial demonstra como utilizar os recursos da biblioteca squid_ldap_group para que o Squid autentique os usuários por grupos cadastrados no Active Directory.

Autor: Ricardo Pardim Claus (ricardodru em yahoo.com.br)

Tags: Squid, pfSense, Active Directory, AD,  openldap-client, squid_ldap_group, squid_ldap_auth, squid.inc

Verão do sistema e pacotes utilizados:

  • pfSense versão 2.0 RC3
  • Squid versão 2.7
  • Windows 2003 R2

Existe um bug no squid e no openldap-client, ambos nas versões anteriores à 2.0 do pfSense. Caso o seu pfSense esteja em produção, e não tem como fazer uma nova instalação, deverá primeiro resolver estes problemas seguindo estes tutoriais:

Bases de Referencias:

Mãos a obra:

Primeiramente, o squid não pode estar configurado em modo proxy transparente. Neste modo, não é possível nem ao menos configurar as opções de autenticação no webgui do pfSense, já que proxy transparente não faz autenticação.

No Active Directory, crie uma OU, com o nome “Internet”.
Nesta OU, crie 2 grupos “Internet-TI”, e “Internet-Bancos”, ou qualquer nome que mais lhe agradar.
O grupo Internet-TI, tem acesso full, sem nenhum bloqueio.
Já o internet-bancos, ira navegar apenas em sites cadastrados em uma lista (lista branca).

Na OU “Users”, crie um usuário com qualquer nome, aqui utilizei o usuário squid.
Defina uma senha para este usuário, e lembre de marcar a opção para não expirar a senha deste usuário.

Após concluir toda a configuração indicada neste tutorial, você poderá criar quantos grupos desejar, e seguir com os bloqueios e liberação para cada um deles.

Suponho que o seu Squid já esteja funcionando com os bloqueios desejados.
Antes, é necessário alterar as regras de firewall, para que as estações clientes sejam obrigadas a utilizarem o proxy local para ter acesso a internet.

No menu Firewall > Rules, as regras devem ficar conforme imagem abaixo:
OBS: A regra importante que desabilitei, foi a segunda regra, pois ela permite acesso total a qualquer endereço de destino. Note que no final das regras, eu criei uma regra semelhante.

Figura 1 – Regras de firewall

Agora vamos as configurações do squid.
Acesse o menu Services > Proxy Server.
Na guia “General”, desabilite a opção de “Proxy Transparente”.
Em seguida, acesse a guia “Auth Settings”.
Altere as regras conforme a imagem abaixo:

Figura 2 – Configuração da guia Auth Settings do Squid

Explicando os valores que utilizei, para servir como referencia:

Meu dominio: dominio.com.br
Servidor AD: 10.0.0.2
Usuário: squid (Este usuário que fará a autenticação no AD, para efetuar as pesquisas na base de dados ldap).

Nota: Muitos tutoriais existentes na internet, indica para utilizar um usuário Administrator para pesquisar na base de dados ldap. Mas não é necessário que o usuário seja administrador. Crie um usuário com um nome qualquer, sem que este seja administrador do sistema. Isto aumenta a segurança, já que a autenticação é feita em texto puro, sem nenhum tipo de encriptação. (Vide seção “Testes e resultados”)

Após efetuar as alterações e salvar, e inclusive o proxy configurado no navegador da maquina cliente, o Squid já ira solicitar autenticação para navegar.

Autenticação por Grupo
Falta configurar o squid para autenticar por grupo, e não por usuário ou IP.

Lembrando que nenhuma alteração deve ser feito no arquivo squid.conf (/usr/local/etc/squid/squid.conf), como é feito em outras distribuições linux.
Estas configurações são sobre escritas sempre que o pfSense for reiniciado, ou qualquer alteração feita pela webgui.
O correto é alterar diretamente o arquivo squid.inc.
Este arquivo se encontra neste diretorio: /usr/local/pkg/squid.inc

O código gerado após configurar a autenticação na guia “Auth Settings” do squid, ira gerar estas linhas no squid.conf:

auth_param basic program /usr/local/libexec/squid/squid_ldap_auth -v 3 -b dc=dominio,dc=com,dc=br -D cn=squid,cn=Users,dc=dominio,dc=com,dc=br -w 1234 -f “cn=%s” -u uid -P 10.0.0.2:389

Todas as alterações que for feita no squid.inc, após salvar, poderá ver no arquivo squid.conf, como esta ficando as configurações, para efeitos didáticos

Localize estas linhas no squid.inc:

auth_param basic children $processes
auth_param basic realm $prompt
auth_param basic credentialsttl $auth_ttl minutes
acl password proxy_auth REQUIRED

Após localizar, insira estas linhas, para que a autenticação seja feita por grupo, e inclusive, ativa os bloqueios/liberação nos grupos desejados:

#AUTENTICACAO POR GRUPOS DO AD

external_acl_type ldap_group children=30 %LOGIN /usr/local/libexec/squid/squid_ldap_group -v 3  -R -b “dc=dominio,dc=com,dc=br” -D “cn=squid,cn=Users,dc=dominio,dc=com,dc=br” -w “1234” -f “(&(objectclass=person) (sAMAccountName=%v) (memberof=cn=%a,ou=Internet,dc=dominio,dc=com,dc=br))” -h  10.0.0.2 -p 389

#LIBERAÇÃO/BLOQUEIO DOS GRUPOS
#Grupo Acesso Padrao Acesso Limitado
acl ldapInternet-Bancos external ldap_group Internet-Bancos
#Grupo Acesso Full Acesso Full
acl ldapInternet-TI external ldap_group Internet-TI

#acl bloqueio url_regex -i “/var/squid/acl/bloqueio.acl”
acl liberado url_regex -i “/var/squid/acl/liberado.acl”
http_access allow ldapInternet-TI
http_access deny ldapInternet-Bancos !liberado

Note que para fins de testes, eu deixei desabilitado a ACL “bloqueio”, já que neste ambiente, irei utilizar apenas 2 grupos. Um com acesso total, e outro com acesso limitado.
O grupo Internet-Bancos, definido na ACL  ldapInternet-Bancos, irá acessar apenas os sites cadastrados no arquivo liberado.acl (ACL liberado), comumente chamado de “lista branca”.
Mas nada impede que seja utilizado mais grupos, e outros tipos de bloqueio, ficando a critério de cada um.
Não esqueça de criar os arquivos bloqueio.acl, e liberado.acl, e colocar algumas URL’s no seu conteúdo.

Testes e resultados:
Antes de alterar o pfsense da empresa onde trabalho, efetuei testes em 3 maquinas virtuais (WinXP, pfSense 2.0 RC3 e Win2003 R2 Standard Edition).

Na VM, não foi necessário colocar um usuário administrador para efetuar as pesquisas no LDAP. Mas já no pfSense instalado na empresa, isso não funcionou. Assim tive que colocar o usuário Administrator do Win2003 para pesquisar no LDAP deste servidor. Portanto, caso não funcione com usuário comum, troque pelo usuário administrator, na guia Auth Settings, e tambem na linha em que “external_acl_type ldap_group” no arquivo squid.inc.

No pfSense (empresa), as configurações da guia “Auth Settings” do squid, foi necessário alterar a opção LDAP search filter, de cn=%s, para  sAMAccountName=%s, ficando assim:

Authentication server
10.0.0.2

Authentication server port
389

LDAP server user DN
cn=Administrator,cn=Users,dc=dominio,dc=com,dc=br

LDAP password
senha

LDAP base domain
dc=dominio,dc=com,dc=br

LDAP username DN attribute
uid

LDAP search filter
sAMAccountName=%s

Finalizando:
Depois de algumas semanas pesquisando na internet, estes foram os passos que segui para que o Squid do pfSense autenticasse por grupos no Active Directory.

Atualização 11/01/2012: Acaba de ser publicado, pelo colega de fórum Zeon, um tutorial mais atualizado explicando como fazer seu pfSense autenticar (através de uma conta pré-definida) diretamente no seu servidor MS Active Directory. O texto é bem didático e merece uma leitura atenta. 😉

Estetutorialdemonstracomoutilizarosrecursosdabibliotecasquid_ldap_groupparaqueo SquidautentiqueosusuáriosporgruposcadastradosnoActiveDirectory.

Por: RicardoPardimClaus

29/07/2011

Tags: Squid, pfSense, Active Directory, AD,openldap-client, squid_ldap_group, squid_ldap_auth, squid.inc

Verão do sistema epacotesutilizados:

pfSenseversão 2.0 RC3

Squidversão 2.7

Windows 2003 R2

Existeumbugnosquidenoopenldap-client, ambosnasversõesanterioresà 2.0 dopfSense.

CasooseupfSenseestejaemprodução, enãotemcomofazerumanovainstalação, deveráprimeiro resolver estes problemas seguindoestestutoriais:

http://www.fug.com.br/content/view/689/77/

http://www.vivaolinux.com.br/dica/Corrigindo-a-opcao-de-Delay-Pools-e-autenticacao-Ldap-do-Squid-2.7.8_1-no-PfSense-1.2.3Release

BasesdeReferencias:

http://forum.pfsense.org/

http://www.squid-cache.org.br/index.php?option=com_content&task=view&id=50&Itemid=27

http://www.cyberciti.biz/tips/howto-configure-squid-ldap-authentication.html

http://www.papercut.com/kb/Main/ConfiguringSquidProxyToAuthenticateWithActiveDirectory

http://forum.pfsense.org/index.php/topic,20208.0.html

http://www.digipedia.pl/man/doc/view/squid_ldap_auth.8

Mãosaobra:

Primeiramente, osquidnãopodeestarconfigurado em modo proxytransparente. Nestemodo, nãoépossívelnemaomenosconfigurarasopçõesdeautenticaçãonowebguidopfSense, já que proxy transparente não faz autenticação.

NoActiveDirectory, crieumaOU, comonome “Internet”.

NestaOU, crie 2 grupos “Internet-TI”, e “Internet-Bancos”, ouqualquernomequemaislheagradar.

OgrupoInternet-TI, temacessofull, semnenhumbloqueio.

Jáointernet-bancos, iranavegarapenasemsitescadastradosemumalista (listabranca).

NaOU “Users”, crieumusuáriocomqualquernome, aquiutilizeiousuáriosquid.

Definaumasenhaparaesteusuário, elembredemarcaraopçãoparanãoexpirarasenhadesteusuário.

Apósconcluirtodaaconfiguraçãoindicadanestetutorial, vocêpoderácriarquantosgruposdesejar, eseguircomosbloqueioseliberaçãoparacadaumdeles.

Suponhoqueoseu Squidjáestejafuncionandocomosbloqueiosdesejados.

Antes, énecessárioalterarasregrasdefirewall, paraqueasestaçõesclientessejamobrigadasautilizaremoproxylocalparateracessoainternet.

NomenuFirewall > Rules, asregrasdevemficarconformeimagemabaixo:

OBS: Aregraimportantequedesabilitei, foiasegundaregra, poiselapermiteacessototalaqualquerendereçodedestino. Notequenofinaldasregras, eucrieiumaregrasemelhante.

Figura 1 – Regrasdefirewall

Agoravamosasconfiguraçõesdosquid.

AcesseomenuServices > ProxyServer.

Naguia “General”, desabiliteaopçãode “ProxyTransparente”.

Emseguida, acesseaguia “AuthSettings”.

Altereasregrasconformeaimagemabaixo:

Figura 2 – ConfiguraçãodaguiaAuthSettingsdoSquid

Explicandoosvaloresqueutilizei, paraservircomoreferencia:

Meudominio:dominio.com.br

ServidorAD: 10.0.0.2

Usuáriosquid:

EsteusuárioquefaráaautenticaçãonoAD, paraefetuaraspesquisasnabasededadosldap.

Nota: Muitostutoriaisexistentesnainternet, indicaparautilizarumusuárioAdministratorparapesquisarnabasededadosldap. Masnãoénecessárioqueousuáriosejaadministrador. Crieumusuáriocomumnomequalquer, semqueestesejaadministradordosistema. Istoaumentaasegurança, jáqueaautenticaçãoéfeitaemtextopuro, semnenhumtipodeencriptação. (Vide seção “Testes e resultados”)

Apósefetuarasalteraçõesesalvar, einclusiveoproxyconfiguradononavegadordamaquinacliente, oSquidjáirasolicitarautenticaçãoparanavegar.

AutenticaçãoporGrupo

Faltaconfigurarosquidparaautenticarporgrupo, enãoporusuárioouIP.

Lembrandoquenenhumaalteraçãodeveserfeitonoarquivosquid.conf (/usr/local/etc/squid/squid.conf), comoéfeitoemoutrasdistribuiçõeslinux.

EstasconfiguraçõessãosobreescritassemprequeopfSenseforreiniciado, ouqualqueralteraçãofeitapelawebgui.

Ocorretoéalterardiretamenteoarquivosquid.inc.

Estearquivoseencontranestediretorio: /usr/local/pkg/squid.inc

Ocódigogeradoapósconfiguraraautenticaçãonaguia “AuthSettings” dosquid, iragerarestaslinhasnosquid.conf:

auth_parambasicprogram /usr/local/libexec/squid/squid_ldap_authv 3 –bdc=dominio,dc=com,dc=brDcn=squid,cn=Users,dc=dominio,dc=com,dc=brw 1234 –fcn=%s” –uuidP 10.0.0.2:389

Todasasalteraçõesqueforfeitanosquid.inc, apóssalvar, poderávernoarquivosquid.conf, comoestaficandoasconfigurações, paraefeitosdidáticos

Localizeestaslinhasnosquid.inc:

auth_parambasicchildren $processes

auth_parambasicrealm $prompt

auth_parambasiccredentialsttl $auth_ttlminutes

aclpasswordproxy_authREQUIRED

Apóslocalizar, insiraestaslinhas, paraqueaautenticaçãosejafeitaporgrupo, einclusive, ativaosbloqueios/liberaçãonosgruposdesejados:

#AUTENTICACAOPORGRUPOSDOAD

external_acl_typeldap_groupchildren=30 %LOGIN /usr/local/libexec/squid/squid_ldap_groupv 3-Rbdc=dominio,dc=com,dc=br” –Dcn=squid,cn=Users,dc=dominio,dc=com,dc=br” –w “1234” –f “(&(objectclass=person) (sAMAccountName=%v) (memberof=cn=%a,ou=Internet,dc=dominio,dc=com,dc=br))” –h10.0.0.2 –p 389

#LIBERAÇÃO/BLOQUEIODOSGRUPOS

#GrupoAcessoPadraoAcessoLimitado

aclldapInternetBancosexternalldap_groupInternetBancos

#GrupoAcessoFullAcessoFull

aclldapInternetTIexternalldap_groupInternetTI

#aclbloqueiourl_regexi “/var/squid/acl/bloqueio.acl

aclliberadourl_regexi “/var/squid/acl/liberado.acl

http_accessallowldapInternetTI

http_accessdenyldapInternetBancos !liberado

Notequeparafinsdetestes, eudeixeidesabilitadoaACL “bloqueio”, jáquenesteambiente, ireiutilizarapenas 2 grupos. Umcomacessototal, eoutrocomacessolimitado.

OgrupoInternet-Bancos, definidonaACLldapInternet-Bancos, iráacessarapenasossitescadastradosnoarquivoliberado.acl (ACLliberado), comumentechamadode “listabranca”.

Masnadaimpedequesejautilizadomaisgrupos, eoutrostiposdebloqueio, ficandoacritériodecadaum.

Nãoesqueçadecriarosarquivosbloqueio.acl, eliberado.acl, ecolocaralgumasURL’snoseuconteúdo.

Testeseresultados:

Antesdealteraropfsensedaempresaondetrabalho, efetueitestesem 3 maquinasvirtuais (WinXP, pfSense 2.0 RC3 eWin2003 R2 StandardEdition).

NaVM, nãofoinecessáriocolocarumusuárioadministradorparaefetuaraspesquisasnoLDAP. MasjánopfSenseinstaladonaempresa, issonãofuncionou. AssimtivequecolocarousuárioAdministratordoWin2003 parapesquisarnoLDAPdesteservidor. Portanto, casonãofuncionecomusuáriocomum, troquepelousuárioadministrator, naguiaAuthSettings, etambemnalinhaemque “external_acl_typeldap_group” noarquivosquid.inc.

NopfSense (empresa), asconfiguraçõesdaguia “AuthSettings” dosquid, foinecessárioalteraraopçãoLDAPsearchfilter, decn=%s, parasAMAccountName=%s, ficandoassim:

Authenticationserver

10.0.0.2

Authenticationserverport

389

LDAPserveruserDN

cn=Administrator,cn=Users,dc=dominio,dc=com,dc=br

LDAPpassword

senha

LDAPbasedomain

dc=dominio,dc=com,dc=br

LDAPusernameDNattribute

uid

LDAPsearchfilter

sAMAccountName=%s

Finalizando

Depoisdealgumassemanaspesquisandonainternet, estesforamospassosqueseguiparaqueoSquid dopfSenseautenticasseporgruposnoActiveDirectory.