Günther Obermaiers Webseite



rigel.ulm.go-itservice.de

Lenovo X201 mit Debian 9.0 Stretch

Um den alten X41 zu ersetzen, klonte ich den kombinierten Firewall-,Web-und Fileserver wega. Identität kopierte ich vom alten rigel, anschliessend passte ich Firewallskripte ec. an. Die eigentliche Umstellung erfolgte überhastet, am alten Firewall war mir wegen einer Unachtsamkeit der Stecker zur uralten 3Com PCMCIA-Netzwerkkarte kaputtgegangen, die als externes Interface diente.

Hardware:

TypX201
CPUINTEL i5-560 2x2.66 GHz
Speicher4 GB, DDR3-SDRAM PC3-8500
Grakaon Board Intel GMA HD (5700MHD)
Display1280x800
Netzwerkon Board: 1GBit Intel
PlatteSSD 32GB
Cardreaderintegriert SDHC/SDXC

Systemkopie

Nachdem in Ulm noch zwei Server und in Augsburg einer wartete, klonte ich diese. Die Platte für den neuen rigel steckte in der Workstation spica, während das Original in Ulm werkelte. Partition via fdisk, zwei Paritionen:
	 26,0 GB 	sdf1	83
	  4,0 GB 	sdf1	82
# mkfs.ext4 /dev/sdf1
# mkswap /dev/sdf2
# mount /dev/sdf1 /dest
das sonst verwendete cpHOST-Skript arbeitet nur lokal, ich wollte die Platte aber nicht an wega anstecken, also den rsync von Hand:
# rsync -avrtHAX --delete --progress --exclude /local --exclude /proc --exclude /sys --exclude /dev --exclude /home --exclude /media  --exclude /backup  --exclude /SDCARD root@wega:/ /dest/
# sed -i s/545f7845-23c5-4472-8e6b-fdcd470914fb/9174fc9c-58aa-4d65-8d0e-eec221fc7ecf/g etc/fstab
# sed -i s/545f7845-23c5-4472-8e6b-fdcd470914fb/9174fc9c-58aa-4d65-8d0e-eec221fc7ecf/g boot/grub/grub.cfg
# sed -i s/ac321ef7-3b28-4e9a-a7cc-01ee8f8737c1/0381627c-966a-4e1c-a5e2-7968d27bd185/g etc/fstab
# sed -i s/ac321ef7-3b28-4e9a-a7cc-01ee8f8737c1/0381627c-966a-4e1c-a5e2-7968d27bd185/g boot/grub/grub.cfg
# sed -i s/ac321ef7-3b28-4e9a-a7cc-01ee8f8737c1/0381627c-966a-4e1c-a5e2-7968d27bd185/g etc/uswsusp.conf
# sed -i s/ac321ef7-3b28-4e9a-a7cc-01ee8f8737c1/0381627c-966a-4e1c-a5e2-7968d27bd185/g etc/initramfs-tools/conf.d/resume
# scp root@ulm-goitservice.dyndns.org:/etc/hosts /dest/etc/hosts
# scp root@ulm-goitservice.dyndns.org:/etc/hostname /dest/etc/hostname
# scp root@ulm-goitservice.dyndns.org:/etc/mailname /dest/etc/mailname
# scp root@ulm-goitservice.dyndns.org:/etc/exim4/update-exim4.conf.conf /dest/etc/exim4/update-exim4.conf.conf
# scp root@ulm-goitservice.dyndns.org:/etc/resolv.conf /dest/etc/resolv.conf
einige Daten von der alten Platte kopieren, diese war noch im Laptop und deshalb im Netz direkt erreichbar. Zuerst die Identitätsdaten (unter /root/.ssh, /etc/ssh) kopieren, via ssh nach ULM ssh root@ulm-goitservice.dyndns.org und folgendes Kommando ausführen:
cpHOST / /dest IDENTITY
wieder auf spica:
rsync -avrtHAX root@ulm-goitservice.dyndns.org:/dest/ /dest/
scp root@ulm-goitservice.dyndns.org:/etc/init.d/obi1 /dest/etc/init.d/obi1
rsync --progress -avrtHAX root@ulm-goitservice.dyndns.org:/etc/apache2/ /dest/etc/apache2/
In die /etc/apt/sources.list wird die Zeile für das Benno Repository eingefügt:
# echo "deb http://www.benno-mailarchiv.de/download/debian/ /" >> /dest/etc/apt/sources.list
Nun wanderte die neue Platte in einem X201 nach Ulm und wartete einige Wochen, bis ich besagten Stecker schrottete. Also wurde der neue Firewall direkt in Betrieb genommen. Zuerst hatte ich kurz Schwierigkeiten mit dem externen USB-Netzwerkadapter, der als Interface Richtung Fritzbox dient. Nachdem die globals.sh (mit Einstellungen wie Netzwerkinterface ec) als Datendate für die Firewallskripte korrigiert war, lief rigel auf Anhieb als Firewall und Proxy (mit squid).

auf Webcams über apache2-Proxy zugreifen

Die von mir gekauften upCam cyclone HD S+ können über Firefox unter Linux kontrolliert werden, die Defaults (zumindest bei meinen Exemplaren):
IP:        192.168.1.126
User:      admin
Passwort:  admin
Das sollte man neben Namen und Passwort für Standarduser und Gastuser sofort ändern!
Um auf die Kamera über Port 80 zugreifen zu können, verwende ich den auf rigel (oder deneb und wega) sowieso installierten Apache2 Webserver als Proxy. Die Kameras sind, egal ob via LAN oder WLAN angeschlossen, uüber das entsprechende Unterverzeichnis zu erreichen, also http://USER:PASSWD@DYNDNSADRESSE/CAMNAME/tmpfs/snap.jpg für das Kamerabild selbst. Um den Apache2 als Proxy benutzen zu können, muss das Proxy-Modul aktiviert und der Apache neu gestartet werden:
# a2enmod proxy proxy_http
# service apache2 restart
In der Konfigurationsdatei für die von aussen zugängliche Webseite muss die Proxyfunktion ebenfalls eingebaut werden.
<VirtualHost *>
    ServerName      myulm.go-itservice.com
    ServerAlias     DYNDNSADRESSE
    DocumentRoot    /home/go/httpd/myulm.go-itservice.com/htdocs
    DirectoryIndex  index.php index.html index.htm

    ProxyPass /alkyone http://192.168.80.81
    ProxyPassReverse /alkyone http://192.168.80.81
    ProxyPassReverseCookieDomain 192.168.80.81 revProxy
    ProxyPassReverseCookiePath / /alkyone
...
Kritisch ist, dass die Zugangsdaten via http im Klartext übertragen werden, da werde ich noch irgendwie auf https bis zum Proxy umstellen. Intern kann ich http nicht ändern, die Kameras unterstützen kein https, was mir im lokalen Netz aber auch egal ist. Auch würde ich die Kameras für die endgültige Installation noch in eine DMZ packen, am Zielstandort sind sie aber sowieso zwischen Router und interner Firewall
Dummerweise funktioniert die Adminoberfäche der Kameras nicht über das Unterverzeichnis des Proxy, anscheinend werden da nicht nur relative sondern auch absolute Pfade verwendet. Um erst mal wenigstens die Grundfunktionen: Bild anzeigen und Kamera schwenken verwenden zu können, habe ich die URLs aus dem Apache-Log gefischt. Der Base-URL ist immer http://USER:PASSWD@DYNDNSADRESSE/CAMNAME
URLWirkung
/tmpfs/snap.jpgBild (Full HD) anzeigen
/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=left&-speed=15Kamera nach links (gegen Uhrzeiger bei aufrechter Montage) um ca 15 Grad schwenken
/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=right&-speed=15Kamera nach rechts schwenken
/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=up&-speed=15Kamera nach oben schwenken
/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=down&-speed=15Kamera nach unten schwenken
Auf die Schwenkkommandos gibt es eine kurze Success Meldung als Antwort. Dies passiert auch, wenn die Kamera schon an der Extremposition angekommen ist, ein weiterer Schwenk erfolgt dann aber nicht.
Was mir an der Kamera übrigens sehr gut gefallen hat: Sie telefoniert nicht nach Hause! Zumindest ist mir im Log mit iptraf-ng nichts Verdächtiges aufgefallen. Ich lies den Netzwerksniffer schon vor dem ersten Einschalten der Kamera über insgesamt zwei Stunden laufen, weil ich von den China-Penants viel Schlechtes in dieser Richtung gelesen hatte.

Apache2 als HTTPS Server mit Letsencrypt Zertifikat

Um die Zugangsdaten zu den Kameras nicht grad im Klartext über das Internet zu schicken, erweiterte ich den Server mit https. Ins interne Netz benötige ich https erstmal nicht.
Zuerst muss man die /etc/apt/sources.list um Stretch Backports erweitern, das hatte ich wegen der Installation des 4.14er Kernels sowieso drin:
deb http://ftp.de.debian.org/debian/ stretch-backports main
Dann den in Pyton geschriebenen Certbot aus den backports samt seinen Bibliotheken installieren. Anschliessend den Certbot starten
# apt-get install python-certbot-apache -t stretch-backports
# certbot --apache
Die gestellten Fragen beantworten.
MAIL:            MAILADRESSE
Terms:           A   (akzeptieren)
Weitergabe EFF:  N   [NY]
HTTPS fuer?      4   (MYSUBDOMAIN.dyndns.org)
Nur HTTPS:       1   (HTTP bleibt unverändert)
Die Letsencrypt Zertifikate laufen typischerweise 3 Monate und können mit dem Certbot manuell mit
# certbot renew
oder via cronjob mit crontab -e>erneuert werden:
00 02 5 * * /usr/bin/certbot renew
Der Certbot legt eine funktionierende myulm.go-itservice.com.ssl an. Da ich aber keine Lust habe, die Virtual Host Dateien doppelt zu pflegen, habe ic den gemeinsamen Teil in eine include-Daite (myulm.go-itservice.com.include) ausgelagert:
    ServerName      myulm.go-itservice.com
    ServerAlias     ulm-goitservice.dyndns.org
    DocumentRoot    /home/go/httpd/myulm.go-itservice.com/htdocs
    DirectoryIndex  index.php index.html index.htm

    ProxyPass /elektra http://192.168.80.82
    ProxyPassReverse /elektra http://192.168.80.82
    ProxyPassReverseCookieDomain 192.168.80.82 revProxy
    ProxyPassReverseCookiePath / /elektra

    <Directory /home/go/httpd/myulm.go-itservice.com/data/cgi>
        Options ExecCGI FollowSymLinks
        AllowOverride none
        order allow,deny
        allow from all
    </Directory>
    <Directory /home/go/httpd/myulm.go-itservice.com/htdocs/mydba>
        AllowOverride AuthConfig
    </Directory>
in der myulm.go-itservice.com.ssl bleibt folgender Code
<IfModule mod_ssl.c>
<VirtualHost *:443>
	include sites-available/myulm.go-itservice.com.include
	SSLCertificateFile /etc/letsencrypt/live/vach-goitservice.dyndns.org/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/vach-goitservice.dyndns.org/privkey.pem
	Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
die myulm.go-itservice.com ist nur mehr rudimentär
<VirtualHost *>
	include sites-available/myulm.go-itservice.com.include
</VirtualHost>
Die Dateien liegen unter /etc/apache2/sites-available und werden nach /etc/apache2/sites-enabled verlinkt.
Falls noch nicht geschehen, muss das ssl-Modul im Apache aktiviert und der Apache selbst auch wegen der Änderung der Konfiguration neu gestartet werden.
# a2enmod ssl
# service apache2 restart
Damit das auch aus dem Internet funktioniert, muss am Router eine Weiterleitung des Ports 443 auf den Port 443 des Apache Servers (oder der Firewall) eingetragen werden. Alternativ geht natürlich auch ein anderer Port, allerdings sind aus vielen Firmennetzen nur 80 und 443 nach aussen freigegeben.
Verwendet man wie ich eine eigene Firewall, muss dort der Port 443 von aussen freigeben werden!

benno Mail Archiv installieren

benno PGP Key hinzufügen:
# wget -O - http://www.benno-mailarchiv.de/download/debian/benno.asc | apt-key add - 
Benno mit apt-get oder aptitude installieren, wobei php7, apache2 und pear schon installiert waren:
# apt-get update
# apt-get install benno-archive benno-rest benno-web
# apt-get install php-mbstring
Shared Secret erzeugen:
echo 'PASSWORD' > /etc/benno/rest.secret
chown benno.benno /etc/benno/rest.secret
chmod 0440 /etc/benno/rest.secret
und in den Dateien /etc/benno/benno.xml ('sharedSecret') und /etc/benno-web/benno.conf ('SHARED_SECRET') eintragen, ebenso in der rest.conf
echo 'SHARED_SECRET = PASSWD' > /etc/benno-web/rest.conf
Host- und Portkonfigurationen zwischen /etc/benno/jetty.xml ('host','port') und /etc/benno-web/benno.conf ('BASE_URL') vergleichen. Bei der kommerziellen Variante muss die Lizenzdatei nach /etc/benno/benno.lic kopiert werden, bei der Open Edition, einfach eine leere Lizenzdatei anlegen:
# touch /etc/benno/benno.lic
Konfiguration /etc/benno-web/benno.conf anpassen:
USERPERMISSONS = DISABLED
benno erwartet das Repository unter /srv/benno, auf deneb soll dies aber unter /home/benno liegen, also einfach
# cd /srv
# mv benno /home
Dann in der /etc/benno/benno.xml drei Stellen anpassen. (Mit symlink gehts notfalls auch) und benno neu starten
# /etc/init.d/benno-rest restart
Kontrolle, ob benno-rest bzw benno-archive läuft:
# systemctl status benno-rest.service
# systemctl status benno-archive.service
im Ordner /var/log/benno sollte die Datei rest.log am Ende etwa so aussehen:
2018-01-18 18:35:33,767 INFO  Starting bennorest: 2.4.2 (180112162902) / bennocore: 2.4.2 (180112085546)
2018-01-18 18:35:35,024 INFO  License in /etc/benno/benno.lic is valid
2018-01-18 18:35:35,025 INFO  Starting Jetty server from file /etc/benno/jetty.xml
2018-01-18 18:35:35,083 INFO  Read shared secret from /etc/benno/rest.secret
und die archive.log
2018-01-18 20:48:39,226 INFO  Shutting down "Bennoarchive BennoMailArchiv"
2018-01-18 20:48:45,446 INFO  reloading services (number of services changed)
2018-01-18 20:48:46,816 INFO  Starting bennoarchive: 2.4.2 (180112090002) / bennocore: 2.4.2 (180112085546)
2018-01-18 20:48:46,816 INFO  Starting management server on 127.0.0.1:2555
Damit die im nächsten Schritt via fetchmail abgeholten Mails auch zugestellt werden, ist neben einem MTA (exim4, postfix geht auch) noch ein Programm zur lokalen Verteilung nötig, in unserem Fall procmail was ebenfalls installiert wird.
# apt-get install procmail fetchmail
Zur Konfiguration der korrekten Mailablage für Benno dient folgende /etc/procmailrc
ORGMAIL=/home/benno/
DEFAULT=${ORGMAIL}
MAILDIR=/home/benno

:0
inbox/
Zum Abholen der Mails von agena12 auf rigel wird fetchmail als Daemon konfiguriert. Dazu in der /etc/default/fetchmail
start_daemon=yes
Nun wird das Zertifikat von agena12 geholt und der Fingerprint in die /etc/fetchmailrc neben den abzuholenden Postfächern eingetragen. Das Resultat der dritten Zeile ist der benötigte Fingerprint
# mkdir /etc/ssl/fetchmaild
# echo "quit" | openssl s_client -connect mail.go-itservice.com:995 -showcerts 2>/dev/null | sed -ne '/BEGIN/,/END/p' >/etc/ssl/fetchmaild/mail.go-itservice.com.pem
# openssl x509 -in /etc/ssl/fetchmaild/mail.go-itservice.com.pem -fingerprint -noout -md5
# vi /etc/fetchmailrc
# chmod 600 /etc/fetchmailrc
# chown fetchmail:root /etc/fetchmailrc
die /etc/fetchmailrc sieht dann so aus, Achtung, die Einrückungen ab der 2.Zeile sind Absicht:
poll www.wo-k.de  protocol POP3 user "go-arv@go-itservice.com" there with password "PASSWD" is go
 ssl
 sslfingerprint "1A:1F:8E:5A:3E:5E:86:96:C1:FF:24:36:FE:50:5E:44"
 fetchall
 no keep
Diese Zeilen werden für jedes abzuholende Postfach kopiert und die userspezifischen Daten angepaßt. fetchmail neu starten und Status prüfen:
# /etc/init.d/fetchmail restart
# systemctl status fetchmail.service
Nun wird eine Shellskript angelegt und mittels crontab dafür gesorgt, dass es alle 10 Minuten ausgeführt wird. Die Datei /root/bennocron.sh sieht so aus:
#!/bin/sh
for MAILFILE in `ls -1 /home/benno/inbox/new`; do
  /bin/chown benno "/home/benno/inbox/new/${MAILFILE}"
  /bin/ln "/home/benno/inbox/new/${MAILFILE}" "/home/benno/inbox/${MAILFILE}.eml" && /bin/rm "/home/benno/inbox/new/${MAILFILE}"
done
exec-Flag nicht vergessen!
Einfügen von gesendeten Mails
dazu wird auf dem Mailserver agena12 der benno-milter installiert: In /etc/apt/sources.list folgende Zeile für das Benno Repository einfügen:
deb http://www.benno-mailarchiv.de/download/debian /
Dann benno PGP Key hinzufügen:
# wget -O - http://www.benno-mailarchiv.de/download/debian/benno.asc | apt-key add - 
benno-milter mit apt-get oder aptitude installieren:
# apt-get install benno-milter
main.cf ergänzen (ganz unten einfügen) und anschliessend postfix neu starten:
...
### Benno MailArchiv Milter 
smtpd_milters = unix:/benno-milter/benno-milter.sock
non_smtpd_milters = local:/benno-milter/benno-milter.sock
#milter_default_action = accept 
milter_default_action = tempfail
Mit /root/mvsendmails, von einem cronjob regelmässig ausgeführt, werden die vom benno-milter unter /srv/benno/inbox/ ausgeworfenen Mails analysiert und die benötigten in das auch von getbigmails verwendete Transferverzeichnis verschoben. getbigmails übernimmt auch den Transport der gesendeten Mails, deshalb die Umbennenung der .eml-Dateien im Skript. Datei /root/mvsendmails auf agena12:
DOUT=/var/log/mvsendmails.log
date 1>>$DOUT 2>&1
cd /srv/benno/inbox; grep "go@go-itservice.com" *.eml | grep -v "d-From:" | grep From:| sed 's/:.*//' | xargs mv -t /local/transfer/go-itservice/ 1>>$DOUT 2>&1
...
Probleme mit Abholung grosser Mails (>20 MB)
Bei der Abholung via Fetchmail treten bei grossen Dateien endlose Versuche auf: Die Datei wird gelesen, aber nie abgeschlossen. Durch immer neue Leseversuche nimmt das Datenvolumen auffällig zu, ohne daß die Mail jemals in Benno importiert werden kann.
Als Workarround dient eine Kombination aus find, mv und rsync. Auf dem Mailserver agena12 läuft ein cronjob, der Dateien grässer als 10 MB in ein Transferverzeichnis verschiebt, aus der sie ein zweiter cronjon, diesmal auf dem lokalen benno-Server rigel, abholt und in das benno Verzeichnis verschiebt, wo benno die grossen Dateien klaglos importiert. Die Datei /root/mvbigmails auf agena12 ist auch noch für eine andere Domäne zuständig:
DOUT=/var/log/mvbigmails.log
date 1>>$DOUT 2>&1
find /var/vmail/go-itservice.com/go-arv/Maildir -mtime -14 -size +10M | xargs mv -t /local/transfer/go-itservice 1>>$DOUT 2>&1
...
Datei /root/getbigmails auf rigel:
DOUT=/var/log/getbigmails
date  1>>$DOUT 2>&1
rsync -e 'ssh -p 10002' -avurt --remove-source-files root@144.76.232.98:/local/transfer/infoflip/ /home/benno/inbox/new/ 1>>/var/log/getbigmails.log  1>>$DOUT 2>&1
for MAILFILE in `ls -1 /home/benno/inbox/new/*.eml`; do
        TEST=${MAILFILE}
        DEST=${MAILFILE%.eml}
        /bin/mv ${MAILFILE} ${DEST}
done
chown root:benno /home/benno/inbox/new/*   1>>$DOUT 2>&1
inzwischen werden sowohl gesendete als auch zu grosse Mails mit dem selben Shellskript abgeholt, welches beide mit unterschiedlichen Modi unterstützt.
Weboberfläche
Der Zugriff auf diese erfolgt mit der URL http://deneb/benno und der User-Passwort Kombination "admin/secret". Benutzer legt der Sysadmin mit dem Kommandozeilentool benno-useradmin an, sofern nicht mit einem zentralen Directory gearbeitet wird.
# benno-useradmin -u USER -e PRENAME.NAME@infoflip.de -p PASSWD
# benno-useradmin -u ALLEUSER -e *@* -p PASSWD
Der letzterer User kann alle Mails im Archiv (unabhängig von USERPERMISSONS) sehen! Vorsicht: Wegen dem Eintrag USERPERMISSONS = DISABLED kann jeder User alle Mails suchen und ansehen!