From 1d5768e7044ea3b957177cc8c1e74a2cb1439065 Mon Sep 17 00:00:00 2001 From: blaerf Date: Sun, 16 Nov 2025 11:27:27 +0100 Subject: [PATCH] Implementierungshandbuch aktualisiert --- Implementierungshandbuch-IIS-PHP-AD.-.md | 119 ++++++++++++++++++----- 1 file changed, 93 insertions(+), 26 deletions(-) diff --git a/Implementierungshandbuch-IIS-PHP-AD.-.md b/Implementierungshandbuch-IIS-PHP-AD.-.md index 517bc6a..eaaf5a8 100644 --- a/Implementierungshandbuch-IIS-PHP-AD.-.md +++ b/Implementierungshandbuch-IIS-PHP-AD.-.md @@ -49,22 +49,20 @@ Die Installation von PHP erfolgt manuell, da der Web Platform Installer (WPI) ni PHP unter Windows benötigt das **Microsoft Visual C++ 2015–2022 Redistributable (x64)**. -1. Neueste x64-Version von Microsoft herunterladen (`vc_redist.x64.exe`). +1. Neueste x64-Version von Microsoft herunterladen: [vc_redist.x64.exe](https://aka.ms/vc14/vc_redist.x64.exe). 2. Installation ausführen und abschließen. #### PHP-Download -1. Zur offiziellen Download-Seite für PHP unter Windows wechseln: - `https://windows.php.net/download/` -2. Die **x64 Non-Thread Safe (NTS)** Version der gewünschten PHP-Version (z.B. PHP 8.3) im **Zip-Format** auswählen. +1. Zur offiziellen Download-Seite für PHP unter Windows wechseln: [PHP](https://windows.php.net/download/) +2. Die **x64 Non-Thread Safe (NTS)** Version der gewünschten PHP-Version (z.B. PHP 8.4) im **Zip-Format** auswählen. **Technische Erläuterung:** Die NTS-Version ist für den Betrieb mit IIS + FastCGI optimiert. FastCGI übernimmt das Prozess-Pooling, daher ist Thread-Safety in PHP selbst nicht erforderlich. Die Verwendung einer Thread-Safe-Version (TS) kann hier zu Performance- und Stabilitätsproblemen führen. #### PHP-Installation -1. Ein Verzeichnis für PHP erstellen, z.B.: - `C:\PHP` +1. Ein Verzeichnis für PHP erstellen, z.B.: `C:\PHP` 2. Das heruntergeladene ZIP-Archiv nach `C:\PHP` entpacken. --- @@ -189,18 +187,47 @@ Dieses Konto wird später als Identität des IIS-Anwendungspools verwendet. --- -## Teil 3: Erweiterte PHP-Konfiguration (LDAP und SNMP aktivieren) +## **Teil 3: Konfiguration von Secure LDAP (LDAPS) auf dem Domänencontroller** + +Standard-LDAP (Port 389\) überträgt Anmeldeinformationen unverschlüsselt. Für eine Produktionsumgebung ist die Aktivierung von LDAPS (LDAP über SSL, Port 636\) zwingend erforderlich. + +1. Voraussetzung: SSL-Zertifikat + LDAPS funktioniert nur, wenn der Domänencontroller (DC) ein gültiges SSL-Zertifikat besitzt. Dieses Zertifikat muss für den Zweck "Serverauthentifizierung" ausgestellt sein und der FQDN des Domänencontrollers (z. B. dc01.yourdomain.com) muss im Antragstellernamen (Subject Name) oder Alternativen Antragstellernamen (SAN) enthalten sein. +2. Empfohlene Methode: Active Directory-Zertifikatdienste (AD CS) + Die einfachste und robusteste Methode zur Bereitstellung dieses Zertifikats ist die Installation der Active Directory-Zertifikatdienste (AD CS)-Rolle auf dem Server. + * Den **Server-Manager** auf dem DC öffnen. + * **Verwalten** \> **Rollen und Features hinzufügen** auswählen. + * In der Rollenauswahl **Active Directory-Zertifikatdienste** anklicken. + * Im Assistenten für Rollendienste mindestens **Zertifizierungsstelle** aktivieren. + * Abschluss der Installation und die anschließende Konfiguration der Rolle abwarten ("Unternehmens-CA" auswählen). + * Nach der Installation und Konfiguration erhält der Domänencontroller (oder alle DCs in der Domäne, abhängig von der Konfiguration) automatisch ein gültiges Zertifikat von der neuen internen Zertifizierungsstelle. +3. Automatische Aktivierung von LDAPS + Sobald ein gültiges Zertifikat im persönlichen Zertifikatspeicher des Domänencontrollers vorhanden ist, beginnt der AD-Dienst (LSASS.exe) automatisch, auf den LDAPS-Ports zu lauschen: + * **TCP 636** (für LDAPS) + * **TCP 3269** (für LDAPS zum globalen Katalog) +4. **Verifizierung der LDAPS-Verbindung (auf dem DC)** + * `ldp.exe` starten (ein AD-Verwaltungstool). + * Danach **Verbindung** \> **Verbinden...** auswählen. + * **Server:** FQDN des DCs eingeben (z. B. dc01.yourdomain.com). + * **Port:** 636 + * Kontrollkästchen **SSL** aktivieren. + * Auf **OK** klicken. + * Wenn die Verbindung erfolgreich ist, werden die RootDSE-Informationen im rechten Fensterbereich angezeigt. Dies bestätigt, dass der Server LDAPS-Verbindungen akzeptiert. + +--- + +## Teil 4: Erweiterte PHP-Konfiguration (LDAP und SNMP aktivieren) Nun werden die PHP-Erweiterungen aktiviert, die für LDAP-Authentifizierung und SNMP-Abfragen benötigt werden. -### 3.1 Bearbeitung der `php.ini` +### 4.1 Bearbeitung der `php.ini` 1. Zum PHP-Installationsverzeichnis wechseln, z.B. `C:\PHP`. 2. Falls keine `php.ini` existiert: - `php.ini-production` nach `php.ini` kopieren. 3. `php.ini` mit einem Editor (z.B. Notepad++ als Administrator) öffnen. -### 3.2 Aktivierung der PHP-Erweiterungen +### 4.2 Aktivierung der PHP-Erweiterungen 1. In der `php.ini` nach `extension_dir` suchen und sicherstellen, dass es auf das `ext`-Verzeichnis zeigt: @@ -220,7 +247,7 @@ Nun werden die PHP-Erweiterungen aktiviert, die für LDAP-Authentifizierung und - **snmp**: für SNMP-Abfragen (Servermetriken) - **openssl**: u.a. für LDAPS (LDAP über SSL/TLS) -### 3.3 Behebung von Windows-spezifischen DLL-Abhängigkeiten +### 4.3 Behebung von Windows-spezifischen DLL-Abhängigkeiten Erweiterungen wie `php_ldap.dll` benötigen zusätzliche DLLs (z.B. `libsasl.dll`, `libcrypto-*.dll`, `libssl-*.dll`), die sich im PHP-Stammverzeichnis befinden. @@ -242,7 +269,35 @@ Erweiterungen wie `php_ldap.dll` benötigen zusätzliche DLLs (z.B. `libsasl.dll - Vollständigen Neustart des Servers durchführen **oder** zumindest die Dienste **W3SVC** und **WAS** neu starten, damit der IIS-Prozess `w3wp.exe` den aktualisierten `PATH` übernimmt. -### 3.4 Überprüfung der geladenen Module +### **4.4 Konfiguration von PHP für LDAPS-Vertrauensstellung** + +Das Aktivieren von `extension=ldap` allein reicht nicht aus, um LDAPS mit einer internen Zertifizierungsstelle zu verwenden. Hintergrund ist, dass PHP unter Windows **nicht** auf den Windows-Zertifikatspeicher zugreift. Ohne zusätzliche Konfiguration führt dies bei LDAPS-Verbindungen zu dem Fehler *„Unknown CA“*. Damit PHP der internen Zertifizierungsstelle vertraut, muss das Root-Zertifikat manuell in einer separaten OpenLDAP-Konfigurationsstruktur hinterlegt werden. + +### Schritt 1: Root-CA-Zertifikat exportieren + +1. Auf einem beliebigen domänenangehörigen System `mmc.exe` starten. +2. **Datei → Snap-In hinzufügen/entfernen…** auswählen. +3. **Zertifikate** hinzufügen → **Computerkonto** → **Lokaler Computer**. +4. Zu **Vertrauenswürdige Stammzertifizierungsstellen → Zertifikate** navigieren. +5. Das Stammzertifikat der internen CA auswählen. +6. Rechtsklick → **Alle Aufgaben → Exportieren…**. +7. Format **Base-64-codiert X.509 (.CER)** wählen. +8. Das Zertifikat z. B. als `C:\InternalRootCA.cer` speichern. + +### Schritt 2: OpenLDAP-Konfigurationsverzeichnis erstellen + +1. Auf dem IIS-Server das folgende Verzeichnis anlegen: + `C:\openldap\sysconf\` +2. Die exportierte Datei `InternalRootCA.cer` in dieses Verzeichnis kopieren. +3. Im selben Verzeichnis eine Datei **ldap.conf** anlegen. + +### Schritt 3: ldap.conf konfigurieren + +1. `C:\openldap\sysconf\ldap.conf` mit einem Editor öffnen. +2. Folgende Zeile eintragen (Dateiname ggf. anpassen): + + +### 4.5 Überprüfung der geladenen Module - `phpinfo.php` erneut aufrufen. - Mit `Strg+F` nach `ldap` und `snmp` suchen. @@ -259,14 +314,14 @@ Sind separate Konfigurationsblöcke für `ldap` und `snmp` sichtbar, wurden die --- -## Teil 4: Die PowerShell-Automatisierungsebene +## Teil 5: Die PowerShell-Automatisierungsebene Die AD-Operationen werden über PowerShell-Skripte ausgeführt, die als sichere, parametrisierte Schnittstelle zwischen PHP und Active Directory dienen. **Pfad für Skripte:** `C:\Web\AdAdminPanel\scripts\powershell\` -### 4.1 Skript für einzelne Benutzererstellung (`Create-ADUser.ps1`) +### 5.1 Skript für einzelne Benutzererstellung (`Create-ADUser.ps1`) ```powershell # C:\Web\AdAdminPanel\scripts\powershell\Create-ADUser.ps1 @@ -309,7 +364,7 @@ catch { --- -### 4.2 Skript für CSV-Massenimport (`Bulk-Create-ADUsers.ps1`) +### 5.2 Skript für CSV-Massenimport (`Bulk-Create-ADUsers.ps1`) ```powershell # C:\Web\AdAdminPanel\scripts\powershell\Bulk-Create-ADUsers.ps1 @@ -366,11 +421,11 @@ catch { --- -## Teil 5: Sicherheitsarchitektur (IIS, PHP und PowerShell) +## Teil 6: Sicherheitsarchitektur (IIS, PHP und PowerShell) Die größte Herausforderung ist die sichere Verbindung zwischen der IIS-Webanwendung (niedrige Vertrauensstellung) und Active Directory (hohe Vertrauensstellung). -### 5.1 Analyse des Sicherheitsproblems +### 6.1 Analyse des Sicherheitsproblems `shell_exec()` in PHP wird im Sicherheitskontext des IIS-Anwendungspool-Benutzers ausgeführt. Standardmäßig ist dies ein virtuelles Konto wie `IIS APPPOOL\DefaultAppPool` mit sehr wenigen Rechten. Dieses Konto darf weder: @@ -384,7 +439,7 @@ Die größte Herausforderung ist die sichere Verbindung zwischen der IIS-Webanwe --- -### 5.2 Konfiguration der IIS-Anwendungspool-Identität +### 6.2 Konfiguration der IIS-Anwendungspool-Identität 1. IIS-Manager öffnen. 2. **Anwendungspools** auswählen. @@ -401,7 +456,7 @@ Ab jetzt läuft der AppPool im Kontext des Dienstkontos. --- -### 5.3 Delegierung von AD-Berechtigungen +### 6.3 Delegierung von AD-Berechtigungen 1. Auf einem Domänencontroller `dsa.msc` öffnen. 2. Rechtsklick auf OU **WebAppUsers** → **Objektverwaltung zuweisen…** @@ -420,7 +475,7 @@ Ab jetzt läuft der AppPool im Kontext des Dienstkontos. --- -### 5.4 PowerShell-Ausführungsrichtlinie +### 6.4 PowerShell-Ausführungsrichtlinie Standardmäßig gilt `Restricted`. Statt die Richtlinie global zu ändern, wird sie pro Aufruf übergangen mit: @@ -432,7 +487,7 @@ Dies wird in den PHP-Skripten beim Aufruf von `powershell.exe` verwendet. --- -### 5.5 Dateisystemberechtigungen (NTFS) +### 6.5 Dateisystemberechtigungen (NTFS) Dem Dienstkonto `svc_iis_php_ad` werden nur die minimal erforderlichen NTFS-Rechte gewährt: @@ -440,15 +495,16 @@ Dem Dienstkonto `svc_iis_php_ad` werden nur die minimal erforderlichen NTFS-Rech - `C:\Web\AdAdminPanel\public` → Lesen - `C:\Web\AdAdminPanel\scripts\powershell` → Lesen & Ausführen - `C:\Web\AdAdminPanel\storage\uploads` → Ändern/Schreiben (für CSV-Uploads) +- `C:\openldap\sysconf` → Lesen (damit es die ldap.conf und die .cer-Datei lesen kann) --- -## Teil 6: Implementierung der PHP-Anwendungslogik +## Teil 7: Implementierung der PHP-Anwendungslogik Die folgenden PHP-Dateien liegen im Web-Stammverzeichnis, z.B.: `C:\Web\AdAdminPanel\public` -### 6.1 Modul 1: Administrator-Authentifizierung (LDAP-Login) +### 7.1 Modul 1: Administrator-Authentifizierung (LDAP-Login) **Datei:** `login.php` @@ -508,7 +564,18 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { --- -### 6.2 Modul 2: Server-Monitoring (SNMP) +### 7.2 Modul 2: Server-Monitoring (SNMP) + +Diese Seite (dashboard.php) zeigt die Serverinformationen an, die über die in Teil 4 aktivierte SNMP-Erweiterung und den in Teil 2 konfigurierten Dienst abgerufen werden. + +**Tabelle 2: Wichtige SNMP-OIDs für die Windows Server-Überwachung** + +| Metrik | OID | Beschreibung | +| :---- | :---- | :---- | +| **CPU-Last** | .1.3.6.1.2.1.25.3.3.1.2 | (HOST-RESOURCES-MIB) Durchschnittliche CPU-Auslastung der letzten Minute (pro CPU-Kern). Dies ist eine Tabelle; ein snmpwalk ist erforderlich, um alle Kerne zu erhalten.59 | +| **Gesamter RAM** | .1.3.6.1.2.1.25.2.3.1.5 | (hrStorageSize) Größe der Speichereinheiten. Muss mit hrStorageDescr (z. B. "Physical Memory") korreliert werden.63 | +| **Genutzter RAM** | .1.3.6.1.2.1.25.2.3.1.6 | (hrStorageUsed) Genutzte Speichereinheiten. Muss ebenfalls korreliert werden.63 | +| **System Uptime** | .1.3.6.1.2.1.25.1.1.0 | hrSystemUptime (in Timeticks). | **Datei:** `dashboard.php` @@ -569,7 +636,7 @@ if ($ram_total_raw && $ram_used_raw && $ram_units) { --- -### 6.3 Modul 3: Einzelne Benutzererstellung +### 7.3 Modul 3: Einzelne Benutzererstellung **Datei:** `create_single_user.php` @@ -623,7 +690,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { --- -### 6.4 Modul 4: CSV-Massenimport +### 7.4 Modul 4: CSV-Massenimport **Datei:** `bulk_create_users.php` @@ -675,7 +742,7 @@ if (isset($_FILES['user_csv'])) { --- -## Teil 7: Abschließendes Sicherheits-Audit und Risikobewertung +## Teil 8: Abschließendes Sicherheits-Audit und Risikobewertung Die Lösung ist mächtig, aber sensibel, da sie eine Brücke zwischen Web und Active Directory bildet. Die folgenden Risiken und Gegenmaßnahmen sind zentral: