Posso definir um limite de recurso para a árvore de processos atual?

6

Digamos que estou executando em um sistema com recursos restritos e quero garantir que os aplicativos que eu executo abram no máximo 10 arquivos total .

Se eu tentar fazer isso usando setrlimit , algo como:

if (fork() == 0) {
    struct rlimit l = { 10, 10 };
    setrlimit(RLIMIT_NPROC, &l);
    execl(EVIL_PROGRAM, args);
}

então EVIL_PROGRAM herdará o limite de 10 descritores de arquivos abertos. No entanto, o que impediria que um aplicativo mal-intencionado / mal codificado gerasse processos filhos X, todos com 10 arquivos abertos? (Este é um cenário da vida real).

Eu não quero impedir que ele crie processos filhos inteiramente (isso deve ser governado pelo global limits.conf ), apenas para definir um limite razoável no número de arquivos abertos.

Eu encontrei referências ao uso de cgroups para este propósito, mas eu acho que você tem que ser root para usar este recurso?

    
por Mihai 04.01.2016 / 13:36

1 resposta

3

Especificamente para setrlimit

Aqui estão algumas das opções de comando mais úteis que você pode querer examinar; puxou-os das páginas man .

  • RLIMIT_NOFILE Specifies a value one greater than the maximum file descriptor number that can be opened by this process.

  • RLIMIT_NPROC The maximum number of processes (or, more precisely on Linux, threads) that can be created for the real user ID of the calling process. Upon encountering this limit

  • RLIMIT_SIGPENDING Specifies the limit on the number of signals that may be queued for the real user ID of the calling process. Both standard and real-time signals are counted for the purpose of checking this limit.

Também parece haver outras limitações muito legais que podem ser configuradas, então estou agradecido por ter encontrado sua pergunta, pois ela me mostrou outra ferramenta para manter os processos sob controle.

Geral Unix / Linux

Acredito que o termo geral da ferramenta de limitação de aplicativos que você está procurando seja chamado de Sandbox para UNIX. Contratante e Passenger são opções sólidas e para o Linux eu vi Docker , KVM & Firejail usado em sistemas tão restritos quanto os netbooks Raspberry Pi B + v2 ou dule core. Para a maior parte da ação de Sandboxing, você precisará de um sistema e um Kernel de virtualização. Em sistemas como o Android eu vi Selinux usado nas últimas ROMs do CyonagenMod, um pouco frustrante para se locomover se você quiser usar um aplicativo chroot ... mas eu divago, em alguns sistemas que executei o Ubuntu I ' Corremos em Apparmor erros quando um programa recém-instalado tenta telefone home com uma conexão persistente. Basta dizer que há várias opções para controlar o que um programa ou conjunto específico de programas pode fazer, ver e com o qual e / ou se comunicar, e quanto da CPU & Os recursos da GPU podem ser usados.

O melhor de todos, se você conseguir que ele funcione (meio que duvidoso como eu ainda estou trabalhando com o Dev. para que os binários ARMhf funcionem), para o seu cenário de uso, seria Firejail como o guia hospedado no Dev. home page abrange um equipamento de jogos duplos que pode ser modificado para atender às suas necessidades. Ele tem uma baixa impressão de pé de memória em comparação com os outros mencionados (pelo que eu vi que é) e é altamente configurável a quais arquivos um processo tem acesso e se a persistência é permitida ou não. Isso seria bom para testes, já que você teria um ambiente de trabalho definido que é repetível, personalizável e, em última análise, deletável, se necessário.

Para sistemas sem suporte completo à virtualização, observei que o selinux costuma ser usado para definir regras mais rígidas sobre as configurações de permissão user / group que já estão em vigor para manter a leitura & permissões de gravação. O termo para procurar lá é Linux name space permissions , acontece que há muitas maneiras escondidas de restringir ações, mas o maior buraco para todas essas opções é root mesmo em um chroot jail bem construído, se existem maneiras de obter permissões de root dentro de uma cadeia ou sandbox, então há maneiras de escalar para o ID do usuário que está executando o processo preso.

Basicamente, deve haver várias camadas para um processo ter que ser quebrado, ou seja, para um servidor da Web. Estarei configurando um conjunto restritivo de regras de firewall, registrarei os leitores para adicionar regras dinamicamente e altere as configurações de firewall ações e scripts personalizados), então uma cadeia chroot que só tem o requerido depende de um servidor web em sua estrutura de diretórios ligada a uma porta acima de 1024 de tal forma que ele nem sequer solicita permissões de nível raiz para enlace de socket, sandbox virtualizado (provavelmente com Firejail), que tem um host executando mesures de detecção de penetração como tripwire e honeyd dentro de suas respectivas cadeias. Tudo para que, se .php e código similar que não deve ser modificado no servidor público, receber um bad-touch , ele seja ignorado, back-ips seja restaurado e o infrator seja associado a um futuro acesso.

Em seu código de exemplo, não parece que você está fazendo muito com a rede, mas é mais do que provável que ele seja chamado por outro script ou função e porque, obviamente, está chamando processos filhos para descobrir como para limpar a entrada e captar erros em cada etapa (procure o link que matou o navegador Chrome para saber por quê) e garanta que a entrada não-analisada não seja lida ou interpretada por um usuário privilegiado (veja como adicionar shell-shock ao navegador do Firefox Por exemplo, e se houver rede envolvida com a chamada ou retorno de saída, as portas às quais o processo está vinculado devem estar em uma porta não privilegiada (use iptables / firewall para encaminhamento se for um tipo de aplicativo da Web). Embora exista uma infinidade de opções para bloquear os serviços de um sistema a considerar, também parece haver muitas opções para testar a capacidade de quebra do código; Metasploit e drone.io são duas opções de teste de código e pentesting bastante conhecidas que você pode querer examinar antes que alguém o faça por você.

    
por 13.01.2016 / 11:00