CGroups
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Grupos de Controle do Linux, ou cgroups, são um recurso do kernel Linux que permite a alocação, limitação e priorização de recursos do sistema, como CPU, memória e I/O de disco entre grupos de processos. Eles oferecem um mecanismo para gerenciar e isolar o uso de recursos de coleções de processos, benéfico para fins como limitação de recursos, isolamento de carga de trabalho e priorização de recursos entre diferentes grupos de processos.
Existem duas versões de cgroups: versão 1 e versão 2. Ambas podem ser usadas simultaneamente em um sistema. A principal distinção é que a versão 2 dos cgroups introduz uma estrutura hierárquica, em forma de árvore, permitindo uma distribuição de recursos mais sutil e detalhada entre grupos de processos. Além disso, a versão 2 traz várias melhorias, incluindo:
Além da nova organização hierárquica, a versão 2 dos cgroups também introduziu várias outras mudanças e melhorias, como suporte para novos controladores de recursos, melhor suporte para aplicativos legados e desempenho aprimorado.
No geral, os cgroups versão 2 oferecem mais recursos e melhor desempenho do que a versão 1, mas esta última ainda pode ser usada em certos cenários onde a compatibilidade com sistemas mais antigos é uma preocupação.
Você pode listar os cgroups v1 e v2 para qualquer processo olhando para seu arquivo de cgroup em /proc/<pid>. Você pode começar olhando para os cgroups do seu shell com este comando:
A estrutura de saída é a seguinte:
Números 2–12: cgroups v1, com cada linha representando um cgroup diferente. Os controladores para estes são especificados adjacentes ao número.
Número 1: Também cgroups v1, mas exclusivamente para fins de gerenciamento (definido por, por exemplo, systemd), e não possui um controlador.
Número 0: Representa cgroups v2. Nenhum controlador é listado, e esta linha é exclusiva em sistemas que executam apenas cgroups v2.
Os nomes são hierárquicos, assemelhando-se a caminhos de arquivos, indicando a estrutura e a relação entre diferentes cgroups.
Nomes como /user.slice ou /system.slice especificam a categorização de cgroups, com user.slice tipicamente para sessões de login gerenciadas pelo systemd e system.slice para serviços do sistema.
O sistema de arquivos é tipicamente utilizado para acessar cgroups, divergindo da interface de chamada de sistema Unix tradicionalmente usada para interações com o kernel. Para investigar a configuração de cgroup de um shell, deve-se examinar o arquivo /proc/self/cgroup, que revela o cgroup do shell. Em seguida, ao navegar até o diretório /sys/fs/cgroup (ou /sys/fs/cgroup/unified
) e localizar um diretório que compartilhe o nome do cgroup, pode-se observar várias configurações e informações de uso de recursos pertinentes ao cgroup.
Os principais arquivos de interface para cgroups são prefixados com cgroup. O arquivo cgroup.procs, que pode ser visualizado com comandos padrão como cat, lista os processos dentro do cgroup. Outro arquivo, cgroup.threads, inclui informações sobre threads.
Cgroups que gerenciam shells tipicamente abrangem dois controladores que regulam o uso de memória e a contagem de processos. Para interagir com um controlador, arquivos com o prefixo do controlador devem ser consultados. Por exemplo, pids.current seria referenciado para determinar a contagem de threads no cgroup.
A indicação de max em um valor sugere a ausência de um limite específico para o cgroup. No entanto, devido à natureza hierárquica dos cgroups, limites podem ser impostos por um cgroup em um nível inferior na hierarquia de diretórios.
Os processos são atribuídos a cgroups por escrever seu ID de Processo (PID) no arquivo cgroup.procs
. Isso requer privilégios de root. Por exemplo, para adicionar um processo:
Da mesma forma, modificar atributos de cgroup, como definir um limite de PID, é feito escrevendo o valor desejado no arquivo relevante. Para definir um máximo de 3.000 PIDs para um cgroup:
Criar novos cgroups envolve fazer um novo subdiretório dentro da hierarquia de cgroup, o que faz com que o kernel gere automaticamente os arquivos de interface necessários. Embora cgroups sem processos ativos possam ser removidos com rmdir
, esteja ciente de certas restrições:
Os processos só podem ser colocados em cgroups folha (ou seja, os mais aninhados em uma hierarquia).
Um cgroup não pode possuir um controlador ausente em seu pai.
Controladores para cgroups filhos devem ser declarados explicitamente no arquivo cgroup.subtree_control
. Por exemplo, para habilitar os controladores de CPU e PID em um cgroup filho:
O root cgroup é uma exceção a essas regras, permitindo a colocação direta de processos. Isso pode ser usado para remover processos da gestão do systemd.
Monitorar o uso da CPU dentro de um cgroup é possível através do arquivo cpu.stat
, exibindo o tempo total de CPU consumido, útil para rastrear o uso entre os subprocessos de um serviço:
Livro: Como o Linux Funciona, 3ª Edição: O Que Todo Superusuário Deve Saber Por Brian Ward
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)