User Authentification with perl/cgi

Salvador Ortiz Garcia sog en msg.com.mx
Mie Ago 30 04:09:18 CDT 2000


On Tue, 29 Aug 2000, 'Aztec Eagle' Turbo wrote:

> ¡Saludos!
> 
> Andamos por acá haciendo un sistemilla con perl/cgi/postgress y
> para poder liberarlo a los usuarios necesitamos identificar al
> usuario mediante el esquema clásico de nombre y contraseña (todo
> por no decir login/password).
> 
> Con getpwnam() podemos verificar el login, pero ¿cómo podemos
> verificar la contraseña? Usamos shadow y md5 y como es de
> esperarse el CGI corre como usuario normal (uid=gid)!=root.
> 
> ¿Alguien sabe como verificar esto? ¿Dónde debemos leer? Estoy
> seguro que se debe poder (todo se puede en Perl) pero NPI de por
> dónde empezar.

No existe forma de que un proceso euid!=root tenga acceso _directo_ al
hash de la contraseña (aka password encriptado) en un sistema con shadow,
pues ese es precisamente el objetivo de usar shadow passwords,
la unica forma posible es mediante un wrapper setuid.

Ahora bien, hacer un wrapper robusto, general y seguro no es de enchilame
otra gorda.

Para empezar, perl no es buena opción pues sus mecanismos setuid dejan
mucho que desear (snif, snif).

De plano mejor en C, lo más general es usar PAM y para que no tengas que
inventar el hilo negro, en /usr/doc/pam-0.72/html/pam_appl-8.html
encuentras un programita que hace la talacha.

Compilalo con:

$ gcc -o check_user check_user.c -lpam -lpam_misc

E instálalo, como root, con:

# mv check_user /usr/bin
# chown root /usr/bin/check_user
# chmod u+s /usr/bin/check_user

Agregate un archivo  /etc/pam.d/check_user:

#%PAM-1.0
auth        required    /lib/security/pam_pwdb.so nodelay
account     required    /lib/security/pam_pwdb.so 

Ahora si, en perl puedes hacer cosas como:

die "Requiero un usuario\n" unless($user);
open(CHECK, "|/usr/bin/check_user $user >/dev/null 2>&1") 
    or die "Can't use wrapper\n";
print CHECK $password; # Envia password
unless(close(CHECK)) { # close devuelve el estatus de salida del pipe
    print "Fail\n";
} else {
    print "Success\n";
}

En donde $user y $password los obtienes por el metodo que quieras.

Saludos

Salvador Ortiz

-- 
El conocimiento incluído es totalmente regalado y como Linux, libre.
--------------------------------------------------------------------------

---------------------------------------------------------
para salir de la lista, enviar un mensaje con las palabras
"unsubscribe ayuda" en el cuerpo a majordomo en linux.org.mx



Más información sobre la lista de distribución Ayuda