Linux-PAM: Como Funciona – pam_limits

Voltando aos posts sobre o Linux-PAM, dessa vez iremos configurar um outro módulo da máquina chamado pam_limits.so, que é responsável por limitar recursos da máquina para determinados usuários. O conhecimento desse módulo é extremamente útil quando se está trabalhando com serviços que costumam comer bastante recursos, como o Zimbra ou o Oracle WebLogic.

pam_limits.so – O que é?

O pam_limits.so nada mais é que um módulo do Linux-PAM que serve para limitar recursos da máquina para determinados usuários ou grupos. Isso foi feito como uma medida de impedir que um determinado serviço derrube o servidor ao criar diversos processos, ou abrir diversos arquivos, dar renice para aumentar o tempo de CPU de seu processo em detrimento do resto, tamanho de arquivos que pode criar, o máximo de memória que pode consumir, entre outros fatores. Isso é extremamente importante, e até mesmo vital, quando trabalhamos com serviços como o Docker ou o WebLogic.

A melhor maneira de compreender como o pam_limits funciona é vendo na prática um ambiente sem ele configurado e com ele configurado. Para isso iremos executar o modelo de ataque de negação de serviço mais clássico que existe: o Fork Bomb. Para quem não conhece, o Fork Bomb é um tipo de Ataque de Negação de Serviço (DoS), aonde um processo se multiplica exponencialmente (um processo vira dois, dois viram quatro, quatro viram oito, e assim por diante) até o ponto em que a máquina para de responder devido a fila de processos para a CPU atender está longa demais. Por conta desse comportamento foi dado os apelidos de Rabbit Vírus (Vírus do Coelho), ou Wabbit (Toelho) da frase do Elmer Fudd “You wascawwy wabbit!” (Seu toelho miserável).

Para criar nosso vírus, basta digitar todo o conteúdo da imagem do início do post no seu terminal e dar enter. Irei criar um post futuro aonde eu explico um pouco de Shell Script, porém para a explicação abaixo será necessário um pouco de conhecimento de Shell Script antes:

:(){
    : | : &
}; 
:

Basicamente eu criei uma função chamada “:” e que ela faz nada mais do que chamar a sí mesma e passar a saída de seu comando para sí mesma através do pipeline (|), tudo isso em background (&). Ao executar o comando acima você terá em torno de alguns milésimos de segundos para se arrepender antes da máquina parar de responder. A queda é instantânea.

Configurando o pam_limits.so

O pam_limits.so já encontra-se ativo no ambiente, sendo necessário somente configurar um limite para cada usuário do sistema. Os limites que podemos impor aos usuários são:

  • core – limita o tamanho do arquivo core (KB)
  • data – tamanho máximo de dados (KB)
  • fsize – Tamanho máximo de arquivo (KB)
  • memlock – Espaço máximo de endereços bloqueados na memória (KB)
  • nofile – Número máximo de arquivos abertos
  • rss – Tamanho máximo dos programas residentes (KB)
  • stack – Tamanho máximo de pilha (KB)
  • cpu – Tempo máximo usado na CPU (MIN)
  • nproc – Número máximo de processos
  • as – Limite de espaço de endereços
  • maxlogins – Número máximo de logins deste usuário
  • priority – Prioridade que os programas deste usuário serão executados

Para ativar algum desses limites, deve ser aberto o arquivo /etc/security/limits.conf e alterado o conteúdo dentro dele informando os valores na seguinte ordem:

USUARIO/@GRUPO      TIPO       LIMITE     VALOR

O campo usuario/@grupo é aonde você informa quem será afetado pelo determinado limite. Pode ser informado o login de um usuário, um grupo usando o símbolo de @ no começo do nome (@wheel por exemplo), ou um asterisco para informar que todo mundo será afetado pelo limite.

O campo tipo serve para informar qual é o tipo de limite que pretendemos impor, se será um limite SOFT, ou seja: um limite inicial para o quanto o usuário pode usar de determinado recurso, porém que o mesmo poderá solicitar mais recursos contanto que não seja superior ao valor HARD, e o HARD que é o limite máximo que o usuário pode requisitar de determinado recurso.

Iremos configurar nesse exemplo o limite do nproc como 200 o SOFT e 300 o HARD, assim solucionando para sempre o problema do vírus Wabbit, na qual foi apresentado anteriormente.

# vim /etc/security/limits.conf
*    SOFT   NPROC  200
*    HARD   NPROC  300

Usamos o símbolo de * para informar que todos os usuários sejam afetados por esse limite de recurso. Lembrando somente que o usuário root não pode ser limitado de recursos, assim reforçando o porque cada serviço do sistema operacional precisa ser executado com um usuário específico, e não como root.

Feito isso basta reiniciar o sistema operacional que todos os serviços quando voltarem estarão com o novo limite ativo. Para validar, basta rodar novamente o nosso vírus com um usuário comum e ver que após 200 processos o mesmo irá deixar de executar e o nosso sistema não irá ter mais problemas de lentidão.

$ :(){ : | : & }; :

Tente brincar com os demais limites disponíveis e veja qual é o comportamento do sistema operacional em caso de atingir qualquer um deles. Para encerrar esse post, caso seja necessário aumentar um pouco o limite de algum dos impostos pelo pam_limits.so basta executar o comando ulimit, informando o limite que quer aumentar (não precisa ser root contanto que não passe do valor HARD):

$ ulimit -u 300

Para saber qual é o comando correto para cada um dos limites do arquivo limits.conf, utilize as páginas do man do comando que irá listar todas as opções disponíveis para você. Algumas das disponíveis são:

  • -a: Lista todos os limites disponíveis no momento e seus valores;
  • -c: Tamanho máximo dos arquivos core;
  • -d: Tamanho máximo de um segmento de processo;
  • -e: O máximo de prioridade que você pode colocar num processo;
  • -f: Tamanho máximo que um arquivo do Shell e seus filhos podem criar;
  • -i: Número máximo de sinais pendentes;
  • -l: Tamanho máximo que pode ser alocado na memória;
  • -n: Número máximo de descritores de arquivo abertos;
  • -q: Tamanho máximo que uma mensagem pode ter numa fila POSIX;
  • -u: O número máximo de processos abertos por usuário;

Abaixo segue alguns links usados para criação desse post, caso queira saber mais sobre como utilizar o pam_limits.so:

  • https://pt.wikibooks.org/wiki/Guia_do_Linux/Iniciante%2BIntermedi%C3%A1rio/Principais_arquivos_de_configura%C3%A7%C3%A3o_do_diret%C3%B3rio_/etc/Arquivo_/etc/security/limits.conf
  • https://www.networkworld.com/article/2693414/operating-systems/setting-limits-with-ulimit.html
  • http://catb.org/~esr/jargon/html/W/wabbit.html

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *