Cotas por usuário/tempo no SquidGuard
-
@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=334779809883543vi 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
-
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 logo 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. :)
-
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?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.