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

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

    Portuguese
    30
    202
    93.4k
    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.
    • C
      ccesario
      last edited by

      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

      Carlos

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

        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

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

        Help a community developer! ;D

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

          Já olhei sim.

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

          :)

          Obrigado

          Carlos

          1 Reply Last reply Reply Quote 0
          • 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
                                            • First post
                                              Last post
                                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.