Prática recomendada para proxies de repositórios de pacotes

13

Eu tenho uma coleção de servidores CentOS na minha rede corporativa. Por motivos de segurança, a maioria dos servidores não tem acesso geral à Internet de saída, a menos que seja um requisito funcional essencial para o servidor.

Isso cria um desafio quando preciso atualizar pacotes. Para os repositórios do yum, atualmente espelhei todos os repos necessários da Internet e disponibilizo os espelhos na intranet. Mantenho cópias de cada repositório em cada um dos nossos cinco ambientes: dev, QA, teste e dois data centers de produção.

Atualmente, não resolvo repositórios de pacotes específicos para idiomas. Quando os servidores precisam de uma atualização de rubygems, PyPI, PECL, CPAN ou npm, eles precisam adquirir acesso temporário à Internet para buscar os pacotes. Eu fui solicitado a começar a espelhar rubygems e PyPI, e o resto provavelmente seguirá.

Tudo isso é desajeitado e não funciona bem. Eu gostaria de substituí-lo por um único proxy de cache em um ambiente e quatro proxies conectados em série em meus outros ambientes, para eliminar a complexidade e a sobrecarga de disco dos espelhos completos. Adicionalmente:

  • Pode ser um proxy direto ou reverso; Cada gerenciador de pacotes suporta um servidor proxy ou um terminal de repositório customizado, que pode ser um espelho local ou um proxy reverso.
  • Ele precisa de controle de acesso granular para que eu possa limitar quais IPs de cliente podem se conectar a quais domínios de repo.
  • Os clientes precisam seguir redirecionamentos para domínios desconhecidos. Sua solicitação original pode ser limitada a rubygems.org, mas se esse servidor retornar um 302 para um CDN aleatório, você deve ser capaz de segui-lo.
  • Deve suportar backends HTTPS. Eu não preciso necessariamente representar outros servidores SSL, mas eu deveria ser capaz de expor novamente um site HTTPS via HTTP, ou encerrar e criptografar novamente com um certificado diferente.

Eu estava olhando inicialmente para proxies reversos, e o Varnish parece ser o único que me permitiria resolver internamente os redirecionamentos 302 dentro do proxy. No entanto, a versão gratuita do Varnish não suporta backends HTTPS. Agora estou avaliando o Squid como uma opção de proxy de encaminhamento.

Isso parece ser algo que deveria ser um problema relativamente comum nas redes corporativas, mas estou tendo problemas para encontrar exemplos de como outras pessoas resolveram isso. Alguém implementou algo semelhante ou pensa na melhor forma de fazê-lo?

Obrigado!

    
por Dave Smith 16.07.2016 / 14:55

4 respostas

4

Nós usamos o Squid para isso; A melhor coisa sobre o squid é que você pode definir a expiração individual de objetos com base em uma correspondência de padrão, com bastante facilidade, o que permite que os metadados do repositório do yum sejam limpos com bastante rapidez. A configuração que temos que implementa isso:

refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern (\.xml|xml\.gz)$      0       20%     2880
refresh_pattern ((sqlite.bz2)*)$      0       20%     2880
refresh_pattern (\.deb|\.udeb)$   1296000 100% 1296000
refresh_pattern (\.rpm|\.srpm)$   1296000 100% 1296000
refresh_pattern .        0    20%    4320

link

    
por 20.07.2016 / 07:34
3

Isso não resolverá todas as suas tarefas, mas talvez isso ainda seja útil. Apesar do nome, o apt-cacher-ng não funciona apenas com Debian e derivados e é

a caching proxy. Specialized for package files from Linux distributors, primarily for Debian (and Debian based) distributions but not limited to those.

Estou usando isso em produção em um ambiente semelhante (baseado no Debian) como o seu.

No entanto, AFAIK, isso não suporta rubricas, PyPI, PECL, CPAN ou npm e não fornece ACLs granulares.

Pessoalmente, acho que investigar o Squid é uma boa ideia. Se você implementar uma configuração no final, poderia compartilhar suas experiências? Estou muito interessado em saber como é isso.

    
por 16.07.2016 / 15:27
2

Esse é um caso de uso definitivo para um proxy . Um proxy normal, não um proxy reverso (também conhecido como balanceadores de carga).

O mais conhecido e gratuito e de código aberto é o squid . Felizmente, é um dos poucos bons softwares de código aberto que podem ser facilmente instalados com um único apt-get install squid3 e configurados com um único arquivo /etc/squid3/squid.conf .

Analisaremos as boas práticas e as lições sobre as quais você deve saber.

O arquivo de configuração oficial foi modificado (as 5000 linhas comentadas inúteis foram removidas).

#       WELCOME TO SQUID 3.4.8
#       ----------------------------
#
#       This is the documentation for the Squid configuration file.
#       This documentation can also be found online at:
#               http://www.squid-cache.org/Doc/config/
#
#       You may wish to look at the Squid home page and wiki for the
#       FAQ and other documentation:
#               http://www.squid-cache.org/
#               http://wiki.squid-cache.org/SquidFaq
#               http://wiki.squid-cache.org/ConfigExamples
#

###########################################################
# ACL
###########################################################

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 1025-65535  # unregistered ports

acl CONNECT method CONNECT

#####################################################
# Recommended minimum Access Permission configuration
#####################################################
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

#####################################################
# ACL
#####################################################

# access is limited to our subnets
acl mycompany_net   src 10.0.0.0/8

# access is limited to whitelisted domains
# ".example.com" includes all subdomains of example.com
acl repo_domain dstdomain .keyserver.ubuntu.com
acl repo_domain dstdomain .debian.org
acl repo_domain dstdomain .python.org

# clients come from a known subnet AND go to a known domain
http_access allow repo_domain mycompany_net

# And finally deny all other access to this proxy
http_access deny all

#####################################################
# Other
#####################################################

# default proxy port is 3128
http_port 0.0.0.0:3128

# don't forward internal private IP addresses
forwarded_for off

# disable ALL caching
# bandwidth is cheap. debugging cache related bugs is expensive.
cache deny all

# logs
# Note: not sure if squid configures logrotate or not
access_log daemon:/var/log/squid3/access.log squid
access_log syslog:squid.INFO squid


# leave coredumps in the first cache dir
coredump_dir /var/spool/squid3

# force immediaty expiry of items in the cache.
# caching is disabled. This setting is set as an additional precaution.
refresh_pattern .               0       0%      0

Configuração do cliente - Variáveis de ambiente

Configure estas duas variáveis de ambiente em todos os sistemas.

http_proxy=squid.internal.mycompany.com:3128
https_proxy=squid.internal.mycompany.com:3128

A maioria das bibliotecas cliente http (libcurl, httpclient, ...) são auto-configuráveis usando as variáveis de ambiente. A maioria dos aplicativos está usando uma das bibliotecas comuns e, portanto, suporta o proxy pronto para uso (sem o deviente necessariamente sabendo disso).

Observe que a sintaxe é estrita:

  1. O nome da variável http_proxy DEVE ser minúsculo na maioria dos Linux.
  2. O valor da variável NÃO DEVE começar com http(s):// (o protocolo de proxy NÃO é http (s)).

Configuração do cliente - específica

Alguns aplicativos estão ignorando as variáveis de ambiente e / ou são executados como serviço antes que as variáveis possam ser definidas (por exemplo, debian apt ).

Esses aplicativos exigirão configuração especial (por exemplo, /etc/apt.conf ).

Proxying HTTPS - Conecte

O proxy HTTPS é totalmente suportado pelo design. Ele usa um método especial "CONNECT" que estabelece algum tipo de túnel entre o navegador e o proxy.

Não sei muito sobre isso, mas nunca tive problemas com isso em anos. Apenas funciona.

Caso especial de HTTPS - proxy transparente

Uma nota no proxy transparente. (isto é, o proxy está oculto e intercepta os pedidos de clientes, como o man-in-the-middle).

Proxies transparentes estão quebrando o HTTPS. O cliente não sabe que existe um proxy e não tem motivos para usar o método Connect especial.

O cliente tenta uma conexão HTTPS direta ... que é interceptada. A interceptação é detectada e erros são lançados em todo o lugar. (O HTTPS serve para detectar ataques man-in-he-middle).

Domínio e lista de permissões do CDN

A lista de permissões de domínios e subdomínios é totalmente suportada pelo squid. No entanto, está fadado a falhar de tempos em tempos de maneira inesperada.

Os sites modernos podem ter todo o tipo de redirecionamentos de domínio e CDN. Isso quebrará o ACL quando as pessoas não se esforçarem para colocar tudo em um único domínio.

Às vezes, haverá um instalador ou um pacote que deseja chamar o proprietário ou recuperar dependências externas antes de executá-lo. Vai falhar a cada momento e não há nada que você possa fazer sobre isso.

Cache

O arquivo de configuração fornecido está desativando toda a forma de armazenamento em cache. É melhor prevenir do que remediar.

Pessoalmente, estou executando as coisas na nuvem no momento, todas as instâncias têm conectividade de pelo menos 100 Mbps e o provedor executa seus próprios repositórios para coisas populares (por exemplo, Debian) que são descobertas automaticamente. Isso faz da largura de banda uma mercadoria que eu não poderia me importar menos.

Eu prefiro desativar totalmente o cache do que experimentar um único bug de cache que derreterá meu cérebro na solução de problemas. Todas as pessoas na internet NÃO PODEM obter seus cabeçalhos de cache corretamente.

Nem todos os ambientes têm os mesmos requisitos. Você pode ir além e configurar o armazenamento em cache.

NUNCA NUNCA requer autenticação no proxy

Existe uma opção para exigir autenticação de senha de clientes, normalmente com suas contas LDAP. Ele quebrará todos os navegadores e todas as ferramentas de linha de comando no universo.

Se você quiser fazer autenticação no proxy, não faça isso.

Se o gerenciamento quiser autenticação, explique que não é possível.

Se você é um desenvolvedor e acabou de entrar em uma empresa que está bloqueando a Internet direta E forçando a autenticação por proxy, CORRA PARA FORA QUANDO PODE.

Conclusão

Nós passamos pela configuração comum, erros comuns e coisas que devemos saber sobre proxy.

Lição aprendida:

  • Existe um bom software de código aberto para proxy (squid)
  • É simples e fácil de configurar (um único arquivo curto)
  • Todas as medidas de segurança (opcionais) têm tradeoffs
  • A maioria das opções avançadas vai quebrar as coisas e voltar para assombrá-lo
  • Os proxies transparentes estão quebrando o HTTPS
  • Autenticação de proxy é mal

Como de costume na programação e no design do sistema, é essencial gerenciar os requisitos e as expectativas.

Eu recomendaria manter o básico ao configurar um proxy. De um modo geral, um proxy simples, sem qualquer filtragem em particular, funcionará bem e não causará nenhum problema. Só tenho que lembrar de (auto) configurar os clientes.

    
por 31.07.2016 / 15:19
1

tivemos um desafio semelhante e o resolvemos usando repositórios locais e um sistema de armazenamento baseado em instantâneos. Basicamente, atualizamos o repositório de desenvolvimento, clona-o para testes, clona-o para staging e finalmente para produção. A quantidade de disco usada é limitada dessa forma, além de ser um armazenamento sata lento e tudo bem.

Os clientes obtêm as informações do repositório do nosso gerenciamento de configuração, portanto, alternar é fácil, se necessário.

Você pode conseguir o que deseja usando ace's no servidor proxy usando strings de agente de usuário ou combinações ips / mask de origem e restringindo seu acesso a determinados domínios, mas se você fizer isso um problema que vejo é o de diferentes versões de pacotes / libraries. Portanto, se um dos hosts puder acessar o cpan e solicitar o módulo xxx :: yyy, a menos que o cliente instrua a usar uma versão específica, ele obterá o mais recente do cpan (ou pypy ou rubygems), que pode ou não ser o que já foi em cache no proxy. Então você pode acabar com versões diferentes no mesmo ambiente. Você não terá esse problema se usar repositórios locais.

    
por 16.07.2016 / 17:27