Autenticação via hardware: o módulo pam_usb

O módulo de autenticação pamusb permite a criação de tokens de baixo custo e a ampliação da pilha de autenticação do sistema operacional, tornando-a mais flexível.

[ Hits: 22.890 ]

Por: lourival araujo da silva em 15/06/2009


Instalando o módulo de autenticação



A instalação do módulo pamusb pode ser feita a partir de qualquer repositório oficial de distribuições baseadas no sistema Debian Linux. Utilizaremos o Ubuntu 8.10 Intrepid Ibex como base do presente trabalho.

Inicialmente atualizaremos a lista de repositórios, instalaremos as ferramentas relacionadas com a funcionalidade pamusb e verificaremos as adições realizadas no sistema:

# apt-get update
# apt-get install libpam-usb pamusb-tools
# apropos pam-usb

pamusb-agent (1 ) - pam-usb authentication
pamusb-check (1 ) - simulates pam-usb authentication
pamusb-conf   (1 ) - pam-usb configuration tool

Devemos observar que a instalação do suporte a autenticação via dispositivos de hardware usb cria algumas entradas no sistema e essas são de três tipos:
  • comandos para gerenciamento de dispositivos (pamusb-agent, pamusb-check, pamusb-conf);
  • módulo para incorporar à pilha de autenticação (pamusb.so);
  • arquivo de configuração do módulo correspondente (/etc/pamusb.conf).

Podemos criar um link simbólico para o arquivo de configuração criado pelo módulo a fim de manter compatibilidade com os demais:

# ln -s /etc/pamusb.conf /etc/security/pamusb.conf

Adicionando hardware de autenticação

Conectamos o pendrive e utilizamos as ferramentas de gerenciamento:

# pamusb-conf --add-device=kingston

Please select the device you which to add
* Using "Kingston DataTraveler 2.0 (kingston_DataTraveler_2.0_8990000000000006CB02BF4-0:0)" (only option)

Which volume would you like to use for storing data?
* Using "/dev/sdb1 (UUID: 2C8E-0B1A)" (only option)

Name: Kingston
Vendor: Kingston
Model: DataTraveler 2.0
Serial: Kingston_DataTraveler_2.0_8990000000000006CB02BF4-0:0
UUID: 2C8E-0B1A

Save to /etc/pamusb.conf?
[Y/n] Y
Done.

Em seguida devemos cadastrar os usuários que desejamos que se autentiquem utilizando o dispositivo USB. Pode ser mais de um:

# pamusb-conf --add-user=root

Which device would you like to use for authentication?
* Using "Kingston" (only option)
User: root
Device: Kingston

Save to /etc/pamusb.conf?
[Y/n] Y
Done.

Concluímos a inclusão do dispositivo e do usuário.

    Próxima página

Páginas do artigo
   1. Instalando o módulo de autenticação
   2. Verificando usuário cadastrado e arquivo de configuração
   3. Incluindo USB à pilha de autenticação
   4. Testando a autenticação via hardware USB
Outros artigos deste autor

Servidor Samba "Autoservice"

Cliente Linux no servidor LDAP

webCalendar: a agenda e o PAM

Configuração "automágica" de servidor Linux PDC Samba

Bom escudo não teme espada: o módulo pam_cracklib

Leitura recomendada

Instalando e configurando o Nagios 3.3.1 com NDOUtils 1.4

Apache2 + PHP5 com ModSecurity no Debian Squeeze

Armitage: a nova interface gráfica do Metasploit

Hardening em sistemas operacionais Linux (Completo)

Segurança para iniciantes

  
Comentários
[1] Comentário enviado por vagnermoya em 15/06/2009 - 14:35h

Tem suporte SSH???


[s]


Vagner

[2] Comentário enviado por araujo_silva em 15/06/2009 - 17:43h

Tem suporte a SSH sim Vagner. Basta realizar duas operações:

1. Habilite o suporte ao pam no arquivo de configuração do sshd (/etc/ssh/sshd_config):
(Ajuste ou inclua a diretiva seguinte)

UsePAM Yes

2. Habilite o serviço ssh no diretório do PAM (/etc/pam.d/ssh):
(Inclua as linhas seguintes, nas seções de autenticação e sessão, respectivamente )

auth sufficient pam_usb.so use_first_pass
session sufficient pam_usb.so use_first_pass

Abraços

Lourival

[3] Comentário enviado por luizvieira em 16/06/2009 - 14:07h

Excelente artigo!
Vou testar essa ferramenta para entender melhor o funcionamento.
parabéns!
[ ]'s
Luiz

[4] Comentário enviado por araujo_silva em 16/06/2009 - 17:20h

Valeu luiz

Testa usando os arquivos que estão no diretório do PAM (/etc/pam.d/*).
Basta incluir a linha que torna suficiente a consulta ao módulo do pam_usb. Por exemplo:
1. Incluir suporte ao serviço 'su', edite o arquivo /etc/pam.d/su e inclua as linhas de autenticação com módulo pam_usb:
auth sufficient pam_usb.so use_first_pass
session sufficient pam_usb.so use_first_pass
Ai, quando você digitar '$ su root', e o pendrive estiver conectado a senha não será solicitada.
O mesmo aplica-se a qualquer dos serviços com suporte ao uso do PAM.

Abraço,
Louival

[5] Comentário enviado por xpf em 16/06/2009 - 19:21h

Esta sua matéria me chamou muito a atenção pois procurava por algo similar a anos, sou novato no Linux e uso o Ubuntu 9.04 (podem chamar de linux de iniciante que eu não ligo :D), eu gostaria de saber se estes passos e comandos se aplicam da mesma forma no Ubuntu 9.04. E mais uma dúvida eu possuo um notebook com entrada para cartão de memória SD, eu gostaria de saber se posso usar no lugar de um pendrive USB um cartão SD. Para esclarecer melhor meu cartão SD quando é inserido no slot é montado automáticamente no diretório /media/MSDM, sendo que este meu SD está com o "label" MSDM.
Eu poderia usar este SD para por exemplo logar no Ubunto via GDM?

[6] Comentário enviado por xpf em 16/06/2009 - 19:29h

E ia me esquecendo parabéns pela matéria.

[7] Comentário enviado por araujo_silva em 16/06/2009 - 20:16h

Olha Só,

Existe mais de uma solução:

1. Usando o pam_rsa.so, que possibilita a criação de um par de chaves (uma publica e uma privada), a chave privada sendo mantida no notebook e a chave publica sendo salva no dispositivo SD;

2. Usando o pam_ssh.so pode-se gerar essas chaves e testar.

Nos dois casos, e no caso do pam_usb, os serviços podem compartilhar os módulos.

Abraços

Lourival

[8] Comentário enviado por araujo_silva em 16/06/2009 - 20:40h

xpf

Se a conecção do seu dispositivo SD for realizada através da porta usb o módulo pamusb pode ser utilizado.

Tchau

Lourival

[9] Comentário enviado por xpf em 16/06/2009 - 20:49h

Obrigado, mas não é USB não.
Tive um probleminha aquí com meu pendrive, no GDM ele não está logando pelo pendrive e continuo precisando digitar a senha, mas no teste que fiz apertando Atrl+ALt+BackSpace ele loga sem precisar de senha apenas o nome do usuário é necessário. Será que é por que o pendrive não está montado na primeira inicialização?
Outro probleminha é que o Scrensaver entra quando desplugo o pen mas quando plugo novamente eu preciso digitar a senha para sair da tela de screesaver. O que será que fiz errado?

Observando o terminal com pamusb-agent aparece isto:

xpf@xpf-laptop:~$ pamusb-agent
pamusb-agent[4949]: pamusb-agent up and running.
pamusb-agent[4949]: Watching device "XPF-FLASH" for user "xpf"
pamusb-agent[4949]: Device "XPF-FLASH" has been removed, locking down user "xpf"...
pamusb-agent[4949]: Running "gnome-screensaver-command --lock"
pamusb-agent[4949]: Locked.
pamusb-agent[4949]: Device "XPF-FLASH" has been inserted. Performing verification...
pamusb-agent[4949]: Executing "/usr/bin/pamusb-check --quiet --config=/etc/pamusb.conf --service=pamusb-agent xpf"
Erro: o dispositivo /dev/sdb1 não é removível
pamusb-agent[4949]: Authentication failed for device XPF-FLASH. Keeping user "xpf" locked down.

[10] Comentário enviado por araujo_silva em 16/06/2009 - 21:18h

OK xpf
Vamos por partes:

1. O uso do Ctrl+Alt+BackSpace para autenticar no terminal é ajustado no arquivo do PAM (/etc/pam.d/login), que gerencia o login somente em modo texto;

2. O ajuste do login gráfico é feito no outro arquivo (/etc/pam.d/gdm), e tem que ter uma configuração semelhante à do login;

3. O pedido de senha é feito se o módulo pam_usb.so for o único do gerenciamento de autenticação, ou se faltar o parâmetro 'use_first_pass' que aproveita a senha entrada no módulo anterior e não solicita nova senha ao usuário;

4. Verifique que se você estiver no console, ou seja, logado no ambiente gráfico, assim que retirar o pendrive o ambiente gráfico será travado;

5. Inclua as linhas sobre autenticação na administração do gdm (/etc/pam.d/gdm), teste com as seguites linhas, e depois ajuste como lhe parecer melhor:

auth requisite pam_nologin.so
auth requisite pam_securetty.so
auth sufficient pam_usb.so use_first_pass

Teste e reporte o funcinamento.

Abraço

Lourival

[11] Comentário enviado por xpf em 16/06/2009 - 22:28h

Não deu certo não. Estou postando meus arquivos:

/etc/pan.d/login

#
# The PAM configuration file for the Shadow `login' service
#

# Enforce a minimal delay in case of failure (in microseconds).
# (Replaces the `FAIL_DELAY' setting from login.defs)
# Note that other modules may require another minimal delay. (for example,
# to disable any delay, you should add the nodelay option to pam_unix)
auth optional pam_faildelay.so delay=3000000

# Outputs an issue file prior to each login prompt (Replaces the
# ISSUE_FILE option from login.defs). Uncomment for use
# auth required pam_issue.so issue=/etc/issue

# Disallows root logins except on tty's listed in /etc/securetty
# (Replaces the `CONSOLE' setting from login.defs)
auth [success=ok ignore=ignore user_unknown=ignore default=die] pam_securetty.so

# Disallows other than root logins when /etc/nologin exists
# (Replaces the `NOLOGINS_FILE' option from login.defs)
auth requisite pam_nologin.so

#aded for me for use with pan_usb
auth sufficient pam_usb.so use_first_pass

# SELinux needs to be the first session rule. This ensures that any
# lingering context has been cleared. Without out this it is possible
# that a module could execute code in the wrong domain. (When SELinux
# is disabled, this returns success.)
session required pam_selinux.so close

# This module parses environment configuration file(s)
# and also allows you to use an extended config
# file /etc/security/pam_env.conf.
#
# parsing /etc/environment needs "readenv=1"
session required pam_env.so readenv=1
# locale variables are also kept into /etc/default/locale in etch
# reading this file *in addition to /etc/environment* does not hurt
session required pam_env.so readenv=1 envfile=/etc/default/locale

# Standard Un*x authentication.
@include common-auth

# This allows certain extra groups to be granted to a user
# based on things like time of day, tty, service, and user.
# Please edit /etc/security/group.conf to fit your needs
# (Replaces the `CONSOLE_GROUPS' option in login.defs)
auth optional pam_group.so

# Uncomment and edit /etc/security/time.conf if you need to set
# time restrainst on logins.
# (Replaces the `PORTTIME_CHECKS_ENAB' option from login.defs
# as well as /etc/porttime)
# account requisite pam_time.so

# Uncomment and edit /etc/security/access.conf if you need to
# set access limits.
# (Replaces /etc/login.access file)
# account required pam_access.so

# Sets up user limits according to /etc/security/limits.conf
# (Replaces the use of /etc/limits in old login)
session required pam_limits.so

# Prints the last login info upon succesful login
# (Replaces the `LASTLOG_ENAB' option from login.defs)
session optional pam_lastlog.so

# Prints the motd upon succesful login
# (Replaces the `MOTD_FILE' option in login.defs)
session optional pam_motd.so

# Prints the status of the user's mailbox upon succesful login
# (Replaces the `MAIL_CHECK_ENAB' option from login.defs).
#
# This also defines the MAIL environment variable
# However, userdel also needs MAIL_DIR and MAIL_FILE variables
# in /etc/login.defs to make sure that removing a user
# also removes the user's mail spool file.
# See comments in /etc/login.defs
session optional pam_mail.so standard

# Standard Un*x account and session
@include common-account
@include common-session
@include common-password

# SELinux needs to intervene at login time to ensure that the process
# starts in the proper default security context. Only sessions which are
# intended to run in the user's context should be run after this. (When
# SELinux is disabled, this returns success.)
session required pam_selinux.so open

/etc/pan.d/gdm

#%PAM-1.0
auth requisite pam_nologin.so
auth required pam_env.so readenv=1
auth required pam_env.so readenv=1 envfile=/etc/default/locale
#auth sufficient pam_usb.so use_first_pass
#auth optional pam_mount.so use_first_pass
auth requisite pam_securetty.so
auth sufficient pam_usb.so use_first_pass
@include common-auth
auth optional pam_gnome_keyring.so
@include common-account
session required pam_limits.so
@include common-session
session optional pam_gnome_keyring.so auto_start
@include common-password

é assim que está.

[12] Comentário enviado por araujo_silva em 17/06/2009 - 06:26h

A configuração está funcional.
Somente para testar, faça o seguinte:
1. comente as linhas do serviço gdm (/etc/pam.d/gdm) que começam com @include:
@include common-auth
@include common-account
@include common-session
@include common-password
Você vai comentar colocando um sinal '#' antes deles, porque eles estão inserindo as configurações desses arquivos no serviço gdm;

2. Verifique se a proteção de tela está habilitada (SISTEMA/PREFERENCIA/PROTEÇÃO DE TELA);
;
3. Faça o logon normalmente e abra um terminal virtual no ambiente gráfico para ler o resultado da conecção do dispositivo usb;

4. Leia o arquivo de log para verificar o que ele está indicando:
$ tail /var/log/auth.log

Informe o resultado do arquivo de log antes e depois das auterações.

[13] Comentário enviado por xpf em 17/06/2009 - 08:06h

Antes das alterções:

tail /var/log/auth.log
Jun 17 08:01:27 xpf-laptop dbus-daemon: Rejected send message, 1 matched rules; type="method_call", sender=":1.41" (uid=1000 pid=7475 comm="/usr/lib/indicator-applet/indicator-applet --oaf-a") interface="org.freedesktop.DBus.Properties" member="Get" error name="(unset)" requested_reply=0 destination=":1.57" (uid=1000 pid=8799 comm="/usr/bin/pamusb-check --quiet --config=/etc/pamusb"))
Jun 17 08:01:27 xpf-laptop pam_usb[8799]: Device "XPF-FLASH" is connected (good).
Jun 17 08:01:27 xpf-laptop pam_usb[8799]: Performing one time pad verification...
Jun 17 08:01:27 xpf-laptop pam_usb[8799]: Mount failed
Jun 17 08:01:27 xpf-laptop pam_usb[8799]: Access denied.
Jun 17 08:01:27 xpf-laptop pamusb-agent[7308]: Authentication failed for device XPF-FLASH. Keeping user "xpf" locked down.
Jun 17 08:01:27 xpf-laptop dbus-daemon: Rejected send message, 1 matched rules; type="method_call", sender=":1.41" (uid=1000 pid=7475 comm="/usr/lib/indicator-applet/indicator-applet --oaf-a") interface="org.freedesktop.DBus.Properties" member="Get" error name="(unset)" requested_reply=0 destination=":1.58" (uid=1000 pid=8805 comm="gnome-mount -b -d /dev/sdb1 "))
Jun 17 08:01:27 xpf-laptop dbus-daemon: Rejected send message, 1 matched rules; type="method_call", sender=":1.41" (uid=1000 pid=7475 comm="/usr/lib/indicator-applet/indicator-applet --oaf-a") interface="org.freedesktop.DBus.Properties" member="Get" error name="(unset)" requested_reply=0 destination=":1.59" (uid=0 pid=8806 comm="/usr/lib/hal/hal-storage-mount "))
Jun 17 08:01:27 xpf-laptop gnome-keyring-daemon[7117]: adding removable location: volume_uuid_1E88_B791 at /media/XPF-FLASH
Jun 17 08:01:33 xpf-laptop gnome-screensaver-dialog: gkr-pam: unlocked 'login' keyring

Vou reiniciar a máquina.

[14] Comentário enviado por xpf em 17/06/2009 - 08:39h

Bem agora com as linhas comentadas o GDM nem pede mais senha mesmo SEM O PENDRIVE inserido 80.

A tela de descanço entra ao plugar e depois desplugar o pendrive mas depois só sai da trava se eu digitar a senha.
o log agora é este:

tail /var/log/auth.log
Jun 17 08:35:30 xpf-laptop dbus-daemon: Rejected send message, 1 matched rules; type="method_call", sender=":1.35" (uid=1000 pid=3872 comm="/usr/lib/indicator-applet/indicator-applet --oaf-a") interface="org.freedesktop.DBus.Properties" member="Get" error name="(unset)" requested_reply=0 destination=":1.48" (uid=1000 pid=4439 comm="/usr/bin/pamusb-check --quiet --config=/etc/pamusb"))
Jun 17 08:35:30 xpf-laptop pam_usb[4439]: Device "XPF-FLASH" is connected (good).
Jun 17 08:35:30 xpf-laptop pam_usb[4439]: Performing one time pad verification...
Jun 17 08:35:30 xpf-laptop pam_usb[4439]: Mount failed
Jun 17 08:35:30 xpf-laptop pam_usb[4439]: Access denied.
Jun 17 08:35:30 xpf-laptop pamusb-agent[3735]: Authentication failed for device XPF-FLASH. Keeping user "xpf" locked down.
Jun 17 08:35:30 xpf-laptop dbus-daemon: Rejected send message, 1 matched rules; type="method_call", sender=":1.35" (uid=1000 pid=3872 comm="/usr/lib/indicator-applet/indicator-applet --oaf-a") interface="org.freedesktop.DBus.Properties" member="Get" error name="(unset)" requested_reply=0 destination=":1.49" (uid=1000 pid=4442 comm="gnome-mount -b -d /dev/sdb1 "))
Jun 17 08:35:30 xpf-laptop dbus-daemon: Rejected send message, 1 matched rules; type="method_call", sender=":1.35" (uid=1000 pid=3872 comm="/usr/lib/indicator-applet/indicator-applet --oaf-a") interface="org.freedesktop.DBus.Properties" member="Get" error name="(unset)" requested_reply=0 destination=":1.50" (uid=0 pid=4445 comm="/usr/lib/hal/hal-storage-mount "))
Jun 17 08:35:30 xpf-laptop gnome-keyring-daemon[3543]: adding removable location: volume_uuid_1E88_B791 at /media/XPF-FLASH
Jun 17 08:35:33 xpf-laptop gnome-screensaver-dialog: gkr-pam: unlocked 'login' keyring

acho que não mudou nada não.

[15] Comentário enviado por vagnermoya em 17/06/2009 - 09:22h

Lourival,

Não consegui fazer funcionar no SSH, com putty...


Tem algum macete?

[s]

Vagner Moya

[16] Comentário enviado por araujo_silva em 17/06/2009 - 09:57h

Vamos vê xpf:
1. O sistema não está identificando usuário cadastrado para logar, inclua uma linha no arquivo do gdm, mantenha as linhas do gnome-keyring e do limits, mas inclua o pam_blue sem use_first_pass [depois nós analisaremos o porquê]:
auth requisite pam_securetty.so
auth requisite pam_nologin.so
auth sufficient pam_usb.so
auth required pam_unix.so

(Estou contando que você já cadastrou usuários válidos do sistema no pendrive e próprio pendrive, pelo retorno do log de autenticação )

Teste e verifique o retorno do log, que deve mudar.

[17] Comentário enviado por araujo_silva em 17/06/2009 - 10:02h

Vagner

O pam_usb.so é um módulo para autenticação local e o acesso pelo putty é realizado através da rede.
Se você conectar o pendrive na máquina onde o uso do pam_usb.so está cadastrado, e incluir a linha no serviço ssh (/etc/pam.d/ssh), o acesso funcionará.
De outra forma se o acesso for feito através de uma máquina virtual instalada na mesma máquina física, compartilhando os dispositivos usb, o acesso também será autorizado.
Depois veremos outros meios de autenticação via rede.

Abraços

Lourival

[18] Comentário enviado por xpf em 17/06/2009 - 22:30h

Obrigado pela ajuda, testei mas não funcionou, deve ser alguma etapa que fiz errado, vou fazer tudo do começo de novo para ver se consigo resolver isso. Mais uma vez obrigado pela atenção.


Contribuir com comentário