Ich versuche gerade in perl mit mod_auth_external einen Authenticator zu schreiben.
Mein Ziel ist es ein Script auszuführen wenn der Benutzer sich über Basic Auth anmeldet.
Es scheint zwar alles zu funktionieren aber einloggen kann ich mich leider trotzdem nicht.
Mir scheint es fast als ob die PAM Funktion nicht funktioniert wenn diese vom Apache aufgerufen wird.
Hier das Perl Script:
- Code: Select all
#!/usr/bin/perl
use Authen::PAM;
use POSIX qw(ttyname);
$service = "login";
$username = <STDIN>;
chomp $username;
$password = <STDIN>;
chomp $password;
$tty_name = ttyname(fileno(STDIN));
sub my_conv_func {
my @res;
while ( @_ ) {
my $code = shift;
my $msg = shift;
my $ans = "";
$ans = $username if ($code == PAM_PROMPT_ECHO_ON() );
$ans = $password if ($code == PAM_PROMPT_ECHO_OFF() );
push @res, (PAM_SUCCESS(),$ans);
}
push @res, PAM_SUCCESS();
return @res;
}
ref($pamh = new Authen::PAM($service, $username, \&my_conv_func)) ||
die "Error code $pamh during PAM init!";
$res = $pamh->pam_set_item(PAM_TTY(), $tty_name);
$res = $pamh->pam_authenticate;
#print $pamh->pam_strerror($res),"\n" unless $res == PAM_SUCCESS();
if( $res == 0){
exit 0;
}else {
exit 1;
}
und meine Apache Virtual Host conf:
- Code: Select all
<VirtualHost *:80>
DefineExternalAuth myauth pipe /home/user/perlAuth.pl
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews +ExecCGI
AllowOverride None
Order allow,deny
allow from all
AddHandler cgi-script .pl
AuthType Basic
AuthName "mein Auth Test"
AuthBasicProvider external
AuthExternal myauth
Require valid-user
</Directory>
</VirtualHost>
In der Apache error log steht folgendes:
- Code: Select all
[Fri Feb 07 00:16:14 2014] [error] [client 127.0.0.1] AuthExtern myauth [/home/user/perlAuth.pl]: Failed (1) for user user1
[Fri Feb 07 00:16:14 2014] [error] [client 127.0.0.1] user user1: authentication failure for "/": Password Mismatch
Es würde wahrscheinlich besser funktionieren wenn das Prog in C geschrieben wäre aber dafür reichen meine C Kenntnisse nicht aus.
Getestet habe ich das Script mit:
./perlAuth.pl; echo $?
Wenn ich einen validen User und Pass eingebe bekomme ich eine 0 zurück, ansonsten eine 1.
Wenn ich "exit 0" an den anfang des Scripts schreibe klappt auch die Authentifizierung.
Also muss es wohl am PAM liegen.
Wäre super wenn noch jemand eine Idee hätte... andere Lösungsvorschläge werden auch gerne entgegen genommen.
Grüße,
Kodak