Eu escrevi um script CGI Python que chama bash
comandos e precisa testar se há um login bem-sucedido no host.
Como escrevo um teste para isso?
Por exemplo, eu poderia criar um bash
script que teste uma determinada combinação de nome de usuário e senha em relação ao usuário registrado no host?
login
programa.Respostas:
Usar o PAM é a melhor solução. Você pode escrever um código C pequeno ou instalar o pacote python-pam e usar um script python que acompanha o pacote python-pam. Vejo
/usr/share/doc/python-pam/examples/pamtest.py
fonte
/usr/share/doc/packages/python-pam/examples/pamtest.py
O script pamtest.py pode ser usado para testar credenciais em sistemas usando PAM para autenticação, está incluído no pacote python-pam (que requer python) e, em algumas distribuições, o caminho completo é/usr/share/doc/python-pam/examples/pamtest.py
.A abordagem correta para testar se um usuário pode efetuar login é efetivamente fazer login como esse usuário.
Portanto, o que eu recomendo é usar o script CGI
expect
para executarsu
, passar uma senha e executar o comando que deve ser executado. Aqui está um rascunho de um script expect que faz exatamente isso (aviso: absolutamente não testado, e eu não sou fluente em esperar). Substitua o nome de usuário, senha e de comando (onde eu escrevibob
,swordfish
esomecommand
); não se esqueça de citar corretamente.Se você realmente não deseja executar o comando por meio de uma camada de
su
(por exemplo, porque o que você faz deve ser executado pelo próprio processo CGI), use expect para executar o comandotrue
e verifique se o status de retorno é 0.Outra abordagem seria usar o PAM diretamente no seu aplicativo, através da ligação do PAM ao Python .
fonte
su -c true bob && echo success
isso vergonha que su não aceitam senha como argumentosu
partir do script CGI e ele precisa de um terminal para funcionar./bin/true
seria suficiente.Para responder mais especificamente: "É possível criar um script bash que testará uma combinação de nome de usuário e senha específica contra o usuário registrado no host?"
Sim.
fonte
shadow
grupo, o que não é muito recomendado para um CGI: você precisaria de outra camada de escalonamento de privilégios. E você está assumindo um algoritmo de hash de senha específico (um suportado pelo openssl) e um local de armazenamento de senhas (/etc/shadow
em oposição a, por exemplo, NIS ou LDAP), que pode ou não ser o realmente usado para esse usuário em particular.Há uma solução PAM 'C', 'Python' citada aqui, deixe-me colocar a solução perl também :-)
Fonte: http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactively ?
fonte
Se você tiver acesso root e estiver usando senhas md5, e você apenas precisar comparar senhas, poderá usar o módulo perl Crypt :: PasswdMD5 . Pegue o MD5 Hash em / etc / shadow, retire os $ 1 $ e depois divida os $ restantes. Campo 1 = Sal, Campo 2 = texto criptografado. Em seguida, faça o hash da entrada de texto em seu CGI, compare com o texto criptografado e Bob é seu tio.
fonte
shadow
grupo, o que não é muito recomendado para um CGI: você precisaria de outra camada de escalonamento de privilégios. E você está assumindo um algoritmo de hash de senha específico (MD5 e não o bcrypt ou outro algoritmo recomendado) e o local de armazenamento da senha (/etc/shadow
em oposição a, por exemplo, NIS ou LDAP), que pode ou não ser o realmente usado para esse usuário em particular.Depois de alguma pesquisa, escrevi este programa em C que pode ser usado no script
Você o compila com:
Você pode usá-lo como
fonte
shadow
grupo, o que não é muito recomendado para um CGI: você precisaria de outra camada de escalonamento de privilégios. E você está assumindo um algoritmo de hash de senha específico (um suportado pelo openssl) e um local de armazenamento de senhas (/etc/shadow
em oposição a, por exemplo, NIS ou LDAP), que pode ou não ser o realmente usado para esse usuário em particular. Use o PAM, ele conhece seu trabalho.Como você mencionou que está usando CGI em python, provavelmente é apropriado supor que você esteja usando o Apache como seu servidor httpd. Nesse caso, deixe o processo de autenticação do seu programa no Apache e deixe apenas as pessoas autenticadas executarem seus scripts / programas cgi.
Existem amplos módulos que podem fazer autenticação para você no Apache, isso realmente depende do tipo de mecanismo de autenticação que você está procurando. A maneira que você citou na pergunta parece estar relacionada à autenticação da conta do host local com base nos arquivos / etc / passwd, shadow. Módulo que vem à minha pesquisa rápida sobre isso é
mod_auth_shadow
. A vantagem é que você está permitindo que alguém com autoridade (executando na porta de privilégio 80) autentique o usuário / senha para você e pode confiar nas informações autenticadas do usuário para executar os comandos em nome do usuário, se necessário.Bons links para começar:
http://adam.shand.net/archives/2008/apache_tips_and_tricks/#index5h2
http://mod-auth-shadow.sourceforge.net/
http://www.howtoforge.com/apache_mod_auth_shadow_debian_ubuntu
Outra abordagem é usar o módulo SuEXEc do Apache, que executa processos (programas cgi) em nome do usuário autenticado.
fonte
Este código usando PAM funcionou para mim:
fonte
A melhor coisa que você pode fazer, se precisar de um script para efetuar login em um host, é configurar uma chave ssh entre os hosts.
Link: http://pkeck.myweb.uga.edu/ssh/
Eu praticamente tirei isso da página
Primeiro, instale o OpenSSH em duas máquinas UNIX, com muita dificuldade. Isso funciona melhor usando chaves DSA e SSH2 por padrão, tanto quanto eu sei. Todos os outros HOWTOs que eu vi parecem lidar com chaves RSA e SSH1, e as instruções não surpreendentemente falham ao trabalhar com SSH2. Em cada máquina, digite ssh somemachine.example.com e faça uma conexão com sua senha normal. Isso criará um diretório .ssh no diretório inicial com as permissões adequadas. Na sua máquina principal, na qual você deseja que suas chaves secretas estejam (digamos muito), digite
Isso solicitará uma senha secreta. Se essa é sua chave de identidade principal, use uma boa senha. Se isso funcionar corretamente, você obterá dois arquivos chamados id_dsa e id_dsa.pub no seu diretório .ssh. Nota: é possível apenas pressionar a tecla Enter quando for solicitada uma senha, que fará uma tecla sem senha. Esta é uma Bad Idea ™ para uma chave de identidade, então não faça isso! Veja abaixo o uso de teclas sem senhas.
Copie o arquivo id_dsa.pub para o diretório .ssh do outro host com o nome author_keys2. Agora, o corpulento está pronto para aceitar sua chave ssh. Como saber quais teclas usar? O comando ssh-add fará isso. Para um teste, digite
Isso iniciará o ssh-agent, adicionará sua identidade padrão (solicitando sua senha) e gerará um shell bash. Nesse novo shell, você deve ser capaz de:
Você deve conseguir fazer login
fonte