sexta-feira, 24 de fevereiro de 2012

PAM – Autenticação via pendrive com pam


Nada proteje um sistema operacional de acesso físico, mas tem algumas formas interessantes de prover alguma segurança a mais, ou pelo menos uma segurança diferenciada.
Em uma necessidade da empresa (entre os demais acertos de um projeto) fiz a implementação de autenticação por pendrive, que evita a necessidade de digitar senha e que teóricamente, sem o dispositivo cadastrado não se pode efetuar login. O mais interessante disso é que o pendrive pode ser utilizado normalmente, sem nenhuma limitação, pois não são gravados dados nele. Após ter feito a primeira configuração, decidi fazer um shell script para quando houver a necessidade de refazer a configuração. Nesse shell script explicarei algumas coisas em detalhes:

#!/bin/sh
#configurador do pamusb e registrador do pendrive
#By: Djames Suhanko – LightComm

#primeiramente, verificar se todos os pacotes estao instalados. Se nao, instala-os
PROGRAMAS_A_INSTALAR=”"
dpkg -l pmount >/dev/null || PROGRAMAS_A_INSTALAR=”pmount”
dpkg -l libpam-usb >/dev/null || PROGRAMAS_A_INSTALAR=$PROGRAMAS_A_INSTALAR+” libpam-usb”
dpkg -l pamusb-tools >/dev/null || PROGRAMAS_A_INSTALAR=$PROGRAMAS_A_INSTALAR+” pamusb-tools”
dpkg -l libpam-ssh >/dev/null || PROGRAMAS_A_INSTALAR=$PROGRAMAS_A_INSTALAR+” libpam-ssh”

DIALOGO=$(which dialog)
[ $(echo $DIALOGO|wc -c) -gt 2 ] || PROGRAMAS_A_INSTALAR=$PROGRAMAS_A_INSTALAR=” dialog”

[ $PROGRAMAS_A_INSTALAR = "" ] || apt-get install -y $PROGRAMAS_A_INSTALAR

#-=-=-=-=-=-=-=-=-= INICIO DA CONFIGURACAO =-=-=-=-=-=-=-=-=-=-=-#

DIALOGO=$(which dialog)
$DIALOGO –stdout –msgbox “Insira um pendrive e pressione ENTER” 5 40
sleep 4

NOME2DEVICE=”"

#Essa entrada com dialog pega um nome para o dispositivo que esta conectado na usb. Serve apenas para cadastra-lo
#Pode-se cadastrar mais de 1 dispositivo no sistema.
while [ $(echo $NOME2DEVICE|wc -c) -lt 2 ]; do
NOME2DEVICE=`$DIALOGO –stdout –no-cancel –inputbox “Insira um nome para o dispositvo” 8 40`
done
echo y|pamusb-conf –add-device $NOME2DEVICE

#tambem pode-se configurar N usuarios
echo y|pamusb-conf –add-user root

echo “auth sufficient pam_usb.so log_file=/var/log/pam_usb.log” >/etc/pam.d/commom-auth
echo “auth requisite pam_unix.so nullok_secure” >>/etc/pam.d/commom-auth

#Com a linha abaixo comentada, o que nao autenticar pelo pendrive podera se autenticar por senha
#Isso foi necessario devido ao acesso remoto por ssh, mas nao havendo necessidade de conexao ssh, pode ser descomentada.
echo “#auth requisite pam_deny.so” >> /etc/pam.d/commom-auth
echo “auth optional pam_smbpass.so migrate” >> /etc/pam.d/commom-auth
echo “auth optional pam_ssh.so use_first_pass” >>/etc/pam.d/commom-auth

dialog –stdout –msgbox “O sistema ira reiniciar agora” 5 40

reboot

-=-=-=-=-=-=-=-=
Depois disso, basta digitar o nome do usuario no prompt e dar enter. Se for usuário cadastrado e o pendrive (também cadastrado) estiver conectado, o login sucederá sem pedir senha.
O problema de deixar o pam_deny.so comentado é que, caso esteja sem pendrive, será possível efetuar login digitando a senha duas vezes. Ai vai da necessidade.

[ATUALIZADO]
Invés de mexer no commom-auth, basta jogar essas linhas no arquivo login logo abaixo do include de commom-auth (esse arquivo também está dentro de /etc/pam.d), mas dessa vez pode-se deixar descomentado a linha do pam_deny.so.
Essa dica é bastante básica, mas servirá como referência para futuras implementações.
Introdução e recomendação
A criptografia pode ser feita em uma partição ou arquivo de bloco. É recomendável que seja feito em arquivo de blocos que posteriormente será montado como uma partição, utilizando o dispositivo de sistema /dev/loop0, não tendo nenhuma representação significativa no I/O.

Configuração
Inicialmente deve-se carregar os módulos blowfish e cryptoloop. Esses módulos deverão ser carregados pelo sistema em tempo de boot. Para isso, deve-se adicioná-los em /etc/modules.conf

Sempre deve-se aplicar a criptografia sobre o alvo, seja disco ou arquivo de blocos:
losetup -e blowfish /dev/loop0 [/dev/ | arquivo_de_blocos]

Se for utilizado arquivo de blocos, deve-se primeiramente criá-lo (supondo um arquivo de 512MB):
dd if=dev/zero of=/media/cripto/cripto.data count=1048576 bs=512

O passo seguinte a qualquer um dos processos descritos acima é a formatação do alvo:
mkreiserfs /dev/loop0

Observe que a formatação aponta para o dispositivo de loop e não para o alvo diretamente.

Por fim, basta montar e copiar os dados (que devem ser estáticos para facilitar a restauração a partir de um backup do arquivo de blocos):
mount -t reiserfs /dev/loop0

Para desmontar:
umount
losetup -d /dev/loop0

Vale lembrar que nenhum sistema está seguro se houver acesso físico, mas se a montagem do alvo for feita manualmente, as chances de acesso aos dados diminuem exponencialmente.

Nenhum comentário:

Postar um comentário