autenticação pamusb em 16.04

1

Existe alguma chance de instalar o Pamusb para autenticação externa por USB ou SDcard no Ubuntu 16.04? Parece que não há mais pamusb para esta versão LTS!

Por favor, informe ou recomende se houver alternativas. Muito obrigado!

    
por Richard Waneyvin 10.05.2016 / 19:17

1 resposta

0

Aviso de isenção

Este não é um módulo PAM. Tudo o que realmente faz é automatizar a digitação da senha e pressionar enter. Como tal você deve estar realmente atento quando você conecta um stick USB. Sua senha será digitada em qualquer aplicativo que tenha foco e, em seguida, a tecla enter será enviada. Isso pode ser muito ruim se, digamos, a janela ativa for um cliente de bate-papo. Esses scripts são disponibilizados como estão e, antes da implementação, você provavelmente deve adicionar medidas extras de segurança. Por exemplo, uma medida de segurança que eu realmente uso e que não está implementada aqui é gravar a senha criptografada no espaço não utilizado antes da primeira partição no meu pen drive USB (com dd). Talvez verificar se estamos em uma tela de login seria outra medida de segurança que deveria ser implementada. Use isso a seu próprio risco! Ao usar ou ajustar qualquer informação / código fornecido abaixo, você assume toda a responsabilidade de proteger sua própria implementação.

O Hack

Eu enfrentei esse mesmo problema e criei minha própria solução workaround . Eu estou usando isso no Ubuntu 16.04 com lightdm (que é o padrão). Ele irá inserir as credenciais A QUALQUER MOMENTO que uma "chave" USB for inserida, portanto tenha CUIDADO ao conectar seu pendrive USB quando a tela não estiver bloqueada!

Como eu fiz isso funcionar ...

Quando um dispositivo USB é autorizado a ser usado para autenticação, várias informações do dispositivo USB são usadas como senha, que é usada para criptografar sua senha. Essa senha criptografada é armazenada em algum lugar no computador.

Em seguida, uma regra do udev é escrita para que os dispositivos de armazenamento USB sejam adicionados ao sistema. Quando um dispositivo de armazenamento USB é adicionado, o caminho do dispositivo é gravado em um canal nomeado que é assistido por um script auxiliar.

Por fim, o script auxiliar que lê o pipe nomeado verifica se o USB inserido tem uma entrada de senha criptografada associada. Em caso afirmativo, a senha criptografada é descriptografada e digitada automaticamente sempre que o foco é seguido pela chave de retorno. É importante que o script auxiliar seja separado do script do udev porque o escopo no qual o script do udev é executado nos impede de poder usar o xdotool conforme necessário.

Os scripts

Insira o USB que você deseja usar para efetuar login. Copie o seguinte script em um arquivo vazio e execute * uma vez: * Esteja ciente de que este script criará o caminho / etc / usbauth e instalará o xdotool em seu sistema.

#!/bin/bash
# This is the a script for authorizing USB devices as logon devices

# run as root
if [ "$(whoami)" != root ]; then
    sudo $0 $@
    exit
fi

# Install the xdotool if it's not already installed
(
    [ "$(which xdotool)" == "" ] && apt install -y xdotool
) &

encryptedPasswordStorage="/etc/usbauth" # path where encrypted passwords are stored

# if path does not exist create it and make sure permissions are set correctly
[ ! -d "$encryptedPasswordStorage" ] && mkdir -p "$encryptedPasswordStorage"
chown root:root $encryptedPasswordStorage
chmod 700 $encryptedPasswordStorage

# Get a list of attached USB storage devices
usbDevices=$(ls -l /dev/disk/by-uuid/ | grep -oP "/sd[a-z][0-9]?" | sort | awk '{print "/dev" $1}' | while read part; do [ "$(udevadm info -q all -n $part | grep "E: ID_BUS" | cut -f2 -d=)" == "usb" ] && echo $part; done)
# Iterate over this list and display partitions
while read device
do
    info="$(udevadm info -q all -n $device)"
    vendor=$(echo "$info" | grep "E: ID_VENDOR_ID=" | cut -f2 -d=)
    model=$(echo "$info" | grep "E: ID_MODEL_ID=" | cut -f2 -d=)
    sn=$(echo "$info" | grep "E: ID_SERIAL_SHORT=" | cut -f2 -d=)
    uuid=$(echo "$info" | grep "E: ID_FS_UUID=" | cut -f2 -d=)
    label=$(echo "$info" | grep "E: ID_FS_LABEL=" | cut -f2 -d=)
    key="$vendor$model$sn$uuid"
    checksum=$(echo -n "$key" | sha256sum | cut -f1 -d' ')

    keyList[$[++i]]="$key"  # used as an encryption key for encrypting account password
    labelList[$i]="$label"
    checksumList[$i]="$checksum"

    printf "%5s %-9s %-15s %s\n" "[$i]" $device "$label" $sn

done<<<"$usbDevices"

# Ask user which attached device should be used for authentication
echo ""
read -p "Enter the number of the device to authorize: " selection
read -sp "Enter your login password: " pwd
key=${keyList[$selection]}
encpwd=$(gpg2 --output - -a -c --passphrase "$key" --batch --cipher-algo AES256 --digest-algo SHA512<<< "$pwd")

# Save the encrypted password to the system
encPwdFile="$encryptedPasswordStorage/${labelList[$selection]}_${checksumList[$selection]}"
echo -e "$encpwd" > "$encPwdFile"
chmod 600 "$encPwdFile"
echo ""

* De agora em diante, crie / edite todos os arquivos como root ou com sudo *

Em seguida, crie o arquivo /etc/usbauth/udev.sh com o seguinte conteúdo

#!/bin/bash
# This script watches for USB storage devices. As they are plugged in, this script
# sends the path of these devices to a named pipe that is watched by our helper
# script.
# This script is intended to be called by udev. Add the following rule
#   file path: /etc/udev/rules.d/80-USB.rules
#   file contents: ACTION=="add",KERNEL=="sd[a-z]*",RUN+="[path to this script]"

encryptedPasswordStorage="/etc/usbauth" # path where encrypted passwords are stored
namedPipe="/tmp/usb-auth"   # named pipe used for notification of added USB storage devices

[ -e "$namedPipe" ] && echo "$DEVNAME" > "$namedPipe"

Precisamos criar uma regra do udev também. Crie /etc/udev/rules.d/80-USB.rules com o seguinte conteúdo.

ACTION=="add",KERNEL=="sd[a-z]*",RUN+="/etc/usbauth/udev.sh"

Agora, crie um último arquivo, /etc/usbauth/lightdm.sh com o seguinte conteúdo.

#!/bin/sh
# this is the helper script that reads devices that are added and automates typing
# the password if an authorized stick is plugged in.

(
encryptedPasswordStorage="/etc/usbauth" # path where encrypted passwords are stored
namedPipe="/tmp/usb-auth"   # named pipe used for notification of added USB storage devices
rm "$namedPipe"; mkfifo "$namedPipe"    # create the named pipe
while true;do   # this infinite loop helps to ensure that we're always watching for the next device
    while read device # when a device is read ...
    do
        # gather information about the device that was read
        info="$(udevadm info -q all -n $device)"
        vendor=$(echo "$info" | grep "E: ID_VENDOR_ID=" | cut -f2 -d=)
        model=$(echo "$info" | grep "E: ID_MODEL_ID=" | cut -f2 -d=)
        sn=$(echo "$info" | grep "E: ID_SERIAL_SHORT=" | cut -f2 -d=)
        uuid=$(echo "$info" | grep "E: ID_FS_UUID=" | cut -f2 -d=)
        key="$vendor$model$sn$uuid"
        checksum=$(echo -n "$key" | sha256sum | cut -f1 -d' ')

        # check to see if this device has an associted encrypted password file
        encpwdFile="$(find $encryptedPasswordStorage -type f | grep "$checksum")"
        echo "$key:checksum --> $encpwdFile" > /tmp/encfile

        # if it does, decrypt the password, type it on the screen and press [Enter]
        if [ -e "$encpwdFile" ]; then
            pwd=$(gpg2 -a -d --passphrase "$key" --batch --output - < $encpwdFile)
            echo "$pwd" > /tmp/pwd
            xdotool type "$pwd"
            sleep .5
            xdotool key Return
        fi
    done < "$namedPipe"
done
) &

Este script deve ser chamado quando o lightdm for iniciado. Para fazer isso, edite /usr/share/lightdm/lightdm.conf.d/50-unity-greeter.conf. Em [Seat:*] add

greeter-setup-script=/etc/usbauth/lightdm.sh

Então, por exemplo, meu arquivo /usr/share/lightdm/lightdm.conf.d/50-unity-greeter.conf parece

[Seat:*]
greeter-session=unity-greeter
greeter-setup-script=/etc/usbauth/lightdm.sh

Eu não criei um script para gerenciar dispositivos USB que foram adicionados, mas você encontrará todos eles listados em / etc / usbauth. Cada arquivo de senha criptografada nesta pasta começa com um nome de rótulo de partição seguido por um sublinhado e o hash sha256 da chave usada para criptografar a senha. A simples exclusão do arquivo de senha criptografada é suficiente para remover o USB como um dispositivo de autenticação.

Lembre-se de que, se você reformatar seu dispositivo de armazenamento USB, o UUID será alterado e você não poderá fazer login novamente com esse dispositivo até que você o adicione novamente como uma chave que pode ser executada simplesmente executando novamente primeiro script fornecido neste post. Eu incorporei o UUID porque muitos dos dispositivos de armazenamento baratos que saem da China atualmente não possuem o número de série configurado. Além disso, quando você está usando um cartão SD, vale a pena notar que o número de série que você vê vem do leitor de cartões SD na maioria dos sistemas atualmente. Portanto, se você estiver usando cartões SD, o número de série será o mesmo para todos os cartões SD que você monta, mesmo que os números de série dos cartões SD sejam realmente diferentes.

    
por b_laoshi 18.10.2016 / 05:17