Página 1 de 1

Problema con módulo Authen::Simple::PAM

NotaPublicado: 2012-06-23 00:47 @074
por palafox87
¡Hola de nuevo!

Les comento que estoy trabajando en un sencillo script de Perl que permita a un usuario de un equipo montado en Linux (Ubuntu 11.10) registrarse con la cuenta que ya tiene en dicho equipo. Todo esto desde el navegador web.

El raro problema que tengo es que en la mañana funcionaba perfectamente, dejé el equipo apagado, regresé en la tarde y cual sería mi sorpresa que al registrarme ¡el script me manda error de login!

Revisé todo el pequeño script y todo está bien, cuando lo ejecuto desde la línea de comandos funcionó bien.

¿Qué creen que pueda estar pasando?

El archivo ya cuenta con los permisos necesarios para su ejecución.

Aquí el código del script:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use CGI qw(:all);
  7. use Authen::Simple::PAM;
  8.  
  9. my $cgi = new CGI;
  10.  
  11. my $pam = Authen::Simple::PAM->new(
  12.         service => 'login'
  13.       );
  14.  
  15. print $cgi->header();
  16.  
  17.  
  18. if( $pam->authenticate( "user", "123456" ) ) {
  19.             print "OK!";
  20. } else {
  21.             print "Error! intenta nuevamente...";
  22. }
  23.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


De antemano, ¡¡muchas gracias!!

Saludos.

Re: Problema con módulo Authen::Simple::PAM

NotaPublicado: 2012-06-23 07:11 @341
por explorer
Si el programa ha funcionado, entonces el programa está bien.

Quizás ha cambiado alguna de las condiciones externas... Al reiniciar la máquina, quizás el usuario que ejecuta el servidor web/cgi es distinto. O falta por arrancar un servicio. ¿Ha desaparecido el usuario? ¿El PAM está conectado a una base de datos y ésta no ha arrancado?

¿No sale nada en el registro de actividad del servidor web (error.log)?

Re: Problema con módulo Authen::Simple::PAM

NotaPublicado: 2012-06-23 11:27 @519
por palafox87
Hola explorer, gusto en saludarte.

No, el módulo PAM no está conectado a una BD, en la documentación del módulo se menciona que lo que hace el módulo es leer el archivo "passwd".

Por otro lado, en el archivo error.log no hay ningún error.

Te comento que el archivo se lo asigné al usuario de Apache (en mi caso www-data), ya lo cambié a root, pero sigue igual.

¡Saludos!

Re: Problema con módulo Authen::Simple::PAM

NotaPublicado: 2012-06-23 12:38 @568
por explorer
Ejecútalo desde la línea de comandos, a ver qué saca.

Re: Problema con módulo Authen::Simple::PAM

NotaPublicado: 2012-06-23 19:01 @834
por palafox87
Gracias explorer.

Desde la línea de comandos funciona perfectamente.

Saludos.

Re: Problema con módulo Authen::Simple::PAM

NotaPublicado: 2012-06-24 01:58 @123
por palafox87
explorer:

Te comento que después de muchos intentos fallidos por hacer funcionar el módulo en entorno web, me he desesperado y he intentado otra forma (con el mismo módulo) pero que ahora sí funciona. Te explico:

Sabiendo que el script funciona desde la línea de comandos he separado en dos archivos, el login:

login_mod.pl: Este archivo hace el login (este archivo le pertenece a root):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Authen::Simple::PAM;
  2.  
  3. my $pam = Authen::Simple::PAM->new(
  4.                 service => 'login'
  5.                 );
  6.  
  7. my $user = $ARGV[0];
  8. my $pass = $ARGV[1];
  9.  
  10.    if ( $pam->authenticate($user,$pass ) ) {
  11.         exit 0;
  12.     }
  13.     else
  14.     {
  15.         exit 1;
  16. }
  17.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



login.cgi: Este archivo será el encargado de recibir los parámetros desde el formulario (este archivo le pertenece al usuario de apache, www-data):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use CGI qw(:all);
  2.  
  3. my $cgi = new CGI;
  4. print $cgi->header();
  5.  
  6. my $login_mod = "./login_mod.pl";
  7.  
  8. #Ejecuto el script que hace login
  9. system qq(sudo $login_mod 'user' '123456');
  10.  
  11. #Capturo su salida    
  12. my $resultado = $? >> 8;
  13.  
  14. if($resultado == 0){
  15.   print "OK!";
  16. }else{
  17.   print "Error!";
  18. }
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pensándolo bien, este método es más seguro, ya que me permite más control sobre el script del login debido a que éste mismo se debe ejecutar con privilegios de super-usuario, mismos que puedo controlar con el archivo sudoers como te lo comenté en un post anterior: problema-para-ejecutar-script-en-perl-via-web-t7169.html

Saludos y de nuevo, ¡muchas gracias, explorer!