Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
No related merge requests found
No preview for this file type
...@@ -34,6 +34,12 @@ ...@@ -34,6 +34,12 @@
moredelim=**[is][\color{darkred}]{¡}{¿}, moredelim=**[is][\color{darkred}]{¡}{¿},
moredelim=**[is][\color{blendedblue}]{°}{¿}, moredelim=**[is][\color{blendedblue}]{°}{¿},
moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}} 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} \begin{document}
...@@ -58,7 +64,7 @@ ...@@ -58,7 +64,7 @@
im zweiten Teil (\gitfile{ow}{}{online-werkzeuge-extra.pdf}) dann im zweiten Teil (\gitfile{ow}{}{online-werkzeuge-extra.pdf}) dann
\newterm{TightVNC\/} und \newterm{PuTTY\/} aus Sicht der Vortragenden. \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. die von uns eingesetzten Online-Werkzeuge auch bei sich aufzusetzen.
\strong{Diese Anleitung ist keine Einführung \strong{Diese Anleitung ist keine Einführung
und keine Schritt-für-Schritt-Installationsanleitung.} und keine Schritt-für-Schritt-Installationsanleitung.}
...@@ -107,7 +113,7 @@ ...@@ -107,7 +113,7 @@
(nicht-freien, "`Closed Source"') Produkten. (nicht-freien, "`Closed Source"') Produkten.
Diese Dienstleistung hat dann zwar sicherlich auch Diese Dienstleistung hat dann zwar sicherlich auch
einen angemessenen Preis in Euro, aber zumindest 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 \item
Wir haben einige proprietäre Online-Kommunikationswerkzeuge ausprobiert Wir haben einige proprietäre Online-Kommunikationswerkzeuge ausprobiert
und können das oft behauptete Plus an Funktionsumfang und Stabilität und können das oft behauptete Plus an Funktionsumfang und Stabilität
...@@ -179,38 +185,22 @@ ...@@ -179,38 +185,22 @@
\term{Let's Encrypt\/} stellt ein Zertifikat dann aus, \term{Let's Encrypt\/} stellt ein Zertifikat dann aus,
wenn man nachweisen kann, die Kontrolle über eine Domain zu haben. 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, Dabei stellt \term{Let's Encrypt\/} eine DNS-Anfrage an unseren Server,
die wir mit einem unmittelbar zuvor von \term{Let's Encrypt\/} 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, Dies wird durch eine spezielle Sotware automatisiert,
den \term{Let's Encrypt\/}-Client (\file{certbot}). den \term{Let's Encrypt\/}-Client (\file{certbot}).
In unserem Beispiel läuft der DNS-Server auf einem Rechner \file{comm-0}, 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}, 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: Die Installation erfolgt mittels:
\begin{lstlisting}[style=terminal] \begin{lstlisting}[style=terminal]
root@main-1:~# ¡apt install certbot¿ root@main-1:~# ¡apt install certbot¿
\end{lstlisting} \end{lstlisting}
Die Konfiguration erfolgt in der Datei \file{/etc/letsencrypt/cli.ini}. 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:
\begin{lstlisting}[style=terminal] \begin{lstlisting}[style=terminal]
root@main-1:~# ¡cat /etc/letsencrypt/cli.ini¿ root@main-1:~# ¡cat /etc/letsencrypt/cli.ini¿
# Because we are using logrotate for greater flexibility, # Because we are using logrotate for greater flexibility,
...@@ -229,25 +219,92 @@ ...@@ -229,25 +219,92 @@
manual-auth-hook = /usr/local/sbin/letsencrypt_dns_update manual-auth-hook = /usr/local/sbin/letsencrypt_dns_update
post-hook = /usr/local/sbin/letsencrypt-install-new-keys post-hook = /usr/local/sbin/letsencrypt-install-new-keys
\end{lstlisting} \end{lstlisting}
Zum Aktualisieren des DNS-Records wird einmalig \file{dnssec-keygen} Hierbei steht
(Installation mittels \lstinline[style=cmd]{apt install bind9utils}) und \begin{itemize}
jedesmal \file{nsupdate} (\lstinline[style=cmd]{apt install dnsutils}) benötigt. \item
\lstinline[style=cmd]{$SOME_E_MAIL_ADDRESS} für eine E-Mail-Adresse,
\goodbreak an die bei Bedarf relevante Mitteilungen vom \term{Let's Encrypt\/}-Projekt
gesendet werden sollen (z.B. ablaufende Zertifikate, die nicht erneuert wurden),
Wir erstellen zunächst im Verzeichnis \file{/etc/bind} \item
mit \file{dnssec-keygen} einen Schlüssel: \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/keys}
mit \file{dnssec-keygen} ein Schlüsselpaar:
\begin{lstlisting}[style=terminal] \begin{lstlisting}[style=terminal]
root@main-1:/etc/bind# ¡dnssec-keygen -a hmac-sha512 -b 512 -n host \ root@main-1:/etc/bind/keys# ¡dnssec-keygen -a hmac-sha512 -n host \
main-1.$DOMAIN¿ -b 512 main-1.$DOMAIN¿
\end{lstlisting} \end{lstlisting}
(Auch hier muß \lstinline[style=cmd]{$DOMAIN} durch (Auch hier muß \lstinline[style=cmd]{$DOMAIN} durch
die von Ihnen verwendete Internet-Domain ersetzt werden.) 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.) % 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. % 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] \begin{lstlisting}[style=terminal]
root@main-1:~# ¡cat /usr/local/sbin/letsencrypt_dns_update¿ root@main-1:~# ¡cat /usr/local/sbin/letsencrypt_dns_update¿
#!/bin/bash #!/bin/bash
...@@ -263,7 +320,7 @@ ...@@ -263,7 +320,7 @@
HOST="_acme-challenge" HOST="_acme-challenge"
/usr/bin/nsupdate -k \ /usr/bin/nsupdate -k \
/etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private << EOM /etc/bind/keys/¡$KEY¿.private << EOM
server comm-0.¡$DOMAIN¿ server comm-0.¡$DOMAIN¿
zone ${HOST}.${CERTBOT_DOMAIN} zone ${HOST}.${CERTBOT_DOMAIN}
update delete ${HOST}.${CERTBOT_DOMAIN} TXT update delete ${HOST}.${CERTBOT_DOMAIN} TXT
...@@ -272,54 +329,45 @@ ...@@ -272,54 +329,45 @@
EOM EOM
echo "" echo ""
\end{lstlisting} \end{lstlisting}
Der auf \file{main-1} erzeugte Schlüssel Wenn der eigene DNS-Server nicht der primäre Server für die Domain ist,
muß natürlich von \file{comm-0} auch akzeptiert werden. wird das dynamische Update nicht sofort wirksam,
Hierzu tragen wir in die Datei \file{/etc/bind/named.conf.local} folgendes ein: 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] \begin{lstlisting}[style=terminal]
zone "_acme-challenge.mumble.¡$DOMAIN¿" { _acme-challenge.mumble IN NS dns-0
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¿";
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";
};
\end{lstlisting} \end{lstlisting}
(\file{dns-0} steht für dieselbe IP-Adresse wie \file{comm-0}.)
\iffalse Wenn wir unsere Rechner mit speziellen Namen für die angebotenen Dienste
ansprechen möchten (z.\,B.\ \file{mumble.\$DOMAIN} anstelle von
Damit die eigentliche Challenge direkt beim eigenem DNS-Server abgefragt \file{main-0.\$DOMAIN}), geschieht dies in derselben Datei
wird (um Verzögerungen durch den nötigen AXFR-Transfer zu umgehen, wird durch einen \lstinline[style=terminal]{CNAME}-Eintrag:
der entsprechende DNS-Eintrag auf den sonst für cvh-server.de benutzten \begin{lstlisting}[style=terminal]
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 mumble IN CNAME main-0
_acme-challenge.mumble IN NS dns-0 \end{lstlisting}
Aus Sicherheitsgründen wollen wir den UDP-Port 53 nicht allgemein
Aus Sicherheitsgründen wollen wir Port 53 aber von dort nicht allgemein beantworten, sondern uns eigentlich auf die Server von \term{Let's Encrypt}
beantworten, sondern uns eigentlich auf die Letsencrypt-Server beschränken. Leider scheinen deren Anfragen von sehr vielen verschiedenen
beschränken. Leider scheinen deren Anfragen nun von sehr vielen Servern bei Amazon zu kommen, so daß die offensichtliche Lösung mittels
verschiedenen Amazon-Servern zu kommen (siehe root@root-1:~# grep -F \file{iptables} nicht anwendbar ist.
letsencrypt /etc/iptables.rules, welches aktuell unvollständig ist),
daher wird aktuell beim Durchführen der Zertifikatsanfrage auf main-1 Als Umgehungslösung wird daher aktuell beim Durchführen der Zertifikatsanfrage
durch "certbot certonly") kurzzeitig auf root-1 mittels 'iptables -I auf \file{main-1} (durch \lstinline[style=cmd]{certbot certonly})
INPUT -p udp --dport 53 -j ACCEPT' kurzzeitig die Abfrage auf Bind von kurzzeitig auf dem Firewall-Rechner mittels
außen erlaubt. \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.
TODO: Schöner lösen! \section{Mumble}
# Mumble \iffalse
Läuft auf main-1.cvh-server.de. Läuft auf main-1.cvh-server.de.
......
No preview for this file type
...@@ -308,6 +308,9 @@ ...@@ -308,6 +308,9 @@
\cite{WP: VNC} exportierte Bildschirminhalte \cite{WP: VNC} exportierte Bildschirminhalte
\item \item
\href{https://meet.jit.si/}{Jitsi Meet} \cite{Jitsi Meet} für Web-Konferenzen \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 \item
\href{https://owncloud.org/}{ownCloud} \cite{ownCloud} und \href{https://owncloud.org/}{ownCloud} \cite{ownCloud} und
\href{https://nextcloud.com/}{NextCloud} \cite{NextCloud} \href{https://nextcloud.com/}{NextCloud} \cite{NextCloud}
...@@ -410,6 +413,10 @@ ...@@ -410,6 +413,10 @@
Jitsi Meet: Jitsi Meet:
\emph{Secure, fully featured, and completely free video conferencing}.\\ \emph{Secure, fully featured, and completely free video conferencing}.\\
\url{https://meet.jit.si/} \url{https://meet.jit.si/}
\bibitem{Moodle}
Moodle:
\emph{The world's most popular learning management system}.\\
\url{https://moodle.org/}
\bibitem{ownCloud} \bibitem{ownCloud}
ownCloud: ownCloud:
\emph{The largest Open Source Content Collaboration Platform in the world}.\\ \emph{The largest Open Source Content Collaboration Platform in the world}.\\
...@@ -438,7 +445,7 @@ ...@@ -438,7 +445,7 @@
\setlength{\leftskip}{2.25cm} \setlength{\leftskip}{2.25cm}
Stand: 11.\ April 2020 Stand: 12.\ April 2020
Copyright \copyright\ 2020\quad Peter Gerwinski\\ Copyright \copyright\ 2020\quad Peter Gerwinski\\
Lizenz: \mylicense Lizenz: \mylicense
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment