Tutorial - SquidGuard + LdapGroup (permissão por grupo no ad)
-
Olá pessoal.
Alguém sabe me dizer se existe alguma maneira de fazer o squidGuard realizar a autenticação Ldap por Grupo utilizando a interface do PFsense?
Usando as seguintes diretivas, creio que isso é possível
ldapbinddn cn=root, dc=example, dc=com
ldapbindpass myultrasecretpasswordldap cache time in seconds
ldapcachetime 300
src my_users {
ldapusersearch ldap://ldap.example.com/cn=squidguardusers,ou=groups,dc=example,dc=com?memberUid?sub?(&(objectclass=posixGroup)(memberUid=%s))
}Mas a interface do Pfsense permite isso?
Obrigado
Carlos
-
Você já olhou os tutoriais ou deu uma pesquisada no forum?
Tem um tópico praticamente idêntico ao seu logo abaixo
http://forum.pfsense.org/index.php/topic,47045.0.html
-
Já olhei sim.
O tópico menciona a autenticação feita diretamente pelo squid e não pelo squidGuard.
:)
Obrigado
-
Ccesario,
Via gui o dvserg(que deve ser o mantenedor do pacote) já te deu um banho de água fria.
Mas, porém contudo todavia, você pode incluir esta configuração no arquivo que gera o squidguard.conf.
Se esta função não exigir novos parâmetros de compilação você pode até postar o resultado e transformar isso em um tutorial.
Att,
Marcello coutinho -
Pois é….
O dvserg foi bem claro :P
Marcelo, investigando um produto que tem como base o PFsense e tem essa "funcionalidade" implementada, vi que o pessoal fez umas alterações no squidGuard.
1- Criaram um "utilitario" para fazer a consulta do usuário e trazer os grupos:
ex:# squidGuardGrupos.pl usuario G_ACESSO_FULL G_ACESSO_REDES_SOCIAIS Domain Admins
2 - Fizeram uma alteração no squidGuard para executar esse "utilitario" e validar se o usuario pertence ao grupo
squidGuard %s started (%d.%03d) squidGuard ready for requests (%d.%03d) Verificando acesso do user - %s - %s squidGuardGrupos.pl %s 2>/dev/null
Isso foi o que consegui descobrir
Segue abaixo o codigo do "utilitario"
#!/usr/local/bin/perl use Data::Dumper; use Net::LDAP; $user = $ARGV[0]; $ldap = Net::LDAP->new( '192.168.x.x' ) or die "$@"; $mesg = $ldap->bind('CN=UserProxy,CN=Users,DC=dominio,DC=local', password => 'SENHA'); $mesg = $ldap->search(base=>"dc=dominio,dc=local", filter => "sAMAccountName=$user", attrs => "memberof"); $counter = $mesg->count(); @groups = $mesg->as_struct(); for ($i=0;$i<$counter;$i++) { $entry = $mesg->entry(); @groups = $entry->get_value('memberof'); } foreach(@groups){ $line = $_; $line=~s/^CN=//; @corte = split(",",$line); printf ("%s ",$corte[0]); } print "\n";
E no PFSense, basta inserir o nome do Grupo ao invés do nome do usuario na ACL do squidGuard.
:)
Será que existe algum programador na lista c++ (eu acho) na lista que possa contribuir ?
Desse modo, nao seria necessário interferir na GUI do pfsense, mantendo toda a estrutura intacta!
Abraço e obrigado
-
O script é em perl, o que é 100% compatível com o pfsense. O pacote postfix por exemplo usa o mesmo perl com integração ldap para buscar a lista de emails validos no domínio.
Posso ajudar nesta integração, mas por enquanto estou muito ocupado com o trabalho e tenhos algumas melhorias/desenvolvimento de pacotes na minha lista de tarefas.
Att,
Marcello coutinho -
Sim Marcelo, o script é em perl.
Porém a alteração é feita diretamente no código do squidGuard que chama esse "utilitário" (que pode ser refeito em php ou mesmo eh shell) para realizar a checagem.
Como lhe disse, a unica coisa que descobri foi através do comando strings diretamente no "binário" do squidGuard modificado.
#strings squidGuard squidGuard %s started (%d.%03d) squidGuard ready for requests (%d.%03d) Verificando acesso do user - %s - %s squidGuardGrupos.pl %s 2>/dev/null
Se você puder ajudar (posteriormente após seus trabalhos) a mudança no código do squidGuard muita gente agradeceria :)
Abraço e obrigado
-
Pessoal,
O ccesario começou a alterar um script que extrai os usuarios de um grupo específico para aplica nas acls do squidguard.
Peguei com ele hoje e consegui integrar o script no pfsense.
squidguard_ldap.php (v1 March 14, 2012)
// based on http://samjlevy.com/2011/02/using-php-and-ldap-to-list-of-members-of-an-active-directory-group/ // pfsense integration by marcelloc and ccesario # AD HOST (required) $ldap_host = "192.168.3.1"; # AD DIRECTORY DN(required) $ldap_dn = "DC=domain,DC=local"; # BIND USER(required) $user_bind = "cn=squidguard,cn=Users,DC=domain,DC=local"; # PASSWORD BIND(required) $password = "super_secret_password"; #if you need to apply any prefix or sufix to retreived user #example: prefix user with domain(required) #$user_mask="DOMAIN\USER"; $user_mask="USER"; #################### # End of user options # #################### require_once("/etc/inc/util.inc"); require_once("/etc/inc/functions.inc"); require_once("/etc/inc/pkg-utils.inc"); require_once("/etc/inc/globals.inc"); #mount filesystem writable conf_mount_rw(); function explode_dn($dn, $with_attributes=0) { $result = ldap_explode_dn($dn, $with_attributes); foreach($result as $key => $value) { $result[$key] = $value; } return $result; } function get_ldap_members($group,$user,$password) { global $ldap_host; global $ldap_dn; $LDAPFieldsToFind = array("member"); $ldap = ldap_connect($ldap_host) or die("Could not connect to LDAP"); // OPTIONS TO AD ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION,3); ldap_set_option($ldap, LDAP_OPT_REFERRALS,0); ldap_bind($ldap, $user, $password) or die("Could not bind to LDAP"); $results = ldap_search($ldap,$ldap_dn,"cn=" . $group,$LDAPFieldsToFind); $member_list = ldap_get_entries($ldap, $results); $group_member_details = array(); foreach($member_list[0] as $list) if (is_array($list)) foreach($list as $member) { $member_dn = explode_dn($member); $member_cn = str_replace("CN=","",$member_dn[0]); $member_search = ldap_search($ldap, $ldap_dn, "(CN=" . $member_cn . ")"); $member_details = ldap_get_entries($ldap, $member_search); $group_member_details[] = array($member_details[0]['samaccountname'][0]); } ldap_close($ldap); array_shift($group_member_details); return $group_member_details; } // Read Pfsense config global $config,$g; $id=0; $apply_config=0; if (is_array ($config['installedpackages']['squidguardacl']['config'])) foreach($config['installedpackages']['squidguardacl']['config'] as $group) { $members=""; echo "Group : " . $group['name']."\n"; $result = get_ldap_members($group['name'],$user_bind,$password); foreach($result as $key => $value) { if (preg_match ("/\w+/",$value[0])) $members .= "'".preg_replace("/USER/",$value[0],$user_mask)."' "; } if (!empty($members)) if($config['installedpackages']['squidguardacl']['config'][$id]['source'] != $members){ $config['installedpackages']['squidguardacl']['config'][$id]['source'] = $members; $apply_config++; } $id++; } if ($apply_config > 0){ print "user list from LDAP is different from current group, applying new configuration..."; write_config(); include("/usr/local/pkg/squidguard.inc"); squidguard_resync(); print "done\n"; } #mount filesystem read-only conf_mount_ro(); ?>
squidguard_ldap.php (v1.1 Sep 9, 2013)
// based on http://samjlevy.com/2011/02/using-php-and-ldap-to-list-of-members-of-an-active-directory-group/ // pfsense integration by marcelloc and ccesario // ldapsearch -x -h 192.168.11.1 -p 389 -b OU=Internet,DC=domain,DC=local -D CN=Proxyauth,OU=PROXY,DC=domain,DC=local -w PASS # AD HOST (required) $ldap_host = "192.168.1.1"; # AD DIRECTORY DN(required) $ldap_dn = "OU=INTERNET,DC=domain,DC=local"; # BIND USER(required) $user_bind = "CN=Proxyauth,OU=PROXY,DC=domain,DC=com"; # PASSWORD BIND(required) $password = "passwd"; #if you need to apply any prefix or sufix to retreived user #example: prefix user with domain(required) #$user_mask="DOMAIN\USER"; $user_mask="USER"; ####################### # End of user options # ####################### require_once("/etc/inc/util.inc"); require_once("/etc/inc/functions.inc"); require_once("/etc/inc/pkg-utils.inc"); require_once("/etc/inc/globals.inc"); #mount filesystem writable conf_mount_rw(); function explode_dn($dn, $with_attributes=0) { $result = ldap_explode_dn($dn, $with_attributes); if (is_array($result)) { foreach($result as $key => $value) { $result[$key] = $value; } } return $result; } function get_ldap_members($group,$user,$password) { global $ldap_host; global $ldap_dn; $LDAPFieldsToFind = array("member"); $ldap = ldap_connect($ldap_host) or die("Could not connect to LDAP"); // OPTIONS TO AD ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION,3); ldap_set_option($ldap, LDAP_OPT_REFERRALS,0); ldap_bind($ldap, $user, $password) or die("Could not bind to LDAP"); $results = ldap_search($ldap,$ldap_dn,"cn=" . $group,$LDAPFieldsToFind); $member_list = ldap_get_entries($ldap, $results); $group_member_details = array(); if (is_array($member_list[0])) foreach($member_list[0] as $list) if (is_array($list)) foreach($list as $member) { $ldap_dn_user = preg_replace('/^cn=([^,]+),/i','',$member); $member_dn = explode_dn($member); if (!empty($member_dn[0])) { $member_cn = str_replace("CN=","",$member_dn[0]); $member_search = ldap_search($ldap, $ldap_dn_user, "(CN=" . $member_cn . ")"); $member_details = ldap_get_entries($ldap, $member_search); // If group have a other group as member (only 1 level) if(is_array($member_details[0]['member'])) { //print "############\nmembers\n###########\n"; //var_dump ($member_details[0]['member']); foreach($member_details[0]['member'] as $sub_member) { $sub_ldap_dn_user = preg_replace('/^cn=([^,]+),/i','',$sub_member); $sub_member_dn = explode_dn($sub_member); if (!empty($sub_member_dn[0])) { $sub_member_cn = str_replace("CN=","",$sub_member_dn[0]); $sub_member_search = ldap_search($ldap, $sub_ldap_dn_user, "(CN=" . $sub_member_cn . ")"); $sub_member_details = ldap_get_entries($ldap, $sub_member_search); $group_member_details[] = array($sub_member_details[0]['samaccountname'][0]); } } //echo "#########################################\nsub_group\n"; //var_dump($group_member_details); //echo "#########################################\n"; } else $group_member_details[] = array($member_details[0]['samaccountname'][0]); } } ldap_close($ldap); return $group_member_details; } //Log info log_error("Running squidGuard LDAP sync"); // Read Pfsense config global $config,$g; $id=0; $apply_config=0; if (is_array($config['installedpackages']['squidguardacl']['config'])) { foreach($config['installedpackages']['squidguardacl']['config'] as $group) { $members=""; echo "Group : " . $group['name']."\n"; $result = get_ldap_members($group['name'],$user_bind,$password); asort($result); foreach($result as $key => $value) { if (preg_match ("/\w+/",$value[0])) $members .= "'".preg_replace("/USER/",strtolower($value[0]),$user_mask)."' "; } if (!empty($members)) { if($config['installedpackages']['squidguardacl']['config'][$id]['source'] != $members){ $config['installedpackages']['squidguardacl']['config'][$id]['source'] = $members; $apply_config++; } } echo "\t --> Members : " . $members . "\n\n"; $id++; } } if ($apply_config > 0) { log_error("squidGuard LDAP sync: user list from LDAP is different from current group, applying new configuration..."); print "user list from LDAP is different from current group, applying new configuration..."; write_config(); include("/usr/local/pkg/squidguard.inc"); squidguard_resync(); print "done\n"; } #mount filesystem read-only conf_mount_ro(); ?>
Para executar o script no squiguard:
-
Copie/crie o arquivo par ao seu pfsense
-
Edite os parametros do inicio do script
-
Altere o nome dos grupos do squidguard para o mesmo nome do grupo no ad
-
execute o script via console
O procedimento no squidguard é manual/via cron para não 'atrapalhar' o timeline de um pacote suportado pelo core team(eu acho).
Claro que para o dansguardian, o script já estará integrado na interface gráfica e com suporte a multiplos servidores LDAP. ;)
att,
Marcello Coutinho -
-
Obrigado pela ajuda Marcello.
Pessoal, quem testar, por favor comente aqui :)
[]s
Carlos
-
Você conseguiu testar?
Acho que da forma que o script ficou é até mais econômico na questão de consumo de recursos já que ele não vai no ad a cada acesso para verificar o grupo.
-
Você conseguiu testar?
Acho que da forma que o script ficou é até mais econômico na questão de consumo de recursos já que ele não vai no ad a cada acesso para verificar o grupo.
Olá Marcello!
Testado e aprovado.
Coloquei no cron a cada 1 minuto.
Ficou ótimo!
Obrigado pela ajuda!
-
Publiquei o script na minha conta do github para faciliar a configuração
https://github.com/downloads/marcelloc/pfsense-packages/squidguard_ldap.php
att,
Marcello Coutinho -
pegando o bonde andando…. eu fiz um script um tempo atras exatamente para suprir a necessidade de um cliente com isso, fazer acl por grupo, segue então como fiz:
Aplicar o patch no pfsense (com o pacote já instalado), com o comando abaixo:
fetch -q -o /tmp/ http://www.mundounix.com.br/~gugabsd/squidguard-ldap-search.patch && cd /usr/local/pkg && patch -p0 < /tmp/squidguard-ldap-search.patch
Execute em Diagnostics > command prompt
Vai aparecer uma opção nova na configuração do squidguard, conforme a figura abaixo:
Configure o seu Ldap DN e senha (igual ao do squid)
E crie uma acl baseada na da figura abaixo:
No exemplo acima, o grupo é o CN=ti (é tudo uma linha só, sem quebra)
Qualquer dúvida, da um grito ai.
Abraços
-
Excelente patch Luiz Gustavo! :)
Depois de aplicado, o squidguard vai buscar no ad o grupo do usuário a cada acesso ou a lista é extraída e aplicada nos arquivos?
De qualquer forma, lista de acesso por grupo já está 100% compatível com squidguard e dansguardian, basta escolher.
OFF topic:
Você tem alguma carta na manga para autenticar/logar o usuário do captive portal no squid/squidguard/dansguardian?O pfsense esta ficando monstruosamente poderoso ::)
-
Depois de aplicado, o squidguard vai buscar no ad o grupo do usuário a cada acesso ou a lista é extraída e aplicada nos arquivos?
OFF topic:
Você tem alguma carta na manga para autenticar/logar o usuário do captive portal no squid/squidguard/dansguardian?Depois de aplicado, ele busca na consulta, da forma original documentada no squidguard (http://www.squidguard.org/Doc/authentication.html)
o src fica sendo uma consulta ldap, na verdade, pode ser qualquer tipo de consulta, não só de grupo.
No exemplo que dei é exatamente pra ver se o cara bate no grupo especificado.
Você tem alguma carta na manga para autenticar/logar o usuário do captive portal no squid/squidguard/dansguardian?
Não entendi ? usando que base ? é fazer ficar transparente ? tipo o usuário do captive portal já estar logado no squid?
-
Não entendi ? usando que base ? é fazer ficar transparente ? tipo o usuário do captive portal já estar logado no squid?
Aproveitar a autenticação ja feita no captive portal, logando o usuário no squid sem precisar abrir outra tela de usuário e senha.
Uma mistura de auth_ident com consulta a base de usuários ativos do captive portal.
-
Luiz Gustavo!!!
Ótima notícia!!!!Muito interessante :)
Qual a possibilidade disso ser incorporado ao pacote oficial!?
Obrigado
att,
-
Qual a possibilidade disso ser incorporado ao pacote oficial!?
Não sei, depende do mantenedor, eu fiz o patch para atender uma necessidade localizada de cliente.
Eu vou postar na lista gringa e vamos ver o que o mantenedor acha.
Apesar que seria legal mexer nesse patch para filtrar melhor o campo do search do ldap.
-
Boa noite, Gustavo! Como vai?
Como você explicou, eu estou aplicando o seu script, mas não está aparecendo nenhuma opção do LDAP. O que você acha que pode ser fera?
Fique com Deus! Bom final de semana!
-
Foi mal pessoal, consegui resolver aqui. Apareceu a opção do LDAP, mas eu estacionei aqui. Help!?
Alguém poderia me ajudar, por favor?
Obrigado!