Falando sobre o PAM (Pluggable Authentication Modules)

Tempo de leitura: 10 minutos

O PAM ( Pluggable Authentication Modules ),  é  um conjunto de bibliotecas compartilhadas responsável  pela autenticação de usuários, podendo ser usado por diversos sistemas. O PAM fornece autenticação através de vários métodos, atuando como um mediador entre as aplicações e a maneira como é feito a autenticação.

Dessa forma não é a aplicação que irá ser responsável, ou até preocupar-se com a autenticação, está tarefa é totalmente do PAM.

As principais configurações do PAM ficam no diretório /etc/pam.d e no diretório /etc/pam.conf. Os programas ou serviços  podem  tanto ser configurados individualmente dentro do diretório /etc/pam.d, como por exemplo  o gdm, que trará a autenticação para o aplicativo gdm ( gnome display manager ), como também poderá ser configurado diretamente no arquivo /etc/pam.conf. O mais comum é termos os serviço individuais.

No caso do diretório cada arquivo dentro do diretório possuirá o mesmo nome do aplicativo ou serviço ao qual ele controla.

Então resumidamente, quando ocorre um autenticação, a biblioteca principal do PAM verifica qual será o módulo PAM à ser utilizado nos arquivo de configuração. Uma vez descoberto qual forma de autenticação, tal solicitação é enviado para este módulo que faz ou não a autenticação retornando para biblioteca que por sua vez para aplicação.

Módulos do PAM

Os programas do PAM utilizam-se de módulos do PAM ( módulos de autenticação) e são utilizados em tempo de execução. No próprio arquivo de configuração seja no pam.conf ou no diretório /etc/pam.d, devemos informar qual módulo será utilizado para autenticação, ou outro fim que seja necessário.

Estes módulos normalmente estão localizados em /lib/security.

Os módulos do PAM são classificados por tipo de módulo. Qualquer módulo existente deverá implementar uma das funções abaixo :

  • Módulo de autenticação ( auth ) , é utilizado para autenticar usuários, ou configurar e cancelar credenciais.
  • Módulo de gerenciamento de conta (account), executa ações que têm relação com o acesso, à expiração da conta,  restrições  e regras de senha.
  • Módulo de gerenciamento de sessão (session ), utilizado para iniciar e finalizar uma sessão.
  • Módulo de gerenciamento de senha (passwd ), executa ações a alteração e atualização de senha.

 

Promocao-Firewall

Abaixo alguns dos módulos utilizados:

  • pam _unix fornece autenticação de senha no método tradicional usando o passwd.
  • pam_cracklib verifica a senha em relação as regras para senhas.
  • pam_limits Configura  o limite de recursos que podem ser obtidos em uma sessão.
  • pam_listfile Este módulo implementa uma forma de liberar ou negar acesso a um aplicativo através de arquivo contendo a relação de usuários.
  • pam_deny Bloqueia accesso. Ele negará acesso a outros módulos.
  • pam_debug Usado para depurar o PAM.
  • pam_echo Exibe mensagens.
  • pam_exec Executa um comando externo.
  • pam_ftp Módulo utilizado para acesso anônimo via FTP.
  • pam_locauser requer que o usuário seja listado no passwd.
  • pam_access É utilizado principalmente para o gerenciamento de acesso .
  • pam_env Permitir criar ou remover variáveis de ambiente.
  • pam_time                   Controla horário de logon

Configuração do PAM

A configuração do PAM como dito anteriormente baseia-se no arquivo /etc/pam.conf ou no diretório /etc/pam.d.

A estrutura do arquivo de configuração utilizando tem o seguinte formato:

 

serviço tipo_de_modulo tipo_de_controle modulo argumentos_do_modulo

 

Ou no caso de criar-se um arquivo no diretório pam.d, segue o seguinte formato.

 

tipo_de_modulo tipo_de_controle modulo argumentos_do_modulo

 

Neste segundo caso, o serviço é o próprio nome do arquivo.

Então os campos significam:

  • serviço             Especifica o nome do serviço ou aplicativo , o padrão é OTHER.
  • tipo_de_modulo Especifica o tipo de modulo, entre os vistos anteriormente ( auth, account,session e passwd ), como autenticação, gerenciamento de conta, gerenciamento de sessão e gerenciamento de senha para o serviço especificando no campo anterior.
  • tipo_de_controle Especifica o comportamento do módulo. Valores possíveis são requise, sufficent, required e optional. Veja a seguir o significado de cada um.
  • modulo                         Especifica o modulo e se for o caso o path completo. Normalmente os módulos ficam em /lib/security, que já é o padrão de path. De forma que não é necessário especificar seu caminho.
  • Argumentos             Campo opcional, que especifica argumentos próprios de cada módulo.

Quanto ao valores possíveis para o tipo de controle podemos ter as seguintes ações:

  • requisite O resultado do módulo deve ser bem sucedido para que a autenticação continue.  O usuário é informado imediatamente da falha de autenticação
  • required             O resultado do módulo deve ser bem sucedido para que a autenticação continue. Mas o usuário não é informado, até que todos os testes de todos os módulos, que façam referencia àquela interface estejam completos.
  • sufficient O resultado do módulo é ignorado se falhar. Entretanto, se o resultado de um módulo sinalizado como sufficient é de sucesso e nenhum módulo prévio sinalizado como required falhou, então nenhum outro resultado é necessário e o usuário é autenticado ao servidor.
  • optional             O resultado do módulo é ignorado. Um módulo sinalizado como optional torna-se necessário à autenticação bem sucedida apenas quando nenhum outro módulo faz referência à interface.

 

Vamos ver alguns exemplos agora. Digamos que um usuário está tentando usar uma aplicativo qualquer chamado access, e visualizando em /etc/pam.d, este arquivo não existe, ou seja, não existe um configuração própria para esse arquivo.

O pam por sua vez procurará um arquivo chamado other, que será usado sempre que não existir um arquivo próprio para o serviço. Vamos dar uma olhada neste arquivo.

 

@include common-auth

@include common-account

@include common-password

@include common-session

 

Podemos ver que neste arquivo só temos referencia para outros arquivos, que serão responsável por gerenciar todos os aspectos, de logon, acesso , senha, sessão , etc.

Vejamos o arquivo common-auth:

 

auth required  pam_unix.so nullok_securo

 

O que nos diz essa linha ?

Ele está utilizando um módulo do tipo autenticação, que diz ser requerida, ou seja, ele tentará verificar o sucesso para autenticação continuar, e usará o modulo PAM pam_unix.so, que é uma módulo utilizado para autenticação padrão, do tipo usando o arquivo passwd. Mas ele ainda possui um argumento adicional, o valor nullok_secure.

            Está opção nullok_secure, foi adicionada posterirmente ao PAM, para suportar passwd Unix curtas, em determinados terminais , listados em /etc/securetty. Está opção foi adicionada pois a opção nullok, que aceita senhas em branco foi considerado inadequada para configurar todos serviços.

Existem muitas opções para o módulo pam_unix.so. Vejamos algumas :

  • nullok Permite senhas em branco
  • try_first_pass Está opção diz ao pam_unix, usar uma senha informada anteriormente antes de pedir a senha, por exemplo, se houver um linha referente a logon no ldap. Ele tentará utilizar a mesma senha tanto para o sistema anterior como para o próprio pam_unix.
  • use_first_pass Este item força o módulo a usar a senha utilizada no módulo anterior e nunca perguntar uma nova senha para o usuário.

Existem muitas outras, que podem ser consultada em http://www.kernel.org/pub/linux/libs/pam .

No arquivo common-account, que é o módulo gerenciador responsável  pelo gerenciamento da conta, estará utilizando o shadow, para verificar restrições, como senha expirada, desabilitada entre outras. Será responsável por verificar se a conta do usuário esta ativa.

 

auth required  pam_unix.so 

 

O próximo arquivo é o common-passwd, vejamos abaixo :

 

password   required   pam_unix.so nullok obscure md5

 

Este módulo é responsável por gerenciar ações relacionadas a troca de senha. Podemos ver as seguintes opções:

  • nullok O padrão do módulo pam_unix, não permite acesso ao serviço se o usuário tem um senha em branco ( é o default ). Com está opção o módulo permitirá senhas em branco.
  • Obscure Está opção habilita algumas verificações adicionais quando da troca da senha, como por exemplo:
    • Palindrome Verifica se a senha não é o reverso da anterior
    • Case Change Only Verifica se a senha não é a mesma que a anterior, com alteração de maiúsculas e minúsculas.
    • Similar Verifica se a senha não é parecida com a anterior.
    • Simple Verifica se a senha não é muito simples, em relação ao tamanho e caracteres especificados.
    • Rotated Verifica se a senha não é uma versão rotacionada da antiga, como joao, e ojoa.

md5                Usado para criptografar a senha do usuário utilizando o algoritmo md5

O próximo arquivo referenciado no arquivo other é o common-session, que é responsável pela sessão do usuário, o que será feito pós logon e pré-logon. Neste caso especifico não está realizando nenhuma tarefa adicional , veja abaixo :

 

session required        pam_unix.so

 

Neste caso a função do deste módulo é somente logar, quando usuário faz logon e logoff. Podemos através desse módulo  de gerenciamento implementar outras funções informando o que realizar quando o usuário fizer logon. Muito comum utilizarmos para autenticação com winbind, de forma que o diretório do usuário seja criado, caso não exista. Algo do gênero:

 

session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
session required pam_unix.so

 

Neste exemplo acima é requerido que quando o usuário faça logon, seja criado o diretório pessoal através do módulo pam_mkhomedir.so, utilizando o diretório /etc/skel para copia dos aquivos comuns a todos, e mascará 022.

Todos casos vistos aqui utilizaram-se do esquema de arquivo dentro do diretório /etc/pam.d. Mas seria possível ( mas não padronizado ), o uso do pam conf.

Teriamos algo do gênero para as mesmas entradas no pam.conf, no caso de não utilizarmos o arquivo com nome do serviço, já com a implementação da criação do diretório do usuário :

 

other auth required pam_unix.so nullok_secure
other auth required pam_unix.so
other password required pam_unix.so nullok obscure md5
other session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
other session required pam_unix.so

 

Com isso vimos a parte inicial do PAM, o que precisamos agora é trabalhar com módulos especificos como pam_cracklib, pam_limits, pam_listfile entre outros. Mas isso fica para o próximo Post.

Espero que gostem.

 

.’.André Stato Filho

 

Deixe uma resposta

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.