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