Autenticação PAM e acesso SSH com base nas informações do usuário armazenadas no sqlite3

2

Eu tenho um aplicativo que é executado em uma caixa Linux . O aplicativo armazena todas as informações do usuário (como - username , password , ssh-allowed , etc) em um banco de dados sqlite3 da seguinte forma.

username        password        ssh-allowed
admin           X               y   
regularuser     X               n   

Os usuários do aplicativo farão login em uma GUI para usar o aplicativo. Mas todos os usuários do aplicativo que têm ssh-allowed como y têm permissão para efetuar login na caixa Linux usando ssh . Outros usuários do aplicativo (com ssh-allowed como n ) não têm permissão para efetuar login na caixa Linux usando ssh .

Portanto, no caso acima, admin usuário terá permissão para ssh na caixa Linux , mas regularuser terá negado ssh acesso à caixa Linux .

Escreve a GUI para executar authentication usando PAM para informações de usuário armazenadas em sqlite , eu uso libpam -sqlite . Na verdade, eu o modifiquei para trabalhar com sqlite3 database e está disponível aqui .

Agora, para a pergunta: quando um usuário do aplicativo tenta efetuar login na caixa Linux , como posso executar authentication e decidir permitir ou negar ssh access com base no parâmetro ssh-allowed que é armazenado no banco de dados sqlite3 usando PAM (ou de qualquer outra forma)?

OBSERVAÇÃO: Todas as informações do usuário são armazenadas somente no banco de dados sqlite3 e NÃO nos arquivos /etc/passwd , /etc/shadow , /etc/group . IOW o aplicativo não tem direitos para adicionar / remover registros nos arquivos /etc .

NOTE2: Eu fiz a mesma pergunta em SO ; pensei que este é um fórum melhor para questões relacionadas ao Linux.

    
por Sangeeth Saravanaraj 12.02.2014 / 08:18

1 resposta

1

pam_exec

Acho que você pode fazer o que quiser usando o módulo PAM pam_exec . Os itens do PAM são passados para um script definido para ser executado como variáveis de ambiente. Aqui está um exemplo de script de notificação que mostra as variáveis sendo passadas:

Configuração

#!/bin/sh
[ "$PAM_TYPE" = "open_session" ] || exit 0
# echo "User: $PAM_USER"
# echo "Ruser: $PAM_RUSER"
# echo "Rhost: $PAM_RHOST"
# echo "Service: $PAM_SERVICE"
# echo "TTY: $PAM_TTY"

result=$(sqlite3 /path/to/file.db \
    "select ssh-allow from sometable where user = \"$PAM_USER\"")

if [ "$results" == "y" ]; then
  ...login...
else
  ...no login...
fi

Você cria uma regra do PAM correspondente como esta:

session    optional     pam_exec.so /usr/local/bin/checkssh-login

É possível criar um script que use essa abordagem para fazer uma pesquisa no arquivo de banco de dados sqlite usando o nome do usuário transmitido como $PAM_USER . Se esse usuário tiver permissão para entrar no SSH, o script poderá simplesmente ser acessado, caso contrário, poderá impedir que o usuário continue com sua tentativa de login.

Referências

por 13.02.2014 / 02:34