Implementierungshandbuch aktualisiert
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++ 2015–2022 Redistributable (x64)**.
|
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.
|
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:
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user