Skip to content

Commit 00dfb67

Browse files
authored
Merge pull request #122 (Restructure)
2 parents 85f8a7e + 28c6ddf commit 00dfb67

79 files changed

Lines changed: 1253 additions & 1195 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,2 @@
11
# Admin Guide
2-
You can find this repository here: [https://adminguide.pages.dev](https://adminguide.pages.dev).
3-
4-
## Contribute
5-
Feel free to open issues / pull requests. Please validate that your changes work as intented!
6-
You can start the mkdocs development server by running `mkdocs serve`.
7-
8-
Contribution Guidelines:
9-
* Web Services are exposed to `[::1]:8000`
10-
* Secret Environment Variables are in an env_file (and not in the `docker-compose.yml` itself, to prevent leaks) with the following format:
11-
```shell
12-
# .servicename.env
13-
KEY=value
14-
```
15-
* environment variables should be in form of a YAML array, not an object:
16-
```yaml
17-
environment:
18-
- "KEY=value"
19-
```
20-
instead of
21-
```yaml
22-
# WRONG - please don't do this
23-
environemnt:
24-
KEY: value
25-
# WRONG
26-
```
27-
* If possible the service should use either mariadb or postgresql.
28-
If it makes sense, other databases (e.g. sqlite) are also quiet fine.
29-
* YAML arrays should be quoted, regardless which data is stored:
30-
```yaml
31-
volumes:
32-
- "/srv/service_name/data:/data"
33-
ports:
34-
- "[::1]:8000:1234"
35-
networks:
36-
- "default"
37-
- "database"
38-
```
39-
* All domain examples should end in `domain.de`
2+
You can find the rendered guide on [adminguide.pages.dev](https://adminguide.pages.dev).

docs/10_overview.md

Lines changed: 0 additions & 63 deletions
This file was deleted.

docs/30_backup.md

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# 1. Wahl des Reverse Proxies
2+
Im Rahmen dieses Guides werden [nginx](https://www.nginx.com/) auf dem Host sowie
3+
[Traefik](https://traefik.io/) als Container vorgestellt.
4+
5+
Nginx ist ein leistungsstarker und weit verbreiteter Webserver und Reverse Proxy, welcher sich
6+
durch hohe Stabilität, Effizienz und Flexibilität in klassischen Serverumgebungen auszeichnet.
7+
8+
Traefik hingegen ist speziell auf containerisierte Umgebungen ausgelegt und integriert sich
9+
nahtlos mit Plattformen wie Docker oder Kubernetes. Es erkennt neue Services automatisch und
10+
konfiguriert Routing-Regeln dynamisch, was es besonders für moderne, dynamische Deployments
11+
attraktiv macht.

docs/A._Theorie/20_tls.md

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# 2. TLS
2+
Für die verschlüsselte Kommunikation zwischen Nutzer und Webserver sind TLS-Zertifikate
3+
erforderlich.
4+
5+
In den Standard-Einstellungen von Betriebssystemen und Browsern ist bereits eine Auswahl
6+
vertrauenswürdiger Zertifizierungsstellen (CAs) hinterlegt. Nur Zertifikate, die von einer
7+
dieser anerkannten Stellen ausgestellt oder signiert wurden, werden vom Browser automatisch
8+
als sicher bzw. vertrauenswürdig eingestuft. Diese sogenannte "Trusted Root Certificate Authority
9+
List" wird von den jeweiligen Herstellern (z. B. Microsoft, Apple, Mozilla, Google) gepflegt und
10+
regelmäßig aktualisiert.
11+
12+
Es gibt grundsätzlich drei Möglichkeiten, TLS-Zertifikate zu beziehen bzw. auszustellen:
13+
14+
1. **Kommerzielle Anbieter**
15+
16+
Zertifikate können kostenpflichtig von anerkannten Zertifizierungsstellen wie DigiCert,
17+
GlobalSign oder GoDaddy erworben werden. Sie werden häufig von Unternehmen genutzt, um
18+
zusätzliche Garantieleistungen, erweiterte Validierungen (OV/EV) oder Supportleistungen
19+
zu erhalten.
20+
21+
2. **Kostenlose Zertifikate**
22+
23+
Let’s Encrypt wurde 2015 von der gemeinnützigen Organisation Internet Security Research Group (ISRG)
24+
gegründet. Ziel war es, das Web durch die Bereitstellung kostenloser, automatisierter und durch offene
25+
Zertifikate sicherer zu gestalten und so verschlüsselte Verbindungen (HTTPS) zum Standard im Internet
26+
zu etablieren.
27+
28+
Neben Let’s Encrypt existieren weitere Anbieter, die ähnliche kostenlose Zertifizierungsdienste anbieten,
29+
wie beispielsweise ZeroSSL und [Actalis](https://www.actalis.com/). Alle Anbieter unterstützen das
30+
ACME-Protokoll (Automatic Certificate Management Environment), über das die Ausstellung und Verlängerung
31+
von Zertifikaten automatisiert erfolgen kann.
32+
33+
Diese kostenlosen Zertifikate sind von den gängigen Browsern als vertrauenswürdig anerkannt und eignen sich
34+
hervorragend für öffentliche Websites, Webanwendungen und APIs. Im Vergleich zu kommerziellen Angeboten bieten
35+
sie zwar keine zusätzlichen Garantieleistungen oder erweiterte Validierung (z. B. EV-Zertifikate), erfüllen
36+
aber auf technischer Ebene die selben Sicherheitsstandards.
37+
38+
3. **Eigene Zertifizierungsstelle (CA)**
39+
40+
Neben öffentlichen und kommerziellen Anbietern besteht auch die Möglichkeit, eine eigene Zertifizierungsstelle
41+
(Certificate Authority, CA) zu betreiben. Damit können eigene Zertifikate ausgestellt werden – beispielsweise
42+
für interne Server, Entwicklungsumgebungen oder Testsysteme.
43+
44+
Diese Variante ist kostenlos, erfordert jedoch mehr administrativen Aufwand. Damit Browser und Betriebssysteme
45+
den ausgestellten Zertifikaten vertrauen, muss das Root-Zertifikat der eigenen CA manuell auf allen beteiligten
46+
Geräten installiert werden. In kontrollierten Umgebungen (z. B. Firmennetzwerke oder geschlossene Systeme) kann
47+
dies automatisiert über zentrale Verwaltungswerkzeuge erfolgen.
48+
49+
Für den produktiven Einsatz im öffentlichen Internet ist diese Lösung jedoch nicht geeignet, da externe Nutzer
50+
das Root-Zertifikat nicht installiert haben und der Browser die Verbindung daher als nicht vertrauenswürdig
51+
einstufen würde.
52+
53+
!!! warning
54+
Von der Verwendung selbstsignierter Zertifikate und dem Ignorieren von Browserwarnungen ist dringend abzuraten.
55+
56+
Wer sich daran gewöhnt, Sicherheitsmeldungen einfach „wegzuklicken“, entwickelt schnell ein riskantes Verhalten.
57+
58+
Im Rahmen dieses Guides wird auf kostenlose TLS-Zertifikate des Anbieters Let’s Encrypt gesetzt.
59+
60+
Für die Verwaltung dieser stehen verschiedene Tools und Clients zur Verfügung. Wird nginx als Reverse Proxy
61+
eingesetzt, bietet sich die Verwendung von [acme.sh](https://github.com/acmesh-official/acme.sh), ein schlanker,
62+
in Shell geschriebener ACME-Client, der sich einfach in bestehende Umgebungen integrieren lässt, an.
63+
Traefik hingegen verwendet für diesen Zweck standardmäßig den in Go entwickelten ACME-Client [Lego](https://go-acme.github.io/lego/).
64+
65+
Unabhängig von der gewählten Implementierung stehen bei Let’s Encrypt verschiedene [ACME-Challenge-Typen](https://letsencrypt.org/docs/challenge-types/)
66+
zur Verfügung, über die die Domainvalidierung erfolgt.
67+
68+
Während die Challenge-Typen HTTP-01 und TLS-ALPN-01 voraussetzen, dass der Reverse Proxy aus dem Internet
69+
erreichbar ist, bietet die DNS-01-Challenge die Möglichkeit, die Domainvalidierung über einen TXT-Eintrag
70+
im DNS durchzuführen. Dadurch muss der Webserver nicht öffentlich zugänglich sein, und die ausgestellten
71+
Zertifikate können somit auch in internen Umgebungen verwendet werden.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# 3. Eine IPv6 Adresse pro Service
2+
3+
!!! note
4+
Die meisten Hosting-Provider weisen jedem Server ein /64-IPv6-Präfix zu,
5+
was einem Adressraum von $2^{64}$ Adressen entspricht – eine Zahl, die in
6+
der Praxis quasi unerschöpflich ist.
7+
8+
Ausnahmen gibt es beispielsweise bei Strato: Dort wird nicht ein ganzes /64-IPv6-Präfix,
9+
sondern lediglich eine einzelne IPv6-Adresse pro Server zugewiesen. Dadurch ist es nicht
10+
möglich, jedem Dienst eine eigene IPv6-Adresse zu geben
11+
([siehe YouTube Short](https://www.youtube.com/shorts/oSvU4HXZ_Wc)).
12+
13+
Wird jedem nginx Reverse Proxy eine eigene IPv6-Adresse zugewiesen, kann bereits auf OSI-Layer 3
14+
nachvollzogen werden, an welchen Webservice eine Anfrage gerichtet war. Würde hingegen für alle
15+
Dienste nur eine gemeinsame Adresse verwendet, wäre eine eindeutige Zuordnung frühestens auf
16+
Layer 5 (durch Auswertung des TLS SNI Headers) möglich; ohne ein spezielles Analysewerkzeug sogar
17+
erst auf Layer 7, etwa über die Logdaten des Webservers.
18+
19+
Der Webserver nginx bietet mit der Direktive `listen` die Möglichkeit, virtuelle Hosts an spezifische
20+
IPv4- oder IPv6-Adressen zu binden. Diese Technik erlaubt eine frühzeitige Trennung und Zuordnung des
21+
eingehenden Traffics zu den einzelnen Anwendungen. Soll ein Dienst abgeschaltet oder vorübergehend
22+
blockiert werden, kann dessen zugewiesene Adresse zudem sehr einfach über die Firewall – oder sogar
23+
direkt beim Provider – gesperrt werden, ohne dass Änderungen an der Servicekonfiguration selbst
24+
erforderlich sind.
25+
26+
27+
## Useful Scripts
28+
29+
### IPv6 Adresse generieren
30+
!!! note
31+
Dieses Skript erzeugt jediglich eine neue IPv6-Adresse! Diese wird nicht automatisch dem
32+
Netzwerkinterface hinzugefügt. Dies muss separat erfolgen!
33+
34+
Das erstellen einer neuen IPv6 Adresse aus dem /64 Präfix des Servers kann mit folgendem simplen
35+
Skript automatisiert werden:
36+
37+
```bash
38+
#!/bin/bash
39+
40+
v=$(cat /dev/urandom | tr -dc a-f0-9 | fold -w16 | head -n1)
41+
echo your:first:four:blocks:${v:0:4}:${v:4:4}:${v:8:4}:${v:12}
42+
```
43+
44+
Die ersten vier Blöcke der IPv6-Adresse (`your:first:four:blocks`) müssen dabei durch das
45+
jeweilige /64-Präfix des Servers ersetzt werden (Bsp.: `2001:0db8:85a3:0053`).
46+
47+
48+
### Verwendete Ports auflisten
49+
Wenn man jedem Dienst eine eigene IPv6-Adresse zuweist, kann jeder Dienst nach Außen den gleichen
50+
Port verwenden (z. B. 443 für HTTPS). Auf dem Host müssen die Ports jedoch unterschiedlich sein.
51+
Um sich die verwendet Ports aller Dienste anzeigen zu lassen, kann folgender Befehl verwendet werden:
52+
`grep -oP "(?<=proxy_pass)[^;]*" /etc/nginx/sites-enabled/* | sed "s/ /\t/" | expand -t 30 | grep ${1:-.}`
53+
54+
55+
Wenn man diesen Befehl in eine Funktion schreibt und diese in die `.bashrc` einfügt, kann man nach
56+
der Verwendung eines genauen Ports suchen:
57+
```bash
58+
function searchport {
59+
grep -oP "(?<=proxy_pass)[^;]*" /etc/nginx/sites-enabled/* | sed "s/ /\t/" | expand -t 30 | grep ${1:-.}
60+
}
61+
```
62+
63+
Verwendung: `searchport 8080` -> Listet alle Dienste auf, die den Port 8080 verwenden.
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# 4. IPv4 to IPv6 Proxy
2+
3+
## Sonderfälle
4+
### Virtualisierungsserver
5+
Zwar richtet sich dieser Guide in erster Linie an Administratoren einfacher vServer, doch kann es
6+
schnell vorkommen, dass aufgrund steigender Leistungsanforderungen auf einen dedizierten Server
7+
gewechselt wird.
8+
9+
Nehmen wir an, ein solcher Server verfügt über eine IPv4-Adresse und ein /64-IPv6-Präfix, auf dem
10+
mehrere virtuelle Maschinen betrieben werden sollen. Das Hostsystem, das direkt auf der physischen
11+
Hardware installiert ist, kann in diesem Szenario als Router fungieren. Über NAT und Port Address
12+
Translation (PAT) lassen sich dabei gezielt einzelne Ports an die virtualisierten Systeme weiterleiten.
13+
14+
Dank des zugewiesenen IPv6-Präfixes kann jedoch jeder virtuellen Maschine eine eigene öffentliche
15+
IPv6-Adresse zugeordnet werden, wodurch sie direkt aus dem Internet erreichbar ist – ganz ohne NAT.
16+
17+
In diesem Zusammenhang kann der Einsatz eines IPv4-zu-IPv6-Proxys sinnvoll sein. Ein solcher Proxy
18+
nimmt Anfragen über IPv4 entgegen und leitet sie intern per IPv6 an den Zielserver weiter. Auf diese
19+
Weise bleibt die Erreichbarkeit auch für IPv4-Clients gewährleistet, selbst wenn die eigentliche
20+
Infrastruktur ausschließlich auf IPv6 basiert.
21+
22+
### IPv6-only Server
23+
Angenommen, es steht eine größere Anzahl von Servern zur Verfügung. Um Kosten und Verwaltungsaufwand
24+
zu reduzieren, wird dabei bewusst auf individuelle IPv4-Adressen verzichtet und jedem System ausschließlich
25+
ein IPv6-Netz zugewiesen.
26+
27+
!!! warning
28+
Dieses Setup impliziert, dass die Systeme selbst keine ausgehende IPv4-Verbindung aufbauen können.
29+
Das kann die Administration erschweren – beispielsweise, wenn Repositories von GitHub, Docker Hub oder
30+
anderen ausschließlich über IPv4 erreichbaren Diensten bezogen werden sollen. In solchen Fällen ist
31+
entweder ein IPv6-fähiger Mirror oder ein NAT64-Gateway erforderlich, um den Zugriff zu ermöglichen.
32+
33+
Die wenigsten Anbieter stellen derzeit NAT64 Gateways zur Verfügung, weshalb zum derzeitigen Zeitpunkt
34+
von dieser Systemarchitektur abzuraten ist.
35+
36+
Die Erreichbarkeit dieser Server aus dem IPv4-Internet kann in einem solchen Szenario über einen zentralen
37+
IPv4-zu-IPv6-Proxy sichergestellt werden. Dieser Proxy fungiert als gemeinsame Eingangsstelle für alle
38+
IPv4-Anfragen und leitet sie intern über IPv6 an die jeweiligen Zielsysteme weiter – effizient, kostensparend
39+
und ohne die Notwendigkeit zusätzlicher IPv4-Ressourcen.
40+
41+
## IPv4-to-IPv6 Proxy
42+
Zur Vereinfachung der vorgestellten Sonderfälle kann folgende einfache nginx Konfiguration verwendet werden.
43+
Diese implementiert einen IPv4-to-IPv6 Proxy, der zwar in dieser Version lediglich HTTP- und HTTPs-Verbindungen
44+
unterstützt, jedoch mit geringfügigen Anpassungen auch für andere TLS-gesicherte Protokolle wie SMTPs, IMAPs
45+
oder POP3s verwendet werden kann.
46+
47+
```nginx
48+
user nginx;
49+
worker_processes auto;
50+
51+
error_log /var/log/nginx/error.log notice;
52+
pid /var/run/nginx.pid;
53+
54+
events {
55+
worker_connections 1024;
56+
}
57+
58+
http {
59+
include /etc/nginx/mime.types;
60+
default_type application/octet-stream;
61+
62+
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
63+
'$status $body_bytes_sent "$http_referer" '
64+
'"$http_user_agent" "$http_x_forwarded_for"';
65+
access_log /var/log/nginx/access.log main;
66+
67+
sendfile on;
68+
keepalive_timeout 65;
69+
70+
server {
71+
listen 80 default_server;
72+
location / {
73+
return 301 https://$host$request_uri;
74+
}
75+
}
76+
}
77+
78+
stream {
79+
server {
80+
listen 443;
81+
82+
proxy_connect_timeout 1s;
83+
proxy_timeout 3s;
84+
85+
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] ipv6=on ipv4=off;
86+
87+
proxy_pass $ssl_preread_server_name:443;
88+
ssl_preread on;
89+
}
90+
}
91+
```
Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
1-
# Internal Networks
1+
# 5. Internal Networks
22

3-
Die im AdminGuide aufgeführten Services erhalten grundsätzlich alle ihre eigene Datenbank. Dies erfordert zum einen mehr
3+
Die in diesem Guide aufgeführten Services erhalten grundsätzlich alle ihre eigene Datenbank. Dies erfordert zum einen mehr
44
Ressourcen, als eine zentrale Datenbank, zum anderen erfordert es beim Exportieren der Datenbanken für ein Backup die
55
Behandlung mehrerer Datenbankserver.
66

77
Wenn man eine Datenbank für alle Dienste nutzen möchte so sollte dieser als eigener Service definiert werden und über ein
88
docker-internes Netzwerk mit den anderen Diensten kommunizieren.
99

10-
![Schematic with internal networks](img/internal_networks.png){: loading=lazy }
10+
```mermaid
11+
flowchart LR
12+
Internet@{ shape: cloud, label: Internet }
13+
Web@{ shape: diamond, label: "Reverse Proxy" }
14+
A[HedgeDoc]
15+
B[Nextcloud]
16+
DB@{ shape: cyl, label: MariaDB }
17+
18+
Internet <-- "[::]:443" --> Web
19+
Web <-- "[::1]:8000" --> A
20+
Web <-- "[::1]:8001" --> B
21+
A & B <--> DB
22+
```
1123

1224
Das interne Netzwerk kann mit dem folgenden Befehl erstellt werden:
1325
```shell

0 commit comments

Comments
 (0)