Commit 58c9c899 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Nachhaltige Online-Werkzeuge: Moodle; Dokumentation für Administratoren: Let's...

Nachhaltige Online-Werkzeuge: Moodle; Dokumentation für Administratoren: Let's Encrypt (Fortsetzung)
parent 5490e911
......@@ -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.
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment