The pfSense Store

Author Topic: Tutorial - SquidGuard + LdapGroup (permissão por grupo no ad)  (Read 33490 times)

0 Members and 1 Guest are viewing this topic.

Offline ccesario

  • Full Member
  • ***
  • Posts: 167
  • Karma: +0/-0
    • View Profile
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   myultrasecretpassword

 # ldap 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
« Last Edit: June 04, 2013, 04:48:32 pm by marcelloc »
Carlos

Offline marcelloc

  • Moderator
  • Hero Member
  • *****
  • Posts: 10004
  • Karma: +5/-0
    • View Profile
Re: SquidGuard + LdapGroup
« Reply #1 on: March 10, 2012, 01:16:21 pm »
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

Offline ccesario

  • Full Member
  • ***
  • Posts: 167
  • Karma: +0/-0
    • View Profile
Re: SquidGuard + LdapGroup
« Reply #2 on: March 10, 2012, 01:45:19 pm »
Já olhei sim.

O tópico menciona a autenticação feita diretamente pelo squid e não pelo squidGuard.

:)

Obrigado
Carlos

Offline marcelloc

  • Moderator
  • Hero Member
  • *****
  • Posts: 10004
  • Karma: +5/-0
    • View Profile
Re: SquidGuard + LdapGroup
« Reply #3 on: March 11, 2012, 07:45:07 am »
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
« Last Edit: March 11, 2012, 06:41:16 pm by marcelloc »

Offline ccesario

  • Full Member
  • ***
  • Posts: 167
  • Karma: +0/-0
    • View Profile
Re: SquidGuard + LdapGroup
« Reply #4 on: March 11, 2012, 09:35:38 am »
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:
Code: [Select]
# 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
Code: [Select]
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"
Code: [Select]
#!/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
« Last Edit: March 11, 2012, 10:01:54 am by ccesario »
Carlos

Offline marcelloc

  • Moderator
  • Hero Member
  • *****
  • Posts: 10004
  • Karma: +5/-0
    • View Profile
Re: SquidGuard + LdapGroup
« Reply #5 on: March 11, 2012, 11:43:34 am »
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
« Last Edit: March 12, 2012, 09:39:55 am by marcelloc »

Offline ccesario

  • Full Member
  • ***
  • Posts: 167
  • Karma: +0/-0
    • View Profile
Re: SquidGuard + LdapGroup
« Reply #6 on: March 11, 2012, 12:16:54 pm »
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.

Code: [Select]
#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
Carlos

Offline marcelloc

  • Moderator
  • Hero Member
  • *****
  • Posts: 10004
  • Karma: +5/-0
    • View Profile
Re: SquidGuard + LdapGroup
« Reply #7 on: March 14, 2012, 02:53:00 pm »
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
Code: [Select]
<?php
// 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($ldapLDAP_OPT_PROTOCOL_VERSION,3);
ldap_set_option($ldapLDAP_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();

?>


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
« Last Edit: March 14, 2012, 10:02:54 pm by marcelloc »

Offline ccesario

  • Full Member
  • ***
  • Posts: 167
  • Karma: +0/-0
    • View Profile
Re: [Resolvido] SquidGuard + LdapGroup (extraindo usuarios do ad)
« Reply #8 on: March 14, 2012, 06:10:45 pm »
Obrigado pela ajuda Marcello.

Pessoal, quem testar, por favor comente aqui :)

[]s

Carlos
Carlos

Offline marcelloc

  • Moderator
  • Hero Member
  • *****
  • Posts: 10004
  • Karma: +5/-0
    • View Profile
Re: [Resolvido] SquidGuard + LdapGroup (extraindo usuarios do ad)
« Reply #9 on: March 14, 2012, 06:25:49 pm »
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.

Offline ccesario

  • Full Member
  • ***
  • Posts: 167
  • Karma: +0/-0
    • View Profile
Re: [Resolvido] SquidGuard + LdapGroup (extraindo usuarios do ad)
« Reply #10 on: March 15, 2012, 06:17:41 am »
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!
Carlos

Offline marcelloc

  • Moderator
  • Hero Member
  • *****
  • Posts: 10004
  • Karma: +5/-0
    • View Profile
Re: [Resolvido] SquidGuard + LdapGroup (extraindo usuarios do ad)
« Reply #11 on: March 15, 2012, 09:17:31 am »
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
« Last Edit: March 15, 2012, 09:47:29 am by marcelloc »

Offline Luiz Gustavo

  • Full Member
  • ***
  • Posts: 189
  • Karma: +0/-0
    • View Profile
    • Mundounix - Consultoria em Software Livre
Re: [Resolvido] SquidGuard + LdapGroup (permissão por grupo no ad)
« Reply #12 on: March 15, 2012, 10:21:22 pm »
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:

Code: [Select]
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
Luiz Gustavo - Suporte pfSense no Brasil
mundounix.com.br

Offline marcelloc

  • Moderator
  • Hero Member
  • *****
  • Posts: 10004
  • Karma: +5/-0
    • View Profile
Re: [Resolvido] SquidGuard + LdapGroup (permissão por grupo no ad)
« Reply #13 on: March 15, 2012, 10:28:31 pm »
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  ::)
« Last Edit: March 15, 2012, 11:30:31 pm by marcelloc »

Offline Luiz Gustavo

  • Full Member
  • ***
  • Posts: 189
  • Karma: +0/-0
    • View Profile
    • Mundounix - Consultoria em Software Livre
Re: [Resolvido] SquidGuard + LdapGroup (permissão por grupo no ad)
« Reply #14 on: March 15, 2012, 10:58:00 pm »

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?
« Last Edit: March 15, 2012, 11:31:14 pm by marcelloc »
Luiz Gustavo - Suporte pfSense no Brasil
mundounix.com.br