Qual é a maneira correta de autenticar um usuário sem o PAM?

2

como minha pergunta relacionada não parece ter muito amor, aqui outra: Qual é a maneira correta de autenticar um usuário via prompt de nome de usuário / senha no Linux hoje em dia?

Em princípio, suponho que eu teria que obter o nome de usuário e senha, leia salt e hash do usuário correspondente de /etc/shadow . Eu calcularia o hash da senha fornecida e o sal armazenado e verificar se o resultado corresponde ao hash armazenado em /etc/shadow .

Normalmente, eu poderia simplesmente autenticar via PAM (por exemplo, pam_unix ), que faz tudo isso, mas meu aplicativo é um módulo PAM personalizado e não encontrei nenhum método para chamar um módulo PAM de outro. Se isso for possível de alguma forma, eu ficaria feliz em ir para esta solução.

A partir de agora, encontrei este link do tutorial realmente datado de 1996, quando, aparentemente, o suporte a sombras ainda não foi construído na libc. Menciona pw_auth e valid como funções auxiliares para autenticação. Eu tentei implantá-los em meu código e vincular com libshadow.a das shadow-tools, mas recebi erros de 'referência externa não resolvida' para pw_auth e valid . O código é algo como isto:

if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
     && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
    || !valid (passwd, pw)) {
    return (UPAP_AUTHNAK);
}

Eu não verifiquei isso ainda mais, mas de qualquer forma esta não é uma solução preferida, pois eu teria que atualizar meu código toda vez que os utilitários de sombra fossem atualizados.

Preferiria vincular-se a uma biblioteca (que não é PAM) que fornece autenticação contra /etc/shadow . Existe tal coisa e eu não a encontrei ainda? Ou alguma outra solução?

    
por Sonny O'Rullivan 14.11.2014 / 12:23

1 resposta

2

Você tem medo de uma atualização de shadow-utils é IMO injustificado. As rotinas descritas nesse HOWTO estão disponíveis nos meus sistemas Ubuntu 12.04 e Mint 17 sem instalar nada de especial.

A estrutura para ler as informações de /etc/shadow em um programa C pode ser encontrada em /usr/include/shadow.h e com man 5 shadow e as funções que você precisaria encontrar, por exemplo, uma entrada de senha de sombra pelo nome, conforme definido em /usr/include/shadow.h is getspnam , e que também obterá uma página man ( man getspnam ) descrevendo essa e todas as funções relacionadas.

Com base nisso, você deve conseguir a entrada de senha com hash para qualquer nome. A senha com hash deve ter vários tokens '$', corte de tudo após e incluindo o último '$' da senha com hash e apresentar como sal a crypt() , a versão glibc (de acordo com man 3 crypt ) deve ser capaz de lidar com os sais "estendidos" que indicam entradas SHA512 como são mais comuns hoje em dia.

    
por 14.11.2014 / 13:23