Skip to main content

210.2 Autenticação via PAM


Introdução


Praticamente todos os aplicativos hospedados em um servidor precisam de algum tipo de sistema de autenticação para proteger os dados que estão no servidor.


A ideia mais simples e eficiente para proteger os dados de cada usuário é que cada um consiga fornecer algum tipo de informação para autenticação que seja única para determinado usuário e que nenhum outro usuário consiga adivinhar de forma fácil ou mesmo burlar. Os usos mais comuns para autenticação hoje em dia são: senhas, certificados, chaves virtuais, chaves físicas e até mesmo digitais.


Para resolver esse problema o Linux fornece uma única interface que várias aplicações podem usar. O PAM (Pluggable Authentication Modules) fornece uma interface simples que várias aplicações podem interagir com diferentes bancos de dados para autenticação.


Em resumo, o PAM é um sistema de autenticação de usuários no Linux/Unix que permite que diferentes serviços de autenticação sejam adicionados ou removidos do sistema sem modificar os programas ou aplicativos que os utilizam.


Para autenticar um usuário usando o PAM, é preciso configurar o arquivo de configuração do PAM do serviço que se deseja autenticar e definir os módulos de autenticação a serem usados nesse processo. Geralmente, os módulos de autenticação incluem métodos como senha, chave pública e autenticação Kerberos.


A imagem abaixo fornece um exemplo de como as aplicações interagem com o PAM.


Cada aplicação deve ter uma configuração definindo qual o módulo de autenticação use e como usar ele. Existem dois métodos mais usados para configurar isso, um deles é colocar tudo num único arquivo como /etc/pam.conf e o outro é cada aplicação ter seu próprio arquivo, facilitando a administração e configuração, esses arquivos devem ficar em /etc/pam.d (esse segundo lugar tem prioridade sobre o primeiro, caso tenha a configuração de uma mesma aplicação em ambos).


Veja a estrutura dos arquivo no PAM:

/etc/pam.conf
serviço tipo controle módulo argumentos

/etc/pam.d/exemplo
tipo controle módulo argumentos
  • serviço
    É a aplicação.


  • tipo
    Quais recursos no PAM o serviço vai usar, existem quatro grupos de recursos para usar.

    • account
      Verifica se a conta de usuário pode usar o serviço.

    • auth
      Verifica a autenticidade do usuário por senha, digital, certificado, chave e etc.

    • password
      Serviços de gerenciamento de senhas.

    • session
      Procedimento que deve ser realizado após o login, antes do usuário receber o acesso.

Dica

Uma única aplicação pode ter vários recursos para um método de autenticação, mas cada um precisa estar numa linha diferente.


  • controle
    O que vai acontecer se a autenticação falhar, existem quatro grupos de controle de ação usar.

    • requisite
      Encerra a aplicação em caso de falha.

    • required
      Envia um status de retorno se falhar, mas continua verificando outras regras.

    • sufficient
      Se a regra sufficient passar, o processo de autenticação Para com um status de sucesso e caso exista outra falha não tem problema.

    • optional
      Sucesso ou falha não é relevante, a não ser que seja a única regra definida para o módulo.


  • módulo
    Define o arquivo de biblioteca do PAM (o caminho completo para essa biblioteca pode ser informado) para usar na autenticação.


  • argumentos
    Define quaisquer argumentos de linha de comando adicionais necessários para o módulo funcionar.


Vejamos um exemplo real:

/etc/pam.d/login
session    optional   pam_motd.so motd=/etc/motd

Arquivos PAM são perigosos !

Tenha muito cuidado ao trabalhar com arquivos PAM. Se você excluir o arquivo errado ou modificar a regra errada dentro de um arquivo, poderá bloquear seu próprio sistema.


Recomendo que use uma máquina virtual para testes.


Alguns dos módulos mais usados são:

  • pam_unix.so
    Usar para autenticação junto ao passwd/shadow.

  • pam_limits.so
    Limitação de recursos.

  • pam_ldap.so
    Acesso via LDAP.

  • pam_cracklib.so
    Checagem de senhas fracas.

  • pam_listfile.so
    Uso de arquivos externos para controle.

  • pam_sss.so
    Uso do SSS.

  • pam_krb5.so
    Uso do Kerberos 5 para autenticação.

  • pam_userdb.so
    Uso de Datafiles .db.

  • pam_nologin.so
    Uso do /etc/nologin

  • pam_time.so
    Recurso de controle por horário.

  • pam_console.so
    Controle de acesso ao console por usuário.


Módulos

Os módulos podem estar em alguns diretórios:

  • /lib/security
  • /usr/lib/security

O caminho mais concreto de localização dos módulos em sistemas Debian Like é:

  • /lib/x86_64-linux-gnu/security/

Para RedHat fica em:

  • /usr/lib64/security

Mesmo assim se não achar, pode pesquisar uma das bibliotecas para saber onde está:

$ sudo find / -iname 'pam_unix.so'


LDAP e SSSD


O LDAP (Lightweight Directory Access Protocol) e o SSSD (System Security Services Daemon) são serviços diferentes mas que possuem o mesmo propósito com aplicações diferentes, eles são usados para gerenciar a autenticação e autorização de usuários de forma centralizada. O LDAP é um protocolo de rede padrão que permite que um cliente acesse e gerencie informações armazenadas em um diretório de rede centralizado, como o Active Directory da Microsoft ou o OpenLDAP. Ele fornece um mecanismo para que os aplicativos acessem informações de diretório em uma rede.


O SSSD é um daemon que fornece uma camada de abstração entre aplicativos que precisam de informações de autenticação ou autorização e os serviços de diretório subjacentes, incluindo LDAP, Kerberos e NIS. O SSSD funciona como um cache local para essas informações, melhorando o desempenho ao reduzir o número de consultas de rede necessárias para autenticar e autorizar usuários.

Em resumo, o SSSD usa o LDAP para obter informações do diretório de rede, ele acaba agindo como um cliente do LDAP, e é responsável por fazer consultas ao servidor LDAP para recuperar informações de diretório, como nomes de usuário, senhas e informações de grupo. O SSSD após obter as informações do LDAP, ele armazena em cache as informações de diretório obtidas do servidor LDAP para melhorar o desempenho e reduzir o número de consultas ao servidor LDAP.


As aplicações que precisam autenticar usuários usando um diretório de rede, como o LDAP, geralmente usam o SSSD como uma camada de abstração para simplificar a integração com o diretório de rede. O SSSD fornece uma interface de programação de aplicativos (mais conhecida como API) consistente para essas aplicações, independentemente do serviço de diretório subjacente que está sendo usado.


Existe uma configuração básica no PAM para autenticação via LDAP, podemos ver a seguir:

  1   auth  sufficient  pam_ldap.so
2 auth required pam_unix.so try_first_pass
3 account sufficient pam_ldap.so
4 account required pam_unix.so

try_first_pass = Tenta a senha informada no módulo anterior.
  1. Se a autenticação LDAP passar, der sucesso, não precisa prosseguir com a demais regras (por caus do sufficient).

  2. Se a autenticação via LDAP falhar, tenta fazer a autenticação usando o pam_unix.so, usando a senha fornecida para pam_ldap.so (por causa do do try_first_pass). Se mesmo assim não autenticar, encerra o processo de autenticação (já que é a última regra com auth).

  3. Em caso de sucesso, verifica se a conta tem permissão, usando o LDAP.

  4. A mesma coisa acima, mas para pam_unix.so.



SSSD instalação


Para testar podemos instalar o daemon do SSS (SSSD é o serviço que roda no Linux).


$ sudo apt install sssd -y

Após a instalação, nas versões atuais do pacote, o arquivo /etc/sssd/sssd.conf não existe, mas podemos acessar um arquivo para usar de base, ele fica no caminho /usr/lib/x86_64-linux-gnu/sssd/conf/sssd.conf.


Após copiar o arquivo para o /etc/sssd/sssd.conf, é preciso mudar as permissões para que o serviço possa ser iniciado:

$ sudo chown -R root: /etc/sssd
$ sudo chmod 600 -R /etc/sssd


Fontes importantes


https://kb.isc.org/docs/isc-dhcp-44-manual-pages-dhcpdconf

https://kb.isc.org/docs/isc-dhcp-44-manual-pages-dhcp-options

https://en.wikipedia.org/wiki/Bootstrap_Protocol

https://www.youtube.com/watch?v=A3LFt7CHpgs