[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [CipUX-Devel] LDAP-Auth Skript



Hallo Gerhard,

ich schrieb:

Ich denke, das kann ich dir noch besser bereitstellen ;)  natürlich für
 arktur und tjener lauffähig. Wenn es fertig ist, melde ich mich wieder.

Da ich nicht weiss, ob Anhänge abgeschnitten werden, habe ich den Quelltext des
Scripts "check-login" einfach in die Mail reinkopiert. Im Konfigurationsteil auf
'arktur' umstellen und deine LDAP-Base eintragen. Der Aufruf ist in der Hilfe ganz
am Ende des Scripts angegeben. Oder einfach "installieren" und "check-login --help"
aufrufen. Ich hoffe, du kommst so zurecht. Sonst bitte nachfragen.

Ich sehe (als Linux-Laie) folgende Probleme, die mit dieser Liste sicher
gelöst werden können:

1. Ich habe nicht getestet, ob das so auf einen 2. Server (IPFire) so funktioniert,
sondern habe nur auf einen delixs getestet. Ich hoffe einfach mal, dass der
Zugriff auf den LDAP auf einen anderen Rechner so erfolgt, wie ich es hier
angegeben habe.

2. Auf den IPFire muss natürlich Net::LDAP installiert sein. Wenn da keine
Pakete vorhanden sind und keine cpan-Shell auf IPFire existiert, hast da mit
diesem Script keine Chance. Aber zu dem Problem hatte dir ja Peter Müller
Unterstützung zugesagt.

3. Es werden dann diese Daten (Login/Passwort) im Klartext von dem IPFire zum Server
mit dem LDAP, also bei dir zum Arktur, übertragen. Das sollte schon mit SSL geschehen.
Weiss ich auch nicht wie das geht. Ich gehe davon aus, dass dann auch dieses Script
angepasst werden muss.

4. Dieses Script soll ja von der OpenVPN-Lösung auf IPFire aufgerufen werden.
Zumindest lese ich das so aus deiner Mail vom 18.12.2009 15:48. Ich kann mir
vorstellen, dass man da eine ganz bestimmte Syntax für den Aufruf angenommen hat.
Hier müßte das Script gegebenenfalls angepasst werden.

Wo ich dir helfen kann, helfe ich dir gerne, aber ohne die Unterstützung von
Christian Külker und Peter Müller (oder von anderen erfahrenen Entwicklern dieser
Liste) sehe ich, wie gerade angegeben, da schon noch einige größere Hürden.

Ich wünsche dir viel Erfolg.

Allen in dieser Liste wünsche ich einen schönen 4. Advent.

Mit freundlichen Grüßen
Hans-Dietrich

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#!/usr/bin/perl
use warnings;
use strict;

use Net::LDAP;
use Net::LDAP::Extension::WhoAmI;
use Getopt::Long;

# globale Variablen
my ($server, %server_addr, $ldap_base, %search_base, %param, $login,
    $ldap, $mesg, $entry, $dn);


##################### Konfigurationsteil ##############################

# ---- Server ---------------------------------------------
# da dieses Script fuer Arktur, Skolelinux und Delixs eingesetzt
# werden soll, ist hier als Erstes das Server-System anzugeben
# (derzeit) moegliche Werte sind 'arktur', 'tjener' und 'delixs'
$server = 'delixs';

# ---- Adresse --------------------------------------------
# um auf den LDAP auf einen anderen Rechner zugreifen zu koennen
# brauchen wir dessen IP oder dessen Namen. Hier sollte nur in
# Ausnahmefaellen etwas geaendert werden muessen
%server_addr = ('arktur'  => '192.168.0.1',
                'tjener'  => '10.0.2.2',
                'delixs'  => '10.100.0.1' );

# ---- LDAP-Base ------------------------------------------
# die LDAP-Base ist der Wert fuer BASE in der /etc/ldap/ldap.conf
# fuer arktur heisst der z.B. 'dc=erg,c=de' oder fuer den
# Delixs aus dem Entwicklerhandbuch 'dc=delixs-schule,dc=de'
# fuer Skolelinux ist die LDAP-Base immer 'dc=skole,dc=skolelinux,dc=no'
# dieser Wert ist fuer Arktur unbedingt anzupassen!!!
$ldap_base = 'dc=delixs-schule,dc=de';

################# Ende des Konfigurationsteil #########################


# die Suchbasis fuer die User-Accounts
%search_base = ('arktur'  => "o=SCHULE,$ldap_base",
                'tjener'  => "ou=People,dc=skole,dc=skolelinux,dc=no",
                'delixs'  => "ou=people,ou=accounts,$ldap_base" );


# Intialisierung der Variablen für die Parameter
%param =    ('user'               => undef,
             'pass'               => undef,
             'verbose'            => undef,
             'help'               => undef );

GetOptions(  'user|login|u=s'     => \$param{'user'},
             'pass|p=s'           => \$param{'pass'},
             'verbose|v'          => \$param{'verbose'},
             'help'               => \$param{'help'} );


# wenn help aufgerufen wurde, dann die Subroutine aufrufen
if (defined($param{'help'})) {
  &help;
}

# check nach leeren username oder [Aa]nonymous
if (defined($param{'user'})) {
  # dann wandeln wir fuer diese Kontrolle in Kleinbuchstaben
  $login = lc($param{'user'});
  if ($login eq '' or $login eq 'anonymous') {
    if ($param{'verbose'}) { print "Abbruch: Login leer oder anonymus!\n"};
    exit(1);
  }
}
else {
  if ($param{'verbose'}) { print "Abbruch: kein Login uebergeben!\n" };
  exit(1);
}

# check nach leeren passwort
unless (defined($param{'pass'}) or $param{'pass'} eq '') {
  if ($param{'verbose'}) { print "Abbruch: kein Passwort uebergeben!\n" };
  exit(1);
}


# der LDAP-Teil
$ldap = Net::LDAP->new($server_addr{$server}, version => 3) or die "Abbruch: $@";
$ldap->bind or die "Abbruch: konnte mich nicht mit dem LDAP verbinden.\n";

# wir suchen das Login
$mesg = $ldap->search(base   => $search_base{$server},
                      filter => "uid=$param{'user'}");
# wir trennen uns vom LDAP
$ldap->unbind;

# wenn das Login nicht gefunden, dann koennen wir abbrechen
if ($mesg->count == 0) {
  if ($param{'verbose'}) { print "Abbruch: Login nicht im LDAP gefunden!\n"};
  exit(1);     # Abbruch, weil Login nicht im LDAP gefunden
}
# ansonsten holen wir uns jetzt den DN
else {
  $entry = ($mesg->entries)[0];
  $dn    = $entry->dn;
}

# wir melden uns erneut am LDAP an, aber nun mit Passwort
$ldap = Net::LDAP->new($server_addr{$server}, version => 3) or die "Abbruch: $@";
$ldap->bind( $dn, password => $param{'pass'} )
  or die "Abbruch: konnte mich nicht mit dem LDAP verbinden.\n";

# jetzt erfolgt die "whoami"-Abfrage
$mesg = $ldap->who_am_i();

# wenn kein Ergebnis zurueckgeliefert wurde
if ($mesg->response() eq '') {
  if ($param{'verbose'}) { print "Abbruch: Login/Passwort nicht korrekt!\n"};
  exit(1);
}
# sonst
else {
  if ($param{'verbose'}) { print $mesg->response(),"\n"};
  exit(0);
}

$ldap->unbind;

###### Ende des eigentlichen Programms #########


# Wenn Parameter -h uebergeben wurde, dann Hilfe ausgegeben und beenden
sub help
{
   print "Dieses Script dient zu Verifikation von Login/Passwort.\n";
   print "Wenn die Daten korrekt sind, dann wird 0 zurueckgegeben, sonst 1 \n";
   print "Parameter: --verbose (-v), --help (-h), --user (-u), --pass (-p)\n";
   print "Hinweis: Die Reihenfolge der Parameter ist beliebig. \n";
   print "Aufruf: check-login  --help \n";
   print "oder    check-login  --user mmustermann  --pass geheim \n";
   print "oder    check-login  --user mmustermann  --pass geheim --verbose\n";

   exit (0);
}


__END__











Reply to: