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.
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 squidou
update-rc.d squid defaults 70 80
3.3. Para iniciar o serviço manualmente
systemctl start squidou
service squid start
[…] primeira parte, tratamos das principais etapas para instalação do Squid. Nesta segunda veremos como otimizar a […]
[…] Se este for o caso, instale as bibliotecas de desenvolvimento e recompile o Squid novamente (vide parte 1). Para confirmar as opções de compilação, utilize o comando “squid […]
Na etapa do comando ./configure com as opções, o seguinte erro é exibido:
checking whether the C compiler works… no
configure: error: in `/usr/src/squid-3.5.27′:
configure: error: C compiler cannot create executables
See `config.log’ for more details
Observando o log, consta os erros:
gcc: error: unrecognized command line option ‘-V’
gcc: fatal error: no input files
compilation terminated.
configure:5051: $? = 1
configure:5040: gcc -qversion >&5
gcc: error: unrecognized command line option ‘-qversion’
gcc: fatal error: no input files
compilation terminated.
O problema se dá pelas opções serem referentes a 64 bits?
Estou no Ubuntu Server 16.04.3 LTS i686
Neste caso, o ideal é não fornecer as opções para arquiteturas de 64bits (“amd64-debian” e “m64”).
Também certifique-se de ter instalado o suporte básico para desenvolvimento:
apt-get -y install build-essential
apt-get -y install libcap-dev
Uma alternativa, para você usar como referência de compilação, é fazer a instalação pelo gerenciador de pacotes da distribuição (via apt) e, com o comando “squid -v”, copiar as opções de compilação adotadas pela distribuição (prevendo a arquitetura correta). Depois, você pode remover os binários e qualquer arquivo de configuração usando o comando “apt-get purge squid…”.
Lembrando que você NÃO precisa identificar a arquitetura manualmente!
Olá amigo, excelente. Uma dúvida, estou enrroscado no 2.2 e 2.3, como adiciono aquelas linhas no ./configure?
São opções do próprio script, basta informar logo após o comando.
Você pode consultar as opções com o comando:
./configure –help
Depois basta encadear as opções em sequência, por exemplo:
./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 –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/’ –enable-follow-x-forwarded-for –with-maxfd=30000 CFLAGS=”-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector “CXXFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m64 -mtune=generic”
A opção enable-linux-netfilter é default nas versões mais atuais.