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

    Cotas por usuário/tempo no SquidGuard

    Scheduled Pinned Locked Moved Portuguese
    25 Posts 3 Posters 4.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.
    • ?
      A Former User
      last edited by

      @marcelloc:

      Não tem um exemplo no próprio documento que você postou?

      CONFIGURATION 
              This helper is also configured in squid.conf where you first 
              declare the helper, then define a ACL which then decides when 
              to allow or deny. Enter the following text after the user 
              authentication. 
                     # 
                     # Define program and quota file 
                     # 
                     external_acl_type time_quota ttl=60 children-max=1 
                     %LOGIN /usr/libexec/ext_time_quota_acl -b 
                     /var/run/squid/time_quota.db /etc/squid/time_quota 
                     # 
                     # Define ACL for time_quota helper 
                     # 
                     acl time_quota external time_quota 
                     # 
                     # Deny access if quota exceeded 
                     # 
                     http_access deny !time_quota 
                     # 
                     # If quota exceeds, tell user 
                     # 
                     deny_info TIME_QUOTA_EXCEEDED time_quota 
      

      sou muito noob ainda! não conheço bem os esquemas do squid!

      já consegui fazer funcionar, mas não da forma que eu preciso.
      quero permitir o acesso a determinados sites (tipo facebook, twitter) por um tempo a escolha do usuário (time_quota  ;D), contudo ele está contando geral para o tempo de quota!
      como faço para especificar os destinos que eu quero fazer a cota?

      1 Reply Last reply Reply Quote 0
      • ?
        A Former User
        last edited by

        depois de pesquisas e testes consegui fazer o time_quota funcionar ok.

        a primeira coisa que tive que fazer foi mudar a posição do custom options no squid.inc. Isso porque uso o custom option para configurar o time_quota e ele precisa ficar depois das declarações de autenticação do proxy. No local padrão onde o custom options fica, o time_quota sempre dará erro.
        coloquei o custom options depois das declarações de configuração para autenticação externa e antes da declaração de bloqueio de tudo. veja o trecho:

        
        // Onto the ACLs
        		$password = array('localnet', 'allowed_subnets');
        		$passwordless = array('unrestricted_hosts');
        		if ($settings['unrestricted_auth'] == 'on') {
        			// Even the unrestricted hosts should authenticate
        			$password = array_merge($password, $passwordless);
        			$passwordless = array();
        		}
        		$passwordless[] = 'noauth';
        		$password = array_filter($password, 'squid_is_valid_acl');
        		$passwordless = array_filter($passwordless, 'squid_is_valid_acl');
        
        		// Allow the ACLs that don't need to authenticate
        		foreach ($passwordless as $acl)
        			$conf .= "http_access allow $acl\n";
        
        		if ($auth_method != 'cp'){
        			// Include squidguard denied acl log in squid
        			if ($settingsconfig['log_sqd'])
        				$conf .="http_access deny password sglog\n";
        
        			// Allow the other ACLs as long as they authenticate
        			foreach ($password as $acl)
        				$conf .= "http_access allow password $acl\n";
        			}
        	        }
        
                // Custom User Options 
        	$conf .= "\n# Custom options\n".sq_text_area_decode($settingsconfig['custom_options_squid3'])."\n\n";
        
        	$conf .= "# Default block all to be sure\n";
        	$conf .= "http_access deny allsrc\n";
        
        

        O custom option deve estar imediatamente antes do http_access deny allsrc

        após o procedimento acima a configuração do time_quota pode ser feita pelo campo custom options do squid que vai funfar ok!

        então entrei com a configuração do time_quota:

        
        # Define program and quota file 
        external_acl_type time_quota ttl=60 children-max=1 %LOGIN /usr/pbi/squid-amd64/libexec/squid/ext_time_quota_acl -b /var/squid/time_quota.db -p 90 -d -l /var/squid/time_quota.log /var/squid/acl/time_quota
        # 
        # Define ACL for time_quota helper 
        acl time_quota external time_quota
        acl dom_blk_quota url_regex -i facebook
        # 
        # If quota exceeds, tell user 
        #deny_info ERR_ACL_TIME_QUOTA_EXCEEDED time_quota
        deny_info CUSTOM_ERR_TIME_QUOTA time_quota
        # 
        # Deny access if quota exceeded 
        http_reply_access deny dom_blk_quota !time_quota
        
        

        a primeira parte da configuração é a mais importante. tem que colocar os caminhos certinhos para as configurações e arquivos:

        
        # Define program and quota file 
        external_acl_type time_quota ttl=60 children-max=1 %LOGIN /usr/pbi/squid-amd64/libexec/squid/ext_time_quota_acl -b /var/squid/time_quota.db -p 90 -d -l /var/squid/time_quota.log /var/squid/acl/time_quota
        
        

        os caminhos estão configurados para o padrão do pfsense 2.1.
        a opção -b especifica o caminho do banco de dados que o time_quota vai gerar.
        a opção -p especifica o tempo da pausa (se o usuário fizer uma requisição para um site e antes do tempo definido para a pausa fizer outra requisição, o tempo entre as requisições será subtraindo do tempo de cota! caso a nova requisição seja feita em um tempo superior ao definido na quota, será identificado uma pausa e o tempo começará a contar a partir dessa nova requisição)
        a opção -d é para debug (recomendado, pois o log apenas não traz todas as informações)
        a opção -l é o log

        o arquivo /var/squid/acl/time_quota, é onde são feitas as configurações.

        
        andre.martins 30m / 1d
        suporte 20m / 1d
        
        

        o padrão é: <usuário><cota><periodo>mais adiante na configuração criei uma acl para apontar os destinos que devem ser usados na quota:

        
        acl dom_blk_quota url_regex -i facebook
        
        

        nesse exemplo é só facebook

        agora a regra para bloquear:

        
        http_reply_access deny dom_blk_quota !time_quota
        
        

        isso vai bloquear todas as requisiçoes para os sites definidos (acl bom_blk_quota) desde que a quota tenha se excedido (!time_quota)
        é importante dizer que o bloqueio deve ser feito com o http_reply_access deny, pois se for somente com o http_access deny o navegador vai ficar spammando o prompt de autenticação a cada requisição.

        o linha deny_info CUSTOM_ERR_TIME_QUOTA time_quota define a pagina de erro para quando a quota se esgotar. nesse caso fiz uma, mas no squid já tem uma padrão!

        é bom dizer também que, caso tenha feito uma cota para um usuário e queira tirar essa cota, não basta tirar o nome do usuário do arquivo de configuração (/var/squid/acl/time_quota), tem que apagar o banco de dados (/var/squid/time_quota.db).

        toda vez que o squid for reiniciado ou alguma configuração for salva a cota zera, ou seja, começa a contar de novo.

        o time_quota também não vai pegar https, a não ser que o squid esteja usando ssl.

        o time_quota conta o tempo mesmo se o site requisitado estiver bloqueado! por exemplo: o facebook está bloqueado no squidguard. por mais que o usuário não acesse o site a requisição é identificada pelo time_quota! caso haja várias requisições antes do tempo de pausa, o time_quota vai acabar subtraindo todo esse tempo da cota!

        caso tenha algum ip configurado para não autenticar é necessário mudar a linha http_reply_access deny dom_blk_quota !time_quota para http_reply_access !noauth deny dom_blk_quota !time_quota. Caso não faça isso o time_quota vai ficar dando erro de tempo esgotado.

        isso foi o que eu consegui até agora.</periodo></cota></usuário>

        1 Reply Last reply Reply Quote 0
        • ?
          A Former User
          last edited by

          essa configuração que fiz funciona deixando o site liberado até que a quota bloqueie.
          não consegui fazer o contrário, bloquear o site e liberar durante o tempo de quota.
          gostaria de fazer essa segunda opção funcionar, pois garantiria que ninguém acessaria o site a não ser que fosse configurado cota pra ele. no entanto, do jeito que está (primeira opção) todo mundo acessa os sites a não ser tenha cota configurada pra o usuário e expirada!
          se alguém puder ajudar nisso agradeço muito!

          uma outra opção que acho legal seria bloquear uma categoria do squid por exemplo. se alguém puder dar uma dica de como fazer isso….

          1 Reply Last reply Reply Quote 0
          • ?
            A Former User
            last edited by

            então pessoal, quero pedir que me ajudem nisso.

            o time_quota funciona legal, entretanto ele diverge das regras do squidguard.
            por exemplo: quero que alguns usuário tenham cota para usar o facebook… então, no squidguardo o facebook está liberado mas a quota bloqueia o facebook assim que for excedido o tempo limite daqueles usuários. o problema disso é que os usuários que eu não especificar no time_quota ficarão com acesso irrestrito ao facebook!
            quero poder bloquear o facebook no squidguard e liberar o acesso enquanto houver tempo de quota. assim somente usarão o facebook os usuário especificados na quota e somente durante o tempo da quota!!!

            alguma idéia de como fazer o squidguard respeitar o time_quota ?

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

              Use como base o tutorial para unificar o log do squidguard no squid.

              assim você consegue chegar no seu objetivo com poucas alterações.

              Não esquece de compartilhar o resultado.  :)

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

              Help a community developer! ;D

              1 Reply Last reply Reply Quote 0
              • ?
                A Former User
                last edited by

                @marcelloc:

                Use como base o tutorial para unificar o log do squidguard no squid.

                assim você consegue chegar no seu objetivo com poucas alterações.

                Não esquece de compartilhar o resultado.  :)

                marcelloc, você deve estar falando do código a ser adicionado no arquivo sgerror.php certo?

                
                $sge_prefix=(preg_match("/\?/",$cl['u'])?"&":"?");
                $str[] = '< iframe > src="'.$cl['u'].$sge_prefix.'sgr=ACCESSDENIED" width="1" height="1" > < /iframe >';
                
                

                entretanto eu estou usando uma página de erro personalizada:

                
                $ip = addslashes($_GET[ip]);
                $uid = addslashes($_GET[uid]);
                $group = addslashes($_GET[group]);
                $target = addslashes($_GET[target]);
                $url = addslashes($_GET[url]);
                ?>
                
                <title>Acesso Negado!</title>
                
                ![](./ntu_logo.gif)
                
                # Acesso Negado!
                
                * * *
                
                IP: " . $ip . "
                ";} ?>
                Nome: " . $uid . "
                ";} ?>
                Grupo: " . $group . "
                ";} ?>
                Regra: ".  $target . "
                ";} ?>
                URL: " . $url;} ?>
                
                * * *
                
                Seu acesso foi bloqueado por uma regra do proxy!
                Entre em contato com o [administrador da rede](mailto:xxxxxx) caso precise de mais informações!
                
                #### Isso é um erro? Limpe o cache do navegador!!!!
                
                eu continuo colocando o código no sgerror.php ou na minha página? 
                obs.:essa página que eu fiz está sendo usada no squidguard (redirect mode:ext url found; redirect info:http://192.168.0.50/ntu.php?ip=%a&uid=%i&group=%s&target=%t&url=%u)[/url]
                
                1 Reply Last reply Reply Quote 0
                • marcellocM
                  marcelloc
                  last edited by

                  A idéia da alteração é fazer o squidguard incluir uma informação na url de tal forma que o squid seja capaz de identificar o "retorno". Neste caso usamos o sgr=ACCESSDENIED para acionar uma acl de bloqueio do squid.

                  Altere o código que o squidguard adiciona e faça a sua acl de tempo interpretar isso.

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

                  Help a community developer! ;D

                  1 Reply Last reply Reply Quote 0
                  • ?
                    A Former User
                    last edited by

                    notei o seguinte:
                    minha regra atual é:

                    
                    http_reply_access deny time_quota_blk_dom !time_quota
                    
                    

                    desse jeito funciona normal. bloqueia os domínios quando a cota acaba.

                    então tentei bloqueei o facebook no squidguard e mudei a regra para:

                    
                    http_access allow time_quota_blk_dom time_quota
                    
                    

                    então fui olhar no debug do time quota e notei que ele não mais identificou as requisições. fica somente aguardando e nada!

                    mesmo que eu deixe o facebook bloqueado no squidguard, usando a primeira regra o time_quota funciona normal!
                    alguma ideia da causa desse comportamento?

                    @marcelloc:

                    A idéia da alteração é fazer o squidguard incluir uma informação na url de tal forma que o squid seja capaz de identificar o "retorno". Neste caso usamos o sgr=ACCESSDENIED para acionar uma acl de bloqueio do squid.

                    Altere o código que o squidguard adiciona e faça a sua acl de tempo interpretar isso.

                    certo. já que eu tenho uma url externa para a página de erro e passo os parâmetros pelo GET (url), então não seria mais fácil eu simplesmente adicionar o sgr=ACCESSDENIED nos parâmetros passados? tipo redirect info:http://192.168.0.50/ntu.php?ip=%a&uid=%i&group=%s&target=%t&url=%u&sgr=ACCESSDENIED

                    como uso o squid3-dev eu só marquei a opção Log denied pages by squidguard

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

                      @UnDr3aD:

                      então não seria mais fácil eu simplesmente adicionar o sgr=ACCESSDENIED nos parâmetros passados? tipo redirect info:http://192.168.0.50/ntu.php?ip=%a&uid=%i&group=%s&target=%t&url=%u&sgr=ACCESSDENIED

                      É exatamente isso que estou dizendo. coloque informações no squidguard(via redirect ou sgerror) para conseguir acertar uma acl no squid.

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

                      Help a community developer! ;D

                      1 Reply Last reply Reply Quote 0
                      • ?
                        A Former User
                        last edited by

                        fiz o que você falou marcelloc. ele até que funciona, mas nem sempre!
                        pequei aquele codigo php e modifiquei pra colocar na minha pagina personalizada… a mesma coisa! funciona, mas nem sempre! não sei porque!

                        mas marcelloc, isso realmente vai ter efeito sobre o time_quota e squidguard?
                        porque pela que tenho observado, acho que o problema é que o squidguard e o time_quota não tem nenhum tipo de "integração".
                        se eu bloqueio pelo squidguard, mesmo assim o time_quota conta a requisição. e independente da cota existente o squidguard sempre bloqueia!!!!
                        já tentei mudar a posição das declarações no arquivo de configuração (.inc) mas mesmo assim o squidguard continua bloqueando, mesmo que o time_quota esteja liberando.

                        e também tem a observação que fiz anteriormente:
                        @UnDr3aD:

                        notei o seguinte:
                        minha regra atual é:

                        
                        http_reply_access deny time_quota_blk_dom !time_quota
                        
                        

                        desse jeito funciona normal. bloqueia os domínios quando a cota acaba.

                        então tentei bloqueei o facebook no squidguard e mudei a regra para:

                        
                        http_access allow time_quota_blk_dom time_quota
                        
                        

                        então fui olhar no debug do time quota e notei que ele não mais identificou as requisições. fica somente aguardando e nada!

                        mesmo que eu deixe o facebook bloqueado no squidguard, usando a primeira regra o time_quota funciona normal!
                        alguma ideia da causa desse comportamento?

                        não estou vendo nenhuma luz no fim do túnel!  :(

                        1 Reply Last reply Reply Quote 0
                        • ?
                          A Former User
                          last edited by

                          pois bem, sem sucesso até então pra fazer time quota funcionar conjuntamente com o squidguard, "resolvi" meu problema apenas fazendo uma acl liberando os usuários e domínios que estarão na cota. assim o usuário vai ficar com acesso livre ao site até que o time_quota bloqueie.  ;)

                          1 Reply Last reply Reply Quote 0
                          • ?
                            A Former User
                            last edited by

                            Depois de um bom tempo usando o time_quota sem problemas tive um ligeiro contratempo: a atualização do pacote squid3-dev.
                            Ao atualizar o squid notei que o squid não subia o serviço. Fui iniciar ele via linha de comando e foi apresentado o seguinte erro:

                            
                            [2.1-RELEASE][root@megazord.ntu0]/root(2): squid start
                            2014/01/15 13:34:48| Can't use proxy auth because no authentication schemes are fully configured.
                            FATAL: ERROR: Invalid ACL: acl time_quota external time_quota
                            
                            Squid Cache (Version 3.3.10): Terminated abnormally.
                            CPU Usage: 0.037 seconds = 0.037 user + 0.000 sys
                            Maximum Resident Size: 40448 KB
                            Page faults with physical i/o: 0
                            
                            

                            Deu pra perceber logo que estava havendo algum problema com a acl do time_quota! Logo fui verificar se com a atualização algum caminho para o time_quota havia sido mudado ou se foi retirado do pacote, no entanto estava tudo ok.
                            Fui então ver o arquivo de configuração do squid e notei que a configuração que eu havia feito estava alterada. Na atualização do pacote o arquivo de configuração volta para o padrão (as configurações ficam, mas a posição em que elas estavam voltaram para o padrão).
                            Logo tive que fazer novamente a alteração do arquivo squid.inc e mover a declaração do custom options para exatamente antes da declaração Default block all to be sure, ficando assim:

                            
                            			// Allow the other ACLs as long as they authenticate
                            			foreach ($password as $acl)
                            				$conf .= "http_access allow password $acl\n";
                            			}
                            	}
                            
                            	// Custom User Options
                            	$conf .= "# Custom options\n".sq_text_area_decode($settingsconfig['custom_options_squid3'])."\n\n";
                            
                            	$conf .= "# Default block all to be sure\n";
                            	$conf .= "http_access deny allsrc\n";
                            
                            	return $conf;
                            }
                            
                            

                            Essa configuração eu já tinha feito antes e postado aqui, mas com a atualização do pacote ela se fez necessária novamente
                            @UnDr3aD:

                            a primeira coisa que tive que fazer foi mudar a posição do custom options no squid.inc. Isso porque uso o custom option para configurar o time_quota e ele precisa ficar depois das declarações de autenticação do proxy. No local padrão onde o custom options fica, o time_quota sempre dará erro.
                            coloquei o custom options depois das declarações de configuração para autenticação externa e antes da declaração de bloqueio de tudo. veja o trecho:

                            
                            // Onto the ACLs
                            		$password = array('localnet', 'allowed_subnets');
                            		$passwordless = array('unrestricted_hosts');
                            		if ($settings['unrestricted_auth'] == 'on') {
                            			// Even the unrestricted hosts should authenticate
                            			$password = array_merge($password, $passwordless);
                            			$passwordless = array();
                            		}
                            		$passwordless[] = 'noauth';
                            		$password = array_filter($password, 'squid_is_valid_acl');
                            		$passwordless = array_filter($passwordless, 'squid_is_valid_acl');
                            
                            		// Allow the ACLs that don't need to authenticate
                            		foreach ($passwordless as $acl)
                            			$conf .= "http_access allow $acl\n";
                            
                            		if ($auth_method != 'cp'){
                            			// Include squidguard denied acl log in squid
                            			if ($settingsconfig['log_sqd'])
                            				$conf .="http_access deny password sglog\n";
                            			
                            			// Allow the other ACLs as long as they authenticate
                            			foreach ($password as $acl)
                            				$conf .= "http_access allow password $acl\n";
                            			}
                            	        }
                            
                                    // Custom User Options 
                            	$conf .= "\n# Custom options\n".sq_text_area_decode($settingsconfig['custom_options_squid3'])."\n\n";
                            
                            	$conf .= "# Default block all to be sure\n";
                            	$conf .= "http_access deny allsrc\n";
                            
                            

                            O custom option deve estar imediatamente antes do http_access deny allsrc

                            após o procedimento acima a configuração do time_quota pode ser feita pelo campo custom options do squid que vai funfar ok!

                            Mesmo depois de fazer essa alteração o squid não estava querendo subir. Tive que limpar o campo custom options na interface (recortei tudo que tinha lá e colei em um bloco de notas) e salvar a configuração para ele subir. Depois dele funcionando e verificado que as configurações estavam nos lugares corretos eu voltei as configurações existentes no custom options.

                            Está funcionando ok.
                            Pois é, essa foi mais uma experiência que tive com o time_quota. Espero que ajude a comunidade.

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