Die DSGVO stellt Anforderungen an alle, die personenbezogene Daten verarbeiten. Server-Betreiber müssen technische und organisatorische Maßnahmen umsetzen.
Grundlagen
Was sind personenbezogene Daten?
- IP-Adressen
- E-Mail-Adressen
- Namen, Adressen
- Benutzernamen
- Cookies mit Personenbezug
- Standortdaten
- Geräte-IDsWann gilt die DSGVO?
- Verarbeitung personenbezogener Daten
- Automatisierte Verarbeitung
- Dateisysteme (auch Papier)
- Niederlassung in der EU oder
- Angebot von Diensten an EU-BürgerTechnische Maßnahmen
Verschlüsselung
# Nginx - SSL/TLS erzwingen
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.de/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# HSTS
add_header Strict-Transport-Security "max-age=31536000" always;
}Datenbank-Verschlüsselung
-- MySQL: Encryption at Rest
ALTER TABLE users ENCRYPTION = 'Y';
-- Sensitive Spalten verschlüsseln
CREATE TABLE users (
id INT PRIMARY KEY,
email VARBINARY(255),
name VARBINARY(255)
);Backup-Verschlüsselung
# Verschlüsseltes Backup
mysqldump database | gpg -c > backup.sql.gpg
# BorgBackup mit Verschlüsselung
borg init --encryption=repokey /backup/repoIP-Adressen anonymisieren
Webserver-Logs
# Nginx - IP anonymisieren
map $remote_addr $remote_addr_anon {
~(?P<ip>\d+\.\d+\.\d+)\. $ip.0;
~(?P<ip>[^:]+:[^:]+): $ip::;
default 0.0.0.0;
}
log_format anonymized '$remote_addr_anon - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log anonymized;Apache
# Letzte Oktett entfernen
LogFormat "%{X-Forwarded-For}i - %u %t \"%r\" %>s %b" anonymized
# Oder mit mod_removeipMatomo
Administration → Privatsphäre → IP anonymisieren
→ 2 Bytes anonymisieren (empfohlen)Datenlöschung
Log-Rotation
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}Automatische Datenlöschung
#!/bin/bash
# Alte Logs löschen (DSGVO: Datensparsamkeit)
# Webserver-Logs älter als 7 Tage
find /var/log/nginx -name "*.log" -mtime +7 -delete
# Analytics-Rohdaten älter als 180 Tage
mysql -e "DELETE FROM matomo_log_visit WHERE visit_last_action_time < DATE_SUB(NOW(), INTERVAL 180 DAY)"
# Alte Backups löschen
find /backup -name "*.tar.gz" -mtime +30 -deleteDatenbank-Bereinigung
-- Alte Nutzerdaten löschen
DELETE FROM users WHERE last_login < DATE_SUB(NOW(), INTERVAL 2 YEAR);
-- Anonymisieren statt Löschen
UPDATE users SET
email = CONCAT('deleted_', id, '@anonymized.local'),
name = 'Gelöscht',
phone = NULL
WHERE deletion_requested = 1;Zugriffsschutz
SSH-Härtung
# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
AllowUsers admin deploy
# Fail2ban
apt install fail2banDatenbank-Zugriff
-- Minimale Berechtigungen
CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'webapp'@'localhost';
-- Keine Remote-Zugriffe
# /etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 127.0.0.1Admin-Bereiche schützen
location /admin {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
# IP-Beschränkung
allow 192.168.1.0/24;
deny all;
}Auftragsverarbeitung
Verträge erforderlich mit
- Hosting-Provider
- Cloud-Dienste (AWS, Azure)
- Backup-Dienste
- CDN-Anbieter
- E-Mail-Provider
- Analytics-DiensteAVV-Inhalte
1. Gegenstand und Dauer
2. Art und Zweck der Verarbeitung
3. Art der personenbezogenen Daten
4. Kategorien betroffener Personen
5. Technische und organisatorische Maßnahmen
6. Unterauftragnehmer
7. Unterstützungspflichten
8. Löschung nach VertragsendeDokumentation
Verfahrensverzeichnis
## Verarbeitungstätigkeit: Webserver-Betrieb
**Verantwortlicher:** Firma GmbH
**Datenschutzbeauftragter:** datenschutz@firma.de
### Zweck der Verarbeitung
- Bereitstellung der Website
- Sicherheit (Logfiles)
- Analyse (anonymisiert)
### Kategorien personenbezogener Daten
- IP-Adressen (anonymisiert nach 7 Tagen)
- Zugriffszeitpunkte
- Aufgerufene Seiten
- Browser-Informationen
### Empfänger
- Keine Weitergabe an Dritte
### Löschfristen
- Logfiles: 7 Tage
- Anonymisierte Analytics: 2 Jahre
### Technische Maßnahmen
- SSL/TLS-Verschlüsselung
- Firewall
- Regelmäßige Updates
- ZugriffskontrolleTOMs dokumentieren
## Technische und Organisatorische Maßnahmen
### 1. Zutrittskontrolle
- Server in gesichertem Rechenzentrum
- Zugang nur für autorisiertes Personal
### 2. Zugangskontrolle
- SSH nur mit Key-Authentifizierung
- Fail2ban gegen Brute-Force
- 2FA für kritische Systeme
### 3. Zugriffskontrolle
- Minimale Berechtigungen
- Rollenbasierte Zugriffe
- Protokollierung aller Zugriffe
### 4. Weitergabekontrolle
- Verschlüsselung bei Übertragung (TLS)
- Keine unverschlüsselten Protokolle
### 5. Eingabekontrolle
- Protokollierung von Änderungen
- Audit-Logs
### 6. Auftragskontrolle
- AVV mit allen Dienstleistern
- Regelmäßige Überprüfung
### 7. Verfügbarkeitskontrolle
- Regelmäßige Backups
- Disaster Recovery Plan
- Redundante Systeme
### 8. Trennungsgebot
- Getrennte Datenbanken pro Mandant
- Keine Vermischung von KundendatenBetroffenenrechte
Auskunft (Art. 15)
// API-Endpoint für Datenauskunft
public function exportUserData($userId) {
$data = [
'user' => User::find($userId),
'orders' => Order::where('user_id', $userId)->get(),
'logs' => ActivityLog::where('user_id', $userId)->get(),
];
return response()->json($data)
->header('Content-Disposition', 'attachment; filename="data-export.json"');
}Löschung (Art. 17)
// Recht auf Löschung
public function deleteUserData($userId) {
// Prüfen ob Aufbewahrungspflichten bestehen
$user = User::find($userId);
// Anonymisieren oder Löschen
$user->email = "deleted_{$userId}@anonymized.local";
$user->name = "Gelöscht";
$user->phone = null;
$user->deleted_at = now();
$user->save();
// Logs bereinigen
ActivityLog::where('user_id', $userId)
->where('created_at', '<', now()->subDays(7))
->delete();
// Bestätigung
return response()->json(['message' => 'Daten gelöscht']);
}Sicherheitsvorfälle
Meldepflicht
Bei Datenpannen innerhalb von 72 Stunden:
1. Art der Verletzung
2. Kategorien betroffener Daten
3. Anzahl betroffener Personen
4. Wahrscheinliche Folgen
5. Ergriffene MaßnahmenIncident Response
#!/bin/bash
# Incident Response Checkliste
# 1. Dokumentieren
echo "$(date): Vorfall erkannt" >> /var/log/incidents.log
# 2. Eindämmen
# iptables -A INPUT -s ATTACKER_IP -j DROP
# 3. Beweise sichern
tar -czf /backup/incident-$(date +%Y%m%d).tar.gz /var/log
# 4. Melden (wenn Personendaten betroffen)
# → Datenschutzbehörde innerhalb 72h
# → Betroffene bei hohem RisikoCheckliste
Server-Härtung
□ SSL/TLS aktiviert
□ SSH nur mit Keys
□ Firewall konfiguriert
□ Automatische Updates
□ Fail2ban aktiv
□ Minimale BerechtigungenDatenschutz
□ IP-Adressen anonymisiert
□ Logs zeitlich begrenzt
□ Verschlüsselung aktiviert
□ Backups verschlüsselt
□ TOMs dokumentiert
□ Verfahrensverzeichnis
□ AVV mit DienstleisternWebsite
□ Datenschutzerklärung
□ Cookie-Banner (wenn nötig)
□ Opt-Out-Möglichkeit
□ SSL-Verschlüsselung
□ Kontaktformular konformZusammenfassung
| Maßnahme | Umsetzung | |----------|-----------| | Verschlüsselung | TLS, Datenbank, Backups | | IP-Anonymisierung | Logs, Analytics | | Löschfristen | Log-Rotation, Cleanup-Jobs | | Zugriffsschutz | SSH, Datenbank, Admin | | Dokumentation | TOMs, Verfahrensverzeichnis |
| Recht | Umsetzung | |-------|-----------| | Auskunft | Datenexport-Funktion | | Löschung | Anonymisierung/Löschung | | Berichtigung | Bearbeitungsfunktion | | Widerspruch | Opt-Out |
Fazit
DSGVO-Compliance erfordert technische und organisatorische Maßnahmen auf Server-Ebene. Die wichtigsten Punkte sind Verschlüsselung, IP-Anonymisierung, Zugriffsschutz und dokumentierte Löschfristen. Verträge mit Dienstleistern (AVV) sind Pflicht. Die Dokumentation der Maßnahmen ist für Nachweispflichten essentiell. Bei Unsicherheiten sollte ein Datenschutzbeauftragter hinzugezogen werden.
Hinweis: Diese Informationen ersetzen keine Rechtsberatung. Bei konkreten Fragen sollte ein Rechtsanwalt oder Datenschutzbeauftragter konsultiert werden.