From marek.rouchal at intel.com Mon Oct 1 02:00:53 2012 From: marek.rouchal at intel.com (Rouchal, Marek) Date: Mon, 1 Oct 2012 09:00:53 +0000 Subject: [Munich-pm] Frage zu HTTP, NTLM, LDAP Message-ID: Hallo Freunde, ich habe heute mal eine Frage zum Thema Authenti(fi|)zierung... folgendes Szenario: Ich moechte einen einfachen Perl-basierten HTTP-Server bereitstellen (HTTP::Deamon? oder gibt's was besseres?), welcher allerdings eine halbwegs sichere Zugriffsbeschraenkung haben sollte. Da wir hier alle Win-Kisten haben, und den InternetExplorer benutzen "duerfen", habe ich an NTLM gedacht... etwa so: - der HTTP-Server besteht auf NTLM (erste Response: - der Client antwortet mit z.B. "Authorization: NTLM TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==" -- soweit bin ich schon gekommen, nun aber fehlt mir foldendes -- - der Server interpretiert diese Response, und checkt die Credentials gegen LDAP(?), Samba, ... wie auch immer, jedenfalls gegen die zentrale User-DB - der Server schickt im OK-Fall den angeforderten Inhalt, ansonsten eine hoefliche Ablehnung ;-) Hat jemand von Euch einen Hinweis, wo ich mich weiter durchkaempfen kann? Das Prinzip ist hier einigermassen erklaert: http://search.cpan.org/~bobtfish/Authen-NTLM-HTTP-0.33/lib/Authen/NTLM/HTTP.pm ... aber so ganz blicke ich noch nicht durch... Vielen Dank & Gruss, Marek -------------- next part -------------- An HTML attachment was scrubbed... URL: From Harald.Joerg at arcor.de Thu Oct 4 11:05:17 2012 From: Harald.Joerg at arcor.de (Harald =?utf-8?Q?J=C3=B6rg?=) Date: Thu, 04 Oct 2012 20:05:17 +0200 Subject: [Munich-pm] Frage zu HTTP, NTLM, LDAP In-Reply-To: (Marek Rouchal's message of "Mon, 1 Oct 2012 09:00:53 +0000") References: Message-ID: <87d30yyuxu.fsf@arcor.de> Hallo Marek, Du schreibst: > ich habe heute mal eine Frage zum Thema Authenti(fi|)zierung? > folgendes Szenario: Ich moechte einen einfachen Perl-basierten > HTTP-Server bereitstellen (HTTP::Deamon? oder gibt?s was besseres?), Für "einfach" gibt's HTTP::Server::Simple. Dem muss man threading/forking beibringen, aber das ist bei HTTP::Daemon genauso. > welcher allerdings eine halbwegs sichere Zugriffsbeschraenkung haben > sollte. Da wir hier alle Win-Kisten haben, und den InternetExplorer > benutzen ?duerfen?, habe ich an NTLM gedacht? etwa so: > > * der HTTP-Server besteht auf NTLM (erste Response: > * der Client antwortet mit z.B. ?Authorization: NTLM > TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==? > -- soweit bin ich schon gekommen, nun aber fehlt mir foldendes -- > * der Server interpretiert diese Response, und checkt die > Credentials gegen LDAP(?), Samba, ? wie auch immer, jedenfalls > gegen die zentrale User-DB Tja, wie dieses Protokoll in der reinen Windows-Welt funktioniert, weiß ich nicht. Ich würde aber eher gegen LDAP oder Samba wetten. Ich habe mal ein bisschen in Apache2::AuthenNTLM (sponsored by Siemens!) geblättert, das ist ein Perl-Modul, der sich in einen Apache HTTPD einklinken läßt, um NTLM-Authentisierung zu machen. Der ist sieben Jahre alt, sieht recht gruselig aus und "bedient" sich tatsächlich einer Samba-Authentisierung beim Domain Controller (via Authen::Smb). Ob und wie man den sinnvoll in einen eigenen HTTP-Server einhängen kann, traue ich mich nicht zu bewerten. > * der Server schickt im OK-Fall den angeforderten Inhalt, ansonsten eine > hoefliche Ablehnung ;-) > > Hat jemand von Euch einen Hinweis, wo ich mich weiter durchkaempfen kann? > Das Prinzip ist hier einigermassen erklaert: http://search.cpan.org/~bobtfish/ > Authen-NTLM-HTTP-0.33/lib/Authen/NTLM/HTTP.pm > ? aber so ganz blicke ich noch nicht durch? Dein Link beschreibt die Sache ja auch nur zwischen dem Client und dem Webserver und nicht den Teil, der zwischen Webserver und DC abläuft. Das Protokoll ist ja inwischen veröffentlicht (http://msdn.microsoft.com/en-us/library/cc236621), aber auch da habe ich nur den Teil zwischen dem Client und dem Server gefunden :( Ich gebe ja zu, dass ich NTLM nicht mag (da bin ich mir übrigens auch mit Microsoft einig). Wenn Du also lieber einen ganz anderen, aber auch nicht ganz einfachen Kampf führen willst, könntest Du die Negotiate-Authentisierung mit Kerberos verwenden. Das klappt auch in einer reinen Windows-Welt, und da kenne ich mich technisch einigermaßen aus. Ich habe sogar mal den Server-Teil, den Du brauchst, programmiert... allerdings in C, und für BS2000 mit ISO-TSAP (RFC 1006). Mit Kerberos geht das im Prinzip so: Der HTTP-Server verlangt "Negotiate" (RFC 4559), der Client (IE, Firefox, libwww-perl) kann das und fordert beim Domain Controller ein Ticket an. Das schickt er dem Server, und der kann es ohne eigene Kommunikation mit dem DC auswerten. Wenn Du Interesse hast, schicke ich längliche Details :) -- Cheers, haj From marek.rouchal at intel.com Fri Oct 5 02:47:17 2012 From: marek.rouchal at intel.com (Rouchal, Marek) Date: Fri, 5 Oct 2012 09:47:17 +0000 Subject: [Munich-pm] Frage zu HTTP, NTLM, LDAP In-Reply-To: <87d30yyuxu.fsf@arcor.de> References: <87d30yyuxu.fsf@arcor.de> Message-ID: Hallo Harald, vielen Dank fuer Deine Kommentare - spaetestens jetzt ist mir klar, dass ich diese Idee (NTLM) mal lieber stecken lasse... habe HTTP::Daemon::SSL zum Laufen bekommen, und da kann ich (einigermassen) guten Gewissens auch Basic auth machen - und das gegen LDAP checken. Funktioniert prima - anbei der Code, habe nur die Firmen-Spezifka geloescht. Falls noch jemandem eine gute Idee dazu einfaellt - nur her damit :-) Gruss, Marek #!/usr/bin/perl -w use strict; use warnings; use HTTP::Daemon::SSL; use HTTP::Status; use MIME::Base64 qw(decode_base64); use Net::Domain qw(hostfqdn); use Log::Log4perl qw(:easy); Log::Log4perl->easy_init($DEBUG); # Authen::Simple::LDAP uses this use Authen::Simple::LDAP; my $server = HTTP::Daemon::SSL->new( LocalAddr => hostfqdn(), LocalPort => 8080, ) or die; print "Contact URL: ", $server->url, "\n"; while (my $connection = $server->accept) { while (my $request = $connection->get_request) { print $request->as_string; my $auth = $request->header( 'Authorization' ); if($auth && $auth =~ /Basic\s+(\S+)/) { if(authenticate($1)) { $connection->send_response( make_response() ); print "SENT response\n\n"; next; } } $connection->send_response( make_challenge() ); print "SENT challenge\n\n"; } $connection->close; } my %credentials; # cache for credentials sub authenticate { my $cred = shift; if(defined $credentials{$cred}) { return $credentials{$cred}; } my $str = decode_base64($cred); if($str && $str =~ /^(\w+):(\S+)$/) { if(authen_ldap($1,$2)) { $credentials{$cred} = 1; # TODO check group membership here return 1; } else { $credentials{$cred} = 0; return 0; } } else { # cannot parse $credentials{$cred} = ''; return; } } sub authen_ldap { my ($user,$pw) = @_; my $ldap = Authen::Simple::LDAP->new( # from /etc/ldap.conf host => 'ldap.company.com', basedn => 'ou=...,dc=...', 'log' => Log::Log4perl->get_logger('Authen::Simple::LDAP'), #binddn => #bindpw => ); if ( $ldap->authenticate( $user, $pw ) ) { print "authen_ldap: $user OK\n"; return 1; } print "authen_ldap: $user NOT ok\n"; return 0; } sub make_challenge { print "make_challenge\n"; my $response = HTTP::Response->new( 401 => 'Unauthorized', [ 'WWW-Authenticate' => 'Basic realm=Dom' ], ); } sub make_response { print "make_response\n"; my $response = HTTP::Response->new( 200 => 'Ok', [ 'Content-Type' => 'text/plain' ], ); $response->content( "Hallo!\n" ); return $response; } -----Original Message----- From: Harald Jörg [mailto:Harald.Joerg at arcor.de] Sent: Thursday, October 04, 2012 8:05 PM To: Rouchal, Marek Cc: Perl Mongers Munich Subject: Re: [Munich-pm] Frage zu HTTP, NTLM, LDAP Hallo Marek, Du schreibst: > ich habe heute mal eine Frage zum Thema Authenti(fi|)zierung? > folgendes Szenario: Ich moechte einen einfachen Perl-basierten > HTTP-Server bereitstellen (HTTP::Deamon? oder gibt?s was besseres?), Für "einfach" gibt's HTTP::Server::Simple. Dem muss man threading/forking beibringen, aber das ist bei HTTP::Daemon genauso. > welcher allerdings eine halbwegs sichere Zugriffsbeschraenkung haben > sollte. Da wir hier alle Win-Kisten haben, und den InternetExplorer > benutzen ?duerfen?, habe ich an NTLM gedacht? etwa so: > > * der HTTP-Server besteht auf NTLM (erste Response: > * der Client antwortet mit z.B. ?Authorization: NTLM > TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==? > -- soweit bin ich schon gekommen, nun aber fehlt mir foldendes -- > * der Server interpretiert diese Response, und checkt die > Credentials gegen LDAP(?), Samba, ? wie auch immer, jedenfalls > gegen die zentrale User-DB Tja, wie dieses Protokoll in der reinen Windows-Welt funktioniert, weiß ich nicht. Ich würde aber eher gegen LDAP oder Samba wetten. Ich habe mal ein bisschen in Apache2::AuthenNTLM (sponsored by Siemens!) geblättert, das ist ein Perl-Modul, der sich in einen Apache HTTPD einklinken läßt, um NTLM-Authentisierung zu machen. Der ist sieben Jahre alt, sieht recht gruselig aus und "bedient" sich tatsächlich einer Samba-Authentisierung beim Domain Controller (via Authen::Smb). Ob und wie man den sinnvoll in einen eigenen HTTP-Server einhängen kann, traue ich mich nicht zu bewerten. > * der Server schickt im OK-Fall den angeforderten Inhalt, ansonsten eine > hoefliche Ablehnung ;-) > > Hat jemand von Euch einen Hinweis, wo ich mich weiter durchkaempfen kann? > Das Prinzip ist hier einigermassen erklaert: > http://search.cpan.org/~bobtfish/ > Authen-NTLM-HTTP-0.33/lib/Authen/NTLM/HTTP.pm > ? aber so ganz blicke ich noch nicht durch? Dein Link beschreibt die Sache ja auch nur zwischen dem Client und dem Webserver und nicht den Teil, der zwischen Webserver und DC abläuft. Das Protokoll ist ja inwischen veröffentlicht (http://msdn.microsoft.com/en-us/library/cc236621), aber auch da habe ich nur den Teil zwischen dem Client und dem Server gefunden :( Ich gebe ja zu, dass ich NTLM nicht mag (da bin ich mir übrigens auch mit Microsoft einig). Wenn Du also lieber einen ganz anderen, aber auch nicht ganz einfachen Kampf führen willst, könntest Du die Negotiate-Authentisierung mit Kerberos verwenden. Das klappt auch in einer reinen Windows-Welt, und da kenne ich mich technisch einigermaßen aus. Ich habe sogar mal den Server-Teil, den Du brauchst, programmiert... allerdings in C, und für BS2000 mit ISO-TSAP (RFC 1006). Mit Kerberos geht das im Prinzip so: Der HTTP-Server verlangt "Negotiate" (RFC 4559), der Client (IE, Firefox, libwww-perl) kann das und fordert beim Domain Controller ein Ticket an. Das schickt er dem Server, und der kann es ohne eigene Kommunikation mit dem DC auswerten. Wenn Du Interesse hast, schicke ich längliche Details :) -- Cheers, haj From Harald.Joerg at arcor.de Fri Oct 5 03:19:41 2012 From: Harald.Joerg at arcor.de (Harald =?utf-8?Q?J=C3=B6rg?=) Date: Fri, 05 Oct 2012 12:19:41 +0200 Subject: [Munich-pm] Frage zu HTTP, NTLM, LDAP In-Reply-To: (Marek Rouchal's message of "Fri, 5 Oct 2012 09:47:17 +0000") References: <87d30yyuxu.fsf@arcor.de> Message-ID: <878vblusoy.fsf@arcor.de> Hallo Marek, > vielen Dank fuer Deine Kommentare - spaetestens jetzt ist mir klar, dass ich diese Idee > (NTLM) mal lieber stecken lasse... habe HTTP::Daemon::SSL zum Laufen bekommen, > und da kann ich (einigermassen) guten Gewissens auch Basic auth machen - und das > gegen LDAP checken. Funktioniert prima - anbei der Code, habe nur die Firmen-Spezifka > geloescht. Falls noch jemandem eine gute Idee dazu einfaellt - nur her damit :-) Da kommt's jetzt drauf an, wie paranoid Deine Nutzer sind. In unserem Intranet ist sowas gar nicht gern gesehen. Der Grund liegt darin, dass SSL nur den Transportweg absichert. Dein Perl-Code kriegt bei Basic aber das Domänen-Kennwort der Benutzer im Klartext (Base64 ist keine Verschlüsselung) mit. Deine Nutzer müssen also Dir und Deinem Serverbetrieb soweit vertrauen, dass sie Dir das Passwort geben, mit denen sie auch ihre Mails lesen etc... Aus dem Grund haben sich einige unserer "inoffiziellen" Server, denen das mit NTLM/Kerberos zu kompliziert ist, von der Ankopplung an den DC verabschiedet und betreiben ihre eigene Benutzerverwaltung. Disclaimer: Aus der Praxis wissen wir, dass die meisten treudoof ihr Domänenpasswort in jedes Formular einklopfen, das es von ihnen verlangt. -- Cheers, haj From mailinglisten at renee-baecker.de Mon Oct 22 15:34:00 2012 From: mailinglisten at renee-baecker.de (mailinglisten at renee-baecker.de) Date: Tue, 23 Oct 2012 00:34:00 +0200 Subject: [Munich-pm] 15. Deutscher Perl-Workshop 2013 - Call for Papers Message-ID: <20121022_223400_037147.mailinglisten@renee-baecker.de> Hallo, Vom 13.03.2013 bis 15.03.2013 (Mittwoch bis Freitag) findet der 15. Deutsche Perl-Workshop im Betahaus in Berlin statt. Zielgruppe des Workshops sind alle ernsthaften Perl-Anwender und die, die es werden wollen. Unser Workshop steht und fällt mit den Vorträgen. Üblicherweise sind Vorträge 5, 20 oder 40 Minuten lang. Alle Themen, die in irgendeiner Weise mit Perl oder dem Perl-Umfeld zu tun haben, können als Vorträge für den Workshop interessant sein. Deinen Vorschlag reichst Du bitte bis spätestens Donnerstag, den 13.12.2012 als Abstract auf der Webseite http://act.yapc.eu/gpw2013 ein. Du kannst natürlich gerne auch mehrere Themen vorschlagen. Dein Abstract sollte in rund 2000 Zeichen (das sind ca. 30 Zeilen a 72 Spalten) das Thema beschreiben, was besonders an Deinem Ansatz ist und weshalb Perl als Sprache in diesem Fall besonders nützlich ist. Solltest Du noch Fragen haben oder Anregungen für Vortragsthemen suchen, schaue bitte in den FAQ nach. Der Deutsche Perl-Workshop wird seit 1999 jährlich ausgerichtet und wandert seit 2004 durch Deutschland. Durchschnittlich 100 Personen nehmen am Workshop teil. In diesem Jahr wird der Workshop von den Berliner Perlmongers organisiert. Die Perlmongergruppe gehört zu den größten und aktivsten in Deutschland. An jedem letzten Mittwoch des Monats treffen wir uns an wechselnden Orten. Mehr Infos gibt es auf Twitter unter https://twitter.com/BerlinPM und unter http://www.perlmongers.de/?BerlinPM.