LPI-2 202-450 Topico 210.2
Autenticação por PAM
Índice
210.2: Autenticação por PAM - Objetivos
Peso 3
O candidato deve ser capaz de configurar o PAM para trabalhar autenticação com os diferentes métodos disponíveis.
Conhecimentos-chave:
- Arquivo de configuração, termos e ferramentas do PAM;
- Senhas
passwd
eshadow
; - Autenticação por
sssd
com LDAP.
Lista parcial dos arquivos, termos e ferramentas utilizadas:
/etc/pam.d/
;pam.conf
;nsswitch.conf
;pam_unix
,pam_cracklib
,pam_limits
,pam_listfile
;sssd.conf
.
210.2: Autenticação por PAM - Conteúdo
O Pluggable Authentication Modules (PAM) ou Modulos de Autenticação Plugáveis (em tradução nossa) pode ser definido como uma camada de abstração para autenticação de usuários no Linux. No caso ele permite que diferentes métodos de autenticação possam ser usados resultando no login do usuário.
Figura 1: Diagrama do funcionamento do PAM
Desta forma, os desenvolvedores não precisam descobrir como projetar seus programas para lidar com diferentes fontes de autenticação e eles apenas se concentram em seus programas e usam o pam. Porém quando uma nova fonte de autenticação é implementada, não há necessidade de alterar os programas, apenas implemente um novo módulo para o PAM e use-o, desta forma o pam traz um tipo de mobilidade para os programas também.
Arquitetura do PAM
Qualquer programa que lida com nome de usuário e senha, tal como o
passwd
ou o su
usa PAM. Para fazer isso, o programa deve
trabalhar com o arquivo de biblioteca PAM pam_lib
. O PAM mesmo
estará usando os arquivos de configuração em /etc/pam.d
. O PAM é
modular e usa vários módulos que são colocados em /lib/security
ou /usr/lib/security
.
Figura 2: Diagrama da estrutura de funcionamento do PAM
Por exemplo vamos checar o programa login
se ele usa o PAM ou não.
┌─[root@centos7lpi]──[20:23]──[~] └─[63]─># ldd $(which login) linux-vdso.so.1 => (0x00007ffdcc97c000) libpam.so.0 => /lib64/libpam.so.0 (0x00007f28fdcde000) libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f28fdada000) libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f28fd8b1000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f28fd68a000) libc.so.6 => /lib64/libc.so.6 (0x00007f28fd2bc000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f28fd0b8000) libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007f28fceb2000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f28fcc50000) /lib64/ld-linux-x86-64.so.2 (0x00007f28fdeed000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f28fca34000)
No caso acima libpam
e libpam_misc
proveem autenticação pelo PAM.
/etc/pam.d/
O diretório /etc/pam.d/
contem os arquivos de configuração do
PAM para cada aplicação que o usa. Em versões antigas do PAM toda
a configuração ficava dentro de /etc/pam.conf
porém com o passar
dos anos esse arquivo ficou muito grande agora acabou deprecado e
as distribuições atuais usam a estrutura do /etc/pam.d/
.
┌─[root@centos7lpi]──[20:30]──[~] └─[68]─># ls /etc/pam.d chfn passwd runuser-l sudo-i chsh password-auth smartcard-auth su-l config-util password-auth-ac smartcard-auth-ac system-auth crond polkit-1 smtp system-auth-ac fingerprint-auth postlogin smtp.postfix systemd-user fingerprint-auth-ac postlogin-ac sshd vlock login remote su other runuser sudo
Todo binário que tem alguma coisa a ver com o pam precisa ter um
arquivo de configuração. Existem também alguns arquivos de
configuração genéricos. Os arquivos de configuração definem o que
exatamente deve acontecer. O formato do arquivo de configuração do
PAM original (/etc/pam.conf
) é assim:
<service> <module-interface> <control-flag> <module-name> <module-arguments>
Service: Especifica qual serviço essa linha de configuração trata. Tal como ssh ou FTP. Esta primeira opção só era usada no arquivo de configuração original
/etc/pam.conf
. Dessa forma essa primeira diretiva dizia ao PAM como diferenciar todas as configurações. No formato atual (/etc/pam.d/
) isso não é mais utilizado pois temos um arquivo por cada service assim o nome deles<service>
fica implícito. Os próximos items são os que se repetem nos arquivos de configuração no formato atual, portanto vamos dar uma olhada em um arquivo que segue esse formato:#%PAM-1.0 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so auth substack system-auth auth include postlogin account required pam_nologin.so account include system-auth password include system-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so session optional pam_console.so # pam_selinux.so open should only be followed by sessions to be executed in the # user context session required pam_selinux.so open session required pam_namespace.so session optional pam_keyinit.so force revoke session include system-auth session include postlogin -session optional pam_ck_connector.so'
Logo na primeira linha podemos notar uma referência para
system-auth
que na verdade é um arquivo de configuração genérico que está incluído quase em qualquer processo que precisa fazer algo com autenticação, portanto vamos dar uma olhada nele também.#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth required pam_faildelay.so delay=2000000 auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
module-interface
: Quatro tipos de interface de módulo PAM estão disponíveis. Cada uma delas corresponde a um diferente aspecto no processo de autenticação:auth
: Esta interface de módulo autentica o uso. Por exemplo, ele solicita e verifica a validade de uma senha. Módulos com esta interface também podem definir credenciais, como associações de grupo ou tíquetes Kerberos;account
: Esta interface de módulo verifica se o acesso está permitido. Por exemplo, ele checa se a conta do usuário está espirada ou se o usuário tem permissão de logar em um horário específico;password
: Interface de módulo usada para trocas de senha;session
: Esta interface de módulo configura e gerencia as seções de usuário. Módulos que usam esta interface podem também executar tarefas adicionais conforme necessário para permitir acesso, tal como montar um diretóriohome
ou fazer a caixa de email ficar disponível, para melhor entendimento verifique a próxima diretiva.
control-flag
: Todo módulo PAM quando invocado gera um resultado de "sucesso" ou "falha". As control-flags informam o que fazer com esse resultado. Os módulos podem ser empilhados em uma ordem particular e as flags de controle determinam quão importante o sucesso ou uma falha de um módulo em particular é para o todo da autenticação de um usuário em um serviço.Lista de flags:
requisite
: A autenticação é negada imediatamente no caso de uma negativa do módulo;required
: Autenticação recusada no caso de negativa do módulo, mas consultará os outros módulos para o serviço antes de negar completamente a autenticação;sufficient
: Se a autenticação para este módulo for bem-sucedida, a autenticação será confirmada mesmo que módulos anteriores tenham negado;optional
: A aprovação ou negação nesse módulo só fará diferença se for o único do tipo para o serviço;include
: Diferente das outras flags esta não está relacionada em como o resultado do módulo é tratado. Esta flag puxa todas as linhas no arquivo de configuração que correspondem ao parâmetro fornecido e as anexa como um argumento para o módulo.
module-name
: Diz ao PAM o nome do módulo que contém a interface de módulo que especificamos. O nome do diretório é omitido pois o aplicativo está vinculado à versão apropriada delibpam
, que pode localizar a versão correta do módulo.module-arguments
: O PAM usa argumentos para passar para o módulo durante a autenticação em vários dos módulos. Por exemplo:auth required pam_userdb.so db=/path/to/MyDB_file
Argumentos inválidos geralmente são ignorados e não implicam no sucesso ou falha na autenticação através do módulo. Alguns módulos, porém, entrarão em falha sistêmica (erro do binário) com argumentos inválidos. A maioria dos módulos reporta os erros em
/var/log/secure
.
Agora que conhecemos o formato dos arquivos do de configuração do PAM, vamos dar uma olhada em mais um arquivo:
#%PAM-1.0 auth required pam_sepermit.so auth substack password-auth auth include postlogin # Used with polkit to reauthorize users in remote sessions -auth optional pam_reauthorize.so prepare account required pam_nologin.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions # to be executed in the user context session required pam_selinux.so open env_params session required pam_namespace.so session optional pam_keyinit.so force revoke session include password-auth session include postlogin # Used with polkit to reauthorize users in remote sessions -session optional pam_reauthorize.so prepare
Como você pode ver, existem alguns arquivos de configuração genéricos, como password-auth, que podem ser incluídos e usados em outros arquivos de configuração repetidamente.
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth required pam_faildelay.so delay=2000000 auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
/lib/security ou /lib64/security
Esse é o local onde ficam os módulos do PAM
┌─[root@centos7lpi]──[21:17]──[~] └─[73]─># ls /lib64/security/ pam_access.so pam_ftp.so pam_permit.so pam_tally2.so pam_cap.so pam_group.so pam_postgresok.so pam_time.so pam_chroot.so pam_issue.so pam_pwhistory.so pam_timestamp.so pam_console.so pam_keyinit.so pam_pwquality.so pam_tty_audit.so pam_cracklib.so pam_lastlog.so pam_rhosts.so pam_umask.so pam_debug.so pam_limits.so pam_rootok.so pam_unix_acct.so pam_deny.so pam_listfile.so pam_securetty.so pam_unix_auth.so pam_echo.so pam_localuser.so pam_selinux_permit.so pam_unix_passwd.so pam_env.so pam_loginuid.so pam_selinux.so pam_unix_session.so pam_exec.so pam_mail.so pam_sepermit.so pam_unix.so pam_faildelay.so pam_mkhomedir.so pam_shells.so pam_userdb.so pam_faillock.so pam_motd.so pam_stress.so pam_warn.so pam_filter pam_namespace.so pam_succeed_if.so pam_wheel.so pam_filter.so pam_nologin.so pam_systemd.so pam_xauth.so
Se um novo método de autenticação for implementado (tal como leitores biométricos), este é o local em que o módulo deve ser colocado.
Para o exame LPIC2 é requerido conhecer os seguintes módulos:
pam_unix
;pam_cracklib
;pam_limits
;pam_listfile
;pam_sss
.
pam_unix
É o módulo que configura a autenticação via /etc/passwd
e
/etc/shadow
.
Este módulo suporta as seguintes interfaces de usuário:
account
Esta interface não autentica o usuário, mas verifica outras coisas, como data de expiração da senha e pode forçar o usuário a alterar a sua senha com base no conteúdo dos arquivos
/etc/passwd
e/etc/shadow
;Suporta as seguintes opções:
debug
: popula o syslog com informações de diagnóstico;audit
: registra ainda mais informações do que odebug
.
auth
Esta interface verifica a senha do usuário em relação aos bancos de dados de senha. Este componente é configurado no arquivo
/etc/nsswitch.conf
.Suporta as seguintes opções:
debug
: popula o syslog com informações de diagnóstico;audit
: registra ainda mais informações do que odebug
;nodelay
: Este argumento define o atraso na falha, que tem um padrão de um segundo, como nodelay;nullok
: Permite senhas vazias. Normalmente, a autenticação falha se a senha estiver em branco;try_first_pass
: Use a senha do módulo anterior e solicite uma nova senha se a senha recuperada estiver em branco ou incorreta;use_first_pass
: Use o resultado do módulo de autenticação anterior, não apresentará prompt e falhará se o resultado anterior for falha.
password
Esta interface muda a senha do usuário.
Suporta as seguintes opções:
audit
: faz log usando o syslog;bigcrypt
: Use a extenção DEC "C2" paracrypt()
;debug
: Também registra informações usando syslog, mas menos do que oaudit
;md5
: Use criptografia MD5 ao invés decrypt()
;nis
: Use senhas NIS (Network Information Service);not_set_pass
: Não use as senhas de outros módulos e não forneça a nova senha para outros módulos;nullok
: Permite senhas vazias. Normalmente, a autenticação falha se a senha estiver em branco;remember
: Lembre-se das últimas "n" senhas para evitar que o usuário use uma das últimas "n" senhas novamente;try_first_pass
: Use a senha do módulo de autenticação anterior e solicite uma nova senha se a senha recuperada estiver em branco ou incorreta;use_authtok
: Defina a nova senha para aquela fornecida por um módulo anterior;use_first_pass
: Use o resultado do módulo de autenticação anterior, nunca solicite uma senha ao usuário e falhará se o resultado for uma falha.
session
- Esta interface usa o syslog para registrar o nome do usuário e o tipo de seção no início e no final de uma seção. Não oferece suporte a opções.
A maioria dos serviços que precisam de autenticação incluem o
módulo pam_unix.so
. Como exemplo, podemos adicionar que ele
deve lembrar-se das 3 últimas senhas do usuário e evitar que ela
seja utilizada em uma redefinição de senha, para tanto vamos
editar o arquivo /etc/pam.d/system-auth
, procuraremos a linha:
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
E adicionamos remember=3
ao final dela.
Agora podemos tentar trocar a senha de algum usuário, se
repetirmo uma das 3 anteriores o utilitário passwd
emitirá um
erro.
pam_cracklib
O módulo pam_cracklib
fornece verificação de força para as
senhas. Isso é feito executando uma série de verificações para
garantir que as senhas não sejam muito fracas. Ele verifica a
senha contra dicionários, contra as senhas anteriores e regras de
uso de números, maiúsculas, minúsculas e outros
caracteres. Dependendo da distribuição o pam_cracklib
pode ter
um nome diferente, por exemplo no CentOS7 ele é referenciado por
pam_pwquality
.
pam_limits
O módulo pam_limits
impõe limites nos recursos do sistema que
podem ser alcançados em uma seção de usuário. O usuário com UID=0
também é afetado por esses limites. Por padrão os limites são
configurados primariamente no arquivo
/etc/security/limits.conf
. E em segundo nível no arquivo
/etc/security/limits.d/
.
O módulo pam_limits
é utilizado em vários serviços.
┌─[root@centos7lpi]──[22:12]──[/etc/pam.d] └─[96]─># grep limits * fingerprint-auth:session required pam_limits.so fingerprint-auth-ac:session required pam_limits.so password-auth:session required pam_limits.so password-auth-ac:session required pam_limits.so runuser:session required pam_limits.so smartcard-auth:session required pam_limits.so smartcard-auth-ac:session required pam_limits.so system-auth:session required pam_limits.so system-auth-ac:session required pam_limits.so
Como pode ser visto acima o módulo pam_limits
é usado em
conjunto com a interface de módulo session
. Portanto, em vez de
manipular o módulo dentro do arquivo de configuração de serviço,
podemos editar as configurações constantes em
/etc/security/limits.conf
ou em /etc/security/limits.d
.
#* soft core 0 #* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #@student - maxlogins 4
Por exemplo podemos adicionar a seguinte linha ao final do
arquivo /etc/security/limits.conf
para fazer o usuário joao
não logar mais do que uma vez:
@joao hard maxlogins 1
Para um teste crie o usuário joão, logue-se com ele via ssh
e
tente abrir uma segunda seção de ssh
.
pam_listfile
Este módulo permite ou nega uma ação baseada na presença de um
item em um listfile
. Sendo o listfile
um arquivo contendo uma
lista de nomes de usuários sendo um nome de usuário por linha. O
tipo do item pode ser setado pelos argumentos do módulo no
arquivo de configuração do serviço que irá utilizá-lo. O item
pode ser user
, tty
, rhost
, ruser
, group
, ou shell
. O
parâmetro sense
determina se as entradas na lista são
permitidas. Os valores são allow
ou deny
.
Em uma instalação limpa sem nenhum serviço extra no servidor
geralmente nenhum serviço utiliza o pam_listfile
. Portanto
vamos instalar um servidor vsftpd
para testar o módulo.
Após instalado podemos encontrar a seguinte linha no arquivo
/etc/pam.d/vsftpd
:
vsftpd:auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
O que ele faz é negar a cada usuário cujo nome esteja dentro de
/etc/vsftpd/ftpusers
.
# Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
Para testar inclua o usuário joao
que criamos anteriormente
nesse arquivo, starte o serviço do vsftpd
e tente logar no FTP
com esse usuário.
pam_sss
ou sssd
O System Security Services Daemon (SSSD) ou Daemon de Serviços de Segurança de Sistema (em tradução nossa). De forma resumida trata-se de uma interface entre o NSS, o PAM e o Sistema.
Funciona como uma central de serviços no processo de
autenticação, determinando como exatamente a autenticação deve
ocorrer. O SSSD pode autenticar utilizando LDAP, Active
Directory, NIS e aí por diante. Este módulo foi desenvolvido
especialmente para isso. Vamos dar uma olhada no nosso Linux de
laboratório para entender
melhor o funcionamento do pam_sss
.
Em um sistema RedHat like existe o daemon sssd.service
este
lê sua configuração do arquivo /etc/sssd/sssd.conf
Por padrão o serviço SSSD não vem configurado, isso fica a cargo
do administrador portanto se formos procurar nos arquivos de
configuração de serviçoso do /etc/pam.d/
não encontraremos
nenhuma referência a pam_sss
Portanto primeiro precisamos editar o arquivo /etc/sssd/sssd.conf
e iniciar o daemon para
podermos usufruir dessa tecnologia.
O processo todo é relativamente complexo e difere de distribuição para distribuição e, como isso foge do escopo que propusemos portanto não iremos abordar.
Porém após todo o processo de configuração poderemos ver o módulo
pam_sss
populando os arquivos passwd-auth e system-auth:
┌─[root@centos7lpi]──[22:50]──[/etc/pam.d] └─[809]─># grep pam_sss * password-auth:auth sufficient pam_sss.so forward_pass password-auth:account [default=bad success=ok user_unknown=ignore] pam_sss.so password-auth:password sufficient pam_sss.so use_authtok password-auth:session optional pam_sss.so system-auth:auth sufficient pam_sss.so forward_pass system-auth:account [default=bad success=ok user_unknown=ignore] pam_sss.so system-auth:password sufficient pam_sss.so use_authtok system-auth:session optional pam_sss.so
nsswitch.conf
O arquivo nsswitch.conf
determina a ordem em que os arquivos ou
serviços são usados para executar respostas de autenticação ou
autorizar algo no sistema.
# In order of likelihood of use to accelerate lookup. shadow: files sss hosts: files dns myhostname aliases: files ethers: files gshadow: files
A ordem de autenticação e o nsswitch.conf
podem afetar a forma
como a autenticação ocorre em nosso sistema, incluindo se outros
módulos estiverem envolvidos, uma vez que são arquivos. Portanto
uma das formas de executar um troubleshooting no PAM é editando
o nsswitch.conf
ajustando a ordem da autenticação.