Implementierungshandbuch aktualisiert

blaerf 2025-11-16 11:27:27 +01:00
parent c0ac40fdc4
commit 1d5768e704

@ -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++ 20152022 Redistributable (x64)**. PHP unter Windows benötigt das **Microsoft Visual C++ 20152022 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. 2. Installation ausführen und abschließen.
#### PHP-Download #### PHP-Download
1. Zur offiziellen Download-Seite für PHP unter Windows wechseln: 1. Zur offiziellen Download-Seite für PHP unter Windows wechseln: [PHP](https://windows.php.net/download/)
`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.
2. Die **x64 Non-Thread Safe (NTS)** Version der gewünschten PHP-Version (z.B. PHP 8.3) im **Zip-Format** auswählen.
**Technische Erläuterung:** **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. 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 #### PHP-Installation
1. Ein Verzeichnis für PHP erstellen, z.B.: 1. Ein Verzeichnis für PHP erstellen, z.B.: `C:\PHP`
`C:\PHP`
2. Das heruntergeladene ZIP-Archiv nach `C:\PHP` entpacken. 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. 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`. 1. Zum PHP-Installationsverzeichnis wechseln, z.B. `C:\PHP`.
2. Falls keine `php.ini` existiert: 2. Falls keine `php.ini` existiert:
- `php.ini-production` nach `php.ini` kopieren. - `php.ini-production` nach `php.ini` kopieren.
3. `php.ini` mit einem Editor (z.B. Notepad++ als Administrator) öffnen. 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: 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) - **snmp**: für SNMP-Abfragen (Servermetriken)
- **openssl**: u.a. für LDAPS (LDAP über SSL/TLS) - **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. 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 - 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. **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. - `phpinfo.php` erneut aufrufen.
- Mit `Strg+F` nach `ldap` und `snmp` suchen. - 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. Die AD-Operationen werden über PowerShell-Skripte ausgeführt, die als sichere, parametrisierte Schnittstelle zwischen PHP und Active Directory dienen.
**Pfad für Skripte:** **Pfad für Skripte:**
`C:\Web\AdAdminPanel\scripts\powershell\` `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 ```powershell
# C:\Web\AdAdminPanel\scripts\powershell\Create-ADUser.ps1 # 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 ```powershell
# C:\Web\AdAdminPanel\scripts\powershell\Bulk-Create-ADUsers.ps1 # 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). 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: `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. 1. IIS-Manager öffnen.
2. **Anwendungspools** auswählen. 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. 1. Auf einem Domänencontroller `dsa.msc` öffnen.
2. Rechtsklick auf OU **WebAppUsers** → **Objektverwaltung zuweisen…** 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: 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: 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\public` → Lesen
- `C:\Web\AdAdminPanel\scripts\powershell` → Lesen & Ausführen - `C:\Web\AdAdminPanel\scripts\powershell` → Lesen & Ausführen
- `C:\Web\AdAdminPanel\storage\uploads` → Ändern/Schreiben (für CSV-Uploads) - `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.: Die folgenden PHP-Dateien liegen im Web-Stammverzeichnis, z.B.:
`C:\Web\AdAdminPanel\public` `C:\Web\AdAdminPanel\public`
### 6.1 Modul 1: Administrator-Authentifizierung (LDAP-Login) ### 7.1 Modul 1: Administrator-Authentifizierung (LDAP-Login)
**Datei:** `login.php` **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` **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` **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` **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: 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: