O PAM (Pluggable Authentication Modules) é uma boa forma de controlar a autenticação para os diversos programas na plataforma Linux. Este artigo apresenta algumas formas básicas para se limitar as ações dos usuários em um sistema Linux com algumas das configurações disponíveis do PAM. Isto inclui: limitar por quantidade de logins, por horários, limitar se o usuário pode gastar muita memória ou não, entre outros.
1. Por que PAM?
Há muito tempo atrás, coisa de décadas, toda aplicação de um sistema Linux utilizava seus próprios mecanismos de configuração/autenticação. Então cada programa tinha dentro do seu código o mecanismo para, por exemplo, autenticar o usuário olhando no arquivo /etc/passwd. Agora imagine no caso da base de usuários mudar para outro lugar que não seja o /etc/passwd, algo como um servidor de banco de dados ou um LDAP? Ou um NIS? Primeiro: teria-se que descobrir se todas as aplicações suportavam o tipo de armazenamento de contas, segundo: teria que configurar todas as aplicações.
O PAM surgiu como um intermediador entre as aplicações e o mecanismo de autenticação. Todas as aplicações agora têm suporte ao PAM, que tem uma interface de comunicação única. Então quando quisermos fazer qualquer modificação de onde autenticar, basta apenas modificar a configuração do PAM e todo o resto das aplicações já estará configurada automaticamente. Muito mais prático.
Por se tornar o intermediário, o PAM também pode conter outras coisas que não fazem parte da “autenticação” dos usuários. Ele pode ter outros “módulos” que fazem tarefas quando um usuário é logado, ou não. Por exemplo, o módulo pam_mkhomedir pode criar um diretório HOME automaticamente se o usuário logado não tiver um HOME no sistema. O módulo pam_wheel pode ser usado para verificar se um usuário pertence ao grupo wheel ou não e permitir que ele se torne root sem precisar de senha. Cada módulo faz uma coisa, e esses módulos podem ser encontrados no diretório /lib/security (Ou /lib64/security em sistemas 64-bits).
2. Limitação dos usuários
Sabendo que cada módulo pode ser responsável por algum tipo de recurso para os logins no PAM, vamos trabalhar alguns módulos que produzem limitações aos usuários no sistema. Estes módulos são: pam_limits, para limites dentro de uma sessão; e pam_time para restrição de logins em certos períodos.
2.1. Configuração Inicial
Para que tanto o pam_limits, quanto o pam_time funcionem, eles precisam estar habilitados na sua distribuição e configuração do PAM. Geralmente o pam_limits já vem por padrão na grande maioria das distribuições, mas o pam_time nunca vem habilitado por padrão.
A configuração do PAM não é tão simples assim como a gente gostaria que fosse, então vou explicar aqui apenas o básico para aprendermos à habilitar as funcionalidades que queremos.
Todas as configurações do PAM estão contidas no diretório /etc/pam.d. Dentro deste diretório, cada arquivo representa o que um programa vai utilizar de mecanismo PAM. Por exemplo, o arquivo /etc/pam.d/su vai ser utilizado pelo programa su para saber como ele vai autenticar os usuários.
Para facilitar um pouco a vida dos usuários, as distribuições unificam as configurações comuns em apenas alguns arquivos. Em sistemas baseados em Red Hat EL / Fedora, este arquivo será o /etc/pam.d/system-auth, enquanto que em sistemas baseados em Debian, são 4 arquivos: common-account, common-auth, common-password e common-session, todos dentro do diretório /etc/pam.d.
Vamos aos exemplos, em um sistema Fedora, no system-auth vai ter a linha:
session required /lib/security/pam_limits.so
O que significa que o pam_limits já está sendo carregado cada vez que o usuário inicie uma sessão. Para habilitar o pam_time, precisamos adicionar uma linha:
account requisite /lib/security/pam_time.so account required /lib/security/pam_unix.so
A segunda linha (pam_unix) já existia. A primeira linha habilita o pam_time, ou em outras palavras, torna a execução do pam_time obrigatória na hora que o usuário for acessar a conta (antes de se logar).
Agora em um sistema Debian, pode-se colocar as duas linhas (do pam_limits e do pam_time) nos arquivos common-session e common-account respectivamente, que isso irá se aplicar para tudo que utiliza o PAM, assim como fizemos com o system-auth no Fedora. Ou você também pode utilizar o arquivo /etc/pam.d/login, que é responsável pelos logins locais no sistema.
Dentro do /etc/pam.d/login no Debian você já poderá encontrar várias linhas pré-definidas e comentadas. Se procurar pelo pam_limits, vai ver que a linha:
session required pam_limits.so
Está lá. Se procurar pelo pam_time, vai ver que a linha está comentada:
# account requisite pam_time.so
Então para habilitar basta descomentar e salvar o arquivo.
Com estas duas linhas configuradas no PAM, os limites para os usuários já podem ser configurados!
3. Limitando por Hora
Habilitado o pam_time, podemos configurá-lo através do arquivo /etc/security/time.conf. Dentro deste arquivo, cada linha vai ser uma restrição para os usuários. Como o próprio arquivo diz, a sintaxe das linhas é:
serviços;ttys;usuários;horas
Sendo que:
- serviços significa o nome do serviço PAM para se restringido. Exemplos: samba, su, login. Use * para restringir para tudo.
- ttys significa em quais terminais a restrição será feita. Exemplo: terminais locais seriam tty*. Use * para restringir para tudo.
- usuários significa uma lista dos usuários para a restrição. Múltiplos usuários podem ser feitos com: “fulano|cicrano|beltrano” que significa fulano OU cicrano OU beltrano. O * também pode ser utilizado para restringir a todos.
- horas é a faixa de horas e datas para a restrição. Melhor entendendido nos exemplos.
Para aprender melhor, vamos aos exemplos:
sshd:*:teste:Mo2100-2200
Na linha acima, o usuário teste só poderá acessar o sshd das 21:00 até as 22:00 na Segunda-Feira. A linha:
sshd:*:teste:!Mo2100-2200
O usuário teste poderá acessar o sshd toda hora, exceto Segunda-Feira das 21:00 até as 22:00. A exclamação inverteu totalmente o caso.
No campo da faixa de tempo, podemos usar as abreviações:
- Su: Domingo
- Mo: Segunda
- Tu: Terça
- We: Quarta
- Th: Quinta
- Fr: Sexta
- Sa: Sábado
- Wk: Finais de semana (Sábado e Domingo)
- Wd: Dias da semana (Segunda à Sexta)
- Al: Todos os dias
E como horários, basta usar faixas de horas como 2100-2200 (21 horas até 22 horas), ou 1732-1915 (17:32 até as 19:15).
Mais exemplos:
sshd:*:hugo:Wd0800-1800
O usuário hugo só poderá acessar o sshd em horário comercial, ou seja, de Segunda à Sexta das 08:00 da manhã até as 18:00.
*:*:silvia|lisa:!Al1200-1800
As usuárias silvia e lisa não vão poder acessar nada durante todos os dias, das 12:00 às 18:00.
samba:*:guest:We1200-1201
O usuário guest só vai poder acessar o serviço PAM samba na quarta-feira das 12:00 as 12:01! Boa sorte pra ele!
Lembre-se, a partir do momento que você salva o arquivo de configuração time.conf as configurações já estarão funcionando.
4. Limitando recursos
Agora é a vez do pam_limits. O arquivo de configuração do pam_limits é o /etc/security/limits.conf. Dentro dele, as linhas serão configuradas da seguinte forma:
usuario/grupo tipo de limite recurso valor do limite
Em usuário/grupo, podemos colocar um * para especificar todos os usuários, colocar um nome de usuário qualquer ou um nome de grupo, começando com @.
No tipo de limite, existem dois tipos possíveis: soft e hard. Quando o limite do tipo soft é chegado, o sistema avisa que chegou no limite mas não restringe nada. Se o limite for do tipo hard, o sistema simplesmente restringe o recurso e não deixa passar dalí. O soft então serve apenas para um “aviso” amigável, então na dúvida o hard é quem manda!
O recurso e o valor do limite são os importantes aqui. Alguns dos recursos:
- core – Limite do tamanho do arquivo coredump (em KB). É a mesma configuração que obtemos com o comando “ulimit -c” da shell.
- data – Tamanho máximo de segmento de dados que um programa pode usar. Também como: ulimit -d no bash.
- fsize – Tamanho máximo de algum arquivo que o usuário possa criar. Também: ulimit -f.
- memlock – Tamanho de memória alocada que os programas podem usar (em KB). Também: ulimit -l.
- nofiles – Número máximo de arquivos abertos ao mesmo tempo. Também: ulimit -n.
- rss – Tamanho máximo de memória compatilhada (em KB). Também: ulimit -m.
- stack – Valor máximo de um processo executado (em KB). Também: ulimit -s.
- cpu – Tempo máximo em minutos de uso da CPU. Também: ulimit -t.
- nproc – Número máximo de processos executados ao mesmo tempo. Também: ulimit -u.
- as – Limite em KB de espaço de endereçamento.
- maxlogins – Número máximo de logins para esse usuário
- maxsyslogins – Número máximo de logins no sistema
- priority – Em qual prioridade padrão os processos desse usuário devem rodar.
- locks – Número máximo de arquivos de locks que podem ser gerados pelo usuário. Também: ulimit -x.
- nice – Número máximo de prioridade que o usuário pode setar, entre -20 (máxima prioridade) e 19 (mínima prioridade). Também: ulimit -e.
Agora vamos entender melhor com os exemplos:
teste hard fsize 100
O usuário teste não pode criar arquivos maiores que 100KB (fsize 100). Testando:
$ dd if=/dev/zero of=arquivo bs=1024 count=100 100+0 records in 100+0 records out 102400 bytes (102 kB) copied, 0.0011873 s, 86.2 MB/s
Ele deixou criar um arquivo de 100KB. Agora vou criar um de 105!
$ dd if=/dev/zero of=arquivo bs=1024 count=105 File size limit exceeded
Outro exemplo:
teste hard nproc 5
O usuário teste só poderá executar 5 processos. Tenha em mente que os processos do bash por exemplo também contam. Então colocar 1 não é uma boa idéia assim se seu usuário tiver executando uma shell interativa.
@teste hard maxlogins 1
Todo mundo do grupo teste só pode se logar uma vez no sistema.
dumau hard memlock 20000
O usuário dumau só pode usar 20MB de memória no sistema.
@users hard priority 19
Todos os usuários do grupo users vão executar seus processos automaticamente com prioridade mais baixa do sistema.
4.1. Boas práticas de limites de recursos
Para ter um sistema um pouco mais seguro se você tiver muitos acessos externos, imponha limites tais como:
- memlock: Coloque um número legal para os programas de shell funcionarem bem, mas não um número tão alto, assim seus usuários não vão conseguir acabar com toda a memória do seu sistema.
- nproc: Coloque um número mediano, para que seus usuários possam executar todas suas ferramentas shell mas não consigam, por exemplo, fazer um fork bomb e explodir sua máquina abrindo processos infinitamente.
- fsize: Coloque um número consideravelmente inferior ao tamanho do seu HD/sistema de arquivos.
5. Conclusão
Com o PAM podemos ter um controle maior sobre o que os usuários fazem dentro de um sistema. Em servidores, por exemplo, isso é mais do que essencial!
Se aparecer qualquer outro exemplo, não deixe de me contactar para que eu adicione no artigo.