Cotas por usuário/tempo no SquidGuard



  • @LFCavalcanti:

    @marcelloc:

    @UnDr3aD:

    Mas vejamos. Se o Sarg consegue trazer relatórios do tempo de conexão a cada site através dos logs do Squid, creio que seja possível fazer algo do tipo para bloqueios por ACL do SquidGuard!

    O tempo que aparece no sarg é o tempo de download da página. Essa informação não bate com o tempo que o usuário ficou lendo/olhando a página.

    É exatamente esse o ponto da questão. Eu usei o IPCop por quase 4 anos e digo com segurança que a medida de cota dele não é precisa, justamente por causa disso. O usuário tem um tempo de download definido, mas ele pode muito bem ficar com uma página aberta lendo algum texto por horas sem fazer download de nada, ou seja, continua "ocioso".

    Mesmo assim acho que isso seria interessante!

    De acordo com essas informações a cota de tempo seria algo difícil de implementar, contudo essas informações também dão a entender que seria possível fazer cotas de tráfego. Tipo, usuário pode usar apenas 3Mb de tal categoria durante o período de 24hrs…! Seria uma boa também!

    Então... nota-se que não há nada do tipo para o pfSense agora! Mas saberiam se há algum projeto para algo do tipo? Ou é questão de deixar quieto/desistir mesmo?



  • @UnDr3aD:

    De acordo com essas informações a cota de tempo seria algo difícil de implementar, contudo essas informações também dão a entender que seria possível fazer cotas de tráfego. Tipo, usuário pode usar apenas 3Mb de tal categoria durante o período de 24hrs…! Seria uma boa também!

    Então... nota-se que não há nada do tipo para o pfSense agora! Mas saberiam se há algum projeto para algo do tipo? Ou é questão de deixar quieto/desistir mesmo?

    O captive portal tem suas opções, mas cota por categoria no squid/squidguard ainda não.

    Uma acl pode ser o caminho, mas nada em desenvolvimento ainda.



  • @marcelloc:

    @UnDr3aD:

    De acordo com essas informações a cota de tempo seria algo difícil de implementar, contudo essas informações também dão a entender que seria possível fazer cotas de tráfego. Tipo, usuário pode usar apenas 3Mb de tal categoria durante o período de 24hrs…! Seria uma boa também!

    Então... nota-se que não há nada do tipo para o pfSense agora! Mas saberiam se há algum projeto para algo do tipo? Ou é questão de deixar quieto/desistir mesmo?

    O captive portal tem suas opções, mas cota por categoria no squid/squidguard ainda não.

    Uma acl pode ser o caminho, mas nada em desenvolvimento ainda.

    Vixi, que triste! T_T
    Fazer o que né! Só esperar então!
    vlw



  • @UnDr3aD:

    Fazer o que né! Só esperar então!

    Esperar é só uma das opções e no meu ponto de vista a menos interessante.

    O projeto é opensource. Você pode ajudar no desenvolvimento, seja codificando ou contribuindo financeiramente.



  • continuei as pesquisas e encontrei esses links:
    http://www.squid-cache.org/mail-archive/squid-dev/201104/0009.html
    https://www.facebook.com/permalink.php?story_fbid=319971538051822&id=334779809883543

    vi também que o squid3-dev tem o time_quota compilado nele.
    alguém com mais experiência e sabedoria no assunto (lê-se squid) poderia dar um help pra saber a melhor forma de configurar isso no pfSense?

    só pra constar, estou usando o squid autenticado no AD e gostaria de mantê-lo assim!



  • Pode seguir qualquer tutorial de time quota e colocar as configurações em custom_acl.



  • mas você saberia como eu faço pra aplicar um cota pra determinada acl?
    tipo, faço uma acl com sites que eu quero liberar e coloca a quota nela.



  • 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 
    


  • @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?



  • 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>



  • 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….



  • 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 ?



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

    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]
    


  • 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.



  • 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



  • @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.



  • 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!  :(



  • 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.  ;)



  • 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.


Log in to reply