diff --git a/online-werkzeuge-admin.pdf b/online-werkzeuge-admin.pdf
index 185396ba3d1da906527296d34d0b52d1e0bc0ecd..81888affd280014df863e3b3b2444bba9e60ed2a 100644
Binary files a/online-werkzeuge-admin.pdf and b/online-werkzeuge-admin.pdf differ
diff --git a/online-werkzeuge-admin.tex b/online-werkzeuge-admin.tex
index 127975ee79e595be19b27070d17b92640d285a6f..4c4ee8462dd9081ab462213035fbb40dcc720c6a 100644
--- a/online-werkzeuge-admin.tex
+++ b/online-werkzeuge-admin.tex
@@ -34,6 +34,12 @@
                           moredelim=**[is][\color{darkred}]{¡}{¿},
                           moredelim=**[is][\color{blendedblue}]{°}{¿},
                           moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}}
+\lstdefinestyle{cmd}{basicstyle=\small\ttfamily\color{darkred},
+                     language={},
+                     columns=fixed,
+                     moredelim=**[is][\color{darkgreen}]{¡}{¿},
+                     moredelim=**[is][\color{blendedblue}]{°}{¿},
+                     moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}}
 
 \begin{document}
 
@@ -58,7 +64,7 @@
   im zweiten Teil (\gitfile{ow}{}{online-werkzeuge-extra.pdf}) dann
   \newterm{TightVNC\/} und \newterm{PuTTY\/} aus Sicht der Vortragenden.
 
-  Dieser dritte Teil der Anleitung soll IT-Verantwortlichen dabei unterstützen,
+  Dieser dritte Teil der Anleitung soll IT-Verantwortliche dabei unterstützen,
   die von uns eingesetzten Online-Werkzeuge auch bei sich aufzusetzen.
   \strong{Diese Anleitung ist keine Einführung
   und keine Schritt-für-Schritt-Installationsanleitung.}
@@ -107,7 +113,7 @@
       (nicht-freien, "`Closed Source"') Produkten.
       Diese Dienstleistung hat dann zwar sicherlich auch
       einen angemessenen Preis in Euro, aber zumindest
-      bezahlen Sie nicht mit Ihren privaten Daten.
+      bezahlen Sie nicht mit Ihren privaten Daten und/oder Firmengeheimnissen.
     \item
       Wir haben einige proprietäre Online-Kommunikationswerkzeuge ausprobiert
       und können das oft behauptete Plus an Funktionsumfang und Stabilität
@@ -179,38 +185,22 @@
 
   \term{Let's Encrypt\/} stellt ein Zertifikat dann aus,
   wenn man nachweisen kann, die Kontrolle über eine Domain zu haben.
-  Wir benutzen die DNS-Methode.
+  Wir benutzen für diesen Nachweis die DNS-Methode.
   Dabei stellt \term{Let's Encrypt\/} eine DNS-Anfrage an unseren Server,
   die wir mit einem unmittelbar zuvor von \term{Let's Encrypt\/}
-  erhaltenem Zufalls-String beantworten müssen.
+  erhaltenen Zufalls-String beantworten müssen.
   Dies wird durch eine spezielle Sotware automatisiert,
   den \term{Let's Encrypt\/}-Client (\file{certbot}).
 
   In unserem Beispiel läuft der DNS-Server auf einem Rechner \file{comm-0},
   der \term{Let's Encrypt\/}-Client hingegen auf einem anderen Rechner \file{main-1},
-  auf dem tatsächlich das Zertifikat benötigt wird.
+  auf dem das Zertifikat tatsächlich benötigt wird.
 
   Die Installation erfolgt mittels:
   \begin{lstlisting}[style=terminal]
     root@main-1:~# ¡apt install certbot¿
   \end{lstlisting}
-  Die Konfiguration erfolgt in der Datei \file{/etc/letsencrypt/cli.ini}.
-  Unser Beispiel enthält mehrere Variable,
-  die Sie durch die für Ihr System relevanten Werte ersetzen müssen.
-  \begin{itemize}
-    \item
-      Die E-Mail-Adresse \lstinline[style=cmd]{$SOME_E_MAIL_ADDRESS} bekommt
-      bei Bedarf relevante Mitteilungen vom \term{Let's Encrypt\/}-Projekt
-      (z.B. ablaufende Zertifikate, die nicht erneuert wurden).
-    \item
-      \lstinline[style=cmd]{$HOST1} und \lstinline[style=cmd]{$HOST2}
-      stehen für die Namen beliebiger Rechner,
-      für die jeweils ein Zertifikat beantragt werden soll.
-    \item
-      \lstinline[style=cmd]{$DOMAIN} steht für die Internet-Domain,
-      in der sich die Rechner \file{main-1} und \file{comm-0} befinden.
-  \end{itemize}
-  Inhalt der Konfigurationsdatei:
+  Die Konfiguration erfolgt in der Datei \file{/etc/letsencrypt/cli.ini}:
   \begin{lstlisting}[style=terminal]
     root@main-1:~# ¡cat /etc/letsencrypt/cli.ini¿
     # Because we are using logrotate for greater flexibility,
@@ -229,25 +219,92 @@
     manual-auth-hook = /usr/local/sbin/letsencrypt_dns_update
     post-hook = /usr/local/sbin/letsencrypt-install-new-keys
   \end{lstlisting}
-  Zum Aktualisieren des DNS-Records wird einmalig \file{dnssec-keygen}
-  (Installation mittels \lstinline[style=cmd]{apt install bind9utils}) und
-  jedesmal \file{nsupdate} (\lstinline[style=cmd]{apt install dnsutils}) benötigt.
-
-  \goodbreak
+  Hierbei steht
+  \begin{itemize}
+    \item
+      \lstinline[style=cmd]{$SOME_E_MAIL_ADDRESS} für eine E-Mail-Adresse,
+      an die bei Bedarf relevante Mitteilungen vom \term{Let's Encrypt\/}-Projekt
+      gesendet werden sollen (z.B. ablaufende Zertifikate, die nicht erneuert wurden),
+    \item
+      \lstinline[style=cmd]{$HOST1} und \lstinline[style=cmd]{$HOST2}
+      für die Namen beliebiger Rechner,
+      für die jeweils ein Zertifikat beantragt werden soll, und
+    \item
+      \lstinline[style=cmd]{$DOMAIN} für die Internet-Domain,
+      in der sich die Rechner \file{main-1} und \file{comm-0} befinden.
+  \end{itemize}
+  \strong{Hinweis: Wenn Sie diese Code-Beispiele für sich kopieren wollen,
+  verwenden Sie dazu besser nicht diese PDF-Datei, sondern den zugehörigen
+  \LaTeX-Quelltext (Datei
+  \href{https://gitlab.cvh-server.de/pgerwinski/ow/-/raw/master/online-werkzeuge-admin.text}%
+       {\file{online-werkzeuge-admin.tex}}).}
+  Dadurch vermeiden Sie Probleme mit der Zeichen-Co\-dier\-ung,
+  die in einer PDF-Datei teilweise anders ist als in einer reinen Textdatei.
+
+  Zum Aktualisieren des DNS-Records für die Teilnahme an \term{Let's Encrypt}
+  werden die Programme \file{dnssec-keygen} (einmalig für die Schlüsselerzeugung)
+  und \file{nsupdate} (jedesmal) benötigt.
+  Die Installation dieser Programme erfolgt mittels
+  \lstinline[style=cmd]{apt install bind9utils}
+  bzw.\ \lstinline[style=cmd]{apt install dnsutils}.
   
-  Wir erstellen zunächst im Verzeichnis \file{/etc/bind}
-  mit \file{dnssec-keygen} einen Schlüssel:
+  Wir erstellen zunächst im Verzeichnis \file{/etc/bind/keys}
+  mit \file{dnssec-keygen} ein Schlüsselpaar:
   \begin{lstlisting}[style=terminal]
-    root@main-1:/etc/bind# ¡dnssec-keygen -a hmac-sha512 -b 512 -n host \
-                           main-1.$DOMAIN¿
+    root@main-1:/etc/bind/keys# ¡dnssec-keygen -a hmac-sha512 -n host \
+                                  -b 512 main-1.$DOMAIN¿
   \end{lstlisting}
   (Auch hier muß \lstinline[style=cmd]{$DOMAIN} durch
   die von Ihnen verwendete Internet-Domain ersetzt werden.)
 
+  \file{dnssec-keygen} erzeugt zwei Dateien:
+  \begin{lstlisting}[style=terminal]
+    root@main-1:/etc/bind/keys# ¡ls¿
+    Kmain-1.¡$DOMAIN¿.+¡$aaa¿+¡$iiiii¿.key
+    Kmain-1.¡$DOMAIN¿.+¡$aaa¿+¡$iiiii¿.private
+  \end{lstlisting}
+  Diese Dateinamen werden wir im folgenden mit \lstinline[style=terminal]{¡$KEY¿.key}
+  bzw.\ \lstinline[style=terminal]{¡$KEY¿.private} abkürzen.
+  (\lstinline[style=cmd]{$aaa} und \lstinline[style=cmd]{$iiiii}
+  stehen für Ziffernfolgen.)
+
+  Wir müssen nun dafür sorgen, daß der auf \file{main-1} erzeugte Schlüssel
+  von \file{comm-0} auch akzeptiert wird.
+  Hierzu tragen wir auf \file{comm-0} in die Datei \file{/etc/bind/named.conf.local}
+  folgendes ein:
+  \begin{lstlisting}[style=terminal]
+    zone "_acme-challenge.mumble.¡$DOMAIN¿" {
+            type master;
+            file "/etc/bind/dynamic/db._acme-challenge.mumble.¡$DOMAIN¿";
+
+            # look for dnssec keys here:
+            key-directory "/etc/bind";
+
+            allow-update { key main-1.¡$DOMAIN¿; };
+    };
+
+    include "/etc/bind/keys/key.main-1.¡$DOMAIN¿";
+  \end{lstlisting}
+  Inhalt der Include-Datei
+  \file{/etc/bind/keys/key.main-1.\$DOMAIN}:
+  \begin{lstlisting}[style=terminal]
+    key main-1.¡$DOMAIN¿. {
+            algorithm HMAC-SHA512;
+            secret "¡$PRIVATE_KEY¿";
+    };
+  \end{lstlisting}
+  Hierbei steht \lstinline[style=cmd]{$PRIVATE_KEY}
+  für den in der Datei \file{/etc/bind/keys/\$KEY.private}
+  auf dem Rechner \file{main-1} enthaltenen privaten Schlüssel,
+  d.\,h.\ alles, was dort hinter \lstinline[style=terminal]{Key:} steht.
+  (Der private Schlüssel ist Base64-kodiert und endet daher typischerweise
+  mit mehreren Gleichheitszeichen.)
+
 %  Nach dem Erstellen des Schlüssels in \file{/etc/bind} (Kommando s.\,u.)
 %  und der Konfiguration des Rechners \file{comm-0} kann das Update erfolgen.
 
-  Für das dynamische DNS-Update verwenden wir das folgende Shell-Skript:
+  Danach kann mit Hilfe des folgenden Shell-Skripts
+  das für \term{Let's Encrypt\/} notwendige dynamische DNS-Update ausgelöst werden:
   \begin{lstlisting}[style=terminal]
     root@main-1:~# ¡cat /usr/local/sbin/letsencrypt_dns_update¿
     #!/bin/bash
@@ -263,7 +320,7 @@
     HOST="_acme-challenge"
 
     /usr/bin/nsupdate -k \
-      /etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private << EOM
+      /etc/bind/keys/¡$KEY¿.private << EOM
     server comm-0.¡$DOMAIN¿
     zone ${HOST}.${CERTBOT_DOMAIN}
     update delete ${HOST}.${CERTBOT_DOMAIN} TXT
@@ -272,54 +329,45 @@
     EOM
     echo ""
   \end{lstlisting}
-  Der auf \file{main-1} erzeugte Schlüssel
-  muß natürlich von \file{comm-0} auch akzeptiert werden.
-  Hierzu tragen wir in die Datei \file{/etc/bind/named.conf.local} folgendes ein:
+  Wenn der eigene DNS-Server nicht der primäre Server für die Domain ist,
+  wird das dynamische Update nicht sofort wirksam,
+  sondern erst nach einem AXFR-Zonentransfer. Dadurch entstehen Verzögerungen,
+  die die Authentifikation bei \term{Let's Encrypt} gefährden.
+
+  Um dies zu vermeiden, müssen wir den entsprechenden DNS-Eintrag
+  auf den sonst für \lstinline[style=cmd]{$DOMAIN} benutzten Servern
+  auf unseren eigenen Server delegieren.
+  Dies geschieht auf dem DNS-Server \file{comm-0}
+  in der Datei \file{/var/lib/bind/db.\$DOMAIN}:
   \begin{lstlisting}[style=terminal]
-    zone "_acme-challenge.mumble.¡$DOMAIN¿" {
-            type master;
-            file "/etc/bind/dynamic/db._acme-challenge.mumble.¡$DOMAIN¿";
-
-            # look for dnssec keys here:
-            key-directory "/etc/bind";
-
-            allow-update { key main-1.¡$DOMAIN¿; };
-    };
-
-    include "/etc/bind/keys/key.main-1.¡$DOMAIN¿";
+    _acme-challenge.mumble  IN NS dns-0
+  \end{lstlisting}
+  (\file{dns-0} steht für dieselbe IP-Adresse wie \file{comm-0}.)
 
-    root@comm-0:~# cat /etc/bind/keys/key.main-1.¡$DOMAIN¿
-    key main-1.¡$DOMAIN¿. {
-            algorithm HMAC-SHA512;
-            secret "$KEY_AUS_/etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private_AUF_MAIN-1";
-    };
+  Wenn wir unsere Rechner mit speziellen Namen für die angebotenen Dienste
+  ansprechen möchten (z.\,B.\ \file{mumble.\$DOMAIN} anstelle von
+  \file{main-0.\$DOMAIN}), geschieht dies in derselben Datei
+  durch einen \lstinline[style=terminal]{CNAME}-Eintrag:
+  \begin{lstlisting}[style=terminal]
+    mumble                  IN CNAME        main-0
   \end{lstlisting}
+  Aus Sicherheitsgründen wollen wir den UDP-Port 53 nicht allgemein
+  beantworten, sondern uns eigentlich auf die Server von \term{Let's Encrypt}
+  beschränken. Leider scheinen deren Anfragen von sehr vielen verschiedenen
+  Servern bei Amazon zu kommen, so daß die offensichtliche Lösung mittels
+  \file{iptables} nicht anwendbar ist.
+
+  Als Umgehungslösung wird daher aktuell beim Durchführen der Zertifikatsanfrage
+  auf \file{main-1} (durch \lstinline[style=cmd]{certbot certonly})
+  kurzzeitig auf dem Firewall-Rechner mittels
+  \begin{lstlisting}[style=cmd]
+    iptables -I INPUT -p udp --dport 53 -j ACCEPT
+  \end{lstlisting}
+  kurzzeitig die Abfrage von \file{bind} von außen erlaubt.
 
-\iffalse
+  \section{Mumble}
 
-Damit die eigentliche Challenge direkt beim eigenem DNS-Server abgefragt
-wird (um Verzögerungen durch den nötigen AXFR-Transfer zu umgehen, wird
-der entsprechende DNS-Eintrag auf den sonst für cvh-server.de benutzten
-Servern auf unseren eigenen Server delegiert), außerdem muss
-mumble.cvh-server.de natürlich einen CNAME oder A-Eintrag erhalten:
-
-root@comm-0:~# grep -F mumble /var/lib/bind/db.cvh-server.de
-mumble                  IN CNAME        main-0
-_acme-challenge.mumble  IN NS dns-0
-
-Aus Sicherheitsgründen wollen wir Port 53 aber von dort nicht allgemein
-beantworten, sondern uns eigentlich auf die Letsencrypt-Server
-beschränken. Leider scheinen deren Anfragen nun von sehr vielen
-verschiedenen Amazon-Servern zu kommen (siehe root@root-1:~# grep -F
-letsencrypt /etc/iptables.rules, welches aktuell unvollständig ist),
-daher wird aktuell beim Durchführen der Zertifikatsanfrage auf main-1
-durch "certbot certonly") kurzzeitig auf root-1 mittels 'iptables -I
-INPUT -p udp --dport 53 -j ACCEPT' kurzzeitig die Abfrage auf Bind von
-außen erlaubt.
-
-TODO: Schöner lösen!
-
-# Mumble
+\iffalse
 
 Läuft auf main-1.cvh-server.de.
 
diff --git a/online-werkzeuge-nachhaltig.pdf b/online-werkzeuge-nachhaltig.pdf
index d29cc4fe9075a15ce2473748df50281c2eb5ad0a..8591a5e597fb37a56293961554edc504a374be89 100644
Binary files a/online-werkzeuge-nachhaltig.pdf and b/online-werkzeuge-nachhaltig.pdf differ
diff --git a/online-werkzeuge-nachhaltig.tex b/online-werkzeuge-nachhaltig.tex
index 6435d83812c94ae482cf2c78e7c10394b5f2d4ee..b4f53bac892eddbe134580b1ff147cb26de73373 100644
--- a/online-werkzeuge-nachhaltig.tex
+++ b/online-werkzeuge-nachhaltig.tex
@@ -308,6 +308,9 @@
       \cite{WP: VNC} exportierte Bildschirminhalte
     \item
       \href{https://meet.jit.si/}{Jitsi Meet} \cite{Jitsi Meet} für Web-Konferenzen
+    \item
+      \href{https://moodle.org/}{Moodle} \cite{Moodle}
+      als Kursmanagementsystem und Lernplattform
     \item
       \href{https://owncloud.org/}{ownCloud} \cite{ownCloud} und
       \href{https://nextcloud.com/}{NextCloud} \cite{NextCloud}
@@ -410,6 +413,10 @@
       Jitsi Meet:
       \emph{Secure, fully featured, and completely free video conferencing}.\\
       \url{https://meet.jit.si/}
+    \bibitem{Moodle}
+      Moodle:
+      \emph{The world's most popular learning management system}.\\
+      \url{https://moodle.org/}
     \bibitem{ownCloud}
       ownCloud:
       \emph{The largest Open Source Content Collaboration Platform in the world}.\\
@@ -438,7 +445,7 @@
 
     \setlength{\leftskip}{2.25cm}
 
-    Stand: 11.\ April 2020
+    Stand: 12.\ April 2020
 
     Copyright \copyright\ 2020\quad Peter Gerwinski\\
     Lizenz: \mylicense