Commit 5490e911 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Nachhaltige Online-Werkzeuge; Dokumentation für Administratoren: Let's Encrypt (Fortsetzung)

parent 07956d09
......@@ -28,6 +28,13 @@
\newcommand{\sep}{~$\cdot$~}
\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)}
\lstdefinestyle{terminal}{basicstyle=\small\ttfamily\color{darkgreen},
language={},
columns=fixed,
moredelim=**[is][\color{darkred}]{¡}{¿},
moredelim=**[is][\color{blendedblue}]{°}{¿},
moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}}
\begin{document}
\makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill
......@@ -104,7 +111,7 @@
\item
Wir haben einige proprietäre Online-Kommunikationswerkzeuge ausprobiert
und können das oft behauptete Plus an Funktionsumfang und Stabilität
unter gleichen Bedingungen nicht bestätigen.
\emph{unter gleichen Bedingungen\/} nicht bestätigen.
(So darf man zum Beispiel ein Web-Interface
nur mit einem anderen Web-Interface vergleichen,
nicht jedoch mit einer installierten Software.)
......@@ -165,8 +172,8 @@
\section{Let's Encrypt}
Die diversen Online-Dienste benötigen X.509-Zertifikate.
% Oft laufen die Dienste auf separaten (virtuellen) Rechnern.
Für sichere Verbindungen mittels TLS
benötigen die Online-Dienste X.509-Zertifikate.
Wir zeigen hier, wie man mit Hilfe von \newterm{Let's Encrypt}
sichere Zertifikate erhält.
......@@ -181,7 +188,7 @@
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 letztlich das Zertifikat benötigt wird.
auf dem tatsächlich das Zertifikat benötigt wird.
Die Installation erfolgt mittels:
\begin{lstlisting}[style=terminal]
......@@ -225,12 +232,27 @@
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.
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.
\goodbreak
Wir erstellen zunächst im Verzeichnis \file{/etc/bind}
mit \file{dnssec-keygen} einen Schlüssel:
\begin{lstlisting}[style=terminal]
root@main-1:/etc/bind# ¡dnssec-keygen -a hmac-sha512 -b 512 -n host \
main-1.$DOMAIN¿
\end{lstlisting}
(Auch hier muß \lstinline[style=cmd]{$DOMAIN} durch
die von Ihnen verwendete Internet-Domain ersetzt werden.)
% 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:
\begin{lstlisting}[style=terminal]
root@main-1:~# ¡cat /usr/local/sbin/letsencrypt_dns_update¿
#!/bin/bash
# Generate key using: dnssec-keygen -a hmac-sha512 -b 512 -n host ¡main-1.$DOMAIN¿
# Generate key using:
# dnssec-keygen -a hmac-sha512 -b 512 -n host ¡main-1.$DOMAIN¿
if [ -z "$CERTBOT_DOMAIN" ] || [ -z "$CERTBOT_VALIDATION" ]
then
......@@ -240,7 +262,8 @@
HOST="_acme-challenge"
/usr/bin/nsupdate -k /etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private << EOM
/usr/bin/nsupdate -k \
/etc/bind/keys/Kmain-1.¡$DOMAIN¿.+165+52870.private << EOM
server comm-0$DOMAIN¿
zone ${HOST}.${CERTBOT_DOMAIN}
update delete ${HOST}.${CERTBOT_DOMAIN} TXT
......@@ -249,43 +272,43 @@
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:
\begin{lstlisting}[style=terminal]
zone "_acme-challenge.mumble.¡$DOMAIN¿" {
type master;
file "/etc/bind/dynamic/db._acme-challenge.mumble.¡$DOMAIN¿";
\iffalse
## comm-0
Der auf main-1 erzeugte Key muss natürlich von comm-0 auch akzeptiert werden:
# look for dnssec keys here:
key-directory "/etc/bind";
root@comm-0:~# grep -A6 -F mumble.¡$DOMAIN¿ /etc/bind/named.conf.local; grep '^include .*main-1' /etc/bind/named.conf.local
zone "_acme-challenge.mumble.¡$DOMAIN¿" {
type master;
file "/etc/bind/dynamic/db._acme-challenge.mumble.¡$DOMAIN¿";
allow-update { key main-1$DOMAIN¿; };
};
# look for dnssec keys here:
key-directory "/etc/bind";
include "/etc/bind/keys/key.main-1.¡$DOMAIN¿";
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}
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";
};
\iffalse
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.¡$DOMAIN¿ natürlich einen CNAME oder A-Eintrag erhalten:
mumble.cvh-server.de natürlich einen CNAME oder A-Eintrag erhalten:
root@comm-0:~# grep -F mumble /var/lib/bind/db.¡$DOMAIN¿
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 \term{Let's Encrypt\/}-Server
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),
......@@ -296,6 +319,285 @@ außen erlaubt.
TODO: Schöner lösen!
# Mumble
Läuft auf main-1.cvh-server.de.
apt install mumble-server
Standardmäßig besetzt Mumble den Port 64738. Da ich zwei unabhängige
Server haben wollte, läuft auf der VM eine zweite Instanz auf Port
64739. Die Hardware auf der die VM läuft, hat zwei offizielle
IP-Adressen, dort wird das jeweils wieder nach außen unter Port 64738 angeboten.
## root-0:
root@jitsi:~# grep mumble /etc/iptables.rules
-A PREROUTING -d 88.99.194.201/32 -p tcp -m multiport --dports 1191,1935,8888,64738 -m comment --comment main-1,..,fex,mumble -j DNAT --to-destination 192.168.137.11
-A PREROUTING -s 130.180.23.228/30 -d 88.99.194.201/32 -p udp -m multiport --dports 5060,64738 -m comment --comment sip,mumble -j DNAT --to-destination 192.168.137.11
-A PREROUTING -d 88.99.194.245/32 -p tcp -m tcp --dport 64738 -m comment --comment second-0-mumble -j DNAT --to-destination 192.168.137.11:64739
-A PREROUTING -d 88.99.194.245/32 -p udp -m udp --dport 64738 -m comment --comment second-0-mumble -j DNAT --to-destination 192.168.137.11:64739
## Konfiguration auf main-0
Konfiguration der vorkonfigurierten Instanz geschieht durch /etc/mumble-server.ini.
Die Zweit-Instanz wird durch /etc/mumble-server2.ini konfiguriert. Ich habe zum Starten das Init-Skript kopiert und angepasst:
root@main-1:~# diff --unified /etc/init.d/mumble-server{,2}
--- /etc/init.d/mumble-server 2019-02-28 17:36:21.000000000 +0100
+++ /etc/init.d/mumble-server2 2020-03-17 13:59:37.916856121 +0100
@@ -1,7 +1,7 @@
#! /bin/sh
#
### BEGIN INIT INFO
-# Provides: mumble-server
+# Provides: mumble-server2
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Should-Start: $mysql dbus
@@ -13,7 +13,7 @@
### END INIT INFO
PATH=/sbin:/bin:/usr/sbin:/usr/bin
-NAME=mumble-server
+NAME=mumble-server2
DESC="Mumble VoIP Server"
PIDDIR=/run/$NAME
PIDFILE=$PIDDIR/$NAME.pid
@@ -23,7 +23,7 @@
test -x $DAEMON || exit 0
-INIFILE=/etc/mumble-server.ini
+INIFILE=/etc/mumble-server2.ini
DAEMON_OPTS="-ini $INIFILE"
MURMUR_USE_CAPABILITIES=0
MURMUR_LIMIT_NOFILE=0
Wichtig: Es reicht nicht, die Angabe des PIDFILE dort anzupassen. Dies
muss auch in der ini-Datei passieren, wichtig ist es auch eine getrennte
Datenbank zu benutzen:
--- /etc/mumble-server.ini 2020-03-15 23:45:20.694309575 +0100
+++ /etc/mumble-server2.ini 2020-03-15 23:44:17.324835415 +0100
@@ -13,7 +13,7 @@
; Path to database. If blank, will search for
; murmur.sqlite in default locations or create it if not found.
-database=/var/lib/mumble-server/mumble-server.sqlite
+database=/var/lib/mumble-server/mumble-server2.sqlite
; Murmur defaults to using SQLite with its default rollback journal.
; In some situations, using SQLite's write-ahead log (WAL) can be
@@ -102,13 +102,13 @@
; logs to the file 'murmur.log'. If you leave this field blank
; on Unix-like systems, Murmur will force itself into foreground
; mode which logs to the console.
-logfile=/var/log/mumble-server/mumble-server.log
+logfile=/var/log/mumble-server/mumble-server2.log
; If set, Murmur will write its process ID to this file
; when running in daemon mode (when the -fg flag is not
; specified on the command line). Only available on
; Unix-like systems.
-pidfile=/run/mumble-server/mumble-server.pid
+pidfile=/run/mumble-server2/mumble-server2.pid
; The below will be used as defaults for new configured servers.
; If you're just running one server (the default), it's easier to
@@ -120,7 +120,7 @@
welcometext="<br />Welcome to this server running <b>Murmur</b>.<br />Enjoy your stay!<br />"
; Port to bind TCP and UDP sockets to.
-port=64738
+port=64739
## Letsencrypt
Standardmäßig läuft Mumble mit einem selbst-signiertem Zertifikat, was
zu Warnmeldungen beim ersten Verbinden führt und dem damit verbundenen
Sicherheitsverlust. Die Erlangung eines entsprechenden Zertifikats wurde
bereits oben beschrieben. Um das Zertifikat und den Schlüssel für Mumble
zu nutzen, wird es mit dem folgenden Skript installiert:
root@main-1:~# cat /usr/local/sbin/letsencrypt-install-new-keys
#!/bin/sh
install -m 644 -o root -g mumble-server /etc/letsencrypt/live/mumble.cvh-server.de/fullchain.pem /var/lib/mumble-server/cert.pem
install -m 640 -o root -g mumble-server /etc/letsencrypt/live/mumble.cvh-server.de/privkey.pem /var/lib/mumble-server/privkey.pem
systemctl force-reload mumble-server
## Benutzerverwaltung
Zu Beginn existiert in Mumble lediglich der Benutzer SuperUser. Neue
Benutzer*innen können sich direkt mit dem Mumble-Server verbinden und
dann mittels des Menüpunktes Self->Register ihr beim Starten des
Mumble-Clients erzeugtes (oder von einem anderen Rechner importiertes)
Zertifikat mit dem aktuell verwendeten Benutzernamen verknüpfen.
Mit dem Mumble-Client kann der SuperUser dann genutzt werden, um die
entsprechenden Personen in eine neu erstellte privilegierte Gruppe
"lehrende" aufzunemen und diesen Rechte zu geben, die es z.B.
ermöglichen, störende Teilnehmer*innen eines Gesprächs ggf.
stummzuschalten oder auszuschließen.
# OpenMeetings
Da die Installationsanleitungen für OpenMeetings von der Installation
auf einem Ubuntu-System ausgehen und andere Softwarepakete (insb. ros)
gezeigt haben, dass für Ubuntu vorgesehene Software u.U. nur
problematisch auf einem Debian GNU/Linux zum Laufen zu bringen ist,
wurde hierfür eine VM auf Ubuntu-Basis installiert:
root@root-1:~# xen-create-image --size=15Gb --swap=4096Mb --memory=4096Mb --maxmem=4096Mb --dist=bionic --ip=192.168.137.90 --no-pygrub --hostname=ubuntu-0.cvh-server.de --mirror=http://mirror.hetzner.de/ubuntu/packages
Bei der Anleitung wurde im Wesentlichen
https://cwiki.apache.org/confluence/display/OPENMEETINGS/Tutorials+for+installing+OpenMeetings+and+Tools?preview=/27838216/140774282/Installation%20OpenMeetings%205.0.0-M3%20on%20Ubuntu%2018.04%20LTS.pdf
gefolgt, allerdings wurde ffmpeg nicht selbst kompiliert, sondern aus
den Paketquellen installiert.
## Kurento Media Server
Der Kurento-Media-Server ist für die Verarbeitung von Medienströmen
(Audio-, Video- und Screensharing-Streams) notwendig und wird von
OpenMeetings verwendet. Damit Medienströme weitergeleitet werden können,
obwohl sich sowohl OpenMeetings als auch i.d.R. die Teilnehmenden hinter
einem NAT befinden, wird dieser so konfiguriert, dass er Zugriff auf
einen TURN-Server besitzt.
root@ubuntu-0:~# grep ^turnURL /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
turnURL=kurento:$TURN_PASSWORT@88.99.194.201:3478
### Coturn
Dieser TURN-Server wird außerhalb einer VM direkt auf dom0 (siehe
https://en.wikipedia.org/wiki/Xen) mittels 'apt install coturn'
installiert, die verwendete Konfiguration lautet:
root@root-1:~# cat /etc/turnserver.conf
listening-port=3478
tls-listening-port=5349
fingerprint
lt-cred-mech
user=kurento:$TURN_PASSWORT
realm=root-0.cvh-server.de
total-quota=100
stale-nonce
cert=/etc/ssl/le/fullchain.pem
pkey=/etc/ssl/le/privkey.pem
cipher-list="ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5"
no-loopback-peers
no-multicast-peers
verbose
## Raumkonfiguration
Räume und Benutzer wurden über die Weboberfläche angelegt, da keine
einfache Möglichkeit gefunden wurde, die Lehrenden jeweils automatisch
zu Moderatoren zu machen, wurden diese jeweils über ein Shellskript zu
Moderatoren jeden Raumes ernannt. Nach Anwendung ist einmalig
root@ubuntu-0:~# /etc/init.d/tomcat3 restart
auszuführen.
root@ubuntu-0:~# cat /usr/local/sbin/give_rights_to_all_lecture_rooms
#!/bin/sh
(for user in 2 5 6 7 8 12 30 31 32 33 34 35; do
for room in $(seq 21 32); do
echo "insert into room_moderator (roomId, user_id) values ($room, $user);"
done
done) | mysql --database=open503 -B
# NoVNC
Installation mittels 'apt install novnc'.
## systemd
Um mehrere Räume bereitstellen zu können, wird ein entsprechendes Skript
für systemd geschrieben. Dies lässt NoVNC dauerhaft laufen, alternativ
wäre auch eine Aktivierung beim Kontaktaufbau zum entsprechenden
TCP-Socket denkbar.
root@main-0:~# cat /etc/systemd/system/novnc@.service
[Unit]
Description = start noVNC service %i
After=syslog.target network.target
[Service]
Type=simple
User=novnc
ExecStart = /usr/local/sbin/hsbo_novnc %i
[Install]
WantedBy=multi-user.target
root@main-0:~# cat /usr/local/sbin/hsbo_novnc
#!/bin/bash
i=$1; shift
exec /usr/share/novnc/utils/launch.sh --listen $((6080 + $i)) --vnc localhost:$((5900 + $i)) $*
Wir wollen 13 Instanzen, diese werden mittels
root@main-0:~# for i in $(seq 0 12); do systemctl start novnc@$i; systemctl enable novnc@$i;done
gestartet und dauerhaft aktiviert (sodass sie nach einem Reboot wieder zur Verfügung stehen).
## Apache
NoVNC soll hinter einem Apache-Proxy bleiben. Zur Kommunikation werden WSS (secure Websockets) benötigt.
Daher müssen mittels 'a2enmod proxy_wstunnel proxy_http' die entsprechenden Module aktiviert werden.
Die entsprechende Apache-Konfiguration sieht so aus, die Verbindungen sollen grundsätzlich verschlüsselt passieren:
root@main-0:~# cat /etc/apache2/sites-enabled/novnc.cvh-server.de.conf
<VirtualHost _default_:80>
ServerAdmin webmaster@cvh-server.de
ServerName novnc.cvh-server.de
ServerAlias www.novnc.cvh-server.de
Redirect / https://novnc.cvh-server.de/
ErrorLog ${APACHE_LOG_DIR}/novnc.cvh-server.de-error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/novnc.cvh-server.de-access.log combined
</VirtualHost>
<VirtualHost _default_:443 _default_:8443>
ServerAdmin webmaster@cvh-server.de
ServerName novnc.cvh-server.de
ServerAlias www.novnc.cvh-server.de
ProxyPass /websockify ws://localhost:6080/websockify
ProxyPassReverse /websockify ws://localhost:6080/websockify
ProxyPass /websock/0/ ws://localhost:6080/websockify
ProxyPassReverse /websock/0/ ws://localhost:6080/websockify
ProxyPass /websock/1/ ws://localhost:6081/websockify
ProxyPassReverse /websock/1/ ws://localhost:6081/websockify
ProxyPass /websock/12/ ws://localhost:6092/websockify
ProxyPassReverse /websock/12/ ws://localhost:6092/websockify
ProxyPass / http://localhost:6080/
ProxyPassReverse / http://localhost:6080/
ErrorLog ${APACHE_LOG_DIR}/novnc.cvh-server.de-error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/novnc.cvh-server.de-access.log combined
SSLEngine on
</VirtualHost>
Auf die einzelnen Räume kann jetzt über URLs der Form
https://novnc.cvh-server.de/vnc.html?host=novnc.cvh-server.de&port=443&path=websock/0/&reconnect=1&resize=scale
https://novnc.cvh-server.de/vnc.html?host=novnc.cvh-server.de&port=443&path=websock/1/&reconnect=1&resize=scale
https://novnc.cvh-server.de/vnc.html?host=novnc.cvh-server.de&port=443&path=websock/12/&reconnect=1&resize=scale
zugegriffen werden.
\fi
\emph{(Fortsetzung folgt.)}
......
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