Ontem foi um dia bastante tenso para administradores de rede no mundo todo. Agora, se a possibilidade de ver as estações da rede sofrendo um ataque de um Hansomware (como o WannaCry) preocupava bastante, imaginem o temor se o ataque propagar pelo Datacenter. Não queira passar por isto para, só assim, criar consciência do quão importante é o controle de acesso e segurança dos dados.

Infelizmente, a liberdade de acesso é inversamente proporcional a segurança!

As consequências de um Ransomware dentro de um ambiente doméstico são desagradáveis, mas no ambiente corporativo são devastadoras, causando prejuízos imensuráveis (a maioria das pessoas só percebe a intensidade disto ao vivenciar o problema). A melhor proteção continua sendo a prevenção. Logo, o acesso à Internet, no ambiente corporativo, deve ser o mais restritivo possível, evitando assim exposição desnecessária a diferentes tipos de ataques. O controle de conteúdo é implementado a partir da combinação de soluções anti-spam, antivírus e filtragem de navegação (web).

Para auxiliar neste processo, resolvemos tratar a configuração de um servidor Proxy HTTP.

O Squid é um servidor proxy bastante robusto, compatível com os protocolos HTTP, HTTPS, FTP e Gopher. Até pouco tempo, o suporte FTP não era nativo (funcionando sob HTTP ou método CONNECT), porém, desde a versão 3.5, passou a ser nativo, atuando como um proxy FTP também. Segundo a Wikipédia, “ele reduz a utilização da conexão e melhora os tempos de resposta fazendo cache de requisições frequentes de páginas web numa rede de computadores. E pode também ser usado como proxy reverso“.

A principal razão para implantar um servidor proxy no ambiente de rede é a possibilidade de aplicar controles de acesso, proteção (como antivírus e anti-phishing, por exemplo), otimização de tráfego e estatísticas de utilização da Internet (navegação). Por questões de segurança, em redes de grande porte, é recomendável a adoção de um antivírus corporativo também (não necessariamente integrado ao proxy).

Demonstraremos o processo básico de instalação e configuração do Squid divido em quatro partes: nesta primeira exibiremos o processo de instalação, na segunda otimizações para alto volume de conexões, em seguida autenticação de usuários e finalizaremos com exemplos de configuração para controle de acesso (básico).

Na maioria das vezes, o ideal é optar pela instalação dos serviços a partir do repositório padrão da distribuição. Ou seja, sem compilar manualmente. A compilação costuma ser escolhida quando o recurso ou suporte desejado não é oferecido nativamente no pacote disponível, salvo em raríssimas exceções. Desta maneira, o processo de atualização será completamente transparente e rápido. Dependendo do serviço, a cada atualização crítica, esta escolha impactará diretamente na produtividade ou disponibilidade do serviço.

Porém, no caso do Squid, a compilação é muito simples, não há “múltiplas dependências envolvendo recompilação” e passa ser interessante por permitir uma otimização significativa do serviço, habilitando apenas os recursos necessários. Particularmente, optamos pela compilação quando o ambiente de rede é maior e pede um controle mais granular. Nos demais casos, consideramos opcional.

 

1. Instalando a partir dos repositórios da distribuição

Conforme exposto em outros artigos, os exemplos demonstrados são voltados para Ubuntu. Não é viável e nem faria sentido tentar cobrir diferentes distribuições (o processo é muito parecido).

No Ubuntu, a instalação pode ser feita via apt:

apt-get -y install squid

Para saber quais recursos foram ativados na compilação de sua distribuição, utilize o comando squid -v

root@squid-srv:~# squid -v
 Squid Cache: Version 3.5.12
 Service Name: squid
 Ubuntu linux
 configure options: '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc'
'--localstatedir=/var' '--libexecdir=${prefix}/lib/squid3' '--srcdir=.' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silent-rules' 'BUILDCXXFLAGS=-g -O2 -fPIE
-fstack-protector-strong -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid'
'--libexecdir=/usr/lib/squid' '--mandir=/usr/share/man' '--enable-inline' '--disable-arch-native' '--enable-async-io=8' '--enable-storeio=ufs,aufs,diskd,rock' '--enable-removal-policies=lru,heap'
'--enable-delay-pools' '--enable-cache-digests' '--enable-icap-client' '--enable-follow--forwarded-for'
'--enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB' '--enable-auth-digest=file,LDAP' '--enable-auth-negotiate=kerberos,wrapper' '--enable-auth-ntlm=fake,smb_lm'
'--enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,unix_group,wbinfo_group'
'--enable-url-rewrite-helpers=fake' '--enable-eui' '--enable-esi' '--enable-icmp' '--enable-zph-qos'
'--enable-ecap' '--disable-translation' '--with-swapdir=/var/spool/squid' '--with-logdir=/var/log/squid'
'--with-pidfile=/var/run/squid.pid' '--with-filedescriptors=65536' '--with-large-files' '--with-default-user=proxy' '--enable-build-info=Ubuntu linux' '--enable-linux-netfilter' 
'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wall' 'LDFLAGS=-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' 
'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' 'CXXFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security'

Simples assim! 😉

 

2. Instalando a partir dos fontes (compilação)

A compilação manual é simples, porém um pouco mais trabalhosa e demandará mais tempo para concluir (variando de acordo com o poder de processamento). Não é um processo tão oneroso ou complexo quanto aparenta inicialmente.

Nada impede começar a instalação pelo apt-get para consultar quais são as opções mais comuns (squid -v) e selecionar apenas o essencial, preservando assim a definição base adotada pela distribuição.”

Dependendo do suporte desejado, algumas bibliotecas adicionais serão necessárias:

 

2.1. Suporte mínimo (bibliotecas essenciais de desenvolvimento)

Esta etapa é fundamental para qualquer processo de compilação. Já a biblioteca libcap-dev é uma dependência para compilação do Squid.

apt-get -y install build-essential
apt-get -y install libcap-dev

2.2. Inspeção SSL (HTTPS ou SSL-Bump)

Passos para ativar o suporte a inspeção SSL – analisando URL e conteúdo HTTPS. O pacote ssl-cert não é obrigatório, mas auxilia no processo de administração e configuração dos certificados. Pretendo demonstrar alguns exemplos práticos na quarta parte.

Bibliotecas de desenvolvimento ou dependências

apt-get -y install ssl-cert
apt-get -y install libssl-dev

Opções de compilação (adicionar no ./configure)

--enable-ssl
--enable-ssl-crtd
--with-openssl='/usr/include/openssl/'

2.3. Suporte x-forwarded-for e Proxy Transparente

A opção x-forwarded-for é utilizada quando desejamos que o Squid processe o endereço dos clientes de acordo com o IP informado no cabeçalho HTTP de cada requisição. É útil quando outro serviço recebe conexões antes de encaminhar ao Squid (caso do Dansguardian ou E2Guardian, por exemplo).

Seja qual for o cenário, vale a pena incluir o suporte para função de Proxy Transparente – mesmo que inicialmente não seja configurado.

Habilita as opções x-forward e linux-netfilter no Squid (adicionar no ./configure)

--enable-follow-x-forwarded-for
--enable-linux-netfilter

2.4. Suporte a autenticação Basic, NTLM e Kerberos (negotiate)

Nesta etapa, selecionamos qual será o suporte de autenticação oferecido aos clientes. Na maioria das vezes, a configuração envolve a integração com DCs Windows (Active Directory) ou base de dados local (módulo NCSA).

Bibliotecas de desenvolvimento ou dependências

apt-get -y install winbind
apt-get -y install krb5-user libkrb5-3 libsasl2-modules-gssapi-mit 
apt-get -y install libkrb5-dev

Opções de compilação (adicionar no ./configure)

--enable-auth
--enable-auth-basic
--enable-auth-ntlm
--enable-auth-negotiate

Costumo desabilitar a autenticação digest (no ./configure)

--disable-auth-digest

2.5. Processo de compilação

As principais opções de compilação foram tratadas. Para demonstrar o processo completo, exibirei as opções que costumo ativar em ambientes de produção.

Download dos fontes

cd /usr/src
wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.25.tar.gz
tar xvf squid-3.5.25.tar.gz
cd squid-3.5.25

Definindo a configuração e calculando dependências de compilação

./configure --prefix=/usr --exec_prefix=/usr --bindir=/usr/sbin --sbindir=/usr/sbin --libexecdir=/usr/lib/squid --sysconfdir=/etc/squid --localstatedir=/var/spool/squid --datadir=/usr/share/squid --with-logdir=/var/log/squid \
   --enable-async-io --with-pthreads --enable-storeio=ufs,aufs,diskd --enable-linux-netfilter --enable-arp-acl --enable-epoll --enable-removal-policies=lru,heap --enable-snmp --enable-delay-pools \
   --enable-htcp --enable-cache-digests --enable-referer-log --enable-useragent-log --enable-auth --enable-auth-basic --enable-auth-ntlm --enable-auth-negotiate --disable-auth-digest --enable-carp \
   --with-large-files --enable-follow-x-forwarded-for amd64-debian-linux build_alias=amd64-debian-linux host_alias=amd64-debian-linux target_alias=amd64-debian-linux --enable-zph-qos --disable-wccp \
   --disable-wccpv2 --disable-auto-locale --enable-esi --enable-icap-client --disable-ident-lookups --with-libcap --enable-ssl --with-openssl='/usr/include/openssl/' --with-maxfd=30000 \
   CFLAGS="-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic" "CXXFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic"

Geração e instalação dos binários

make
make install

Permissões de acesso

chgrp winbindd_priv /var/lib/samba/winbindd_privileged
chown proxy.proxy -R /var/log/squid
chown proxy.proxy -R /var/spool/squid

Caso você repita este processo para atualizar a versão do Squid, saiba que o comando ‘make install’ sobrescreverá as páginas de erro em  ‘/usr/share/squid/errors’. Os demais arquivos de configuração serão preservados. Uma alternativa, para evitar que o administrador precise se preocupar com isto a cada compilação, é copiar todo o conteúdo do subdiretório ‘pt-br’ para ‘Portuguese’ (criando um novo) e alterar as páginas apenas neste diretório. Por fim, basta apontar este diretório na opção error_directory no arquivo /etc/squid/squid.conf“.

 

3. Inicialização do serviço

Seja qual for o método de instalação, antes de iniciar o serviço, devemos configurar, em “/etc/squid/squid.conf, três opções: “error_directory (diretório das mensagens de erro), visible_hostname (identificação do servidor) e cache_dir (dimensionamento da estrutura cache em disco)“.

Sem a opção visible_hostname, o serviço não iniciará caso for incapaz de detectar o nome do servidor automaticamente. A configuração desta opção dispensará a detecção automática e evitará surpresas. Particularmente, prefiro fixar na configuração do serviço.

A opção cache_dir (diretórios de swap) determinará o dimensionamento da estrutura de cache em disco, que, se não existir (diretórios e subdiretórios), será criada automaticamente no processo de inicialização do serviço – normalmente previsto pelo script em /etc/init.d). Também influenciará na eficiência de indexação dos objetos armazenados no disco. Por padrão, se a opção não for informada, o sistema trabalhará apenas com cache em memória. Entretanto, se mal dimensionada, logo no início, é provável que o administrador precise recriar a estrutura posteriormente (em /var/spool/squid). No próximo artigo (parte 2), veremos maiores detalhes sobre este assunto.

 

3.1. Antes de iniciar o serviço, crie os diretórios de swap

Conforme exposto anteriormente, se a opção cache_dir for omitida, o cache de objetos será feito apenas em memória (se habilitado). Em ambientes de produção, dificilmente você terá recurso de hardware suficiente a ponto de dispensar o cache em disco globalmente. No entanto, ao configurar a opção cache_dir, o serviço dependerá da existência da estrutura de diretórios para iniciar. O script disponível nas principais distribuições atuais se encarrega deste processo.

root@squid-srv:~# squid -z
root@squid-srv:~# 2017/05/13 10:43:56 kid1| Set Current Directory to /var/spool/squid
2017/05/13 10:43:56 kid1| Creating missing swap directories
2017/05/13 10:43:56 kid1| No cache_dir stores are configured.

3.2. Para habilitar o serviço na inicialização

Quando a instalação é feita a partir do “gerenciador de pacotes” da distribuição (apt ou yum, por exemplo), o serviço tende ser habilitado automaticamente e não há muita intervenção manual.

Porém, ao optar pela compilação, será necessário “instalar” o script de inicialização e ativá-lo manualmente. Existem diferentes alternativas. Atualmente, optamos pela cópia de um script próprio (personalizado) para o diretório /etc/init.d/.

cd /tmp
wget http://linuxfirewall.com.br/squid
cp /tmp/squid /etc/init.d/

Mas, o script padrão adotado pelo Ubuntu 16 é este (basta copiar para /etc/init.d/):
http://linuxfirewall.com.br/squid3

É possível encontrar um script em /usr/src/squid-3.5.25/tools/systemd e outro em /usr/src/squid-3.5.25/tools/sysvinit. Se sua distribuição for compatível com o padrão systemd, basta copiar o arquivo squid.service para o diretório /etc/systemd/system/ e criar um link simbólico em /etc/systemd/system/multi-user.target.wants. São personalizações básicas de sistema, não pretendo aprofundar neste assunto.

Feito isto, basta ativar o serviço:

systemctl enable squid

ou

update-rc.d squid defaults 70 80

3.3. Para iniciar o serviço manualmente

systemctl start squid

ou

service squid start