Gerenciando cluster de computadores linux atrás de firewalls

19

O produto da minha empresa é essencialmente uma caixa Linux (Ubuntu) na rede de outra pessoa executando nosso software. Até agora, tínhamos menos de 25 caixas na natureza e usamos o TeamViewer para gerenciá-las.

Estamos prestes a enviar 1000 dessas caixas e o TeamViewer não é mais uma opção. Meu trabalho é descobrir uma maneira de acessar essas caixas e atualizar o software nelas . Esta solução deve ser capaz de perfurar firewalls e o que você tem.

Eu considerei:

1. Solução doméstica (por exemplo, um serviço Linux) que estabelece um túnel reverso SSH para um servidor na nuvem e outro serviço na nuvem que mantém o controle desses e permite que você se conecte a eles.

Isso obviamente é trabalhoso e, francamente, parece reinventar a roda, pois muitas outras empresas já devem ter passado por esse problema. Mesmo assim, não tenho certeza se faremos um ótimo trabalho.

2. Ferramentas como fantoche, chef ou OpenVPN

Tentei ler o máximo possível, mas não consigo penetrar o suficiente no discurso de marketing para entender a escolha óbvia a seguir.

Ninguém mais, exceto nós, precisa se conectar a essas caixas. Existe alguém com experiência relevante que possa me dar algumas dicas?

hakura
fonte
2
"Nós não estamos a ponto de navio" => "Nós estamos agora prestes a navio"?
Bob

Respostas:

23

Receba atualizações, não force

À medida que você escala, torna-se inviável fazer atualizações por push de todos os seus produtos.

  • Você precisará rastrear todos os clientes, cada um com uma configuração de firewall diferente.
  • Você precisará criar conexões de entrada através do firewall do cliente, o que exigiria o encaminhamento de porta ou algum outro mecanismo semelhante. Este é um risco de segurança para seus clientes

Em vez disso, solicite aos seus produtos as atualizações periodicamente e, em seguida, você poderá adicionar capacidade extra ao lado do servidor à medida que crescer.

Quão?

Esse problema já foi resolvido, como você sugeriu. Aqui estão várias abordagens em que consigo pensar.

  • using apt : Use o sistema apt interno com um PPA personalizado e uma lista de fontes. Como configuro um PPA?
    • Contras: A menos que você use um serviço de hospedagem pública como a barra de ativação, a configuração do seu próprio sistema de empacotamento PPA + apt não é para os fracos de coração.
  • using ssh : gere uma chave pública SSH para cada produto e adicione a chave desse dispositivo aos seus servidores de atualização. Depois, basta ter o seu software rsync/ scpos arquivos necessários.
    • Contras: É necessário rastrear (e fazer backup!) De todas as chaves públicas de cada produto enviado.
    • Pro : mais seguro que um download bruto, já que os únicos dispositivos que podem acessar as atualizações seriam aqueles com a chave pública instalada.
  • download bruto + verificação de assinatura :

    • Poste um arquivo de atualização assinado em algum lugar (Amazon S3, servidor FTP, etc.)
    • Seu produto verifica periodicamente a alteração do arquivo de atualização e baixa / verifica a assinatura.
    • Contras : dependendo de como você implanta isso, os arquivos podem ser acessíveis ao público (o que pode facilitar seu produto de fazer engenharia reversa e hackear)
  • ansible : O Ansible é uma ótima ferramenta para gerenciar configurações do sistema. Está no reino do fantoche / chef, mas não tem agente (usa python) e foi projetado para ser idempotente. Se a implantação do seu software exigir um script bash complicado, eu usaria uma ferramenta como essa para tornar menos complicado a execução de suas atualizações.

Claro, existem outras maneiras de fazer isso. Mas isso me leva a um ponto importante.

Assine / valide suas atualizações!

Não importa o que você faça, é imperativo que você tenha um mecanismo para garantir que sua atualização não seja adulterada. Um usuário mal-intencionado pode se passar por seu servidor de atualização em qualquer uma das configurações acima. Se você não validar sua atualização, sua caixa será muito mais fácil de invadir e invadir.

Uma boa maneira de fazer isso é assinar seus arquivos de atualização. Você precisará manter um certificado (ou pagar alguém para fazê-lo), mas poderá instalar sua impressão digital em cada um dos seus dispositivos antes de enviá-los para que eles possam rejeitar atualizações que foram adulteradas.

Segurança física

Obviamente, se alguém tiver acesso físico à implantação do cliente, poderá facilmente assumir o controle do servidor. Mas pelo menos eles não podem atacar as outras implantações! A segurança física é provavelmente a responsabilidade do seu cliente.

Por um momento, imagine o que aconteceria se você usasse uma grande rede OpenVPN para atualizações ... Eles poderiam usar o servidor comprometido para atacar todas as instâncias da VPN

Segurança

Faça o que fizer, a segurança precisa ser incorporada desde o início. Não corte cantos aqui - você vai se arrepender no final, se o fizer.

A proteção total deste sistema de atualização está fora do escopo desta publicação, e eu recomendo fortemente a contratação de um consultor se você ou alguém da sua equipe não tiver conhecimento nessa área. Vale cada centavo.

BobTuckerman
fonte
2
Eu recomendaria o uso do Ansible - ele está no meio da complexidade entre os scripts de shell e o gerenciamento completo da configuração do estilo Puppet / Chef e tem a sofisticação para fazer coisas mais complexas do que apenas atualizar o software (como sugerido pela pergunta " gerir").
RichVel
Se você seguir o caminho do uso do Ansible, poderá gravá-lo para rodar em 'localhost' e não exigirá acesso SSH a nenhuma das máquinas que estão sendo gerenciadas. Configure-o para ser um cronjob, e você é de ouro.
BobTuckerman 1/08/16
1
BTW: Se você deseja executar seu próprio servidor de pacotes, fpme aptlyexistem duas ótimas ferramentas que tornam muito mais fácil criar e hospedar seus próprios pacotes. Acabei de passar por esse processo recentemente e foi muito bom.
BobTuckerman
10

Você realmente precisa acessá-los?

Ou apenas atualizá-los? Como você pode fazer com que eles se atualizem, semelhante à forma como o apt é atualizado sem supervisão.

Se você precisar fazer login

Por que não um daemon OpenSSH escutando via encaminhamento de porta? Cada cliente pode ter uma chave separada para segurança e só será conectado quando necessário.

Até seus clientes

Você precisa levar em consideração o que o cliente também está disposto a aceitar. Eles podem não se sentir confortáveis ​​com qualquer acesso remoto à sua rede ou apenas com tecnologias / configurações específicas.

Ryan Babchishin
fonte
4
isto. com 1000 requisitos diferentes de clientes, pelo menos alguns não desejam uma conexão openvpn permanente de volta aos seus escritórios. O ideal é você tentar fazê-los se atualizar, se / como / quando detectam uma nova versão está disponível (a partir de um arquivo em um balde AWS S3, dizer que é o que fazemos..
Sirex
@Sirex - Uma desvantagem do uso de um bucket S3 é que não há uma lista de permissões de IP simples que o cliente possa usar para bloquear esse servidor, para que ele possa alcançar apenas o bucket que contém a atualização. Acabamos tendo que configurar um servidor de atualização com um endereço IP público estático para que os clientes pudessem usar filtros IP para controlar com o que esse servidor pode conversar. (AWS faz publicar todos os seus blocos de IP, por isso é teoricamente possível configurar um filtro que permite o acesso apenas a AWS recursos, mas isso é muito ampla para este caso de uso)
Johnny
Não temos as atualizações no S3, mas temos um arquivo de texto que detalha qual é a versão mais recente - usada pelo aplicativo para fornecer as mensagens de faixa 'atualização disponível'. Os clientes podem acionar (no nosso caso manualmente) o download da versão mais recente, no nosso caso, de um serviço chamado fetchapp.
Sirex
9

Sugiro uma ferramenta de orquestração como Puppet ou Salt .

O salt é uma fila de mensagens e pode fazer uma conexão de saída persistente do seu dispositivo para um servidor mestre. Você pode usar isso para executar comandos arbitrários nos dispositivos ... como um apt-get.

A outra opção é Puppet, onde você ainda possui um servidor mestre e os clientes fazem conexões de saída a partir de seus locais.

Uso essas duas ferramentas para uma finalidade semelhante, onde talvez eu não tenha controle administrativo do firewall.

ewwhite
fonte