É seguro para um servidor de produção ter instalado?

42

Durante a instalação das instâncias do meu servidor virtual, exijo que alguns aplicativos sejam criados usando make. Existe algum risco de segurança associado à makeinstalação? Ou devo limpá-lo antes da implantação da instância?

Eu também tenho o gcccompilador no servidor que eu uso para criar aplicativos antes da implantação.

SK '
fonte
4
Se você se sentir melhor, qualquer software instalado em qualquer lugar cria uma vulnerabilidade.
MDMoore313 16/05
1
E um com non-root acesso shell para um servidor poderia baixar uma "distro independente" pacote de compilador (.tar.gz) que não precisará ser instalado de modo ...
1
Sou eu ou a combinação de "é seguro?" e "acesso root" bastante desconfortável ?
DNA
2
Se você já possui o gcc instalado, praticamente não há como fazê-lo para piorar qualquer problema de segurança em potencial.
Shadur 17/05
1
@Shadur Que diferença faz o GCC? Se o usuário já tiver acesso à máquina, ele poderá enviar qualquer cópia do gcc trivialmente. De qualquer forma, o gcc pode ser útil para usuários sem privilégios e não um risco à segurança, desde que nenhum usuário privilegiado o execute.
Vality 17/05

Respostas:

50

Algumas pessoas argumentam que a presença de ferramentas de desenvolvimento em uma máquina de produção facilitará a vida de um invasor. No entanto, esse é um obstáculo tão pequeno para um invasor, que qualquer outro argumento que você possa encontrar a favor ou contra a instalação das ferramentas de desenvolvimento pesará mais.

Se um invasor foi capaz de penetrar no sistema até o momento, para poder invocar as ferramentas presentes no servidor, você já tem uma violação de segurança grave. Sem ferramentas de desenvolvimento, existem muitas outras maneiras de gravar dados binários em um arquivo e, em seguida, executar um chmod nesse arquivo. Um invasor que deseje usar um executável de compilação personalizado no sistema nesse momento também poderá compilá-lo em sua própria máquina e transferi-lo para o servidor.

Há outras coisas muito mais relevantes a serem observadas. Se um software instalado contiver um bug de segurança, existem algumas maneiras pelas quais ele pode ser exposto a um invasor:

  • O pacote pode conter um executável suid ou sgid.
  • O pacote pode estar iniciando serviços no sistema.
  • O pacote pode instalar scripts que são invocados automaticamente sob certas circunstâncias (isso inclui tarefas cron, mas os scripts podem ser invocados por outros eventos, por exemplo, quando o estado de uma interface de rede é alterado ou quando um usuário efetua login).
  • O pacote pode instalar inodes do dispositivo.

Eu não esperaria que as ferramentas de desenvolvimento correspondessem a uma das opções acima e, como tal, não é um pacote de alto risco.

Se você possui fluxos de trabalho nos quais utilizaria as ferramentas de desenvolvimento, primeiro é necessário decidir se são fluxos de trabalho razoáveis ​​e, se houver, instale as ferramentas de desenvolvimento.

Se você achar que realmente não precisa dessas ferramentas no servidor, evite instalá-las por vários motivos:

  • Economiza espaço em disco, tanto no servidor quanto nos backups.
  • Um software menos instalado facilita o rastreamento de quais são suas dependências.
  • Se você não precisa do pacote, não faz sentido correr o risco adicional de segurança de instalá-lo, mesmo que esse risco seja pequeno.

Se você decidir que, por razões de segurança, não permitirá que usuários sem privilégios coloquem seus próprios executáveis ​​no servidor, o que você deve evitar não são as ferramentas de desenvolvimento, mas os diretórios graváveis ​​para esses usuários em sistemas de arquivos montados com permissões de execução. Ainda pode haver um uso para ferramentas de desenvolvimento, mesmo nessas circunstâncias, mas não é muito provável.

Kasperd
fonte
6
Eu acrescentaria que vários sistemas de produção dependem de código interpretado (por exemplo, PHP, Perl, Python, ...). Proibir ferramentas de desenvolvimento nesse contexto não faria sentido. Eu consideraria que os compiladores gostariam de gccnão apresentar um risco maior do que estes. Como você diz, um invasor em posição de usar os compiladores instalados em um sistema geralmente poderia fazer coisas piores de qualquer maneira, como carregar seu próprio executável (possivelmente vinculado estaticamente).
Bruno
3
Relevante: Uma versão minúscula do wget (51 bytes?) . Um exemplo real de um invasor movendo um binário para o servidor usando echoinstruções subsequentes em um arquivo. Todo o processo é automatizado com um script encontrado no mesmo link.
Adi
2
@ Adnan, interessante. Até onde eu sei, a principal falha de segurança neste exemplo de DVR é o fato de que o invasor pode telnetar para ele como root com a senha 123456 em primeiro lugar. Ter ou não ter o wget ou outras ferramentas (antes do ataque) é pouco relevante.
1155 Bruno Bruno
15

makeé um shell que possui uma sintaxe diferente de bash.

Um compilador como gccé um poderoso awkconfigurado com um conjunto de substituições que o padrão awknão suporta. Não é compatível com POSIX sortou catinjeta lixo na saída. É um editor de texto interativo (pense vi) que está configurado para fazer algumas edições na inicialização e sair antes de exibir a interface do usuário.

Não há nada inerentemente inseguro neles, eles não tornam sua máquina mais insegura do que aquela em que você tem o catredirecionamento do shell bash + +.

ignis
fonte
2
Uma resposta tão zen que não sei como classificá-la.
Kasperd
4
@kasperd Esta resposta pretende ser séria. Eu pensei que trazer o ponto de vista de um programador poderia ser útil. Uma função que converte uma entrada em uma saída não introduz uma vulnerabilidade apenas porque sua saída está em um formato compreensível da CPU.
Ignis
1
Eu concordo com o que você está fazendo. Acho que sua resposta é uma ótima leitura para quem já concorda com ela. Só estou preocupado que sua resposta possa parecer uma piada para alguém que discorda dela.
Kasperd
Eu gosto desta resposta muito mais do que o aceite :)
Ruslan
15

makeem si está bem. makeé apenas uma estrutura de rastreamento e automação de dependência. No entanto, é normalmente usado em conjunto com compiladores, e esses preferencialmente não devem estar disponíveis em um sistema de produção, pois são completamente desnecessários. O mesmo vale para todos os pacotes desnecessários, sejam eles bibliotecas compartilhadas, intérpretes etc. O software instalado nos sistemas de produção deve ser estritamente controlado e apenas os pacotes exigidos pelo aplicativo devem estar presentes.

Você deve criar seu aplicativo em um servidor de compilação, empacotá-lo e, em seguida, implantar o pacote binário em seus sistemas de produção.

Nota: as ferramentas de empacotamento nativas são péssimas . Nem sequer tente incomodá-los. Em vez disso, confira Jordan Sissel's fpm. Faz da embalagem uma alegria absoluta.

EEAA
fonte
8
Estou perguntando por curiosidade e ignorância aqui: Por que você diz que a presença de compiladores é um "problema de segurança significativo"? Qual é o problema de segurança em ter um compilador instalado? É apenas uma questão de você não estar construindo seu código em um servidor de produção e, portanto, o compilador é supérfluo ou existe realmente um problema de segurança significativo com a presença do próprio compilador?
reirab 15/05
11
Embora seja uma boa ideia criar seus aplicativos em um servidor separado, dizer que a presença de compiladores em um sistema de produção é um problema de segurança significativo não faz sentido. E as linguagens de script e os sistemas compilados por JIT (Perl, Python, Java, ...)?
Bruno
3
A presença de compiladores em um ambiente de produção não é um "risco de segurança significativo". Eu mesmo movi binários para caixas comprometidas usando echoe base64. De fato, você pode fazer isso com uma série de echoinstruções e nenhuma outra ferramenta .
Adi
1
Bons pontos, tudo. Eu editei minha resposta para esclarecer.
EEAA
9

Pelo contrário, o problema potencial não está em ter makeno servidor de produção, o problema potencial está em criar os aplicativos no servidor de produção em vez de implantar imagens pré-construídas testadas. Pode haver razões válidas para essa metodologia, mas eu argumentaria contra com veemência se me pedissem para adotá-la.

John
fonte
4

Você está perguntando se makedeve ser instalado em um servidor de produção, mas minha verdadeira pergunta seria: quem tem acesso a esse servidor de produção e quais salvaguardas você possui para lidar com uma incursão? Se makenão foi instalado, mas alguém obtém rootacesso, adivinhe? Eles podem instalar manualmente makee o que quiserem.

A dura realidade sobre a segurança do computador é tanto quanto você deseja impedir o acesso indesejado, sendo obcecado por bloquear o acesso não é tão importante quanto:

  1. Quem tem acesso ao servidor?
  2. O que você pode fazer para reverter as consequências de uma interrupção?

Tudo depende de que tipo de trabalho você faz. Eu trabalho principalmente no mundo dos servidores web e minha atitude é basicamente qualquer pessoa que tenha acesso a servidores de produção precisa provar habilidades, conhecimento e maturidade. É isso aí. Às vezes, leva alguns dias. Às vezes leva meses. Mas, basicamente, sua melhor linha de segurança nos servidores de produção é controlar o acesso, além de outras coisas que fazemos para proteger os servidores.

JakeGould
fonte
1

makeem si é inofensivo. Tudo o que faz é executar aplicativos em uma ordem definida, dependendo das dependências especificadas e de quais arquivos já existem no sistema. Pode até ser útil como parte do processo de instalação: você pode usá-lo para colocar arquivos pré-criados onde eles precisam ir, executar testes de unidade ou outras coisas.

No entanto, você precisa considerar para que exatamente deseja usá-lo. É frequentemente usado em conjunto com compiladores e outras ferramentas para criar aplicativos, e esses podem ser usados ​​para negar algumas de suas linhas de defesa. Mas makenão é possível fazer essas coisas se as ferramentas não estiverem disponíveis.

The Spooniest
fonte