Squid + Iptables - Combinação Infalível

32
Squid + Iptables - Combinação Infalível Autor: Phillip Vieira <philliprich at gmail.com> Data: 13/03/2012 O que veremos neste artigo? Neste artigo, iremos aprender a fazer um Firewall/Proxy para uma rede pequena. O Proxy irá trabalhar com autenticação e iremos dividir todos os usuários em grupos. Todos os exemplos deste artigo são baseados no Debian, por ser uma das distros mais usadas, mas nada impede que você adapte para outas distros. Iremos ver também como debugar alguns erros comuns, tornando nossas vidas um pouco mais tranquilas. Para melhor entendimento deste artigo, o leitor deve ter os seguintes conhecimentos: Comandos Linux ; Noções de redes; Configurar interfaces de rede (não abordado neste artigo). Nosso cenário será o seguinte: Firewall/Proxy : Com Debian (pode ser 5 ou 6) com 2 interfaces de rede Estações : Windows O tipo de autenticação usada será a 'ncsa_auth', que para este artigo é simples, pois trataremos de uma rede pequena. Em outro artigo, falarei como realizar a autenticação no AD da Microsoft. Apertem os cintos e vamos lá!

Transcript of Squid + Iptables - Combinação Infalível

Page 1: Squid + Iptables - Combinação Infalível

Squid + Iptables - Combinação Infalível

Autor: Phillip Vieira <philliprich at gmail.com>Data: 13/03/2012

O que veremos neste artigo?

Neste artigo, iremos aprender a fazer um Firewall/Proxy para uma rede pequena. O Proxy irá trabalhar com autenticação e iremos dividir todos os usuários em grupos.

Todos os exemplos deste artigo são baseados no Debian, por ser uma das distros mais usadas, mas nada impede que você adapte para outas distros.

Iremos ver também como debugar alguns erros comuns, tornando nossas vidas um pouco mais tranquilas.

Para melhor entendimento deste artigo, o leitor deve ter os seguintes conhecimentos:

Comandos Linux; Noções de redes; Configurar interfaces de rede (não abordado neste artigo).

Nosso cenário será o seguinte:

Firewall/Proxy : Com Debian (pode ser 5 ou 6) com 2 interfaces de rede Estações : Windows

O tipo de autenticação usada será a 'ncsa_auth', que para este artigo é simples, pois trataremos de uma rede pequena.

Em outro artigo, falarei como realizar a autenticação no AD da Microsoft.

Apertem os cintos e vamos lá!

Instalando tudoPara ter melhor aproveitamento, além do IPtables e Squid, teremos mais algumas ferramentas que irão nos ajudar, então vamos às ferramentas e instalações.

- Squid versão 3

O Squid é o Proxy propriamente dito, é com ele que iremos criar as regras para o controle de acesso a sites da Internet.

Instalação:

# apt-get update

Page 2: Squid + Iptables - Combinação Infalível

# apt-get install squid3

- Sarg (Squid Analysis Report Generator)

Este é o programa que vai gerar para você, os relatórios dos acessos aos sites.

Instalação:

# apt-get install sarg

- Apache 2

Servidor WEB que, neste caso, precisaremos para acessar os relatórios gerados pelo Sarg e também para criar as senhas de autenticação.

Instalação:

# apt-get install apache2

- IPtables

O IPtables já vem pronto para o uso na maioria das distribuições, portanto dispensa explicações aqui.

Ou, você pode juntar tudo em um comando só:

# apt-get update && apt-get install -y squid3 sarg apache2

Traduzindo: O APT-GET vai atualizar as listas de pacotes, e se o comando for bem sucedido, ele irá instalar o Squid3 e o Sarg.

Com as ferramentas acima instaladas, podemos começar a configurá-las e utilizá-las.

IPtables

Vamos criar um Script simples do IPtables.

Com ele, iremos deixar nossa rede mais segura e teremos um maior controle do que pode, ou não ser acessado.

O Script será todo comentado, assim, o leitor terá uma maior compreensão do que está utilizando.

Vale lembrar que o Script abaixo é um exemplo de uso livre, e o mesmo pode e deve ser alterado a seu gosto.

Antes de mais nada, vamos a organização do Script:

Cabeçalho; Variáveis que serão usadas;

Page 3: Squid + Iptables - Combinação Infalível

Ajustes / Módulos; Regras de NAT; Regras de INPUT; Regras de OUTPUT; Regras de FORWARD; Parâmetros do script (start | stop | restart).

Um Script bem organizado evita problemas, e facilita muito na hora de uma adição ou remoção de regras, assim como também facilita na hora da manutenção.

Vamos ao Script:

#!/bin/bash

 ######################################################## SCRIPT DE FIREWALL PARA FINS DE APRENDIZADO, MODIFIQUE-O A SEU GOSTO ## Criado por phrich                                                                                              ########################################################

 #################### DECLARANDO VARIÁVEIS ####################

 # Interface de rede que recebe a internetIFACE_WEB="eth0"

 # Interface de rede ligada a rede internaIFACE_LAN="eth1"

 # Rede internaREDE_INTERNA="10.0.0.0/24"

 ###################################################################### FUNÇÃO STOP                                                                                                                                  ## Esta função limpa todas as regras e libera todos os acessos, caso necessite de redirecionamentos (NAT) ## Favor incluir as linhas referentes a nat, que não está incluso neste exemplo                                          ######################################################################

 # Cria a função

 function stop() { # Limpa todas as regrasiptables -Fiptables -t nat -Fiptables -t mangle -F

 # Coloca as políticas padrões como ACCEPT, liberando todo e qualquer

Page 4: Squid + Iptables - Combinação Infalível

acessoiptables -A INPUT -P ACCEPTiptables -A OUTPUT -P ACCEPTiptables -A FORWARD -P ACCEPT

 # Habilita o roteamento no kernel #echo 1 > /proc/sys/net/ipv4/ip_forward # Compartilha a internetiptables -t nat -A POSTROUTING -o $IFACE_WEB -j MASQUERADE

 # Fecha a função}

 # FIM DA FUNÇÃO STOP #

  ##################################################################### FUNÇÃO START                                                                                                                              ## Esta função tem por finalidade setar as regras a fim de realizar as liberações, pois trabalharemos com ## as políticas do iptables como DROP                                                                                                  #####################################################################

 # Cria a funçãofunction start () { # Limpa as regras criadas anteriormente #

 # Limpa a tabela filteriptables -F

 # Limpa a tabela natiptables -t nat -F

 # Limpa a tabela mangleiptables -t mangle -F

  # Coloca as políticas padrões como DROP, ou seja nenhum acesso foi liberado #

 iptables -P INPUT DROPiptables -P OUTPUT DROPiptables -P FORWARD DROP

 # Carrega módulos #

 # Em alguns casos esses módulos serão úteis, realize uma pesquisa sobre cada um #/sbin/modprobe ip_tables/sbin/modprobe iptable_filter/sbin/modprobe ip_conntrack/sbin/modprobe ip_conntrack_ftp

Page 5: Squid + Iptables - Combinação Infalível

/sbin/modprobe nf_conntrack_ipv4/sbin/modprobe ip_nat_ftp/sbin/modprobe ipt_MASQUERADE/sbin/modprobe iptable_mangle/sbin/modprobe iptable_nat/sbin/modprobe nf_nat/sbin/modprobe nf_conntrack/sbin/modprobe x_tables/sbin/modprobe nf_nat_pptp  # Habilita o roteamento no kernel #echo 1 > /proc/sys/net/ipv4/ip_forward # Compartilha a internetiptables -t nat -A POSTROUTING -o $IFACE_WEB -j MASQUERADE

 ############## REGRAS DE NAT ##############

 # Acesso remoto via RDP para um host RWindowsiptables -t nat -A PREROUTING -i $IFACE_WEB -p tcp --dport 3389 -j REDIRECT --to 10.0.0.2:3389

 ################ REGRAS DE INPUT ################

 # Libera o squid a partir da rede internaiptables -A INPUT -p tcp --dport 3128 -s $LAN -j ACCEPT

 # Libera SSH Apenas para a rede internaiptables -A INPUT -p tcp --dport 22 -s $LAN -j ACCEPT

 ################# REGRAS DE OUTPUT #################

 # Libera as portas 80 e 443 apenas para localhostiptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

 # Libera DNS apenas para localhostiptables -A OUTPUT -p tcp --dport 53 -j ACCEPTiptables -A OUTPUT -p udp --dport 53 -j ACCEPT

 # Libera FTP para localhost (muito útil para o apt-get, yum, etc)iptables -A OUTPUT -p tcp -m multiport --dports 20,21 -j ACCEPTiptables -A OUTPUT -p udp -m multiport --dports 20,21 -j ACCEPT

 ################## REGRAS DE FORWARD ##################

 # Libera o acesso a clientes de email, pop e smtpiptables -A FORWARD -p tcp -m multiport --dports 25,110 -j ACCEPT

 # Fecha a função

Page 6: Squid + Iptables - Combinação Infalível

}

 # FIM DA FUNÇÃO START #

 ############################# CRIANDO OS PARÂMETROS DO SCRIPT #############################

 #Aqui serão definidos os parâmetros:

 # start = Ativa todas as regras, realizando os bloqueios e liberações# stop = Limpa todoas as regras, "libera geral" ;-)#restart = Carrega novas regras inseridas posteriormente

 case $1 in start)start;;

 stop)stop;;

 restart)stopstart;;

 *)echo "Erro, utilize os seguintes parâmetros: start | stop | restart"exit 0;;

 esac

 # FIM DO SCRIPT DE FIREWALL #

Squid

O Squid, como todos sabem, é um serviço de Proxy, onde o mesmo realiza o controle de acesso à sites da Internet, faz cache de páginas, etc.

Neste artigo, veremos como realizar bloqueios e liberações, utilizando grupos que poderão ou não acessar determinados sites, para isto, usaremos a autenticação baseada no utilitário do Apache, o 'ncsa_auth'.

Ao instalar o Squid, versão 3, pelo APT-GET, seus arquivos de configurações ficam dentro de “/etc/squid3”, sendo assim, vamos organizar um pouco melhor este diretório.

Vamos criar dois novos diretórios, um onde conterão os grupos e o outro com uma lista que precisaremos para criar ACLs:

# mkdir /etc/squid3/acls# mkdir /etc/squid3/grupos

Page 7: Squid + Iptables - Combinação Infalível

Vamos trabalhar com 3 grupos de exemplo:

DIRETORIA: Acesso total a internet Vendas: Acesso com algumas restrições Recepção: Acesso somente a sites específicos

Então, vamos criar e popular os grupos:

# htpasswd -c /etc/squid3/grupos/diretoria humberto.chagas

O comando acima utiliza o HTPASSWD (que também é um utilitário do Apache), que é o programa responsável por criar as senhas.

O parâmetro '-c' cria um novo arquivo, posteriormente indicamos o caminho do novo arquivo, e por último, colocamos o nome do usuário a ser inserido no arquivo.

Após digitar o comando acima, ele pedirá uma senha para o novo usuário, insira a senha e depois confirme-a.

Para adicionar um novo usuário, digitamos o mesmo comando, porém sem o parâmetro '-c', vejamos:

# htpasswd /etc/squid3/grupos/diretoria carlos.augusto# htpasswd /etc/squid3/grupos/diretoria geraldo.magela

Mesma coisa, digite a senha para os novos usuários e confirme-as.

Vamos popular os dois grupos restantes:

# htpasswd -c /etc/squid3/grupos/vendas carlos.augusto# htpasswd /etc/squid3/grupos/vendas jose.bonifacio

# htpasswd -c /etc/squid3/grupos/recepcao tania.maria

Vamos agora realizar uma pré-bloqueio, com ele, podemos ver algumas palavras que não queremos que usuários acessem:

# touch /etc/squid3/acls/palavras_proibidas

Dentro do arquivo acima, vamos inserir algumas palavras:

sexo*jogo*jogatina*facebook*youtube*orkut*

Page 8: Squid + Iptables - Combinação Infalível

Não se esqueçam do ' * ' (Asterisco) ao final de cada palavra, pois como vamos usar a ACL do tipo 'url_regex', o asterisco entra como expressão regular.

Vamos criar uma lista com sites permitidos para o grupo recepção:

# touch /etc/squid3/acls/sites_recepcao

Insira os seguintes sites ao grupo:

.vivaolinux.com.br*

.siteempresa.com.br*

.cotacoes.com.br*

Novamente, repare no ' . ' (Ponto) antes do site e no ' * ' (Asterisco) ao final. Eles também são expressões regulares, que indicam que devem liberar todos os subdiretórios do site e tudo o que tiver antes do ponto.

Por exemplo, vamos supor que o site 'meusite.com' tenha as seguintes páginas:

- www2.meusite.com

- www.meusite.com/sexosaude

Se colocássemos somente 'www.meusite.com' em nossa lista, ele não liberaria o 'www2.meusite.com', pois não consta na lista, e também não liberaria o 'www.meusite.com/sexosaude', pois no nosso bloqueio conteria a palavra sexo. Mas estes conceitos, entenderemos mais tarde.

Squid.conf

Aqui, eu apenas comentarei os exemplos de ACLs, e as linhas que acho mais convenientes.

Crie um cópia do arquivo original do “squid.conf” para que você possa ter uma sempre a mão, pois este arquivo é rico em comentários e exemplos, portanto, para uma administração mais simples, eu recomendo 'limpar' os comentários e exemplos, deixando o arquivo menor e visualmente mais fácil de trabalhar...

- Deixe de ser preguiçoso e leia os comentários e exemplos!!! ;-)

Conteúdo de “/etc/squid3/squid.conf”:

# Porta em que o squid irá "ouvir"http_port 3128

 # Nome visível do servidorvisible_hostname Proxy

 # Programa que será usado na autenticação, no caso msnt_auth

Page 9: Squid + Iptables - Combinação Infalível

auth_param basic program /usr/lib/squid3/msnt_auth

 # Número de processos filhos usados pelo autenticador, caso seja utilizado em uma rede muito grande# esse número deve ser aumentado.auth_param basic children 5

 # Mensagem que aparecerá na janela de autenticaçãoauth_param basic realm "Servidor Proxy"

  ########  ACLS ########

 # ACLS que não vão passar pela autenticação# Insira aqui as acls que você não quer que passe pela autenticação# Nesta artigo não darei exemplos, porém você pode usar para uma atualização de antivírus# Ou qualquer outra aplicação que não necessite de autenticação

 # Insira dentro do arquivo citado abaixo os ips usados pelo seu antivírusacl antivirus dst "/etc/squid3/acls/antivirus"

 # Torna obrigatório o uso de autenticação (O que for feito desta linha para baixo)acl internal_lan proxy_auth REQUIRED

 # GRUPOS #

 # Administradoresacl administrators proxy_auth "/etc/squid3/grupos/administradores"

 # Diretoriaacl diretoria proxy_auth "/etc/squid3/groups/diretoria"

 # Vendasacl recepcao proxy_auth "/etc/squid3/groups/vendas"

 # Recepcaoacl recepcao proxy_auth "/etc/squid3/groups/recepcao"

   # Arquivos com bloqueios #

 # Acl do tipo url_regex (regex de expressão regular - Regular Expression)# Isira no arquivo as palavras proibidas como sexo, orkut, etc, conforme visto anteriormenteacl palavras_proibidas url_regex "/etc/squid3/acls/palavras_proibidas"

 # Acl do tipo url_regex (regex de expressão regular - Regular Expression)# Insira aqui os sites que foram bloqueados pela acl palavras proibidas, como por exemplo .sexosaude.com*acl palavras_permitidas url_regex

Page 10: Squid + Iptables - Combinação Infalível

"/etc/squid3/acls/palavras_permitidas"

 # Colocar no arquivo /etc/squid3/acls/sites_restritos# links de sites que são proibidos# Exemplo: O site uol.com.br está liberado, porém o usuário não consegue acessar a parte do site sexo.uol.com.br# Portanto adicione no arquivo as sessões dos sites que você não quer que o usuário acesse.acl sites_restritos dstdomain "/etc/squid3/acls/sites_restritos"

 #Recommended minimum configuration:acl manager proto cache_objectacl localhost src 127.0.0.1/32acl to_localhost dst 127.0.0.0/8acl rede_interna 10.0.0.0/24

 # Acls padrões do SQUID (Aqui ele faz liberações de algumas portas)acl SSL_ports port 443acl SSL_ports port 2095acl SSL_ports port 2082acl Safe_ports port 80      # httpacl Safe_ports port 21      # ftpacl Safe_ports port 443     # httpsacl Safe_ports port 70      # gopheracl Safe_ports port 210     # waisacl Safe_ports port 1025-65535  # unregistered portsacl Safe_ports port 280     # http-mgmtacl Safe_ports port 488     # gss-httpacl Safe_ports port 591     # filemakeracl Safe_ports port 777     # multiling httpacl Safe_ports port 445acl CONNECT method CONNECT

 # MANAGER ACLS #

 # Acls padrões do SQUIDhttp_access allow manager localhosthttp_access deny managerhttp_access deny !Safe_portshttp_access deny CONNECT !SSL_ports

  # PERSONAL MANAGER #

 # Insira aqui as regras de liberações para o que não vai passar pela autenticação

 # Libera os ips contídos na acl antivirushttp_access allow antivirus##

 # Administradores (Acesso total)http_access allow administradores

 # Diretoria (Acesso total)http_access allow diretoria

 # Vendas (Acesso com restrições, o que estiver contido em palavras_proibidas e sites_restritos)

Page 11: Squid + Iptables - Combinação Infalível

http_access allow vendas palavras_permitidas !palavras_proibidas !sites_restritos

 # Recepcao (Acesso apenas ao que estiver listado em sites_recepcao)http_access deny recepcao !sites_recepcao

 # Nega palavras proibidas exceto o que estiver em palavras_permitidashttp_access deny palavras_proibidas !sites_permitidos

 # Libera rede interna, Localhost e nega tudo o que não se enquadrou em nenhuma regrahttp_access allow localhosthttp_access allow internal_lanhttp_access deny all

  icp_access deny allhtcp_access deny all

 hierarchy_stoplist cgi-bin \?

 # Overwrite cachecache_replacement_policy lrumemory_replacement_policy lru

 #Default:# cache_dir ufs /var/spool/squid3 100 16 256

 # Arquivo de logaccess_log /var/log/squid3/access.log squid

 # Arquivo de cachecache_log /var/log/squid3/cache.log

 # Ajustes do cache, não entrarei em maiores detalhesrefresh_pattern ^ftp:       1440    20% 10080refresh_pattern ^gopher:    1440    0%  1440refresh_pattern (cgi-bin|\?)    0   0%  0refresh_pattern .       0   20% 4320

 icp_port 3130

 # Coloca as páginas de erro em portuguêserror_directory /usr/share/squid3/errors/Portuguese

 coredump_dir /var/spool/squid3

Sarg

O Sarg é o programa responsável por gerar os relatórios bonitinhos do que foi acessado, ele mostra o que foi acessado, o que foi negado, gera estatísticas de tempo de acesso, etc.

Os arquivos de configuração do Sarg, quando instalado pelo APT-GET, ficam dentro de “/etc/squid”, não confundam com o diretório “/etc/squid3”.

Page 12: Squid + Iptables - Combinação Infalível

Vamos então, configurar o Sarg através do arquivo “sarg.conf”.

Lembrando que, aqui estou colocando o arquivo original (/etc/squid/sarg.conf), e que também vou comentar somente as principais linhas, portanto, o restante das configurações ficam a seu critério:

# sarg.conf## TAG:  language #   Available languages:#       Bulgarian_windows1251#       Catalan#       Czech#       Dutch#       English#       French#       German#       Greek#       Hungarian#       Indonesian#       Italian#       Japanese#       Latvian#       Polish#       Portuguese#       Romanian#       Russian_koi8#       Russian_UFT-8#       Russian_windows1251#       Serbian#       Slovak#       Spanish#       Turkish## VAMOS COLOCAR OS RELATÓRIOS EM PORTUGÊSlanguage Portuguese

 # TAG:  access_log file#       Where is the access.log file#       sarg -l file## ESTA LINHA INFORMA ONDE O SARG VAI BUSCAR OS LOGS DO SQUIDaccess_log /var/log/squid3/access.log

 # TAG: graphs yes|no#   Use graphics where is possible.#           graph_days_bytes_bar_color blue|green|yellow|orange|brown|red##graphs yes#graph_days_bytes_bar_color orange

 # TAG:  title#   Especify the title for html page.## A LINHA ABAIXO DIZ RESPEITO AO NOME DA PÁGINA, ALTERE A SEU GOSTOtitle "Squid User Access Reports"

 # TAG:  font_face

Page 13: Squid + Iptables - Combinação Infalível

#   Especify the font for html page.#font_face Tahoma,Verdana,Arial

 # TAG:  header_color#   Especify the header color#header_color darkblue

 # TAG:  header_bgcolor#   Especify the header bgcolor#header_bgcolor blanchedalmond

 # TAG:  font_size#   Especify the text font size#font_size 9px

 # TAG:  header_font_size#   Especify the header font size##header_font_size 9px

 # TAG:  title_font_size#   Especify the title font size##title_font_size 11px

 # TAG:  background_color# TAG:  background_color#   Html page background color#background_color white

 # TAG:  text_color#   Html page text color#text_color #000000

 # TAG:  text_bgcolor#   Html page text background color#text_bgcolor lavender

 # TAG:  title_color#   Html page title color#title_color green

 # TAG:  logo_image#   Html page logo.##logo_image none

 # TAG:  logo_text#   Html page logo text.##logo_text ""

Page 14: Squid + Iptables - Combinação Infalível

 # TAG:  logo_text_color#   Html page logo texti color.##logo_text_color #000000

 # TAG:  logo_image_size#   Html page logo image size. #       width height##image_size 80 45

 # TAG:  background_image#   Html page background image##background_image none

 # TAG:  password#       User password file used by authentication#       If used here, reports will be generated only for that users.##password none

 # TAG:  temporary_dir#       Temporary directory name for work files#       sarg -w dir#temporary_dir /tmp

 # TAG:  output_dir#       The reports will be saved in that directory#       sarg -o dir## A LINHA ABAIXO INFORMA ONDE SERÁ SALVO OS RELATÓRIOS GERADOS, APONTE PARA O SEU DIRETÓRIO WEB,# QUE NO CASO DO DEBIAN É /var/www/ e o diretório, squid-reports#output_dir /var/www/html/squid-reportsoutput_dir /var/www/squid-reports

 # TAG:  output_email#       Email address to send the reports. If you use this tag, no html reports will be generated.#       sarg -e email##output_email none

 # TAG:  resolve_ip yes/no#       Convert ip address to dns name#       sarg -n# QUANDO HABILITADO, RESOLVE IP EM NOMEresolve_ip  yes

 # TAG:  user_ip yes/no#       Use Ip Address instead userid in reports.#       sarg -p# A LINHA ABAIXO INFORMA SE VOCÊ QUER OBTER O IP DO USUÁRIO NO CASO EU DEIXEI COMO "no" POIS# IREMOS VER OS RELATÓRIOS POR USUÁRIOSuser_ip no

Page 15: Squid + Iptables - Combinação Infalível

 # TAG:  topuser_sort_field field normal/reverse#       Sort field for the Topuser Report.#       Allowed fields: USER CONNECT BYTES TIME#topuser_sort_field BYTES reverse

 # TAG:  user_sort_field field normal/reverse#       Sort field for the User Report.#       Allowed fields: SITE CONNECT BYTES TIME#user_sort_field BYTES reverse

 # TAG:  exclude_users file#       users within the file will be excluded from reports.#       you can use indexonly to have only index.html file.## A LINHA ABAIXO DIZ RESPEITO AO ARQUIVO ONDE CONSTAM OS USUÁRIOS QUE NÃO TERÃO RELATÓRIOSexclude_users /etc/squid/sarg.users

 # TAG:  exclude_hosts file#       Hosts, domains or subnets will be excluded from reports.##       Eg.: 192.168.10.10 - exclude ip address only#            192.168.10.0  - exclude full C class#            s1.acme.foo   - exclude hostname only#            acme.foo      - exclude full domain name#exclude_hosts /etc/squid/sarg.hosts

 # TAG:  useragent_log file#       useragent.log file patch to generate useragent report.##useragent_log none

 # TAG:  date_format#       Date format in reports: e (European=dd/mm/yy), u (American=mm/dd/yy), w (Weekly=yy.ww)#       date_format u

 # TAG:  per_user_limit file MB#       Saves userid on file if download exceed n MB.#       This option allow you to disable user access if user exceed a download limit.#       #per_user_limit none

 # TAG: lastlog n#      How many reports files must be keept in reports directory.#      The oldest report file will be automatically removed.#      0 - no limit.#lastlog 0

 # TAG: remove_temp_files yes#      Remove temporary files: geral, usuarios, top, periodo from root report directory.

Page 16: Squid + Iptables - Combinação Infalível

## REMOVE ARQUIVOS TEMPORÁRIOS, SE VOCÊ HABILITAR ESTA OPÇÃO CORRE O RISCO DE ENCHER O DISCOremove_temp_files yes

 # TAG: index yes|no|only#      Generate the main index.html.#      only - generate only the main index.html#index yes

 # TAG: index_tree date|file#      How to generate the index.#index_tree file

 # TAG: overwrite_report yes|no#      yes - if report date already exist then will be overwrited.#       no - if report date already exist then will be renamed to filename.n, filename.n+1#overwrite_report yes

 # TAG: records_without_userid ignore|ip|everybody#      What can I do with records without user id (no authentication) in access.log file ?##      ignore - This record will be ignored.#          ip - Use ip address instead. (default)#   everybody - Use "everybody" instead.#records_without_userid ip

 # TAG: use_comma no|yes#      Use comma instead point in reports.#      Eg.: use_comma yes => 23,450,110#           use_comma no  => 23.450.110#use_comma yes

 # TAG: mail_utility mail|mailx#      Mail command to use to send reports via SMTP#mail_utility mailx

 # TAG: topsites_num n#      How many sites in topsites report.#topsites_num 100

 # TAG: topsites_sort_order CONNECT|BYTES A|D#      Sort for topsites report, where A=Ascendent, D=Descendent#topsites_sort_order CONNECT D

 # TAG: index_sort_order A/D#      Sort for index.html, where A=Ascendent, D=Descendent#index_sort_order D

Page 17: Squid + Iptables - Combinação Infalível

 # TAG: exclude_codes file#      Ignore records with these codes. Eg.: NONE/400#exclude_codes /etc/squid/sarg.exclude_codes

 # TAG: replace_index string#      Replace "index.html" in the main index file with this string#      If null "index.html" is used ##replace_index <!--?php echo str_replace(".", "_", $REMOTE_ADDR); echo ".html"; ?-->

 # TAG: max_elapsed milliseconds#      If elapsed time is recorded in log is greater than max_elapsed use 0 for elapsed time.#      Use 0 for no checking ##max_elapsed 0# 8 Hoursmax_elapsed 28800000

 # TAG: report_type type#      What kind of reports to generate.#      topusers            - users, sites, times, bytes, connects, links to accessed sites, etc#      topsites        - site, connect and bytes report#      sites_users     - users and sites report#      users_sites     - accessed sites by the user report#      date_time       - bytes used per day and hour report#      denied          - denied sites with full URL report#      auth_failures       - autentication failures report#      site_user_time_date - sites, dates, times and bytes report#      downloads           - downloads per user report##      Eg.: report_type topsites denied ##report_type topusers topsites sites_users users_sites date_time denied auth_failures site_user_time_date downloadsreport_type topusers topsites sites_users users_sites date_time denied auth_failures site_user_time_date downloads

 # TAG: usertab filename#      You can change the "userid" or the "ip address" to be a real user name on the reports.#      Table syntax:#       userid name   or   ip address name#      Eg:#       SirIsaac Isaac Newton#       vinci Leonardo da Vinci#       192.168.10.1 Karol Wojtyla#      #      Each line must be terminated with '\n'#usertab /etc/squid/sarg.usertab

 # TAG: long_url yes|no#      If yes, the full url is showed in report.#      If no, only the site will be showed#

Page 18: Squid + Iptables - Combinação Infalível

#      YES option generate very big sort files and reports.## AQUI ELE DIZ SOBRE SE VOCÊ QUER VER OS ENDEREÇOS NOS RELATÓRIOS NO MODO CURTO# OU A URL INTEIRA, COM POR EXEMPLO

 # Modo curto: meusite.com# Modo extenso: meusite.com/aplicacoes/aplicacao1long_url no

 # TAG: date_time_by bytes|elap#      Date/Time reports will use bytes or elapsed time?#date_time_by bytes

 # TAG: charset name#      ISO 8859 is a full series of 10 standardized multilingual single-byte coded (8bit)#      graphic character sets for writing in alphabetic languages#      You can use the following charsets:#       Latin1      - West European#       Latin2      - East European #       Latin3      - South European #       Latin4      - North European #       Cyrillic #       Arabic #       Greek #       Hebrew #       Latin5      - Turkish #       Latin6#       Windows-1251#       Koi8-r#charset Latin1

 # TAG: user_invalid_char "&/"#      Records that contain invalid characters in userid will be ignored by Sarg.##user_invalid_char "&/"

 # TAG: privacy yes|no#      privacy_string "***.***.***.***"#      privacy_string_color blue#      In some countries the sysadm cannot see the visited sites by a restrictive law.#      Using privacy yes the visited url will be changes by privacy_string and the link#      will be removed from reports.##privacy no#privacy_string "***.***.***.***"#privacy_string_color blue

 # TAG: include_users "user1:user2:...:usern"#      Reports will be generated only for listed users.##include_users none

 # TAG: exclude_string "string1:string2:...:stringn"

Page 19: Squid + Iptables - Combinação Infalível

#      Records from access.log file that contain one of listed strings will be ignored.##exclude_string none

 # TAG: show_successful_message yes|no#      Shows "Successful report generated on dir" at end of process.#show_successful_message no

 # TAG: show_read_statistics yes|no#      Shows some reading statistics.#show_read_statistics no

 # TAG: topuser_fields#      Which fields must be in Topuser report.#topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE

 # TAG: user_report_fields#      Which fields must be in User report.#user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE

 # TAG: topuser_num n#      How many users in topsites report. 0 = no limit#topuser_num 0

 # TAG: site_user_time_date_type list|table#      generate reports for site_user_time_date in list or table format#site_user_time_date_type table

 # TAG: datafile file#      Save the report results in a file to populate some database##datafile none

 # TAG: datafile_delimiter ";"#      ascii character to use as a field separator in datafile##datafile_delimiter ";"

 # TAG: datafile_fields all#      Which data fields must be in datafile#      user;date;time;url;connect;bytes;in_cache;out_cache;elapsed##datafile_fields user;date;time;url;connect;bytes;in_cache;out_cache;elapsed

 # TAG: datafile_url ip|name#      Saves the URL as ip or name in datafile##datafile ip

Page 20: Squid + Iptables - Combinação Infalível

 # TAG: weekdays#      The weekdays to take account ( Sunday->0, Saturday->6 )# Example:#weekdays 1-3,5# Default:#weekdays 0-6

 # TAG: hours#      The hours to take account# Example:#hours 7-12,14,16,18-20# Default:#hours 0-23

 # TAG: dansguardian_conf file#      DansGuardian.conf file path#      Generate reports from DansGuardian logs.#      Use 'none' to disable it.#      dansguardian_conf /usr/dansguardian/dansguardian.conf##dansguardian_conf none

 # TAG: dansguardian_ignore_date on|off#      Use 'on'  use the record even the date range is different from the used squid access.log file.#      Use 'off' use the record only if the date range is in the used squid access.log file.##dansguardian_ignore_date off

 # TAG: squidguard_conf file#      path to squidGuard.conf file#      Generate reports from SquidGuard logs.#      Use 'none' to disable.#      You can use sarg -L filename to use an alternate squidGuard log.#      squidguard_conf /usr/local/squidGuard/squidGuard.conf##squidguard_conf none

 # TAG: squidguard_ignore_date on|off#      Use 'on'  use the record even the date range is different from the used squid access.log file.#      Use 'off' use the record only if the date range is in the used squid access.log file.##squidguard_ignore_date off

 # TAG: squidguard_log_format#      Format string SquidGuard logs.#      REJIK       #year#-#mon#-#day# #hour# #list#:#tmp# #ip# #user# #tmp#/#tmp#/#url#/#end##      SQUIDGUARD  #year#-#mon#-#day# #hour# #tmp#/#list#/#tmp#/#tmp#/#url#/#tmp# #ip#/#tmp# #user# #end##squidguard_log_format #year#-#mon#-#day# #hour# #tmp#/#list#/#tmp#/#tmp#/#url#/#tmp# #ip#/#tmp# #user# #end#

 # TAG: show_sarg_info yes|no

Page 21: Squid + Iptables - Combinação Infalível

#      shows sarg information and site path on each report bottom##show_sarg_info yes

 # TAG: show_sarg_logo yes|no#      shows sarg logo##show_sarg_logo yes

 # TAG: parsed_output_log directory#      Saves the processed log in a sarg format after parsing the squid log file.#      This is a way to dump all of the data structures out, after parsing from #      the logs (presumably this data will be much smaller than the log files themselves),#      and pull them back in for later processing and merging with data from previous logs.##parsed_output_log none

 # TAG: parsed_output_log_compress /bin/gzip|/usr/bin/bzip2|nocompress#      sarg logs compress util##parsed_output_log_compress /bin/gzip

 # TAG: displayed_values bytes|abbreviation#      how the values will be displayed in reports.#      eg. bytes    -  209.526#          abbreviation -  210K##displayed_values bytes

 # Report limits# TAG: authfail_report_limit n# TAG: denied_report_limit n# TAG: siteusers_report_limit n# TAG: squidguard_report_limit n# TAG: user_report_limit n# TAG: dansguardian_report_limit n# TAG: download_report_limit n#      report limits (lines).#      '0' no limit##authfail_report_limit 10#denied_report_limit 10#siteusers_report_limit 0#squidguard_report_limit 10#dansguardian_report_limit 10#user_report_limit 10#user_report_limit 50

 # TAG: www_document_root dir#     Where is your Web DocumentRoot#     Sarg will create sarg-php directory with some PHP modules:#     - sarg-squidguard-block.php - add urls from user reports to squidGuard DB##www_document_root /var/www/html

 

Page 22: Squid + Iptables - Combinação Infalível

# TAG: block_it module_url#     This tag allow you to pass urls from user reports to a cgi or php module,#     to be blocked by some Squid acl##     Eg.: block_it /sarg-php/sarg-block-it.php#     sarg-block-it is a php that will append a url to a flat file.#     You must change /var/www/html/sarg-php/sarg-block-it to point to your file#     in $filename variable, and chown to a httpd owner.##     sarg will pass http://module_url?url=url##block_it none

 # TAG: external_css_file path#     This tag allow internal sarg css override.#     Sarg use theses style classes:#       .body       body class#   .info       sarg information class, align=center#   .title      title class, align=center#   .header     header class, align:left#   .header2    header class, align:right#   .header3    header class, align:right#   .text       text class, align:left#   .data       table text class, align:right#   .data2      table text class, align:right, border colors#   .link       link class##     There is a sample in /usr/local/sarg/etc/css.tpl##external_css_file none

 # TAG: user_authentication yes|no#     Allow user authentication in User Reports using .htaccess#     Parameters:  #   AuthUserFile    - where the user password file is#   AuthName    - authentication realm. Eg "Members Only"#   AuthType    - authenticaion type - basic#   Require     - authorized users to see the report.#                                          %u - user report## user_authentication no# AuthUserFile /usr/local/sarg/passwd# AuthName "SARG, Restricted Access"# AuthType Basic# Require user admin %u

 # TAG: download_suffix "suffix,suffix,...,suffix"#    file suffix to be considered as "download" in Download report.#    Use 'none' to disable.    #download_suffix "zip,arj,bzip,gz,ace,doc,iso,adt,bin,cab,com,dot,drv$,lha,lzh,mdb,mso,ppt,rtf,src,shs,sys,exe,dll,mp3,avi,mpg,mpeg"

 # TAG: ulimit n#    The maximum number of open file descriptors to avoid "Too many open files" error message.#    You need to run sarg as root to use ulimit tag.

Page 23: Squid + Iptables - Combinação Infalível

##ulimit 20000

 # TAG: ntlm_user_format username|domainname+username#      NTLM users format.##ntlm_user_format domainname+username

 # TAG: realtime_refresh_time num sec#      How many time to auto refresh the realtime report#      0 = disable## realtime_refresh_time 3

 # TAG: realtime_access_log_lines num#      How many last lines to get from access.log file ## realtime_access_log_lines 1000

 # TAG: realtime_types: GET,PUT,CONNECT,ICP_QUERY,POST#      Which records must be in realtime report.## realtime_types GET,PUT,CONNECT 

 # TAG: realtime_unauthenticated_records: ignore|show#      What to do with unauthenticated records in realtime report.## realtime_unauthenticated_records: ignore

 # TAG: byte_cost value no_cost_limit#      Cost per byte.#      Eg. byte_cost 0.01 100000000#           per byte cost      = 0.01#           bytes with no cost = 100 Mb#      0 = disable## byte_cost 0.01 50000000

DicasBom, vamos entender melhor a linha: exclude_users /etc/squid/sarg.users

Dentro do arquivo "/etc/squid/sarg.users", deve constar os usuários que serão excluídos do relatório gerado pelo Sarg.

Caso você não queira gerar o relatório de algum usuário, insira o nome do usuário (1 por linha) dentro do arquivo citado.

Para gerar os relatórios automaticamente, insira a seguinte linha dentro do cron:

00 22 * * * /usr/sbin/sarg-reports today

Assim, será gerado o relatório todos os dias, às 22:00hs.

Page 24: Squid + Iptables - Combinação Infalível

Debugando possíveis erros

SquidÉ muito comum em novas configurações do Squid, erros de digitação; quando isto acontece, o Squid não carrega as configurações e não inicia.

Na hora dos testes, caso o seu Squid não esteja iniciando. Que podemos ver com o comando:

# ps aux | grep squid

Inicie o Squid da seguinte forma:

# squid -d 10

Assim ele tentará inicializar com o modo Debug, onde serão mostradas todas as mensagens da inicialização do Squid, assim, caso exista algum erro, você poderá facilmente corrigi-lo.

Vejo acontecer muito com as pessoas, é que ao digitar o comando: ps aux | grep squid, a pessoa pense que o Squid está rodando, quando na verdade apenas é a saída do comando GREP, portanto, fique atento e não deixe os seus olhos lhe enganarem. ;-)

Ao realizar a liberação de algum site, pode acontecer de o site abrir todo 'quebrado', isto ocorre quando o site carrega imagens de outros site. Para corrigir o site 'quebrado', procedemos da seguinte maneira:

# tail -f /var/log/squid3/access.log | grep nome_usuário

Assim, veremos todos os acessos em tempo real do usuário, e poderemos descobrir o que está sendo negado. Caso você queira uma maneira mais simples, pode usar também o seguinte comando:

# tail -f /var/log/squid3/access.log | grep nome_usuário | grep -i denied

Assim, você verá apenas o que está sendo bloqueado para o usuário.

Você também pode trocar o nome do usuário pelo IP do Host.

Iptables / Script de FirewallNa execução do seu Script, pode ocorrer erros, sejam de digitação, falta de parâmetros, etc. Então, o Script retornará um erro, mas como descobrir em qual linha???

Simples, chame o Script da seguinte maneira:

Page 25: Squid + Iptables - Combinação Infalível

# bash -x /etc/init.d/firewall

Esta maneira irá lhe mostrar exatamente a linha onde está o erro.

Para FinalizarSites, dicas, etc.

Vamos supor que você adicione um novo site em alguma regra, ou que você adicione uma nova ACL ou configuração, você deve reiniciar o Squid para que as alterações tenham efeito.

Porém, este processo é demorado, e seus usuários poderiam ficar até 1 minuto sem Internet, para isto, quando realizamos alterações no Squid, podemos simplesmente reler os arquivos de configuração, sem a necessidade de parar o cache.

Para isto, digitamos o comando:

# squid -k reconfigure

Caso ocorra algum erro, ele informará o erro para você, e então, basta corrigir o erro indicado e digitar o comando acima novamente.

* Mas atenção, caso você crie uma ACL, por exemplo:

$ acl teste url_regex "/etc/squid3/acls/teste"

. . .E a mesma esteja vazia, quando você digitar o comando citado, o Squid irá lhe informar que a ACL citada é vazia, porém, ele vai ler as regras normalmente.

Ou, se por ventura, você começar a popular esta ACL e sem querer, colocar os site assim:

.site1.com*

.site2.com*

.site3.com*

.site1.com*

Ele vai lhe informar que o 'site1.com' já está inserido, e logo você precisará remover uma das entradas e digitar o comando novamente.

Você não sabe a porta de algum serviço???

Busque no Services, dentro do arquivo “/etc/services”, existe uma lista com todos os serviços (ou a maioria).

Lá é a sua fonte de buscas!