Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Tutorial - SquidGuard + LdapGroup (permissão por grupo no ad)

    Scheduled Pinned Locked Moved Portuguese
    202 Posts 30 Posters 93.8k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • marcellocM
      marcelloc
      last edited by

      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

      Treinamentos de Elite: http://sys-squad.com

      Help a community developer! ;D

      1 Reply Last reply Reply Quote 0
      • C
        ccesario
        last edited by

        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

        Carlos

        1 Reply Last reply Reply Quote 0
        • marcellocM
          marcelloc
          last edited by

          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

          Treinamentos de Elite: http://sys-squad.com

          Help a community developer! ;D

          1 Reply Last reply Reply Quote 0
          • C
            ccesario
            last edited by

            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

            Carlos

            1 Reply Last reply Reply Quote 0
            • marcellocM
              marcelloc
              last edited by

              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

              Treinamentos de Elite: http://sys-squad.com

              Help a community developer! ;D

              1 Reply Last reply Reply Quote 0
              • C
                ccesario
                last edited by

                Obrigado pela ajuda Marcello.

                Pessoal, quem testar, por favor comente aqui :)

                []s

                Carlos

                Carlos

                1 Reply Last reply Reply Quote 0
                • marcellocM
                  marcelloc
                  last edited by

                  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.

                  Treinamentos de Elite: http://sys-squad.com

                  Help a community developer! ;D

                  1 Reply Last reply Reply Quote 0
                  • C
                    ccesario
                    last edited by

                    @marcelloc:

                    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

                    1 Reply Last reply Reply Quote 0
                    • marcellocM
                      marcelloc
                      last edited by

                      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

                      Treinamentos de Elite: http://sys-squad.com

                      Help a community developer! ;D

                      1 Reply Last reply Reply Quote 0
                      • L
                        lgcosta
                        last edited by

                        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

                        Luiz Gustavo - Suporte pfSense no Brasil
                        mundounix.com.br

                        1 Reply Last reply Reply Quote 0
                        • marcellocM
                          marcelloc
                          last edited by

                          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  ::)

                          Treinamentos de Elite: http://sys-squad.com

                          Help a community developer! ;D

                          1 Reply Last reply Reply Quote 0
                          • L
                            lgcosta
                            last edited by

                            @marcelloc:

                            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?

                            Luiz Gustavo - Suporte pfSense no Brasil
                            mundounix.com.br

                            1 Reply Last reply Reply Quote 0
                            • marcellocM
                              marcelloc
                              last edited by

                              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.

                              Treinamentos de Elite: http://sys-squad.com

                              Help a community developer! ;D

                              1 Reply Last reply Reply Quote 0
                              • C
                                ccesario
                                last edited by

                                Luiz Gustavo!!!
                                Ótima notícia!!!!

                                Muito interessante :)

                                Qual a possibilidade disso ser incorporado ao pacote oficial!?

                                Obrigado

                                att,

                                Carlos

                                1 Reply Last reply Reply Quote 0
                                • F
                                  freekazoide Banned
                                  last edited by

                                  @ccesario:

                                  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.

                                  1 Reply Last reply Reply Quote 0
                                  • C
                                    Cabeça
                                    last edited by

                                    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!

                                    1 Reply Last reply Reply Quote 0
                                    • C
                                      Cabeça
                                      last edited by

                                      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!

                                      1 Reply Last reply Reply Quote 0
                                      • F
                                        freekazoide Banned
                                        last edited by

                                        @Cabeça:

                                        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!

                                        Como esta o seu cenário ? já tem o squid autenticando via ldap (no AD) e funcionando ?

                                        A ideia do patch é ter uma opção de filtragem no squidguard baseada em consulta ldap, no caso da configuração no squidguard, é colocar uma entrada de usuário com permissão para listar a arvore do ldap e criar uma acl baseada em uma busca via ldap, conforme a documentação do proprio squidguard [1].

                                        [1] http://www.squidguard.org/Doc/authentication.html (veja item 2 da documentação)

                                        1 Reply Last reply Reply Quote 0
                                        • C
                                          Cabeça
                                          last edited by

                                          Obrigado pela ajuda Luis Gustavo!

                                          A base eu entendi. A minha dúvida é, eu tenho que replicar os meus grupos do AD manualmente no Squidguard?

                                          Ex: Tenho um grupo no AD chamado: Programação | Tenho que ir no Group ACL do Squidquard e criá-lo também?

                                          Bom final de semana! E obrigado pela atenção!

                                          1 Reply Last reply Reply Quote 0
                                          • F
                                            freekazoide Banned
                                            last edited by

                                            @Cabeça:

                                            A base eu entendi. A minha dúvida é, eu tenho que replicar os meus grupos do AD manualmente no Squidguard?

                                            Ex: Tenho um grupo no AD chamado: Programação | Tenho que ir no Group ACL do Squidquard e criá-lo também?

                                            Não, basta criar uma entrada conforme o print que mandei anteriormente apontando para o seu grupo no AD que ele vai verificar se o usuário logado pelo o squid esta no grupo ou  não para validar a ACL que você esta criando.

                                            Entendeu, a ideia é filtrar (ACL) por grupo do AD (ldap), dessa forma você consegue por exemplo, criar um bloqueio de sites para o grupo XYZ no AD, assim, basta no windows você selecionar quem faz parte ou não do grupo.

                                            É usar a imaginação.

                                            E isso não se limita a grupo, pode ser uma arvore do AD diferente, uma outra abordagem de DN, etc….. é uma busca ldap, o exemplo que citei é para grupos, mas pode ser qualquer coisa.

                                            Abraços

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.