por Vishal Srivistava, Associate Software Engineer, IBM
Conceitos básicos sobre o Pluggable Authentication Module e como configurá-lo e gravar um aplicativo de login
Resumo: A API do Pluggable Authentication Module (PAM) expõe um conjunto de funções que os programadores de aplicativos usam para funções relacionadas à segurança, como autenticação do usuário, criptografia de dados, LDAP, etc. Neste artigo, você terá um guia básico para o modelo do PAM no Linux, aprenderá a configurar o PAM e a designar um aplicativo de login do PAM de amostra em 10 etapas bem fáceis.
Para usuários Linux, compartilhar arquivos certamente é uma tarefa trabalhosa. Por exemplo, exige demais ter que lembrar de várias senhas e redesignar os aplicativos de acesso do sistema (como login, su, password, ftp , etc.) é demorado. Somando a essa dificuldade está o processo de autenticação, em que um sistema identifica um usuário e fornece controle de acesso ideal para esse usuário.
Um histórico do uso do PAM
O PAM é uma API que cuida da autenticação de um usuário para um serviço. Antes do PAM, aplicativos como login (e rlogin, telnet, rsh) procuravam pelo nome do usuário em /etc/passwd
e depois comparavam os dois e autenticavam o nome digitado pelo usuário. Todos os aplicativos usavam esses serviços compartilhados, embora os detalhes da implementação e a autoridade para configurá-los não fossem compartilhados.
Em seguida, os desenvolvedores do aplicativo tentavam codificar seus próprios processos. Com isso veio a necessidade de separar o aplicativo e o módulo de segurança (um módulo de segurança comum pode ser compartilhado por aplicativos e ser configurado conforme necessário).
O mecanismo PAM integra vários esquemas de autenticação de nível inferior em uma API de nível superior que permite que os programas que dependem da autenticação sejam gravados independentemente do esquema de autenticação subjacente. O principal recurso do PAM e a configuração dinâmica da autenticação através de um arquivo /etc/pam.d
ou /etc/pam.conf
.
O PAM pode ser configurado para impedir que determinados programas autentiquem os usuários e para avisar quando determinados programas tentam fazer a autenticação. Os programas do PAM usam os módulos do PAM (módulos de autenticação): Eles são anexados aos aplicativos no tempo de execução para funcionar.
A Figura 1 mostra o fluxo básico do modelo do PAM.
Quais sistemas operacionais suportam o PAM?
O PAM foi desenvolvido primeiramente pela Sun Microsystems em 1995 e é suportado pelas seguintes versões de sistemas operacionais (e superior):
- RedHat 5.0
- SUSE 6.2
- Debian 2.2
- Mandrake 5.2
- Caldera 1.3
- TurboLinux 3.6
O PAM também é suportado por versões recentes do Solaris™, AIX®, HP-UX e Mac OS® X. Mais tarde, ele foi padronizado como parte do processo de padronização X/Open UNIX® (na arquitetura X/Open single sign-on service (XSSO)).
Que tipo de PAM posso obter?
Embora eles não sejam estritamente classificadas, podemos dizer que há três tipos de PAM:
- Linux-PAM: O Linux-PAM abrange todo o PAM discutido neste artigo. A arquitetura principal do PAM em qualquer plataforma Unix é semelhante à versão PAM do Linux.
- OpenPAM: O OpenPAM é outra implementação do PAM desenvolvida pelos laboratórios Dag-Erling Smorgrav em NAI como parte do programa de pesquisa DARPA-CHATS. Por ser um software livre, ele é usado principalmente pelo FreeBSD, NetBSD e por aplicativos (além do Mac OS X).
- Java™ PAM ou JPam: O PAM é basicamente um módulo de autenticação padrão que suporta Linux e UNIX. O JPam atua como uma ponte entre a parte Java e o PAM comum. Ele permite o uso dos módulos ou recursos do PAM (como auth, account, passwd, session , etc.) pelos aplicativos baseados em Java. Ele fornece o JAAS e APIs diretas e suporte para a maioria dos sistemas operacionais e arquiteturas do Unix.
Embora esses sejam PAMs diferentes, a funcionalidade principal permanece a mesma.
Como são os módulos do PAM?
A instalação do PAM é um processo etapa por etapa. Consulte Recursos para obter instruções de instalação.
Os módulos do PAM são classificados por tipo de módulo. Qualquer módulo fornecido deve implementar pelo menos uma das quatro funções de tipo de módulo:
- O módulo de autenticação é usado para autenticar usuários ou configurar/cancelar credenciais.
- Os módulos de gerenciamento de conta executam ações relacionadas ao acesso, à expiração de conta e de credencial, restrições/regras de senha, etc.
- O módulo de gerenciamento de sessão é usado para inicializar e terminar sessões.
- O módulo de gerenciamento de senha executa ações relacionadas à alteração/atualização de senha.
O PAM fornece recursos funcionais diferentes, como autenticação de conexão única, controle de acesso, etc. A implementação de cada um é manipulada por módulos diferentes. A seguir há alguns dos principais módulos:
pam_access
fornece o controle de acesso de login log-daemon-style usando nome de login/domínio, dependendo das regras predefinidas no arquivo /etc/security/access.conf.pam_cracklib
verifica as senhas em relação às regras de senha.pam_env sets/unsets
verifica as variáveis de ambiente a partir de /etc/security/pam_env_conf.pam_debug
depura o PAM.pam_deny
bloqueia os módulos do PAM.pam_echo
imprime as mensagens.pam_exec
executa um comando externo.pam_ftp
é o módulo para acesso anônimo.pam_localuser
requer que o usuário seja listado em /etc/passwd.pam_unix
fornece autenticação de senha tradicional de/etc/passwd
.
Há vários outros módulos (pam_userdb
, pam_warn
, pam_xauth
), que usam um conjunto de valores que eles retornam. (Os detalhes desses módulos podem ser obtidos no guia de administração do PAM em Recursos.)
Configurando o PAM
A configuração do PAM é geralmente implementada no arquivo de configuração que reside em /etc/pam.d
ou /etc/pam.conf
(para versões antigas).
A Estrutura do Arquivo de Configuração
Para cada serviço que usa o PAM, há um arquivo correspondente no diretório, que contém as regras ou as instruções sobre como as informações de autenticação e de conta devem ser obtidas para esse serviço. Geralmente há uma regra por linha.
Os campos nos arquivos de configuração do PAM incluem:
Service_name
Especifica o nome do serviço/aplicativo. (O padrão é OTHER.)Module_type
especifica o tipo de módulo (auth/account/session/passwd
) para o serviço correspondente no campoService_name
.Control_flag
especifica o comportamento de pilha do módulo. Os seguintes valores podem ser usados:requisito
,necessário
,suficiente
eopcional
.Module_path
especifica o nome do caminho para o objeto de biblioteca que implementa o módulo. Ele é configurado para/lib/security
por padrão.Module_options
/module_args
(campos opcionais) especificam as opções ou os argumentos que podem ser passados para os módulos de serviços.
Os módulos são chamados na ordem em que eles são listados no arquivo de configuração, dependendo do que o Control_flag
para cada entrada permite. Os valores de control_flag incluem:
- Requisite: Todos os módulos necessários em uma pilha devem ser aceitos como um resultado com êxito. Se um ou mais dos módulos necessários falharem, todos os módulos necessários na pilha serão implementados, mas o primeiro erro será retornado.
- Sufficient: Se um módulo sinalizado como suficiente obtiver êxito e nenhum módulo anterior ou suficiente falhar, todos os módulos restantes na pilha serão ignorados e o êxito será retornado.
- Optional: Se nenhum dos módulos na pilha for necessário e nenhum módulo suficiente obtiver êxito, pelo menos um módulo opcional do serviço/aplicativo precisa obter êxito.
Exemplos de Arquivos de Configuração do PAM
A Tabela 1 mostra alguns exemplos de arquivos de configuração do PAM em vários sistemas operacionais.
Sistema | Encontrado em … | Tipo | Controle (Flag) | Módulo |
Red Hat | /etc/pam.d | auth | requerid | /lib/security/pam_unix.so |
Red Hat | /etc/pam.d | account | sufficient | /lib/security/pam_unix.so |
Red Hat | /etc/pam.d | session | required | /lib/security/pam_limit.so |
AIX | /etc/pam.conf | auth | requerid | /usr/lib/security/pam_aix |
AIX | /etc/pam.conf | account | required | /usr/lib/security/pam_aix |
AIX | /etc/pam.conf | password | required | /usr/lib/security/pam_aix |
zSUSE 64-bit | 32-bit | /etc/pam.conf | auth | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
zSUSE 64-bit | 32-bit | /etc/pam.conf | account | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
zSUSE 64-bit | 32-bit | /etc/pam.conf | session | required | /lib64/security/pam_unix.so | /lib/security/pam_unix.so |
Solaris | /etc/pam.conf | auth | required | /usr/lib/security/pam_unix.so.1 |
Solaris | /etc/pam.conf | account | required | /usr/lib/security/pam_unix.so.1 |
Solaris | /etc/pam.conf | password | required | /usr/lib/security/pam_unix.so.1 |
HP-UX | /etc/pam.conf | auth | required | libpam_unix.so.1 |
HP-UX | /etc/pam.conf | account | required | libpam_unix.so.1 |
HP-UX | /etc/pam.conf | password | required | libpam_unix.so.1 |
O "Outro" Arquivo do PAM
O arquivo de configuração padrão do PAM /etc/pam.d
é usado por todos os outros serviços que não são explicitamente configurados e talvez seja o arquivo padrão mais simples e robusto do qual o PAM depende. O conteúdo é semelhante ao seguinte:
/etc/pam.d/other File
auth required pam_warn.so
auth required pam_deny.so
account required pam_warn.so
account required pam_deny.so
password required pam_warn.so
password required pam_deny.so
session required pam_warn.so
session required pam_deny.so
O arquivo é muito simples. Para todos os tipos de módulo, Control_flag é o mesmo: required
. Dois módulos são chamados:
- Primeiro,
pam_warn.so
é chamado para registrar informações sobre a tentativa em progresso. - Em seguida,
pam_deny.so
é chamado apenas para retornar uma falha e impedir que qualquer tipo de conexão ou de autenticação seja executado.
Portanto, qualquer serviço que use o PAM deve ser configurado explicitamente para permitir a autenticação, caso contrário, as tentativas falharão.
Dez etapas para designar um Aplicativo de Login Simples do PAM
Essas 10 etapas ajudam a implementar seu próprio aplicativo PAM e a entender as funções de uma sessão do PAM:
- Inclua os arquivos de cabeçalho para a implementação PAM (por exemplo, pam_appl.h, pam_misc.h).
- Na função
main
, inicialize a biblioteca do PAM libpam.so (que carrega os módulos especificados no arquivo de configuração para o aplicativo) usando um manipulador exclusivo. - Tente autenticação para todos os módulos e manipule os cenários de falha.
- Verifique os detalhes de credencial e de conta do usuário.
- Abra uma nova sessão do PAM.
- Configure o ambiente para o usuário usando as credencias.
- Quando o usuário estiver concluído, remova a configuração do ambiente do usuário.
- Feche a sessão do PAM.
- Saia da biblioteca libpam.so com o valor do identificador.
- SAIR.
Conclusão
Depender do PAM para ajudar a lutar pelos esforços de autenticação de nível inferior em um todo mais gerenciável é uma maneira de simplificar esse mecanismo de segurança. Neste artigo, você aprendeu:
- A arquitetura básica do PAM
- Como configurar os módulos do PAM
- A descrição de um aplicativo de login do PAM como um guia para entender como eles funcionam.