Verificação do usuário

1

Suponha que eu tenha escrito um executável root setuid e quero que ele verifique se o usuário não é um script pedindo ao usuário que forneça sua senha (concedido, os usuários podem salvar sua senha e usá-la em um script, mas isso não me preocupa).

Qual seria uma boa maneira de fazer isso? Quanto mais portátil, melhor.

    
por PSkocik 03.08.2015 / 14:53

2 respostas

3

A maioria dos sistemas Unix modernos usam o PAM para lidar com a autenticação. O módulo pam_unix é aquele que faz autenticação de senha em relação a /etc/password e /etc/shadow .

No entanto, você não deve reinventar a roda. Pedir a senha do usuário e executá-la como root é uma configuração básica do sudo , a maneira padrão para elevar os privilégios. Observe que elevar corretamente os privilégios é complicado: você se lembra de limpar todas as variáveis de ambiente que poderiam afetar seu programa? Sudo se esforça para fazê-lo com segurança.

Para permitir que o usuário alice execute /usr/local/bin/myprogram como root com qualquer argumento de sua escolha após digitar sua senha, use a seguinte linha no arquivo sudoers (o arquivo de configuração sudo):

alice ALL = (root) /usr/local/bin/myprogram

Para editar o arquivo sudoers , execute o comando visudo .

Alice terá que executar sudo myprogram . Se você quiser que ela seja capaz de digitar apenas o nome do programa, oculte-o em um script de wrapper. Mas observe que Alice pode preferir executar algo como gksudo myprogram para obter um prompt da GUI.

Muitas variações são possíveis, incluindo proibir o chamador de passar argumentos:

alice ALL = (root) /usr/local/bin/myprogram ""

ou aplicando a entrada a um grupo:

%mygroup ALL = (root) /usr/local/bin/myprogram

Se o seu programa precisar saber quem o invocou, o sudo o disponibilizará nas variáveis de ambiente SUDO_UID e SUDO_USER .

    
por 04.08.2015 / 02:59
0

Eu estava procurando por algo assim

(bash):

hash=$(sudo cat /etc/shadow |grep "^$USER:" |cut -d: -f2) 
cmphash=$(mkpasswd -m sha-512 -S "$(echo "$hash" | cut -d '$' -f3)")
cmp <(echo "$hash") <(echo "$cmphash") && echo "Correct password!"

Isso funciona, mas codifica o método hash que de alguma forma identificou por o número em echo "$hash" | cut -d '$' -f2 , que é 6 neste caso. Eu ainda tenho que descobrir como mapear o número para o método de hash.

    
por 04.08.2015 / 03:09