Visite também: BR-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]

Tutoriais/Adm/web passwd expect

De UnderLinux Wiki

Tabela de conteúdo

NAO PUBLICAR, EDITANDO...

NAO PUBLICAR, EDITANDO

Introdução

Webmin, touchpass, perl-based-script, cgi-script...

Não são pucas as opções de webadmins pra alteração de senha de usuários do sistema linux, MAS, a menos que voce seja um expert em cgi ou perl, e resolva revisar todo o codigo pra "garantir que suas senhas nao estão sendo enviadas para algum crack mal intencionado", você pode acabar ficando de mãos atadas....

Na realidade esse tutorial tem o intuito de prover uma maneira extremamente simples, e não tão insegura de prover a facilidade da troca de senha de usuários do sistema, através da web.

Seguro?

Esse tutorial vai passar por shell-scripts e sudos... Óbviamente que a coisa mais recomendada do mundo seria o desuso dessa facilidade, obviamente pelo excesso de privilégios que ela demanda, mas o caso permite algumas excessões, até porque, serão tomados algumas precauções adicionais para manter a margem aceitável de insegurança.

Expect

Aí vamos ao personagem principal da história...

Instalação

Disponível na maioria das distros, com um simples apt-get isntall expect ou up2date, se consegue o pacote plenamente funcional.

O que ele faz?

Esse binário, em termos sumários (e sinteticamente), "lê" a stdin (entrada padrão) e conforme a leitura, pode prover uma resposta diretamente na linha de comando.

Hein?

Imaginem a seguinte cena:

#passwd fulanodetal
Changing password for fulanodetal
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

todo mundo já deve ter tido a idéia de dar um sudo root passwd user, em um script web para poder alterar a senha... mas, como o parâmetro --stdin em muitas distros é desativado, e essa possibilidade por sí permiria facilmente a alteração da senha do root, fica descartada.

Então sobra o método normal, mas como fazer com que o script "responda" as perguntas que lhe sao feitas? Senha atual, depois senha nova, e repita a senha nova, tudo isso aguardando o prompt solicitar?

Aí entra o expect... ele "expera" (essa foi horrível, admito!) a entrada da string "current" por exemplo, pra inserir a senha atual, depois espera o "Enter new" para inserir a senha nova, e por fim, espera o "Retype" para inserir novamente a senha nova! Bingo! temos uma luz no fim do túnel!

Shell-script

Esse brinquedinho vai fazer todo o "trabalho sujo", vai ser ele a peça chave que vai integrar o php com o expect e passwd:

#!/bin/sh
# \
#ao menos impedir que altere-se a senha do root, direto aqui,
#demais users do sistema, serão limitados no próprio script php
if [ "$1" == "root" ] ;
then
  exit 1
fi
exec expect -f "$0" ${1+"$@"}
set password [lindex $argv 1]
spawn passwd [lindex $argv 0]
sleep 1
expect "assword:"
send "$password\r"
expect "assword:"
send "$password\r"
expect eof

ele vai receber (via parâmetro) do php o user e a senha nova

Preparando o terreno

Agora vem os pré-requisitos para que tudo funcione bem...

SUDOERS

Infelizmente, teremos que nos valer dessa "des"-vantagem...

#visudo

e coloque a seguinte linha

www-data ALL=NOPASSWD: /var/www/senha/senha

Script PHP

Precauções

Autor

--Navarini 15:31, 4 Abril 2007 (BRT)