UP | HOME

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 e shadow;
  • 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.

Sorry, your browser does not support SVG.

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.

Sorry, your browser does not support SVG.

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>

  1. 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
    
  2. 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ório home ou fazer a caixa de email ficar disponível, para melhor entendimento verifique a próxima diretiva.
  3. 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.
  4. 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 de libpam, que pode localizar a versão correta do módulo.
  5. 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 o debug.
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 o debug;
  • 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" para crypt();
  • debug: Também registra informações usando syslog, mas menos do que o audit;
  • md5: Use criptografia MD5 ao invés de crypt();
  • 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.

Autor: Jeremias Alves Queiroz

Criado em: 2021-12-18 sáb 18:39

Valid XHTML 1.0 Strict