Archiv für Kategorie Windows
Server Name Indication (SNI) unter Apache 2.0.63 (Windows)
Verfasst von Schakko unter Apache, Sicherheit, Windows am 13. Oktober 2009
Heute kam bei uns in der Firma wieder das Thema Zertifikate zu sprechen. Unsere momentane Umgebung auf dem auch dieser Blog gehostet ist, ist ein Windows-System, auf dem Apache 2.0.63 läuft. Einige der Subdomains sind über SSL zugänglich, allerdings besteht bei SSL das generelle Problem, dass pro IP-Adresse nur ein SSL-Zertifikat benutzt werden darf. Wenn man mehrere Subdomains als virtuelle Hosts betreibt (https://v1.ecw.de, https://v2.ecw.de u.s.w.) wird immer nur das Zertifikat des ersten VHosts benutzt (im Beispiel das Zertifikat von https://v1.ecw.de).
Seit einiger Zeit bietet das Unternehmen StartCom kostenlose Zertifikate an. Das CA-Zertifikat von StartCom ist in den aktuellen Browsern sowie im Zertifikate-Speicher von Windows verfügbar. Leider besteht nicht die Möglichkeit, ein kostenloses Wildcard-Zertifikat zu erhalten. StartCom teilt nur Zertifikate vom Typ C1 und nicht C2 kostenlos aus.
Mit dem Wildcard-Zertifikat wäre es möglich gewesen, dass alle VHosts unter https://*ecw.de sich ein Zertifikat teilen. Die andere Möglichkeit, für jede Domain ein eigenes Zertifikat einzurichten, entfällt aus den bereits genannten Gründen: pro IP nur ein Zertifikat.
Seit 2003 existiert die RFC 3456, in der Server Name Indication (SNI) definiert wird. Damit ist es möglich, pro IP-Adresse mehrere Zertifikate zu benutzen. Leider implementieren bis jetzt nur wenige Webserver SNI nativ.
Als ich im Internet nach dem Thema googelte, wurde ich in Wolfs Blog fündig. Er beschrieb die Implementierung und Kompilierung von SNI unter Apache 2.2.xx. Durch seine Ausführungen war ich mehr als motiviert und hatte nun den Plan, SNI unter Apache 2.0.63 und Windows zum Laufen zu bringen.
Durch meine letzten Tätigkeiten beim mod_auth_ldap-Patch hatte ich noch die Sourcen von Apache 2.0.63 auf der Festplatte und sammelte nun die benötigten Dateien zusammen:
- OpenSSL 0.9.8j für Windows mit TLS-Extension – hatte Wolf bereits kompiliert
- SNI-Backport-Patch für Apache 2.0.63
- Backport von ap_vhost_iterate_given_conn für Apache 2.0.63
- zlib in Version 1.1x
Nachdem ich die beiden Backport-Patches in meine Sourcen eingespielt hatte, musste ich noch die Lib-Pfade für die OpenSSL-Dateien einpassen und außerdem das zlib-Verzeichnis inkludieren, da OpenSSL irgendwie auf zlib referenzierte.
Die Kompilierung verlief danach ohne Probleme und ich machte mich an das Deployen der Dateien. Wichtig dabei war, das auf dem Server folgende neue Dateien kamen:
- openssl.exe aus Wolfs-SSL-Package nach Apache2/bin
- libeay32.dll und ssleay32.dll aus Wolfs-SSL-Package nach Apache2/bin bzw. %SYSTEM32%
- Release/libhttpd.dll aus dem Apache-Kompiliat nach Apache2/bin
- modules/ssl/Release/mod_ssl.so nach Apache2/modules
Das Starten des Apaches schlug beim ersten Mal fehl, da ich die libhttpd.dll vergessen hatte zu kopieren. Diese wird aber benötigt, da der Backport von ap_vhost_iterate_given_conn auf diese Library abzielt.
Danach fuhr der Apache normal hoch, ich richtete nun in aller Kürze zwei Virtuelle Hosts in meiner httpd.conf ein und erzeugte zwei Self Signed Certificates. Das Ergebnis war mehr als erfreulich, denn soweit funktionierte alles.
Der nächste Schritt wird für mich sein, dass ich nun unsere Zertifikate von der StartCom-CA signieren lasse.
mod_ssl-with-sni-2.0.63-win32.zip (952.1 KiB, 349 hits)
Sharepoint mit Apache als Reverse Proxy veröffentlichen
Heute stand ich vor der Aufgabe, dass unsere interne Sharepoint-Seite im Apache veröffentlicht werden sollte. An sich hätte das kein Problem sein sollen – war es im Endeffekt aber.
Bei uns schaut es schematisch so aus, dass der Apache alle Anfragen anhand des Domain-Namens auf die virtuellen Server weiterreicht bzw. als Proxy fungiert: Internet -> Apache / DMZ -> Virtueller Host / Backend Server.
Anhand des Blog-Eintrags von Todd Klint den Sharepoint-Service so eingerichtet, dass er auf die richtige URL lauscht. Die Konfigurationsdatei des virtuellen Hosts sah dann folgendermaßen aus:
<VirtualHost *:443> SSLEngine On SSLProxyEngine On SSLCertificateFile "$CERT_FILE" SSLCertificateKeyFile "$CERT_KEY_FILE" SSLProxyCACertificateFile "$CERT_CA_FILE" ProxyRequests Off ProxyVia On ServerAdmin admin@sps.mydomain.com DocumentRoot $VHOST_DIR/sps/web ServerName sps.mydomain.com:443 ErrorLog "|rotatelogs.exe $VHOST_DIR/sps/logs/%Y%m%d_ssl_error.log 86400" CustomLog "|rotatelogs.exe $VHOST_DIR/sps/logs/%Y%m%d_ssl_access.log 86400" common # AddDefaultCharset ISO LogLevel debug ProxyPreserveHost Off KeepAlive Off ProxyPass / http://backend-srv:8080/ ProxyPassReverse / http://backend-srv:8080/ <Proxy *> Order allow,deny Allow from all </Proxy> <Directory "$VHOST_DIR/sps/"> Order allow,deny Allow from all </Directory> </VirtualHost>
Es ist noch zu sagen, dass der Sharepoint nicht mit HTTPS sondern mit Plain-HTTP läuft. Der Apache kümmert sich um die Verschlüsselung. Im IIS muss außerdem als Authentifizierungsmethode für die Sharepoint-Seite Standardauthentifizerung und nicht Integrierte Windows-Authentfizierung benutzt werden. Apache 2.0.63 kam bei mir mit der Benutzung von NTLM nicht klar.
Ein weiterer Fehler der auftrat war, dass der Sharepoint-Server über zwei Netzwerkkarten verfügte, die zu veröffentlichende SharePoint-Instanz aber an keine IP fest gebunden gewesen ist. Der Apache hatte Probleme damit arge Probleme (sporadisches "Verbindung fehlgeschlagen"), deshalb habe ich die SP-Instanz einer IP direkt im IIS zugewiesen.
How-To: Module des Apache Webservers unter Windows mit Visual Studio kompilieren und debuggen
Verfasst von Schakko unter Active Directory / LDAP, Apache, Entwicklung, Windows am 18. August 2009
Aus aktuellem Anlass musste ich mal wieder ein Apache-Modul gerade biegen. Diesmal war es mod_auth_ldap. mod_auth_ldap sollte als Modul zur Authentifizierung und Autorisierung von LDAP-Benutzern (Active Directory, eDirectory, OpenLDAP etc.) vielen Leuten ein Begriff sein.
Diese Anleitung zeigt in wenigen Schritten, wie man aus den Sourcen des Apache Webserver 2.0.63 ein Modul patcht, kompiliert und debuggt. Voraussetzung für die Kompilierung ist ein Visual Studio Express bzw. Visual C++. Ich verwende auf meinem Rechner ein (relativ altes) Visual Studio 2005 Professional.
Auf meinem Arbeitsrechner schaut es so aus, dass ich unter c:\ckl\dev\srv\web\apache\2.0.63 ($DIR_BIN) die installierte und kompilierte Version des Apache Webservers habe und unter c:\ckl\dev\projects\app\apache\2.0.63 ($DIR_SRC) die zugehörigen Sourcen liegen.
Zuerst müssen von apache.org die aktuellen Sourcen für Windows heruntergeladen und auf der Festplatte ($DIR_SRC) entpackt werden. Wenn man zusätzlich noch durch die Sourcen des Apache Webservers debuggen will, werden weiterhin die Symbols benötigt. Diese müssen in das Hauptverzeichnis des kompilierten Apache Webservers ($DIR_BIN) entpackt werden.
Die Datei $DIR_SRC\Apache.dsw enthält alle Teilprojekte des Webservers und muss mit Visual Studio geöffnet werden. Falls beim Öffnen die Frage nach einer Konvertierung der Daten kommt, kann/muss dies mit Ja beantwortet werden.
Ausgehend davon, dass wir nur mod_auth_ldap patchen wollen, muss nun im Solutions Explorer das Teilprojekt mod_auth_ldap ausgewählt und die jeweiligen Änderungen in die mod_auth_ldap.c eingetragen werden. Mit einem Rechtsklick auf mod_auth_ldap > Build wird nun das Modul erstellt. Die .so-Datei lässt sich jetzt unter $DIR_SRC\modules\experimental\[Debug|Release]\mod_auth_ldap.so ($MOD_AL) finden. Weiterhin ist die $DIR_SRC\modules\experimental\Debug\mod_auth_ldap.pdb ($DEBUG_AL) wichtig.
Der Apache muss nun als Dienst beendet werden (net stop apache2), danach muss $MOD_AL und $DEBUG_AL nach $DIR_BIN\modules kopiert (vorher Sicherung des Originals erstellen!) und Apache auf der Kommandozeile ($DIR_BIN\bin\apache.exe) gestartet werden. Dies ist nötig, damit Visual Studio sich an den Apache-Prozess hängen kann. Wird der Apache als Dienst ausgeführt, ist dies nicht ohne Weiteres möglich.
Sobald der Webserver läuft, kann im Visual Studio unter Debug > Attach to Process die Apache-Prozesse ausgewählt werden. Beim Hit eines Breakpoints in der mod_auth_ldap.c stoppt der Apache die Ausführung.
Hier die Hinweise im Überblick:
- $DIR_SRC\Apache.dsw als Projekt öffnen und nicht $DIR_SRC\modules\experimental\mod_auth_ldap.dsw, da man bei letzterem zu viele Einstellungen ändern muss.
- Apache.exe als normalen Prozess und nicht als Dienst starten, da sich sonst der Debugger nicht nutzen lässt.
- Neben der .so-Datei muss auch die zugehörige .pdb-Datei in $DIR_BIN\modules kopiert werden.
VirtualBox: Cursor wird zweimal angezeigt
Verfasst von Schakko unter Virtualisierung, Windows am 1. August 2009
Auf meinem Server läuft die aktuelle VirtualBox-Version und als Gast ein Windows Server 2003.
Von Anfang an hatte ich beim Verbinden via RDP über das VirtualBox-RDP-Gateway das Problem, dass in dem Screen zwei Cursor der Maus angezeigt wurden. Besonders problematisch ist dabei, dass ich die Ränder nicht erreichen konnte, da z.B. des rechten Randes der rechte Cursor außerhalb des RDP-Clients (Gnome-RDP) war und somit die Mausbewegungen sich auf mein Notebook und nicht mehr auf die RDP-Session bezogen.
Die Lösung des Problems ist an sich relativ simpel: Im VirtualBox-Gast muss unter Systemsteuerung > Maus > Zeigeroptionen die Option Zeigebeschleunigung verbessern deaktiviert werden.
Langsames Netzwerk unter Windows Vista (inkl. Service Pack)
Wenn die Performance beim Schreiben über SMB auf Windows Vista unheimlich schlecht ist – trotz Gigabit – sollte testweise folgender Eintrag in der Registry geändert werden:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex
und diesen Wert dann auf 0xFFFFFF setzen.
Erstellen eines Active Directory-Benutzers mit Nur-Leserechten
Verfasst von Schakko unter Active Directory / LDAP, Sicherheit, Windows am 8. Mai 2009
Vor einigen Tagen berichtete ich über das Active Directory-Authentifizierungsproblem bei SMTP-Benutzern auf unserer Astaro-Firewall. Nachdem der Support von Astaro sich die Logs auf der Firewall näher angeschaut hatte, bekamen wir folgenden Tip: Der von uns vorgesehene Benutzer besaß im Active Directory zu wenig Rechte.
Normalerweise wird in Applikationen, z.B. bei mod_ldap für Apache, eine Suchanfrage für einen Benutzer gestartet, in dem überprüft wird, ob eine Gruppe oder eine OU den Benutzer enthält. Außerdem geschieht oft das Binding über den zu autorisierenden Benutzer.
Die Software der Astaro-Firewall geht einen etwas anderen Weg: Der Benutzer wird am Active Directory authentifiziert, danach wird geschaut, ob der Benutzer im Attribut memberOf Mitglied der Gruppe ist.
Unser obiger Benutzer – der Einfachheit halber LDAP-Account genannt – war als normaler Domänen-Benutzer im Active Directory eingetragen und konnte somit Anfragen auf OUs oder Gruppen stellen, aber eben nicht das memberOf-Attribut von speziellen Benutzern auslesen.
Mit Hilfe der Aussage des Supports wiesen wir dem LDAP-Account zum Test im Active Directory die Gruppe “Domänen-Administratoren” zu und siehe da: Die Authentifizierung beim SMTP-Relaying funktioniert.
Nun wollten wir aus Sicherheitsgründen aber natürlich nicht, dass der Benutzer weiterhin mit der Rolle des Domänen-Administrators in der Domäne agierte. Der LDAP-Account sollte nur lesend auf die Attribute von Benutzern zugreifen können.
Damit dieses Vorhaben gelingt, muss die MMC ADSI Edit aufgerufen werden. Falls diese nicht installiert ist, muss sie von der Windows Server 2000/2003-CD aus dem Verzeichnis Support Tools nachinstalliert werden.
Nun wählt man die OU aus, in der dem LDAP-Account Leserechte gewährt werden sollen.

Auswahl der OU
Danach muss im Tab Sicherheit mit einem Klick auf Hinzufügen der LDAP-Account dieser OU hinzugefügt werden.

Sicherheitseinstellungen für diese OU

Auswahl des Benutzers
Der LDAP-Account erscheint nun in der Liste der Gruppen- oder Benutzernamen.

Benutzer, nachdem dieser der OU zugewiesen wurde
Mit einem Klick auf Erweitert, Auswahl des LDAP-Accounts und nochmaligen Klick auf Bearbeiten wird dem Benutzer das Recht Berechtigungen lesen entzogen. Weiterhin war das Recht Inhalt auflisten für unsere Anforderungen nicht nötig.

Erweiterte Sicherheitseinstellungen

Spezielle Berechtigungen setzen
Nach diesen Änderungen konnte nun der Benutzer LDAP-Account auf das memberOf-Attribut zugreifen.
Tips und Tricks in Windows 7
Tim Sneath hat in seinem Blog einige nützliche Tips veröffentlicht, die Windows 7 bereit hält.
Besonders interessant fand ich, dass sich mit Hilfe der psr.exe Benutzer-Interaktionen aufzeichnen lassen. Somit kann man anderen Personen per Video demonstrieren, wie sich Probleme beheben lassen.
Der Blog-Eintrag ist definitv empfehlenswert.
HTC Touch Diamond / WPA2 / PEAP / Windows Server 2003
Verfasst von Schakko unter HTC Touch Diamond, Sicherheit, Windows am 9. Dezember 2008
Szenario: HTC Touch Diamond über WPA2 AES mit Hilfe von RADIUS/IAS an das Firmen-Netzwerk anbinden.
Nicht nur ich, sondern auch andere Personen haben das Problem, dass der Wifi-Manager im HTC Touch Diamond bei ausgewähltem PEAP meldet, dass man ein persönliches Sicherheitszertifikat benötigt.
Im Internet gibt es einige Hinweise, dass man entweder ValidateServerCert auf “0″ setzen soll -so habe ich es vor einigen Tagen auch in diesem Blog geschrieben- oder aber, dass man Securew2 benutzt.
Beides reichte bei unserem Netzwerk nicht aus. Deshalb hier eine kurze Anleitung, wie es funktioniert.
Zuerst muss auf dem Domänen-Controller – bei uns ist das ein Windows Server 2003 R2 – das Server-Zertifikat exportiert werden. Microsoft stellt dazu unter http://www.microsoft.com/downloads/details.aspx?FamilyID=6123EB55-6590-4643-8E7F-11C177104DE2&displaylang=en das Tool SslChainSaver zur Verfügung. Dies muss auf der Kommandozeile aufgerufen werden:
sslchainsaver $DOMAENENCONTROLLER
Man erhält nun zwei XML-Dateien und einige Zertifikate. Das Windows Mobile 6-Zertifikat ($DOMAENENCONTROLLER.wm6.xml) muss in _setup.xml umbenannt und danach zu einer CAB gepackt werden:
makecab _setup.xml domaene_rootcert.wm6.cab
Die domaene_rootcert.wm6.cab muss auf das HTC Touch Diamond kopiert und installiert werden. Unter Einstellungen > System > Sicherheitszertifikate sollte nun die Zertifizierungsstelle erscheinen.
Als nächstes folgt der Export des Benutzerzertifikats nach PCKS#12. Auch hier gibt es wieder viele Anleitungen wie man das macht: Unter Windows Server 2003 die MMC starten, das Zertifizierungsstellen-Snap-In laden (muss mit dem Domänen-Controller verbunden werden) und dann unter Ausgestellte Zertifikate den Benutzer auswählen, Details > In Datei kopieren und PKCS#12 auswählen. Aus welchen Gründen auch immer war die PCKS#12-Option bei unserem Server deaktiviert.
Deshalb gilt nun folgendes: Auf einem Client-Computer den Internet Explorer starten und die Adresse http://$DOMAENENCONTROLLER/certsrv aufrufen und sich mit seinem Benutzernamen und Passwort authentifizieren. Nun muss ein neues Benutzer-Sicherheitszertifikat im PCKS#10-Stil angefordert werden. Dieses muss nach der Erzeugung in der Zertifizierungsstelle logischerweise auch im IE installiert werden.
Danach kann man im IE 8 unter Extras > Internetoptionen > Inhalt > Zertifikate > Eigene Zertifikate sein eben gerade erstelltes Zertifikat auswählen und dieses als PCKS#12 exportieren.
Die exportierte Datei muss ebenfalls auf das HTC Touch Diamond kopiert und danach mit einem Doppelklick installiert werden.
Nun kann die WLAN-Verbindung über PEAP und ohne Securew2 erfolgen.
Tool zum Resizen von Fenstern über mehrere Bildschirme
Verfasst von Schakko unter Eclipse, Effizient arbeiten, Windows am 9. Dezember 2008
Eclipse-Entwickler kennen das: Sie besitzen zum Entwickeln zwar zwei Bildschirme, aber Eclipse unterstützt kein Multi-Display-Support bzw. keinen, der wirklich zuverlässig funktioniert.
Auf Codeplex wurde nun das Tool VirtualScreenMax releast, dass eine Anwendung auf mehrere Bildschirme resizt. Ich finde das Tool mehr als praktisch, denn nun habe ich Eclipse im Vollbild-Modus auf beiden Bildschirmen laufen und muss nicht mehr Detached-Outlines u.ä. benutzen.
USB-Programmierung unter Windows
Ich benutze im ckl-net udev – für Windows habe ich ein ähnliches Framework dazu leider nicht gefunden.
Deshalb hier ein paar Infos, wie man denn auf Statuswechsel bei USB-Geräten reagiert: Der Schlüssel dafür ist WM_DEVICECHANGE – siehe dazu http://www.toolbox-mag.de/data/tx22005artikel1.pdf, Unter C++ ist dieser Artikel hilfreich (inkl. Source): http://www.codeproject.com/KB/system/HwDetect.aspx, Unter C# lohnt sich ein Blick auf http://www.mycsharp.de/wbb2/thread.php?threadid=29802, http://www.codeproject.com/KB/system/DriveDetector.aspx und besonders http://www.matze-friedrich.de/development/devnotify.aspx.
Sag was!