https://www.lukasthiel.de/mediawiki/api.php?action=feedcontributions&user=Lukas&feedformat=atomLT42-Wiki - Benutzerbeiträge [de]2024-03-29T11:32:43ZBenutzerbeiträgeMediaWiki 1.39.3https://www.lukasthiel.de/mediawiki/index.php?title=IServ&diff=248IServ2023-06-27T17:43:36Z<p>Lukas: /* Panne DHCP-Server */</p>
<hr />
<div>Seit einigen Jahren setze ich an allen meinen betreuten Schulen den Schulserver [http://www.iserv.eu IServ] ein. Der Funktionsumfang ist überragend, sowohl die Administration wird beispielsweise durch die Integration der Software-Verteilung OPSI extrem erleichtert, als auch die gesamte Kommunikation und der Datenaustausch in der Schule. Jeder Benutzer und jede Gruppe bekommen eine eigene E-Mail-Adresse und einen Datei-Bereich, wo Dateien von Zuhause hoch- und heruntergeladen werden können und so an jedem Rechner im Schulnetz bequem über den Explorer aufgerufen werden können.<br />
<br />
Wir setzen IServ zusammen mit der Time-for-Kids-Box, die als Router, Gateway und DHCP-Server fungiert, ein.<br />
<br />
Weitere Dokumentationen finden Sie hier:<br />
* [[IServ-Infodisplay]]<br />
<br />
Bei der Einrichtung gibt es immer ein paar Kanten, die dank des tollen Supports aber meist schnell gelöst werden. Hier einige Beispiele und ihre Lösung:<br />
<br />
== Panne SpamAssassin-Updates ==<br />
Auf unserem IServ ist vor kurzer Zeit ein kleines Problem aufgetreten, dass den täglichen Durchlauf von iservchk jedes Mal zu einem Fehler brachte:<br />
<br />
nextserver: Bootstrap discovery failed. Giving up.<br />
spamassassin > init razor: FAILED.<br />
Fatal errors on mein-iserv.de: 1<br />
<br />
Danke an Martin von Wittich für den schnellen Support: Der Router sperrte den Port 2703, den SpamAssassin aber zum Beziehen von Updates braucht. Diesen haben wir für IServ freigegeben, nun laufen die Updates wieder.<br />
<br />
== Panne DHCP-Server ==<br />
Bei der Einrichtung unseres Netzes hatten wir Probleme mit dem DHCP. Auf unserem Schulrouter, der als primärer DNS- und DHCP-Server im Netz eingesetzt werden soll, war der Bereich 10.0.2.0 – 10.0.3.255 mit der Subnetzmaske 255.255.254.0 eingestellt. Die meisten der Adressen sind fest vergeben. Der dynamische Pool liegt zwischen 10.0.3.200 bis 10.0.3.250.<br />
<br />
Nun hatten wir auf einmal Rechner, die Adressen aus 10.0.2.200 bekommen haben. Das war uns natürlich erst nicht aufgefallen. Allerdings kamen auf einigen Clients, die nicht in der Rechnerverwaltung eingetragen waren, auf einmal Fehlermeldung vom IServ, dass der Internetzugriff gesperrt sei. Beide Server vergeben wohl Adressen.<br />
<br />
Interessant ist hier, nach welchem Prinzip die Server die Adressen verteilen. First come, first served?<br />
<br />
Die Lösung ist ganz einfach: Man deaktiviert den IServ-DHCP-Server per iservcfg -> config -> “DHCP = ()”<br />
<br />
<s>Zusätzlich gibt es für die Schulen mit Time-for-Kids-Router noch eine Finesse: IServ und TfK haben ein Modul entwickelt, mit der die beiden ihre Dienste teilen. Das Script macht nichts anderes, als sich alle paar Minuten auf dem IServ per SFTP anzumelden und die DHCP-Daten aus der Rechnerverwaltung herüber zu kopieren. Damit macht man die Buchführung von festen Zuordnungen nicht mehr doppelt (in der Rechnerverwaltung UND im Schulrouter), sondern nur noch zentral im IServ.<br />
<br />
Schulen mit Time-for-Kids-Router können dieses Modul nach einem Anruf bei Time-for-Kids kostenlos installieren lassen.<br />
<br />
Update vom April 2014: In der neuen Version des Schulrouters (2.8) ist diese Funktion bereits integriert und kann sofort nach Anschluss unter "Lernplattform- und Schulmedienserver-Wahl" benutzt werden.<br />
<br />
Allerdings sei bei der Einrichtung auf eines hingewiesen: Das Script bügelt im TfK einmal die gesamten Zuordnungen über. Das heißt, dass alle Clients, auch die, die nicht per OPSI gesteuert werden, (z.B. Drucker, NAS, etc.) vorher in die Rechnerverwaltung aufgenommen werden müssen. Um sie nicht versehentlich herunterzufahren (was natürlich nicht geht) o.ä. kann man beim Eintragen das Flag “Steuerbar: Nein” setzen. Damit tauchen sie bei einigen Filtern nicht mehr auf.</s><br />
<br />
Update 2022: Dies ist nach Aktualisierung aller Schulrouter in Hamburg nach Bestreben der BSB Schul-IT nicht mehr möglich und nach Informationen derselben Quelle auch nicht vorgesehen. Die Verwaltung der Rechner muss nun im Schulrouter erfolgen, eine Integration des IServ ist nur noch in der Richtung TFK &rarr; IServ möglich, nicht andersrum. Diese Integration funktioniert allerdings nicht zuverlässig, sodass eine doppelte Datenpflege in TFK und IServ nötig ist, um sauberes DHCP zu machen und damit auch die IServ-Softwareverteilung nutzen zu können.<br />
<br />
== Accounts mit E-Mail-Weiterleitungen auflisten ==<br />
Manchmal möchte man wissen, wer seine IServ-Mails auf private E-Mail-Adressen weiterleiten lässt. Dafür bietet sich folgender Befehl an, der alle Adressen untereinander auflistet:<br />
grep -i @ /var/spool/sieve/*/*/system.script<br />
<br />
== DNS-Umleitung ==<br />
Ein Rechner sollte manchmal innerhalb des Netzes unter mehreren Namen erreichbar sein. In IServ können manuelle DNS-Einträge unterhalb der jeweiligen Netzdomain angelegt werden in:<br />
vi /etc/bind/db.forward.local<br />
dann nach dem Muster<br />
NAME A 172.16.0.0<br />
also zum Beispiel:<br />
ubuntu A 192.168.1.7<br />
<br />
anschließend muss einmal<br />
iservchk -r bind<br />
ausgeführt werden.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=HomeAssistant_Temperatur_auslesen_mit_Raspberry_Pi_und_DHT22&diff=247HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT222023-06-27T17:39:43Z<p>Lukas: </p>
<hr />
<div><small>&larr; [[SmartHome mit HomeAssistant]]</small><br />
<br />
Für die Feststellung der Luftfeuchtigkeit und Temperatur an verschiedensten Stellen kamen bisher die Fernbedienungen von Fritz! zum Einsatz. Da wir nach und nach komplett auf andere Systeme migrieren, ist das eine zeitnah abzulösende Option. Spannend ist nach Anleitung im [https://tyzbit.blog/my-experience-and-thoughts-on-home-assistant Tyzbit-Blog] eine Integration des [https://www.berrybase.de/dht22-digitaler-temperatur-und-luftfeuchtesensor DHT22] als Temperatur- und Luftfeuchtigkeitssensor auf Raspberry Pi per MQTT am HomeAssistant.<br />
<br />
== Einbindung von Mosquitto in HomeAssistant ==<br />
Wir nutzen HomeAssistant als MQTT-Broker, sodass hier nicht zusätzlich ein Server für laufen muss. Dies ist über das Add-On "Mosquitto Broker" möglich, das über den Add-On Store direkt in Home Assistant installiert werden kann. Nach einem Klick auf "Install" wird das Add-On installiert und kann konfiguriert werden. Da wir die Verbindungen absichern wollen und hierfür nicht den Standard-Nutzer von HomeAssistant nutzen, muss ein dedizierter Account erstellt werden. Hierfür zunächst die erweiterte Ansicht im eigenen Nutzerprofil durch Klick auf den Namen > "Erweiterter Modus" aktivieren.<br />
<br />
Anschließend über Einstellungen > Personen > Tab: Benutzer einen Benutzer "mqttio" mit dazugehörigem Passwort erstellen. Der Nutzer benötigt keine weiteren Rechte. Das Passwort wird dann auf allen einliefernden Clients eingetragen. Prinzipiell kann für jeden Client ein eigener Account erstellt werden. Dies ist in größeren Installation dann empfehlenswert, wenn nicht sichergestellt werden kann, dass die Geräte nicht aus der eigenen Hand geraten und schlecht durch Fremdzugriff geschützt sind. Für den Heimgebrauch reicht mir ein Account aus.<br />
<br />
Die Konfiguration des Addons erfolgt dann über Einstellungen > Add-Ons > Mosquitto Broker > Tab: Konfiguration. Hier ist unter "Logins" zunächst der eben erstellte Account zu hinterlegen:<br />
- username: mqttio<br />
password: PASSWORD<br />
<br />
Weitere Einstellungen erfolgen in der Integration, die über Einstellungen > Geräte und Dienste schon möglich sein sollte. Hier zunächst über das Zahnrad neben "MQTT" in die Konfiguration wechseln und anschließend die Entität core-mosquitto konfigurieren -> "MQTT neu konfigurieren" -> den Dialog mit den Zugangsdaten weiterklicken. Da die automatische Konfiguration bei mir sowieso nicht korrekt funktioniert hat, habe ich sie hier deaktiviert.<br />
<br />
== Installation des RPi ==<br />
Zunächst ist auf dem Raspberry Pi die Installation von [https://www.raspberrypi.com/software/ Raspberry Pi OS] nötig. Eine gute Anleitung dafür findet sich auf der Herstellerseite. Nach Abschluss der Installation und Erstkonfiguration ist über ein Terminal mittels<br />
sudo raspi-config<br />
unter "Interface Options" -> "SSH" der SSH-Server zu aktivieren, sodass ein Fernzugriff möglich ist.<br />
<br />
Die IP-Adresse des Pis kann entweder mittels "ip a" im Terminal oder über den netzinternen DHCP-Server ausgelesen werden.<br />
<br />
Anschließend muss der Pi ausgeschaltet und der Sensor verbunden werden. Ich nutze für den Anschluss die [https://de.pinout.xyz/ Pins] 4 für VCC, 6 für GND und 12 (GPIO 18) für Data/OUT. Nach dem Verbinden kann der Pi wieder gestartet werden.<br />
<br />
== Konfiguration des RPi ==<br />
Auf dem Pi soll ein MQTT-Publisher installiert werden, der in konfigurierbaren Abständen die Temperatur und den Luftfeuchtigkeitswert an HomeAssistant übermittelt. Dafür ist Python in der Version >=3.6 nötig. Hierfür steht dann über Pip der mqtt-io zur Verfügung.<br />
sudo pip3 install mqtt-io<br />
<br />
Diese Konfiguration installiert mqtt-io global, Tyzbit.blog stellt noch eine Lösung in einem Virtual Python Environment vor.<br />
<br />
Für den Betrieb von mqtt-io ist dann eine Konfiguration nötig, die unter /etc/mqtt-io.yaml Platz findet:<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
host: 192.168.178.10 # IP der HomeAssistant-Instanz<br />
topic_prefix: wz/raspberrypi # Zu veröffentlichendes Topic (dies sollte eine Struktur folgen, zB Raum / Gerät)<br />
status_payload_running: available<br />
status_payload_stopped: unavailable<br />
status_payload_dead: unavailable<br />
user: USER # oben angelegter Account für mqtt<br />
password: PASSWORD # Passwort des Accounts<br />
<br />
sensor_modules:<br />
- name: dht22_sensor<br />
module: dht22<br />
type: dht22<br />
pin: 18 # ggf. anzupassen, falls anderer GPIO-Pin verwendet (GPIO ID, nicht Index des Pins(!), siehe Link oben)<br />
<br />
sensor_inputs:<br />
- name: wz_temperature # Name, ggf. anzupassen<br />
module: dht22_sensor<br />
digits: 2 # Nachkommastellen<br />
interval: 5 # Interval der Veröffentlichung in Sekunden<br />
type: temperature<br />
- name: wz_humidity<br />
module: dht22_sensor<br />
digits: 2<br />
interval: 5<br />
type: humidity<br />
</syntaxhighlight><br />
<br />
Ein Test ist dann mittels<br />
python3.9 -m mqtt_io /etc/mqtt-io.yaml<br />
möglich. Hierbei sollte der Pi bereits Daten an HomeAssistant übertragen sowie die veröffentlichten Werte auf der Konsole ausgeben:<br />
Jun 27 18:39:25 HOSTNAME python3[1706]: 2023-06-27 18:39:25 mqtt_io.server [INFO] Read sensor 'wz_humidity' value of 43.9<br />
Jun 27 18:39:29 HOSTNAME python3[1706]: 2023-06-27 18:39:29 mqtt_io.server [INFO] Read sensor 'wz_temperature' value of 22.9<br />
<br />
Ist das erfolgreich, kann ein Systemd-Service definiert werden, der die MQTT-Instanz automatisch startet, sodass das System automatisch Werte an HomeAssistant übermittelt. Unter /etc/systemd/system/mqttio.service ist folgender Inhalt zu hinterlegen:<br />
<br />
<syntaxhighlight lang="bash" line><br />
[Unit]<br />
Description=MQTT-IO<br />
After=network.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
Restart=always<br />
Type=simple<br />
ExecStart=/usr/bin/python3 -m mqtt_io /etc/mqtt-io.yaml<br />
User=root<br />
Environment=<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
Anschließend muss systemd über die Änderungen informiert werden:<br />
sudo systemctl daemon-reload <br />
sudo systemctl enable mqttio<br />
sudo systemctl start mqttio<br />
<br />
Verläuft das erfolgreich, ist der Status des Services mittels <br />
sudo systemctl status mqttio<br />
abrufbar.<br />
<br />
Über journald kann zudem die aktuelle Übertragung angeschaut werden:<br />
journalctl -t python3 -f<br />
<br />
== Integration in HomeAssistant ==<br />
Sobald der Pi Daten veröffentlicht, können diese auch in HomeAssistant abgefragt werden. Dazu muss zunächst der Sensor konfiguriert werden. Über den Add-On Store kann das Add-On "File Editor" installiert werden, das eine direkte Bearbeitung der Konfigurationsdateien im Browser möglich macht. Nach der Installation ist das Add-on links in der Sidebar aufrufbar. Über den Ordner kann die configuration.yaml aufgerufen werden. Hier sind folgende Zeilen einzufügen:<br />
<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
sensor:<br />
- name: "WZ Temperature"<br />
unique_id: 5ae12d30-c4a7-44b5-8868-785ba3ec527c # this can be anything unique<br />
state_topic: "wz/raspberrypi/sensor/wz_temperature" # ggf. anzupassen!<br />
unit_of_measurement: "°C"<br />
- name: "WZ Humidity"<br />
unique_id: 0134ce78-6374-49a0-9114-7b2af2fb7cac # muss eindeutig sein (zB über uuidgen)<br />
state_topic: "wz/raspberrypi/sensor/wz_humidity" # ggf. anzupassen!<br />
unit_of_measurement: "%"<br />
</syntaxhighlight><br />
<br />
Anschließend die Datei speichern und über das Zahnrad oben rechts HomeAssistant neu starten. Ist das erfolgt, kann der Sensor im Dashboard angezeigt und in Automationen genutzt werden.<br />
<br />
== Weblinks ==<br />
https://tyzbit.blog/connecting-a-dht-22-sensor-to-home-assistant - Originale Dokumentation <br />
<br />
https://smarthomeyourself.de/wiki/homeassistant/home-assistant-fehler-deine-manuell-konfigurierten-mqtt-sensoren-erfordert-aufmerksamkeit/ Beschreibung der neuen Sensor-Konfiguration<br />
<br />
https://github.com/flyte/mqtt-io/wiki/MQTT-Configuration MQTT-Konfigurationsparameter</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=246Hauptseite2023-06-27T17:36:43Z<p>Lukas: </p>
<hr />
<div>__NOTOC__<br />
[[Datei:LukasThiel.jpg|180px|right|Portrait von Lukas Thiel]]<br />
<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Blacklist mit Fail2Ban]]<br />
<br />
== SmartHome ==<br />
* [[SmartHome mit HomeAssistant]] - Leitartikel<br />
** [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]<br />
** [[Raspberry Pi als Kamera]]<br />
<br />
== Webdienste ==<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
<br />
== Netzwerkdienste ==<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Schul-IT ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
<br />
== Hardware ==<br />
* [[GoPro Hero 3]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]<br />
* [[Stream mit VLC]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=245Hauptseite2023-06-27T17:36:35Z<p>Lukas: </p>
<hr />
<div>__NOTOC__<br />
[[Datei:LukasThiel.jpg|200px|right|Portrait von Lukas Thiel]]<br />
<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Blacklist mit Fail2Ban]]<br />
<br />
== SmartHome ==<br />
* [[SmartHome mit HomeAssistant]] - Leitartikel<br />
** [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]<br />
** [[Raspberry Pi als Kamera]]<br />
<br />
== Webdienste ==<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
<br />
== Netzwerkdienste ==<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Schul-IT ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
<br />
== Hardware ==<br />
* [[GoPro Hero 3]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]<br />
* [[Stream mit VLC]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=244Hauptseite2023-06-27T17:36:30Z<p>Lukas: </p>
<hr />
<div>__NOTOC__<br />
[[Datei:LukasThiel.jpg|300px|right|Portrait von Lukas Thiel]]<br />
<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Blacklist mit Fail2Ban]]<br />
<br />
== SmartHome ==<br />
* [[SmartHome mit HomeAssistant]] - Leitartikel<br />
** [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]<br />
** [[Raspberry Pi als Kamera]]<br />
<br />
== Webdienste ==<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
<br />
== Netzwerkdienste ==<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Schul-IT ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
<br />
== Hardware ==<br />
* [[GoPro Hero 3]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]<br />
* [[Stream mit VLC]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=HomeAssistant_Temperatur_auslesen_mit_Raspberry_Pi_und_DHT22&diff=243HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT222023-06-27T17:29:15Z<p>Lukas: </p>
<hr />
<div>Für die Feststellung der Luftfeuchtigkeit und Temperatur an verschiedensten Stellen kamen bisher die Fernbedienungen von Fritz! zum Einsatz. Da wir nach und nach komplett auf andere Systeme migrieren, ist das eine zeitnah abzulösende Option. Spannend ist nach Anleitung im [https://tyzbit.blog/my-experience-and-thoughts-on-home-assistant Tyzbit-Blog] eine Integration des [https://www.berrybase.de/dht22-digitaler-temperatur-und-luftfeuchtesensor DHT22] als Temperatur- und Luftfeuchtigkeitssensor auf Raspberry Pi per MQTT am HomeAssistant.<br />
<br />
== Einbindung von Mosquitto in HomeAssistant ==<br />
Wir nutzen HomeAssistant als MQTT-Broker, sodass hier nicht zusätzlich ein Server für laufen muss. Dies ist über das Add-On "Mosquitto Broker" möglich, das über den Add-On Store direkt in Home Assistant installiert werden kann. Nach einem Klick auf "Install" wird das Add-On installiert und kann konfiguriert werden. Da wir die Verbindungen absichern wollen und hierfür nicht den Standard-Nutzer von HomeAssistant nutzen, muss ein dedizierter Account erstellt werden. Hierfür zunächst die erweiterte Ansicht im eigenen Nutzerprofil durch Klick auf den Namen > "Erweiterter Modus" aktivieren.<br />
<br />
Anschließend über Einstellungen > Personen > Tab: Benutzer einen Benutzer "mqttio" mit dazugehörigem Passwort erstellen. Der Nutzer benötigt keine weiteren Rechte. Das Passwort wird dann auf allen einliefernden Clients eingetragen. Prinzipiell kann für jeden Client ein eigener Account erstellt werden. Dies ist in größeren Installation dann empfehlenswert, wenn nicht sichergestellt werden kann, dass die Geräte nicht aus der eigenen Hand geraten und schlecht durch Fremdzugriff geschützt sind. Für den Heimgebrauch reicht mir ein Account aus.<br />
<br />
Die Konfiguration des Addons erfolgt dann über Einstellungen > Add-Ons > Mosquitto Broker > Tab: Konfiguration. Hier ist unter "Logins" zunächst der eben erstellte Account zu hinterlegen:<br />
- username: mqttio<br />
password: PASSWORD<br />
<br />
Weitere Einstellungen erfolgen in der Integration, die über Einstellungen > Geräte und Dienste schon möglich sein sollte. Hier zunächst über das Zahnrad neben "MQTT" in die Konfiguration wechseln und anschließend die Entität core-mosquitto konfigurieren -> "MQTT neu konfigurieren" -> den Dialog mit den Zugangsdaten weiterklicken. Da die automatische Konfiguration bei mir sowieso nicht korrekt funktioniert hat, habe ich sie hier deaktiviert.<br />
<br />
== Installation des RPi ==<br />
Zunächst ist auf dem Raspberry Pi die Installation von [https://www.raspberrypi.com/software/ Raspberry Pi OS] nötig. Eine gute Anleitung dafür findet sich auf der Herstellerseite. Nach Abschluss der Installation und Erstkonfiguration ist über ein Terminal mittels<br />
sudo raspi-config<br />
unter "Interface Options" -> "SSH" der SSH-Server zu aktivieren, sodass ein Fernzugriff möglich ist.<br />
<br />
Die IP-Adresse des Pis kann entweder mittels "ip a" im Terminal oder über den netzinternen DHCP-Server ausgelesen werden.<br />
<br />
Anschließend muss der Pi ausgeschaltet und der Sensor verbunden werden. Ich nutze für den Anschluss die [https://de.pinout.xyz/ Pins] 4 für VCC, 6 für GND und 12 (GPIO 18) für Data/OUT. Nach dem Verbinden kann der Pi wieder gestartet werden.<br />
<br />
== Konfiguration des RPi ==<br />
Auf dem Pi soll ein MQTT-Publisher installiert werden, der in konfigurierbaren Abständen die Temperatur und den Luftfeuchtigkeitswert an HomeAssistant übermittelt. Dafür ist Python in der Version >=3.6 nötig. Hierfür steht dann über Pip der mqtt-io zur Verfügung.<br />
sudo pip3 install mqtt-io<br />
<br />
Diese Konfiguration installiert mqtt-io global, Tyzbit.blog stellt noch eine Lösung in einem Virtual Python Environment vor.<br />
<br />
Für den Betrieb von mqtt-io ist dann eine Konfiguration nötig, die unter /etc/mqtt-io.yaml Platz findet:<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
host: 192.168.178.10 # IP der HomeAssistant-Instanz<br />
topic_prefix: wz/raspberrypi # Zu veröffentlichendes Topic (dies sollte eine Struktur folgen, zB Raum / Gerät)<br />
status_payload_running: available<br />
status_payload_stopped: unavailable<br />
status_payload_dead: unavailable<br />
user: USER # oben angelegter Account für mqtt<br />
password: PASSWORD # Passwort des Accounts<br />
<br />
sensor_modules:<br />
- name: dht22_sensor<br />
module: dht22<br />
type: dht22<br />
pin: 18 # ggf. anzupassen, falls anderer GPIO-Pin verwendet (GPIO ID, nicht Index des Pins(!), siehe Link oben)<br />
<br />
sensor_inputs:<br />
- name: wz_temperature # Name, ggf. anzupassen<br />
module: dht22_sensor<br />
digits: 2 # Nachkommastellen<br />
interval: 5 # Interval der Veröffentlichung in Sekunden<br />
type: temperature<br />
- name: wz_humidity<br />
module: dht22_sensor<br />
digits: 2<br />
interval: 5<br />
type: humidity<br />
</syntaxhighlight><br />
<br />
Ein Test ist dann mittels<br />
python3.9 -m mqtt_io /etc/mqtt-io.yaml<br />
möglich. Hierbei sollte der Pi bereits Daten an HomeAssistant übertragen sowie die veröffentlichten Werte auf der Konsole ausgeben:<br />
Jun 27 18:39:25 HOSTNAME python3[1706]: 2023-06-27 18:39:25 mqtt_io.server [INFO] Read sensor 'wz_humidity' value of 43.9<br />
Jun 27 18:39:29 HOSTNAME python3[1706]: 2023-06-27 18:39:29 mqtt_io.server [INFO] Read sensor 'wz_temperature' value of 22.9<br />
<br />
Ist das erfolgreich, kann ein Systemd-Service definiert werden, der die MQTT-Instanz automatisch startet, sodass das System automatisch Werte an HomeAssistant übermittelt. Unter /etc/systemd/system/mqttio.service ist folgender Inhalt zu hinterlegen:<br />
<br />
<syntaxhighlight lang="bash" line><br />
[Unit]<br />
Description=MQTT-IO<br />
After=network.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
Restart=always<br />
Type=simple<br />
ExecStart=/usr/bin/python3 -m mqtt_io /etc/mqtt-io.yaml<br />
User=root<br />
Environment=<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
Anschließend muss systemd über die Änderungen informiert werden:<br />
sudo systemctl daemon-reload <br />
sudo systemctl enable mqttio<br />
sudo systemctl start mqttio<br />
<br />
Verläuft das erfolgreich, ist der Status des Services mittels <br />
sudo systemctl status mqttio<br />
abrufbar.<br />
<br />
Über journald kann zudem die aktuelle Übertragung angeschaut werden:<br />
journalctl -t python3 -f<br />
<br />
== Integration in HomeAssistant ==<br />
Sobald der Pi Daten veröffentlicht, können diese auch in HomeAssistant abgefragt werden. Dazu muss zunächst der Sensor konfiguriert werden. Über den Add-On Store kann das Add-On "File Editor" installiert werden, das eine direkte Bearbeitung der Konfigurationsdateien im Browser möglich macht. Nach der Installation ist das Add-on links in der Sidebar aufrufbar. Über den Ordner kann die configuration.yaml aufgerufen werden. Hier sind folgende Zeilen einzufügen:<br />
<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
sensor:<br />
- name: "WZ Temperature"<br />
unique_id: 5ae12d30-c4a7-44b5-8868-785ba3ec527c # this can be anything unique<br />
state_topic: "wz/raspberrypi/sensor/wz_temperature" # ggf. anzupassen!<br />
unit_of_measurement: "°C"<br />
- name: "WZ Humidity"<br />
unique_id: 0134ce78-6374-49a0-9114-7b2af2fb7cac # muss eindeutig sein (zB über uuidgen)<br />
state_topic: "wz/raspberrypi/sensor/wz_humidity" # ggf. anzupassen!<br />
unit_of_measurement: "%"<br />
</syntaxhighlight><br />
<br />
Anschließend die Datei speichern und über das Zahnrad oben rechts HomeAssistant neu starten. Ist das erfolgt, kann der Sensor im Dashboard angezeigt und in Automationen genutzt werden.<br />
<br />
== Weblinks ==<br />
https://tyzbit.blog/connecting-a-dht-22-sensor-to-home-assistant - Originale Dokumentation <br />
<br />
https://smarthomeyourself.de/wiki/homeassistant/home-assistant-fehler-deine-manuell-konfigurierten-mqtt-sensoren-erfordert-aufmerksamkeit/ Beschreibung der neuen Sensor-Konfiguration<br />
<br />
https://github.com/flyte/mqtt-io/wiki/MQTT-Configuration MQTT-Konfigurationsparameter</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=242Hauptseite2023-06-27T17:23:33Z<p>Lukas: </p>
<hr />
<div>__NOTOC__<br />
[[Datei:LukasThiel.jpg|300px|center|Portrait von Lukas Thiel]]<br />
<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Blacklist mit Fail2Ban]]<br />
<br />
== SmartHome ==<br />
* [[SmartHome mit HomeAssistant]] - Leitartikel<br />
** [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]<br />
** [[Raspberry Pi als Kamera]]<br />
<br />
== Webdienste ==<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
<br />
== Netzwerkdienste ==<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Schul-IT ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
<br />
== Hardware ==<br />
* [[GoPro Hero 3]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]<br />
* [[Stream mit VLC]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=241Hauptseite2023-06-27T17:23:20Z<p>Lukas: </p>
<hr />
<div>__NOTOC__<br />
== Herzlich Willkommen ==<br />
<br />
[[Datei:LukasThiel.jpg|300px|center|Portrait von Lukas Thiel]]<br />
<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Blacklist mit Fail2Ban]]<br />
<br />
== SmartHome ==<br />
* [[SmartHome mit HomeAssistant]] - Leitartikel<br />
** [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]<br />
** [[Raspberry Pi als Kamera]]<br />
<br />
== Webdienste ==<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
<br />
== Netzwerkdienste ==<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Schul-IT ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
<br />
== Hardware ==<br />
* [[GoPro Hero 3]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]<br />
* [[Stream mit VLC]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=240Hauptseite2023-06-27T17:22:16Z<p>Lukas: </p>
<hr />
<div>__NOTOC__<br />
== Herzlich Willkommen ==<br />
<br />
[[Datei:LukasThiel.jpg|300px|Portrait von Lukas Thiel]]<br />
<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Blacklist mit Fail2Ban]]<br />
<br />
== SmartHome ==<br />
* [[SmartHome mit HomeAssistant]] - Leitartikel<br />
** [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]<br />
** [[Raspberry Pi als Kamera]]<br />
<br />
== Webdienste ==<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
<br />
== Netzwerkdienste ==<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Schul-IT ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
<br />
== Hardware ==<br />
* [[GoPro Hero 3]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]<br />
* [[Stream mit VLC]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Datei:LukasThiel.jpg&diff=239Datei:LukasThiel.jpg2023-06-27T17:21:52Z<p>Lukas: </p>
<hr />
<div></div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=238Hauptseite2023-06-27T17:21:04Z<p>Lukas: schlecht gealtert</p>
<hr />
<div>__NOTOC__<br />
== Herzlich Willkommen ==<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Blacklist mit Fail2Ban]]<br />
<br />
== SmartHome ==<br />
* [[SmartHome mit HomeAssistant]] - Leitartikel<br />
** [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]<br />
** [[Raspberry Pi als Kamera]]<br />
<br />
== Webdienste ==<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
<br />
== Netzwerkdienste ==<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Schul-IT ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
<br />
== Hardware ==<br />
* [[GoPro Hero 3]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]<br />
* [[Stream mit VLC]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=237Hauptseite2023-06-27T17:20:43Z<p>Lukas: Neue Struktur</p>
<hr />
<div>__NOTOC__<br />
== Herzlich Willkommen ==<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
Erkenntnisse, die mir in den Kopf kommen, es aber nicht in einen Artikel schaffen, finden sich bei [https://twitter.com/LukasThiel Twitter].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Blacklist mit Fail2Ban]]<br />
<br />
== SmartHome ==<br />
* [[SmartHome mit HomeAssistant]] - Leitartikel<br />
** [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]<br />
** [[Raspberry Pi als Kamera]]<br />
<br />
== Webdienste ==<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
<br />
== Netzwerkdienste ==<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Schul-IT ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
<br />
== Hardware ==<br />
* [[GoPro Hero 3]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]<br />
* [[Stream mit VLC]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SmartHome_mit_HomeAssistant&diff=236SmartHome mit HomeAssistant2023-06-27T17:20:17Z<p>Lukas: </p>
<hr />
<div>Die neue Wohnung soll in einigen Teilen smart sein. Im ersten Schritt wollen wir hierbei die Lichtsteuerung über das Smartphone und ausgewählte Schalter vornehmen. Dabei kommen unterschiedliche Systeme (Fritz!, IKEA TRADFRI, Funksteckdosen) zum Einsatz. Ziel ist es also, ein System zu finden, das alle Systeme ansteuern kann.<br />
<br />
Mit einem Tipp von Sven Koch bin ich hierbei auf HomeAssistant gestoßen, das additiv an bestehende Systeme angeschlossen werden kann. Die folgenden Artikel sollen die Einrichtung und einige Anwendungsfälle dokumentieren. Dieser Artikel entsteht, während das System schon läuft. Die Grundeinrichtung erfolgte über die [https://www.home-assistant.io/installation/linux Installationsanleitung] via KVM in einer virtuellen Maschine auf meinem PVE.<br />
<br />
Wir hatten zunächst auch die Heizungssteuerung der Fritz!SmartHome-Komponenten über HomeAssistant vorgenommen. Da mir nicht ganz klar war, welches System nun welches inwieweit steuert, da die Fritz!Box selbst zu festgelegten Zeiten in verschiedene Temperatur-Szenen fährt, haben wir die Integration wieder zurückgebaut.<br />
<br />
Die Quantität und Qualität der folgenden Artikel wächst mit der Zeit:<br />
<br />
* [[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Raspberry_Pi&diff=235Raspberry Pi2023-06-27T17:14:57Z<p>Lukas: Lukas verschob die Seite Raspberry Pi nach Raspberry Pi als Kamera</p>
<hr />
<div>#WEITERLEITUNG [[Raspberry Pi als Kamera]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Raspberry_Pi_als_Kamera&diff=234Raspberry Pi als Kamera2023-06-27T17:14:57Z<p>Lukas: Lukas verschob die Seite Raspberry Pi nach Raspberry Pi als Kamera</p>
<hr />
<div>__NOTOC__<br />
Schon vor längerer Zeit habe ich mir einen Raspberry Pi angeschafft und ein wenig damit herum experimentiert. Nun habe ich mir noch ein Kamera-Modul dazu bestellt. Das ist eine feine Sache. Hier versuche ich nun ein wenig zu dokumentieren, wie ich das Kamera-Modul mit Hilfe von motion so eingerichtet habe, dass es beim Wahrnehmen von Bewegung Bilder aufzeichnet. Ich bin nach dieser Anleitung (http://jankarres.de/2013/12/raspberry-pi-kamera-modul-mit-motion-tracking/) vorgegangen, habe dann aber angefangen zu spielen und viel von hier ([[d:Raspberry_Pi|Debacher-Wiki:Raspberry_Pi]]) übernommen.<br />
<br />
Zuerst updaten wir das System:<br />
sudo apt-get update<br />
sudo apt-get upgrade<br />
<br />
== LED deaktivieren ==<br />
Dann deaktivieren wir das kleine Lämpchen neben der Kamera. Wir wollen ja potenziellen Einbrechern nicht gleich zeigen, dass sie gefilmt werden.<br />
Wir editieren die Datei<br />
sudo vi /boot/config.txt<br />
und ergänzen sie um folgende Zeile<br />
disable_camera_led=1<br />
<br />
Nach einem Neustart des Systems können wir fortfahren:<br />
sudo reboot<br />
<br />
== Motion ==<br />
Dann können wir motion und einige weitere benötigte Pakete installieren:<br />
apt-get install -y motion libjpeg62 libjpeg62-dev libavformat53 libavformat-dev libavcodec53 libavcodec-dev libavutil51 libavutil-dev libc6-dev zlib1g-dev libmysqlclient18 libmysqlclient-dev libpq5 libpq-dev<br />
<br />
Nun installieren wir das Kernel-Modul für die Kamera mit<br />
sudo apt-get install v4l-utils<br />
und aktivieren es<br />
sudo modprobe bcm2835-v4l2<br />
<br />
Vor der Benutzung sollte man immer ein Bild aufnehmen, da es sonst zum Hängenbleiben des gesamten Systems kommt:<br />
raspistill -o /tmp/test.jpg<br />
<br />
Mit dem Debian-Paket wird ein Benutzer motion mitgeliefert, dem wir noch ein Homeverzeichnis anlegen:<br />
sudo mkdir /home/motion<br />
sudo chown -R motion.motion /home/motion<br />
<br />
Die mitgelieferte Konfiguration von motion ist unter dem Raspberry Pi nicht stabil lauffähig, deshalb muss eine angepasste Version mit<br />
wget https://www.dropbox.com/s/xdfcxm5hu71s97d/motion-mmal.tar.gz <br />
heruntergeladen werden.<br />
Wenn man möchte, kann man nun beide Konfigurationen nebeneinander benutzen, das möchte ich aber nicht.<br />
<br />
Wir kopieren die ausgepackten Dateien in das Homeverzeichnis und in ein lauffähiges Verzeichnis, zum Beispiel /usr/local/bin<br />
sudo tar -xzf motion-mmal.tar.gz<br />
sudo mv motion-mmalcam.conf /home/motion/<br />
sudo mv motion /usr/local/bin/<br />
<br />
Dann stellen wir in der Konfigurationsdatei noch einige Pfade um:<br />
sudo vi /home/motion/motion-mmalcam.conf<br />
<br />
process_id_file /home/motion/motion.pid<br />
logfile /home/motion/motion.log<br />
target_dir /home/motion<br />
Wenn man möchte, kann man auch noch ein Unterverzeichnis für die Bilddateien anlegen. Das macht Sinn, um nicht aus Versehen die Konfiguration zu löschen und bequem rm * nach dem Kontrollieren der Aufnahmen ausführen zu können:<br />
sudo -u motion mkdir /home/motion/data<br />
target_dir /home/motion/data<br />
<br />
Dann passen wir noch einige Zeilen an, damit Motion im Hintergrund startet und die Konfiguration auch aus dem lokalen Netz zulässt:<br />
# Start in daemon (background) mode and release terminal (default: off)<br />
daemon on <br />
<br />
# Restrict control connections to localhost only (default: on)<br />
webcontrol_localhost off<br />
<br />
=== Starten ===<br />
Um Motion dann zu starten, bedienen wir uns eines kleinen Startscripts:<br />
sudo -u motion vi /home/motion/startmmalmotion.sh<br />
<br />
#!/bin/sh<br />
<br />
/usr/bin/raspistill -o /tmp/test.jpg<br />
/sbin/modprobe bcm2835-v4l2<br />
<br />
/usr/bin/sudo -u motion /usr/local/bin/motion -c /home/motion/motion-mmalcam.conf<br />
<br />
Nachdem wir der Datei Ausführ-Rechte verleiht haben,<br />
sudo chmod +x /home/motion/startmmalmotion.sh<br />
können wir Motion starten mittels<br />
sudo /home/motion/startmmalmotion.sh<br />
zum Laufen bringen. Nach einigen Informationen, verschwindet es dann im Hintergrund.<br />
Sofern man Motion unter dem Benutzer motion startet, bekommt man eine Fehlermeldung, dass der Benutzer motion nicht berechtigt ist, modprobe auszuführen. Wir müssen motion also als root starten oder alternativ den Benutzer motion in die sudoers mit aufnehmen, wovon ich aus Sicherheitsgründen absehen würde.<br />
<br />
Im Browser ist der Live-Stream dann mittels http://IPDESPIS:8081/ verfolgbar.<br />
<br />
=== Beenden ===<br />
Möchten wir die Überwachung unterbrechen, suchen wir uns mit dem Befehl<br />
sudo ps aux | grep motion<br />
die Prozess-ID des Motion-Services heraus, z.B.<br />
motion 2592 96.3 5.0 84820 19336 ? Sl 21:36 1:08 /usr/local/bin/motion -c /home/motion/motion-mmalcam.conf<br />
und beenden mittels<br />
kill 2592<br />
alternativ dazu können wir auch einfach alle Prozesse des Benutzers motion killen<br />
killall -u motion<br />
<br />
=== Daten-Kopie ===<br />
Um die Daten bequem auf einem normalen Arbeitsrechner anzuschauen (der Pi soll schließlich versteckt Einbrecher beobachten), können wir die Daten einfach mittels SSH-Protokoll auf den Rechner kopieren. Motion macht eine tolle Sache: Bei jeder neuen Bewegungserkennung, wird die führende Zahl der Dateien um einen nach oben gesetzt. Wir können also alle Dateien kopieren oder einfach jene des aktuellen Vorfalls<br />
<br />
# Kopiere alles nach 172.16.0.4 auf den Desktop eines Benutzers (der Unterordner muss natürlich erstellt werden)<br />
sudo scp /home/motion/data/* lukas@172.16.0.4:/home/lukas/Desktop/motion-daten<br />
<br />
# Kopiere nur Bilder<br />
sudo scp /home/motion/data/*.jpg lukas@172.16.0.4:/home/lukas/Desktop/motion-daten<br />
<br />
# Kopiere nur Filme<br />
sudo scp /home/motion/data/*.avi lukas@172.16.0.4:/home/lukas/Desktop/motion-daten<br />
<br />
# Kopiere nur aktuelle Vorgänge (bspw. #24)<br />
sudo scp /home/motion/data/24-* lukas@172.16.0.4:/home/lukas/Desktop/motion-daten<br />
<br />
Der Ordner kann natürlich auch als NFS-Laufwerk eingebunden werden, was das Ablegen bequemer und auch direkt über motion möglich macht. Oder man kopiert die Dateien mittels rsync, egal von welchem Rechner aus.<br />
<br />
== Erkenntnisse am Rande ==<br />
Der Raspberry scheint Probleme mit dem HDMI-DVI-Adapter von Apple zu haben. Nach dem Start von Raspbian tauchen nur noch Fehlermeldungen nach dem Prinzip<br />
Timeout waiting for hardware interrupt - cmd 13<br />
auf. Nach einem Wechsel auf ein reines HDMI-DVI-Kabel funktioniert wieder alles.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=HomeAssistant_Temperatur_auslesen_mit_Raspberry_Pi_und_DHT22&diff=233HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT222023-06-27T17:13:54Z<p>Lukas: Die Seite wurde neu angelegt: „Für die Feststellung der Luftfeuchtigkeit und Temperatur an verschiedensten Stellen kamen bisher die Fernbedienungen von Fritz! zum Einsatz. Da wir nach und nach komplett auf andere Systeme migrieren, ist das eine zeitnah abzulösende Option. Spannend ist nach Anleitung im [https://tyzbit.blog/my-experience-and-thoughts-on-home-assistant Tyzbit-Blog] eine Integration des [https://www.berrybase.de/dht22-digitaler-temperatur-und-luftfeuchtesensor DHT22] al…“</p>
<hr />
<div>Für die Feststellung der Luftfeuchtigkeit und Temperatur an verschiedensten Stellen kamen bisher die Fernbedienungen von Fritz! zum Einsatz. Da wir nach und nach komplett auf andere Systeme migrieren, ist das eine zeitnah abzulösende Option. Spannend ist nach Anleitung im [https://tyzbit.blog/my-experience-and-thoughts-on-home-assistant Tyzbit-Blog] eine Integration des [https://www.berrybase.de/dht22-digitaler-temperatur-und-luftfeuchtesensor DHT22] als Temperatur- und Wärmesensor auf Raspberry Pi per MQTT am HomeAssistant.<br />
<br />
== Einbindung von Mosquitto in HomeAssistant ==<br />
Wir nutzen HomeAssistant als MQTT-Broker, sodass hier nicht zusätzlich ein Server für laufen muss. Dies ist über das Add-On "Mosquitto Broker" möglich, das über den Add-On Store direkt in Home Assistant installiert werden kann. Nach einem Klick auf "Install" wird das Add-On installiert und kann konfiguriert werden. Da wir die Verbindungen absichern wollen und hierfür nicht den Standard-Nutzer von HomeAssistant nutzen, muss ein dedizierter Account erstellt werden. Hierfür zunächst die erweiterte Ansicht im eigenen Nutzerprofil durch Klick auf den Namen > "Erweiterter Modus" aktivieren.<br />
<br />
Anschließend über Einstellungen > Personen > Tab: Benutzer einen Benutzer "mqttio" mit dazugehörigem Passwort erstellen. Der Nutzer benötigt keine weiteren Rechte. Das Passwort wird dann auf allen einliefernden Clients eingetragen. Prinzipiell kann für jeden Client ein eigener Account erstellt werden. Dies ist in größeren Installation dann empfehlenswert, wenn nicht sichergestellt werden kann, dass die Geräte nicht aus der eigenen Hand geraten und schlecht durch Fremdzugriff geschützt sind. Für den Heimgebrauch reicht mir ein Account aus.<br />
<br />
Die Konfiguration des Addons erfolgt dann über Einstellungen > Add-Ons > Mosquitto Broker > Tab: Konfiguration. Hier ist unter "Logins" zunächst der eben erstellte Account zu hinterlegen:<br />
- username: mqttio<br />
password: PASSWORD<br />
<br />
Weitere Einstellungen erfolgen in der Integration, die über Einstellungen > Geräte und Dienste schon möglich sein sollte. Hier zunächst über das Zahnrad neben "MQTT" in die Konfiguration wechseln und anschließend die Entität core-mosquitto konfigurieren -> "MQTT neu konfigurieren" -> den Dialog mit den Zugangsdaten weiterklicken. Da die automatische Konfiguration bei mir sowieso nicht korrekt funktioniert hat, habe ich sie hier deaktiviert.<br />
<br />
== Installation des RPi ==<br />
Zunächst ist auf dem Raspberry Pi die Installation von [https://www.raspberrypi.com/software/ Raspberry Pi OS] nötig. Eine gute Anleitung dafür findet sich auf der Herstellerseite. Nach Abschluss der Installation und Erstkonfiguration ist über ein Terminal mittels<br />
sudo raspi-config<br />
unter "Interface Options" -> "SSH" der SSH-Server zu aktivieren, sodass ein Fernzugriff möglich ist.<br />
<br />
Die IP-Adresse des Pis kann entweder mittels "ip a" im Terminal oder über den netzinternen DHCP-Server ausgelesen werden.<br />
<br />
Anschließend muss der Pi ausgeschaltet und der Sensor verbunden werden. Ich nutze für den Anschluss die [https://de.pinout.xyz/ Pins] 4 für VCC, 6 für GND und 12 (GPIO 18) für Data/OUT. Nach dem Verbinden kann der Pi wieder gestartet werden.<br />
<br />
== Konfiguration des RPi ==<br />
Auf dem Pi soll ein MQTT-Publisher installiert werden, der in konfigurierbaren Abständen die Temperatur und den Luftfeuchtigkeitswert an HomeAssistant übermittelt. Dafür ist Python in der Version >=3.6 nötig. Hierfür steht dann über Pip der mqtt-io zur Verfügung.<br />
sudo pip3 install mqtt-io<br />
<br />
Diese Konfiguration installiert mqtt-io global, Tyzbit.blog stellt noch eine Lösung in einem Virtual Python Environment vor.<br />
<br />
Für den Betrieb von mqtt-io ist dann eine Konfiguration nötig, die unter /etc/mqtt-io.yaml Platz findet:<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
host: 192.168.178.10 # IP der HomeAssistant-Instanz<br />
topic_prefix: wz/raspberrypi # Zu veröffentlichendes Topic (dies sollte eine Struktur folgen, zB Raum / Gerät)<br />
status_payload_running: available<br />
status_payload_stopped: unavailable<br />
status_payload_dead: unavailable<br />
user: USER # oben angelegter Account für mqtt<br />
password: PASSWORD # Passwort des Accounts<br />
<br />
sensor_modules:<br />
- name: dht22_sensor<br />
module: dht22<br />
type: dht22<br />
pin: 18 # ggf. anzupassen, falls anderer GPIO-Pin verwendet (GPIO ID, nicht Index des Pins(!), siehe Link oben)<br />
<br />
sensor_inputs:<br />
- name: wz_temperature # Name, ggf. anzupassen<br />
module: dht22_sensor<br />
digits: 2 # Nachkommastellen<br />
interval: 5 # Interval der Veröffentlichung in Sekunden<br />
type: temperature<br />
- name: wz_humidity<br />
module: dht22_sensor<br />
digits: 2<br />
interval: 5<br />
type: humidity<br />
</syntaxhighlight><br />
<br />
Ein Test ist dann mittels<br />
python3.9 -m mqtt_io /etc/mqtt-io.yaml<br />
möglich. Hierbei sollte der Pi bereits Daten an HomeAssistant übertragen sowie die veröffentlichten Werte auf der Konsole ausgeben:<br />
Jun 27 18:39:25 HOSTNAME python3[1706]: 2023-06-27 18:39:25 mqtt_io.server [INFO] Read sensor 'wz_humidity' value of 43.9<br />
Jun 27 18:39:29 HOSTNAME python3[1706]: 2023-06-27 18:39:29 mqtt_io.server [INFO] Read sensor 'wz_temperature' value of 22.9<br />
<br />
Ist das erfolgreich, kann ein Systemd-Service definiert werden, der die MQTT-Instanz automatisch startet, sodass das System automatisch Werte an HomeAssistant übermittelt. Unter /etc/systemd/system/mqttio.service ist folgender Inhalt zu hinterlegen:<br />
<br />
<syntaxhighlight lang="bash" line><br />
[Unit]<br />
Description=MQTT-IO<br />
After=network.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
Restart=always<br />
Type=simple<br />
ExecStart=/usr/bin/python3 -m mqtt_io /etc/mqtt-io.yaml<br />
User=root<br />
Environment=<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
Anschließend muss systemd über die Änderungen informiert werden:<br />
sudo systemctl daemon-reload <br />
sudo systemctl enable mqttio<br />
sudo systemctl start mqttio<br />
<br />
Verläuft das erfolgreich, ist der Status des Services mittels <br />
sudo systemctl status mqttio<br />
abrufbar.<br />
<br />
Über journald kann zudem die aktuelle Übertragung angeschaut werden:<br />
journalctl -t python3 -f<br />
<br />
== Integration in HomeAssistant ==<br />
Sobald der Pi Daten veröffentlicht, können diese auch in HomeAssistant abgefragt werden. Dazu muss zunächst der Sensor konfiguriert werden. Über den Add-On Store kann das Add-On "File Editor" installiert werden, das eine direkte Bearbeitung der Konfigurationsdateien im Browser möglich macht. Nach der Installation ist das Add-on links in der Sidebar aufrufbar. Über den Ordner kann die configuration.yaml aufgerufen werden. Hier sind folgende Zeilen einzufügen:<br />
<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
sensor:<br />
- name: "WZ Temperature"<br />
unique_id: 5ae12d30-c4a7-44b5-8868-785ba3ec527c # this can be anything unique<br />
state_topic: "wz/raspberrypi/sensor/wz_temperature" # ggf. anzupassen!<br />
unit_of_measurement: "°C"<br />
- name: "WZ Humidity"<br />
unique_id: 0134ce78-6374-49a0-9114-7b2af2fb7cac # muss eindeutig sein (zB über uuidgen)<br />
state_topic: "wz/raspberrypi/sensor/wz_humidity" # ggf. anzupassen!<br />
unit_of_measurement: "%"<br />
</syntaxhighlight><br />
<br />
Anschließend die Datei speichern und über das Zahnrad oben rechts HomeAssistant neu starten. Ist das erfolgt, kann der Sensor im Dashboard angezeigt und in Automationen genutzt werden.<br />
<br />
== Weblinks ==<br />
https://tyzbit.blog/connecting-a-dht-22-sensor-to-home-assistant - Originale Dokumentation <br />
<br />
https://smarthomeyourself.de/wiki/homeassistant/home-assistant-fehler-deine-manuell-konfigurierten-mqtt-sensoren-erfordert-aufmerksamkeit/ Beschreibung der neuen Sensor-Konfiguration<br />
<br />
https://github.com/flyte/mqtt-io/wiki/MQTT-Configuration MQTT-Konfigurationsparameter</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SmartHome_mit_HomeAssistant&diff=232SmartHome mit HomeAssistant2023-06-27T17:13:36Z<p>Lukas: </p>
<hr />
<div>Die neue Wohnung soll in einigen Teilen smart sein. Im ersten Schritt wollen wir hierbei die Lichtsteuerung über das Smartphone und ausgewählte Schalter vornehmen. Dabei kommen unterschiedliche Systeme (Fritz!, IKEA TRADFRI, Funksteckdosen) zum Einsatz. Ziel ist es also, ein System zu finden, das alle Systeme ansteuern kann.<br />
<br />
Mit einem Tipp von Sven Koch bin ich hierbei auf HomeAssistant gestoßen, das additiv an bestehende Systeme angeschlossen werden kann. Die folgenden Artikel sollen die Einrichtung und einige Anwendungsfälle dokumentieren. Dieser Artikel entsteht, während das System schon läuft. Die Grundeinrichtung erfolgte über die [https://www.home-assistant.io/installation/linux Installationsanleitung] via KVM in einer virtuellen Maschine auf meinem PVE.<br />
<br />
Wir hatten zunächst auch die Heizungssteuerung der Fritz!SmartHome-Komponenten über HomeAssistant vorgenommen. Da mir nicht ganz klar war, welches System nun welches inwieweit steuert, da die Fritz!Box selbst zu festgelegten Zeiten in verschiedene Temperatur-Szenen fährt, haben wir die Integration wieder zurückgebaut.<br />
<br />
Die Quantität und Qualität der folgenden Artikel wächst mit der Zeit:<br />
<br />
[[HomeAssistant Temperatur auslesen mit Raspberry Pi und DHT22]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SmartHome_mit_HomeAssistant&diff=231SmartHome mit HomeAssistant2023-06-27T17:12:11Z<p>Lukas: </p>
<hr />
<div>Die neue Wohnung soll in einigen Teilen smart sein. Im ersten Schritt wollen wir hierbei die Lichtsteuerung über das Smartphone und ausgewählte Schalter vornehmen. Dabei kommen unterschiedliche Systeme (Fritz!, IKEA TRADFRI, Funksteckdosen) zum Einsatz. Ziel ist es also, ein System zu finden, das alle Systeme ansteuern kann.<br />
<br />
Mit einem Tipp von Sven Koch bin ich hierbei auf HomeAssistant gestoßen, das additiv an bestehende Systeme angeschlossen werden kann. Die folgenden Artikel sollen die Einrichtung und einige Anwendungsfälle dokumentieren. Dieser Artikel entsteht, während das System schon läuft. Die Grundeinrichtung erfolgte über die [https://www.home-assistant.io/installation/linux Installationsanleitung] via KVM in einer virtuellen Maschine auf meinem PVE.<br />
<br />
Wir hatten zunächst auch die Heizungssteuerung der Fritz!SmartHome-Komponenten über HomeAssistant vorgenommen. Da mir nicht ganz klar war, welches System nun welches inwieweit steuert, da die Fritz!Box selbst zu festgelegten Zeiten in verschiedene Temperatur-Szenen fährt, haben wir die Integration wieder zurückgebaut.<br />
<br />
== Temperatur auslesen mit Raspberry Pi und DHT22 ==<br />
Für die Feststellung der Luftfeuchtigkeit und Temperatur an verschiedensten Stellen kamen bisher die Fernbedienungen von Fritz! zum Einsatz. Da wir nach und nach komplett auf andere Systeme migrieren, ist das eine zeitnah abzulösende Option. Spannend ist nach Anleitung im [https://tyzbit.blog/my-experience-and-thoughts-on-home-assistant Tyzbit-Blog] eine Integration des [https://www.berrybase.de/dht22-digitaler-temperatur-und-luftfeuchtesensor DHT22] als Temperatur- und Wärmesensor auf Raspberry Pi per MQTT am HomeAssistant.<br />
<br />
=== Einbindung von Mosquitto in HomeAssistant ===<br />
Wir nutzen HomeAssistant als MQTT-Broker, sodass hier nicht zusätzlich ein Server für laufen muss. Dies ist über das Add-On "Mosquitto Broker" möglich, das über den Add-On Store direkt in Home Assistant installiert werden kann. Nach einem Klick auf "Install" wird das Add-On installiert und kann konfiguriert werden. Da wir die Verbindungen absichern wollen und hierfür nicht den Standard-Nutzer von HomeAssistant nutzen, muss ein dedizierter Account erstellt werden. Hierfür zunächst die erweiterte Ansicht im eigenen Nutzerprofil durch Klick auf den Namen > "Erweiterter Modus" aktivieren.<br />
<br />
Anschließend über Einstellungen > Personen > Tab: Benutzer einen Benutzer "mqttio" mit dazugehörigem Passwort erstellen. Der Nutzer benötigt keine weiteren Rechte. Das Passwort wird dann auf allen einliefernden Clients eingetragen. Prinzipiell kann für jeden Client ein eigener Account erstellt werden. Dies ist in größeren Installation dann empfehlenswert, wenn nicht sichergestellt werden kann, dass die Geräte nicht aus der eigenen Hand geraten und schlecht durch Fremdzugriff geschützt sind. Für den Heimgebrauch reicht mir ein Account aus.<br />
<br />
Die Konfiguration des Addons erfolgt dann über Einstellungen > Add-Ons > Mosquitto Broker > Tab: Konfiguration. Hier ist unter "Logins" zunächst der eben erstellte Account zu hinterlegen:<br />
- username: mqttio<br />
password: PASSWORD<br />
<br />
Weitere Einstellungen erfolgen in der Integration, die über Einstellungen > Geräte und Dienste schon möglich sein sollte. Hier zunächst über das Zahnrad neben "MQTT" in die Konfiguration wechseln und anschließend die Entität core-mosquitto konfigurieren -> "MQTT neu konfigurieren" -> den Dialog mit den Zugangsdaten weiterklicken. Da die automatische Konfiguration bei mir sowieso nicht korrekt funktioniert hat, habe ich sie hier deaktiviert.<br />
<br />
=== Installation des RPi ===<br />
Zunächst ist auf dem Raspberry Pi die Installation von [https://www.raspberrypi.com/software/ Raspberry Pi OS] nötig. Eine gute Anleitung dafür findet sich auf der Herstellerseite. Nach Abschluss der Installation und Erstkonfiguration ist über ein Terminal mittels<br />
sudo raspi-config<br />
unter "Interface Options" -> "SSH" der SSH-Server zu aktivieren, sodass ein Fernzugriff möglich ist.<br />
<br />
Die IP-Adresse des Pis kann entweder mittels "ip a" im Terminal oder über den netzinternen DHCP-Server ausgelesen werden.<br />
<br />
Anschließend muss der Pi ausgeschaltet und der Sensor verbunden werden. Ich nutze für den Anschluss die [https://de.pinout.xyz/ Pins] 4 für VCC, 6 für GND und 12 (GPIO 18) für Data/OUT. Nach dem Verbinden kann der Pi wieder gestartet werden.<br />
<br />
=== Konfiguration des RPi ===<br />
Auf dem Pi soll ein MQTT-Publisher installiert werden, der in konfigurierbaren Abständen die Temperatur und den Luftfeuchtigkeitswert an HomeAssistant übermittelt. Dafür ist Python in der Version >=3.6 nötig. Hierfür steht dann über Pip der mqtt-io zur Verfügung.<br />
sudo pip3 install mqtt-io<br />
<br />
Diese Konfiguration installiert mqtt-io global, Tyzbit.blog stellt noch eine Lösung in einem Virtual Python Environment vor.<br />
<br />
Für den Betrieb von mqtt-io ist dann eine Konfiguration nötig, die unter /etc/mqtt-io.yaml Platz findet:<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
host: 192.168.178.10 # IP der HomeAssistant-Instanz<br />
topic_prefix: wz/raspberrypi # Zu veröffentlichendes Topic (dies sollte eine Struktur folgen, zB Raum / Gerät)<br />
status_payload_running: available<br />
status_payload_stopped: unavailable<br />
status_payload_dead: unavailable<br />
user: USER # oben angelegter Account für mqtt<br />
password: PASSWORD # Passwort des Accounts<br />
<br />
sensor_modules:<br />
- name: dht22_sensor<br />
module: dht22<br />
type: dht22<br />
pin: 18 # ggf. anzupassen, falls anderer GPIO-Pin verwendet (GPIO ID, nicht Index des Pins(!), siehe Link oben)<br />
<br />
sensor_inputs:<br />
- name: wz_temperature # Name, ggf. anzupassen<br />
module: dht22_sensor<br />
digits: 2 # Nachkommastellen<br />
interval: 5 # Interval der Veröffentlichung in Sekunden<br />
type: temperature<br />
- name: wz_humidity<br />
module: dht22_sensor<br />
digits: 2<br />
interval: 5<br />
type: humidity<br />
</syntaxhighlight><br />
<br />
Ein Test ist dann mittels<br />
python3.9 -m mqtt_io /etc/mqtt-io.yaml<br />
möglich. Hierbei sollte der Pi bereits Daten an HomeAssistant übertragen sowie die veröffentlichten Werte auf der Konsole ausgeben:<br />
Jun 27 18:39:25 HOSTNAME python3[1706]: 2023-06-27 18:39:25 mqtt_io.server [INFO] Read sensor 'wz_humidity' value of 43.9<br />
Jun 27 18:39:29 HOSTNAME python3[1706]: 2023-06-27 18:39:29 mqtt_io.server [INFO] Read sensor 'wz_temperature' value of 22.9<br />
<br />
Ist das erfolgreich, kann ein Systemd-Service definiert werden, der die MQTT-Instanz automatisch startet, sodass das System automatisch Werte an HomeAssistant übermittelt. Unter /etc/systemd/system/mqttio.service ist folgender Inhalt zu hinterlegen:<br />
<br />
<syntaxhighlight lang="bash" line><br />
[Unit]<br />
Description=MQTT-IO<br />
After=network.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
Restart=always<br />
Type=simple<br />
ExecStart=/usr/bin/python3 -m mqtt_io /etc/mqtt-io.yaml<br />
User=root<br />
Environment=<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
Anschließend muss systemd über die Änderungen informiert werden:<br />
sudo systemctl daemon-reload <br />
sudo systemctl enable mqttio<br />
sudo systemctl start mqttio<br />
<br />
Verläuft das erfolgreich, ist der Status des Services mittels <br />
sudo systemctl status mqttio<br />
abrufbar.<br />
<br />
Über journald kann zudem die aktuelle Übertragung angeschaut werden:<br />
journalctl -t python3 -f<br />
<br />
=== Integration in HomeAssistant ===<br />
Sobald der Pi Daten veröffentlicht, können diese auch in HomeAssistant abgefragt werden. Dazu muss zunächst der Sensor konfiguriert werden. Über den Add-On Store kann das Add-On "File Editor" installiert werden, das eine direkte Bearbeitung der Konfigurationsdateien im Browser möglich macht. Nach der Installation ist das Add-on links in der Sidebar aufrufbar. Über den Ordner kann die configuration.yaml aufgerufen werden. Hier sind folgende Zeilen einzufügen:<br />
<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
sensor:<br />
- name: "WZ Temperature"<br />
unique_id: 5ae12d30-c4a7-44b5-8868-785ba3ec527c # this can be anything unique<br />
state_topic: "wz/raspberrypi/sensor/wz_temperature" # ggf. anzupassen!<br />
unit_of_measurement: "°C"<br />
- name: "WZ Humidity"<br />
unique_id: 0134ce78-6374-49a0-9114-7b2af2fb7cac # muss eindeutig sein (zB über uuidgen)<br />
state_topic: "wz/raspberrypi/sensor/wz_humidity" # ggf. anzupassen!<br />
unit_of_measurement: "%"<br />
</syntaxhighlight><br />
<br />
Anschließend die Datei speichern und über das Zahnrad oben rechts HomeAssistant neu starten. Ist das erfolgt, kann der Sensor im Dashboard angezeigt und in Automationen genutzt werden.<br />
<br />
=== Weblinks ===<br />
https://tyzbit.blog/connecting-a-dht-22-sensor-to-home-assistant - Originale Dokumentation <br />
<br />
https://smarthomeyourself.de/wiki/homeassistant/home-assistant-fehler-deine-manuell-konfigurierten-mqtt-sensoren-erfordert-aufmerksamkeit/ Beschreibung der neuen Sensor-Konfiguration<br />
<br />
https://github.com/flyte/mqtt-io/wiki/MQTT-Configuration MQTT-Konfigurationsparameter</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Grav&diff=230Grav2023-06-27T17:11:37Z<p>Lukas: </p>
<hr />
<div>Momentan setze ich auf vielen Seiten das Content Management System TYPO3 ein, das sehr mächtig und vielseitig, dadurch aber an einigen Stellen auch kompliziert ist. Besonders für kleine Seiten ist daher der Wunsch nach einem kleineren CMS immer größer geworden. Die Ausgabe 15/2016 der c't stellt eine spannende Alternative zur Verfügung: Das CMS Grav, das ohne Datenbank auskommt und alle Daten in Dateien speichert.<br />
<br />
Wahlweise gibt es Grav mit oder ohne Administration-Oberfläche. Die Inhalte der Seiten können auch über die Kommandozeile manipuliert werden. Zur Bedienung durch Endanwender ist aber eine Admin-Oberfläche sinnvoll.<br />
<br />
== Installation ==<br />
Zunächst lädt man sich das entsprechende Paket von der Seit https://getgrav.org/downloads herunter:<br />
wget https://github.com/getgrav/grav/releases/download/1.1.1/grav-admin-v1.1.1.zip<br />
<br />
Nach dem Entpacken<br />
unzip grav-admin-v1.1.1.zip<br />
ist die Installation unter http://example.com/grav-admin erreichbar. Für eine öffentliche Homepage kann es sinnvoll sein, die Dateien in das Wurzelverzeichnis der Domain zu kopieren. Wichtig ist hierbei, auch die .htaccess-Datei mit zu kopieren.<br />
<br />
Wenn die Verzeichnisrechte stimmen, bekommen wir einen Dialog angezeigt, um unsere Benutzerdaten einzugeben. Falls nicht:<br />
<br />
sudo chown www-data.www-data ./grav-admin<br />
sudo chmod -R 0770 ./grav-admin<br />
<br />
[[Datei:grav-admin-createuser.png|300px]]<br />
<br />
Nach dem Erstellen des Benutzers, bekommen wir das Dashboard zu Gesicht, in dem wir Infos über den Zustand der Installation und die letzten Änderungen erhalten.<br />
<br />
[[Datei:grav-admin-dashboard.png|600px]]<br />
<br />
== Konfiguration ==<br />
Die Grav-Installation lässt sich bequem über die Weboberfläche konfigurieren. Dafür wählt man links den Punkt "Configuration" aus. Hier kann man im ersten Schritt die Sprache "de" unter "languages" hinzufügen, um die Administration auf Deutsch anzuzeigen. Mit dem Klick auf entsprechenden Button zum Speichern an der Oberseite des Bildschirms, wird die entsprechende Änderung wirksam.<br />
Hier können wir auch den Seitentitel und weitere Einstellungen verändern.<br />
<br />
Grav arbeitet mit der Auszeichnungssprache YAML. Im Prinzip kann man also die gesamte Konfiguration über die Dateien unter ./grav-admin/user/config/ manipulieren.<br />
<br />
== Seiten erstellen ==<br />
Unter dem Menüpunkt "Seiten" lassen sich die Seiten anlegen und verwalten. Um eine neue Seite zu erstellen, wählt man im oberen Menü den Punkt "Seite hinzufügen" aus. Die Positionierung der Seite, der Name und die Sichtbarkeit lassen sich im darauffolgenden Dialog einstellen.<br />
Die Seite lässt sich nach dem Erstellen noch weiter konfigurieren.<br />
<br />
Grav arbeitet mit unterschiedlichen Seitenvorlagen. Je nach Theme lassen sich neben "Default" noch weitere Templates auswählen. So können beispielsweise ein Blog oder ein Kontaktformular einfach eingestellt werden.<br />
<br />
=== Inhalt einstellen ===<br />
Nach dem Anlegen der Seite landet man direkt auf der Eingabemaske für Inhalt. Hier bedient sich Grav der Textauszeichnungssprache Markdown. Die verschiedenen Gestaltungs- und Logikmerkmale, wie Überschrift, fett, kursiv oder unterstrichen lassen sich bequem über die Formatierungsleiste auswählen.<br />
Alternativ kann man die Formartierung auch direkt in das Textfeld eingeben, der Editor wandelt das dann auch entsprechend um:<br />
<br />
* <code>#</code> steht für die Überschrift 1, weitere Rauten markieren dann die weiteren Ebenen (<code>##</code> für Überschrift 2, etc.).<br />
* <code>**Text**</code> lässt den Text fett werden<br />
* <code>_Text_</code> unterstreicht den Text<br />
* <code><nowiki>~~Text~~</nowiki></code> streicht den Text durch<br />
* <code>===</code> fügt einen Strich für die Zusammenfassung ein<br />
* <code>[](http://)</code> setzt einen Link<br />
* <code>![](http://)</code> fügt ein Bild aus der angegebenen Quelle ein<br />
<br />
== Theme mit Twig ==<br />
Spannend wird die Themeerstellung. Grav nutzt die Engine Twig, um Layouts mit Inhalt zu füllen. Dadurch lassen sich auch komplexe Layouts relativ einfach in Grav einbinden.<br />
<br />
Zunächst installiert man die Developer-Tools entweder über die Oberfläche oder über den GPM (Grav Paket Manager):<br />
./grav-admin/bin/gpm install devtools<br />
<br />
Daraufhin lässt man sich ein neues leeres Theme anlegen:<br />
./grav-admin/bin/plugin devtools new-theme<br />
<br />
Enter Theme Name: LT42<br />
Enter Theme Description: Simple theme providing bootstrap<br />
Enter Developer Name: Lukas Thiel<br />
Enter Developer Email: lukas@lt42.de<br />
Please choose a template type<br />
[0] pure-blank<br />
[1] inheritence<br />
> 0<br />
<br />
Das "pure-blank"-Theme erstellt ein neues leeres Theme, "inheritence" würde ein bestehendes Theme erweitern. Daraufhin ist unter ./grav-admin/user/themes/ das angegebene Verzeichnis erstellt worden. Generell gilt folgende Struktur:<br />
lt42<br />
|--blueprints<br />
|--css<br />
|--css-compiled<br />
|--fonts<br />
|--images<br />
|--js<br />
|--scss<br />
|--templates<br />
|--forms<br />
|--modular<br />
|--partials<br />
lt42.php<br />
lt42.yaml<br />
blueprints.yaml<br />
screenshot.jpg<br />
scss.sh<br />
thumbnail.jpg<br />
<br />
Die Struktur ist relativ selbst erklärend. Das Grav-Team rät, die entsprechenden Dateien in die dafürvorgesehenden Verzeichnisse zu legen. Für die Verwendung sind mindestens die blueprints.yaml, lt42.php, lt42.yaml und das Verzeichnis templates/ nötig. Für eine Veröffentlichung zusätzlich:<br />
* CHANGELOG.md<br />
* LICENSE<br />
* README.md<br />
* screenshot.jpg<br />
* thumbnail.jpg<br />
<br />
=== Theme erstellen ===<br />
Im Verzeichnis templates/ finden sich die HTML-Grundgerüste des Themes und der verschiedenen Templates. Im Ordner partials/ findet sich die Datei base.html.twig. Diese stellt das Grundgerüst des Themes dar.<br />
Die Datei spricht für sich: Es gibt verschiedene Blocks, in denen dynamisch Inhalt generiert wird. Interessant sind zusätzlich die angegebenen Assets. Jede CSS- oder JavaScript-Datei wird hinzugefügt. Daraufhin werden die Assets generiert und ausgegeben. Der Vorteil ist, dass man prinzipiell völlig ungeordnet<br />
alle Dateien in das Twig-Template schreiben könnte und die Sortierung trotzdem richtig wäre.<br />
Eine Übersicht über die verschiedenen Möglichkeiten bietet der Artikel zum Asset Manager in der Grav-Doku (https://learn.getgrav.org/themes/asset-manager).<br />
<br />
Mein Ziel ist es, ein Bootstrap-Layout einzubinden. Ich habe das Bootstrap-Paket heruntergeladen und in die entsprechenden Verzeichnisse entpackt. Zusätzlich auch die im Bootstrap-Grundlayout (http://getbootstrap.com/getting-started/#template) eingebundenen JavaScripts, damit diese nicht von extern eingebunden werden müssen.<br />
Meine base.html.twig sieht so aus:<br />
<br />
<syntaxhighlight lang="twig" line><br />
{% set theme_config = attribute(config.themes, config.system.pages.theme) %}<br />
<!DOCTYPE html><br />
<html lang="{{ grav.language.getActive ?: theme_config.default_lang }}"><br />
<head><br />
{% block head %}<br />
<meta charset="utf-8" /><br />
<title>{{ site.title|e('html') }}: {% if header.title %}{{ header.title|e('html') }}{% endif %}</title><br />
<meta http-equiv="X-UA-Compatible" content="IE=edge"><br />
<meta name="viewport" content="width=device-width, initial-scale=1"><br />
{% include 'partials/metadata.html.twig' %} <br />
<link rel="icon" type="image/png" href="{{ url('theme://images/logo.png') }}" /><br />
<link rel="canonical" href="{{ page.url(true, true) }}" /><br />
{% block stylesheets %}<br />
{#% do assets.addCss('http://yui.yahooapis.com/pure/0.6.0/pure-min.css', 100) %#}<br />
{% do assets.addCss('theme://css/font-awesome.min.css', 100) %}<br />
{% do assets.addCss('theme://css/bootstrap.min.css', 99) %}<br />
{% do assets.addCss('theme://css/bootstrap-theme.min.css', 98) %}<br />
{% do assets.addCss('theme://css/anpassung.css', 97) %}<br />
{% endblock %}<br />
{{ assets.css() }} <br />
{% block javascripts %}<br />
{% do assets.addJs('jquery', {'priority' : 100, 'group' : 'bottom'}) %}<br />
{% do assets.addJs('theme://js/bootstrap.min.js', {'priority' : 99, 'group' : 'bottom'}) %}<br />
{% endblock %}<br />
{{ assets.js() }}<br />
{% endblock head%}<br />
</head> <br />
<!--<div class="wrapper padding"><br />
<a class="logo left" href="{{base_url == '' ? '/' : base_url }}"><br />
<i class="fa fa-rebel"></i ><br />
{{ config.site.title }}--> <br />
<body id="top" class="{{ page.header.body_classes }}"><br />
<div id="einspaltig"><br />
<div class="container"><br />
{% block header %}<br />
<div class="row" id="header"><br />
<div class="col-md-12"><br />
<div id="skiplink"><br />
<a class="skip" title="Direkt zur Navigation springen" href="#navigation">Zur Navigation springen</a><br><br />
<a class="skip" title="Direkt zum Content springen" href="#content">Zum Content springen</a><br />
</div><br />
Header<br />
</div><br />
</div><br />
{% endblock %}<br />
{% block header_navigation %}<br />
<div id="navbar"><br />
<nav class="navbar navbar-default" role="navigation"><br />
<a id="navigation" name="navigation"></a><br />
<!-- Titel und Schalter werden für eine bessere mobile Ansicht zusammengefasst --><br />
<div class="navbar-header"><br />
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1"><br />
<span class="sr-only">Navigation ein-/ausblenden</span><br />
<span class="icon-bar"></span><br />
<span class="icon-bar"></span><br />
<span class="icon-bar"></span><br />
</button><br />
<a class="navbar-brand" href="#">Hauptmenü</a><br />
</div><br />
<!-- Alle Navigationslinks, Formulare und anderer Inhalt werden hier zusammengefasst und können dann ein- und ausgeblendet werden --><br />
<div class="collapse navbar-collapse" id="navbar-collapse-1"><br />
{% include 'partials/navigation.html.twig' %}<br />
</div> <!-- /.navbar-collapse --><br />
</nav><br />
</div><br />
{% endblock %}<br />
<!--<div id="service">Service</div><br />
<div id="rootline">Rootline</div>--><br />
{% block body %}<br />
<div id="inhalt" class="row equalheight"><br />
<div class="col-md-12 equal" id="hauptinhalt"><br />
{% block content %}<br />
{% endblock %}<br />
</div><br />
</div><br />
{% endblock %}<br />
{% block footer %}<br />
<div class="row" id="footer"><br />
<div class="col-md-12">&copy; &nbsp; Netthelp.de (2016)</div><br />
</div><br />
{% endblock %}<br />
</div><br />
</div><br />
{% block bottom %}<br />
{{ assets.js('bottom') }}<br />
{% endblock %}<br />
</body><br />
</syntaxhighlight><br />
<br />
Spannend ist, dass Twig von Haus aus eine Funktion zum Ein- oder Abschalten des DropDown-Menüs mitbringt. Die navigation.html.twig sieht so aus:<br />
<syntaxhighlight lang="twig" line><br />
{% macro loop(page) %}<br />
{% for p in page.children.visible %}<br />
{% set current_page = (p.active or p.activeChild) ? 'active' : '' %}<br />
{% if p.children.visible.count > 0 %}<br />
<li class="dropdown {{ current_page }}"><br />
<a href="{{ p.url }}" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><br />
{% if p.header.icon %}<i class="fa fa-{{ p.header.icon }}"></i>{% endif %}<br />
{{ p.menu }}<br />
<span class="caret"></span><br />
</a><br />
<ul class="dropdown-menu"><br />
{{ _self.loop(p) }}<br />
</ul><br />
</li><br />
{% else %}<br />
<li class="{{ current_page }}"><br />
<a href="{{ p.url }}"><br />
{% if p.header.icon %}<i class="fa fa-{{ p.header.icon }}"></i>{% endif %}<br />
{{ p.menu }}<br />
</a><br />
</li><br />
{% endif %}<br />
{% endfor %}<br />
{% endmacro %}<br />
<br />
<ul class="nav navbar-nav"><br />
{% if theme_config.dropdown.enabled %}<br />
{{ _self.loop(pages) }}<br />
{% else %}<br />
{% for page in pages.children.visible %}<br />
{% set current_page = (page.active or page.activeChild) ? 'active' : '' %}<br />
<li class="{{ current_page }}"><br />
<a href="{{ page.url }}"><br />
{% if page.header.icon %}<i class="fa fa-{{ page.header.icon }}"></i>{% endif %}<br />
{{ page.menu }}<br />
</a><br />
</li><br />
{% endfor %}<br />
{% endif %}<br />
{% for mitem in site.menu %}<br />
<li><br />
<a href="{{ mitem.url }}"><br />
{% if mitem.icon %}<i class="fa fa-{{ mitem.icon }}"></i>{% endif %}<br />
{{ mitem.text }}<br />
</a><br />
</li><br />
{% endfor %}<br />
</ul><br />
</syntaxhighlight><br />
<br />
Im oberen Teil wird eine Funktion zum Loopen des Dropdown-Menüs erzeugt. Diese wird im unteren Teil, je nachdem ob das Menü aktiviert ist oder nicht, ausgeführt.<br />
<br />
=== Theme aktivieren ===<br />
<br />
Stellt man das Theme in den Einstellungen oder unter dem Menü-Punkt "Themes" um, kann man sein Ergebnis sofort betrachten.<br />
Nun fehlen noch ein zweites Menü und die Einbindung des DropDown-Menüs.<br />
<br />
== Weblinks ==<br />
* https://learn.getgrav.org/themes/theme-basics - Grundlegendes zu Grav-Themes<br />
* https://learn.getgrav.org/themes/theme-tutorial - Eine Anleitung zum Erstellen von Grav-Themes</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Grav&diff=229Grav2023-06-27T17:11:22Z<p>Lukas: + syntaxhighlight</p>
<hr />
<div>Momentan setze ich auf vielen Seiten das Content Management System Typo3 ein, das sehr mächtig und vielseitig, dadurch aber an einigen Stellen auch kompliziert ist. Besonders für kleine Seiten ist daher der Wunsch nach einem kleineren CMS immer größer geworden. Die Ausgabe 15/2016 der c't stellt eine spannende Alternative zur Verfügung: Das CMS Grav, das ohne Datenbank auskommt und alle Daten in Dateien speichert.<br />
<br />
Wahlweise gibt es Grav mit oder ohne Administration-Oberfläche. Die Inhalte der Seiten können auch über die Kommandozeile manipuliert werden. Zur Bedienung durch Endanwender ist aber eine Admin-Oberfläche sinnvoll.<br />
<br />
== Installation ==<br />
Zunächst lädt man sich das entsprechende Paket von der Seit https://getgrav.org/downloads herunter:<br />
wget https://github.com/getgrav/grav/releases/download/1.1.1/grav-admin-v1.1.1.zip<br />
<br />
Nach dem Entpacken<br />
unzip grav-admin-v1.1.1.zip<br />
ist die Installation unter http://example.com/grav-admin erreichbar. Für eine öffentliche Homepage kann es sinnvoll sein, die Dateien in das Wurzelverzeichnis der Domain zu kopieren. Wichtig ist hierbei, auch die .htaccess-Datei mit zu kopieren.<br />
<br />
Wenn die Verzeichnisrechte stimmen, bekommen wir einen Dialog angezeigt, um unsere Benutzerdaten einzugeben. Falls nicht:<br />
<br />
sudo chown www-data.www-data ./grav-admin<br />
sudo chmod -R 0770 ./grav-admin<br />
<br />
[[Datei:grav-admin-createuser.png|300px]]<br />
<br />
Nach dem Erstellen des Benutzers, bekommen wir das Dashboard zu Gesicht, in dem wir Infos über den Zustand der Installation und die letzten Änderungen erhalten.<br />
<br />
[[Datei:grav-admin-dashboard.png|600px]]<br />
<br />
== Konfiguration ==<br />
Die Grav-Installation lässt sich bequem über die Weboberfläche konfigurieren. Dafür wählt man links den Punkt "Configuration" aus. Hier kann man im ersten Schritt die Sprache "de" unter "languages" hinzufügen, um die Administration auf Deutsch anzuzeigen. Mit dem Klick auf entsprechenden Button zum Speichern an der Oberseite des Bildschirms, wird die entsprechende Änderung wirksam.<br />
Hier können wir auch den Seitentitel und weitere Einstellungen verändern.<br />
<br />
Grav arbeitet mit der Auszeichnungssprache YAML. Im Prinzip kann man also die gesamte Konfiguration über die Dateien unter ./grav-admin/user/config/ manipulieren.<br />
<br />
== Seiten erstellen ==<br />
Unter dem Menüpunkt "Seiten" lassen sich die Seiten anlegen und verwalten. Um eine neue Seite zu erstellen, wählt man im oberen Menü den Punkt "Seite hinzufügen" aus. Die Positionierung der Seite, der Name und die Sichtbarkeit lassen sich im darauffolgenden Dialog einstellen.<br />
Die Seite lässt sich nach dem Erstellen noch weiter konfigurieren.<br />
<br />
Grav arbeitet mit unterschiedlichen Seitenvorlagen. Je nach Theme lassen sich neben "Default" noch weitere Templates auswählen. So können beispielsweise ein Blog oder ein Kontaktformular einfach eingestellt werden.<br />
<br />
=== Inhalt einstellen ===<br />
Nach dem Anlegen der Seite landet man direkt auf der Eingabemaske für Inhalt. Hier bedient sich Grav der Textauszeichnungssprache Markdown. Die verschiedenen Gestaltungs- und Logikmerkmale, wie Überschrift, fett, kursiv oder unterstrichen lassen sich bequem über die Formatierungsleiste auswählen.<br />
Alternativ kann man die Formartierung auch direkt in das Textfeld eingeben, der Editor wandelt das dann auch entsprechend um:<br />
<br />
* <code>#</code> steht für die Überschrift 1, weitere Rauten markieren dann die weiteren Ebenen (<code>##</code> für Überschrift 2, etc.).<br />
* <code>**Text**</code> lässt den Text fett werden<br />
* <code>_Text_</code> unterstreicht den Text<br />
* <code><nowiki>~~Text~~</nowiki></code> streicht den Text durch<br />
* <code>===</code> fügt einen Strich für die Zusammenfassung ein<br />
* <code>[](http://)</code> setzt einen Link<br />
* <code>![](http://)</code> fügt ein Bild aus der angegebenen Quelle ein<br />
<br />
== Theme mit Twig ==<br />
Spannend wird die Themeerstellung. Grav nutzt die Engine Twig, um Layouts mit Inhalt zu füllen. Dadurch lassen sich auch komplexe Layouts relativ einfach in Grav einbinden.<br />
<br />
Zunächst installiert man die Developer-Tools entweder über die Oberfläche oder über den GPM (Grav Paket Manager):<br />
./grav-admin/bin/gpm install devtools<br />
<br />
Daraufhin lässt man sich ein neues leeres Theme anlegen:<br />
./grav-admin/bin/plugin devtools new-theme<br />
<br />
Enter Theme Name: LT42<br />
Enter Theme Description: Simple theme providing bootstrap<br />
Enter Developer Name: Lukas Thiel<br />
Enter Developer Email: lukas@lt42.de<br />
Please choose a template type<br />
[0] pure-blank<br />
[1] inheritence<br />
> 0<br />
<br />
Das "pure-blank"-Theme erstellt ein neues leeres Theme, "inheritence" würde ein bestehendes Theme erweitern. Daraufhin ist unter ./grav-admin/user/themes/ das angegebene Verzeichnis erstellt worden. Generell gilt folgende Struktur:<br />
lt42<br />
|--blueprints<br />
|--css<br />
|--css-compiled<br />
|--fonts<br />
|--images<br />
|--js<br />
|--scss<br />
|--templates<br />
|--forms<br />
|--modular<br />
|--partials<br />
lt42.php<br />
lt42.yaml<br />
blueprints.yaml<br />
screenshot.jpg<br />
scss.sh<br />
thumbnail.jpg<br />
<br />
Die Struktur ist relativ selbst erklärend. Das Grav-Team rät, die entsprechenden Dateien in die dafürvorgesehenden Verzeichnisse zu legen. Für die Verwendung sind mindestens die blueprints.yaml, lt42.php, lt42.yaml und das Verzeichnis templates/ nötig. Für eine Veröffentlichung zusätzlich:<br />
* CHANGELOG.md<br />
* LICENSE<br />
* README.md<br />
* screenshot.jpg<br />
* thumbnail.jpg<br />
<br />
=== Theme erstellen ===<br />
Im Verzeichnis templates/ finden sich die HTML-Grundgerüste des Themes und der verschiedenen Templates. Im Ordner partials/ findet sich die Datei base.html.twig. Diese stellt das Grundgerüst des Themes dar.<br />
Die Datei spricht für sich: Es gibt verschiedene Blocks, in denen dynamisch Inhalt generiert wird. Interessant sind zusätzlich die angegebenen Assets. Jede CSS- oder JavaScript-Datei wird hinzugefügt. Daraufhin werden die Assets generiert und ausgegeben. Der Vorteil ist, dass man prinzipiell völlig ungeordnet<br />
alle Dateien in das Twig-Template schreiben könnte und die Sortierung trotzdem richtig wäre.<br />
Eine Übersicht über die verschiedenen Möglichkeiten bietet der Artikel zum Asset Manager in der Grav-Doku (https://learn.getgrav.org/themes/asset-manager).<br />
<br />
Mein Ziel ist es, ein Bootstrap-Layout einzubinden. Ich habe das Bootstrap-Paket heruntergeladen und in die entsprechenden Verzeichnisse entpackt. Zusätzlich auch die im Bootstrap-Grundlayout (http://getbootstrap.com/getting-started/#template) eingebundenen JavaScripts, damit diese nicht von extern eingebunden werden müssen.<br />
Meine base.html.twig sieht so aus:<br />
<br />
<syntaxhighlight lang="twig" line><br />
{% set theme_config = attribute(config.themes, config.system.pages.theme) %}<br />
<!DOCTYPE html><br />
<html lang="{{ grav.language.getActive ?: theme_config.default_lang }}"><br />
<head><br />
{% block head %}<br />
<meta charset="utf-8" /><br />
<title>{{ site.title|e('html') }}: {% if header.title %}{{ header.title|e('html') }}{% endif %}</title><br />
<meta http-equiv="X-UA-Compatible" content="IE=edge"><br />
<meta name="viewport" content="width=device-width, initial-scale=1"><br />
{% include 'partials/metadata.html.twig' %} <br />
<link rel="icon" type="image/png" href="{{ url('theme://images/logo.png') }}" /><br />
<link rel="canonical" href="{{ page.url(true, true) }}" /><br />
{% block stylesheets %}<br />
{#% do assets.addCss('http://yui.yahooapis.com/pure/0.6.0/pure-min.css', 100) %#}<br />
{% do assets.addCss('theme://css/font-awesome.min.css', 100) %}<br />
{% do assets.addCss('theme://css/bootstrap.min.css', 99) %}<br />
{% do assets.addCss('theme://css/bootstrap-theme.min.css', 98) %}<br />
{% do assets.addCss('theme://css/anpassung.css', 97) %}<br />
{% endblock %}<br />
{{ assets.css() }} <br />
{% block javascripts %}<br />
{% do assets.addJs('jquery', {'priority' : 100, 'group' : 'bottom'}) %}<br />
{% do assets.addJs('theme://js/bootstrap.min.js', {'priority' : 99, 'group' : 'bottom'}) %}<br />
{% endblock %}<br />
{{ assets.js() }}<br />
{% endblock head%}<br />
</head> <br />
<!--<div class="wrapper padding"><br />
<a class="logo left" href="{{base_url == '' ? '/' : base_url }}"><br />
<i class="fa fa-rebel"></i ><br />
{{ config.site.title }}--> <br />
<body id="top" class="{{ page.header.body_classes }}"><br />
<div id="einspaltig"><br />
<div class="container"><br />
{% block header %}<br />
<div class="row" id="header"><br />
<div class="col-md-12"><br />
<div id="skiplink"><br />
<a class="skip" title="Direkt zur Navigation springen" href="#navigation">Zur Navigation springen</a><br><br />
<a class="skip" title="Direkt zum Content springen" href="#content">Zum Content springen</a><br />
</div><br />
Header<br />
</div><br />
</div><br />
{% endblock %}<br />
{% block header_navigation %}<br />
<div id="navbar"><br />
<nav class="navbar navbar-default" role="navigation"><br />
<a id="navigation" name="navigation"></a><br />
<!-- Titel und Schalter werden für eine bessere mobile Ansicht zusammengefasst --><br />
<div class="navbar-header"><br />
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1"><br />
<span class="sr-only">Navigation ein-/ausblenden</span><br />
<span class="icon-bar"></span><br />
<span class="icon-bar"></span><br />
<span class="icon-bar"></span><br />
</button><br />
<a class="navbar-brand" href="#">Hauptmenü</a><br />
</div><br />
<!-- Alle Navigationslinks, Formulare und anderer Inhalt werden hier zusammengefasst und können dann ein- und ausgeblendet werden --><br />
<div class="collapse navbar-collapse" id="navbar-collapse-1"><br />
{% include 'partials/navigation.html.twig' %}<br />
</div> <!-- /.navbar-collapse --><br />
</nav><br />
</div><br />
{% endblock %}<br />
<!--<div id="service">Service</div><br />
<div id="rootline">Rootline</div>--><br />
{% block body %}<br />
<div id="inhalt" class="row equalheight"><br />
<div class="col-md-12 equal" id="hauptinhalt"><br />
{% block content %}<br />
{% endblock %}<br />
</div><br />
</div><br />
{% endblock %}<br />
{% block footer %}<br />
<div class="row" id="footer"><br />
<div class="col-md-12">&copy; &nbsp; Netthelp.de (2016)</div><br />
</div><br />
{% endblock %}<br />
</div><br />
</div><br />
{% block bottom %}<br />
{{ assets.js('bottom') }}<br />
{% endblock %}<br />
</body><br />
</syntaxhighlight><br />
<br />
Spannend ist, dass Twig von Haus aus eine Funktion zum Ein- oder Abschalten des DropDown-Menüs mitbringt. Die navigation.html.twig sieht so aus:<br />
<syntaxhighlight lang="twig" line><br />
{% macro loop(page) %}<br />
{% for p in page.children.visible %}<br />
{% set current_page = (p.active or p.activeChild) ? 'active' : '' %}<br />
{% if p.children.visible.count > 0 %}<br />
<li class="dropdown {{ current_page }}"><br />
<a href="{{ p.url }}" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><br />
{% if p.header.icon %}<i class="fa fa-{{ p.header.icon }}"></i>{% endif %}<br />
{{ p.menu }}<br />
<span class="caret"></span><br />
</a><br />
<ul class="dropdown-menu"><br />
{{ _self.loop(p) }}<br />
</ul><br />
</li><br />
{% else %}<br />
<li class="{{ current_page }}"><br />
<a href="{{ p.url }}"><br />
{% if p.header.icon %}<i class="fa fa-{{ p.header.icon }}"></i>{% endif %}<br />
{{ p.menu }}<br />
</a><br />
</li><br />
{% endif %}<br />
{% endfor %}<br />
{% endmacro %}<br />
<br />
<ul class="nav navbar-nav"><br />
{% if theme_config.dropdown.enabled %}<br />
{{ _self.loop(pages) }}<br />
{% else %}<br />
{% for page in pages.children.visible %}<br />
{% set current_page = (page.active or page.activeChild) ? 'active' : '' %}<br />
<li class="{{ current_page }}"><br />
<a href="{{ page.url }}"><br />
{% if page.header.icon %}<i class="fa fa-{{ page.header.icon }}"></i>{% endif %}<br />
{{ page.menu }}<br />
</a><br />
</li><br />
{% endfor %}<br />
{% endif %}<br />
{% for mitem in site.menu %}<br />
<li><br />
<a href="{{ mitem.url }}"><br />
{% if mitem.icon %}<i class="fa fa-{{ mitem.icon }}"></i>{% endif %}<br />
{{ mitem.text }}<br />
</a><br />
</li><br />
{% endfor %}<br />
</ul><br />
</syntaxhighlight><br />
<br />
Im oberen Teil wird eine Funktion zum Loopen des Dropdown-Menüs erzeugt. Diese wird im unteren Teil, je nachdem ob das Menü aktiviert ist oder nicht, ausgeführt.<br />
<br />
=== Theme aktivieren ===<br />
<br />
Stellt man das Theme in den Einstellungen oder unter dem Menü-Punkt "Themes" um, kann man sein Ergebnis sofort betrachten.<br />
Nun fehlen noch ein zweites Menü und die Einbindung des DropDown-Menüs.<br />
<br />
== Weblinks ==<br />
* https://learn.getgrav.org/themes/theme-basics - Grundlegendes zu Grav-Themes<br />
* https://learn.getgrav.org/themes/theme-tutorial - Eine Anleitung zum Erstellen von Grav-Themes</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SSL-Zertifikate_mit_Let%27s_Encrypt&diff=228SSL-Zertifikate mit Let's Encrypt2023-06-27T17:08:40Z<p>Lukas: /* Nachtrag vom 19.10.2017 */</p>
<hr />
<div>Die Erstellung von SSL-Zertifikaten zur Verschlüsselung von Server-Verbindungen ist dank StartCom kostenlos, aber mit jährlichem Aufwand verbunden, da die beantragten Zertifikate jährlich erneuert werden müssen.<br />
<br />
Selbstsignierte Zertifikate sind für den Einsatz auf privaten Seiten zur Absicherung zwar sinnig, führen aber zu Sicherheitswarnungen, was sie für den produktiven Betrieb einer öffentlichen Internetseite ausschließt.<br />
<br />
Eine spannende Möglichkeit, um an kostenlose SSL-Zertifikate zu gelangen, bietet nun die Internet Security Research Group (ISRG), einem Zusammenschluss mehrerer Firmen, u.a. Mozilla, Cisco und OVH, die mit Let's Encrypt einen Dienst zur Verfügung stellen, der automatisiert Zertifikate erstellt und ausgibt. Der Antragsteller muss lediglich verifizieren, dass er Zugriff auf die Domain hat.<br />
<br />
== Let's Encrypt herunterladen ==<br />
Für den Einsatz von Let's Encrypt sind eine Reihe von Python-Anwendungen nötig, die über Github verfügbar sind. Falls git auf dem Server noch nicht installiert ist, muss dies nachinstalliert werden:<br />
sudo apt-get update<br />
sudo apt-get install git<br />
<br />
Danach wechseln wir in ein Verzeichnis, in dem Let's Encrypt installiert werden kann (zum Beispiel /root) und klonen die aktuelle Version:<br />
git clone https://github.com/letsencrypt/letsencrypt<br />
<br />
Das Skript legt ein Verzeichnis letsencrypt an, in dem sich u.a. die Datei letsencrypt-auto befindet. Falls keine Rechte zum Ausführen gesetzt sind, fügen wir welche hinzu:<br />
chmod +x ./letsencrypt-auto<br />
<br />
== Zertifikate erstellen ==<br />
=== mit Dialog ===<br />
Let's Encrypt bietet es an, vollautomatisch Zertifikate zu generieren und gleich in die Apache-Konfiguration aufzunehmen. Dafür reicht ein parameterloser Aufruf des Programms-. Wer nur die Zertifikate und keine Konfiguration braucht, kann Let's Encrypt mit folgendem Aufruf starten:<br />
sudo ./letsencrypt-auto --rsa-key-size 4096 certonly<br />
<br />
Dabei legen wir eine RSA-Key-Länge von 4096 statt standardmäßig 2048 fest, um die Sicherheit der Verschlüsselung zu erhöhen. Der Befehl certonly generiert nur Zertifikate ohne den Webserver zu konfigurieren. Beim ersten Aufruf installiert Let's Encrypt automatisch die erforderlichen Pakete nach.<br />
<br />
Im nächsten Schritt fragt Let's Encrypt wie die Verifizierung vorgenommen werden soll. Hier bediene ich den zweiten Weg, das Ablegen einer Datei im Root-Verzeichnis der Domain:<br />
2 Place files in webroot directory (webroot)<br />
<br />
Let's Encrypt fragt dann, für welche Domain ein Zertifikat erstellt werden soll. Alle Domainnamen, die wir hier angeben, werden als Alternativ-Name im Zertifikat hinterlegt.<br />
<br />
Im nächsten Schritt wird dann der Pfad der Seite angegeben. Let's Encrypt wird im nächsten Schritt einen Pfad .well-known anlegen. Es ist also zu überlegen, diesen Pfad für alle Domains auf ein Verzeichnis umzuleiten und dieses als webroot anzugeben. Ansonsten klickt man sich einmal bis zum richtigen Verzeichnis durch. Pro Domain muss hier ein eigenes Verzeichnis angegeben werden. Wer nur ServerAlias-Domains verschlüsseln möchte, kann dann das Webroot-Verzeichnis der Hauptdomain angeben.<br />
<br />
Hat alles geklappt, erstellt Let's Encrypt ein Verzeichnis unterhalb von /etc/letsencrypt/live, in dem die verschiedenen 4 Zertifikate angelegt werden.<br />
<br />
Damit sind die Zertifikate erstellt.<br />
<br />
=== über Parameter ===<br />
Der Aufruf lässt sich auch direkt über einen parametersteuerten Befehl ausführen. Dafür führt man aus dem letsencrypt-Verzeichnis folgenden Befehl aus:<br />
sudo ./letsencrypt-auto --rsa-key-size 4096 certonly --webroot -w /var/www/vhosts/lukasthiel.de/htdocs/ -d lukasthiel.de -d www.lukasthiel.de<br />
<br />
Der Speicherort ist derselbe wie beim obigen Aufruf.<br />
<br />
<br />
=== über Datei ===<br />
Es ist ebenfalls möglich, die Zertifikate über eine Konfigurationsdatei erstellen zu lassen. Das hat zwei immense Vorteile gegenüber der beiden obigen Lösungen:<br />
# die Konfiguration ist über Shell manipulierbar, was beim automatischen Anlegen von VHost von Vorteil ist<br />
# bei Konfigurationsänderungen reicht die Anpassung der Datei, ohne dass der Parameterbefehl gespeichert sein muss<br />
<br />
Die Lösung hat Uwe Debacher in [[d:Überarbeitung_der_Apache-Konfiguration_für_Ubuntu_20.04#letsencrypt|einem Artikel]] vorgestellt. <br />
<br />
<syntaxhighlight lang="ini" line><br />
# Wir nutzen 4096 bit RSA key statt 2048<br />
rsa-key-size = 4096<br />
<br />
# allgemeine Angaben<br />
email = letsencrypt@meine-maildomain.de<br />
authenticator = webroot<br />
<br />
# Domains fuer die wir Zertifikate beantragen, die erste in<br />
# der liste legt den Hauptnamen fest. Alle Domains müssen beim<br />
# Aufruf erreichbar sein<br />
domains = lukasthiel.de, www.lukasthiel.de<br />
<br />
# Dies ist das Verzeichnis zur Domain, wo letsencrypt seinen Hash in<br />
# /.well-known/acme-challenge schreiben will. Der Pfad muss auf / enden<br />
# es muss in der vserver.conf stehen: Alias /.well-known /var/www/htdocs/.well-known<br />
webroot-path = /var/www/htdocs/<br />
</syntaxhighlight><br />
<br />
Die Erstellung erfolgt dann über<br />
/usr/bin/certbot certonly --config /var/www/vhosts/meine-maildomain.de/letsencrypt.ini<br />
<br />
== Konfiguration Apache2 ==<br />
Für Apache2 ist folgende Konfiguration aufzunehmen (example.org muss natürlich durch den entsprechenden Hostnamen ersetzt werden):<br />
<VirtualHost *:443><br />
ServerAdmin webmaster@example.org<br />
ServerName example.org<br />
SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/example.org/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/example.org/chain.pem<br />
DocumentRoot /var/www/vhosts/example.org/htdocs<br />
<Directory /var/www/vhosts/example.org/htdocs/><br />
Options FollowSymLinks MultiViews<br />
AllowOverride All<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
SSLProtocol All -SSLv2 -SSLv3<br />
SSLHonorCipherOrder On<br />
SSLCompression off<br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA <br />
<br />
ErrorLog /var/log/apache2/example.org.error.log<br />
LogLevel warn<br />
CustomLog /var/log/apache2/example.org.access.log combined<br />
</VirtualHost><br />
<br />
Laut [https://thomas-leister.de/internet/anleitung-fuer-lets-encrypt-kostenlose-tls-zertifikate-fuer-alle/ Thomas Leister] muss ab Apache 2.4.8 auf die Chain-Datei verzichtet werden. Die entsprechenden Zeilen sehen dann wie folgt aus:<br />
<br />
SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/example.org/fullchain.pem # statt cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem<br />
<br />
Nach einem<br />
sudo service apache2 reload<br />
sollte die Konfiguration laufen und die Seite unter https://example.org erreichbar sein.<br />
<br />
== Konfiguration Postfix und Dovecot ==<br />
Die Zertifikate lassen sich nicht nur für die Absicherung von HTTPS-Verbindungen nutzen, sondern auch für die sichere Kommunikation mit dem Mailserver. Dafür werden die Zertifikate in den entsprechenden Konfigurationsdateien von Postfix und Dovecot eingebunden:<br />
<br />
/etc/postfix/main.cf<br />
<br />
# tls config<br />
smtpd_use_tls = yes<br />
smtp_tls_note_starttls_offer = yes<br />
smtpd_tls_key_file = /etc/letsencrypt/live/example.org/privkey.pem<br />
smtpd_tls_cert_file = /etc/letsencrypt/live/example.org/fullchain.pem<br />
smtpd_tls_loglevel = 1<br />
smtpd_tls_received_header = yes<br />
smtpd_tls_session_cache_timeout = 3600s<br />
smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3<br />
tls_random_source = dev:/dev/urandom<br />
tls_random_prng_update_period = 3600s<br />
<br />
und /etc/dovecot/dovecot.conf<br />
ssl = yes<br />
ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem<br />
ssl_key = </etc/letsencrypt/live/example.org/privkey.pem<br />
<br />
Nach einem Neustart sollten die neuen Zertifikate aktiviert sein:<br />
sudo service postfix restart<br />
sudo service dovecot restart<br />
<br />
=== Nachtrag vom 19.10.2017 ===<br />
Unsere Uni-Server erfordern eine verschlüsselte Verbindung zwischen Mailservern. Die o.g. Konfiguration nutzt zwar TLS für die Verbindung zwischen Client und Server, aber nicht für den Transport der Mails über den eigenen Server hinaus. Hierfür sind folgende Ergänzungen in der main.cf nötig<br />
smtpd_tls_security_level = may<br />
smtp_tls_security_level = may<br />
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku]<br />
<br />
=== Nachtrag vom 27.06.2023 ===<br />
Es hätte mir vor sechs Jahren auch ohne Informatikstudium klar sein sollen, dass eine Verschlüsselung der Transportwege immer erfüllt sein muss. Daher muss es korrekt heißen:<br />
smtpd_tls_security_level = secure<br />
smtp_tls_security_level = secure<br />
<br />
== Cron-Job für die Aktualisierung ==<br />
Da die Zertifikate nach drei Monaten ablaufen, müssen die dann neu erstellt werden. Let's Encrypt bietet das vollautomatisch an. Es reicht ein Cronjob als root:<br />
0 3 * * * /root/letsencrypt/letsencrypt-auto renew > /dev/null 2>&1<br />
<br />
Let's Encrypt überspringt dabei Zertifikate, die noch gültig sind und aktualisiert nur diejenigen, die abgelaufen sind.<br />
<br />
== Links ==<br />
* https://letsencrypt.org/<br />
* https://thomas-leister.de/internet/anleitung-fuer-lets-encrypt-kostenlose-tls-zertifikate-fuer-alle/<br />
* https://kofler.info/lets-encrypt-zertifikate-fuer-web-und-mail-unter-ubuntu-16-04/<br />
* https://www.debacher.de/ublog/2016/06/letsencrypt/</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SSL-Zertifikate_mit_Let%27s_Encrypt&diff=227SSL-Zertifikate mit Let's Encrypt2023-06-27T17:06:04Z<p>Lukas: /* über Datei */</p>
<hr />
<div>Die Erstellung von SSL-Zertifikaten zur Verschlüsselung von Server-Verbindungen ist dank StartCom kostenlos, aber mit jährlichem Aufwand verbunden, da die beantragten Zertifikate jährlich erneuert werden müssen.<br />
<br />
Selbstsignierte Zertifikate sind für den Einsatz auf privaten Seiten zur Absicherung zwar sinnig, führen aber zu Sicherheitswarnungen, was sie für den produktiven Betrieb einer öffentlichen Internetseite ausschließt.<br />
<br />
Eine spannende Möglichkeit, um an kostenlose SSL-Zertifikate zu gelangen, bietet nun die Internet Security Research Group (ISRG), einem Zusammenschluss mehrerer Firmen, u.a. Mozilla, Cisco und OVH, die mit Let's Encrypt einen Dienst zur Verfügung stellen, der automatisiert Zertifikate erstellt und ausgibt. Der Antragsteller muss lediglich verifizieren, dass er Zugriff auf die Domain hat.<br />
<br />
== Let's Encrypt herunterladen ==<br />
Für den Einsatz von Let's Encrypt sind eine Reihe von Python-Anwendungen nötig, die über Github verfügbar sind. Falls git auf dem Server noch nicht installiert ist, muss dies nachinstalliert werden:<br />
sudo apt-get update<br />
sudo apt-get install git<br />
<br />
Danach wechseln wir in ein Verzeichnis, in dem Let's Encrypt installiert werden kann (zum Beispiel /root) und klonen die aktuelle Version:<br />
git clone https://github.com/letsencrypt/letsencrypt<br />
<br />
Das Skript legt ein Verzeichnis letsencrypt an, in dem sich u.a. die Datei letsencrypt-auto befindet. Falls keine Rechte zum Ausführen gesetzt sind, fügen wir welche hinzu:<br />
chmod +x ./letsencrypt-auto<br />
<br />
== Zertifikate erstellen ==<br />
=== mit Dialog ===<br />
Let's Encrypt bietet es an, vollautomatisch Zertifikate zu generieren und gleich in die Apache-Konfiguration aufzunehmen. Dafür reicht ein parameterloser Aufruf des Programms-. Wer nur die Zertifikate und keine Konfiguration braucht, kann Let's Encrypt mit folgendem Aufruf starten:<br />
sudo ./letsencrypt-auto --rsa-key-size 4096 certonly<br />
<br />
Dabei legen wir eine RSA-Key-Länge von 4096 statt standardmäßig 2048 fest, um die Sicherheit der Verschlüsselung zu erhöhen. Der Befehl certonly generiert nur Zertifikate ohne den Webserver zu konfigurieren. Beim ersten Aufruf installiert Let's Encrypt automatisch die erforderlichen Pakete nach.<br />
<br />
Im nächsten Schritt fragt Let's Encrypt wie die Verifizierung vorgenommen werden soll. Hier bediene ich den zweiten Weg, das Ablegen einer Datei im Root-Verzeichnis der Domain:<br />
2 Place files in webroot directory (webroot)<br />
<br />
Let's Encrypt fragt dann, für welche Domain ein Zertifikat erstellt werden soll. Alle Domainnamen, die wir hier angeben, werden als Alternativ-Name im Zertifikat hinterlegt.<br />
<br />
Im nächsten Schritt wird dann der Pfad der Seite angegeben. Let's Encrypt wird im nächsten Schritt einen Pfad .well-known anlegen. Es ist also zu überlegen, diesen Pfad für alle Domains auf ein Verzeichnis umzuleiten und dieses als webroot anzugeben. Ansonsten klickt man sich einmal bis zum richtigen Verzeichnis durch. Pro Domain muss hier ein eigenes Verzeichnis angegeben werden. Wer nur ServerAlias-Domains verschlüsseln möchte, kann dann das Webroot-Verzeichnis der Hauptdomain angeben.<br />
<br />
Hat alles geklappt, erstellt Let's Encrypt ein Verzeichnis unterhalb von /etc/letsencrypt/live, in dem die verschiedenen 4 Zertifikate angelegt werden.<br />
<br />
Damit sind die Zertifikate erstellt.<br />
<br />
=== über Parameter ===<br />
Der Aufruf lässt sich auch direkt über einen parametersteuerten Befehl ausführen. Dafür führt man aus dem letsencrypt-Verzeichnis folgenden Befehl aus:<br />
sudo ./letsencrypt-auto --rsa-key-size 4096 certonly --webroot -w /var/www/vhosts/lukasthiel.de/htdocs/ -d lukasthiel.de -d www.lukasthiel.de<br />
<br />
Der Speicherort ist derselbe wie beim obigen Aufruf.<br />
<br />
<br />
=== über Datei ===<br />
Es ist ebenfalls möglich, die Zertifikate über eine Konfigurationsdatei erstellen zu lassen. Das hat zwei immense Vorteile gegenüber der beiden obigen Lösungen:<br />
# die Konfiguration ist über Shell manipulierbar, was beim automatischen Anlegen von VHost von Vorteil ist<br />
# bei Konfigurationsänderungen reicht die Anpassung der Datei, ohne dass der Parameterbefehl gespeichert sein muss<br />
<br />
Die Lösung hat Uwe Debacher in [[d:Überarbeitung_der_Apache-Konfiguration_für_Ubuntu_20.04#letsencrypt|einem Artikel]] vorgestellt. <br />
<br />
<syntaxhighlight lang="ini" line><br />
# Wir nutzen 4096 bit RSA key statt 2048<br />
rsa-key-size = 4096<br />
<br />
# allgemeine Angaben<br />
email = letsencrypt@meine-maildomain.de<br />
authenticator = webroot<br />
<br />
# Domains fuer die wir Zertifikate beantragen, die erste in<br />
# der liste legt den Hauptnamen fest. Alle Domains müssen beim<br />
# Aufruf erreichbar sein<br />
domains = lukasthiel.de, www.lukasthiel.de<br />
<br />
# Dies ist das Verzeichnis zur Domain, wo letsencrypt seinen Hash in<br />
# /.well-known/acme-challenge schreiben will. Der Pfad muss auf / enden<br />
# es muss in der vserver.conf stehen: Alias /.well-known /var/www/htdocs/.well-known<br />
webroot-path = /var/www/htdocs/<br />
</syntaxhighlight><br />
<br />
Die Erstellung erfolgt dann über<br />
/usr/bin/certbot certonly --config /var/www/vhosts/meine-maildomain.de/letsencrypt.ini<br />
<br />
== Konfiguration Apache2 ==<br />
Für Apache2 ist folgende Konfiguration aufzunehmen (example.org muss natürlich durch den entsprechenden Hostnamen ersetzt werden):<br />
<VirtualHost *:443><br />
ServerAdmin webmaster@example.org<br />
ServerName example.org<br />
SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/example.org/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/example.org/chain.pem<br />
DocumentRoot /var/www/vhosts/example.org/htdocs<br />
<Directory /var/www/vhosts/example.org/htdocs/><br />
Options FollowSymLinks MultiViews<br />
AllowOverride All<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
SSLProtocol All -SSLv2 -SSLv3<br />
SSLHonorCipherOrder On<br />
SSLCompression off<br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA <br />
<br />
ErrorLog /var/log/apache2/example.org.error.log<br />
LogLevel warn<br />
CustomLog /var/log/apache2/example.org.access.log combined<br />
</VirtualHost><br />
<br />
Laut [https://thomas-leister.de/internet/anleitung-fuer-lets-encrypt-kostenlose-tls-zertifikate-fuer-alle/ Thomas Leister] muss ab Apache 2.4.8 auf die Chain-Datei verzichtet werden. Die entsprechenden Zeilen sehen dann wie folgt aus:<br />
<br />
SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/example.org/fullchain.pem # statt cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem<br />
<br />
Nach einem<br />
sudo service apache2 reload<br />
sollte die Konfiguration laufen und die Seite unter https://example.org erreichbar sein.<br />
<br />
== Konfiguration Postfix und Dovecot ==<br />
Die Zertifikate lassen sich nicht nur für die Absicherung von HTTPS-Verbindungen nutzen, sondern auch für die sichere Kommunikation mit dem Mailserver. Dafür werden die Zertifikate in den entsprechenden Konfigurationsdateien von Postfix und Dovecot eingebunden:<br />
<br />
/etc/postfix/main.cf<br />
<br />
# tls config<br />
smtpd_use_tls = yes<br />
smtp_tls_note_starttls_offer = yes<br />
smtpd_tls_key_file = /etc/letsencrypt/live/example.org/privkey.pem<br />
smtpd_tls_cert_file = /etc/letsencrypt/live/example.org/fullchain.pem<br />
smtpd_tls_loglevel = 1<br />
smtpd_tls_received_header = yes<br />
smtpd_tls_session_cache_timeout = 3600s<br />
smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3<br />
tls_random_source = dev:/dev/urandom<br />
tls_random_prng_update_period = 3600s<br />
<br />
und /etc/dovecot/dovecot.conf<br />
ssl = yes<br />
ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem<br />
ssl_key = </etc/letsencrypt/live/example.org/privkey.pem<br />
<br />
Nach einem Neustart sollten die neuen Zertifikate aktiviert sein:<br />
sudo service postfix restart<br />
sudo service dovecot restart<br />
<br />
=== Nachtrag vom 19.10.2017 ===<br />
Unsere Uni-Server erfordern eine verschlüsselte Verbindung zwischen Mailservern. Die o.g. Konfiguration nutzt zwar TLS für die Verbindung zwischen Client und Server, aber nicht für den Transport der Mails über den eigenen Server hinaus. Hierfür sind folgende Ergänzungen in der main.cf nötig<br />
smtpd_tls_security_level = may<br />
smtp_tls_security_level = may<br />
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku]<br />
<br />
== Cron-Job für die Aktualisierung ==<br />
Da die Zertifikate nach drei Monaten ablaufen, müssen die dann neu erstellt werden. Let's Encrypt bietet das vollautomatisch an. Es reicht ein Cronjob als root:<br />
0 3 * * * /root/letsencrypt/letsencrypt-auto renew > /dev/null 2>&1<br />
<br />
Let's Encrypt überspringt dabei Zertifikate, die noch gültig sind und aktualisiert nur diejenigen, die abgelaufen sind.<br />
<br />
== Links ==<br />
* https://letsencrypt.org/<br />
* https://thomas-leister.de/internet/anleitung-fuer-lets-encrypt-kostenlose-tls-zertifikate-fuer-alle/<br />
* https://kofler.info/lets-encrypt-zertifikate-fuer-web-und-mail-unter-ubuntu-16-04/<br />
* https://www.debacher.de/ublog/2016/06/letsencrypt/</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SSL-Zertifikate_mit_Let%27s_Encrypt&diff=226SSL-Zertifikate mit Let's Encrypt2023-06-27T17:05:39Z<p>Lukas: /* Zertifikate erstellen */</p>
<hr />
<div>Die Erstellung von SSL-Zertifikaten zur Verschlüsselung von Server-Verbindungen ist dank StartCom kostenlos, aber mit jährlichem Aufwand verbunden, da die beantragten Zertifikate jährlich erneuert werden müssen.<br />
<br />
Selbstsignierte Zertifikate sind für den Einsatz auf privaten Seiten zur Absicherung zwar sinnig, führen aber zu Sicherheitswarnungen, was sie für den produktiven Betrieb einer öffentlichen Internetseite ausschließt.<br />
<br />
Eine spannende Möglichkeit, um an kostenlose SSL-Zertifikate zu gelangen, bietet nun die Internet Security Research Group (ISRG), einem Zusammenschluss mehrerer Firmen, u.a. Mozilla, Cisco und OVH, die mit Let's Encrypt einen Dienst zur Verfügung stellen, der automatisiert Zertifikate erstellt und ausgibt. Der Antragsteller muss lediglich verifizieren, dass er Zugriff auf die Domain hat.<br />
<br />
== Let's Encrypt herunterladen ==<br />
Für den Einsatz von Let's Encrypt sind eine Reihe von Python-Anwendungen nötig, die über Github verfügbar sind. Falls git auf dem Server noch nicht installiert ist, muss dies nachinstalliert werden:<br />
sudo apt-get update<br />
sudo apt-get install git<br />
<br />
Danach wechseln wir in ein Verzeichnis, in dem Let's Encrypt installiert werden kann (zum Beispiel /root) und klonen die aktuelle Version:<br />
git clone https://github.com/letsencrypt/letsencrypt<br />
<br />
Das Skript legt ein Verzeichnis letsencrypt an, in dem sich u.a. die Datei letsencrypt-auto befindet. Falls keine Rechte zum Ausführen gesetzt sind, fügen wir welche hinzu:<br />
chmod +x ./letsencrypt-auto<br />
<br />
== Zertifikate erstellen ==<br />
=== mit Dialog ===<br />
Let's Encrypt bietet es an, vollautomatisch Zertifikate zu generieren und gleich in die Apache-Konfiguration aufzunehmen. Dafür reicht ein parameterloser Aufruf des Programms-. Wer nur die Zertifikate und keine Konfiguration braucht, kann Let's Encrypt mit folgendem Aufruf starten:<br />
sudo ./letsencrypt-auto --rsa-key-size 4096 certonly<br />
<br />
Dabei legen wir eine RSA-Key-Länge von 4096 statt standardmäßig 2048 fest, um die Sicherheit der Verschlüsselung zu erhöhen. Der Befehl certonly generiert nur Zertifikate ohne den Webserver zu konfigurieren. Beim ersten Aufruf installiert Let's Encrypt automatisch die erforderlichen Pakete nach.<br />
<br />
Im nächsten Schritt fragt Let's Encrypt wie die Verifizierung vorgenommen werden soll. Hier bediene ich den zweiten Weg, das Ablegen einer Datei im Root-Verzeichnis der Domain:<br />
2 Place files in webroot directory (webroot)<br />
<br />
Let's Encrypt fragt dann, für welche Domain ein Zertifikat erstellt werden soll. Alle Domainnamen, die wir hier angeben, werden als Alternativ-Name im Zertifikat hinterlegt.<br />
<br />
Im nächsten Schritt wird dann der Pfad der Seite angegeben. Let's Encrypt wird im nächsten Schritt einen Pfad .well-known anlegen. Es ist also zu überlegen, diesen Pfad für alle Domains auf ein Verzeichnis umzuleiten und dieses als webroot anzugeben. Ansonsten klickt man sich einmal bis zum richtigen Verzeichnis durch. Pro Domain muss hier ein eigenes Verzeichnis angegeben werden. Wer nur ServerAlias-Domains verschlüsseln möchte, kann dann das Webroot-Verzeichnis der Hauptdomain angeben.<br />
<br />
Hat alles geklappt, erstellt Let's Encrypt ein Verzeichnis unterhalb von /etc/letsencrypt/live, in dem die verschiedenen 4 Zertifikate angelegt werden.<br />
<br />
Damit sind die Zertifikate erstellt.<br />
<br />
=== über Parameter ===<br />
Der Aufruf lässt sich auch direkt über einen parametersteuerten Befehl ausführen. Dafür führt man aus dem letsencrypt-Verzeichnis folgenden Befehl aus:<br />
sudo ./letsencrypt-auto --rsa-key-size 4096 certonly --webroot -w /var/www/vhosts/lukasthiel.de/htdocs/ -d lukasthiel.de -d www.lukasthiel.de<br />
<br />
Der Speicherort ist derselbe wie beim obigen Aufruf.<br />
<br />
<br />
=== über Datei ===<br />
Es ist ebenfalls möglich, die Zertifikate über eine Konfigurationsdatei erstellen zu lassen. Das hat zwei immense Vorteile gegenüber der beiden obigen Lösungen:<br />
# die Konfiguration ist über Shell manipulierbar, was beim automatischen Anlegen von VHost von Vorteil ist<br />
# bei Konfigurationsänderungen reicht die Anpassung der Datei, ohne dass der Parameterbefehl gespeichert sein muss<br />
<br />
Die Lösung hat Uwe Debacher in [[d:Überarbeitung_der_Apache-Konfiguration_für_Ubuntu_20.04#letsencrypt|einem Artikel]] vorgestellt. <br />
<br />
<syntaxhighlight lang="ini" line><br />
# Wir nutzen 4096 bit RSA key statt 2048<br />
rsa-key-size = 4096<br />
<br />
# allgemeine Angaben<br />
email = letsencrypt@meine-maildomain.de<br />
authenticator = webroot<br />
<br />
# Domains fuer die wir Zertifikate beantragen, die erste in<br />
# der liste legt den Hauptnamen fest. Alle Domains müssen beim<br />
# Aufruf erreichbar sein<br />
domains = lukasthiel.de, www.lukasthiel.de<br />
<br />
# Dies ist das Verzeichnis zur Domain, wo letsencrypt seinen Hash in<br />
# /.well-known/acme-challenge schreiben will. Der Pfad muss auf / enden<br />
# es muss in der vserver.conf stehen: Alias /.well-known /var/www/htdocs/.well-known<br />
webroot-path = /var/www/htdocs/<br />
</syntaxhighlight><br />
<br />
== Konfiguration Apache2 ==<br />
Für Apache2 ist folgende Konfiguration aufzunehmen (example.org muss natürlich durch den entsprechenden Hostnamen ersetzt werden):<br />
<VirtualHost *:443><br />
ServerAdmin webmaster@example.org<br />
ServerName example.org<br />
SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/example.org/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/example.org/chain.pem<br />
DocumentRoot /var/www/vhosts/example.org/htdocs<br />
<Directory /var/www/vhosts/example.org/htdocs/><br />
Options FollowSymLinks MultiViews<br />
AllowOverride All<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
SSLProtocol All -SSLv2 -SSLv3<br />
SSLHonorCipherOrder On<br />
SSLCompression off<br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA <br />
<br />
ErrorLog /var/log/apache2/example.org.error.log<br />
LogLevel warn<br />
CustomLog /var/log/apache2/example.org.access.log combined<br />
</VirtualHost><br />
<br />
Laut [https://thomas-leister.de/internet/anleitung-fuer-lets-encrypt-kostenlose-tls-zertifikate-fuer-alle/ Thomas Leister] muss ab Apache 2.4.8 auf die Chain-Datei verzichtet werden. Die entsprechenden Zeilen sehen dann wie folgt aus:<br />
<br />
SSLEngine on<br />
SSLCertificateFile /etc/letsencrypt/live/example.org/fullchain.pem # statt cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem<br />
<br />
Nach einem<br />
sudo service apache2 reload<br />
sollte die Konfiguration laufen und die Seite unter https://example.org erreichbar sein.<br />
<br />
== Konfiguration Postfix und Dovecot ==<br />
Die Zertifikate lassen sich nicht nur für die Absicherung von HTTPS-Verbindungen nutzen, sondern auch für die sichere Kommunikation mit dem Mailserver. Dafür werden die Zertifikate in den entsprechenden Konfigurationsdateien von Postfix und Dovecot eingebunden:<br />
<br />
/etc/postfix/main.cf<br />
<br />
# tls config<br />
smtpd_use_tls = yes<br />
smtp_tls_note_starttls_offer = yes<br />
smtpd_tls_key_file = /etc/letsencrypt/live/example.org/privkey.pem<br />
smtpd_tls_cert_file = /etc/letsencrypt/live/example.org/fullchain.pem<br />
smtpd_tls_loglevel = 1<br />
smtpd_tls_received_header = yes<br />
smtpd_tls_session_cache_timeout = 3600s<br />
smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3<br />
tls_random_source = dev:/dev/urandom<br />
tls_random_prng_update_period = 3600s<br />
<br />
und /etc/dovecot/dovecot.conf<br />
ssl = yes<br />
ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem<br />
ssl_key = </etc/letsencrypt/live/example.org/privkey.pem<br />
<br />
Nach einem Neustart sollten die neuen Zertifikate aktiviert sein:<br />
sudo service postfix restart<br />
sudo service dovecot restart<br />
<br />
=== Nachtrag vom 19.10.2017 ===<br />
Unsere Uni-Server erfordern eine verschlüsselte Verbindung zwischen Mailservern. Die o.g. Konfiguration nutzt zwar TLS für die Verbindung zwischen Client und Server, aber nicht für den Transport der Mails über den eigenen Server hinaus. Hierfür sind folgende Ergänzungen in der main.cf nötig<br />
smtpd_tls_security_level = may<br />
smtp_tls_security_level = may<br />
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku]<br />
<br />
== Cron-Job für die Aktualisierung ==<br />
Da die Zertifikate nach drei Monaten ablaufen, müssen die dann neu erstellt werden. Let's Encrypt bietet das vollautomatisch an. Es reicht ein Cronjob als root:<br />
0 3 * * * /root/letsencrypt/letsencrypt-auto renew > /dev/null 2>&1<br />
<br />
Let's Encrypt überspringt dabei Zertifikate, die noch gültig sind und aktualisiert nur diejenigen, die abgelaufen sind.<br />
<br />
== Links ==<br />
* https://letsencrypt.org/<br />
* https://thomas-leister.de/internet/anleitung-fuer-lets-encrypt-kostenlose-tls-zertifikate-fuer-alle/<br />
* https://kofler.info/lets-encrypt-zertifikate-fuer-web-und-mail-unter-ubuntu-16-04/<br />
* https://www.debacher.de/ublog/2016/06/letsencrypt/</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SmartHome_mit_HomeAssistant&diff=225SmartHome mit HomeAssistant2023-06-27T17:00:16Z<p>Lukas: </p>
<hr />
<div>Die neue Wohnung soll in einigen Teilen smart sein. Im ersten Schritt wollen wir hierbei die Lichtsteuerung über das Smartphone und ausgewählte Schalter vornehmen. Dabei kommen unterschiedliche Systeme (Fritz!, IKEA TRADFRI, Funksteckdosen) zum Einsatz. Ziel ist es also, ein System zu finden, das alle Systeme ansteuern kann.<br />
<br />
Mit einem Tipp von Sven Koch bin ich hierbei auf HomeAssistant gestoßen, das additiv an bestehende Systeme angeschlossen werden kann. Die folgenden Artikel sollen die Einrichtung und einige Anwendungsfälle dokumentieren. Dieser Artikel entsteht, während das System schon läuft. Die Grundeinrichtung erfolgte über die [https://www.home-assistant.io/installation/linux Installationsanleitung] via KVM in einer virtuellen Maschine auf meinem PVE.<br />
<br />
Wir hatten zunächst auch die Heizungssteuerung der Fritz!SmartHome-Komponenten über HomeAssistant vorgenommen. Da mir nicht ganz klar war, welches System nun welches inwieweit steuert, da die Fritz!Box selbst zu festgelegten Zeiten in verschiedene Temperatur-Szenen fährt, haben wir die Integration wieder zurückgebaut.<br />
<br />
== Temperatur auslesen mit Raspberry Pi und DHT22 ==<br />
Für die Feststellung der Luftfeuchtigkeit und Temperatur an verschiedensten Stellen kamen bisher die Fernbedienungen von Fritz! zum Einsatz. Da wir nach und nach komplett auf andere Systeme migrieren, ist das eine zeitnah abzulösende Option. Spannend ist nach Anleitung im [https://tyzbit.blog/my-experience-and-thoughts-on-home-assistant Tyzbit-Blog] eine Integration des [https://www.berrybase.de/dht22-digitaler-temperatur-und-luftfeuchtesensor DHT22] als Temperatur- und Wärmesensor auf Raspberry Pi per MQTT am HomeAssistant.<br />
<br />
=== Einbindung von Mosquitto in HomeAssistant ===<br />
Wir nutzen HomeAssistant als MQTT-Broker, sodass hier nicht zusätzlich ein Server für laufen muss. Dies ist über das Add-On "Mosquitto Broker" möglich, das über den Add-On Store direkt in Home Assistant installiert werden kann. Nach einem Klick auf "Install" wird das Add-On installiert und kann konfiguriert werden. Da wir die Verbindungen absichern wollen und hierfür nicht den Standard-Nutzer von HomeAssistant nutzen, muss ein dedizierter Account erstellt werden. Hierfür zunächst die erweiterte Ansicht im eigenen Nutzerprofil durch Klick auf den Namen > "Erweiterter Modus" aktivieren.<br />
<br />
Anschließend über Einstellungen > Personen > Tab: Benutzer einen Benutzer "mqttio" mit dazugehörigem Passwort erstellen. Der Nutzer benötigt keine weiteren Rechte. Das Passwort wird dann auf allen einliefernden Clients eingetragen. Prinzipiell kann für jeden Client ein eigener Account erstellt werden. Dies ist in größeren Installation dann empfehlenswert, wenn nicht sichergestellt werden kann, dass die Geräte nicht aus der eigenen Hand geraten und schlecht durch Fremdzugriff geschützt sind. Für den Heimgebrauch reicht mir ein Account aus.<br />
<br />
Die Konfiguration des Addons erfolgt dann über Einstellungen > Add-Ons > Mosquitto Broker > Tab: Konfiguration. Hier ist unter "Logins" zunächst der eben erstellte Account zu hinterlegen:<br />
- username: mqttio<br />
password: PASSWORD<br />
<br />
Weitere Einstellungen erfolgen in der Integration, die über Einstellungen > Geräte und Dienste schon möglich sein sollte. Hier zunächst über das Zahnrad neben "MQTT" in die Konfiguration wechseln und anschließend die Entität core-mosquitto konfigurieren -> "MQTT neu konfigurieren" -> den Dialog mit den Zugangsdaten weiterklicken. Da die automatische Konfiguration bei mir sowieso nicht korrekt funktioniert hat, habe ich sie hier deaktiviert.<br />
<br />
=== Installation des RPi ===<br />
Zunächst ist auf dem Raspberry Pi die Installation von [https://www.raspberrypi.com/software/ Raspberry Pi OS] nötig. Eine gute Anleitung dafür findet sich auf der Herstellerseite. Nach Abschluss der Installation und Erstkonfiguration ist über ein Terminal mittels<br />
sudo raspi-config<br />
unter "Interface Options" -> "SSH" der SSH-Server zu aktivieren, sodass ein Fernzugriff möglich ist.<br />
<br />
Die IP-Adresse des Pis kann entweder mittels "ip a" im Terminal oder über den netzinternen DHCP-Server ausgelesen werden.<br />
<br />
Anschließend muss der Pi ausgeschaltet und der Sensor verbunden werden. Ich nutze für den Anschluss die [https://de.pinout.xyz/ Pins] 4 für VCC, 6 für GRD und 12 (GPIO 18) für Data/OUT. Nach dem Verbinden kann der Pi wieder gestartet werden.<br />
<br />
=== Konfiguration des RPi ===<br />
Auf dem Pi soll ein MQTT-Publisher installiert werden, der in konfigurierbaren Abständen die Temperatur und den Luftfeuchtigkeitswert an HomeAssistant übermittelt. Dafür ist Python in der Version >=3.6 nötig. Hierfür steht dann über Pip der mqtt-io zur Verfügung.<br />
sudo pip3 install mqtt-io<br />
<br />
Diese Konfiguration installiert mqtt-io global, Tyzbit.blog stellt noch eine Lösung in einem Virtual Python Environment vor.<br />
<br />
Für den Betrieb von mqtt-io ist dann eine Konfiguration nötig, die unter /etc/mqtt-io.yaml Platz findet:<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
host: 192.168.178.10 # IP der HomeAssistant-Instanz<br />
topic_prefix: wz/raspberrypi # Zu veröffentlichendes Topic (dies sollte eine Struktur folgen, zB Raum / Gerät)<br />
status_payload_running: available<br />
status_payload_stopped: unavailable<br />
status_payload_dead: unavailable<br />
user: USER # oben angelegter Account für mqtt<br />
password: PASSWORD # Passwort des Accounts<br />
<br />
sensor_modules:<br />
- name: dht22_sensor<br />
module: dht22<br />
type: dht22<br />
pin: 18 # ggf. anzupassen, falls anderer GPIO-Pin verwendet (GPIO ID, nicht Index des Pins(!), siehe Link oben)<br />
<br />
sensor_inputs:<br />
- name: wz_temperature # Name, ggf. anzupassen<br />
module: dht22_sensor<br />
digits: 2 # Nachkommastellen<br />
interval: 5 # Interval der Veröffentlichung in Sekunden<br />
type: temperature<br />
- name: wz_humidity<br />
module: dht22_sensor<br />
digits: 2<br />
interval: 5<br />
type: humidity<br />
</syntaxhighlight><br />
<br />
Ein Test ist dann mittels<br />
python3.9 -m mqtt_io /etc/mqtt-io.yaml<br />
möglich. Hierbei sollte der Pi bereits Daten an HomeAssistant übertragen sowie die veröffentlichten Werte auf der Konsole ausgeben:<br />
Jun 27 18:39:25 HOSTNAME python3[1706]: 2023-06-27 18:39:25 mqtt_io.server [INFO] Read sensor 'wz_humidity' value of 43.9<br />
Jun 27 18:39:29 HOSTNAME python3[1706]: 2023-06-27 18:39:29 mqtt_io.server [INFO] Read sensor 'wz_temperature' value of 22.9<br />
<br />
Ist das erfolgreich, kann ein Systemd-Service definiert werden, der die MQTT-Instanz automatisch startet, sodass das System automatisch Werte an HomeAssistant übermittelt. Unter /etc/systemd/system/mqttio.service ist folgender Inhalt zu hinterlegen:<br />
<br />
<syntaxhighlight lang="bash" line><br />
[Unit]<br />
Description=MQTT-IO<br />
After=network.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
Restart=always<br />
Type=simple<br />
ExecStart=/usr/bin/python3 -m mqtt_io /etc/mqtt-io.yaml<br />
User=root<br />
Environment=<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
Anschließend muss systemd über die Änderungen informiert werden:<br />
sudo systemctl daemon-reload <br />
sudo systemctl enable mqttio<br />
sudo systemctl start mqttio<br />
<br />
Verläuft das erfolgreich, ist der Status des Services mittels <br />
sudo systemctl status mqttio<br />
abrufbar.<br />
<br />
Über journald kann zudem die aktuelle Übertragung angeschaut werden:<br />
journalctl -t python3 -f<br />
<br />
=== Integration in HomeAssistant ===<br />
Sobald der Pi Daten veröffentlicht, können diese auch in HomeAssistant abgefragt werden. Dazu muss zunächst der Sensor konfiguriert werden. Über den Add-On Store kann das Add-On "File Editor" installiert werden, das eine direkte Bearbeitung der Konfigurationsdateien im Browser möglich macht. Nach der Installation ist das Add-on links in der Sidebar aufrufbar. Über den Ordner kann die configuration.yaml aufgerufen werden. Hier sind folgende Zeilen einzufügen:<br />
<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
sensor:<br />
- name: "WZ Temperature"<br />
unique_id: 5ae12d30-c4a7-44b5-8868-785ba3ec527c # this can be anything unique<br />
state_topic: "wz/raspberrypi/sensor/wz_temperature" # ggf. anzupassen!<br />
unit_of_measurement: "°C"<br />
- name: "WZ Humidity"<br />
unique_id: 0134ce78-6374-49a0-9114-7b2af2fb7cac # muss eindeutig sein (zB über uuidgen)<br />
state_topic: "wz/raspberrypi/sensor/wz_humidity" # ggf. anzupassen!<br />
unit_of_measurement: "%"<br />
</syntaxhighlight><br />
<br />
Anschließend die Datei speichern und über das Zahnrad oben rechts HomeAssistant neu starten. Ist das erfolgt, kann der Sensor im Dashboard angezeigt und in Automationen genutzt werden.<br />
<br />
=== Weblinks ===<br />
https://tyzbit.blog/connecting-a-dht-22-sensor-to-home-assistant - Originale Dokumentation <br />
<br />
https://smarthomeyourself.de/wiki/homeassistant/home-assistant-fehler-deine-manuell-konfigurierten-mqtt-sensoren-erfordert-aufmerksamkeit/ Beschreibung der neuen Sensor-Konfiguration<br />
<br />
https://github.com/flyte/mqtt-io/wiki/MQTT-Configuration MQTT-Konfigurationsparameter</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SmartHome_mit_HomeAssistant&diff=224SmartHome mit HomeAssistant2023-06-27T16:59:29Z<p>Lukas: </p>
<hr />
<div>Die neue Wohnung soll in einigen Teilen smart sein. Im ersten Schritt wollen wir hierbei die Lichtsteuerung über das Smartphone und ausgewählte Schalter vornehmen. Dabei kommen unterschiedliche Systeme (Fritz!, IKEA TRADFRI, Funksteckdosen) zum Einsatz. Ziel ist es also, ein System zu finden, das alle Systeme ansteuern kann.<br />
<br />
Mit einem Tipp von Sven Koch bin ich hierbei auf HomeAssistant gestoßen, das additiv an bestehende Systeme angeschlossen werden kann. Die folgenden Artikel sollen die Einrichtung und einige Anwendungsfälle dokumentieren. Dieser Artikel entsteht, während das System schon läuft. Die Grundeinrichtung erfolgte über die [[https://www.home-assistant.io/installation/linux|Installationsanleitung]] via KVM in einer virtuellen Maschine auf meinem PVE.<br />
<br />
Wir hatten zunächst auch die Heizungssteuerung der Fritz!SmartHome-Komponenten über HomeAssistant vorgenommen. Da mir nicht ganz klar war, welches System nun welches inwieweit steuert, da die Fritz!Box selbst zu festgelegten Zeiten in verschiedene Temperatur-Szenen fährt, haben wir die Integration wieder zurückgebaut.<br />
<br />
== Temperatur auslesen mit Raspberry Pi und DHT22 ==<br />
Für die Feststellung der Luftfeuchtigkeit und Temperatur an verschiedensten Stellen kamen bisher die Fernbedienungen von Fritz! zum Einsatz. Da wir nach und nach komplett auf andere Systeme migrieren, ist das eine zeitnah abzulösende Option. Spannend ist nach Anleitung im [[https://tyzbit.blog/my-experience-and-thoughts-on-home-assistant|Tyzbit-Blog]] eine Integration des [[https://www.berrybase.de/dht22-digitaler-temperatur-und-luftfeuchtesensor|DHT22]] als Temperatur- und Wärmesensor auf Raspberry Pi per MQTT am HomeAssistant.<br />
<br />
=== Einbindung von Mosquitto in HomeAssistant ===<br />
Wir nutzen HomeAssistant als MQTT-Broker, sodass hier nicht zusätzlich ein Server für laufen muss. Dies ist über das Add-On "Mosquitto Broker" möglich, das über den Add-On Store direkt in Home Assistant installiert werden kann. Nach einem Klick auf "Install" wird das Add-On installiert und kann konfiguriert werden. Da wir die Verbindungen absichern wollen und hierfür nicht den Standard-Nutzer von HomeAssistant nutzen, muss ein dedizierter Account erstellt werden. Hierfür zunächst die erweiterte Ansicht im eigenen Nutzerprofil durch Klick auf den Namen > "Erweiterter Modus" aktivieren.<br />
<br />
Anschließend über Einstellungen > Personen > Tab: Benutzer einen Benutzer "mqttio" mit dazugehörigem Passwort erstellen. Der Nutzer benötigt keine weiteren Rechte. Das Passwort wird dann auf allen einliefernden Clients eingetragen. Prinzipiell kann für jeden Client ein eigener Account erstellt werden. Dies ist in größeren Installation dann empfehlenswert, wenn nicht sichergestellt werden kann, dass die Geräte nicht aus der eigenen Hand geraten und schlecht durch Fremdzugriff geschützt sind. Für den Heimgebrauch reicht mir ein Account aus.<br />
<br />
Die Konfiguration des Addons erfolgt dann über Einstellungen > Add-Ons > Mosquitto Broker > Tab: Konfiguration. Hier ist unter "Logins" zunächst der eben erstellte Account zu hinterlegen:<br />
- username: mqttio<br />
password: PASSWORD<br />
<br />
Weitere Einstellungen erfolgen in der Integration, die über Einstellungen > Geräte und Dienste schon möglich sein sollte. Hier zunächst über das Zahnrad neben "MQTT" in die Konfiguration wechseln und anschließend die Entität core-mosquitto konfigurieren -> "MQTT neu konfigurieren" -> den Dialog mit den Zugangsdaten weiterklicken. Da die automatische Konfiguration bei mir sowieso nicht korrekt funktioniert hat, habe ich sie hier deaktiviert.<br />
<br />
=== Installation des RPi ===<br />
Zunächst ist auf dem Raspberry Pi die Installation von [[https://www.raspberrypi.com/software/|Raspberry Pi OS]] nötig. Eine gute Anleitung dafür findet sich auf der Herstellerseite. Nach Abschluss der Installation und Erstkonfiguration ist über ein Terminal mittels<br />
sudo raspi-config<br />
unter "Interface Options" -> "SSH" der SSH-Server zu aktivieren, sodass ein Fernzugriff möglich ist.<br />
<br />
Die IP-Adresse des Pis kann entweder mittels "ip a" im Terminal oder über den netzinternen DHCP-Server ausgelesen werden.<br />
<br />
Anschließend muss der Pi ausgeschaltet und der Sensor verbunden werden. Ich nutze für den Anschluss die [[https://de.pinout.xyz/|Pins]] 4 für VCC, 6 für GRD und 12 (GPIO 18) für Data/OUT. Nach dem Verbinden kann der Pi wieder gestartet werden.<br />
<br />
=== Konfiguration des RPi ===<br />
Auf dem Pi soll ein MQTT-Publisher installiert werden, der in konfigurierbaren Abständen die Temperatur und den Luftfeuchtigkeitswert an HomeAssistant übermittelt. Dafür ist Python in der Version >=3.6 nötig. Hierfür steht dann über Pip der mqtt-io zur Verfügung.<br />
sudo pip3 install mqtt-io<br />
<br />
Diese Konfiguration installiert mqtt-io global, Tyzbit.blog stellt noch eine Lösung in einem Virtual Python Environment vor.<br />
<br />
Für den Betrieb von mqtt-io ist dann eine Konfiguration nötig, die unter /etc/mqtt-io.yaml Platz findet:<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
host: 192.168.178.10 # IP der HomeAssistant-Instanz<br />
topic_prefix: wz/raspberrypi # Zu veröffentlichendes Topic (dies sollte eine Struktur folgen, zB Raum / Gerät)<br />
status_payload_running: available<br />
status_payload_stopped: unavailable<br />
status_payload_dead: unavailable<br />
user: USER # oben angelegter Account für mqtt<br />
password: PASSWORD # Passwort des Accounts<br />
<br />
sensor_modules:<br />
- name: dht22_sensor<br />
module: dht22<br />
type: dht22<br />
pin: 18 # ggf. anzupassen, falls anderer GPIO-Pin verwendet (GPIO ID, nicht Index des Pins(!), siehe Link oben)<br />
<br />
sensor_inputs:<br />
- name: wz_temperature # Name, ggf. anzupassen<br />
module: dht22_sensor<br />
digits: 2 # Nachkommastellen<br />
interval: 5 # Interval der Veröffentlichung in Sekunden<br />
type: temperature<br />
- name: wz_humidity<br />
module: dht22_sensor<br />
digits: 2<br />
interval: 5<br />
type: humidity<br />
</syntaxhighlight><br />
<br />
Ein Test ist dann mittels<br />
python3.9 -m mqtt_io /etc/mqtt-io.yaml<br />
möglich. Hierbei sollte der Pi bereits Daten an HomeAssistant übertragen sowie die veröffentlichten Werte auf der Konsole ausgeben:<br />
Jun 27 18:39:25 HOSTNAME python3[1706]: 2023-06-27 18:39:25 mqtt_io.server [INFO] Read sensor 'wz_humidity' value of 43.9<br />
Jun 27 18:39:29 HOSTNAME python3[1706]: 2023-06-27 18:39:29 mqtt_io.server [INFO] Read sensor 'wz_temperature' value of 22.9<br />
<br />
Ist das erfolgreich, kann ein Systemd-Service definiert werden, der die MQTT-Instanz automatisch startet, sodass das System automatisch Werte an HomeAssistant übermittelt. Unter /etc/systemd/system/mqttio.service ist folgender Inhalt zu hinterlegen:<br />
<br />
<syntaxhighlight lang="bash" line><br />
[Unit]<br />
Description=MQTT-IO<br />
After=network.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
Restart=always<br />
Type=simple<br />
ExecStart=/usr/bin/python3 -m mqtt_io /etc/mqtt-io.yaml<br />
User=root<br />
Environment=<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
Anschließend muss systemd über die Änderungen informiert werden:<br />
sudo systemctl daemon-reload <br />
sudo systemctl enable mqttio<br />
sudo systemctl start mqttio<br />
<br />
Verläuft das erfolgreich, ist der Status des Services mittels <br />
sudo systemctl status mqttio<br />
abrufbar.<br />
<br />
Über journald kann zudem die aktuelle Übertragung angeschaut werden:<br />
journalctl -t python3 -f<br />
<br />
=== Integration in HomeAssistant ===<br />
Sobald der Pi Daten veröffentlicht, können diese auch in HomeAssistant abgefragt werden. Dazu muss zunächst der Sensor konfiguriert werden. Über den Add-On Store kann das Add-On "File Editor" installiert werden, das eine direkte Bearbeitung der Konfigurationsdateien im Browser möglich macht. Nach der Installation ist das Add-on links in der Sidebar aufrufbar. Über den Ordner kann die configuration.yaml aufgerufen werden. Hier sind folgende Zeilen einzufügen:<br />
<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
sensor:<br />
- name: "WZ Temperature"<br />
unique_id: 5ae12d30-c4a7-44b5-8868-785ba3ec527c # this can be anything unique<br />
state_topic: "wz/raspberrypi/sensor/wz_temperature" # ggf. anzupassen!<br />
unit_of_measurement: "°C"<br />
- name: "WZ Humidity"<br />
unique_id: 0134ce78-6374-49a0-9114-7b2af2fb7cac # muss eindeutig sein (zB über uuidgen)<br />
state_topic: "wz/raspberrypi/sensor/wz_humidity" # ggf. anzupassen!<br />
unit_of_measurement: "%"<br />
</syntaxhighlight><br />
<br />
Anschließend die Datei speichern und über das Zahnrad oben rechts HomeAssistant neu starten. Ist das erfolgt, kann der Sensor im Dashboard angezeigt und in Automationen genutzt werden.<br />
<br />
=== Weblinks ===<br />
https://tyzbit.blog/connecting-a-dht-22-sensor-to-home-assistant - Originale Dokumentation <br />
<br />
https://smarthomeyourself.de/wiki/homeassistant/home-assistant-fehler-deine-manuell-konfigurierten-mqtt-sensoren-erfordert-aufmerksamkeit/ Beschreibung der neuen Sensor-Konfiguration<br />
<br />
https://github.com/flyte/mqtt-io/wiki/MQTT-Configuration MQTT-Konfigurationsparameter</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=SmartHome_mit_HomeAssistant&diff=223SmartHome mit HomeAssistant2023-06-27T16:56:56Z<p>Lukas: Die Seite wurde neu angelegt: „Die neue Wohnung soll in einigen Teilen smart sein. Im ersten Schritt wollen wir hierbei die Lichtsteuerung über das Smartphone und ausgewählte Schalter vornehmen. Dabei kommen unterschiedliche Systeme (Fritz!, IKEA TRADFRI, Funksteckdosen) zum Einsatz. Ziel ist es also, ein System zu finden, das alle Systeme ansteuern kann. Mit einem Tipp von Sven Koch bin ich hierbei auf HomeAssistant gestoßen, das additiv an bestehende Systeme angeschlossen werden…“</p>
<hr />
<div>Die neue Wohnung soll in einigen Teilen smart sein. Im ersten Schritt wollen wir hierbei die Lichtsteuerung über das Smartphone und ausgewählte Schalter vornehmen. Dabei kommen unterschiedliche Systeme (Fritz!, IKEA TRADFRI, Funksteckdosen) zum Einsatz. Ziel ist es also, ein System zu finden, das alle Systeme ansteuern kann.<br />
<br />
Mit einem Tipp von Sven Koch bin ich hierbei auf HomeAssistant gestoßen, das additiv an bestehende Systeme angeschlossen werden kann. Die folgenden Artikel sollen die Einrichtung und einige Anwendungsfälle dokumentieren. Dieser Artikel entsteht, während das System schon läuft. Die Grundeinrichtung erfolgte über die [[https://www.home-assistant.io/installation/linux|Installationsanleitung]] via KVM in einer virtuellen Maschine auf meinem PVE.<br />
<br />
Wir hatten zunächst auch die Heizungssteuerung der Fritz!SmartHome-Komponenten über HomeAssistant vorgenommen. Da mir nicht ganz klar war, welches System nun welches inwieweit steuert, da die Fritz!Box selbst zu festgelegten Zeiten in verschiedene Temperatur-Szenen fährt, haben wir die Integration wieder zurückgebaut.<br />
<br />
== Temperatur auslesen mit Raspberry Pi und DHT22 ==<br />
Für die Feststellung der Luftfeuchtigkeit und Temperatur an verschiedensten Stellen kamen bisher die Fernbedienungen von Fritz! zum Einsatz. Da wir nach und nach komplett auf andere Systeme migrieren, ist das eine zeitnah abzulösende Option. Spannend ist nach Anleitung im [[https://tyzbit.blog/my-experience-and-thoughts-on-home-assistant|Tyzbit-Blog]] eine Integration des [[https://www.berrybase.de/dht22-digitaler-temperatur-und-luftfeuchtesensor|DHT22]] als Temperatur- und Wärmesensor auf Raspberry Pi per MQTT am HomeAssistant.<br />
<br />
=== Einbindung von Mosquitto in HomeAssistant ===<br />
Wir nutzen HomeAssistant als MQTT-Broker, sodass hier nicht zusätzlich ein Server für laufen muss. Dies ist über das Add-On "Mosquitto Broker" möglich, das über den Add-On Store direkt in Home Assistant installiert werden kann. Nach einem Klick auf "Install" wird das Add-On installiert und kann konfiguriert werden. Da wir die Verbindungen absichern wollen und hierfür nicht den Standard-Nutzer von HomeAssistant nutzen, muss ein dedizierter Account erstellt werden. Hierfür zunächst die erweiterte Ansicht im eigenen Nutzerprofil durch Klick auf den Namen > "Erweiterter Modus" aktivieren.<br />
<br />
Anschließend über Einstellungen > Personen > Tab: Benutzer einen Benutzer "mqttio" mit dazugehörigem Passwort erstellen. Der Nutzer benötigt keine weiteren Rechte. Das Passwort wird dann auf allen einliefernden Clients eingetragen. Prinzipiell kann für jeden Client ein eigener Account erstellt werden. Dies ist in größeren Installation dann empfehlenswert, wenn nicht sichergestellt werden kann, dass die Geräte nicht aus der eigenen Hand geraten und schlecht durch Fremdzugriff geschützt sind. Für den Heimgebrauch reicht mir ein Account aus.<br />
<br />
Die Konfiguration des Addons erfolgt dann über Einstellungen > Add-Ons > Mosquitto Broker > Tab: Konfiguration. Hier ist unter "Logins" zunächst der eben erstellte Account zu hinterlegen:<br />
- username: mqttio<br />
password: PASSWORD<br />
<br />
Weitere Einstellungen erfolgen in der Integration, die über Einstellungen > Geräte und Dienste schon möglich sein sollte. Hier zunächst über das Zahnrad neben "MQTT" in die Konfiguration wechseln und anschließend die Entität core-mosquitto konfigurieren -> "MQTT neu konfigurieren" -> den Dialog mit den Zugangsdaten weiterklicken. Da die automatische Konfiguration bei mir sowieso nicht korrekt funktioniert hat, habe ich sie hier deaktiviert.<br />
<br />
=== Installation des RPi ===<br />
Zunächst ist auf dem Raspberry Pi die Installation von [[https://www.raspberrypi.com/software/|Raspberry Pi OS]] nötig. Eine gute Anleitung dafür findet sich auf der Herstellerseite. Nach Abschluss der Installation und Erstkonfiguration ist über ein Terminal mittels<br />
sudo raspi-config<br />
unter "Interface Options" -> "SSH" der SSH-Server zu aktivieren, sodass ein Fernzugriff möglich ist.<br />
<br />
Die IP-Adresse des Pis kann entweder mittels "ip a" im Terminal oder über den netzinternen DHCP-Server ausgelesen werden.<br />
<br />
Anschließend muss der Pi ausgeschaltet und der Sensor verbunden werden. Ich nutze für den Anschluss die [[https://de.pinout.xyz/|Pins]] 4 für VCC, 6 für GRD und 12 (GPIO 18) für Data/OUT. Nach dem Verbinden kann der Pi wieder gestartet werden.<br />
<br />
=== Konfiguration des RPi ===<br />
Auf dem Pi soll ein MQTT-Publisher installiert werden, der in konfigurierbaren Abständen die Temperatur und den Luftfeuchtigkeitswert an HomeAssistant übermittelt. Dafür ist Python in der Version >=3.6 nötig. Hierfür steht dann über Pip der mqtt-io zur Verfügung.<br />
sudo pip3 install mqtt-io<br />
<br />
Diese Konfiguration installiert mqtt-io global, Tyzbit.blog stellt noch eine Lösung in einem Virtual Python Environment vor.<br />
<br />
Für den Betrieb von mqtt-io ist dann eine Konfiguration nötig, die unter /etc/mqtt-io.yaml Platz findet:<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
host: 192.168.178.10 # IP der HomeAssistant-Instanz<br />
topic_prefix: wz/raspberrypi # Zu veröffentlichendes Topic (dies sollte eine Struktur folgen, zB Raum / Gerät)<br />
status_payload_running: available<br />
status_payload_stopped: unavailable<br />
status_payload_dead: unavailable<br />
user: USER # oben angelegter Account für mqtt<br />
password: PASSWORD # Passwort des Accounts<br />
<br />
sensor_modules:<br />
- name: dht22_sensor<br />
module: dht22<br />
type: dht22<br />
pin: 18 # ggf. anzupassen, falls anderer GPIO-Pin verwendet (GPIO ID, nicht Index des Pins(!), siehe Link oben)<br />
<br />
sensor_inputs:<br />
- name: wz_temperature # Name, ggf. anzupassen<br />
module: dht22_sensor<br />
digits: 2 # Nachkommastellen<br />
interval: 5 # Interval der Veröffentlichung in Sekunden<br />
type: temperature<br />
- name: wz_humidity<br />
module: dht22_sensor<br />
digits: 2<br />
interval: 5<br />
type: humidity<br />
</syntaxhighlight><br />
<br />
Ein Test ist dann mittels<br />
python3.9 -m mqtt_io /etc/mqtt-io.yaml<br />
möglich. Hierbei sollte der Pi bereits Daten an HomeAssistant übertragen sowie die veröffentlichten Werte auf der Konsole ausgeben:<br />
Jun 27 18:39:25 HOSTNAME python3[1706]: 2023-06-27 18:39:25 mqtt_io.server [INFO] Read sensor 'wz_humidity' value of 43.9<br />
Jun 27 18:39:29 HOSTNAME python3[1706]: 2023-06-27 18:39:29 mqtt_io.server [INFO] Read sensor 'wz_temperature' value of 22.9<br />
<br />
Ist das erfolgreich, kann ein Systemd-Service definiert werden, der die MQTT-Instanz automatisch startet, sodass das System automatisch Werte an HomeAssistant übermittelt. Unter /etc/systemd/system/mqttio.service ist folgender Inhalt zu hinterlegen:<br />
<br />
<syntaxhighlight lang="bash" line><br />
[Unit]<br />
Description=MQTT-IO<br />
After=network.target<br />
Wants=network-online.target<br />
<br />
[Service]<br />
Restart=always<br />
Type=simple<br />
ExecStart=/usr/bin/python3 -m mqtt_io /etc/mqtt-io.yaml<br />
User=root<br />
Environment=<br />
<br />
[Install]<br />
WantedBy=multi-user.target<br />
</syntaxhighlight><br />
<br />
Anschließend muss systemd über die Änderungen informiert werden:<br />
sudo systemctl daemon-reload <br />
sudo systemctl enable mqttio<br />
sudo systemctl start mqttio<br />
<br />
Verläuft das erfolgreich, ist der Status des Services mittels <br />
sudo systemctl status mqttio<br />
abrufbar.<br />
<br />
Über journald kann zudem die aktuelle Übertragung angeschaut werden:<br />
journalctl -t python3 -f<br />
<br />
=== Integration in HomeAssistant ===<br />
Sobald der Pi Daten veröffentlicht, können diese auch in HomeAssistant abgefragt werden. Dazu muss zunächst der Sensor konfiguriert werden. Über den Add-On Store kann das Add-On "File Editor" installiert werden, das eine direkte Bearbeitung der Konfigurationsdateien im Browser möglich macht. Nach der Installation ist das Add-on links in der Sidebar aufrufbar. Über den Ordner kann die configuration.yaml aufgerufen werden. Hier sind folgende Zeilen einzufügen:<br />
<br />
<syntaxhighlight lang="yaml" line><br />
mqtt:<br />
sensor:<br />
- name: "WZ Temperature"<br />
unique_id: 5ae12d30-c4a7-44b5-8868-785ba3ec527c # this can be anything unique<br />
state_topic: "wz/raspberrypi/sensor/wz_temperature" # ggf. anzupassen!<br />
unit_of_measurement: "°C"<br />
- name: "WZ Humidity"<br />
unique_id: 0134ce78-6374-49a0-9114-7b2af2fb7cac # muss eindeutig sein (zB über uuidgen)<br />
state_topic: "wz/raspberrypi/sensor/wz_humidity" # ggf. anzupassen!<br />
unit_of_measurement: "%"<br />
</syntaxhighlight><br />
<br />
Anschließend die Datei speichern und über das Zahnrad oben rechts HomeAssistant neu starten. Ist das erfolgt, kann der Sensor im Dashboard angezeigt und in Automationen genutzt werden.<br />
<br />
== Weblinks ==<br />
https://tyzbit.blog/connecting-a-dht-22-sensor-to-home-assistant - Originale Dokumentation <br />
<br />
https://smarthomeyourself.de/wiki/homeassistant/home-assistant-fehler-deine-manuell-konfigurierten-mqtt-sensoren-erfordert-aufmerksamkeit/ Beschreibung der neuen Sensor-Konfiguration<br />
<br />
https://github.com/flyte/mqtt-io/wiki/MQTT-Configuration MQTT-Konfigurationsparameter</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=LT42-Wiki:Datenschutz&diff=222LT42-Wiki:Datenschutz2023-03-03T15:38:11Z<p>Lukas: </p>
<hr />
<div>Wir verarbeiten personenbezogene Daten, die beim Besuch unserer Website erhoben werden, unter Beachtung der geltenden datenschutzrechtlichen Bestimmungen, insbesondere der EU-Datenschutz-Grundverordnung (DS-GVO) und des Hamburgischen Datenschutzgesetzes (HmbDSG).<br />
<br />
Der Verantwortliche im Sinne der Datenschutz-Grundverordnung und anderer nationaler Datenschutzgesetze der Mitgliedsstaaten sowie sonstiger datenschutzrechtlicher Bestimmungen ist die:<br />
<br />
* Lukas Thiel<br />
* Arndtstraße 31<br />
* 17489 Greifswald<br />
* webmaster@lukasthiel.de<br />
<br />
Wer mich verschlüsselt kontaktieren möchte, kann das mit dem PGP-Key 0x97107d95e6bf054f tun.<br />
<br />
== Rechtsgrundlagen ==<br />
Soweit der Herausgeber für die Erhebung personenbezogener Daten eine Einwilligung (u. a. Kontaktormular, Newsletter) der betroffenen Person einholt, dient Art. 6 Abs. 1 lit. a DS-GVO als Rechtsgrundlage.<br />
Ist die Verarbeitung zur Wahrung eines berechtigten Interesses des Herausgebers erforderlich und überwiegen die Interessen, Grundrechte und Grundfreiheiten des Betroffenen das erstgenannte Interesse nicht, so dient Art. 6 Abs. 1 lit. f DS-GVO als Rechtsgrundlage für die Verarbeitung.<br />
<br />
== Protokollierung ==<br />
Bei jedem Zugriff auf unsere Website werden zum Zwecke der Datensicherheit und zu statistischen Zwecken folgende Daten in Protokolldateien gespeichert:<br />
* IP-Adresse,<br />
* Zeitpunkt des Zugriffs,<br />
* UserAgent (verwendeter Browser und genutztes Betriebssystem),<br />
* aufgerufene Seiten- bzw. Inhaltselemente und<br />
* sofern mitgeliefert Referrer URL (die zuvor besuchte Seite).<br />
<br />
In diesen Zwecken liegt auch unser berechtigtes Interesse an der Datenverarbeitung nach Art. 6 Abs. 1 lit. f DS-GVO. Die Daten werden maximal 7 Tage gespeichert, danach werden sie in anonymisierter Form weiter aufbewahrt. Eine Zusammenführung der IP-Adresse mit anderen Datenbeständen erfolgt nicht.<br />
<br />
== Cookies ==<br />
Beim Besuch unserer Website werden sogenannte „Session-Cookies“ auf Ihrem Rechner abgelegt und gespeichert. Cookies sind kleine Textdateien, die dazu dienen, dass Internetangebot nutzerfreundlicher, effektiver und sicherer zu machen. In diesen Zwecken liegt auch unser berechtigtes Interesse an der Datenverarbeitung nach Art. 6 Abs. 1 lit. f DS-GVO. Sie richten auf Ihrem Rechner keinen Schaden an und enthalten keine Viren. In der Regel werden Session-Cookies nach Ende Ihres Besuches automatisch gelöscht. Sie haben die Möglichkeit durch entsprechende Einstellungen in Ihrem Browser das Speichern von Cookies zu deaktivieren. Bitte beachten Sie, dass Sie durch die Deaktivierung gegebenenfalls nicht alle Funktionen unserer Website vollumfänglich nutzen können.<br />
<br />
== Kontaktformular ==<br />
Die von Ihnen per Kontaktformular übermittelten personenbezogenen Daten werden nur zum Zwecke der Beantwortung Ihrer Anfrage gespeichert und spätestens nach Abschluss des Verwaltungsvorganges gelöscht. Ihre Daten werden nicht an Dritte weitergegeben.<br />
<br />
== Newsletter ==<br />
Für den Newsletter-Versand ist die Angabe Ihrer E-Mail-Adresse erforderlich. Alle weiteren Angaben sind freiwillig. Ihre übermittelten Daten werden ausschließlich für den Versand unseres Newsletters verwendet und nicht an Dritte weitergegeben. Sie können sich jederzeit selbst vom Bezug des Newsletters abmelden. Ihre Daten werden dann umgehend aus unserem System gelöscht.<br />
<br />
== Ihre Rechte ==<br />
Sie haben das Recht eine erteilte Einwilligung in die Erhebung personenbezogener Daten jederzeit und ohne Angaben von Gründen mit Wirkung für die Zukunft schriftlich gegenüber Lukas Thiel, Arndtstraße 31, 17489 Greifswald oder per E-Mail an webmaster@lukasthiel.de zu widerrufen.<br />
<br />
Darüber hinaus haben Sie das Recht auf Antrag unentgeltliche Auskunft über Ihre gespeicherten personenbezogenen Daten, deren Herkunft, Empfänger, den Zweck und Dauer der Datenverarbeitung zu erhalten. Zusätzlich haben Sie unter bestimmten Voraussetzungen das Recht auf Berichtigung, auf Einschränkung der Verarbeitung (z. B. Sperrung), Löschung sowie das Recht auf Datenübertragbarkeit Ihrer Daten. Ferner haben Sie das Recht, bei der zuständigen Aufsichtsbehörde für den Datenschutz eine Beschwerde einzureichen, wenn Sie der Ansicht sind, dass die Verarbeitung Ihrer personenbezogenen Daten nicht rechtmäßig erfolgt.<br />
<br />
== Widerspruch Werbe-Mails ==<br />
Die Nutzung der im Rahmen des Impressums oder vergleichbarer Angaben veröffentlichten Kontaktdaten wie Postanschriften, Telefon- und Faxnummern sowie E-Mail-Adressen durch Dritte zur Übersendung von nicht ausdrücklich angeforderten Informationen ist nicht gestattet. Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails bei Verstößen gegen dieses Verbot sind ausdrücklich vorbehalten.<br />
<br />
== SSL-Verschlüsselung ==<br />
Diese Seite nutzt aus Gründen der Sicherheit und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel der Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http://“ auf „https://“ wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.<br />
Wenn die SSL Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=LT42-Wiki:Impressum&diff=221LT42-Wiki:Impressum2023-03-03T15:19:10Z<p>Lukas: </p>
<hr />
<div>__NOTOC__<br />
Herausgeber und redaktionell verantwortlich gemäß § 55 Abs. 5 RStV<br />
* Lukas Thiel<br />
* Arndtstraße 31<br />
* 17489 Greifswald<br />
* webmaster@lukasthiel.de<br />
<br />
Wer mich verschlüsselt kontaktieren möchte, kann das mit dem PGP-Key 0x97107d95e6bf054f tun. <br />
<br />
== Bildnachweis ==<br />
Fotos: Wikimedia Commons, Lukas Thiel<br />
<br />
== Geltungsbereich ==<br />
Dieses Impressum gilt für die Informationsangebote von Lukas Thiel im Internet, die durch dieses Impressum gekennzeichnet und die über die URL www.lukasthiel.de bzw. www.lt42.de erreichbar sind. Für alle anderen Seiten auf diesem WWW-Server liegt die redaktionelle Verantwortlichkeit bei den jeweiligen Stellen oder Personen, die die Seiten erstellt haben.<br />
<br />
== Inhalt des Onlineangebotes ==<br />
Der Herausgeber übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Herausgeber, die sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Herausgebers kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt.<br />
Alle Angebote sind freibleibend und unverbindlich. Der Herausgeber behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen.<br />
<br />
Hinweise und Korrekturen inhaltlicher und technischer Art senden Sie bitte an<br />
webmaster@lukasthiel.de.<br />
<br />
== Verweise und Links ==<br />
Bei direkten oder indirekten Verweisen auf fremde Webseiten („Hyperlinks“), die außerhalb des Verantwortungsbereiches des Herausgebers liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der*die Autor*in von den Inhalten Kenntnis hat und es ihm*ihr technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern.<br />
<br />
Der Herausgeber erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Herausgeber keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten/verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in von dem Herausgeber eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, Mailinglisten und in allen anderen Formen von Datenbanken, auf deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist.<br />
<br />
== Urheber- und Kennzeichenrecht ==<br />
Der Herausgeber ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Grafiken, Fotos, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Grafiken, Fotos, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Fotos, Tondokumente, Videosequenzen und Texte zurückzugreifen.<br />
Alle innerhalb unseres mit diesem Impressum gekennzeichneten Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind!<br />
<br />
Das Copyright für das Online-Angebot des Herausgeber, das mit dem oben genannten Impressum gekennzeichnet ist, bleibt allein bei dem Herausgeber. Eine Vervielfältigung oder Verwendung der auf diesen Seiten verwendeten Grafiken, Fotos, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist unter den unten angebenen Lizenzbestimmungen gestattet.<br />
<br />
== Rechtswirksamkeit dieses Haftungsausschlusses ==<br />
Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Updatechecker&diff=220Updatechecker2022-01-08T15:47:03Z<p>Lukas: Die Seite wurde neu angelegt: „Auf meinem Server laufen viele verschiedene Webanwendungen (TYPO3, Mediawiki, Wordpress). Während sich einige Systeme schon von allein aktuell halten, müssen…“</p>
<hr />
<div>Auf meinem Server laufen viele verschiedene Webanwendungen (TYPO3, Mediawiki, Wordpress). Während sich einige Systeme schon von allein aktuell halten, müssen viele Updates noch manuell ausgeführt werden. Um hier einen Überblick zu behalten, bietet es sich an, die Anwendungen automatisch gegen ihre Repos zu prüfen. Die folgenden Skripten machen das vollautomatisch.<br />
<br />
Dabei ist die Grundannahme, das alle installierten Anwendungen unterhalb von <code>/var/www/</code> liegen.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_20.04&diff=219Root-Server mit Ubuntu 20.042021-10-26T07:24:42Z<p>Lukas: </p>
<hr />
<div>Der letzte Artikel zu Ubuntu 18.04 ist schon einige Jahre her, nun erfolgt die Aktualisierung auf Ubuntu 20.04 auf einem neuen Server. Das Gerät hat folgende Eckdaten:<br />
<br />
* Intel Xeon E3-1246V3 (6999.62 Bogomips)<br />
* 2x HDD SATA 2,0 TB Enterprise<br />
* 4x RAM 8192 MB DDR3<br />
<br />
== Installation ==<br />
Ich bin immer noch begeistert von Hetzners [https://github.com/hetzneronline/installimage installimage], das eine Konfiguration der Installation im Rescuemodus möglich macht und die Rechner somit individuell konfigurieren lässt. Die Platten sind als RAID 1 gespiegelt, um eine Ausfallsicherheit zu erreichen.<br />
<br />
<br />
== Grundlegendes ==<br />
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Und ein paar Tools:<br />
apt-get install vim htop whois aptitude needrestart git unzip<br />
<br />
== Firewall ==<br />
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:<br />
apt-get install ufw<br />
<br />
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:<br />
ufw allow 22<br />
ufw allow OpenSSH<br />
<br />
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels<br />
ufw enable<br />
zeigt die Firewall auch automatisch Wirkung.<br />
<br />
Überprüfen lässt sich der Status mit<br />
ufw status<br />
bzw.<br />
ufw status numbered<br />
<br />
So können auch Regeln gelöscht werden:<br />
ufw delete 1<br />
<br />
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.<br />
<br />
Damit nicht die syslog mit Firewall-Messages überläuft, deaktivieren wir das Logging in /etc/rsyslog.d/20-ufw.conf, letzte Zeile:<br />
& stop<br />
<br />
== Webserver Apache2 ==<br />
Für die Webserverkonfiguration ist wichtig, dass der Rechner unter verschiedenen Namen angesprochen wird. Apache bietet hierfür VirtualHosts an, sodass der Webserver merkt, welche Seite er ausliefern soll. [[d:%C3%9Cberarbeitung_der_Apache-Konfiguration_f%C3%BCr_Ubuntu_20.04|Uwe Debacher]] hat seine Konfiguration grundlegend überarbeitet, daher nutze ich diese hier als Grundlage. Alle nötigen Schritte sind dort dokumentiert.<br />
<br />
Konfiguriert sind in diesem Schritt nun Apache, MariaDB als DBMS und phpMyAdmin für den Webzugriff auf die Datenbanken sowie Let's Encrypt für Zertifikate.<br />
Für jeden VHost steht nun ein Ordner unter /var/www/vhosts bereit, der alle Konfigurationsdateien beinhaltet.<br />
<br />
Dabei sind gegenüber der oben verlinkten Doku folgende Dinge anders:<br />
Ich nutze MariaDB als Datenbankserver, weshalb die Änderung in /etc/mysql/mariadb.conf.d/50-local.cnf (neu erstellt) erfolgen muss:<br />
[mysqld]<br />
innodb_file_per_table=1<br />
innodb_large_prefix=on<br />
innodb_file_format=barracuda<br />
innodb_flush_log_at_trx_commit = 2<br />
<br />
Der Nutzer root verbleibt in der Standardkonfiguration mit nicht erlaubter Anmeldung, daher wird ein zweiter User erstellt, dessen Name beliebig gewählt werden kann. Dies kann alternativ auch direkt in der root-Konsole passieren:<br />
root@server:#~ mysql<br />
MariaDB []> GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_20.04&diff=218Root-Server mit Ubuntu 20.042021-10-10T12:41:11Z<p>Lukas: Die Seite wurde neu angelegt: „Der letzte Artikel zu Ubuntu 18.04 ist schon einige Jahre her, nun erfolgt die Aktualisierung auf Ubuntu 20.04 auf einem neuen Server. Das Gerät hat folgende…“</p>
<hr />
<div>Der letzte Artikel zu Ubuntu 18.04 ist schon einige Jahre her, nun erfolgt die Aktualisierung auf Ubuntu 20.04 auf einem neuen Server. Das Gerät hat folgende Eckdaten:<br />
<br />
* Intel Xeon E3-1246V3 (6999.62 Bogomips)<br />
* 2x HDD SATA 2,0 TB Enterprise<br />
* 4x RAM 8192 MB DDR3<br />
<br />
== Installation ==<br />
Ich bin immer noch begeistert von Hetzners [https://github.com/hetzneronline/installimage installimage], das eine Konfiguration der Installation im Rescuemodus möglich macht und die Rechner somit individuell konfigurieren lässt. Die Platten sind als RAID 1 gespiegelt, um eine Ausfallsicherheit zu erreichen.<br />
<br />
<br />
== Grundlegendes ==<br />
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Und ein paar Tools:<br />
apt-get install vim htop whois aptitude needrestart git unzip<br />
<br />
== Firewall ==<br />
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:<br />
apt-get install ufw<br />
<br />
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:<br />
ufw allow 22<br />
ufw allow OpenSSH<br />
<br />
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels<br />
ufw enable<br />
zeigt die Firewall auch automatisch Wirkung.<br />
<br />
Überprüfen lässt sich der Status mit<br />
ufw status<br />
bzw.<br />
ufw status numbered<br />
<br />
So können auch Regeln gelöscht werden:<br />
ufw delete 1<br />
<br />
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.<br />
<br />
Damit nicht die syslog mit Firewall-Messages überläuft, deaktivieren wir das Logging in /etc/rsyslog.d/20-ufw.conf, letzte Zeile:<br />
& stop<br />
<br />
== Webserver Apache2 ==<br />
Für die Webserverkonfiguration ist wichtig, dass der Rechner unter verschiedenen Namen angesprochen wird. Apache bietet hierfür VirtualHosts an, sodass der Webserver merkt, welche Seite er ausliefern soll. [d:%C3%9Cberarbeitung_der_Apache-Konfiguration_f%C3%BCr_Ubuntu_20.04|Uwe Debacher] hat seine Konfiguration grundlegend überarbeitet, daher nutze ich diese hier als Grundlage. Alle nötigen Schritte sind dort dokumentiert.<br />
<br />
Konfiguriert sind in diesem Schritt nun Apache, MariaDB als DBMS und phpMyAdmin für den Webzugriff auf die Datenbanken sowie Let's Encrypt für Zertifikate.<br />
Für jeden VHost steht nun ein Ordner unter /var/www/vhosts bereit, der alle Konfigurationsdateien beinhaltet.<br />
<br />
Dabei sind gegenüber der oben verlinkten Doku folgende Dinge anders:<br />
Ich nutze MariaDB als Datenbankserver, weshalb die Änderung in /etc/mysql/mariadb.conf.d/50-local.cnf (neu erstellt) erfolgen muss:<br />
[mysqld]<br />
innodb_file_per_table=1<br />
innodb_large_prefix=on<br />
innodb_file_format=barracuda<br />
innodb_flush_log_at_trx_commit = 2<br />
<br />
Der Nutzer root verbleibt in der Standardkonfiguration mit nicht erlaubter Anmeldung, daher wird ein zweiter User erstellt, dessen Name beliebig gewählt werden kann. Dies kann alternativ auch direkt in der root-Konsole passieren:<br />
root@server:#~ mysql<br />
MariaDB []> GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=LT42-Wiki:Impressum&diff=217LT42-Wiki:Impressum2021-04-13T12:06:58Z<p>Lukas: </p>
<hr />
<div>__NOTOC__<br />
Herausgeber und redaktionell verantwortlich gemäß § 55 Abs. 5 RStV<br />
* Lukas Thiel<br />
* Franz-Mehring-Straße 45<br />
* 17489 Greifswald<br />
* webmaster@lukasthiel.de<br />
<br />
Wer mich verschlüsselt kontaktieren möchte, kann das mit dem PGP-Key 0x97107d95e6bf054f tun. <br />
<br />
== Bildnachweis ==<br />
Fotos: Wikimedia Commons, Lukas Thiel<br />
<br />
== Geltungsbereich ==<br />
Dieses Impressum gilt für die Informationsangebote von Lukas Thiel im Internet, die durch dieses Impressum gekennzeichnet und die über die URL www.lukasthiel.de bzw. www.lt42.de erreichbar sind. Für alle anderen Seiten auf diesem WWW-Server liegt die redaktionelle Verantwortlichkeit bei den jeweiligen Stellen oder Personen, die die Seiten erstellt haben.<br />
<br />
== Inhalt des Onlineangebotes ==<br />
Der Herausgeber übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Herausgeber, die sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Herausgebers kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt.<br />
Alle Angebote sind freibleibend und unverbindlich. Der Herausgeber behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen.<br />
<br />
Hinweise und Korrekturen inhaltlicher und technischer Art senden Sie bitte an<br />
webmaster@lukasthiel.de.<br />
<br />
== Verweise und Links ==<br />
Bei direkten oder indirekten Verweisen auf fremde Webseiten („Hyperlinks“), die außerhalb des Verantwortungsbereiches des Herausgebers liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der*die Autor*in von den Inhalten Kenntnis hat und es ihm*ihr technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern.<br />
<br />
Der Herausgeber erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Herausgeber keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten/verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in von dem Herausgeber eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, Mailinglisten und in allen anderen Formen von Datenbanken, auf deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist.<br />
<br />
== Urheber- und Kennzeichenrecht ==<br />
Der Herausgeber ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Grafiken, Fotos, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Grafiken, Fotos, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Fotos, Tondokumente, Videosequenzen und Texte zurückzugreifen.<br />
Alle innerhalb unseres mit diesem Impressum gekennzeichneten Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind!<br />
<br />
Das Copyright für das Online-Angebot des Herausgeber, das mit dem oben genannten Impressum gekennzeichnet ist, bleibt allein bei dem Herausgeber. Eine Vervielfältigung oder Verwendung der auf diesen Seiten verwendeten Grafiken, Fotos, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist unter den unten angebenen Lizenzbestimmungen gestattet.<br />
<br />
== Rechtswirksamkeit dieses Haftungsausschlusses ==<br />
Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=LT42-Wiki:Datenschutz&diff=216LT42-Wiki:Datenschutz2021-04-13T12:06:36Z<p>Lukas: </p>
<hr />
<div>Wir verarbeiten personenbezogene Daten, die beim Besuch unserer Website erhoben werden, unter Beachtung der geltenden datenschutzrechtlichen Bestimmungen, insbesondere der EU-Datenschutz-Grundverordnung (DS-GVO) und des Hamburgischen Datenschutzgesetzes (HmbDSG).<br />
<br />
Der Verantwortliche im Sinne der Datenschutz-Grundverordnung und anderer nationaler Datenschutzgesetze der Mitgliedsstaaten sowie sonstiger datenschutzrechtlicher Bestimmungen ist die:<br />
<br />
* Lukas Thiel<br />
* Franz-Mehring-Straße 45<br />
* 17489 Greifswald<br />
* webmaster@lukasthiel.de<br />
<br />
Wer mich verschlüsselt kontaktieren möchte, kann das mit dem PGP-Key 0x97107d95e6bf054f tun.<br />
<br />
== Rechtsgrundlagen ==<br />
Soweit der Herausgeber für die Erhebung personenbezogener Daten eine Einwilligung (u. a. Kontaktormular, Newsletter) der betroffenen Person einholt, dient Art. 6 Abs. 1 lit. a DS-GVO als Rechtsgrundlage.<br />
Ist die Verarbeitung zur Wahrung eines berechtigten Interesses des Herausgebers erforderlich und überwiegen die Interessen, Grundrechte und Grundfreiheiten des Betroffenen das erstgenannte Interesse nicht, so dient Art. 6 Abs. 1 lit. f DS-GVO als Rechtsgrundlage für die Verarbeitung.<br />
<br />
== Protokollierung ==<br />
Bei jedem Zugriff auf unsere Website werden zum Zwecke der Datensicherheit und zu statistischen Zwecken folgende Daten in Protokolldateien gespeichert:<br />
* IP-Adresse,<br />
* Zeitpunkt des Zugriffs,<br />
* UserAgent (verwendeter Browser und genutztes Betriebssystem),<br />
* aufgerufene Seiten- bzw. Inhaltselemente und<br />
* sofern mitgeliefert Referrer URL (die zuvor besuchte Seite).<br />
<br />
In diesen Zwecken liegt auch unser berechtigtes Interesse an der Datenverarbeitung nach Art. 6 Abs. 1 lit. f DS-GVO. Die Daten werden maximal 7 Tage gespeichert, danach werden sie in anonymisierter Form weiter aufbewahrt. Eine Zusammenführung der IP-Adresse mit anderen Datenbeständen erfolgt nicht.<br />
<br />
== Cookies ==<br />
Beim Besuch unserer Website werden sogenannte „Session-Cookies“ auf Ihrem Rechner abgelegt und gespeichert. Cookies sind kleine Textdateien, die dazu dienen, dass Internetangebot nutzerfreundlicher, effektiver und sicherer zu machen. In diesen Zwecken liegt auch unser berechtigtes Interesse an der Datenverarbeitung nach Art. 6 Abs. 1 lit. f DS-GVO. Sie richten auf Ihrem Rechner keinen Schaden an und enthalten keine Viren. In der Regel werden Session-Cookies nach Ende Ihres Besuches automatisch gelöscht. Sie haben die Möglichkeit durch entsprechende Einstellungen in Ihrem Browser das Speichern von Cookies zu deaktivieren. Bitte beachten Sie, dass Sie durch die Deaktivierung gegebenenfalls nicht alle Funktionen unserer Website vollumfänglich nutzen können.<br />
<br />
== Kontaktformular ==<br />
Die von Ihnen per Kontaktformular übermittelten personenbezogenen Daten werden nur zum Zwecke der Beantwortung Ihrer Anfrage gespeichert und spätestens nach Abschluss des Verwaltungsvorganges gelöscht. Ihre Daten werden nicht an Dritte weitergegeben.<br />
<br />
== Newsletter ==<br />
Für den Newsletter-Versand ist die Angabe Ihrer E-Mail-Adresse erforderlich. Alle weiteren Angaben sind freiwillig. Ihre übermittelten Daten werden ausschließlich für den Versand unseres Newsletters verwendet und nicht an Dritte weitergegeben. Sie können sich jederzeit selbst vom Bezug des Newsletters abmelden. Ihre Daten werden dann umgehend aus unserem System gelöscht.<br />
<br />
== Ihre Rechte ==<br />
Sie haben das Recht eine erteilte Einwilligung in die Erhebung personenbezogener Daten jederzeit und ohne Angaben von Gründen mit Wirkung für die Zukunft schriftlich gegenüber Lukas Thiel, Süderquerweg 110, 21037 Hamburg oder per E-Mail an webmaster@lukasthiel.de zu widerrufen.<br />
<br />
Darüber hinaus haben Sie das Recht auf Antrag unentgeltliche Auskunft über Ihre gespeicherten personenbezogenen Daten, deren Herkunft, Empfänger, den Zweck und Dauer der Datenverarbeitung zu erhalten. Zusätzlich haben Sie unter bestimmten Voraussetzungen das Recht auf Berichtigung, auf Einschränkung der Verarbeitung (z. B. Sperrung), Löschung sowie das Recht auf Datenübertragbarkeit Ihrer Daten. Ferner haben Sie das Recht, bei der zuständigen Aufsichtsbehörde für den Datenschutz eine Beschwerde einzureichen, wenn Sie der Ansicht sind, dass die Verarbeitung Ihrer personenbezogenen Daten nicht rechtmäßig erfolgt.<br />
<br />
== Widerspruch Werbe-Mails ==<br />
Die Nutzung der im Rahmen des Impressums oder vergleichbarer Angaben veröffentlichten Kontaktdaten wie Postanschriften, Telefon- und Faxnummern sowie E-Mail-Adressen durch Dritte zur Übersendung von nicht ausdrücklich angeforderten Informationen ist nicht gestattet. Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails bei Verstößen gegen dieses Verbot sind ausdrücklich vorbehalten.<br />
<br />
== SSL-Verschlüsselung ==<br />
Diese Seite nutzt aus Gründen der Sicherheit und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel der Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von „http://“ auf „https://“ wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.<br />
Wenn die SSL Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Eigenes_DynDNS_mit_PowerDNS&diff=215Eigenes DynDNS mit PowerDNS2021-03-13T13:49:43Z<p>Lukas: Github-Link</p>
<hr />
<div>Vor einiger Zeit hat dyndns.org seinen freien dynamischen DNS-Dienst eingestellt und die Kunden so gezwungen, entweder in einen Premium-Account zu migrieren oder sich anderwaltig umzuschauen. Ich habe mich dann für no-ip.org entschieden, mit dessen Service ich bis heute sehr zufrieden. Lediglich einmal kam es zu DNS-Problemen, die dann aber auch schnell gelöst waren.<br />
Da ich öfter DynDNS-Dienste einsetze, lege ich für alle Kunden verschiedene Konten an, was dann natürlich gerne mal zu Passwortverwechslungen führt.<br />
<br />
DynDNS kann man aber auch selber machen. Der Trick ist in der c't 24/2013 und auch bei [[d:Mein_eigenes_DynDNS|Uwe Debacher]] beschrieben. Der besteht darin, dass nicht BIND als DNS-Server eingesetzt wird, sondern [https://www.powerdns.com/ PowerDNS], der seine Domain-Daten in einer Datenbank speichert. Dadurch sind sie durch PHP manipulierbar und können so ohne wenig Aufwand von außen aktualisiert werden.<br />
<br />
== Installation von PDNS ==<br />
Wir erstellen danach eine Datenbank mit einem Benutzer. Und fügen folgendes Datenbank-Schema ein:<br />
<br />
CREATE TABLE IF NOT EXISTS 'domains' (<br />
'id' int(11) NOT NULL,<br />
'name' varchar(255) NOT NULL,<br />
'master' varchar(128) DEFAULT NULL,<br />
'last_check' int(11) DEFAULT NULL,<br />
'type' varchar(6) NOT NULL,<br />
'notified_serial' int(11) DEFAULT NULL,<br />
'account' varchar(40) DEFAULT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'hostnames' (<br />
'hostname' varchar(255) NOT NULL,<br />
'userid' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'records' (<br />
'id' int(11) NOT NULL,<br />
'domain_id' int(11) DEFAULT NULL,<br />
'name' varchar(255) DEFAULT NULL,<br />
'type' varchar(10) DEFAULT NULL,<br />
'content' varchar(255) DEFAULT NULL,<br />
'ttl' int(11) DEFAULT NULL,<br />
'prio' int(11) DEFAULT NULL,<br />
'change_date' int(11) DEFAULT NULL,<br />
'ordername' varchar(255) DEFAULT NULL,<br />
'auth' tinyint(1) DEFAULT NULL<br />
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'users' (<br />
'id' varchar(255) NOT NULL,<br />
'password' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
ALTER TABLE 'domains'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'name_index' ('name');<br />
<br />
ALTER TABLE 'hostnames'<br />
ADD PRIMARY KEY ('hostname'), ADD UNIQUE KEY 'hostname_index' ('hostname');<br />
<br />
ALTER TABLE 'records'<br />
ADD PRIMARY KEY ('id'), ADD KEY 'rec_name_index' ('name'), ADD KEY 'nametype_index' ('name','type'), ADD KEY 'domain_id' ('domain_id'), ADD KEY 'orderindex' ('ordername'), ADD KEY 'id' ('id');<br />
<br />
ALTER TABLE 'users'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'user_index' ('id');<br />
<br />
ALTER TABLE 'records'<br />
MODIFY 'id' int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=9;<br />
<br />
Unter Ubuntu sind folgende Pakete zu installieren, falls MySQL als Backend benutzt werden soll:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql<br />
<br />
Hier werden wir beim Installieren nach MySQL-Zugangsdaten gefragt, diese tragen wir ein und lassen die Installation auch gleich die Datenbank-Struktur anlegen.<br />
<br />
Eigentlich steuert man PowerDNS über die Administrationsoberfläche [http://www.poweradmin.org/ PowerAdmin]. Das ist dank PHPMyAdmin aber eigentlich nicht nötig.<br />
<br />
PowerDNS läuft standardmäßig noch nicht.<br />
Wir passen die Datei /etc/powerdns/pdns.conf wie folgt an (Die Zeilen können einfach auskommentiert und neu eingefügt werden):<br />
allow-axfr-ips=<oeffentliche-ipv4-des-servers> 127.0.0.1 173.244.206.26 88.198.106.11<br />
allow-recursion=127.0.0.1<br />
daemon=yes<br />
master=yes<br />
<br />
Nun lässt PowerDNS den Zonen-Download vom lokalen Server und den Servern von BuddyNS zu (siehe unten), startet als Daemon und sieht sich als Zonen-Master (standardmäßig nämlich nicht).<br />
<br />
Nun startet PowerDNS aber noch nicht richtig. Dieser Fehler hat mich einige Zeit gekostet: Unter /etc/powerdns/pdns.d/ müssen zwei Konfiguration-Dateien angepasst werden:<br />
In /etc/powerdns/pdns.d/pdns.simplebind.conf kommentieren wir beide Zeilen aus:<br />
#launch=bind<br />
#bind-config=/etc/powerdns/bindbackend.conf<br />
und in /etc/powerdns/pdns.d/pdns.local.gmysql.conf kontrollieren wir die Zugangsdaten zu MySQL und ändern folgende Zeile von yes auf no:<br />
gmysql-dnssec=no<br />
Damit sollte PowerDNS via<br />
service pdns restart<br />
starten.<br />
<br />
== Eintragen der Zonen ==<br />
Damit sich unser Server auch als Master für die Domain sieht, müssen wir eine Master Zone anlegen. Das geht über PowerAdmin nach einer Anmeldung über den Link "Master Zone hinzufügen". Der Name der Zone ist der Name der Domain. Unter "Zonen auflisten" können wir dann die Zone mit dem kleinen Stift neben dem Namen bearbeiten. Hier sind vor allem erstmal drei Einträge der Marke "NS" wichtig:<br />
<br />
Diese Einträge sagen den weltweiten DNS-Servern, wer die DNS-Server für unsere Domain sind. Danach müssen wir natürlich die Standard-Records (A für Adressauflösung und MX für Mail) eintragen.<br />
<br />
== Zweiter Nameserver ==<br />
Für die Ausfallsicherheit sind Domains immer zwei unterschiedliche Nameserver zuzuweisen. Idealerweise sind beide auch nicht im gleichen Netz. Für alle, die keine zwei getrennten 24 Stunden erreichbaren Server betreiben, bietet sich der Service von http://www.buddyns.com an. Nach dem Registrieren mit Domainname, IP-Adresse des primären DNS-Servers (IP des eigenen Servers) und E-Mail-Adresse bekommt man ein Passwort zugeschickt, mit dem man Zugriff auf das Bullyboard hat:<br />
<br />
Hier ist besonders der Reiter "Zones" interessant.<br />
<br />
Bis alles korrekt eingestellt ist, ist der obige Balken noch rot. Haben wir noch keine Einstellungen beim Registrar vorgenommen, sollten die Felder "Authority declares BuddyNS" und "Registry declares BuddyNS" nicht auf OK stehen. Sollte hier aber alles andere stimmen, können wir die DNS-Einstellungen unter http://www.denic.de/hintergrund/nast.html testen. Dazu geben wir unseren Domainnamen und die beiden DNS-Server an. BuddyNS bittet darum, die regionalen Nameserver zu benutzen. Für Europa sind das e.ns.buddyns.com und c.ns.buddyns.com<br />
<br />
Gibt die Denic grünes Licht, können wir die Nameserver beim Registrar ändern (meist per Domain-Update o.ä. auslösbar).<br />
<br />
== Konfiguration Fritz!Box ==<br />
Die Grundidee ist einfach: Jede Nacht bekommt die Fritz!Box durch den Provider nach der Zwangstrennung eine neue IP-Adresse zugewiesen. Nach diesem Update soll die Fritz!Box die IP-Adresse des DynDNS neu setzen. Sie kann dann auf ein PHP-Script zugreifen, das die Daten in der Datenbank aktualisiert. Das sollte natürlich mit einem Passwort geschützt sein, damit kein Fremder die Domain kapern kann.<br />
<br />
Ich benutze momentan eine abgewandelte Version des Scriptes aus der c't und benutze mysqli statt PDO als Datenbank-Anbindung. Sehr wichtig ist es, dass die Seriennummer des DNS-Records im SOA-Record nach einer Änderung hochgesetzt wird. Der Autor arbeitet mit preg_match, um die entsprechende Stelle im Record zu finden und hochzusetzen.<br />
<br />
In der Fritz!Box kann man mit Platzhaltern arbeiten, um das PHP-Script aufzurufen. Mehr dazu findet sich in der AVM-Hilfe.<br />
<br />
Hinweise zur Konfiguration der Fritz!Box finden sich auch hier: http://www.heise.de/ct/inhalt/2013/24/196/<br />
<br />
<br />
== Neue Version 2020 ==<br />
Wegen eines Serverumzugs musste auch das DynDNS umziehen. Dabei bin ich der zwischenzeitlich umgestellten Version auf eine Subdomain gefolgt. Es reicht dann aus, einen Nameserver-Eintrag für eine Subdomain anzulegen, ohne die Arbeit bei der Registrierungsstelle. Wir benötigen zwei Einträge im DNS der zu verwendenden Domain:<br />
<br />
dns.thiel2s.de A w.x.y.z.<br />
ddns.thiel2s.de NS dns.thiel2s.de<br />
<br />
Nun können wir *.ddns.thiel2s.de als DynDNS-Adressen nutzen. Dafür nutzen wir weiterhin den PDNS-Server mit MariaDB-Backend. Als Grundlage kommt ein Debian 10 zum Einsatz, auf dem folgende Pakete installiert werden:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql apache2 php mariadb-server<br />
<br />
Als Frontend zur grundlegenden Administration des PDNS kommt der PDNSManager zum Einsatz. Die Doku inkl. Konfiguration des PDNS ist [https://pdnsmanager.org/quickstart/ hier] einzusehen.<br />
Nachdem der Manager installiert wurde, stehen auch die entsprechenden Tabellen zur Verfügung. Nun können wir im PDNS die Datenbankanbindung einstellen. Dafür in der Datei <code>/etc/powerdns/pdns.d/pdns.local.gmysql.conf/</code> muss dafür folgendes eingetragen werden:<br />
<br />
launch=gmysql<br />
gmysql-host=localhost<br />
gmysql-port=3306<br />
gmysql-dbname=pdns<br />
gmysql-user=powerdnsuser<br />
gmysql-password=assword<br />
gmysql-dnssec=no<br />
<br />
Für das Update über die Fritz!Box ist nun noch ein Script erforderlich, das die Aktualisierung der Records bei Änderung der IP-Adresse vornimmt. Ein Script, das dazu genutzt werden kann, steht [https://github.com/LT42/ddns-updater hier] zur Verfügung. Wichtig ist, auch die Serial Number des SOA-Records zu aktualisieren. Momentan ist das im Skript fehleranfällig, da ein massiver Aufruf der Skripte die Serial Number außerhalb des darstellbaren Bereichs erhöht.<br />
<br />
Ein Aufruf erfolgt dann z.B. über<br />
https://dns.thiel2s.de/poweradmin/updatescript.php?hostname=<domain>&passwort=<pass></div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Eigenes_DynDNS_mit_PowerDNS&diff=214Eigenes DynDNS mit PowerDNS2021-03-13T11:28:09Z<p>Lukas: /* Neue Version 2020 */</p>
<hr />
<div>Vor einiger Zeit hat dyndns.org seinen freien dynamischen DNS-Dienst eingestellt und die Kunden so gezwungen, entweder in einen Premium-Account zu migrieren oder sich anderwaltig umzuschauen. Ich habe mich dann für no-ip.org entschieden, mit dessen Service ich bis heute sehr zufrieden. Lediglich einmal kam es zu DNS-Problemen, die dann aber auch schnell gelöst waren.<br />
Da ich öfter DynDNS-Dienste einsetze, lege ich für alle Kunden verschiedene Konten an, was dann natürlich gerne mal zu Passwortverwechslungen führt.<br />
<br />
DynDNS kann man aber auch selber machen. Der Trick ist in der c't 24/2013 und auch bei [[d:Mein_eigenes_DynDNS|Uwe Debacher]] beschrieben. Der besteht darin, dass nicht BIND als DNS-Server eingesetzt wird, sondern [https://www.powerdns.com/ PowerDNS], der seine Domain-Daten in einer Datenbank speichert. Dadurch sind sie durch PHP manipulierbar und können so ohne wenig Aufwand von außen aktualisiert werden.<br />
<br />
== Installation von PDNS ==<br />
Wir erstellen danach eine Datenbank mit einem Benutzer. Und fügen folgendes Datenbank-Schema ein:<br />
<br />
CREATE TABLE IF NOT EXISTS 'domains' (<br />
'id' int(11) NOT NULL,<br />
'name' varchar(255) NOT NULL,<br />
'master' varchar(128) DEFAULT NULL,<br />
'last_check' int(11) DEFAULT NULL,<br />
'type' varchar(6) NOT NULL,<br />
'notified_serial' int(11) DEFAULT NULL,<br />
'account' varchar(40) DEFAULT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'hostnames' (<br />
'hostname' varchar(255) NOT NULL,<br />
'userid' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'records' (<br />
'id' int(11) NOT NULL,<br />
'domain_id' int(11) DEFAULT NULL,<br />
'name' varchar(255) DEFAULT NULL,<br />
'type' varchar(10) DEFAULT NULL,<br />
'content' varchar(255) DEFAULT NULL,<br />
'ttl' int(11) DEFAULT NULL,<br />
'prio' int(11) DEFAULT NULL,<br />
'change_date' int(11) DEFAULT NULL,<br />
'ordername' varchar(255) DEFAULT NULL,<br />
'auth' tinyint(1) DEFAULT NULL<br />
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'users' (<br />
'id' varchar(255) NOT NULL,<br />
'password' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
ALTER TABLE 'domains'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'name_index' ('name');<br />
<br />
ALTER TABLE 'hostnames'<br />
ADD PRIMARY KEY ('hostname'), ADD UNIQUE KEY 'hostname_index' ('hostname');<br />
<br />
ALTER TABLE 'records'<br />
ADD PRIMARY KEY ('id'), ADD KEY 'rec_name_index' ('name'), ADD KEY 'nametype_index' ('name','type'), ADD KEY 'domain_id' ('domain_id'), ADD KEY 'orderindex' ('ordername'), ADD KEY 'id' ('id');<br />
<br />
ALTER TABLE 'users'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'user_index' ('id');<br />
<br />
ALTER TABLE 'records'<br />
MODIFY 'id' int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=9;<br />
<br />
Unter Ubuntu sind folgende Pakete zu installieren, falls MySQL als Backend benutzt werden soll:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql<br />
<br />
Hier werden wir beim Installieren nach MySQL-Zugangsdaten gefragt, diese tragen wir ein und lassen die Installation auch gleich die Datenbank-Struktur anlegen.<br />
<br />
Eigentlich steuert man PowerDNS über die Administrationsoberfläche [http://www.poweradmin.org/ PowerAdmin]. Das ist dank PHPMyAdmin aber eigentlich nicht nötig.<br />
<br />
PowerDNS läuft standardmäßig noch nicht.<br />
Wir passen die Datei /etc/powerdns/pdns.conf wie folgt an (Die Zeilen können einfach auskommentiert und neu eingefügt werden):<br />
allow-axfr-ips=<oeffentliche-ipv4-des-servers> 127.0.0.1 173.244.206.26 88.198.106.11<br />
allow-recursion=127.0.0.1<br />
daemon=yes<br />
master=yes<br />
<br />
Nun lässt PowerDNS den Zonen-Download vom lokalen Server und den Servern von BuddyNS zu (siehe unten), startet als Daemon und sieht sich als Zonen-Master (standardmäßig nämlich nicht).<br />
<br />
Nun startet PowerDNS aber noch nicht richtig. Dieser Fehler hat mich einige Zeit gekostet: Unter /etc/powerdns/pdns.d/ müssen zwei Konfiguration-Dateien angepasst werden:<br />
In /etc/powerdns/pdns.d/pdns.simplebind.conf kommentieren wir beide Zeilen aus:<br />
#launch=bind<br />
#bind-config=/etc/powerdns/bindbackend.conf<br />
und in /etc/powerdns/pdns.d/pdns.local.gmysql.conf kontrollieren wir die Zugangsdaten zu MySQL und ändern folgende Zeile von yes auf no:<br />
gmysql-dnssec=no<br />
Damit sollte PowerDNS via<br />
service pdns restart<br />
starten.<br />
<br />
== Eintragen der Zonen ==<br />
Damit sich unser Server auch als Master für die Domain sieht, müssen wir eine Master Zone anlegen. Das geht über PowerAdmin nach einer Anmeldung über den Link "Master Zone hinzufügen". Der Name der Zone ist der Name der Domain. Unter "Zonen auflisten" können wir dann die Zone mit dem kleinen Stift neben dem Namen bearbeiten. Hier sind vor allem erstmal drei Einträge der Marke "NS" wichtig:<br />
<br />
Diese Einträge sagen den weltweiten DNS-Servern, wer die DNS-Server für unsere Domain sind. Danach müssen wir natürlich die Standard-Records (A für Adressauflösung und MX für Mail) eintragen.<br />
<br />
== Zweiter Nameserver ==<br />
Für die Ausfallsicherheit sind Domains immer zwei unterschiedliche Nameserver zuzuweisen. Idealerweise sind beide auch nicht im gleichen Netz. Für alle, die keine zwei getrennten 24 Stunden erreichbaren Server betreiben, bietet sich der Service von http://www.buddyns.com an. Nach dem Registrieren mit Domainname, IP-Adresse des primären DNS-Servers (IP des eigenen Servers) und E-Mail-Adresse bekommt man ein Passwort zugeschickt, mit dem man Zugriff auf das Bullyboard hat:<br />
<br />
Hier ist besonders der Reiter "Zones" interessant.<br />
<br />
Bis alles korrekt eingestellt ist, ist der obige Balken noch rot. Haben wir noch keine Einstellungen beim Registrar vorgenommen, sollten die Felder "Authority declares BuddyNS" und "Registry declares BuddyNS" nicht auf OK stehen. Sollte hier aber alles andere stimmen, können wir die DNS-Einstellungen unter http://www.denic.de/hintergrund/nast.html testen. Dazu geben wir unseren Domainnamen und die beiden DNS-Server an. BuddyNS bittet darum, die regionalen Nameserver zu benutzen. Für Europa sind das e.ns.buddyns.com und c.ns.buddyns.com<br />
<br />
Gibt die Denic grünes Licht, können wir die Nameserver beim Registrar ändern (meist per Domain-Update o.ä. auslösbar).<br />
<br />
== Konfiguration Fritz!Box ==<br />
Die Grundidee ist einfach: Jede Nacht bekommt die Fritz!Box durch den Provider nach der Zwangstrennung eine neue IP-Adresse zugewiesen. Nach diesem Update soll die Fritz!Box die IP-Adresse des DynDNS neu setzen. Sie kann dann auf ein PHP-Script zugreifen, das die Daten in der Datenbank aktualisiert. Das sollte natürlich mit einem Passwort geschützt sein, damit kein Fremder die Domain kapern kann.<br />
<br />
Ich benutze momentan eine abgewandelte Version des Scriptes aus der c't und benutze mysqli statt PDO als Datenbank-Anbindung. Sehr wichtig ist es, dass die Seriennummer des DNS-Records im SOA-Record nach einer Änderung hochgesetzt wird. Der Autor arbeitet mit preg_match, um die entsprechende Stelle im Record zu finden und hochzusetzen.<br />
<br />
In der Fritz!Box kann man mit Platzhaltern arbeiten, um das PHP-Script aufzurufen. Mehr dazu findet sich in der AVM-Hilfe.<br />
<br />
Hinweise zur Konfiguration der Fritz!Box finden sich auch hier: http://www.heise.de/ct/inhalt/2013/24/196/<br />
<br />
<br />
== Neue Version 2020 ==<br />
Wegen eines Serverumzugs musste auch das DynDNS umziehen. Dabei bin ich der zwischenzeitlich umgestellten Version auf eine Subdomain gefolgt. Es reicht dann aus, einen Nameserver-Eintrag für eine Subdomain anzulegen, ohne die Arbeit bei der Registrierungsstelle. Wir benötigen zwei Einträge im DNS der zu verwendenden Domain:<br />
<br />
dns.thiel2s.de A w.x.y.z.<br />
ddns.thiel2s.de NS dns.thiel2s.de<br />
<br />
Nun können wir *.ddns.thiel2s.de als DynDNS-Adressen nutzen. Dafür nutzen wir weiterhin den PDNS-Server mit MariaDB-Backend. Als Grundlage kommt ein Debian 10 zum Einsatz, auf dem folgende Pakete installiert werden:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql apache2 php mariadb-server<br />
<br />
Als Frontend zur grundlegenden Administration des PDNS kommt der PDNSManager zum Einsatz. Die Doku inkl. Konfiguration des PDNS ist [hier https://pdnsmanager.org/quickstart/] einzusehen.<br />
Nachdem der Manager installiert wurde, stehen auch die entsprechenden Tabellen zur Verfügung. Nun können wir im PDNS die Datenbankanbindung einstellen. Dafür in der Datei <code>/etc/powerdns/pdns.d/pdns.local.gmysql.conf/</code> muss dafür folgendes eingetragen werden:<br />
<br />
launch=gmysql<br />
gmysql-host=localhost<br />
gmysql-port=3306<br />
gmysql-dbname=pdns<br />
gmysql-user=powerdnsuser<br />
gmysql-password=assword<br />
gmysql-dnssec=no<br />
<br />
Für das Update über die Fritz!Box ist nun noch ein Script erforderlich, das die Aktualisierung der Records bei Änderung der IP-Adresse vornimmt. Ein Script, das dazu genutzt werden kann, steht hier zur Verfügung. Wichtig ist, auch die Serial Number des SOA-Records zu aktualisieren. Momentan ist das im Skript fehleranfällig, da ein massiver Aufruf der Skripte die Serial Number außerhalb des darstellbaren Bereichs erhöht.<br />
<br />
Ein Aufruf erfolgt dann z.B. über<br />
https://dns.thiel2s.de/poweradmin/updatescript.php?hostname=<domain>&passwort=<pass></div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Eigenes_DynDNS_mit_PowerDNS&diff=213Eigenes DynDNS mit PowerDNS2021-03-13T11:09:41Z<p>Lukas: /* Neue Version 2020 */</p>
<hr />
<div>Vor einiger Zeit hat dyndns.org seinen freien dynamischen DNS-Dienst eingestellt und die Kunden so gezwungen, entweder in einen Premium-Account zu migrieren oder sich anderwaltig umzuschauen. Ich habe mich dann für no-ip.org entschieden, mit dessen Service ich bis heute sehr zufrieden. Lediglich einmal kam es zu DNS-Problemen, die dann aber auch schnell gelöst waren.<br />
Da ich öfter DynDNS-Dienste einsetze, lege ich für alle Kunden verschiedene Konten an, was dann natürlich gerne mal zu Passwortverwechslungen führt.<br />
<br />
DynDNS kann man aber auch selber machen. Der Trick ist in der c't 24/2013 und auch bei [[d:Mein_eigenes_DynDNS|Uwe Debacher]] beschrieben. Der besteht darin, dass nicht BIND als DNS-Server eingesetzt wird, sondern [https://www.powerdns.com/ PowerDNS], der seine Domain-Daten in einer Datenbank speichert. Dadurch sind sie durch PHP manipulierbar und können so ohne wenig Aufwand von außen aktualisiert werden.<br />
<br />
== Installation von PDNS ==<br />
Wir erstellen danach eine Datenbank mit einem Benutzer. Und fügen folgendes Datenbank-Schema ein:<br />
<br />
CREATE TABLE IF NOT EXISTS 'domains' (<br />
'id' int(11) NOT NULL,<br />
'name' varchar(255) NOT NULL,<br />
'master' varchar(128) DEFAULT NULL,<br />
'last_check' int(11) DEFAULT NULL,<br />
'type' varchar(6) NOT NULL,<br />
'notified_serial' int(11) DEFAULT NULL,<br />
'account' varchar(40) DEFAULT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'hostnames' (<br />
'hostname' varchar(255) NOT NULL,<br />
'userid' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'records' (<br />
'id' int(11) NOT NULL,<br />
'domain_id' int(11) DEFAULT NULL,<br />
'name' varchar(255) DEFAULT NULL,<br />
'type' varchar(10) DEFAULT NULL,<br />
'content' varchar(255) DEFAULT NULL,<br />
'ttl' int(11) DEFAULT NULL,<br />
'prio' int(11) DEFAULT NULL,<br />
'change_date' int(11) DEFAULT NULL,<br />
'ordername' varchar(255) DEFAULT NULL,<br />
'auth' tinyint(1) DEFAULT NULL<br />
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'users' (<br />
'id' varchar(255) NOT NULL,<br />
'password' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
ALTER TABLE 'domains'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'name_index' ('name');<br />
<br />
ALTER TABLE 'hostnames'<br />
ADD PRIMARY KEY ('hostname'), ADD UNIQUE KEY 'hostname_index' ('hostname');<br />
<br />
ALTER TABLE 'records'<br />
ADD PRIMARY KEY ('id'), ADD KEY 'rec_name_index' ('name'), ADD KEY 'nametype_index' ('name','type'), ADD KEY 'domain_id' ('domain_id'), ADD KEY 'orderindex' ('ordername'), ADD KEY 'id' ('id');<br />
<br />
ALTER TABLE 'users'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'user_index' ('id');<br />
<br />
ALTER TABLE 'records'<br />
MODIFY 'id' int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=9;<br />
<br />
Unter Ubuntu sind folgende Pakete zu installieren, falls MySQL als Backend benutzt werden soll:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql<br />
<br />
Hier werden wir beim Installieren nach MySQL-Zugangsdaten gefragt, diese tragen wir ein und lassen die Installation auch gleich die Datenbank-Struktur anlegen.<br />
<br />
Eigentlich steuert man PowerDNS über die Administrationsoberfläche [http://www.poweradmin.org/ PowerAdmin]. Das ist dank PHPMyAdmin aber eigentlich nicht nötig.<br />
<br />
PowerDNS läuft standardmäßig noch nicht.<br />
Wir passen die Datei /etc/powerdns/pdns.conf wie folgt an (Die Zeilen können einfach auskommentiert und neu eingefügt werden):<br />
allow-axfr-ips=<oeffentliche-ipv4-des-servers> 127.0.0.1 173.244.206.26 88.198.106.11<br />
allow-recursion=127.0.0.1<br />
daemon=yes<br />
master=yes<br />
<br />
Nun lässt PowerDNS den Zonen-Download vom lokalen Server und den Servern von BuddyNS zu (siehe unten), startet als Daemon und sieht sich als Zonen-Master (standardmäßig nämlich nicht).<br />
<br />
Nun startet PowerDNS aber noch nicht richtig. Dieser Fehler hat mich einige Zeit gekostet: Unter /etc/powerdns/pdns.d/ müssen zwei Konfiguration-Dateien angepasst werden:<br />
In /etc/powerdns/pdns.d/pdns.simplebind.conf kommentieren wir beide Zeilen aus:<br />
#launch=bind<br />
#bind-config=/etc/powerdns/bindbackend.conf<br />
und in /etc/powerdns/pdns.d/pdns.local.gmysql.conf kontrollieren wir die Zugangsdaten zu MySQL und ändern folgende Zeile von yes auf no:<br />
gmysql-dnssec=no<br />
Damit sollte PowerDNS via<br />
service pdns restart<br />
starten.<br />
<br />
== Eintragen der Zonen ==<br />
Damit sich unser Server auch als Master für die Domain sieht, müssen wir eine Master Zone anlegen. Das geht über PowerAdmin nach einer Anmeldung über den Link "Master Zone hinzufügen". Der Name der Zone ist der Name der Domain. Unter "Zonen auflisten" können wir dann die Zone mit dem kleinen Stift neben dem Namen bearbeiten. Hier sind vor allem erstmal drei Einträge der Marke "NS" wichtig:<br />
<br />
Diese Einträge sagen den weltweiten DNS-Servern, wer die DNS-Server für unsere Domain sind. Danach müssen wir natürlich die Standard-Records (A für Adressauflösung und MX für Mail) eintragen.<br />
<br />
== Zweiter Nameserver ==<br />
Für die Ausfallsicherheit sind Domains immer zwei unterschiedliche Nameserver zuzuweisen. Idealerweise sind beide auch nicht im gleichen Netz. Für alle, die keine zwei getrennten 24 Stunden erreichbaren Server betreiben, bietet sich der Service von http://www.buddyns.com an. Nach dem Registrieren mit Domainname, IP-Adresse des primären DNS-Servers (IP des eigenen Servers) und E-Mail-Adresse bekommt man ein Passwort zugeschickt, mit dem man Zugriff auf das Bullyboard hat:<br />
<br />
Hier ist besonders der Reiter "Zones" interessant.<br />
<br />
Bis alles korrekt eingestellt ist, ist der obige Balken noch rot. Haben wir noch keine Einstellungen beim Registrar vorgenommen, sollten die Felder "Authority declares BuddyNS" und "Registry declares BuddyNS" nicht auf OK stehen. Sollte hier aber alles andere stimmen, können wir die DNS-Einstellungen unter http://www.denic.de/hintergrund/nast.html testen. Dazu geben wir unseren Domainnamen und die beiden DNS-Server an. BuddyNS bittet darum, die regionalen Nameserver zu benutzen. Für Europa sind das e.ns.buddyns.com und c.ns.buddyns.com<br />
<br />
Gibt die Denic grünes Licht, können wir die Nameserver beim Registrar ändern (meist per Domain-Update o.ä. auslösbar).<br />
<br />
== Konfiguration Fritz!Box ==<br />
Die Grundidee ist einfach: Jede Nacht bekommt die Fritz!Box durch den Provider nach der Zwangstrennung eine neue IP-Adresse zugewiesen. Nach diesem Update soll die Fritz!Box die IP-Adresse des DynDNS neu setzen. Sie kann dann auf ein PHP-Script zugreifen, das die Daten in der Datenbank aktualisiert. Das sollte natürlich mit einem Passwort geschützt sein, damit kein Fremder die Domain kapern kann.<br />
<br />
Ich benutze momentan eine abgewandelte Version des Scriptes aus der c't und benutze mysqli statt PDO als Datenbank-Anbindung. Sehr wichtig ist es, dass die Seriennummer des DNS-Records im SOA-Record nach einer Änderung hochgesetzt wird. Der Autor arbeitet mit preg_match, um die entsprechende Stelle im Record zu finden und hochzusetzen.<br />
<br />
In der Fritz!Box kann man mit Platzhaltern arbeiten, um das PHP-Script aufzurufen. Mehr dazu findet sich in der AVM-Hilfe.<br />
<br />
Hinweise zur Konfiguration der Fritz!Box finden sich auch hier: http://www.heise.de/ct/inhalt/2013/24/196/<br />
<br />
<br />
== Neue Version 2020 ==<br />
Wegen eines Serverumzugs musste auch das DynDNS umziehen. Dabei bin ich der zwischenzeitlich umgestellten Version auf eine Subdomain gefolgt. Es reicht dann aus, einen Nameserver-Eintrag für eine Subdomain anzulegen, ohne die Arbeit bei der Registrierungsstelle. Wir benötigen zwei Einträge im DNS der zu verwendenden Domain:<br />
<br />
dns.thiel2s.de A w.x.y.z.<br />
ddns.thiel2s.de NS dns.thiel2s.de<br />
<br />
Nun können wir *.ddns.thiel2s.de als DynDNS-Adressen nutzen. Dafür nutzen wir weiterhin den PDNS-Server mit MariaDB-Backend. Als Grundlage kommt ein Debian 10 zum Einsatz, auf dem folgende Pakete installiert werden:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql apache2 php mariadb-server<br />
<br />
Als Frontend zur grundlegenden Administration des PDNS kommt der PDNSManager zum Einsatz. Die Doku inkl. Konfiguration des PDNS ist [hier https://pdnsmanager.org/quickstart/] einzusehen.<br />
Nachdem der Manager installiert wurde, stehen auch die entsprechenden Tabellen zur Verfügung. Nun können wir im PDNS die Datenbankanbindung einstellen. Dafür in der Datei <code>/etc/powerdns/pdns.d/pdns.local.gmysql.conf/<code> muss dafür folgendes eingetragen werden:<br />
<br />
launch=gmysql<br />
gmysql-host=localhost<br />
gmysql-port=3306<br />
gmysql-dbname=pdns<br />
gmysql-user=powerdnsuser<br />
gmysql-password=assword<br />
gmysql-dnssec=no<br />
<br />
Für das Update über die Fritz!Box ist nun noch ein Script erforderlich, das die Aktualisierung der Records bei Änderung der IP-Adresse vornimmt. Ein Script, das dazu genutzt werden kann, steht hier zur Verfügung. Wichtig ist, auch die Serial Number des SOA-Records zu aktualisieren. Momentan ist das im Skript fehleranfällig, da ein massiver Aufruf der Skripte die Serial Number außerhalb des darstellbaren Bereichs erhöht.<br />
<br />
Ein Aufruf erfolgt dann z.B. über<br />
https://dns.thiel2s.de/poweradmin/updatescript.php?hostname=<domain>&passwort=<pass></div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Eigenes_DynDNS_mit_PowerDNS&diff=212Eigenes DynDNS mit PowerDNS2020-12-26T18:56:56Z<p>Lukas: </p>
<hr />
<div>Vor einiger Zeit hat dyndns.org seinen freien dynamischen DNS-Dienst eingestellt und die Kunden so gezwungen, entweder in einen Premium-Account zu migrieren oder sich anderwaltig umzuschauen. Ich habe mich dann für no-ip.org entschieden, mit dessen Service ich bis heute sehr zufrieden. Lediglich einmal kam es zu DNS-Problemen, die dann aber auch schnell gelöst waren.<br />
Da ich öfter DynDNS-Dienste einsetze, lege ich für alle Kunden verschiedene Konten an, was dann natürlich gerne mal zu Passwortverwechslungen führt.<br />
<br />
DynDNS kann man aber auch selber machen. Der Trick ist in der c't 24/2013 und auch bei [[d:Mein_eigenes_DynDNS|Uwe Debacher]] beschrieben. Der besteht darin, dass nicht BIND als DNS-Server eingesetzt wird, sondern [https://www.powerdns.com/ PowerDNS], der seine Domain-Daten in einer Datenbank speichert. Dadurch sind sie durch PHP manipulierbar und können so ohne wenig Aufwand von außen aktualisiert werden.<br />
<br />
== Installation von PDNS ==<br />
Wir erstellen danach eine Datenbank mit einem Benutzer. Und fügen folgendes Datenbank-Schema ein:<br />
<br />
CREATE TABLE IF NOT EXISTS 'domains' (<br />
'id' int(11) NOT NULL,<br />
'name' varchar(255) NOT NULL,<br />
'master' varchar(128) DEFAULT NULL,<br />
'last_check' int(11) DEFAULT NULL,<br />
'type' varchar(6) NOT NULL,<br />
'notified_serial' int(11) DEFAULT NULL,<br />
'account' varchar(40) DEFAULT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'hostnames' (<br />
'hostname' varchar(255) NOT NULL,<br />
'userid' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'records' (<br />
'id' int(11) NOT NULL,<br />
'domain_id' int(11) DEFAULT NULL,<br />
'name' varchar(255) DEFAULT NULL,<br />
'type' varchar(10) DEFAULT NULL,<br />
'content' varchar(255) DEFAULT NULL,<br />
'ttl' int(11) DEFAULT NULL,<br />
'prio' int(11) DEFAULT NULL,<br />
'change_date' int(11) DEFAULT NULL,<br />
'ordername' varchar(255) DEFAULT NULL,<br />
'auth' tinyint(1) DEFAULT NULL<br />
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'users' (<br />
'id' varchar(255) NOT NULL,<br />
'password' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
ALTER TABLE 'domains'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'name_index' ('name');<br />
<br />
ALTER TABLE 'hostnames'<br />
ADD PRIMARY KEY ('hostname'), ADD UNIQUE KEY 'hostname_index' ('hostname');<br />
<br />
ALTER TABLE 'records'<br />
ADD PRIMARY KEY ('id'), ADD KEY 'rec_name_index' ('name'), ADD KEY 'nametype_index' ('name','type'), ADD KEY 'domain_id' ('domain_id'), ADD KEY 'orderindex' ('ordername'), ADD KEY 'id' ('id');<br />
<br />
ALTER TABLE 'users'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'user_index' ('id');<br />
<br />
ALTER TABLE 'records'<br />
MODIFY 'id' int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=9;<br />
<br />
Unter Ubuntu sind folgende Pakete zu installieren, falls MySQL als Backend benutzt werden soll:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql<br />
<br />
Hier werden wir beim Installieren nach MySQL-Zugangsdaten gefragt, diese tragen wir ein und lassen die Installation auch gleich die Datenbank-Struktur anlegen.<br />
<br />
Eigentlich steuert man PowerDNS über die Administrationsoberfläche [http://www.poweradmin.org/ PowerAdmin]. Das ist dank PHPMyAdmin aber eigentlich nicht nötig.<br />
<br />
PowerDNS läuft standardmäßig noch nicht.<br />
Wir passen die Datei /etc/powerdns/pdns.conf wie folgt an (Die Zeilen können einfach auskommentiert und neu eingefügt werden):<br />
allow-axfr-ips=<oeffentliche-ipv4-des-servers> 127.0.0.1 173.244.206.26 88.198.106.11<br />
allow-recursion=127.0.0.1<br />
daemon=yes<br />
master=yes<br />
<br />
Nun lässt PowerDNS den Zonen-Download vom lokalen Server und den Servern von BuddyNS zu (siehe unten), startet als Daemon und sieht sich als Zonen-Master (standardmäßig nämlich nicht).<br />
<br />
Nun startet PowerDNS aber noch nicht richtig. Dieser Fehler hat mich einige Zeit gekostet: Unter /etc/powerdns/pdns.d/ müssen zwei Konfiguration-Dateien angepasst werden:<br />
In /etc/powerdns/pdns.d/pdns.simplebind.conf kommentieren wir beide Zeilen aus:<br />
#launch=bind<br />
#bind-config=/etc/powerdns/bindbackend.conf<br />
und in /etc/powerdns/pdns.d/pdns.local.gmysql.conf kontrollieren wir die Zugangsdaten zu MySQL und ändern folgende Zeile von yes auf no:<br />
gmysql-dnssec=no<br />
Damit sollte PowerDNS via<br />
service pdns restart<br />
starten.<br />
<br />
== Eintragen der Zonen ==<br />
Damit sich unser Server auch als Master für die Domain sieht, müssen wir eine Master Zone anlegen. Das geht über PowerAdmin nach einer Anmeldung über den Link "Master Zone hinzufügen". Der Name der Zone ist der Name der Domain. Unter "Zonen auflisten" können wir dann die Zone mit dem kleinen Stift neben dem Namen bearbeiten. Hier sind vor allem erstmal drei Einträge der Marke "NS" wichtig:<br />
<br />
Diese Einträge sagen den weltweiten DNS-Servern, wer die DNS-Server für unsere Domain sind. Danach müssen wir natürlich die Standard-Records (A für Adressauflösung und MX für Mail) eintragen.<br />
<br />
== Zweiter Nameserver ==<br />
Für die Ausfallsicherheit sind Domains immer zwei unterschiedliche Nameserver zuzuweisen. Idealerweise sind beide auch nicht im gleichen Netz. Für alle, die keine zwei getrennten 24 Stunden erreichbaren Server betreiben, bietet sich der Service von http://www.buddyns.com an. Nach dem Registrieren mit Domainname, IP-Adresse des primären DNS-Servers (IP des eigenen Servers) und E-Mail-Adresse bekommt man ein Passwort zugeschickt, mit dem man Zugriff auf das Bullyboard hat:<br />
<br />
Hier ist besonders der Reiter "Zones" interessant.<br />
<br />
Bis alles korrekt eingestellt ist, ist der obige Balken noch rot. Haben wir noch keine Einstellungen beim Registrar vorgenommen, sollten die Felder "Authority declares BuddyNS" und "Registry declares BuddyNS" nicht auf OK stehen. Sollte hier aber alles andere stimmen, können wir die DNS-Einstellungen unter http://www.denic.de/hintergrund/nast.html testen. Dazu geben wir unseren Domainnamen und die beiden DNS-Server an. BuddyNS bittet darum, die regionalen Nameserver zu benutzen. Für Europa sind das e.ns.buddyns.com und c.ns.buddyns.com<br />
<br />
Gibt die Denic grünes Licht, können wir die Nameserver beim Registrar ändern (meist per Domain-Update o.ä. auslösbar).<br />
<br />
== Konfiguration Fritz!Box ==<br />
Die Grundidee ist einfach: Jede Nacht bekommt die Fritz!Box durch den Provider nach der Zwangstrennung eine neue IP-Adresse zugewiesen. Nach diesem Update soll die Fritz!Box die IP-Adresse des DynDNS neu setzen. Sie kann dann auf ein PHP-Script zugreifen, das die Daten in der Datenbank aktualisiert. Das sollte natürlich mit einem Passwort geschützt sein, damit kein Fremder die Domain kapern kann.<br />
<br />
Ich benutze momentan eine abgewandelte Version des Scriptes aus der c't und benutze mysqli statt PDO als Datenbank-Anbindung. Sehr wichtig ist es, dass die Seriennummer des DNS-Records im SOA-Record nach einer Änderung hochgesetzt wird. Der Autor arbeitet mit preg_match, um die entsprechende Stelle im Record zu finden und hochzusetzen.<br />
<br />
In der Fritz!Box kann man mit Platzhaltern arbeiten, um das PHP-Script aufzurufen. Mehr dazu findet sich in der AVM-Hilfe.<br />
<br />
Hinweise zur Konfiguration der Fritz!Box finden sich auch hier: http://www.heise.de/ct/inhalt/2013/24/196/<br />
<br />
<br />
== Neue Version 2020 ==<br />
Wegen eines Serverumzugs musste auch das DynDNS umziehen. Dabei bin ich der zwischenzeitlich umgestellten Version auf eine Subdomain gefolgt. Es reicht dann aus, einen Nameserver-Eintrag für eine Subdomain anzulegen, ohne die Arbeit bei der Registrierungsstelle.<br />
<br />
dns.thiel2s.de A w.x.y.z.<br />
ddns.thiel2s.de NS dns.thiel2s.de<br />
<br />
Nun können wir *.ddns.thiel2s.de als DynDNS-Adressen nutzen. Dafür nutzen wir weiterhin den PDNS-Server mit MariaDB-Backend:<br />
Unter Ubuntu sind folgende Pakete zu installieren, falls MySQL als Backend benutzt werden soll:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql<br />
<br />
Als Frontend kommt der PDNSManager zum Einsatz. Die Doku inkl. Konfiguration des PDNS ist [hier https://pdnsmanager.org/quickstart/] einzusehen.<br />
<br />
Zur Manipulation nutze ich ein Script, das ich bei Bedarf gern zur Verfügung stelle. Der Aufruf in der Fritz!Box erfolgt dann auf:<br />
https://dns.thiel2s.de/poweradmin/updatescript.php?hostname=<domain>&passwort=<pass><br />
<br />
Wichtig ist, hierbei auch die Seriennummer des SOA Records zu aktualisieren.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=IServ-Infodisplay&diff=211IServ-Infodisplay2020-08-03T18:40:59Z<p>Lukas: </p>
<hr />
<div>Der Schulserver [http://www.iserv.eu IServ] bietet viele spannende Funktionen. Eine davon ist das Infodisplay, welches Informationen und Pläne (z.B. Vertretungspläne) nach Bedarf anzeigt. Dabei kann man den Zugriff in vier verschiedene Stufen einschränken:<br />
* nicht sichtbar (z.B. für Test-Zwecke)<br />
* Nur über geheime URL (IServ gibt dann einen Link aus, über den das Infodisplay erreichbar ist)<br />
* Nur im lokalen Netz (wird allen Benutzern des IDesk angezeigt, wenn diese sich im lokalen Netz befinden, also auf einem Rechner im Schulnetz angemeldet sind)<br />
* Öffentlich (für alle Benutzer auch ohne Anmeldung, auch Zuhause, weltweit öffentlich, sichtbar)<br />
<br />
Unabhängig davon sind die Infodisplay allen Benutzern sichtbar, die das Recht "Infobildschirme verwalten" zugewiesen bekommen haben.<br />
<br />
Beim Umrüsten von bestehenden Displays, z.B. mit embedded Geräten, habe ich mit dem IServ-Infodisplay sehr gute Erfahrungen gemacht. Im [[d:IServ|Debacher-Wiki]] findet sich eine Anleitung, wie ein normaler Windows-Rechner als Infodisplay konfiguriert werden kann, davon ist aber seit einigen Jahren abzuraten. Für den schmalen Taler gibt es einen Raspberry Pi, der mit der folgenden Anleitung auch zum Display umfunktioniert werden kann. Der Pi eignet sich perfekt als Infodisplay, da der Stromverbrauch mehr als verkraftbar ist.<br />
<br />
<br />
== Raspberry Pi als Infobildschirm mit Chromium ==<br />
Im Gegensatz zur unten angegebenen Config über Firefox ist die Installation mit Chromium einfacher umzusetzen. Zuerst beziehen wir das [https://www.raspberrypi.org/downloads/raspberry-pi-os/ aktuelle Raspberry Pi OS] und kopieren es [https://www.raspberrypi.org/documentation/installation/installing-images/README.md wie beschrieben] auf eine SD-Karte. Diese muss natürlich vorher in fat32 formatiert werden.<br />
<br />
Nach dem Start des Pis wird zuerst das System entpackt und eingerichtet. Nach dem ersten Start müssen einige Parameter gesetzt werden. Es sollte ein passender Hostname (zum Beispiel an der IP-Adresse orientiert: raspi12) gesetzt werden. Dazu kriegt der Benutzer pi ein Kennwort und unter "Interfaces" müssen der SSH- und VNC-Server aktiviert werden, damit später ein Zugriff aus dem lokalen Netz möglich ist.<br />
<br />
Nun ist der Raspi aus dem Netz erreichbar. Für einen Zugriff auf die Kommandozeile dient zB PuTTY für Windows. Über SSH ist der Pi dann unter Angabe der IP-Adresse erreichbar. Ein Login ist dann mit dem Nutzernamen pi und dem vergebenen Passwort möglich.<br />
<br />
=== Chromium und Autostart ===<br />
Damit der Raspi nun beim Start auch den Infobildschirm anzeigt, müssen wir eine autostart-Datei erstellen:<br />
nano /home/pi/autostart.sh<br />
<br />
mit folgendem Inhalt:<br />
/usr/bin/chromium-browser --kiosk http://iserv/iserv/public/infodisplay/<br />
<br />
Anschließend speichern und ausführbar machen:<br />
chmod 0775 /home/pi/autostart.sh<br />
<br />
Danach wird die Datei im Autostart-Bereich des Nutzers verlinkt:<br />
nano /home/pi/.config/autostart/autostart.desktop<br />
<br />
mit folgendem Inhalt:<br />
<br />
[Desktop Entry]<br />
Name=Autostart<br />
Exec=/bin/bash /home/pi/autostart.sh<br />
Type=application<br />
<br />
Nach einem Neustart sollte Chromium beim Start mitstarten.<br />
Hier folgt der Befehl zum Start von Chromium im Kiosk-Modus (Vollbild, keine Eingabe):<br />
<br />
<br />
=== Energie sparen ===<br />
Das Bild muss nicht die ganze Nacht laufen, deshalb benutzen wir zwei Shell-Scripte, die per Crontab aufgerufen werden. (Quelle: [[d:IServ|Debacher-Wiki/IServ]])<br />
<br />
Die Shell-Skripte erstellen wir einfach mit VIM oder einem anderen Editor.<br />
<br />
Ausschalten (/home/pi/monitor-aus.sh)<br />
vi /home/pi/monitor-aus.sh<br />
<br />
#!/bin/bash<br />
/usr/bin/tvservice --off<br />
<br />
Einschalten (monitor-an.sh)<br />
vi /home/pi/monitor-an.sh<br />
<br />
#!/bin/bash<br />
#/usr/bin/tvservice --explicit="DMT 51 DVI" && chvt 1 && chvt 7 <br />
/usr/bin/tvservice -p && chvt 1 && chvt 7<br />
<br />
Die erste Version ist besonders für Monitore gedacht, die per HDMI-auf-DVI-Adapter an den Pi angeschlossen sind. Hier muss man je nach Monitor oft eine Auflösung erzwingen, da die Adapter das Signal verunstalten, sodass der Pi nicht mehr ordentlich erkennen kann, welche Auflösung die Beste ist. Die möglichen Modi finden sich [http://elinux.org/RPiconfig#Video_mode_options hier]. Wichtig ist, dass man nach dem Starten des TV-Services einmal auf die 1. Konsole und dann zurück auf die grafische wechselt, sonst bleibt der Bildschirm schwarz. (http://pi-buch.info/?p=413)<br />
<br />
Die Änderungen müssen zudem einmal in<br />
sudo vi /boot/config.txt<br />
vorgenommen werden. Hier setzt man<br />
hdmi_drive=1 für Normal DVI mode (No sound)<br />
hdmi_group=2 für DMT (in meinem Fall präferiert)<br />
# und einen entsprechenden Modus<br />
hdmi_mode=51<br />
(Genaue Werte siehe http://elinux.org/RPiconfig#Video_mode_options)<br />
<br />
Danach sollte der Pi sowohl beim Start als auch beim Ausführen der Skripte die richtige Auflösung anzeigen (Bitte auch [[#Overscan]] beachten!).<br />
<br />
=== Bildschirmschoner abschalten ===<br />
<br />
Zu dem sollte der Bildschirmschoner deaktiviert werden:<br />
sudo vi /etc/X11/xinit/xinitrc<br />
<br />
#!/bin/sh<br />
<br />
# /etc/X11/xinit/xinitrc<br />
#<br />
# global xinitrc file, used by all X sessions started by xinit (startx)<br />
<br />
xset s off # aktiviert keinen Bildschirmschoner<br />
xset -dpms # deaktiviert DPMS (Energy Star) Features.<br />
xset s noblank # deakviviert blank the video device<br />
# invoke global X session script<br />
. /etc/X11/Xsession<br />
<br />
und<br />
sudo vi etc/kbd/config<br />
<br />
BLANK_TIME=0<br />
<br />
(vgl. [[d:IServ|Debacher-Wiki]]<br />
<br />
In neueren Versionen von Raspbian reicht auch eine Anpassung von /home/pi/.config/lxsession/LXDE-pi/autostart<br />
<br />
@lxpanel --profile LXDE-pi<br />
@pcmanfm --desktop --profile LXDE-pi<br />
#@xscreensaver -no-splash<br />
#@point-rpi<br />
@/usr/bin/iceweasel<br />
@xset s off<br />
@xset -dpms<br />
@xset s noblank<br />
<br />
=== Crontab ===<br />
<br />
Den Crontab konfigurieren wir am Besten als Benutzer root:<br />
sudo crontab -e<br />
<br />
Hierbei ist es wichtig, das Display anzugeben (-d :0.0) Dann binden wir die Scripte in Crontab zu schultypischen Uhrzeiten ein:<br />
# m h dom mon dow command<br />
00 20 * * * /home/pi/monitor-aus.sh<br />
00 07 * * * /home/pi/monitor-an.sh<br />
<br />
=== Overscan ===<br />
Falls das Bild des Pis den Bildschirm nicht komplett ausfüllt, kann folgende Einstellung Abhilfe schaffen. Wir rufen in der Shell folgenden Befehl auf:<br />
sudo raspi-config<br />
und schalten unter Adavnced Options -> Overscan auf "Disable". Nach einem Neustart sollte der Pi der Bild voll ausfüllen.<br />
<br />
== Raspberry Pi als Infobildschirm mit Firefox ==<br />
Auf dem Pi installieren wir nach der Installation von Raspbian das Paket Iceweasel (Firefox) nach:<br />
apt-get update<br />
apt-get install iceweasel<br />
<br />
Nach einem Start von Iceweasel setzen wir dann das Infodisplay als Startseite:<br />
http://iserv/idesk/infodisplay/<br />
<br />
Die URL hat sich mit der v3 leicht abgewandelt: http://iserv/iserv/public/infodisplay/<br />
<br />
Diese relativ allgemeine URL bietet uns später die Möglichkeit, individuell im IDesk auszuwählen, welcher Infobildschirm angezeigt werden soll. Dafür muss der Raspberry Pi als Rechner in der Rechnerverteilung installiert sein und zusätzlich unter Infobildschirm -> Verwalten -> Anzeigegeräte hinzugefügt werden. Es ist auch möglich, zum Beispiel morgens einen anderen Infobildschirm anzuzeigen, als nachmittags.<br />
<br />
In Iceweasel installieren wir nach dem Hinzufügen der Startseite dann die Extension r-kiosk nach, die leider nur noch direkt über die [https://addons.mozilla.org/de/firefox/addon/r-kiosk/ Firefox-Respository] installiert werden kann. (Wichtig: Danach muss Iceweasel für Änderungen über die Konsole gekillt und anschließend im abgesicherten Modus gestartet werden. Also bitte alles kontrollieren!)<br />
<br />
Es empfiehlt sich noch zu konfigurieren, dass Iceweasel nach einem Absturz (zum Beispiel ein Killen über die Konsole) nicht die Restore-Seite, sondern unsere Startseite anzeigt. Dafür korrigieren wir unter<br />
about:config<br />
den Wert von<br />
browser.sessionstore.resume_from_crash<br />
von true auf false (durch einen einfachen Doppelklick)<br />
<br />
Ist das geschehen, müssen wir noch den Bildschirmschoner deaktivieren und Iceweasel in den Autostart (/home/pi/.config/lxsession/LXDE-pi/autostart) mit aufnehmen:<br />
@lxpanel --profile LXDE<br />
@pcmanfm --desktop --profile LXDE<br />
#@xscreensaver -no-splash<br />
@/usr/bin/iceweasel</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Hauptseite&diff=210Hauptseite2020-04-24T14:53:25Z<p>Lukas: + Ubuntu 18.04</p>
<hr />
<div>__NOTOC__<br />
== Herzlich Willkommen ==<br />
Hallo und herzlich willkommen. Mein Name ist Lukas Thiel, ich studiere und setze mich in meiner Freizeit mit allem möglichen auseinander, was mit IT zu tun hat.<br />
Dieses Wiki dient größtenteils der Dokumentation von einigen Projekten, damit ich die Dinge nicht wieder vergesse. Da gewonnene Erkenntnisse auch für andere interessant sein könnten, stehen die Texte der Allgemeinheit zur Verfügung.<br />
<br />
Weitere gute Quellen sind neben vielen anderen die Seiten meines Kollegen [[d:Hauptseite|Uwe Debacher]] und das [http://wiki.ubuntuusers.de/ Ubuntuusers-Wiki].<br />
Erkenntnisse, die mir in den Kopf kommen, es aber nicht in einen Artikel schaffen, finden sich bei [https://twitter.com/LukasThiel Twitter].<br />
<br />
Dieses Wiki wächst stets weiter, das aber in unregelmäßigem Abstand.<br />
<br />
Nun viel Spaß und gute Erkenntnisse auf meinen Seiten.<br />
<br />
Lukas Thiel.<br />
<br />
== Server ==<br />
* [[Grundschulserver|Aufsetzen eines Servers für den Einsatz in Grundschulen]]<br />
* [[V-Server einrichten]]<br />
* [[Root-Server mit Ubuntu 14.04]]<br />
* [[Root-Server mit Ubuntu 16.04]]<br />
* [[Root-Server mit Ubuntu 16.04-Hetzner]] - neuere Version<br />
* [[Root-Server mit Ubuntu 18.04]]<br />
* [[Eigenes DynDNS mit PowerDNS]]<br />
* [[SSL-Zertifikate mit Let's Encrypt]]<br />
* [[Blacklist mit Fail2Ban]]<br />
* [[Thunderbird-Autokonfiguration]]<br />
<br />
== Hardware ==<br />
* [[Raspberry Pi]]<br />
* [[GoPro Hero 3]]<br />
<br />
== Software ==<br />
* [[Stream mit VLC]]<br />
* [[IServ]]<br />
** [[IServ-Infodisplay]]<br />
* [[OwnCloud]]<br />
* [[Grav]]<br />
* [[WLAN-Accesspoint mit DD-WRT und RADIUS]]<br />
* [[FreeRADIUS]]<br />
* [[PHP Network WeatherMap]]<br />
<br />
== Sonstiges ==<br />
* [[PHP:A-Z|A-Z Auflistung]]<br />
* [[Schnipsel]]</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_18.04&diff=209Root-Server mit Ubuntu 18.042020-04-22T18:05:45Z<p>Lukas: /* SSL */ Doppeleintrag gefixt - danke Stefan!</p>
<hr />
<div>Mein [[Root-Server_mit_Ubuntu_16.04-Hetzner|alter Server]] läuft noch mit Ubuntu 16.04. Das ist erstmal kein Problem, der Support läuft noch, allerdings wird die aktuellste PHP-Version nicht unterstützt. Das macht bei einigen Anwendungen nun schon Probleme. Daher habe ich einen zweiten Server in der Serverbörse geordert. Die Rechner sind teurer geworden. Der Rechner ist vergleichbar mit dem alten, kostet aber 6€ mehr. Positiv ist, dass ich dadurch eine Ausfallsicherheit erreichen kann. Ich werde den neuen Server einrichten und anschließend den alten aktualisieren.<br />
<br />
Der neue Rechner hat folgende Daten:<br />
* Intel Core i7-2600 8x 3.40GHz (8x 6823.66 Bogomips)<br />
* 16 GB Arbeitsspeicher<br />
* 2x 3 TB im RAID1-Verbund Festplattenspeicher<br />
<br />
Der Rechner kostet 30€/Monat.<br />
<br />
== Installation ==<br />
Hetzner liefert die Geräte im Rescue-Modus aus. Das ist ein Minimal-Linux mit Tools zur Rettung und dem Skript [https://github.com/hetzneronline/installimage installimage], mit dem eine Betriebssystem-Installation vorgenommen werden kann. Das ist schon mal ein großer Unterschied zu Strato, die die Rechner selber installieren und dann zur Verfügung stellen.<br />
<br />
Der Robot (Kundencenter) von Hetzner bietet allerlei Möglichkeiten, so kann der Rechner bequem mit einem Strg + Alt + Entf-Befehl gefüttert werden oder per ACPI neugestartet werden. Zudem bietet Hetzner die Möglichkeit eines Weckens über LAN (WOL) und man kann bequem eigene Monitoring-Dienste für den Rechner anlegen, sodass man bei Unregelmäßigkeiten per Mail informiert wird.<br />
<br />
Die Installation des Rechners erfolgt dann über den Befehl <code>installimage</code>. Nach einer Auswahl des Betriebssystems kann man über eine Textdatei die RAID-Einstellungen, Festplattenpartitionierung und den Hostnamen konfigurieren. Das macht es besonders einfach, mehrere Rechner zu installieren oder sich die Konfiguration noch einmal abzuspeichern.<br />
<br />
Nach dem Verlassen des Editors installiert der Rechner dann das Grundsystem, während man zugucken kann:<br />
<br />
Hetzner Online GmbH - installimage<br />
<br />
Your server will be installed now, this will take some minutes<br />
You can abort at any time with CTRL+C ...<br />
<br />
: Reading configuration done <br />
: Loading image file variables done <br />
: Loading ubuntu specific functions done <br />
1/16 : Deleting partitions done <br />
2/16 : Test partition size done <br />
3/16 : Creating partitions and /etc/fstab done <br />
4/16 : Creating software RAID level 1 done <br />
5/16 : Formatting partitions<br />
: formatting /dev/md/0 with swap done <br />
: formatting /dev/md/1 with ext2 done <br />
: formatting /dev/md/2 with ext4 done <br />
: formatting /dev/md/3 with xfs done <br />
: formatting /dev/md/4 with ext4 done <br />
: formatting /dev/md/5 with ext4 done <br />
6/16 : Mounting partitions done <br />
7/16 : Sync time via ntp done <br />
: Importing public key for image validation done <br />
8/16 : Validating image before starting extraction done <br />
9/16 : Extracting image (local) done <br />
10/16 : Setting up network config done <br />
11/16 : Executing additional commands<br />
: Setting hostname done <br />
: Generating new SSH keys done <br />
: Generating mdadm config done <br />
: Generating ramdisk done <br />
: Generating ntp config done <br />
12/16 : Setting up miscellaneous files done <br />
13/16 : Configuring authentication<br />
: Fetching SSH keys done <br />
: Disabling root password done <br />
: Disabling SSH root login without password done <br />
: Copying SSH keys done <br />
14/16 : Installing bootloader grub done <br />
15/16 : Running some ubuntu specific functions done <br />
16/16 : Clearing log files done <br />
<br />
INSTALLATION COMPLETE<br />
You can now reboot and log in to your new system with<br />
the same password as you logged in to the rescue system.<br />
<br />
root@rescue ~ # reboot<br />
<br />
Nach dem Neustart steht dann das neue System zur Verfügung. Die Installation hat letztlich mit Lektüre etwa 7 Minuten gedauert. Das ist ein enormer Fortschritt zu anderen Providern.<br />
<br />
== Grundlegendes ==<br />
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Und ein paar Tools:<br />
apt-get install vim htop whois aptitude needrestart git unzip<br />
<br />
== Firewall ==<br />
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:<br />
apt-get install ufw<br />
<br />
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:<br />
ufw allow 22<br />
ufw allow OpenSSH<br />
<br />
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels<br />
ufw enable<br />
zeigt die Firewall auch automatisch Wirkung.<br />
<br />
Überprüfen lässt sich der Status mit<br />
ufw status<br />
bzw.<br />
ufw status numbered<br />
<br />
So können auch Regeln gelöscht werden:<br />
ufw delete 1<br />
<br />
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.<br />
<br />
Damit nicht die syslog mit Firewall-Messages überläuft, deaktivieren wir das Logging in /etc/rsyslog.d/20-ufw.conf, letzte Zeile:<br />
& stop<br />
<br />
== Webserver Apache2 ==<br />
Zur Bereitstellung von Webseiten nutze ich Apache als Webserver mit PHP. Da der Server unter mehreren Namen erreichbar sein wird, richten wir VirtualHosts ein.<br />
<br />
Die Installation läuft denkbar einfach über<br />
<br />
sudo apt-get update<br />
sudo apt-get install apache2 apache2-utils apache2-doc php php-mysql php-pear<br />
<br />
Neben Apache gibt es ein paar Tools, Doku und neben PHP schon die Anbindung für MySQL und Apache. Apache kommt in der Version 2.4.29, bei PHP wird Version 7.2 installiert.<br />
<br />
Nach der Installation geht es an die eigentliche Konfiguration des Webservers. Ziel ist es, das eine Reihe von Anwendungen (Roundcube, PHPMyAdmin, etc.) nur einmal installiert werden müssen und dann allen eingerichteten Domains zur Verfügung stehen. Gleichzeitig sollen Dummies, die den Server über seine IP oder einen nicht vorhandenen Namen ansprechen, keine Dienste nutzen können, sondern lediglich eine Fehler-Seite sehen. Die folgende Konfiguration habe ich in Teilen in ihrer Version vom 12. November 2014 aus dem [[d:Root-Server_mit_OpenSuSE_13.1|Debacher-Wiki]] entnommen (CC-BY-SA). Wir legen also eine Grundkonfiguration für jeden "dummen" Aufruf an.<br />
<br />
Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen.<br />
Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis:<br />
mkdir /var/www/htdocs<br />
mkdir /var/www/vhosts<br />
mkdir /var/www/vhosts/default<br />
mv /var/www/html /var/www/vhosts/default/htdocs<br />
<br />
Wichtig ist, dass wir die Datei vorher einmal sichern:<br />
<br />
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.org<br />
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org<br />
<br />
Dann noch einige Apache-Module aktivieren:<br />
<br />
a2enmod ssl headers cgi rewrite auth_basic authz_groupfile<br />
<br />
=== /etc/apache2/sites-available/000-default.conf ===<br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
ServerTokens Prod <br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
Alias /webmail /var/www/htdocs/roundcube<br />
Alias /roundcube /var/www/htdocs/roundcube<br />
Alias /pma /var/www/htdocs/pma<br />
Alias /webftp /var/www/htdocs/webftp<br />
<br />
<VirtualHost *:80><br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/vhosts/default/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
# Verhindern des Zugriffs auf die CGI-Skripte<br />
<Directory "/var/www/cgi-bin/"><br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Deny from all <br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /cgi-bin /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
</VirtualHost><br />
<br />
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet<br />
<br />
=== SSL ===<br />
Die zentrale Konfiguration von SSL nehmen wir in der /etc/mods-available/ssl.conf vor. Hier besonders:<br />
<br />
SSLCipherSuite EECDH+AESGCM+AES256:EECDH+AES256<br />
SSLCompression Off<br />
SSLProtocol TLSv1.2<br />
SSLHonorCipherOrder On<br />
<br />
=== /etc/apache2/sites-available/000-default-ssl.conf ===<br />
<IfModule mod_ssl.c><br />
<VirtualHost _default_:443><br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined <br />
<br />
# Blocken der Anfragen an eingerichtete Dienste<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
<IfDefine MAILMAN><br />
ScriptAlias /mailman/ /var/www/htdocs/dummy<br />
Alias /mailmanicons/ /var/www/htdocs/dummy<br />
Alias /pipermail/ /var/www/htdocs/dummy<br />
</IfDefine><br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews SymLinksIfOwnerMatch<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
SSLEngine on<br />
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem<br />
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
</VirtualHost><br />
</IfModule><br />
<br />
=== Verzeichnisse ===<br />
Anschließend verlinken wir beide Dateien:<br />
ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/000-default.conf <br />
ln -s /etc/apache2/sites-available/000-default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf <br />
<br />
Anschließend müssen die Verzeichnisse anlegt werden:<br />
mkdir /var/www/htdocs/<br />
mkdir /var/www/vhosts/<br />
mkdir /var/www/vhosts/default<br />
mkdir /var/www/vhosts/default/htdocs<br />
<br />
Und übertragen:<br />
chown -R www-data.www-data /var/www/htdocs<br />
chown -R www-data.www-data /var/www/vhosts<br />
<br />
Configtest:<br />
apache2ctl configtest<br />
<br />
Neustart:<br />
service apache2 restart<br />
<br />
Firewall:<br />
ufw allow 'Apache Full'<br />
<br />
Damit läuft Apache, man kann jetzt testweise eine index.html in /var/www/vhosts/default/htdocs legen und sollte sie beim Aufruf der Serveradresse (IP oder Hostname) sehen.<br />
<br />
=== VHosts ===<br />
Für jede Domain, unter der der Webserver erreichbar sein soll, erstellen wir einen VirtualHost. Dafür stehen zwei Konfigurationsdateien zur Verfügung (reines HTTP und HTTP/HTTPS-Mix). Zur Generierung von Zertifikaten mittels Let's Encrypt nutzen wir den ersten Dummy und ersetzen ihn danach mit dem zweiten. In beiden Dateien muss jeweils der Platzhalter mit der Domain ersetzt werden (in vim: %s/dummy.domain/example.org).<br />
<br />
Die Problematik von SymLinks, die einem nicht gehören, habe ich von [https://blog.jonaspasche.com/2014/07/11/followsymlinks-vs-symlinksifownermatch/ Jonas Pasche] übernommen.<br />
<br />
==== HTTP-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs <br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
==== HTTPS-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
Redirect permanent / https://www.dummy.domain/<br />
# Setze Alias, um die Generierung von Zertifikaten unabhängig vom bisherigen Zertifikat möglich zu machen<br />
Alias /.well-known /var/www/vhosts/dummy.domain/htdocs/.well-known<br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
<VirtualHost *:443><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.lt42.de<br />
SSLEngine on <br />
SSLCertificateFile /etc/letsencrypt/live/dummy.domain/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/dummy.domain/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/dummy.domain/chain.pem<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000" <br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
=== Nextcloud ===<br />
Beim Reimport der Nextcloud-Datenbank kam es zu folgender Fehlermeldung:<br />
ERROR 1071 (42000) at line 151: Specified key was too long; max key length is 767 bytes<br />
<br />
Lösen lässt sich das Problem mit den folgenden Einstellungen in der Datenbank:<br />
set global innodb_large_prefix=on;<br />
set global innodb_file_format=Barracuda;<br />
<br />
== Datenbank-Server ==<br />
Als Datenbank-Server benutze ich MariaDB, um von proprietären Anbietern wegzukommen:<br />
sudo apt-get install mariadb-server php-zip php-bz2 php-mbstring<br />
<br />
Nach einem Hinweis von [https://kofler.info/root-login-problem-mit-mariadb/ Michael Kofler] ist es empfehlenswert, die Standardkonfiguration, die eine Anmeldung von root außerhalb der root-Shell unter Linux verbietet, zu belassen. Wir legen also einen zweiten Administrationsuser an:<br />
mysql<br />
MariaDB [(none)]> GRANT ALL ON *.* 'rooter'@'localhost' IDENTIFIED BY 'newpwd' WITH GRANT OPTION;<br />
<br />
Damit können wir uns dann auch über [https://www.phpmyadmin.net/ PHPMyAdmin] anmelden. Hier wird zusätzlich der root-Login in der Config verboten:<br />
$cfg['Servers'][$i]['AllowRoot'] = false;<br />
<br />
== Mailserver ==<br />
Die Einrichtung des Mailservers ist immer wieder spannend, da bei Updates immer wieder kleine Änderungen durchgeführt werden. Ich verwende Postfix als MTA und Dovecot als IMAP-Server.<br />
Zusätzlich arbeiten wir mit Virtuellen Hosts, damit ein Mailserver für mehrere Domains verantwortlich sein kann. Die Domains und ihre Mail-Accounts können dann über den Postfixadmin bequem im Netz verwaltet werden. Außerdem werden die Mails natürlich gefiltert.<br />
<br />
Zunächst installieren wir Postfix und dessen Anbindung an MySQL:<br />
sudo apt-get install postfix postfix-mysql php-imap<br />
<br />
Falls bei der Installation ein Konfigurations-Dialog auftritt, wählen wir hier einfach erstmal "Keine Konfiguration" aus.<br />
<br />
Dann erstellen wir im MySQL-Server eine neue Datenbank "mail" und einen neuen Benutzer "mail" mit allen Rechten:<br />
root@server:/# mysql<br />
MariaDB [(none)]> CREATE DATABASE mail;<br />
mysql> GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';<br />
mysql> quit<br />
<br />
Die Konfiguration liegt in /etc/postfix wir wechseln also in das Verzeichnis und bearbeiten die (vielleicht neue) Datei main.cf<br />
<br />
root@server:/# cd /etc/postfix<br />
root@server:/# vi main.cf<br />
<br />
Dann richten wir die Datei wie folgt ein (denken Sie dran myhostname und myorigin an Ihre eigenen Bedürfnisse anzupassen).<br />
Mit Dovecot 2.0 hat sich einiges an der SASL-Authentifizierung geändert; das ist hier schon eingearbeitet:<br />
<br />
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)<br />
biff = no<br />
append_dot_mydomain = no<br />
#delay_warning_time = 4h<br />
myhostname = mail.example.com<br />
myorigin = /etc/mailname<br />
mydestination = mydestination = $myhostname, mail.example.com, h23XXXXX.stratoserver.net, localhost.stratoserver.net, localhost<br />
relayhost =<br />
mynetworks = 127.0.0.0/8 [::1]/128<br />
mailbox_size_limit = 0<br />
recipient_delimiter = +<br />
inet_interfaces = all<br />
inet_protocols = ipv4<br />
alias_maps = hash:/etc/aliases<br />
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf<br />
virtual_mailbox_base = /var/vmail<br />
virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf<br />
virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf<br />
virtual_minimum_uid = 150<br />
virtual_uid_maps = static:150<br />
virtual_gid_maps = static:8<br />
virtual_transport = dovecot<br />
smtpd_sasl_type = dovecot<br />
smtpd_sasl_path = private/auth<br />
smtpd_sasl_auth_enable = yes<br />
smtpd_delay_reject = yes<br />
smtpd_helo_required = yes<br />
<br />
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net, reject_unknown_client<br />
<br />
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname<br />
<br />
smtpd_sender_restrictions = reject_unknown_sender_domain<br />
<br />
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination <br />
<br />
<br />
# tls config<br />
#smtpd_use_tls = yes<br />
#smtp_tls_note_starttls_offer = yes<br />
#smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem<br />
#smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem<br />
#smtpd_tls_loglevel = 1<br />
#smtpd_tls_received_header = yes<br />
#smtpd_tls_session_cache_timeout = 3600s<br />
#smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3<br />
#tls_random_source = dev:/dev/urandom<br />
#tls_random_prng_update_period = 3600s<br />
#dovecot_destination_recipient_limit = 1<br />
## Verschlüsselung der Transportebene<br />
#smtpd_tls_security_level = may<br />
#smtp_tls_security_level = may<br />
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku]<br />
<br />
Diese Konfiguration legt die Mails in /var/vmail ab und benutzt den Benutzer vmail mit der UID 150 (legen wir gleich an):<br />
<br />
sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail<br />
sudo mkdir /var/vmail<br />
sudo chmod 770 /var/vmail/<br />
sudo chown vmail:mail /var/vmail/<br />
<br />
Jetzt fangen wir an, die Maps zu konfigurieren. Hiermit bringen wir Postfix bei, wir er die Datenbank nach Mail-Adressen abfragen muss. Dafür müssen wir einige Dateien anlegen:<br />
<br />
sudo touch /etc/postfix/mysql_virtual_alias_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_domains_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_maps.cf<br />
<br />
/etc/postfix/mysql_virtual_alias_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = alias<br />
select_field = goto<br />
where_field = address<br />
additional_conditions = and active = '1'<br />
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_domains_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = domain<br />
select_field = domain<br />
where_field = domain<br />
additional_conditions = and backupmx = '0' and active = '1'<br />
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = quota<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = CONCAT(domain,'/',maildir)<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
Wichtig ist es, hier den Benutzernamen und das Passwort an die MySQL-Einstellungen anzupassen.<br />
<br />
Als letzte Postfix-Konfiguration müssen wir in der master.cf ganz unten die Pipe für Dovecot einrichten:<br />
dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d $(recipient)<br />
submission inet n - - - - smtpd<br />
-o smtpd_tls_security_level=encrypt<br />
-o smtpd_sasl_auth_enable=yes<br />
-o smtpd_sasl_type=dovecot<br />
-o smtpd_sasl_path=private/auth<br />
-o smtpd_sasl_security_options=noanonymous<br />
-o smtpd_sasl_local_domain=$myhostname<br />
-o smtpd_client_restrictions=permit_sasl_authenticated,reject<br />
-o smtpd_sender_login_maps=hash:/etc/postfix/virtual<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject<br />
<br />
Nachdem ich Probleme hatte, Mails mit Thunderbird ordentlich abzuliefern und immer wieder auf den Fehler:<br />
5.7.1 <mail@domain.tld>: Sender address rejected: not owned by user mail@domain.tld<br />
gestoßen bin, ist mir aufgefallen, dass folgende Zeile in der master.cf den Fehler zu verursachen scheint:<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
Sollte der Fehler also auftreten, kommentieren wir diese Zeile einfach aus.<br />
<br />
Gegen die Fehlermeldung, dass die /etc/aliases nicht gefunden wurde, führen wir einmal<br />
sudo newaliases<br />
aus.<br />
<br />
=== Dovecot ===<br />
Nun beginnen wir, den zweiten Teil des Mailservers anzupassen. Hierfür installieren wir Dovecot über apt:<br />
sudo apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql<br />
<br />
Wir können hier auch das Paket "dovecot-pop3d" weglassen, wenn wir keine POP3-Anmeldung am Server brauchen.<br />
<br />
Die Abfrage nach einem SSL-Zertifikat können wir entweder mit Ja beantworten. Dann richtet Dovecot ein selbstsigniertes SSL-Zertifikat ein. Falls wir eines haben, sagen wir Nein.<br />
<br />
Zur Sicherheit sichern wir die originale Konfigurationsdatei via<br />
sudo mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org<br />
<br />
Anschließend können wir mit der Konfiguration von Dovecot unter /etc/dovecot/dovecot.conf beginnen. Diese Konfiguration kann einfach so kopiert werden. Es bringt auch eine SSL-Unterstützung mit, die aber von Haus aus deaktiviert ist. Natürlich müssen der Hostname und der Postmaster angepasst werden.<br />
<br />
auth_mechanisms = plain login<br />
disable_plaintext_auth = no<br />
first_valid_uid = 150<br />
hostname = mail.example.org<br />
last_valid_uid = 150<br />
log_timestamp = "%Y-%m-%d %H:%M:%S "<br />
mail_location = maildir:/var/vmail/%d/%u<br />
passdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
postmaster_address = xxx@example.com<br />
service auth {<br />
unix_listener /var/spool/postfix/private/auth {<br />
group = postfix<br />
mode = 0660<br />
user = postfix<br />
}<br />
unix_listener auth-userdb {<br />
group = mail<br />
mode = 0600<br />
user = vmail<br />
}<br />
}<br />
service imap-login {<br />
executable = imap-login<br />
inet_listener imap {<br />
port = 143<br />
}<br />
}<br />
service pop3-login {<br />
executable = pop3-login<br />
inet_listener pop3 {<br />
port = 110<br />
}<br />
}<br />
# Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden.<br />
ssl = no<br />
#ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem<br />
#ssl_key = </etc/letsencrypt/live/example.org/privkey.pem<br />
userdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
protocol imap {<br />
mail_max_userip_connections = 10<br />
}<br />
protocols = imap pop3<br />
<br />
Nun müssen wir Dovecot nur noch sagen, wie sich Dovecot die Anmelde-Daten beschaffen kann. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot-sql.conf:<br />
<br />
driver = mysql<br />
connect = host=localhost dbname=mail user=mail password=mail<br />
# The new name for MD5 is MD5-CRYPT so you might need to change this depending on version<br />
default_pass_scheme = MD5<br />
# Get the mailbox<br />
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'<br />
# Get the password<br />
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'<br />
# If using client certificates for authentication, comment the above and uncomment the following<br />
#password_query = SELECT null AS password, '%u' AS user<br />
<br />
Hier müssen wir möglicherweise die Felder user= und password= an unsere Zwecke anpassen.<br />
<br />
Dann setzen wir noch die Rechte für Dovecot:<br />
sudo chmod 600 /etc/dovecot/*.conf<br />
sudo chown vmail /etc/dovecot/*.conf<br />
<br />
Dovecot ist jetzt konfiguriert. Momentan noch ohne SSL, aber das kommt später.<br />
<br />
=== Postfix Admin ===<br />
Zum Anlegen der Domains und Postfächer nutzen wir den Postfixadmin, der passenderweise auch gleich das Datenbank-Schema für die gerade erstellte Konfiguration mitbringt.<br />
<br />
Wir laden den [http://sourceforge.net/projects/postfixadmin/ PostfixAdmin] von der Webseite herunter und entpacken ihn in ein eingerichtetes Verzeichnis z.B. einer Subdomain (z.B. mail.<domain>)<br />
<br />
sudo mkdir /var/www/vhosts/mail.<domain>/htdocs<br />
cd /var/www/vhosts/mail.<domain>/htdocs<br />
wget -O pfa.tgz https://sourceforge.net/projects/postfixadmin/files/latest/download<br />
tar xfz pfa.tgz<br />
<br />
Nun passen wir noch den Postfix Admin an unsere Zwecke an. Dazu wechseln wir in das vorhin angelegte Verzeichnis postfixadmin-X.X.X/ und editieren die Standardkonfiguration:<br />
<br />
cd ./postfixadmin-X.X.X/<br />
vi config.inc.php<br />
<br />
Hier passen wir folgende Parameter an:<br />
$CONF['postfix_admin_url'] = ‘'var/www/vhosts/mail.<domain>/postfixadmin/';<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_user'] = 'mail';<br />
$CONF['database_password'] = 'mail';<br />
$CONF['database_name'] = 'mail';<br />
(Natürlich an die eigenen Zwecke angepasst)<br />
<br />
Sind wir mit der Konfiguration fertig, setzen wir den Parameter<br />
$CONF['configured'] = false;<br />
auf true und können unter der angelegten Domain den Installer starten. (postfixadmin/setup.php)<br />
<br />
Hier müssen zwei PHP-Pakete nachinstalliert werden:<br />
sudo apt-get install php-mbstring php-imap<br />
Danach einmal Apache neu laden:<br />
sudo service apache2 reload<br />
<br />
Ist alles installiert, können wir einen Super-Admin einrichten, der alle Domains, Accounts und Administrator-Account im Postfixadmin konfigurieren kann.<br />
<br />
Nun ist der Mailserver eingerichtet. Wir starten nun die Services neu:<br />
<br />
service postfix restart<br />
service dovecot restart<br />
service apache2 restart<br />
service mysql restart<br />
<br />
Nun können wir unter http://mail.example.org/postfixadmin/ einen neuen Benutzer und eine neue Domain anlegen und einige Tests durchführen. Damit ist der Mailserver eingerichtet. <br />
<br />
=== Roundcube ===<br />
RoundCube könnte prinzipiell über die Paketquellen installiert werden. Ich bin hängen geblieben und installiere immer noch manuell mit den Paketen von www.roundcube.net. Wir entpacken das Verzeichnis nach /var/www/htdocs/roundcube, da die Installation ja von allen Domains aus erreichbar sein soll. Seit Version 3.1 bietet Postfix endlich auch eine lokale Installationsdatei an. Dann kann man bequemer Updates einspielen.<br />
<br />
==== /var/www/htdocs/roundcube/config/config.local.php ====<br />
<?php<br />
$CONF['configured'] = true;<br />
<br />
// on submission it will be echoed out to you as a hashed value.<br />
$CONF['setup_password'] = 'changeme';<br />
$CONF['default_language'] = 'de';<br />
<br />
// Database Config<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_host'] = 'localhost';<br />
$CONF['database_user'] = '<benutzer>';<br />
$CONF['database_password'] = '<passwort>';<br />
$CONF['database_name'] = '<datenbank>'; <br />
<br />
$CONF['admin_email'] = 'postmaster@example.de';<br />
$CONF['page_size'] = '20';<br />
<br />
$CONF['default_aliases'] = array (<br />
'abuse' => 'abuse@example.de',<br />
'hostmaster' => 'hostmaster@example.de',<br />
'postmaster' => 'postmaster@example.de',<br />
'webmaster' => 'webmaster@example.de'<br />
);<br />
<br />
$CONF['quota'] = 'YES';<br />
$CONF['footer_text'] = 'Zurück zu example.de';<br />
$CONF['footer_link'] = 'http://example.de';<br />
<br />
// Welcome Message<br />
// This message is send to every newly created mailbox.<br />
// Change the text between EOM.<br />
$CONF['welcome_text'] = <<<EOM<br />
Herzlich Willkommen, <br />
<br />
zum neuen E-Mail Postfach. <br />
<br />
Bei Fragen oder Problemen bitte<br />
Lukas Thiel ansprechen<br />
EOM;<br />
<br />
$CONF['show_undeliverable_exceptions']=array("example.de","lt42.de");<br />
$CONF['used_quotas'] = 'YES';<br />
$CONF['maxquota'] = '2048';<br />
$CONF['domain_quota_default'] = '0';<br />
<br />
Beim ersten Aufruf erschien<br />
ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver<br />
<br />
Nach einem Erstellen des Verzeichnissen und der Anpassung der Rechte an www-data, klappt das aber auch.<br />
<br />
=== Sieve ===<br />
Ich wollte meine Mails gerne mit Hilfe von Sieve filtern. Bisher habe ich die Abwesenheitsbenachrichtigungen immer mit dem Postfixadmin-Virtual-Vacation realisiert, das ist aber unschön. Sieve klingt da schöner und kann auch mehr.<br />
<br />
Zuerst installieren wir das Paket mit APT:<br />
apt-get update<br />
apt-get install dovecot-managesieved<br />
<br />
Dann geht es an die Einrichtung von Dovecot. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot.conf und fügen folgende Zeilen an:<br />
managesieve_notify_capability = mailto<br />
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date<br />
<br />
# Mail-Filterung mit Sieve<br />
service managesieve-login { <br />
inet_listener sieve {<br />
port = 4190<br />
}<br />
}<br />
<br />
protocol lda {<br />
mail_plugins = $mail_plugins sieve<br />
}<br />
<br />
plugin {<br />
sieve = /var/vmail/%d/%n/.dovecot.sieve<br />
sieve_dir = /var/vmail/%d/%n/sieve<br />
}<br />
<br />
Falls Sie Ihre Mails mit LMTP zustellen, muss in der Zeile "protocol lda" natürlich "protocol lmtp" stehen.<br />
<br />
Nun fügen wir sieve noch als Protokoll für Dovecot hinzu. Dazu fügen wir an die Zeile<br />
protocols = imap pop3<br />
noch sieve an, also<br />
protocols = imap pop3 sieve<br />
<br />
Nach einem Neustart von Dovecot, sollte alles funktionieren. Nun geht es an die Erstellung der Filter. Dazu bringt beispielweise Thunderbird ein Tool mit, allerdings finde ich die Lösung per Webmailer wesentlich schöner. Passenderweise bringt auch Roundcube von Haus aus eine Möglichkeit zur Bearbeitung von Sieve-Scripten mit.<br />
<br />
Zum Aktivieren wechseln wir in das Roundcube-Installationsverzeichnis und bearbeiten die config/config.inc.php. Dort muss lediglich folgendes Array erweitert werden:<br />
$config['plugins'] = array('');<br />
wird zu<br />
$config['plugins'] = array('managesieve');<br />
<br />
Wichtig ist, dass der Name mit dem Namen des Ordners in plugins/ übereinstimmt.<br />
Nach der Installation können wir im Roundcube unter Einstellungen/Filter die Filter bearbeiten.<br />
<br />
=== Passwort ändern mit Roundcube ===<br />
Ich wollte schon lange alle möglichen Einstellungen für Benutzer unter ein Dach bringen. Bisher habe ich Benutzern immer einen Link zum Webmailer und einen für den Postfixadmin gegeben, damit sie ihr Passwort ändern können. Doch Roundcube bringt einige spannende Plugins (s.o. Sieve) mit, die diese Arbeit ebenso übernehmen können.<br />
<br />
Für das Ändern des Passwort bedienen wir uns dem mitgelieferten Plugin password. Zuerst kopieren wir uns die Datei plugins/password/config.inc.php.dist (von der Roundcube-Wurzel aus) in plugins/password/config.inc.php und bearbeiten die folgenden zwei Zeilen:<br />
$config['password_db_dsn'] = 'mysql://benutzer:passwort@localhost/db';<br />
$config['password_query'] = 'UPDATE mailbox SET password=%c WHERE username=%u';<br />
<br />
Die Zugangsdaten sind in diesem Fall die gleichen, wie bei Postfix und Dovecot, was naheliegt, da wir ja an die Mail-Datenbank heran wollen. In unserem Fall waren das mail, mail und mail. Im password_query tragen wir dann den SQL-Befehl zum Update des Passwortes ein. Dieses lässt sich aus dem Datenbank-Aufbau erahnen.<br />
<br />
Zum Abschluss speichern wir die Datei und binden das Plugin wie oben auch in der config/config.inc.php in dem Array $config['plugins'] ein. Dann können wir unser Passwort im Roundcube ändern.<br />
<br />
=== Amavis ===<br />
Natürlich sollen die Mails auf SPAM und Viren überprüft werden. Dafür kommt Amavis mit ClamAV (Virenscanner) und SpamAssassin (Spamscanner) zum Einsatz. Die Konfiguration ist trivial und orientiert sich an [[d:Root-Server_mit_Ubuntu_16.04#AmaVis|dieser]]. Zuerst installieren wir mit<br />
sudo apt-get update<br />
sudo apt-get install amavis clamav clamav-daemon spamassassin<br />
<br />
Die Konfiguration muss an einigen Stellen gedreht werden. Zuerst werden die Programme gegenseitig in ihre Gruppen aufgenommen:<br />
<br />
adduser clamav amavis<br />
adduser amavis clamav<br />
<br />
Dann wird die Datei /etc/clamav/clamd.conf etwas angepasst<br />
<br />
# Needed to allow things to work with Amavis, when both amavis and clamav<br />
# users are added to one another's groups.<br />
AllowSupplementaryGroups true<br />
<br />
Viren- und Spamprüfung aktivieren wir dann in /etc/amavis/conf.d/15-content_filter_mode<br />
<br />
use strict;<br />
<br />
# You can modify this file to re-enable SPAM checking through spamassassin<br />
# and to re-enable antivirus checking.<br />
<br />
#<br />
# Default antivirus checking mode<br />
# Please note, that anti-virus checking is DISABLED by<br />
# default.<br />
# If You wish to enable it, please uncomment the following lines: <br />
<br />
@bypass_virus_checks_maps = (<br />
%bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);<br />
<br />
#<br />
# Default SPAM checking mode<br />
# Please note, that anti-spam checking is DISABLED by<br />
# default.<br />
# If You wish to enable it, please uncomment the following lines: <br />
<br />
@bypass_spam_checks_maps = (<br />
%bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);<br />
<br />
1; # ensure a defined return<br />
<br />
<br />
Zusätzlich wird SpamAssassin in einen Daemon-Modus gefahren und es werden nächtliche Aktualisierungen via cron aktiviert:<br />
/etc/default/spamassassin:<br />
# /etc/default/spamassassin<br />
# Duncan Findlay<br />
<br />
# WARNING: please read README.spamd before using.<br />
# There may be security risks.<br />
<br />
# If you're using systemd (default for jessie), the ENABLED setting is<br />
# not used. Instead, enable spamd by issuing:<br />
# systemctl enable spamassassin.service<br />
# Change to "1" to enable spamd on systems using sysvinit:<br />
ENABLED=1<br />
<br />
# Options<br />
# See man spamd for possible options. The -d option is automatically added.<br />
<br />
# SpamAssassin uses a preforking model, so be careful! You need to<br />
# make sure --max-children is not set to anything higher than 5,<br />
# unless you know what you're doing. <br />
<br />
OPTIONS="--create-prefs --max-children 5 --helper-home-dir" <br />
<br />
# Pid file<br />
# Where should spamd write its PID to file? If you use the -u or<br />
# --username option above, this needs to be writable by that user.<br />
# Otherwise, the init script will not be able to shut spamd down.<br />
PIDFILE="/var/run/spamd.pid"<br />
<br />
# Set nice level of spamd<br />
#NICE="--nicelevel 15"<br />
<br />
# Cronjob<br />
# Set to anything but 0 to enable the cron job to automatically update<br />
# spamassassin's rules on a nightly basis<br />
CRON=1<br />
<br />
Nun noch /etc/amavis/conf.d/50-user anpassen, damit die lokalen Domains aus der Datenbank genommen werden:<br />
<br />
use strict;<br />
<br />
#<br />
# Place your configuration directives here. They will override those in<br />
# earlier files.<br />
#<br />
# See /usr/share/doc/amavisd-new/ for documentation and examples of<br />
# the directives you can use in this file<br />
#<br />
<br />
# Three concurrent processes. This should fit into the RAM available on an<br />
# AWS micro instance. This has to match the number of processes specified<br />
# for Amavis in /etc/postfix/master.cf.<br />
$max_servers = 3;<br />
<br />
# Add spam info headers if at or above that level - this ensures they<br />
# are always added.<br />
$sa_tag_level_deflt = -9999;<br />
<br />
# Check the database to see if mail is for local delivery, and thus<br />
# should be spam checked.<br />
@lookup_sql_dsn = (['DBI:mysql:database=postfix;host=127.0.0.1;port=3306', 'postfix', 'assword']);<br />
$sql_select_policy = 'SELECT domain from domain WHERE CONCAT("@",domain) IN (%k)';<br />
$sql_select_white_black_list = undef;<br />
<br />
# Uncomment to bump up the log level when testing.<br />
# $log_level = 2; <br />
<br />
#------------ Do not modify anything below this line ------------- <br />
1; # ensure a defined return<br />
<br />
Spielkram bietet /etc/amavis/conf.d/20-debian_defaults, wo wir mit<br />
# SPAM-Tag in der Betreff-Zeile<br />
$sa_spam_subject_tag = '[AlphaCentauri-Trash SPAM] ';<br />
# Empfänger für Virus-Benachrichtigungen<br />
$virus_admin = "virusadmin\@example.org"; # due to D_DISCARD default<br />
# und die X-Virus-Scanned-Zeile in den Mails beeinflussen können:<br />
$X_HEADER_LINE = "by Thiel-SpamAndVirusFilter Debian $myproduct_name at $mydomain";<br />
<br />
Nach einem Neustart der Dienste mittels<br />
service clamav-freshclam restart<br />
service clamav-daemon restart<br />
service amavis restart<br />
service spamassassin restart<br />
<br />
sollte das System laufen.<br />
<br />
Bei mir mussten noch das Perl-Modul DBD::mysql mittels<br />
sudo cpan<br />
cpan[1] install DBD::mysql<br />
und eine Bibliothek für MySQL mittels<br />
sudo apt-get install libmysqlclient-dev <br />
nachinstalliert werden.<br />
<br />
<br />
Dann geben wir die Ports in der Firewall frei:<br />
sudo ufw allow Postfix<br />
sudo ufw allow "Postfix SMTPS"<br />
sudo ufw allow "Postfix Submission"<br />
sudo ufw allow "Dovecot IMAP"<br />
sudo ufw allow "Dovecot Secure IMAP"</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_18.04&diff=208Root-Server mit Ubuntu 18.042020-03-22T14:56:51Z<p>Lukas: /* Webserver Apache2 */ +Nextcloud</p>
<hr />
<div>Mein [[Root-Server_mit_Ubuntu_16.04-Hetzner|alter Server]] läuft noch mit Ubuntu 16.04. Das ist erstmal kein Problem, der Support läuft noch, allerdings wird die aktuellste PHP-Version nicht unterstützt. Das macht bei einigen Anwendungen nun schon Probleme. Daher habe ich einen zweiten Server in der Serverbörse geordert. Die Rechner sind teurer geworden. Der Rechner ist vergleichbar mit dem alten, kostet aber 6€ mehr. Positiv ist, dass ich dadurch eine Ausfallsicherheit erreichen kann. Ich werde den neuen Server einrichten und anschließend den alten aktualisieren.<br />
<br />
Der neue Rechner hat folgende Daten:<br />
* Intel Core i7-2600 8x 3.40GHz (8x 6823.66 Bogomips)<br />
* 16 GB Arbeitsspeicher<br />
* 2x 3 TB im RAID1-Verbund Festplattenspeicher<br />
<br />
Der Rechner kostet 30€/Monat.<br />
<br />
== Installation ==<br />
Hetzner liefert die Geräte im Rescue-Modus aus. Das ist ein Minimal-Linux mit Tools zur Rettung und dem Skript [https://github.com/hetzneronline/installimage installimage], mit dem eine Betriebssystem-Installation vorgenommen werden kann. Das ist schon mal ein großer Unterschied zu Strato, die die Rechner selber installieren und dann zur Verfügung stellen.<br />
<br />
Der Robot (Kundencenter) von Hetzner bietet allerlei Möglichkeiten, so kann der Rechner bequem mit einem Strg + Alt + Entf-Befehl gefüttert werden oder per ACPI neugestartet werden. Zudem bietet Hetzner die Möglichkeit eines Weckens über LAN (WOL) und man kann bequem eigene Monitoring-Dienste für den Rechner anlegen, sodass man bei Unregelmäßigkeiten per Mail informiert wird.<br />
<br />
Die Installation des Rechners erfolgt dann über den Befehl <code>installimage</code>. Nach einer Auswahl des Betriebssystems kann man über eine Textdatei die RAID-Einstellungen, Festplattenpartitionierung und den Hostnamen konfigurieren. Das macht es besonders einfach, mehrere Rechner zu installieren oder sich die Konfiguration noch einmal abzuspeichern.<br />
<br />
Nach dem Verlassen des Editors installiert der Rechner dann das Grundsystem, während man zugucken kann:<br />
<br />
Hetzner Online GmbH - installimage<br />
<br />
Your server will be installed now, this will take some minutes<br />
You can abort at any time with CTRL+C ...<br />
<br />
: Reading configuration done <br />
: Loading image file variables done <br />
: Loading ubuntu specific functions done <br />
1/16 : Deleting partitions done <br />
2/16 : Test partition size done <br />
3/16 : Creating partitions and /etc/fstab done <br />
4/16 : Creating software RAID level 1 done <br />
5/16 : Formatting partitions<br />
: formatting /dev/md/0 with swap done <br />
: formatting /dev/md/1 with ext2 done <br />
: formatting /dev/md/2 with ext4 done <br />
: formatting /dev/md/3 with xfs done <br />
: formatting /dev/md/4 with ext4 done <br />
: formatting /dev/md/5 with ext4 done <br />
6/16 : Mounting partitions done <br />
7/16 : Sync time via ntp done <br />
: Importing public key for image validation done <br />
8/16 : Validating image before starting extraction done <br />
9/16 : Extracting image (local) done <br />
10/16 : Setting up network config done <br />
11/16 : Executing additional commands<br />
: Setting hostname done <br />
: Generating new SSH keys done <br />
: Generating mdadm config done <br />
: Generating ramdisk done <br />
: Generating ntp config done <br />
12/16 : Setting up miscellaneous files done <br />
13/16 : Configuring authentication<br />
: Fetching SSH keys done <br />
: Disabling root password done <br />
: Disabling SSH root login without password done <br />
: Copying SSH keys done <br />
14/16 : Installing bootloader grub done <br />
15/16 : Running some ubuntu specific functions done <br />
16/16 : Clearing log files done <br />
<br />
INSTALLATION COMPLETE<br />
You can now reboot and log in to your new system with<br />
the same password as you logged in to the rescue system.<br />
<br />
root@rescue ~ # reboot<br />
<br />
Nach dem Neustart steht dann das neue System zur Verfügung. Die Installation hat letztlich mit Lektüre etwa 7 Minuten gedauert. Das ist ein enormer Fortschritt zu anderen Providern.<br />
<br />
== Grundlegendes ==<br />
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Und ein paar Tools:<br />
apt-get install vim htop whois aptitude needrestart git unzip<br />
<br />
== Firewall ==<br />
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:<br />
apt-get install ufw<br />
<br />
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:<br />
ufw allow 22<br />
ufw allow OpenSSH<br />
<br />
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels<br />
ufw enable<br />
zeigt die Firewall auch automatisch Wirkung.<br />
<br />
Überprüfen lässt sich der Status mit<br />
ufw status<br />
bzw.<br />
ufw status numbered<br />
<br />
So können auch Regeln gelöscht werden:<br />
ufw delete 1<br />
<br />
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.<br />
<br />
Damit nicht die syslog mit Firewall-Messages überläuft, deaktivieren wir das Logging in /etc/rsyslog.d/20-ufw.conf, letzte Zeile:<br />
& stop<br />
<br />
== Webserver Apache2 ==<br />
Zur Bereitstellung von Webseiten nutze ich Apache als Webserver mit PHP. Da der Server unter mehreren Namen erreichbar sein wird, richten wir VirtualHosts ein.<br />
<br />
Die Installation läuft denkbar einfach über<br />
<br />
sudo apt-get update<br />
sudo apt-get install apache2 apache2-utils apache2-doc php php-mysql php-pear<br />
<br />
Neben Apache gibt es ein paar Tools, Doku und neben PHP schon die Anbindung für MySQL und Apache. Apache kommt in der Version 2.4.29, bei PHP wird Version 7.2 installiert.<br />
<br />
Nach der Installation geht es an die eigentliche Konfiguration des Webservers. Ziel ist es, das eine Reihe von Anwendungen (Roundcube, PHPMyAdmin, etc.) nur einmal installiert werden müssen und dann allen eingerichteten Domains zur Verfügung stehen. Gleichzeitig sollen Dummies, die den Server über seine IP oder einen nicht vorhandenen Namen ansprechen, keine Dienste nutzen können, sondern lediglich eine Fehler-Seite sehen. Die folgende Konfiguration habe ich in Teilen in ihrer Version vom 12. November 2014 aus dem [[d:Root-Server_mit_OpenSuSE_13.1|Debacher-Wiki]] entnommen (CC-BY-SA). Wir legen also eine Grundkonfiguration für jeden "dummen" Aufruf an.<br />
<br />
Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen.<br />
Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis:<br />
mkdir /var/www/htdocs<br />
mkdir /var/www/vhosts<br />
mkdir /var/www/vhosts/default<br />
mv /var/www/html /var/www/vhosts/default/htdocs<br />
<br />
Wichtig ist, dass wir die Datei vorher einmal sichern:<br />
<br />
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.org<br />
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org<br />
<br />
Dann noch einige Apache-Module aktivieren:<br />
<br />
a2enmod ssl headers cgi rewrite auth_basic authz_groupfile<br />
<br />
=== /etc/apache2/sites-available/000-default.conf ===<br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
ServerTokens Prod <br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
Alias /webmail /var/www/htdocs/roundcube<br />
Alias /roundcube /var/www/htdocs/roundcube<br />
Alias /pma /var/www/htdocs/pma<br />
Alias /webftp /var/www/htdocs/webftp<br />
<br />
<VirtualHost *:80><br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/vhosts/default/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
# Verhindern des Zugriffs auf die CGI-Skripte<br />
<Directory "/var/www/cgi-bin/"><br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Deny from all <br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /cgi-bin /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
</VirtualHost><br />
<br />
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet<br />
<br />
=== SSL ===<br />
Die zentrale Konfiguration von SSL nehmen wir in der /etc/mods-available/ssl.conf vor. Hier besonders:<br />
<br />
SSLCipherSuite SSLCipherSuite EECDH+AESGCM+AES256:EECDH+AES256<br />
SSLCompression Off<br />
SSLProtocol TLSv1.2<br />
SSLHonorCipherOrder On<br />
<br />
=== /etc/apache2/sites-available/000-default-ssl.conf ===<br />
<IfModule mod_ssl.c><br />
<VirtualHost _default_:443><br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined <br />
<br />
# Blocken der Anfragen an eingerichtete Dienste<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
<IfDefine MAILMAN><br />
ScriptAlias /mailman/ /var/www/htdocs/dummy<br />
Alias /mailmanicons/ /var/www/htdocs/dummy<br />
Alias /pipermail/ /var/www/htdocs/dummy<br />
</IfDefine><br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews SymLinksIfOwnerMatch<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
SSLEngine on<br />
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem<br />
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
</VirtualHost><br />
</IfModule><br />
<br />
=== Verzeichnisse ===<br />
Anschließend verlinken wir beide Dateien:<br />
ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/000-default.conf <br />
ln -s /etc/apache2/sites-available/000-default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf <br />
<br />
Anschließend müssen die Verzeichnisse anlegt werden:<br />
mkdir /var/www/htdocs/<br />
mkdir /var/www/vhosts/<br />
mkdir /var/www/vhosts/default<br />
mkdir /var/www/vhosts/default/htdocs<br />
<br />
Und übertragen:<br />
chown -R www-data.www-data /var/www/htdocs<br />
chown -R www-data.www-data /var/www/vhosts<br />
<br />
Configtest:<br />
apache2ctl configtest<br />
<br />
Neustart:<br />
service apache2 restart<br />
<br />
Firewall:<br />
ufw allow 'Apache Full'<br />
<br />
Damit läuft Apache, man kann jetzt testweise eine index.html in /var/www/vhosts/default/htdocs legen und sollte sie beim Aufruf der Serveradresse (IP oder Hostname) sehen.<br />
<br />
=== VHosts ===<br />
Für jede Domain, unter der der Webserver erreichbar sein soll, erstellen wir einen VirtualHost. Dafür stehen zwei Konfigurationsdateien zur Verfügung (reines HTTP und HTTP/HTTPS-Mix). Zur Generierung von Zertifikaten mittels Let's Encrypt nutzen wir den ersten Dummy und ersetzen ihn danach mit dem zweiten. In beiden Dateien muss jeweils der Platzhalter mit der Domain ersetzt werden (in vim: %s/dummy.domain/example.org).<br />
<br />
Die Problematik von SymLinks, die einem nicht gehören, habe ich von [https://blog.jonaspasche.com/2014/07/11/followsymlinks-vs-symlinksifownermatch/ Jonas Pasche] übernommen.<br />
<br />
==== HTTP-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs <br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
==== HTTPS-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
Redirect permanent / https://www.dummy.domain/<br />
# Setze Alias, um die Generierung von Zertifikaten unabhängig vom bisherigen Zertifikat möglich zu machen<br />
Alias /.well-known /var/www/vhosts/dummy.domain/htdocs/.well-known<br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
<VirtualHost *:443><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.lt42.de<br />
SSLEngine on <br />
SSLCertificateFile /etc/letsencrypt/live/dummy.domain/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/dummy.domain/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/dummy.domain/chain.pem<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000" <br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
=== Nextcloud ===<br />
Beim Reimport der Nextcloud-Datenbank kam es zu folgender Fehlermeldung:<br />
ERROR 1071 (42000) at line 151: Specified key was too long; max key length is 767 bytes<br />
<br />
Lösen lässt sich das Problem mit den folgenden Einstellungen in der Datenbank:<br />
set global innodb_large_prefix=on;<br />
set global innodb_file_format=Barracuda;<br />
<br />
== Datenbank-Server ==<br />
Als Datenbank-Server benutze ich MariaDB, um von proprietären Anbietern wegzukommen:<br />
sudo apt-get install mariadb-server php-zip php-bz2 php-mbstring<br />
<br />
Nach einem Hinweis von [https://kofler.info/root-login-problem-mit-mariadb/ Michael Kofler] ist es empfehlenswert, die Standardkonfiguration, die eine Anmeldung von root außerhalb der root-Shell unter Linux verbietet, zu belassen. Wir legen also einen zweiten Administrationsuser an:<br />
mysql<br />
MariaDB [(none)]> GRANT ALL ON *.* 'rooter'@'localhost' IDENTIFIED BY 'newpwd' WITH GRANT OPTION;<br />
<br />
Damit können wir uns dann auch über [https://www.phpmyadmin.net/ PHPMyAdmin] anmelden. Hier wird zusätzlich der root-Login in der Config verboten:<br />
$cfg['Servers'][$i]['AllowRoot'] = false;<br />
<br />
== Mailserver ==<br />
Die Einrichtung des Mailservers ist immer wieder spannend, da bei Updates immer wieder kleine Änderungen durchgeführt werden. Ich verwende Postfix als MTA und Dovecot als IMAP-Server.<br />
Zusätzlich arbeiten wir mit Virtuellen Hosts, damit ein Mailserver für mehrere Domains verantwortlich sein kann. Die Domains und ihre Mail-Accounts können dann über den Postfixadmin bequem im Netz verwaltet werden. Außerdem werden die Mails natürlich gefiltert.<br />
<br />
Zunächst installieren wir Postfix und dessen Anbindung an MySQL:<br />
sudo apt-get install postfix postfix-mysql php-imap<br />
<br />
Falls bei der Installation ein Konfigurations-Dialog auftritt, wählen wir hier einfach erstmal "Keine Konfiguration" aus.<br />
<br />
Dann erstellen wir im MySQL-Server eine neue Datenbank "mail" und einen neuen Benutzer "mail" mit allen Rechten:<br />
root@server:/# mysql<br />
MariaDB [(none)]> CREATE DATABASE mail;<br />
mysql> GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';<br />
mysql> quit<br />
<br />
Die Konfiguration liegt in /etc/postfix wir wechseln also in das Verzeichnis und bearbeiten die (vielleicht neue) Datei main.cf<br />
<br />
root@server:/# cd /etc/postfix<br />
root@server:/# vi main.cf<br />
<br />
Dann richten wir die Datei wie folgt ein (denken Sie dran myhostname und myorigin an Ihre eigenen Bedürfnisse anzupassen).<br />
Mit Dovecot 2.0 hat sich einiges an der SASL-Authentifizierung geändert; das ist hier schon eingearbeitet:<br />
<br />
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)<br />
biff = no<br />
append_dot_mydomain = no<br />
#delay_warning_time = 4h<br />
myhostname = mail.example.com<br />
myorigin = /etc/mailname<br />
mydestination = mydestination = $myhostname, mail.example.com, h23XXXXX.stratoserver.net, localhost.stratoserver.net, localhost<br />
relayhost =<br />
mynetworks = 127.0.0.0/8 [::1]/128<br />
mailbox_size_limit = 0<br />
recipient_delimiter = +<br />
inet_interfaces = all<br />
inet_protocols = ipv4<br />
alias_maps = hash:/etc/aliases<br />
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf<br />
virtual_mailbox_base = /var/vmail<br />
virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf<br />
virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf<br />
virtual_minimum_uid = 150<br />
virtual_uid_maps = static:150<br />
virtual_gid_maps = static:8<br />
virtual_transport = dovecot<br />
smtpd_sasl_type = dovecot<br />
smtpd_sasl_path = private/auth<br />
smtpd_sasl_auth_enable = yes<br />
smtpd_delay_reject = yes<br />
smtpd_helo_required = yes<br />
<br />
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net, reject_unknown_client<br />
<br />
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname<br />
<br />
smtpd_sender_restrictions = reject_unknown_sender_domain<br />
<br />
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination <br />
<br />
<br />
# tls config<br />
#smtpd_use_tls = yes<br />
#smtp_tls_note_starttls_offer = yes<br />
#smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem<br />
#smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem<br />
#smtpd_tls_loglevel = 1<br />
#smtpd_tls_received_header = yes<br />
#smtpd_tls_session_cache_timeout = 3600s<br />
#smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3<br />
#tls_random_source = dev:/dev/urandom<br />
#tls_random_prng_update_period = 3600s<br />
#dovecot_destination_recipient_limit = 1<br />
## Verschlüsselung der Transportebene<br />
#smtpd_tls_security_level = may<br />
#smtp_tls_security_level = may<br />
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku]<br />
<br />
Diese Konfiguration legt die Mails in /var/vmail ab und benutzt den Benutzer vmail mit der UID 150 (legen wir gleich an):<br />
<br />
sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail<br />
sudo mkdir /var/vmail<br />
sudo chmod 770 /var/vmail/<br />
sudo chown vmail:mail /var/vmail/<br />
<br />
Jetzt fangen wir an, die Maps zu konfigurieren. Hiermit bringen wir Postfix bei, wir er die Datenbank nach Mail-Adressen abfragen muss. Dafür müssen wir einige Dateien anlegen:<br />
<br />
sudo touch /etc/postfix/mysql_virtual_alias_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_domains_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_maps.cf<br />
<br />
/etc/postfix/mysql_virtual_alias_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = alias<br />
select_field = goto<br />
where_field = address<br />
additional_conditions = and active = '1'<br />
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_domains_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = domain<br />
select_field = domain<br />
where_field = domain<br />
additional_conditions = and backupmx = '0' and active = '1'<br />
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = quota<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = CONCAT(domain,'/',maildir)<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
Wichtig ist es, hier den Benutzernamen und das Passwort an die MySQL-Einstellungen anzupassen.<br />
<br />
Als letzte Postfix-Konfiguration müssen wir in der master.cf ganz unten die Pipe für Dovecot einrichten:<br />
dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d $(recipient)<br />
submission inet n - - - - smtpd<br />
-o smtpd_tls_security_level=encrypt<br />
-o smtpd_sasl_auth_enable=yes<br />
-o smtpd_sasl_type=dovecot<br />
-o smtpd_sasl_path=private/auth<br />
-o smtpd_sasl_security_options=noanonymous<br />
-o smtpd_sasl_local_domain=$myhostname<br />
-o smtpd_client_restrictions=permit_sasl_authenticated,reject<br />
-o smtpd_sender_login_maps=hash:/etc/postfix/virtual<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject<br />
<br />
Nachdem ich Probleme hatte, Mails mit Thunderbird ordentlich abzuliefern und immer wieder auf den Fehler:<br />
5.7.1 <mail@domain.tld>: Sender address rejected: not owned by user mail@domain.tld<br />
gestoßen bin, ist mir aufgefallen, dass folgende Zeile in der master.cf den Fehler zu verursachen scheint:<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
Sollte der Fehler also auftreten, kommentieren wir diese Zeile einfach aus.<br />
<br />
Gegen die Fehlermeldung, dass die /etc/aliases nicht gefunden wurde, führen wir einmal<br />
sudo newaliases<br />
aus.<br />
<br />
=== Dovecot ===<br />
Nun beginnen wir, den zweiten Teil des Mailservers anzupassen. Hierfür installieren wir Dovecot über apt:<br />
sudo apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql<br />
<br />
Wir können hier auch das Paket "dovecot-pop3d" weglassen, wenn wir keine POP3-Anmeldung am Server brauchen.<br />
<br />
Die Abfrage nach einem SSL-Zertifikat können wir entweder mit Ja beantworten. Dann richtet Dovecot ein selbstsigniertes SSL-Zertifikat ein. Falls wir eines haben, sagen wir Nein.<br />
<br />
Zur Sicherheit sichern wir die originale Konfigurationsdatei via<br />
sudo mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org<br />
<br />
Anschließend können wir mit der Konfiguration von Dovecot unter /etc/dovecot/dovecot.conf beginnen. Diese Konfiguration kann einfach so kopiert werden. Es bringt auch eine SSL-Unterstützung mit, die aber von Haus aus deaktiviert ist. Natürlich müssen der Hostname und der Postmaster angepasst werden.<br />
<br />
auth_mechanisms = plain login<br />
disable_plaintext_auth = no<br />
first_valid_uid = 150<br />
hostname = mail.example.org<br />
last_valid_uid = 150<br />
log_timestamp = "%Y-%m-%d %H:%M:%S "<br />
mail_location = maildir:/var/vmail/%d/%u<br />
passdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
postmaster_address = xxx@example.com<br />
service auth {<br />
unix_listener /var/spool/postfix/private/auth {<br />
group = postfix<br />
mode = 0660<br />
user = postfix<br />
}<br />
unix_listener auth-userdb {<br />
group = mail<br />
mode = 0600<br />
user = vmail<br />
}<br />
}<br />
service imap-login {<br />
executable = imap-login<br />
inet_listener imap {<br />
port = 143<br />
}<br />
}<br />
service pop3-login {<br />
executable = pop3-login<br />
inet_listener pop3 {<br />
port = 110<br />
}<br />
}<br />
# Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden.<br />
ssl = no<br />
#ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem<br />
#ssl_key = </etc/letsencrypt/live/example.org/privkey.pem<br />
userdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
protocol imap {<br />
mail_max_userip_connections = 10<br />
}<br />
protocols = imap pop3<br />
<br />
Nun müssen wir Dovecot nur noch sagen, wie sich Dovecot die Anmelde-Daten beschaffen kann. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot-sql.conf:<br />
<br />
driver = mysql<br />
connect = host=localhost dbname=mail user=mail password=mail<br />
# The new name for MD5 is MD5-CRYPT so you might need to change this depending on version<br />
default_pass_scheme = MD5<br />
# Get the mailbox<br />
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'<br />
# Get the password<br />
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'<br />
# If using client certificates for authentication, comment the above and uncomment the following<br />
#password_query = SELECT null AS password, '%u' AS user<br />
<br />
Hier müssen wir möglicherweise die Felder user= und password= an unsere Zwecke anpassen.<br />
<br />
Dann setzen wir noch die Rechte für Dovecot:<br />
sudo chmod 600 /etc/dovecot/*.conf<br />
sudo chown vmail /etc/dovecot/*.conf<br />
<br />
Dovecot ist jetzt konfiguriert. Momentan noch ohne SSL, aber das kommt später.<br />
<br />
=== Postfix Admin ===<br />
Zum Anlegen der Domains und Postfächer nutzen wir den Postfixadmin, der passenderweise auch gleich das Datenbank-Schema für die gerade erstellte Konfiguration mitbringt.<br />
<br />
Wir laden den [http://sourceforge.net/projects/postfixadmin/ PostfixAdmin] von der Webseite herunter und entpacken ihn in ein eingerichtetes Verzeichnis z.B. einer Subdomain (z.B. mail.<domain>)<br />
<br />
sudo mkdir /var/www/vhosts/mail.<domain>/htdocs<br />
cd /var/www/vhosts/mail.<domain>/htdocs<br />
wget -O pfa.tgz https://sourceforge.net/projects/postfixadmin/files/latest/download<br />
tar xfz pfa.tgz<br />
<br />
Nun passen wir noch den Postfix Admin an unsere Zwecke an. Dazu wechseln wir in das vorhin angelegte Verzeichnis postfixadmin-X.X.X/ und editieren die Standardkonfiguration:<br />
<br />
cd ./postfixadmin-X.X.X/<br />
vi config.inc.php<br />
<br />
Hier passen wir folgende Parameter an:<br />
$CONF['postfix_admin_url'] = ‘'var/www/vhosts/mail.<domain>/postfixadmin/';<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_user'] = 'mail';<br />
$CONF['database_password'] = 'mail';<br />
$CONF['database_name'] = 'mail';<br />
(Natürlich an die eigenen Zwecke angepasst)<br />
<br />
Sind wir mit der Konfiguration fertig, setzen wir den Parameter<br />
$CONF['configured'] = false;<br />
auf true und können unter der angelegten Domain den Installer starten. (postfixadmin/setup.php)<br />
<br />
Hier müssen zwei PHP-Pakete nachinstalliert werden:<br />
sudo apt-get install php-mbstring php-imap<br />
Danach einmal Apache neu laden:<br />
sudo service apache2 reload<br />
<br />
Ist alles installiert, können wir einen Super-Admin einrichten, der alle Domains, Accounts und Administrator-Account im Postfixadmin konfigurieren kann.<br />
<br />
Nun ist der Mailserver eingerichtet. Wir starten nun die Services neu:<br />
<br />
service postfix restart<br />
service dovecot restart<br />
service apache2 restart<br />
service mysql restart<br />
<br />
Nun können wir unter http://mail.example.org/postfixadmin/ einen neuen Benutzer und eine neue Domain anlegen und einige Tests durchführen. Damit ist der Mailserver eingerichtet. <br />
<br />
=== Roundcube ===<br />
RoundCube könnte prinzipiell über die Paketquellen installiert werden. Ich bin hängen geblieben und installiere immer noch manuell mit den Paketen von www.roundcube.net. Wir entpacken das Verzeichnis nach /var/www/htdocs/roundcube, da die Installation ja von allen Domains aus erreichbar sein soll. Seit Version 3.1 bietet Postfix endlich auch eine lokale Installationsdatei an. Dann kann man bequemer Updates einspielen.<br />
<br />
==== /var/www/htdocs/roundcube/config/config.local.php ====<br />
<?php<br />
$CONF['configured'] = true;<br />
<br />
// on submission it will be echoed out to you as a hashed value.<br />
$CONF['setup_password'] = 'changeme';<br />
$CONF['default_language'] = 'de';<br />
<br />
// Database Config<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_host'] = 'localhost';<br />
$CONF['database_user'] = '<benutzer>';<br />
$CONF['database_password'] = '<passwort>';<br />
$CONF['database_name'] = '<datenbank>'; <br />
<br />
$CONF['admin_email'] = 'postmaster@example.de';<br />
$CONF['page_size'] = '20';<br />
<br />
$CONF['default_aliases'] = array (<br />
'abuse' => 'abuse@example.de',<br />
'hostmaster' => 'hostmaster@example.de',<br />
'postmaster' => 'postmaster@example.de',<br />
'webmaster' => 'webmaster@example.de'<br />
);<br />
<br />
$CONF['quota'] = 'YES';<br />
$CONF['footer_text'] = 'Zurück zu example.de';<br />
$CONF['footer_link'] = 'http://example.de';<br />
<br />
// Welcome Message<br />
// This message is send to every newly created mailbox.<br />
// Change the text between EOM.<br />
$CONF['welcome_text'] = <<<EOM<br />
Herzlich Willkommen, <br />
<br />
zum neuen E-Mail Postfach. <br />
<br />
Bei Fragen oder Problemen bitte<br />
Lukas Thiel ansprechen<br />
EOM;<br />
<br />
$CONF['show_undeliverable_exceptions']=array("example.de","lt42.de");<br />
$CONF['used_quotas'] = 'YES';<br />
$CONF['maxquota'] = '2048';<br />
$CONF['domain_quota_default'] = '0';<br />
<br />
Beim ersten Aufruf erschien<br />
ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver<br />
<br />
Nach einem Erstellen des Verzeichnissen und der Anpassung der Rechte an www-data, klappt das aber auch.<br />
<br />
=== Sieve ===<br />
Ich wollte meine Mails gerne mit Hilfe von Sieve filtern. Bisher habe ich die Abwesenheitsbenachrichtigungen immer mit dem Postfixadmin-Virtual-Vacation realisiert, das ist aber unschön. Sieve klingt da schöner und kann auch mehr.<br />
<br />
Zuerst installieren wir das Paket mit APT:<br />
apt-get update<br />
apt-get install dovecot-managesieved<br />
<br />
Dann geht es an die Einrichtung von Dovecot. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot.conf und fügen folgende Zeilen an:<br />
managesieve_notify_capability = mailto<br />
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date<br />
<br />
# Mail-Filterung mit Sieve<br />
service managesieve-login { <br />
inet_listener sieve {<br />
port = 4190<br />
}<br />
}<br />
<br />
protocol lda {<br />
mail_plugins = $mail_plugins sieve<br />
}<br />
<br />
plugin {<br />
sieve = /var/vmail/%d/%n/.dovecot.sieve<br />
sieve_dir = /var/vmail/%d/%n/sieve<br />
}<br />
<br />
Falls Sie Ihre Mails mit LMTP zustellen, muss in der Zeile "protocol lda" natürlich "protocol lmtp" stehen.<br />
<br />
Nun fügen wir sieve noch als Protokoll für Dovecot hinzu. Dazu fügen wir an die Zeile<br />
protocols = imap pop3<br />
noch sieve an, also<br />
protocols = imap pop3 sieve<br />
<br />
Nach einem Neustart von Dovecot, sollte alles funktionieren. Nun geht es an die Erstellung der Filter. Dazu bringt beispielweise Thunderbird ein Tool mit, allerdings finde ich die Lösung per Webmailer wesentlich schöner. Passenderweise bringt auch Roundcube von Haus aus eine Möglichkeit zur Bearbeitung von Sieve-Scripten mit.<br />
<br />
Zum Aktivieren wechseln wir in das Roundcube-Installationsverzeichnis und bearbeiten die config/config.inc.php. Dort muss lediglich folgendes Array erweitert werden:<br />
$config['plugins'] = array('');<br />
wird zu<br />
$config['plugins'] = array('managesieve');<br />
<br />
Wichtig ist, dass der Name mit dem Namen des Ordners in plugins/ übereinstimmt.<br />
Nach der Installation können wir im Roundcube unter Einstellungen/Filter die Filter bearbeiten.<br />
<br />
=== Passwort ändern mit Roundcube ===<br />
Ich wollte schon lange alle möglichen Einstellungen für Benutzer unter ein Dach bringen. Bisher habe ich Benutzern immer einen Link zum Webmailer und einen für den Postfixadmin gegeben, damit sie ihr Passwort ändern können. Doch Roundcube bringt einige spannende Plugins (s.o. Sieve) mit, die diese Arbeit ebenso übernehmen können.<br />
<br />
Für das Ändern des Passwort bedienen wir uns dem mitgelieferten Plugin password. Zuerst kopieren wir uns die Datei plugins/password/config.inc.php.dist (von der Roundcube-Wurzel aus) in plugins/password/config.inc.php und bearbeiten die folgenden zwei Zeilen:<br />
$config['password_db_dsn'] = 'mysql://benutzer:passwort@localhost/db';<br />
$config['password_query'] = 'UPDATE mailbox SET password=%c WHERE username=%u';<br />
<br />
Die Zugangsdaten sind in diesem Fall die gleichen, wie bei Postfix und Dovecot, was naheliegt, da wir ja an die Mail-Datenbank heran wollen. In unserem Fall waren das mail, mail und mail. Im password_query tragen wir dann den SQL-Befehl zum Update des Passwortes ein. Dieses lässt sich aus dem Datenbank-Aufbau erahnen.<br />
<br />
Zum Abschluss speichern wir die Datei und binden das Plugin wie oben auch in der config/config.inc.php in dem Array $config['plugins'] ein. Dann können wir unser Passwort im Roundcube ändern.<br />
<br />
=== Amavis ===<br />
Natürlich sollen die Mails auf SPAM und Viren überprüft werden. Dafür kommt Amavis mit ClamAV (Virenscanner) und SpamAssassin (Spamscanner) zum Einsatz. Die Konfiguration ist trivial und orientiert sich an [[d:Root-Server_mit_Ubuntu_16.04#AmaVis|dieser]]. Zuerst installieren wir mit<br />
sudo apt-get update<br />
sudo apt-get install amavis clamav clamav-daemon spamassassin<br />
<br />
Die Konfiguration muss an einigen Stellen gedreht werden. Zuerst werden die Programme gegenseitig in ihre Gruppen aufgenommen:<br />
<br />
adduser clamav amavis<br />
adduser amavis clamav<br />
<br />
Dann wird die Datei /etc/clamav/clamd.conf etwas angepasst<br />
<br />
# Needed to allow things to work with Amavis, when both amavis and clamav<br />
# users are added to one another's groups.<br />
AllowSupplementaryGroups true<br />
<br />
Viren- und Spamprüfung aktivieren wir dann in /etc/amavis/conf.d/15-content_filter_mode<br />
<br />
use strict;<br />
<br />
# You can modify this file to re-enable SPAM checking through spamassassin<br />
# and to re-enable antivirus checking.<br />
<br />
#<br />
# Default antivirus checking mode<br />
# Please note, that anti-virus checking is DISABLED by<br />
# default.<br />
# If You wish to enable it, please uncomment the following lines: <br />
<br />
@bypass_virus_checks_maps = (<br />
%bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);<br />
<br />
#<br />
# Default SPAM checking mode<br />
# Please note, that anti-spam checking is DISABLED by<br />
# default.<br />
# If You wish to enable it, please uncomment the following lines: <br />
<br />
@bypass_spam_checks_maps = (<br />
%bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);<br />
<br />
1; # ensure a defined return<br />
<br />
<br />
Zusätzlich wird SpamAssassin in einen Daemon-Modus gefahren und es werden nächtliche Aktualisierungen via cron aktiviert:<br />
/etc/default/spamassassin:<br />
# /etc/default/spamassassin<br />
# Duncan Findlay<br />
<br />
# WARNING: please read README.spamd before using.<br />
# There may be security risks.<br />
<br />
# If you're using systemd (default for jessie), the ENABLED setting is<br />
# not used. Instead, enable spamd by issuing:<br />
# systemctl enable spamassassin.service<br />
# Change to "1" to enable spamd on systems using sysvinit:<br />
ENABLED=1<br />
<br />
# Options<br />
# See man spamd for possible options. The -d option is automatically added.<br />
<br />
# SpamAssassin uses a preforking model, so be careful! You need to<br />
# make sure --max-children is not set to anything higher than 5,<br />
# unless you know what you're doing. <br />
<br />
OPTIONS="--create-prefs --max-children 5 --helper-home-dir" <br />
<br />
# Pid file<br />
# Where should spamd write its PID to file? If you use the -u or<br />
# --username option above, this needs to be writable by that user.<br />
# Otherwise, the init script will not be able to shut spamd down.<br />
PIDFILE="/var/run/spamd.pid"<br />
<br />
# Set nice level of spamd<br />
#NICE="--nicelevel 15"<br />
<br />
# Cronjob<br />
# Set to anything but 0 to enable the cron job to automatically update<br />
# spamassassin's rules on a nightly basis<br />
CRON=1<br />
<br />
Nun noch /etc/amavis/conf.d/50-user anpassen, damit die lokalen Domains aus der Datenbank genommen werden:<br />
<br />
use strict;<br />
<br />
#<br />
# Place your configuration directives here. They will override those in<br />
# earlier files.<br />
#<br />
# See /usr/share/doc/amavisd-new/ for documentation and examples of<br />
# the directives you can use in this file<br />
#<br />
<br />
# Three concurrent processes. This should fit into the RAM available on an<br />
# AWS micro instance. This has to match the number of processes specified<br />
# for Amavis in /etc/postfix/master.cf.<br />
$max_servers = 3;<br />
<br />
# Add spam info headers if at or above that level - this ensures they<br />
# are always added.<br />
$sa_tag_level_deflt = -9999;<br />
<br />
# Check the database to see if mail is for local delivery, and thus<br />
# should be spam checked.<br />
@lookup_sql_dsn = (['DBI:mysql:database=postfix;host=127.0.0.1;port=3306', 'postfix', 'assword']);<br />
$sql_select_policy = 'SELECT domain from domain WHERE CONCAT("@",domain) IN (%k)';<br />
$sql_select_white_black_list = undef;<br />
<br />
# Uncomment to bump up the log level when testing.<br />
# $log_level = 2; <br />
<br />
#------------ Do not modify anything below this line ------------- <br />
1; # ensure a defined return<br />
<br />
Spielkram bietet /etc/amavis/conf.d/20-debian_defaults, wo wir mit<br />
# SPAM-Tag in der Betreff-Zeile<br />
$sa_spam_subject_tag = '[AlphaCentauri-Trash SPAM] ';<br />
# Empfänger für Virus-Benachrichtigungen<br />
$virus_admin = "virusadmin\@example.org"; # due to D_DISCARD default<br />
# und die X-Virus-Scanned-Zeile in den Mails beeinflussen können:<br />
$X_HEADER_LINE = "by Thiel-SpamAndVirusFilter Debian $myproduct_name at $mydomain";<br />
<br />
Nach einem Neustart der Dienste mittels<br />
service clamav-freshclam restart<br />
service clamav-daemon restart<br />
service amavis restart<br />
service spamassassin restart<br />
<br />
sollte das System laufen.<br />
<br />
Bei mir mussten noch das Perl-Modul DBD::mysql mittels<br />
sudo cpan<br />
cpan[1] install DBD::mysql<br />
und eine Bibliothek für MySQL mittels<br />
sudo apt-get install libmysqlclient-dev <br />
nachinstalliert werden.<br />
<br />
<br />
Dann geben wir die Ports in der Firewall frei:<br />
sudo ufw allow Postfix<br />
sudo ufw allow "Postfix SMTPS"<br />
sudo ufw allow "Postfix Submission"<br />
sudo ufw allow "Dovecot IMAP"<br />
sudo ufw allow "Dovecot Secure IMAP"</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=OpenVPN&diff=207OpenVPN2020-03-20T15:48:39Z<p>Lukas: </p>
<hr />
<div>Ich hatte bei der Konfiguration von OpenVPN gem. der [https://wiki.debian.org/OpenVPN#TLS-enabled_VPN Anleitung von Debian] zwei Probleme:<br />
1. ließ sich der Server nicht starten, OpenVPN startete zwar durch, die Serverkonfiguration wurde aber nicht geladen. Liegt die Datei in /etc/openvpn/server.conf, ist der SystemD-Prozess der folgende: openvpn@server<br />
damit ist eine Abfrage so korrekt:<br />
systemctl status openvpn@server<br />
<br />
Dabei hat dann Keith (https://askubuntu.com/questions/747023/systemd-fails-to-start-openvpn-in-lxd-managed-16-04-container) geholfen. In /lib/systemd/system/openvpn@.service muss<br />
LimitNPROC=10<br />
auskommentiert werden.<br />
<br />
2. es wurde unabhängig der Einstellung in server.conf oder client.conf der gesamte Traffic unter Ubuntu in den Tunnel geroutet. Der NetworkManager macht das automatisch. Unterbinden lässt sich dieses Verhalten in den Einstellungen der VPN-Verbindung -> IPv4-Einstellungen -> Routen.. -> Haken setzen bei "Diese Verbindung nur für Ressourcen dieses Netzwerkes verwenden". (https://serverfault.com/questions/887106/openvpn-use-clients-internet-connection-not-tunnel-for-general-web)</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=OpenVPN&diff=206OpenVPN2020-03-20T15:48:23Z<p>Lukas: Die Seite wurde neu angelegt: „Ich hatte bei der Konfiguration von OpenVPN gem. der [https://wiki.debian.org/OpenVPN#TLS-enabled_VPN Anleitung von Debian] zwei Probleme: 1. ließ sich der Se…“</p>
<hr />
<div>Ich hatte bei der Konfiguration von OpenVPN gem. der [https://wiki.debian.org/OpenVPN#TLS-enabled_VPN Anleitung von Debian] zwei Probleme:<br />
1. ließ sich der Server nicht starten, OpenVPN startete zwar durch, die Serverkonfiguration wurde aber nicht geladen. Liegt die Datei in /etc/openvpn/server.conf, ist der SystemD-Prozess der folgende: openvpn@server<br />
damit ist eine Abfrage so korrekt:<br />
systemctl status openvpn@server<br />
<br />
Dabei hat dann Keith (https://askubuntu.com/questions/747023/systemd-fails-to-start-openvpn-in-lxd-managed-16-04-container) geholfen. In /lib/systemd/system/openvpn@.service muss<br />
LimitNPROC=10<br />
auskommentiert werden.<br />
<br />
2. es wurde unabhängig der Einstellung in server.conf oder client.conf der gesamte Traffic unter Ubuntu in den Tunnel geroutet. Der NetworkManager macht das automatisch. Unterbinden lässt sich dieses Verhalten in den Einstellungen der VPN-Verbindung -> IPv4-Einstellungen -> Routen.. -> Haken setzen bei "Diese Verbindung nur für Ressourcen dieses Netzwerkes verwenden".</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_18.04&diff=205Root-Server mit Ubuntu 18.042020-01-04T20:25:34Z<p>Lukas: /* Webserver Apache2 */</p>
<hr />
<div>Mein [[Root-Server_mit_Ubuntu_16.04-Hetzner|alter Server]] läuft noch mit Ubuntu 16.04. Das ist erstmal kein Problem, der Support läuft noch, allerdings wird die aktuellste PHP-Version nicht unterstützt. Das macht bei einigen Anwendungen nun schon Probleme. Daher habe ich einen zweiten Server in der Serverbörse geordert. Die Rechner sind teurer geworden. Der Rechner ist vergleichbar mit dem alten, kostet aber 6€ mehr. Positiv ist, dass ich dadurch eine Ausfallsicherheit erreichen kann. Ich werde den neuen Server einrichten und anschließend den alten aktualisieren.<br />
<br />
Der neue Rechner hat folgende Daten:<br />
* Intel Core i7-2600 8x 3.40GHz (8x 6823.66 Bogomips)<br />
* 16 GB Arbeitsspeicher<br />
* 2x 3 TB im RAID1-Verbund Festplattenspeicher<br />
<br />
Der Rechner kostet 30€/Monat.<br />
<br />
== Installation ==<br />
Hetzner liefert die Geräte im Rescue-Modus aus. Das ist ein Minimal-Linux mit Tools zur Rettung und dem Skript [https://github.com/hetzneronline/installimage installimage], mit dem eine Betriebssystem-Installation vorgenommen werden kann. Das ist schon mal ein großer Unterschied zu Strato, die die Rechner selber installieren und dann zur Verfügung stellen.<br />
<br />
Der Robot (Kundencenter) von Hetzner bietet allerlei Möglichkeiten, so kann der Rechner bequem mit einem Strg + Alt + Entf-Befehl gefüttert werden oder per ACPI neugestartet werden. Zudem bietet Hetzner die Möglichkeit eines Weckens über LAN (WOL) und man kann bequem eigene Monitoring-Dienste für den Rechner anlegen, sodass man bei Unregelmäßigkeiten per Mail informiert wird.<br />
<br />
Die Installation des Rechners erfolgt dann über den Befehl <code>installimage</code>. Nach einer Auswahl des Betriebssystems kann man über eine Textdatei die RAID-Einstellungen, Festplattenpartitionierung und den Hostnamen konfigurieren. Das macht es besonders einfach, mehrere Rechner zu installieren oder sich die Konfiguration noch einmal abzuspeichern.<br />
<br />
Nach dem Verlassen des Editors installiert der Rechner dann das Grundsystem, während man zugucken kann:<br />
<br />
Hetzner Online GmbH - installimage<br />
<br />
Your server will be installed now, this will take some minutes<br />
You can abort at any time with CTRL+C ...<br />
<br />
: Reading configuration done <br />
: Loading image file variables done <br />
: Loading ubuntu specific functions done <br />
1/16 : Deleting partitions done <br />
2/16 : Test partition size done <br />
3/16 : Creating partitions and /etc/fstab done <br />
4/16 : Creating software RAID level 1 done <br />
5/16 : Formatting partitions<br />
: formatting /dev/md/0 with swap done <br />
: formatting /dev/md/1 with ext2 done <br />
: formatting /dev/md/2 with ext4 done <br />
: formatting /dev/md/3 with xfs done <br />
: formatting /dev/md/4 with ext4 done <br />
: formatting /dev/md/5 with ext4 done <br />
6/16 : Mounting partitions done <br />
7/16 : Sync time via ntp done <br />
: Importing public key for image validation done <br />
8/16 : Validating image before starting extraction done <br />
9/16 : Extracting image (local) done <br />
10/16 : Setting up network config done <br />
11/16 : Executing additional commands<br />
: Setting hostname done <br />
: Generating new SSH keys done <br />
: Generating mdadm config done <br />
: Generating ramdisk done <br />
: Generating ntp config done <br />
12/16 : Setting up miscellaneous files done <br />
13/16 : Configuring authentication<br />
: Fetching SSH keys done <br />
: Disabling root password done <br />
: Disabling SSH root login without password done <br />
: Copying SSH keys done <br />
14/16 : Installing bootloader grub done <br />
15/16 : Running some ubuntu specific functions done <br />
16/16 : Clearing log files done <br />
<br />
INSTALLATION COMPLETE<br />
You can now reboot and log in to your new system with<br />
the same password as you logged in to the rescue system.<br />
<br />
root@rescue ~ # reboot<br />
<br />
Nach dem Neustart steht dann das neue System zur Verfügung. Die Installation hat letztlich mit Lektüre etwa 7 Minuten gedauert. Das ist ein enormer Fortschritt zu anderen Providern.<br />
<br />
== Grundlegendes ==<br />
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Und ein paar Tools:<br />
apt-get install vim htop whois aptitude needrestart git unzip<br />
<br />
== Firewall ==<br />
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:<br />
apt-get install ufw<br />
<br />
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:<br />
ufw allow 22<br />
ufw allow OpenSSH<br />
<br />
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels<br />
ufw enable<br />
zeigt die Firewall auch automatisch Wirkung.<br />
<br />
Überprüfen lässt sich der Status mit<br />
ufw status<br />
bzw.<br />
ufw status numbered<br />
<br />
So können auch Regeln gelöscht werden:<br />
ufw delete 1<br />
<br />
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.<br />
<br />
Damit nicht die syslog mit Firewall-Messages überläuft, deaktivieren wir das Logging in /etc/rsyslog.d/20-ufw.conf, letzte Zeile:<br />
& stop<br />
<br />
== Webserver Apache2 ==<br />
Zur Bereitstellung von Webseiten nutze ich Apache als Webserver mit PHP. Da der Server unter mehreren Namen erreichbar sein wird, richten wir VirtualHosts ein.<br />
<br />
Die Installation läuft denkbar einfach über<br />
<br />
sudo apt-get update<br />
sudo apt-get install apache2 apache2-utils apache2-doc php php-mysql php-pear<br />
<br />
Neben Apache gibt es ein paar Tools, Doku und neben PHP schon die Anbindung für MySQL und Apache. Apache kommt in der Version 2.4.29, bei PHP wird Version 7.2 installiert.<br />
<br />
Nach der Installation geht es an die eigentliche Konfiguration des Webservers. Ziel ist es, das eine Reihe von Anwendungen (Roundcube, PHPMyAdmin, etc.) nur einmal installiert werden müssen und dann allen eingerichteten Domains zur Verfügung stehen. Gleichzeitig sollen Dummies, die den Server über seine IP oder einen nicht vorhandenen Namen ansprechen, keine Dienste nutzen können, sondern lediglich eine Fehler-Seite sehen. Die folgende Konfiguration habe ich in Teilen in ihrer Version vom 12. November 2014 aus dem [[d:Root-Server_mit_OpenSuSE_13.1|Debacher-Wiki]] entnommen (CC-BY-SA). Wir legen also eine Grundkonfiguration für jeden "dummen" Aufruf an.<br />
<br />
Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen.<br />
Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis:<br />
mkdir /var/www/htdocs<br />
mkdir /var/www/vhosts<br />
mkdir /var/www/vhosts/default<br />
mv /var/www/html /var/www/vhosts/default/htdocs<br />
<br />
Wichtig ist, dass wir die Datei vorher einmal sichern:<br />
<br />
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.org<br />
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org<br />
<br />
Dann noch einige Apache-Module aktivieren:<br />
<br />
a2enmod ssl headers cgi rewrite auth_basic authz_groupfile<br />
<br />
=== /etc/apache2/sites-available/000-default.conf ===<br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
ServerTokens Prod <br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
Alias /webmail /var/www/htdocs/roundcube<br />
Alias /roundcube /var/www/htdocs/roundcube<br />
Alias /pma /var/www/htdocs/pma<br />
Alias /webftp /var/www/htdocs/webftp<br />
<br />
<VirtualHost *:80><br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/vhosts/default/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
# Verhindern des Zugriffs auf die CGI-Skripte<br />
<Directory "/var/www/cgi-bin/"><br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Deny from all <br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /cgi-bin /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
</VirtualHost><br />
<br />
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet<br />
<br />
=== SSL ===<br />
Die zentrale Konfiguration von SSL nehmen wir in der /etc/mods-available/ssl.conf vor. Hier besonders:<br />
<br />
SSLCipherSuite SSLCipherSuite EECDH+AESGCM+AES256:EECDH+AES256<br />
SSLCompression Off<br />
SSLProtocol TLSv1.2<br />
SSLHonorCipherOrder On<br />
<br />
=== /etc/apache2/sites-available/000-default-ssl.conf ===<br />
<IfModule mod_ssl.c><br />
<VirtualHost _default_:443><br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined <br />
<br />
# Blocken der Anfragen an eingerichtete Dienste<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
<IfDefine MAILMAN><br />
ScriptAlias /mailman/ /var/www/htdocs/dummy<br />
Alias /mailmanicons/ /var/www/htdocs/dummy<br />
Alias /pipermail/ /var/www/htdocs/dummy<br />
</IfDefine><br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews SymLinksIfOwnerMatch<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
SSLEngine on<br />
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem<br />
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
</VirtualHost><br />
</IfModule><br />
<br />
=== Verzeichnisse ===<br />
Anschließend verlinken wir beide Dateien:<br />
ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/000-default.conf <br />
ln -s /etc/apache2/sites-available/000-default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf <br />
<br />
Anschließend müssen die Verzeichnisse anlegt werden:<br />
mkdir /var/www/htdocs/<br />
mkdir /var/www/vhosts/<br />
mkdir /var/www/vhosts/default<br />
mkdir /var/www/vhosts/default/htdocs<br />
<br />
Und übertragen:<br />
chown -R www-data.www-data /var/www/htdocs<br />
chown -R www-data.www-data /var/www/vhosts<br />
<br />
Configtest:<br />
apache2ctl configtest<br />
<br />
Neustart:<br />
service apache2 restart<br />
<br />
Firewall:<br />
ufw allow 'Apache Full'<br />
<br />
Damit läuft Apache, man kann jetzt testweise eine index.html in /var/www/vhosts/default/htdocs legen und sollte sie beim Aufruf der Serveradresse (IP oder Hostname) sehen.<br />
<br />
=== VHosts ===<br />
Für jede Domain, unter der der Webserver erreichbar sein soll, erstellen wir einen VirtualHost. Dafür stehen zwei Konfigurationsdateien zur Verfügung (reines HTTP und HTTP/HTTPS-Mix). Zur Generierung von Zertifikaten mittels Let's Encrypt nutzen wir den ersten Dummy und ersetzen ihn danach mit dem zweiten. In beiden Dateien muss jeweils der Platzhalter mit der Domain ersetzt werden (in vim: %s/dummy.domain/example.org).<br />
<br />
Die Problematik von SymLinks, die einem nicht gehören, habe ich von [https://blog.jonaspasche.com/2014/07/11/followsymlinks-vs-symlinksifownermatch/ Jonas Pasche] übernommen.<br />
<br />
==== HTTP-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs <br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
==== HTTPS-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
Redirect permanent / https://www.dummy.domain/<br />
# Setze Alias, um die Generierung von Zertifikaten unabhängig vom bisherigen Zertifikat möglich zu machen<br />
Alias /.well-known /var/www/vhosts/dummy.domain/htdocs/.well-known<br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
<VirtualHost *:443><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.lt42.de<br />
SSLEngine on <br />
SSLCertificateFile /etc/letsencrypt/live/dummy.domain/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/dummy.domain/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/dummy.domain/chain.pem<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000" <br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
== Datenbank-Server ==<br />
Als Datenbank-Server benutze ich MariaDB, um von proprietären Anbietern wegzukommen:<br />
sudo apt-get install mariadb-server php-zip php-bz2 php-mbstring<br />
<br />
Nach einem Hinweis von [https://kofler.info/root-login-problem-mit-mariadb/ Michael Kofler] ist es empfehlenswert, die Standardkonfiguration, die eine Anmeldung von root außerhalb der root-Shell unter Linux verbietet, zu belassen. Wir legen also einen zweiten Administrationsuser an:<br />
mysql<br />
MariaDB [(none)]> GRANT ALL ON *.* 'rooter'@'localhost' IDENTIFIED BY 'newpwd' WITH GRANT OPTION;<br />
<br />
Damit können wir uns dann auch über [https://www.phpmyadmin.net/ PHPMyAdmin] anmelden. Hier wird zusätzlich der root-Login in der Config verboten:<br />
$cfg['Servers'][$i]['AllowRoot'] = false;<br />
<br />
== Mailserver ==<br />
Die Einrichtung des Mailservers ist immer wieder spannend, da bei Updates immer wieder kleine Änderungen durchgeführt werden. Ich verwende Postfix als MTA und Dovecot als IMAP-Server.<br />
Zusätzlich arbeiten wir mit Virtuellen Hosts, damit ein Mailserver für mehrere Domains verantwortlich sein kann. Die Domains und ihre Mail-Accounts können dann über den Postfixadmin bequem im Netz verwaltet werden. Außerdem werden die Mails natürlich gefiltert.<br />
<br />
Zunächst installieren wir Postfix und dessen Anbindung an MySQL:<br />
sudo apt-get install postfix postfix-mysql php-imap<br />
<br />
Falls bei der Installation ein Konfigurations-Dialog auftritt, wählen wir hier einfach erstmal "Keine Konfiguration" aus.<br />
<br />
Dann erstellen wir im MySQL-Server eine neue Datenbank "mail" und einen neuen Benutzer "mail" mit allen Rechten:<br />
root@server:/# mysql<br />
MariaDB [(none)]> CREATE DATABASE mail;<br />
mysql> GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';<br />
mysql> quit<br />
<br />
Die Konfiguration liegt in /etc/postfix wir wechseln also in das Verzeichnis und bearbeiten die (vielleicht neue) Datei main.cf<br />
<br />
root@server:/# cd /etc/postfix<br />
root@server:/# vi main.cf<br />
<br />
Dann richten wir die Datei wie folgt ein (denken Sie dran myhostname und myorigin an Ihre eigenen Bedürfnisse anzupassen).<br />
Mit Dovecot 2.0 hat sich einiges an der SASL-Authentifizierung geändert; das ist hier schon eingearbeitet:<br />
<br />
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)<br />
biff = no<br />
append_dot_mydomain = no<br />
#delay_warning_time = 4h<br />
myhostname = mail.example.com<br />
myorigin = /etc/mailname<br />
mydestination = mydestination = $myhostname, mail.example.com, h23XXXXX.stratoserver.net, localhost.stratoserver.net, localhost<br />
relayhost =<br />
mynetworks = 127.0.0.0/8 [::1]/128<br />
mailbox_size_limit = 0<br />
recipient_delimiter = +<br />
inet_interfaces = all<br />
inet_protocols = ipv4<br />
alias_maps = hash:/etc/aliases<br />
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf<br />
virtual_mailbox_base = /var/vmail<br />
virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf<br />
virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf<br />
virtual_minimum_uid = 150<br />
virtual_uid_maps = static:150<br />
virtual_gid_maps = static:8<br />
virtual_transport = dovecot<br />
smtpd_sasl_type = dovecot<br />
smtpd_sasl_path = private/auth<br />
smtpd_sasl_auth_enable = yes<br />
smtpd_delay_reject = yes<br />
smtpd_helo_required = yes<br />
<br />
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net, reject_unknown_client<br />
<br />
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname<br />
<br />
smtpd_sender_restrictions = reject_unknown_sender_domain<br />
<br />
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination <br />
<br />
<br />
# tls config<br />
#smtpd_use_tls = yes<br />
#smtp_tls_note_starttls_offer = yes<br />
#smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem<br />
#smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem<br />
#smtpd_tls_loglevel = 1<br />
#smtpd_tls_received_header = yes<br />
#smtpd_tls_session_cache_timeout = 3600s<br />
#smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3<br />
#tls_random_source = dev:/dev/urandom<br />
#tls_random_prng_update_period = 3600s<br />
#dovecot_destination_recipient_limit = 1<br />
## Verschlüsselung der Transportebene<br />
#smtpd_tls_security_level = may<br />
#smtp_tls_security_level = may<br />
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku]<br />
<br />
Diese Konfiguration legt die Mails in /var/vmail ab und benutzt den Benutzer vmail mit der UID 150 (legen wir gleich an):<br />
<br />
sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail<br />
sudo mkdir /var/vmail<br />
sudo chmod 770 /var/vmail/<br />
sudo chown vmail:mail /var/vmail/<br />
<br />
Jetzt fangen wir an, die Maps zu konfigurieren. Hiermit bringen wir Postfix bei, wir er die Datenbank nach Mail-Adressen abfragen muss. Dafür müssen wir einige Dateien anlegen:<br />
<br />
sudo touch /etc/postfix/mysql_virtual_alias_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_domains_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_maps.cf<br />
<br />
/etc/postfix/mysql_virtual_alias_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = alias<br />
select_field = goto<br />
where_field = address<br />
additional_conditions = and active = '1'<br />
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_domains_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = domain<br />
select_field = domain<br />
where_field = domain<br />
additional_conditions = and backupmx = '0' and active = '1'<br />
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = quota<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = CONCAT(domain,'/',maildir)<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
Wichtig ist es, hier den Benutzernamen und das Passwort an die MySQL-Einstellungen anzupassen.<br />
<br />
Als letzte Postfix-Konfiguration müssen wir in der master.cf ganz unten die Pipe für Dovecot einrichten:<br />
dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d $(recipient)<br />
submission inet n - - - - smtpd<br />
-o smtpd_tls_security_level=encrypt<br />
-o smtpd_sasl_auth_enable=yes<br />
-o smtpd_sasl_type=dovecot<br />
-o smtpd_sasl_path=private/auth<br />
-o smtpd_sasl_security_options=noanonymous<br />
-o smtpd_sasl_local_domain=$myhostname<br />
-o smtpd_client_restrictions=permit_sasl_authenticated,reject<br />
-o smtpd_sender_login_maps=hash:/etc/postfix/virtual<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject<br />
<br />
Nachdem ich Probleme hatte, Mails mit Thunderbird ordentlich abzuliefern und immer wieder auf den Fehler:<br />
5.7.1 <mail@domain.tld>: Sender address rejected: not owned by user mail@domain.tld<br />
gestoßen bin, ist mir aufgefallen, dass folgende Zeile in der master.cf den Fehler zu verursachen scheint:<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
Sollte der Fehler also auftreten, kommentieren wir diese Zeile einfach aus.<br />
<br />
Gegen die Fehlermeldung, dass die /etc/aliases nicht gefunden wurde, führen wir einmal<br />
sudo newaliases<br />
aus.<br />
<br />
=== Dovecot ===<br />
Nun beginnen wir, den zweiten Teil des Mailservers anzupassen. Hierfür installieren wir Dovecot über apt:<br />
sudo apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql<br />
<br />
Wir können hier auch das Paket "dovecot-pop3d" weglassen, wenn wir keine POP3-Anmeldung am Server brauchen.<br />
<br />
Die Abfrage nach einem SSL-Zertifikat können wir entweder mit Ja beantworten. Dann richtet Dovecot ein selbstsigniertes SSL-Zertifikat ein. Falls wir eines haben, sagen wir Nein.<br />
<br />
Zur Sicherheit sichern wir die originale Konfigurationsdatei via<br />
sudo mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org<br />
<br />
Anschließend können wir mit der Konfiguration von Dovecot unter /etc/dovecot/dovecot.conf beginnen. Diese Konfiguration kann einfach so kopiert werden. Es bringt auch eine SSL-Unterstützung mit, die aber von Haus aus deaktiviert ist. Natürlich müssen der Hostname und der Postmaster angepasst werden.<br />
<br />
auth_mechanisms = plain login<br />
disable_plaintext_auth = no<br />
first_valid_uid = 150<br />
hostname = mail.example.org<br />
last_valid_uid = 150<br />
log_timestamp = "%Y-%m-%d %H:%M:%S "<br />
mail_location = maildir:/var/vmail/%d/%u<br />
passdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
postmaster_address = xxx@example.com<br />
service auth {<br />
unix_listener /var/spool/postfix/private/auth {<br />
group = postfix<br />
mode = 0660<br />
user = postfix<br />
}<br />
unix_listener auth-userdb {<br />
group = mail<br />
mode = 0600<br />
user = vmail<br />
}<br />
}<br />
service imap-login {<br />
executable = imap-login<br />
inet_listener imap {<br />
port = 143<br />
}<br />
}<br />
service pop3-login {<br />
executable = pop3-login<br />
inet_listener pop3 {<br />
port = 110<br />
}<br />
}<br />
# Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden.<br />
ssl = no<br />
#ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem<br />
#ssl_key = </etc/letsencrypt/live/example.org/privkey.pem<br />
userdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
protocol imap {<br />
mail_max_userip_connections = 10<br />
}<br />
protocols = imap pop3<br />
<br />
Nun müssen wir Dovecot nur noch sagen, wie sich Dovecot die Anmelde-Daten beschaffen kann. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot-sql.conf:<br />
<br />
driver = mysql<br />
connect = host=localhost dbname=mail user=mail password=mail<br />
# The new name for MD5 is MD5-CRYPT so you might need to change this depending on version<br />
default_pass_scheme = MD5<br />
# Get the mailbox<br />
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'<br />
# Get the password<br />
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'<br />
# If using client certificates for authentication, comment the above and uncomment the following<br />
#password_query = SELECT null AS password, '%u' AS user<br />
<br />
Hier müssen wir möglicherweise die Felder user= und password= an unsere Zwecke anpassen.<br />
<br />
Dann setzen wir noch die Rechte für Dovecot:<br />
sudo chmod 600 /etc/dovecot/*.conf<br />
sudo chown vmail /etc/dovecot/*.conf<br />
<br />
Dovecot ist jetzt konfiguriert. Momentan noch ohne SSL, aber das kommt später.<br />
<br />
=== Postfix Admin ===<br />
Zum Anlegen der Domains und Postfächer nutzen wir den Postfixadmin, der passenderweise auch gleich das Datenbank-Schema für die gerade erstellte Konfiguration mitbringt.<br />
<br />
Wir laden den [http://sourceforge.net/projects/postfixadmin/ PostfixAdmin] von der Webseite herunter und entpacken ihn in ein eingerichtetes Verzeichnis z.B. einer Subdomain (z.B. mail.<domain>)<br />
<br />
sudo mkdir /var/www/vhosts/mail.<domain>/htdocs<br />
cd /var/www/vhosts/mail.<domain>/htdocs<br />
wget -O pfa.tgz https://sourceforge.net/projects/postfixadmin/files/latest/download<br />
tar xfz pfa.tgz<br />
<br />
Nun passen wir noch den Postfix Admin an unsere Zwecke an. Dazu wechseln wir in das vorhin angelegte Verzeichnis postfixadmin-X.X.X/ und editieren die Standardkonfiguration:<br />
<br />
cd ./postfixadmin-X.X.X/<br />
vi config.inc.php<br />
<br />
Hier passen wir folgende Parameter an:<br />
$CONF['postfix_admin_url'] = ‘'var/www/vhosts/mail.<domain>/postfixadmin/';<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_user'] = 'mail';<br />
$CONF['database_password'] = 'mail';<br />
$CONF['database_name'] = 'mail';<br />
(Natürlich an die eigenen Zwecke angepasst)<br />
<br />
Sind wir mit der Konfiguration fertig, setzen wir den Parameter<br />
$CONF['configured'] = false;<br />
auf true und können unter der angelegten Domain den Installer starten. (postfixadmin/setup.php)<br />
<br />
Hier müssen zwei PHP-Pakete nachinstalliert werden:<br />
sudo apt-get install php-mbstring php-imap<br />
Danach einmal Apache neu laden:<br />
sudo service apache2 reload<br />
<br />
Ist alles installiert, können wir einen Super-Admin einrichten, der alle Domains, Accounts und Administrator-Account im Postfixadmin konfigurieren kann.<br />
<br />
Nun ist der Mailserver eingerichtet. Wir starten nun die Services neu:<br />
<br />
service postfix restart<br />
service dovecot restart<br />
service apache2 restart<br />
service mysql restart<br />
<br />
Nun können wir unter http://mail.example.org/postfixadmin/ einen neuen Benutzer und eine neue Domain anlegen und einige Tests durchführen. Damit ist der Mailserver eingerichtet. <br />
<br />
=== Roundcube ===<br />
RoundCube könnte prinzipiell über die Paketquellen installiert werden. Ich bin hängen geblieben und installiere immer noch manuell mit den Paketen von www.roundcube.net. Wir entpacken das Verzeichnis nach /var/www/htdocs/roundcube, da die Installation ja von allen Domains aus erreichbar sein soll. Seit Version 3.1 bietet Postfix endlich auch eine lokale Installationsdatei an. Dann kann man bequemer Updates einspielen.<br />
<br />
==== /var/www/htdocs/roundcube/config/config.local.php ====<br />
<?php<br />
$CONF['configured'] = true;<br />
<br />
// on submission it will be echoed out to you as a hashed value.<br />
$CONF['setup_password'] = 'changeme';<br />
$CONF['default_language'] = 'de';<br />
<br />
// Database Config<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_host'] = 'localhost';<br />
$CONF['database_user'] = '<benutzer>';<br />
$CONF['database_password'] = '<passwort>';<br />
$CONF['database_name'] = '<datenbank>'; <br />
<br />
$CONF['admin_email'] = 'postmaster@example.de';<br />
$CONF['page_size'] = '20';<br />
<br />
$CONF['default_aliases'] = array (<br />
'abuse' => 'abuse@example.de',<br />
'hostmaster' => 'hostmaster@example.de',<br />
'postmaster' => 'postmaster@example.de',<br />
'webmaster' => 'webmaster@example.de'<br />
);<br />
<br />
$CONF['quota'] = 'YES';<br />
$CONF['footer_text'] = 'Zurück zu example.de';<br />
$CONF['footer_link'] = 'http://example.de';<br />
<br />
// Welcome Message<br />
// This message is send to every newly created mailbox.<br />
// Change the text between EOM.<br />
$CONF['welcome_text'] = <<<EOM<br />
Herzlich Willkommen, <br />
<br />
zum neuen E-Mail Postfach. <br />
<br />
Bei Fragen oder Problemen bitte<br />
Lukas Thiel ansprechen<br />
EOM;<br />
<br />
$CONF['show_undeliverable_exceptions']=array("example.de","lt42.de");<br />
$CONF['used_quotas'] = 'YES';<br />
$CONF['maxquota'] = '2048';<br />
$CONF['domain_quota_default'] = '0';<br />
<br />
Beim ersten Aufruf erschien<br />
ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver<br />
<br />
Nach einem Erstellen des Verzeichnissen und der Anpassung der Rechte an www-data, klappt das aber auch.<br />
<br />
=== Sieve ===<br />
Ich wollte meine Mails gerne mit Hilfe von Sieve filtern. Bisher habe ich die Abwesenheitsbenachrichtigungen immer mit dem Postfixadmin-Virtual-Vacation realisiert, das ist aber unschön. Sieve klingt da schöner und kann auch mehr.<br />
<br />
Zuerst installieren wir das Paket mit APT:<br />
apt-get update<br />
apt-get install dovecot-managesieved<br />
<br />
Dann geht es an die Einrichtung von Dovecot. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot.conf und fügen folgende Zeilen an:<br />
managesieve_notify_capability = mailto<br />
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date<br />
<br />
# Mail-Filterung mit Sieve<br />
service managesieve-login { <br />
inet_listener sieve {<br />
port = 4190<br />
}<br />
}<br />
<br />
protocol lda {<br />
mail_plugins = $mail_plugins sieve<br />
}<br />
<br />
plugin {<br />
sieve = /var/vmail/%d/%n/.dovecot.sieve<br />
sieve_dir = /var/vmail/%d/%n/sieve<br />
}<br />
<br />
Falls Sie Ihre Mails mit LMTP zustellen, muss in der Zeile "protocol lda" natürlich "protocol lmtp" stehen.<br />
<br />
Nun fügen wir sieve noch als Protokoll für Dovecot hinzu. Dazu fügen wir an die Zeile<br />
protocols = imap pop3<br />
noch sieve an, also<br />
protocols = imap pop3 sieve<br />
<br />
Nach einem Neustart von Dovecot, sollte alles funktionieren. Nun geht es an die Erstellung der Filter. Dazu bringt beispielweise Thunderbird ein Tool mit, allerdings finde ich die Lösung per Webmailer wesentlich schöner. Passenderweise bringt auch Roundcube von Haus aus eine Möglichkeit zur Bearbeitung von Sieve-Scripten mit.<br />
<br />
Zum Aktivieren wechseln wir in das Roundcube-Installationsverzeichnis und bearbeiten die config/config.inc.php. Dort muss lediglich folgendes Array erweitert werden:<br />
$config['plugins'] = array('');<br />
wird zu<br />
$config['plugins'] = array('managesieve');<br />
<br />
Wichtig ist, dass der Name mit dem Namen des Ordners in plugins/ übereinstimmt.<br />
Nach der Installation können wir im Roundcube unter Einstellungen/Filter die Filter bearbeiten.<br />
<br />
=== Passwort ändern mit Roundcube ===<br />
Ich wollte schon lange alle möglichen Einstellungen für Benutzer unter ein Dach bringen. Bisher habe ich Benutzern immer einen Link zum Webmailer und einen für den Postfixadmin gegeben, damit sie ihr Passwort ändern können. Doch Roundcube bringt einige spannende Plugins (s.o. Sieve) mit, die diese Arbeit ebenso übernehmen können.<br />
<br />
Für das Ändern des Passwort bedienen wir uns dem mitgelieferten Plugin password. Zuerst kopieren wir uns die Datei plugins/password/config.inc.php.dist (von der Roundcube-Wurzel aus) in plugins/password/config.inc.php und bearbeiten die folgenden zwei Zeilen:<br />
$config['password_db_dsn'] = 'mysql://benutzer:passwort@localhost/db';<br />
$config['password_query'] = 'UPDATE mailbox SET password=%c WHERE username=%u';<br />
<br />
Die Zugangsdaten sind in diesem Fall die gleichen, wie bei Postfix und Dovecot, was naheliegt, da wir ja an die Mail-Datenbank heran wollen. In unserem Fall waren das mail, mail und mail. Im password_query tragen wir dann den SQL-Befehl zum Update des Passwortes ein. Dieses lässt sich aus dem Datenbank-Aufbau erahnen.<br />
<br />
Zum Abschluss speichern wir die Datei und binden das Plugin wie oben auch in der config/config.inc.php in dem Array $config['plugins'] ein. Dann können wir unser Passwort im Roundcube ändern.<br />
<br />
=== Amavis ===<br />
Natürlich sollen die Mails auf SPAM und Viren überprüft werden. Dafür kommt Amavis mit ClamAV (Virenscanner) und SpamAssassin (Spamscanner) zum Einsatz. Die Konfiguration ist trivial und orientiert sich an [[d:Root-Server_mit_Ubuntu_16.04#AmaVis|dieser]]. Zuerst installieren wir mit<br />
sudo apt-get update<br />
sudo apt-get install amavis clamav clamav-daemon spamassassin<br />
<br />
Die Konfiguration muss an einigen Stellen gedreht werden. Zuerst werden die Programme gegenseitig in ihre Gruppen aufgenommen:<br />
<br />
adduser clamav amavis<br />
adduser amavis clamav<br />
<br />
Dann wird die Datei /etc/clamav/clamd.conf etwas angepasst<br />
<br />
# Needed to allow things to work with Amavis, when both amavis and clamav<br />
# users are added to one another's groups.<br />
AllowSupplementaryGroups true<br />
<br />
Viren- und Spamprüfung aktivieren wir dann in /etc/amavis/conf.d/15-content_filter_mode<br />
<br />
use strict;<br />
<br />
# You can modify this file to re-enable SPAM checking through spamassassin<br />
# and to re-enable antivirus checking.<br />
<br />
#<br />
# Default antivirus checking mode<br />
# Please note, that anti-virus checking is DISABLED by<br />
# default.<br />
# If You wish to enable it, please uncomment the following lines: <br />
<br />
@bypass_virus_checks_maps = (<br />
%bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);<br />
<br />
#<br />
# Default SPAM checking mode<br />
# Please note, that anti-spam checking is DISABLED by<br />
# default.<br />
# If You wish to enable it, please uncomment the following lines: <br />
<br />
@bypass_spam_checks_maps = (<br />
%bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);<br />
<br />
1; # ensure a defined return<br />
<br />
<br />
Zusätzlich wird SpamAssassin in einen Daemon-Modus gefahren und es werden nächtliche Aktualisierungen via cron aktiviert:<br />
/etc/default/spamassassin:<br />
# /etc/default/spamassassin<br />
# Duncan Findlay<br />
<br />
# WARNING: please read README.spamd before using.<br />
# There may be security risks.<br />
<br />
# If you're using systemd (default for jessie), the ENABLED setting is<br />
# not used. Instead, enable spamd by issuing:<br />
# systemctl enable spamassassin.service<br />
# Change to "1" to enable spamd on systems using sysvinit:<br />
ENABLED=1<br />
<br />
# Options<br />
# See man spamd for possible options. The -d option is automatically added.<br />
<br />
# SpamAssassin uses a preforking model, so be careful! You need to<br />
# make sure --max-children is not set to anything higher than 5,<br />
# unless you know what you're doing. <br />
<br />
OPTIONS="--create-prefs --max-children 5 --helper-home-dir" <br />
<br />
# Pid file<br />
# Where should spamd write its PID to file? If you use the -u or<br />
# --username option above, this needs to be writable by that user.<br />
# Otherwise, the init script will not be able to shut spamd down.<br />
PIDFILE="/var/run/spamd.pid"<br />
<br />
# Set nice level of spamd<br />
#NICE="--nicelevel 15"<br />
<br />
# Cronjob<br />
# Set to anything but 0 to enable the cron job to automatically update<br />
# spamassassin's rules on a nightly basis<br />
CRON=1<br />
<br />
Nun noch /etc/amavis/conf.d/50-user anpassen, damit die lokalen Domains aus der Datenbank genommen werden:<br />
<br />
use strict;<br />
<br />
#<br />
# Place your configuration directives here. They will override those in<br />
# earlier files.<br />
#<br />
# See /usr/share/doc/amavisd-new/ for documentation and examples of<br />
# the directives you can use in this file<br />
#<br />
<br />
# Three concurrent processes. This should fit into the RAM available on an<br />
# AWS micro instance. This has to match the number of processes specified<br />
# for Amavis in /etc/postfix/master.cf.<br />
$max_servers = 3;<br />
<br />
# Add spam info headers if at or above that level - this ensures they<br />
# are always added.<br />
$sa_tag_level_deflt = -9999;<br />
<br />
# Check the database to see if mail is for local delivery, and thus<br />
# should be spam checked.<br />
@lookup_sql_dsn = (['DBI:mysql:database=postfix;host=127.0.0.1;port=3306', 'postfix', 'assword']);<br />
$sql_select_policy = 'SELECT domain from domain WHERE CONCAT("@",domain) IN (%k)';<br />
$sql_select_white_black_list = undef;<br />
<br />
# Uncomment to bump up the log level when testing.<br />
# $log_level = 2; <br />
<br />
#------------ Do not modify anything below this line ------------- <br />
1; # ensure a defined return<br />
<br />
Spielkram bietet /etc/amavis/conf.d/20-debian_defaults, wo wir mit<br />
# SPAM-Tag in der Betreff-Zeile<br />
$sa_spam_subject_tag = '[AlphaCentauri-Trash SPAM] ';<br />
# Empfänger für Virus-Benachrichtigungen<br />
$virus_admin = "virusadmin\@example.org"; # due to D_DISCARD default<br />
# und die X-Virus-Scanned-Zeile in den Mails beeinflussen können:<br />
$X_HEADER_LINE = "by Thiel-SpamAndVirusFilter Debian $myproduct_name at $mydomain";<br />
<br />
Nach einem Neustart der Dienste mittels<br />
service clamav-freshclam restart<br />
service clamav-daemon restart<br />
service amavis restart<br />
service spamassassin restart<br />
<br />
sollte das System laufen.<br />
<br />
Bei mir mussten noch das Perl-Modul DBD::mysql mittels<br />
sudo cpan<br />
cpan[1] install DBD::mysql<br />
und eine Bibliothek für MySQL mittels<br />
sudo apt-get install libmysqlclient-dev <br />
nachinstalliert werden.<br />
<br />
<br />
Dann geben wir die Ports in der Firewall frei:<br />
sudo ufw allow Postfix<br />
sudo ufw allow "Postfix SMTPS"<br />
sudo ufw allow "Postfix Submission"<br />
sudo ufw allow "Dovecot IMAP"<br />
sudo ufw allow "Dovecot Secure IMAP"</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_18.04&diff=204Root-Server mit Ubuntu 18.042019-12-30T15:16:35Z<p>Lukas: </p>
<hr />
<div>Mein [[Root-Server_mit_Ubuntu_16.04-Hetzner|alter Server]] läuft noch mit Ubuntu 16.04. Das ist erstmal kein Problem, der Support läuft noch, allerdings wird die aktuellste PHP-Version nicht unterstützt. Das macht bei einigen Anwendungen nun schon Probleme. Daher habe ich einen zweiten Server in der Serverbörse geordert. Die Rechner sind teurer geworden. Der Rechner ist vergleichbar mit dem alten, kostet aber 6€ mehr. Positiv ist, dass ich dadurch eine Ausfallsicherheit erreichen kann. Ich werde den neuen Server einrichten und anschließend den alten aktualisieren.<br />
<br />
Der neue Rechner hat folgende Daten:<br />
* Intel Core i7-2600 8x 3.40GHz (8x 6823.66 Bogomips)<br />
* 16 GB Arbeitsspeicher<br />
* 2x 3 TB im RAID1-Verbund Festplattenspeicher<br />
<br />
Der Rechner kostet 30€/Monat.<br />
<br />
== Installation ==<br />
Hetzner liefert die Geräte im Rescue-Modus aus. Das ist ein Minimal-Linux mit Tools zur Rettung und dem Skript [https://github.com/hetzneronline/installimage installimage], mit dem eine Betriebssystem-Installation vorgenommen werden kann. Das ist schon mal ein großer Unterschied zu Strato, die die Rechner selber installieren und dann zur Verfügung stellen.<br />
<br />
Der Robot (Kundencenter) von Hetzner bietet allerlei Möglichkeiten, so kann der Rechner bequem mit einem Strg + Alt + Entf-Befehl gefüttert werden oder per ACPI neugestartet werden. Zudem bietet Hetzner die Möglichkeit eines Weckens über LAN (WOL) und man kann bequem eigene Monitoring-Dienste für den Rechner anlegen, sodass man bei Unregelmäßigkeiten per Mail informiert wird.<br />
<br />
Die Installation des Rechners erfolgt dann über den Befehl <code>installimage</code>. Nach einer Auswahl des Betriebssystems kann man über eine Textdatei die RAID-Einstellungen, Festplattenpartitionierung und den Hostnamen konfigurieren. Das macht es besonders einfach, mehrere Rechner zu installieren oder sich die Konfiguration noch einmal abzuspeichern.<br />
<br />
Nach dem Verlassen des Editors installiert der Rechner dann das Grundsystem, während man zugucken kann:<br />
<br />
Hetzner Online GmbH - installimage<br />
<br />
Your server will be installed now, this will take some minutes<br />
You can abort at any time with CTRL+C ...<br />
<br />
: Reading configuration done <br />
: Loading image file variables done <br />
: Loading ubuntu specific functions done <br />
1/16 : Deleting partitions done <br />
2/16 : Test partition size done <br />
3/16 : Creating partitions and /etc/fstab done <br />
4/16 : Creating software RAID level 1 done <br />
5/16 : Formatting partitions<br />
: formatting /dev/md/0 with swap done <br />
: formatting /dev/md/1 with ext2 done <br />
: formatting /dev/md/2 with ext4 done <br />
: formatting /dev/md/3 with xfs done <br />
: formatting /dev/md/4 with ext4 done <br />
: formatting /dev/md/5 with ext4 done <br />
6/16 : Mounting partitions done <br />
7/16 : Sync time via ntp done <br />
: Importing public key for image validation done <br />
8/16 : Validating image before starting extraction done <br />
9/16 : Extracting image (local) done <br />
10/16 : Setting up network config done <br />
11/16 : Executing additional commands<br />
: Setting hostname done <br />
: Generating new SSH keys done <br />
: Generating mdadm config done <br />
: Generating ramdisk done <br />
: Generating ntp config done <br />
12/16 : Setting up miscellaneous files done <br />
13/16 : Configuring authentication<br />
: Fetching SSH keys done <br />
: Disabling root password done <br />
: Disabling SSH root login without password done <br />
: Copying SSH keys done <br />
14/16 : Installing bootloader grub done <br />
15/16 : Running some ubuntu specific functions done <br />
16/16 : Clearing log files done <br />
<br />
INSTALLATION COMPLETE<br />
You can now reboot and log in to your new system with<br />
the same password as you logged in to the rescue system.<br />
<br />
root@rescue ~ # reboot<br />
<br />
Nach dem Neustart steht dann das neue System zur Verfügung. Die Installation hat letztlich mit Lektüre etwa 7 Minuten gedauert. Das ist ein enormer Fortschritt zu anderen Providern.<br />
<br />
== Grundlegendes ==<br />
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Und ein paar Tools:<br />
apt-get install vim htop whois aptitude needrestart git unzip<br />
<br />
== Firewall ==<br />
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:<br />
apt-get install ufw<br />
<br />
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:<br />
ufw allow 22<br />
ufw allow OpenSSH<br />
<br />
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels<br />
ufw enable<br />
zeigt die Firewall auch automatisch Wirkung.<br />
<br />
Überprüfen lässt sich der Status mit<br />
ufw status<br />
bzw.<br />
ufw status numbered<br />
<br />
So können auch Regeln gelöscht werden:<br />
ufw delete 1<br />
<br />
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.<br />
<br />
Damit nicht die syslog mit Firewall-Messages überläuft, deaktivieren wir das Logging in /etc/rsyslog.d/20-ufw.conf, letzte Zeile:<br />
& stop<br />
<br />
== Webserver Apache2 ==<br />
Zur Bereitstellung von Webseiten nutze ich Apache als Webserver mit PHP. Da der Server unter mehreren Namen erreichbar sein wird, richten wir VirtualHosts ein.<br />
<br />
Die Installation läuft denkbar einfach über<br />
<br />
sudo apt-get update<br />
sudo apt-get install apache2 apache2-utils apache2-doc php php-mysql php-pear<br />
<br />
Neben Apache gibt es ein paar Tools, Doku und neben PHP schon die Anbindung für MySQL und Apache. Apache kommt in der Version 2.4.29, bei PHP wird Version 7.2 installiert.<br />
<br />
Nach der Installation geht es an die eigentliche Konfiguration des Webservers. Ziel ist es, das eine Reihe von Anwendungen (Roundcube, PHPMyAdmin, etc.) nur einmal installiert werden müssen und dann allen eingerichteten Domains zur Verfügung stehen. Gleichzeitig sollen Dummies, die den Server über seine IP oder einen nicht vorhandenen Namen ansprechen, keine Dienste nutzen können, sondern lediglich eine Fehler-Seite sehen. Die folgende Konfiguration habe ich in Teilen in ihrer Version vom 12. November 2014 aus dem [[d:Root-Server_mit_OpenSuSE_13.1|Debacher-Wiki]] entnommen (CC-BY-SA). Wir legen also eine Grundkonfiguration für jeden "dummen" Aufruf an.<br />
<br />
Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen.<br />
Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis:<br />
mkdir /var/www/htdocs<br />
mkdir /var/www/vhosts<br />
mkdir /var/www/vhosts/default<br />
mv /var/www/html /var/www/vhosts/default/htdocs<br />
<br />
Wichtig ist, dass wir die Datei vorher einmal sichern:<br />
<br />
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.org<br />
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org<br />
<br />
Dann noch einige Apache-Module aktivieren:<br />
<br />
a2enmod ssl headers<br />
<br />
=== /etc/apache2/sites-available/000-default.conf ===<br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
ServerTokens Prod <br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
Alias /webmail /var/www/htdocs/roundcube<br />
Alias /roundcube /var/www/htdocs/roundcube<br />
Alias /pma /var/www/htdocs/pma<br />
Alias /webftp /var/www/htdocs/webftp<br />
<br />
<VirtualHost *:80><br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/vhosts/default/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
# Verhindern des Zugriffs auf die CGI-Skripte<br />
<Directory "/var/www/cgi-bin/"><br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Deny from all <br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /cgi-bin /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
</VirtualHost><br />
<br />
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet<br />
<br />
=== SSL ===<br />
Die zentrale Konfiguration von SSL nehmen wir in der /etc/mods-available/ssl.conf vor. Hier besonders:<br />
<br />
SSLCipherSuite SSLCipherSuite EECDH+AESGCM+AES256:EECDH+AES256<br />
SSLCompression Off<br />
SSLProtocol TLSv1.2<br />
SSLHonorCipherOrder On<br />
<br />
=== /etc/apache2/sites-available/000-default-ssl.conf ===<br />
<IfModule mod_ssl.c><br />
<VirtualHost _default_:443><br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined <br />
<br />
# Blocken der Anfragen an eingerichtete Dienste<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
<IfDefine MAILMAN><br />
ScriptAlias /mailman/ /var/www/htdocs/dummy<br />
Alias /mailmanicons/ /var/www/htdocs/dummy<br />
Alias /pipermail/ /var/www/htdocs/dummy<br />
</IfDefine><br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews SymLinksIfOwnerMatch<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
SSLEngine on<br />
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem<br />
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
</VirtualHost><br />
</IfModule><br />
<br />
=== Verzeichnisse ===<br />
Anschließend verlinken wir beide Dateien:<br />
ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/000-default.conf <br />
ln -s /etc/apache2/sites-available/000-default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf <br />
<br />
Anschließend müssen die Verzeichnisse anlegt werden:<br />
mkdir /var/www/htdocs/<br />
mkdir /var/www/vhosts/<br />
mkdir /var/www/vhosts/default<br />
mkdir /var/www/vhosts/default/htdocs<br />
<br />
Und übertragen:<br />
chown -R www-data.www-data /var/www/htdocs<br />
chown -R www-data.www-data /var/www/vhosts<br />
<br />
Configtest:<br />
apache2ctl configtest<br />
<br />
Neustart:<br />
service apache2 restart<br />
<br />
Firewall:<br />
ufw allow 'Apache Full'<br />
<br />
Damit läuft Apache, man kann jetzt testweise eine index.html in /var/www/vhosts/default/htdocs legen und sollte sie beim Aufruf der Serveradresse (IP oder Hostname) sehen.<br />
<br />
=== VHosts ===<br />
Für jede Domain, unter der der Webserver erreichbar sein soll, erstellen wir einen VirtualHost. Dafür stehen zwei Konfigurationsdateien zur Verfügung (reines HTTP und HTTP/HTTPS-Mix). Zur Generierung von Zertifikaten mittels Let's Encrypt nutzen wir den ersten Dummy und ersetzen ihn danach mit dem zweiten. In beiden Dateien muss jeweils der Platzhalter mit der Domain ersetzt werden (in vim: %s/dummy.domain/example.org).<br />
<br />
Die Problematik von SymLinks, die einem nicht gehören, habe ich von [https://blog.jonaspasche.com/2014/07/11/followsymlinks-vs-symlinksifownermatch/ Jonas Pasche] übernommen.<br />
<br />
==== HTTP-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs <br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
==== HTTPS-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
Redirect permanent / https://www.dummy.domain/<br />
# Setze Alias, um die Generierung von Zertifikaten unabhängig vom bisherigen Zertifikat möglich zu machen<br />
Alias /.well-known /var/www/vhosts/dummy.domain/htdocs/.well-known<br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
<VirtualHost *:443><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.lt42.de<br />
SSLEngine on <br />
SSLCertificateFile /etc/letsencrypt/live/dummy.domain/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/dummy.domain/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/dummy.domain/chain.pem<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000" <br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
== Datenbank-Server ==<br />
Als Datenbank-Server benutze ich MariaDB, um von proprietären Anbietern wegzukommen:<br />
sudo apt-get install mariadb-server php-zip php-bz2 php-mbstring<br />
<br />
Nach einem Hinweis von [https://kofler.info/root-login-problem-mit-mariadb/ Michael Kofler] ist es empfehlenswert, die Standardkonfiguration, die eine Anmeldung von root außerhalb der root-Shell unter Linux verbietet, zu belassen. Wir legen also einen zweiten Administrationsuser an:<br />
mysql<br />
MariaDB [(none)]> GRANT ALL ON *.* 'rooter'@'localhost' IDENTIFIED BY 'newpwd' WITH GRANT OPTION;<br />
<br />
Damit können wir uns dann auch über [https://www.phpmyadmin.net/ PHPMyAdmin] anmelden. Hier wird zusätzlich der root-Login in der Config verboten:<br />
$cfg['Servers'][$i]['AllowRoot'] = false;<br />
<br />
== Mailserver ==<br />
Die Einrichtung des Mailservers ist immer wieder spannend, da bei Updates immer wieder kleine Änderungen durchgeführt werden. Ich verwende Postfix als MTA und Dovecot als IMAP-Server.<br />
Zusätzlich arbeiten wir mit Virtuellen Hosts, damit ein Mailserver für mehrere Domains verantwortlich sein kann. Die Domains und ihre Mail-Accounts können dann über den Postfixadmin bequem im Netz verwaltet werden. Außerdem werden die Mails natürlich gefiltert.<br />
<br />
Zunächst installieren wir Postfix und dessen Anbindung an MySQL:<br />
sudo apt-get install postfix postfix-mysql php-imap<br />
<br />
Falls bei der Installation ein Konfigurations-Dialog auftritt, wählen wir hier einfach erstmal "Keine Konfiguration" aus.<br />
<br />
Dann erstellen wir im MySQL-Server eine neue Datenbank "mail" und einen neuen Benutzer "mail" mit allen Rechten:<br />
root@server:/# mysql<br />
MariaDB [(none)]> CREATE DATABASE mail;<br />
mysql> GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';<br />
mysql> quit<br />
<br />
Die Konfiguration liegt in /etc/postfix wir wechseln also in das Verzeichnis und bearbeiten die (vielleicht neue) Datei main.cf<br />
<br />
root@server:/# cd /etc/postfix<br />
root@server:/# vi main.cf<br />
<br />
Dann richten wir die Datei wie folgt ein (denken Sie dran myhostname und myorigin an Ihre eigenen Bedürfnisse anzupassen).<br />
Mit Dovecot 2.0 hat sich einiges an der SASL-Authentifizierung geändert; das ist hier schon eingearbeitet:<br />
<br />
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)<br />
biff = no<br />
append_dot_mydomain = no<br />
#delay_warning_time = 4h<br />
myhostname = mail.example.com<br />
myorigin = /etc/mailname<br />
mydestination = mydestination = $myhostname, mail.example.com, h23XXXXX.stratoserver.net, localhost.stratoserver.net, localhost<br />
relayhost =<br />
mynetworks = 127.0.0.0/8 [::1]/128<br />
mailbox_size_limit = 0<br />
recipient_delimiter = +<br />
inet_interfaces = all<br />
inet_protocols = ipv4<br />
alias_maps = hash:/etc/aliases<br />
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf<br />
virtual_mailbox_base = /var/vmail<br />
virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf<br />
virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf<br />
virtual_minimum_uid = 150<br />
virtual_uid_maps = static:150<br />
virtual_gid_maps = static:8<br />
virtual_transport = dovecot<br />
smtpd_sasl_type = dovecot<br />
smtpd_sasl_path = private/auth<br />
smtpd_sasl_auth_enable = yes<br />
smtpd_delay_reject = yes<br />
smtpd_helo_required = yes<br />
<br />
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net, reject_unknown_client<br />
<br />
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname<br />
<br />
smtpd_sender_restrictions = reject_unknown_sender_domain<br />
<br />
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination <br />
<br />
<br />
# tls config<br />
#smtpd_use_tls = yes<br />
#smtp_tls_note_starttls_offer = yes<br />
#smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem<br />
#smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem<br />
#smtpd_tls_loglevel = 1<br />
#smtpd_tls_received_header = yes<br />
#smtpd_tls_session_cache_timeout = 3600s<br />
#smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3<br />
#tls_random_source = dev:/dev/urandom<br />
#tls_random_prng_update_period = 3600s<br />
#dovecot_destination_recipient_limit = 1<br />
## Verschlüsselung der Transportebene<br />
#smtpd_tls_security_level = may<br />
#smtp_tls_security_level = may<br />
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku]<br />
<br />
Diese Konfiguration legt die Mails in /var/vmail ab und benutzt den Benutzer vmail mit der UID 150 (legen wir gleich an):<br />
<br />
sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail<br />
sudo mkdir /var/vmail<br />
sudo chmod 770 /var/vmail/<br />
sudo chown vmail:mail /var/vmail/<br />
<br />
Jetzt fangen wir an, die Maps zu konfigurieren. Hiermit bringen wir Postfix bei, wir er die Datenbank nach Mail-Adressen abfragen muss. Dafür müssen wir einige Dateien anlegen:<br />
<br />
sudo touch /etc/postfix/mysql_virtual_alias_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_domains_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_maps.cf<br />
<br />
/etc/postfix/mysql_virtual_alias_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = alias<br />
select_field = goto<br />
where_field = address<br />
additional_conditions = and active = '1'<br />
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_domains_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = domain<br />
select_field = domain<br />
where_field = domain<br />
additional_conditions = and backupmx = '0' and active = '1'<br />
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = quota<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = CONCAT(domain,'/',maildir)<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
Wichtig ist es, hier den Benutzernamen und das Passwort an die MySQL-Einstellungen anzupassen.<br />
<br />
Als letzte Postfix-Konfiguration müssen wir in der master.cf ganz unten die Pipe für Dovecot einrichten:<br />
dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d $(recipient)<br />
submission inet n - - - - smtpd<br />
-o smtpd_tls_security_level=encrypt<br />
-o smtpd_sasl_auth_enable=yes<br />
-o smtpd_sasl_type=dovecot<br />
-o smtpd_sasl_path=private/auth<br />
-o smtpd_sasl_security_options=noanonymous<br />
-o smtpd_sasl_local_domain=$myhostname<br />
-o smtpd_client_restrictions=permit_sasl_authenticated,reject<br />
-o smtpd_sender_login_maps=hash:/etc/postfix/virtual<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject<br />
<br />
Nachdem ich Probleme hatte, Mails mit Thunderbird ordentlich abzuliefern und immer wieder auf den Fehler:<br />
5.7.1 <mail@domain.tld>: Sender address rejected: not owned by user mail@domain.tld<br />
gestoßen bin, ist mir aufgefallen, dass folgende Zeile in der master.cf den Fehler zu verursachen scheint:<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
Sollte der Fehler also auftreten, kommentieren wir diese Zeile einfach aus.<br />
<br />
Gegen die Fehlermeldung, dass die /etc/aliases nicht gefunden wurde, führen wir einmal<br />
sudo newaliases<br />
aus.<br />
<br />
=== Dovecot ===<br />
Nun beginnen wir, den zweiten Teil des Mailservers anzupassen. Hierfür installieren wir Dovecot über apt:<br />
sudo apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql<br />
<br />
Wir können hier auch das Paket "dovecot-pop3d" weglassen, wenn wir keine POP3-Anmeldung am Server brauchen.<br />
<br />
Die Abfrage nach einem SSL-Zertifikat können wir entweder mit Ja beantworten. Dann richtet Dovecot ein selbstsigniertes SSL-Zertifikat ein. Falls wir eines haben, sagen wir Nein.<br />
<br />
Zur Sicherheit sichern wir die originale Konfigurationsdatei via<br />
sudo mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org<br />
<br />
Anschließend können wir mit der Konfiguration von Dovecot unter /etc/dovecot/dovecot.conf beginnen. Diese Konfiguration kann einfach so kopiert werden. Es bringt auch eine SSL-Unterstützung mit, die aber von Haus aus deaktiviert ist. Natürlich müssen der Hostname und der Postmaster angepasst werden.<br />
<br />
auth_mechanisms = plain login<br />
disable_plaintext_auth = no<br />
first_valid_uid = 150<br />
hostname = mail.example.org<br />
last_valid_uid = 150<br />
log_timestamp = "%Y-%m-%d %H:%M:%S "<br />
mail_location = maildir:/var/vmail/%d/%u<br />
passdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
postmaster_address = xxx@example.com<br />
service auth {<br />
unix_listener /var/spool/postfix/private/auth {<br />
group = postfix<br />
mode = 0660<br />
user = postfix<br />
}<br />
unix_listener auth-userdb {<br />
group = mail<br />
mode = 0600<br />
user = vmail<br />
}<br />
}<br />
service imap-login {<br />
executable = imap-login<br />
inet_listener imap {<br />
port = 143<br />
}<br />
}<br />
service pop3-login {<br />
executable = pop3-login<br />
inet_listener pop3 {<br />
port = 110<br />
}<br />
}<br />
# Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden.<br />
ssl = no<br />
#ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem<br />
#ssl_key = </etc/letsencrypt/live/example.org/privkey.pem<br />
userdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
protocol imap {<br />
mail_max_userip_connections = 10<br />
}<br />
protocols = imap pop3<br />
<br />
Nun müssen wir Dovecot nur noch sagen, wie sich Dovecot die Anmelde-Daten beschaffen kann. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot-sql.conf:<br />
<br />
driver = mysql<br />
connect = host=localhost dbname=mail user=mail password=mail<br />
# The new name for MD5 is MD5-CRYPT so you might need to change this depending on version<br />
default_pass_scheme = MD5<br />
# Get the mailbox<br />
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'<br />
# Get the password<br />
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'<br />
# If using client certificates for authentication, comment the above and uncomment the following<br />
#password_query = SELECT null AS password, '%u' AS user<br />
<br />
Hier müssen wir möglicherweise die Felder user= und password= an unsere Zwecke anpassen.<br />
<br />
Dann setzen wir noch die Rechte für Dovecot:<br />
sudo chmod 600 /etc/dovecot/*.conf<br />
sudo chown vmail /etc/dovecot/*.conf<br />
<br />
Dovecot ist jetzt konfiguriert. Momentan noch ohne SSL, aber das kommt später.<br />
<br />
=== Postfix Admin ===<br />
Zum Anlegen der Domains und Postfächer nutzen wir den Postfixadmin, der passenderweise auch gleich das Datenbank-Schema für die gerade erstellte Konfiguration mitbringt.<br />
<br />
Wir laden den [http://sourceforge.net/projects/postfixadmin/ PostfixAdmin] von der Webseite herunter und entpacken ihn in ein eingerichtetes Verzeichnis z.B. einer Subdomain (z.B. mail.<domain>)<br />
<br />
sudo mkdir /var/www/vhosts/mail.<domain>/htdocs<br />
cd /var/www/vhosts/mail.<domain>/htdocs<br />
wget -O pfa.tgz https://sourceforge.net/projects/postfixadmin/files/latest/download<br />
tar xfz pfa.tgz<br />
<br />
Nun passen wir noch den Postfix Admin an unsere Zwecke an. Dazu wechseln wir in das vorhin angelegte Verzeichnis postfixadmin-X.X.X/ und editieren die Standardkonfiguration:<br />
<br />
cd ./postfixadmin-X.X.X/<br />
vi config.inc.php<br />
<br />
Hier passen wir folgende Parameter an:<br />
$CONF['postfix_admin_url'] = ‘'var/www/vhosts/mail.<domain>/postfixadmin/';<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_user'] = 'mail';<br />
$CONF['database_password'] = 'mail';<br />
$CONF['database_name'] = 'mail';<br />
(Natürlich an die eigenen Zwecke angepasst)<br />
<br />
Sind wir mit der Konfiguration fertig, setzen wir den Parameter<br />
$CONF['configured'] = false;<br />
auf true und können unter der angelegten Domain den Installer starten. (postfixadmin/setup.php)<br />
<br />
Hier müssen zwei PHP-Pakete nachinstalliert werden:<br />
sudo apt-get install php-mbstring php-imap<br />
Danach einmal Apache neu laden:<br />
sudo service apache2 reload<br />
<br />
Ist alles installiert, können wir einen Super-Admin einrichten, der alle Domains, Accounts und Administrator-Account im Postfixadmin konfigurieren kann.<br />
<br />
Nun ist der Mailserver eingerichtet. Wir starten nun die Services neu:<br />
<br />
service postfix restart<br />
service dovecot restart<br />
service apache2 restart<br />
service mysql restart<br />
<br />
Nun können wir unter http://mail.example.org/postfixadmin/ einen neuen Benutzer und eine neue Domain anlegen und einige Tests durchführen. Damit ist der Mailserver eingerichtet. <br />
<br />
=== Roundcube ===<br />
RoundCube könnte prinzipiell über die Paketquellen installiert werden. Ich bin hängen geblieben und installiere immer noch manuell mit den Paketen von www.roundcube.net. Wir entpacken das Verzeichnis nach /var/www/htdocs/roundcube, da die Installation ja von allen Domains aus erreichbar sein soll. Seit Version 3.1 bietet Postfix endlich auch eine lokale Installationsdatei an. Dann kann man bequemer Updates einspielen.<br />
<br />
==== /var/www/htdocs/roundcube/config/config.local.php ====<br />
<?php<br />
$CONF['configured'] = true;<br />
<br />
// on submission it will be echoed out to you as a hashed value.<br />
$CONF['setup_password'] = 'changeme';<br />
$CONF['default_language'] = 'de';<br />
<br />
// Database Config<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_host'] = 'localhost';<br />
$CONF['database_user'] = '<benutzer>';<br />
$CONF['database_password'] = '<passwort>';<br />
$CONF['database_name'] = '<datenbank>'; <br />
<br />
$CONF['admin_email'] = 'postmaster@example.de';<br />
$CONF['page_size'] = '20';<br />
<br />
$CONF['default_aliases'] = array (<br />
'abuse' => 'abuse@example.de',<br />
'hostmaster' => 'hostmaster@example.de',<br />
'postmaster' => 'postmaster@example.de',<br />
'webmaster' => 'webmaster@example.de'<br />
);<br />
<br />
$CONF['quota'] = 'YES';<br />
$CONF['footer_text'] = 'Zurück zu example.de';<br />
$CONF['footer_link'] = 'http://example.de';<br />
<br />
// Welcome Message<br />
// This message is send to every newly created mailbox.<br />
// Change the text between EOM.<br />
$CONF['welcome_text'] = <<<EOM<br />
Herzlich Willkommen, <br />
<br />
zum neuen E-Mail Postfach. <br />
<br />
Bei Fragen oder Problemen bitte<br />
Lukas Thiel ansprechen<br />
EOM;<br />
<br />
$CONF['show_undeliverable_exceptions']=array("example.de","lt42.de");<br />
$CONF['used_quotas'] = 'YES';<br />
$CONF['maxquota'] = '2048';<br />
$CONF['domain_quota_default'] = '0';<br />
<br />
Beim ersten Aufruf erschien<br />
ERROR: the templates_c directory doesn't exist or isn't writeable for the webserver<br />
<br />
Nach einem Erstellen des Verzeichnissen und der Anpassung der Rechte an www-data, klappt das aber auch.<br />
<br />
=== Sieve ===<br />
Ich wollte meine Mails gerne mit Hilfe von Sieve filtern. Bisher habe ich die Abwesenheitsbenachrichtigungen immer mit dem Postfixadmin-Virtual-Vacation realisiert, das ist aber unschön. Sieve klingt da schöner und kann auch mehr.<br />
<br />
Zuerst installieren wir das Paket mit APT:<br />
apt-get update<br />
apt-get install dovecot-managesieved<br />
<br />
Dann geht es an die Einrichtung von Dovecot. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot.conf und fügen folgende Zeilen an:<br />
managesieve_notify_capability = mailto<br />
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date<br />
<br />
# Mail-Filterung mit Sieve<br />
service managesieve-login { <br />
inet_listener sieve {<br />
port = 4190<br />
}<br />
}<br />
<br />
protocol lda {<br />
mail_plugins = $mail_plugins sieve<br />
}<br />
<br />
plugin {<br />
sieve = /var/vmail/%d/%n/.dovecot.sieve<br />
sieve_dir = /var/vmail/%d/%n/sieve<br />
}<br />
<br />
Falls Sie Ihre Mails mit LMTP zustellen, muss in der Zeile "protocol lda" natürlich "protocol lmtp" stehen.<br />
<br />
Nun fügen wir sieve noch als Protokoll für Dovecot hinzu. Dazu fügen wir an die Zeile<br />
protocols = imap pop3<br />
noch sieve an, also<br />
protocols = imap pop3 sieve<br />
<br />
Nach einem Neustart von Dovecot, sollte alles funktionieren. Nun geht es an die Erstellung der Filter. Dazu bringt beispielweise Thunderbird ein Tool mit, allerdings finde ich die Lösung per Webmailer wesentlich schöner. Passenderweise bringt auch Roundcube von Haus aus eine Möglichkeit zur Bearbeitung von Sieve-Scripten mit.<br />
<br />
Zum Aktivieren wechseln wir in das Roundcube-Installationsverzeichnis und bearbeiten die config/config.inc.php. Dort muss lediglich folgendes Array erweitert werden:<br />
$config['plugins'] = array('');<br />
wird zu<br />
$config['plugins'] = array('managesieve');<br />
<br />
Wichtig ist, dass der Name mit dem Namen des Ordners in plugins/ übereinstimmt.<br />
Nach der Installation können wir im Roundcube unter Einstellungen/Filter die Filter bearbeiten.<br />
<br />
=== Passwort ändern mit Roundcube ===<br />
Ich wollte schon lange alle möglichen Einstellungen für Benutzer unter ein Dach bringen. Bisher habe ich Benutzern immer einen Link zum Webmailer und einen für den Postfixadmin gegeben, damit sie ihr Passwort ändern können. Doch Roundcube bringt einige spannende Plugins (s.o. Sieve) mit, die diese Arbeit ebenso übernehmen können.<br />
<br />
Für das Ändern des Passwort bedienen wir uns dem mitgelieferten Plugin password. Zuerst kopieren wir uns die Datei plugins/password/config.inc.php.dist (von der Roundcube-Wurzel aus) in plugins/password/config.inc.php und bearbeiten die folgenden zwei Zeilen:<br />
$config['password_db_dsn'] = 'mysql://benutzer:passwort@localhost/db';<br />
$config['password_query'] = 'UPDATE mailbox SET password=%c WHERE username=%u';<br />
<br />
Die Zugangsdaten sind in diesem Fall die gleichen, wie bei Postfix und Dovecot, was naheliegt, da wir ja an die Mail-Datenbank heran wollen. In unserem Fall waren das mail, mail und mail. Im password_query tragen wir dann den SQL-Befehl zum Update des Passwortes ein. Dieses lässt sich aus dem Datenbank-Aufbau erahnen.<br />
<br />
Zum Abschluss speichern wir die Datei und binden das Plugin wie oben auch in der config/config.inc.php in dem Array $config['plugins'] ein. Dann können wir unser Passwort im Roundcube ändern.<br />
<br />
=== Amavis ===<br />
Natürlich sollen die Mails auf SPAM und Viren überprüft werden. Dafür kommt Amavis mit ClamAV (Virenscanner) und SpamAssassin (Spamscanner) zum Einsatz. Die Konfiguration ist trivial und orientiert sich an [[d:Root-Server_mit_Ubuntu_16.04#AmaVis|dieser]]. Zuerst installieren wir mit<br />
sudo apt-get update<br />
sudo apt-get install amavis clamav clamav-daemon spamassassin<br />
<br />
Die Konfiguration muss an einigen Stellen gedreht werden. Zuerst werden die Programme gegenseitig in ihre Gruppen aufgenommen:<br />
<br />
adduser clamav amavis<br />
adduser amavis clamav<br />
<br />
Dann wird die Datei /etc/clamav/clamd.conf etwas angepasst<br />
<br />
# Needed to allow things to work with Amavis, when both amavis and clamav<br />
# users are added to one another's groups.<br />
AllowSupplementaryGroups true<br />
<br />
Viren- und Spamprüfung aktivieren wir dann in /etc/amavis/conf.d/15-content_filter_mode<br />
<br />
use strict;<br />
<br />
# You can modify this file to re-enable SPAM checking through spamassassin<br />
# and to re-enable antivirus checking.<br />
<br />
#<br />
# Default antivirus checking mode<br />
# Please note, that anti-virus checking is DISABLED by<br />
# default.<br />
# If You wish to enable it, please uncomment the following lines: <br />
<br />
@bypass_virus_checks_maps = (<br />
%bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);<br />
<br />
#<br />
# Default SPAM checking mode<br />
# Please note, that anti-spam checking is DISABLED by<br />
# default.<br />
# If You wish to enable it, please uncomment the following lines: <br />
<br />
@bypass_spam_checks_maps = (<br />
%bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);<br />
<br />
1; # ensure a defined return<br />
<br />
<br />
Zusätzlich wird SpamAssassin in einen Daemon-Modus gefahren und es werden nächtliche Aktualisierungen via cron aktiviert:<br />
/etc/default/spamassassin:<br />
# /etc/default/spamassassin<br />
# Duncan Findlay<br />
<br />
# WARNING: please read README.spamd before using.<br />
# There may be security risks.<br />
<br />
# If you're using systemd (default for jessie), the ENABLED setting is<br />
# not used. Instead, enable spamd by issuing:<br />
# systemctl enable spamassassin.service<br />
# Change to "1" to enable spamd on systems using sysvinit:<br />
ENABLED=1<br />
<br />
# Options<br />
# See man spamd for possible options. The -d option is automatically added.<br />
<br />
# SpamAssassin uses a preforking model, so be careful! You need to<br />
# make sure --max-children is not set to anything higher than 5,<br />
# unless you know what you're doing. <br />
<br />
OPTIONS="--create-prefs --max-children 5 --helper-home-dir" <br />
<br />
# Pid file<br />
# Where should spamd write its PID to file? If you use the -u or<br />
# --username option above, this needs to be writable by that user.<br />
# Otherwise, the init script will not be able to shut spamd down.<br />
PIDFILE="/var/run/spamd.pid"<br />
<br />
# Set nice level of spamd<br />
#NICE="--nicelevel 15"<br />
<br />
# Cronjob<br />
# Set to anything but 0 to enable the cron job to automatically update<br />
# spamassassin's rules on a nightly basis<br />
CRON=1<br />
<br />
Nun noch /etc/amavis/conf.d/50-user anpassen, damit die lokalen Domains aus der Datenbank genommen werden:<br />
<br />
use strict;<br />
<br />
#<br />
# Place your configuration directives here. They will override those in<br />
# earlier files.<br />
#<br />
# See /usr/share/doc/amavisd-new/ for documentation and examples of<br />
# the directives you can use in this file<br />
#<br />
<br />
# Three concurrent processes. This should fit into the RAM available on an<br />
# AWS micro instance. This has to match the number of processes specified<br />
# for Amavis in /etc/postfix/master.cf.<br />
$max_servers = 3;<br />
<br />
# Add spam info headers if at or above that level - this ensures they<br />
# are always added.<br />
$sa_tag_level_deflt = -9999;<br />
<br />
# Check the database to see if mail is for local delivery, and thus<br />
# should be spam checked.<br />
@lookup_sql_dsn = (['DBI:mysql:database=postfix;host=127.0.0.1;port=3306', 'postfix', 'assword']);<br />
$sql_select_policy = 'SELECT domain from domain WHERE CONCAT("@",domain) IN (%k)';<br />
$sql_select_white_black_list = undef;<br />
<br />
# Uncomment to bump up the log level when testing.<br />
# $log_level = 2; <br />
<br />
#------------ Do not modify anything below this line ------------- <br />
1; # ensure a defined return<br />
<br />
Spielkram bietet /etc/amavis/conf.d/20-debian_defaults, wo wir mit<br />
# SPAM-Tag in der Betreff-Zeile<br />
$sa_spam_subject_tag = '[AlphaCentauri-Trash SPAM] ';<br />
# Empfänger für Virus-Benachrichtigungen<br />
$virus_admin = "virusadmin\@example.org"; # due to D_DISCARD default<br />
# und die X-Virus-Scanned-Zeile in den Mails beeinflussen können:<br />
$X_HEADER_LINE = "by Thiel-SpamAndVirusFilter Debian $myproduct_name at $mydomain";<br />
<br />
Nach einem Neustart der Dienste mittels<br />
service clamav-freshclam restart<br />
service clamav-daemon restart<br />
service amavis restart<br />
service spamassassin restart<br />
<br />
sollte das System laufen.<br />
<br />
Bei mir mussten noch das Perl-Modul DBD::mysql mittels<br />
sudo cpan<br />
cpan[1] install DBD::mysql<br />
und eine Bibliothek für MySQL mittels<br />
sudo apt-get install libmysqlclient-dev <br />
nachinstalliert werden.<br />
<br />
<br />
Dann geben wir die Ports in der Firewall frei:<br />
sudo ufw allow Postfix<br />
sudo ufw allow "Postfix SMTPS"<br />
sudo ufw allow "Postfix Submission"<br />
sudo ufw allow "Dovecot IMAP"<br />
sudo ufw allow "Dovecot Secure IMAP"</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_18.04&diff=203Root-Server mit Ubuntu 18.042019-12-30T10:59:27Z<p>Lukas: </p>
<hr />
<div>Mein [[Root-Server_mit_Ubuntu_16.04-Hetzner|alter Server]] läuft noch mit Ubuntu 16.04. Das ist erstmal kein Problem, der Support läuft noch, allerdings wird die aktuellste PHP-Version nicht unterstützt. Das macht bei einigen Anwendungen nun schon Probleme. Daher habe ich einen zweiten Server in der Serverbörse geordert. Die Rechner sind teurer geworden. Der Rechner ist vergleichbar mit dem alten, kostet aber 6€ mehr. Positiv ist, dass ich dadurch eine Ausfallsicherheit erreichen kann. Ich werde den neuen Server einrichten und anschließend den alten aktualisieren.<br />
<br />
Der neue Rechner hat folgende Daten:<br />
* Intel Core i7-2600 8x 3.40GHz (8x 6823.66 Bogomips)<br />
* 16 GB Arbeitsspeicher<br />
* 2x 3 TB im RAID1-Verbund Festplattenspeicher<br />
<br />
Der Rechner kostet 30€/Monat.<br />
<br />
== Installation ==<br />
Hetzner liefert die Geräte im Rescue-Modus aus. Das ist ein Minimal-Linux mit Tools zur Rettung und dem Skript [https://github.com/hetzneronline/installimage installimage], mit dem eine Betriebssystem-Installation vorgenommen werden kann. Das ist schon mal ein großer Unterschied zu Strato, die die Rechner selber installieren und dann zur Verfügung stellen.<br />
<br />
Der Robot (Kundencenter) von Hetzner bietet allerlei Möglichkeiten, so kann der Rechner bequem mit einem Strg + Alt + Entf-Befehl gefüttert werden oder per ACPI neugestartet werden. Zudem bietet Hetzner die Möglichkeit eines Weckens über LAN (WOL) und man kann bequem eigene Monitoring-Dienste für den Rechner anlegen, sodass man bei Unregelmäßigkeiten per Mail informiert wird.<br />
<br />
Die Installation des Rechners erfolgt dann über den Befehl <code>installimage</code>. Nach einer Auswahl des Betriebssystems kann man über eine Textdatei die RAID-Einstellungen, Festplattenpartitionierung und den Hostnamen konfigurieren. Das macht es besonders einfach, mehrere Rechner zu installieren oder sich die Konfiguration noch einmal abzuspeichern.<br />
<br />
Nach dem Verlassen des Editors installiert der Rechner dann das Grundsystem, während man zugucken kann:<br />
<br />
Hetzner Online GmbH - installimage<br />
<br />
Your server will be installed now, this will take some minutes<br />
You can abort at any time with CTRL+C ...<br />
<br />
: Reading configuration done <br />
: Loading image file variables done <br />
: Loading ubuntu specific functions done <br />
1/16 : Deleting partitions done <br />
2/16 : Test partition size done <br />
3/16 : Creating partitions and /etc/fstab done <br />
4/16 : Creating software RAID level 1 done <br />
5/16 : Formatting partitions<br />
: formatting /dev/md/0 with swap done <br />
: formatting /dev/md/1 with ext2 done <br />
: formatting /dev/md/2 with ext4 done <br />
: formatting /dev/md/3 with xfs done <br />
: formatting /dev/md/4 with ext4 done <br />
: formatting /dev/md/5 with ext4 done <br />
6/16 : Mounting partitions done <br />
7/16 : Sync time via ntp done <br />
: Importing public key for image validation done <br />
8/16 : Validating image before starting extraction done <br />
9/16 : Extracting image (local) done <br />
10/16 : Setting up network config done <br />
11/16 : Executing additional commands<br />
: Setting hostname done <br />
: Generating new SSH keys done <br />
: Generating mdadm config done <br />
: Generating ramdisk done <br />
: Generating ntp config done <br />
12/16 : Setting up miscellaneous files done <br />
13/16 : Configuring authentication<br />
: Fetching SSH keys done <br />
: Disabling root password done <br />
: Disabling SSH root login without password done <br />
: Copying SSH keys done <br />
14/16 : Installing bootloader grub done <br />
15/16 : Running some ubuntu specific functions done <br />
16/16 : Clearing log files done <br />
<br />
INSTALLATION COMPLETE<br />
You can now reboot and log in to your new system with<br />
the same password as you logged in to the rescue system.<br />
<br />
root@rescue ~ # reboot<br />
<br />
Nach dem Neustart steht dann das neue System zur Verfügung. Die Installation hat letztlich mit Lektüre etwa 7 Minuten gedauert. Das ist ein enormer Fortschritt zu anderen Providern.<br />
<br />
== Grundlegendes ==<br />
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Und ein paar Tools:<br />
apt-get install vim htop whois aptitude<br />
<br />
== Firewall ==<br />
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:<br />
apt-get install ufw<br />
<br />
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:<br />
ufw allow 22<br />
ufw allow OpenSSH<br />
<br />
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels<br />
ufw enable<br />
zeigt die Firewall auch automatisch Wirkung.<br />
<br />
Überprüfen lässt sich der Status mit<br />
ufw status<br />
bzw.<br />
ufw status numbered<br />
<br />
So können auch Regeln gelöscht werden:<br />
ufw delete 1<br />
<br />
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.<br />
<br />
Damit nicht die syslog mit Firewall-Messages überläuft, deaktivieren wir das Logging in /etc/rsyslog.d/20-ufw.conf, letzte Zeile:<br />
& stop<br />
<br />
== Webserver Apache2 ==<br />
Zur Bereitstellung von Webseiten nutze ich Apache als Webserver mit PHP. Da der Server unter mehreren Namen erreichbar sein wird, richten wir VirtualHosts ein.<br />
<br />
Die Installation läuft denkbar einfach über<br />
<br />
sudo apt-get update<br />
sudo apt-get install apache2 apache2-utils apache2-doc php php-mysql php-pear<br />
<br />
Neben Apache gibt es ein paar Tools, Doku und neben PHP schon die Anbindung für MySQL und Apache. Apache kommt in der Version 2.4.29, bei PHP wird Version 7.2 installiert.<br />
<br />
Nach der Installation geht es an die eigentliche Konfiguration des Webservers. Ziel ist es, das eine Reihe von Anwendungen (Roundcube, PHPMyAdmin, etc.) nur einmal installiert werden müssen und dann allen eingerichteten Domains zur Verfügung stehen. Gleichzeitig sollen Dummies, die den Server über seine IP oder einen nicht vorhandenen Namen ansprechen, keine Dienste nutzen können, sondern lediglich eine Fehler-Seite sehen. Die folgende Konfiguration habe ich in Teilen in ihrer Version vom 12. November 2014 aus dem [[d:Root-Server_mit_OpenSuSE_13.1|Debacher-Wiki]] entnommen (CC-BY-SA). Wir legen also eine Grundkonfiguration für jeden "dummen" Aufruf an.<br />
<br />
Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen.<br />
Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis:<br />
mkdir /var/www/htdocs<br />
mkdir /var/www/vhosts<br />
mkdir /var/www/vhosts/default<br />
mv /var/www/html /var/www/vhosts/default/htdocs<br />
<br />
Wichtig ist, dass wir die Datei vorher einmal sichern:<br />
<br />
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.org<br />
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org<br />
<br />
Dann noch einige Apache-Module aktivieren:<br />
<br />
a2enmod ssl headers<br />
<br />
=== /etc/apache2/sites-available/000-default.conf ===<br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
ServerTokens Prod <br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
Alias /webmail /var/www/htdocs/roundcube<br />
Alias /roundcube /var/www/htdocs/roundcube<br />
Alias /pma /var/www/htdocs/pma<br />
Alias /webftp /var/www/htdocs/webftp<br />
<br />
<VirtualHost *:80><br />
ServerName default<br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/vhosts/default/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
# Verhindern des Zugriffs auf die CGI-Skripte<br />
<Directory "/var/www/cgi-bin/"><br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Deny from all <br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/access.log combined<br />
<br />
Alias /cgi-bin /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
</VirtualHost><br />
<br />
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet<br />
<br />
=== SSL ===<br />
Die zentrale Konfiguration von SSL nehmen wir in der /etc/mods-available/ssl.conf vor. Hier besonders:<br />
<br />
SSLCipherSuite SSLCipherSuite EECDH+AESGCM+AES256:EECDH+AES256<br />
SSLCompression Off<br />
SSLProtocol TLSv1.2<br />
SSLHonorCipherOrder On<br />
<br />
=== /etc/apache2/sites-available/000-default-ssl.conf ===<br />
<IfModule mod_ssl.c><br />
<VirtualHost _default_:443><br />
ServerAdmin webmaster@example.org<br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +SymLinksIfOwnerMatch +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined <br />
<br />
# Blocken der Anfragen an eingerichtete Dienste<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
<br />
<IfDefine MAILMAN><br />
ScriptAlias /mailman/ /var/www/htdocs/dummy<br />
Alias /mailmanicons/ /var/www/htdocs/dummy<br />
Alias /pipermail/ /var/www/htdocs/dummy<br />
</IfDefine><br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews SymLinksIfOwnerMatch<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
SSLEngine on<br />
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem<br />
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
</VirtualHost><br />
</IfModule><br />
<br />
=== Verzeichnisse ===<br />
Anschließend verlinken wir beide Dateien:<br />
ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/000-default.conf <br />
ln -s /etc/apache2/sites-available/000-default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf <br />
<br />
Anschließend müssen die Verzeichnisse anlegt werden:<br />
mkdir /var/www/htdocs/<br />
mkdir /var/www/vhosts/<br />
mkdir /var/www/vhosts/default<br />
mkdir /var/www/vhosts/default/htdocs<br />
<br />
Und übertragen:<br />
chown -R www-data.www-data /var/www/htdocs<br />
chown -R www-data.www-data /var/www/vhosts<br />
<br />
Configtest:<br />
apache2ctl configtest<br />
<br />
Neustart:<br />
service apache2 restart<br />
<br />
Firewall:<br />
ufw allow 'Apache Full'<br />
<br />
Damit läuft Apache, man kann jetzt testweise eine index.html in /var/www/vhosts/default/htdocs legen und sollte sie beim Aufruf der Serveradresse (IP oder Hostname) sehen.<br />
<br />
=== VHosts ===<br />
Für jede Domain, unter der der Webserver erreichbar sein soll, erstellen wir einen VirtualHost. Dafür stehen zwei Konfigurationsdateien zur Verfügung (reines HTTP und HTTP/HTTPS-Mix). Zur Generierung von Zertifikaten mittels Let's Encrypt nutzen wir den ersten Dummy und ersetzen ihn danach mit dem zweiten. In beiden Dateien muss jeweils der Platzhalter mit der Domain ersetzt werden (in vim: %s/dummy.domain/example.org).<br />
<br />
Die Problematik von SymLinks, die einem nicht gehören, habe ich von [https://blog.jonaspasche.com/2014/07/11/followsymlinks-vs-symlinksifownermatch/ Jonas Pasche] übernommen.<br />
<br />
==== HTTP-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs <br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
==== HTTPS-Dummy ====<br />
<VirtualHost *:80><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.example.org<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
Redirect permanent / https://www.dummy.domain/<br />
# Setze Alias, um die Generierung von Zertifikaten unabhängig vom bisherigen Zertifikat möglich zu machen<br />
Alias /.well-known /var/www/vhosts/dummy.domain/htdocs/.well-known<br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost><br />
<br />
<VirtualHost *:443><br />
ServerAdmin webmaster@dummy.domain<br />
ServerName dummy.domain<br />
ServerAlias www.dummy.domain dummy.domain.lt42.de<br />
SSLEngine on <br />
SSLCertificateFile /etc/letsencrypt/live/dummy.domain/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/dummy.domain/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/dummy.domain/chain.pem<br />
DocumentRoot /var/www/vhosts/dummy.domain/htdocs<br />
<Directory /var/www/vhosts/dummy.domain/htdocs/><br />
Options SymLinksIfOwnerMatch MultiViews<br />
AllowOverride AuthConfig FileInfo Indexes Limit Options=ExecCGI,Includes,Indexes,SymLinksIfOwnerMatch<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000" <br />
ErrorLog ${APACHE_LOG_DIR}/dummy.domain.error.log<br />
LogLevel warn<br />
CustomLog ${APACHE_LOG_DIR}/dummy.domain.access.log combined<br />
</VirtualHost></div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_18.04&diff=202Root-Server mit Ubuntu 18.042019-12-29T11:30:48Z<p>Lukas: Die Seite wurde neu angelegt: „Mein alter Server läuft noch mit Ubuntu 16.04. Das ist erstmal kein Problem, der Support läuft noch, allerdings wird…“</p>
<hr />
<div>Mein [[Root-Server_mit_Ubuntu_16.04-Hetzner|alter Server]] läuft noch mit Ubuntu 16.04. Das ist erstmal kein Problem, der Support läuft noch, allerdings wird die aktuellste PHP-Version nicht unterstützt. Das macht bei einigen Anwendungen nun schon Probleme. Daher habe ich einen zweiten Server in der Serverbörse geordert. Die Rechner sind teurer geworden. Der Rechner ist vergleichbar mit dem alten, kostet aber 6€ mehr. Positiv ist, dass ich dadurch eine Ausfallsicherheit erreichen kann. Ich werde den neuen Server einrichten und anschließend den alten aktualisieren.<br />
<br />
Der neue Rechner hat folgende Daten:<br />
* Intel Core i7-2600 8x 3.40GHz (8x 6823.66 Bogomips)<br />
* 16 GB Arbeitsspeicher<br />
* 2x 3 TB im RAID1-Verbund Festplattenspeicher<br />
<br />
Der Rechner kostet 30€/Monat.<br />
<br />
== Installation ==<br />
Hetzner liefert die Geräte im Rescue-Modus aus. Das ist ein Minimal-Linux mit Tools zur Rettung und dem Skript [https://github.com/hetzneronline/installimage installimage], mit dem eine Betriebssystem-Installation vorgenommen werden kann. Das ist schon mal ein großer Unterschied zu Strato, die die Rechner selber installieren und dann zur Verfügung stellen.<br />
<br />
Der Robot (Kundencenter) von Hetzner bietet allerlei Möglichkeiten, so kann der Rechner bequem mit einem Strg + Alt + Entf-Befehl gefüttert werden oder per ACPI neugestartet werden. Zudem bietet Hetzner die Möglichkeit eines Weckens über LAN (WOL) und man kann bequem eigene Monitoring-Dienste für den Rechner anlegen, sodass man bei Unregelmäßigkeiten per Mail informiert wird.<br />
<br />
Die Installation des Rechners erfolgt dann über den Befehl <code>installimage</code>. Nach einer Auswahl des Betriebssystems kann man über eine Textdatei die RAID-Einstellungen, Festplattenpartitionierung und den Hostnamen konfigurieren. Das macht es besonders einfach, mehrere Rechner zu installieren oder sich die Konfiguration noch einmal abzuspeichern.<br />
<br />
Nach dem Verlassen des Editors installiert der Rechner dann das Grundsystem, während man zugucken kann:<br />
<br />
Hetzner Online GmbH - installimage<br />
<br />
Your server will be installed now, this will take some minutes<br />
You can abort at any time with CTRL+C ...<br />
<br />
: Reading configuration done <br />
: Loading image file variables done <br />
: Loading ubuntu specific functions done <br />
1/16 : Deleting partitions done <br />
2/16 : Test partition size done <br />
3/16 : Creating partitions and /etc/fstab done <br />
4/16 : Creating software RAID level 1 done <br />
5/16 : Formatting partitions<br />
: formatting /dev/md/0 with swap done <br />
: formatting /dev/md/1 with ext2 done <br />
: formatting /dev/md/2 with ext4 done <br />
: formatting /dev/md/3 with xfs done <br />
: formatting /dev/md/4 with ext4 done <br />
: formatting /dev/md/5 with ext4 done <br />
6/16 : Mounting partitions done <br />
7/16 : Sync time via ntp done <br />
: Importing public key for image validation done <br />
8/16 : Validating image before starting extraction done <br />
9/16 : Extracting image (local) done <br />
10/16 : Setting up network config done <br />
11/16 : Executing additional commands<br />
: Setting hostname done <br />
: Generating new SSH keys done <br />
: Generating mdadm config done <br />
: Generating ramdisk done <br />
: Generating ntp config done <br />
12/16 : Setting up miscellaneous files done <br />
13/16 : Configuring authentication<br />
: Fetching SSH keys done <br />
: Disabling root password done <br />
: Disabling SSH root login without password done <br />
: Copying SSH keys done <br />
14/16 : Installing bootloader grub done <br />
15/16 : Running some ubuntu specific functions done <br />
16/16 : Clearing log files done <br />
<br />
INSTALLATION COMPLETE<br />
You can now reboot and log in to your new system with<br />
the same password as you logged in to the rescue system.<br />
<br />
root@rescue ~ # reboot<br />
<br />
Nach dem Neustart steht dann das neue System zur Verfügung. Die Installation hat letztlich mit Lektüre etwa 7 Minuten gedauert. Das ist ein enormer Fortschritt zu anderen Providern.<br />
<br />
== Grundlegendes ==<br />
Die Installationsimages sind nicht unbedingt tagesaktuell, daher aktualisieren wir nach der Anmeldung als root erstmal die Software:<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Und ein paar Tools:<br />
apt-get install vim htop<br />
<br />
== Firewall ==<br />
Als Firewall lässt sich ufw nutzen. Das Paket muss nachinstalliert werden:<br />
apt-get install ufw<br />
<br />
und lässt sich dann einfach konfigurieren. ufw kann mit Softwarepaketen und einzelnen Ports umgehen:<br />
ufw allow 22<br />
ufw allow OpenSSH<br />
<br />
Obiges zu setzen bevor die Firewall aktiviert wird, ist wichtig, da man sich sonst aus dem System aussperrt. Nach einer Aktivierung mittels<br />
ufw enable<br />
zeigt die Firewall auch automatisch Wirkung. Apache ist nun nicht mehr erreichbar. Das lässt sich mittels<br />
ufw allow "Apache Full"<br />
lösen.<br />
<br />
Hetzner bietet in der KonsoleH ebenfalls Möglichkeiten zur Firewallkonfiguration. Vielleicht kann man so sogar noch Last vom Rechner abwenden. Ich probiere das mal aus.</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Schnipsel&diff=201Schnipsel2019-10-03T12:04:59Z<p>Lukas: </p>
<hr />
<div>== OS X Samba-Icon ändern ==<br />
Um dem Samba-Server ein anderes Icon in OS X zu verleihen passen wir unter Debian die Datei /etc/avahi/services/smb.service wie folgt an:<br />
<?xml version="1.0" standalone='no'?><!--*-nxml-*--><br />
<!DOCTYPE service-group SYSTEM "avahi-service.dtd"><br />
<br />
<service-group><br />
<name replace-wildcards="yes">%h-SMB</name><br />
<service><br />
<type>_smb._tcp</type><br />
<port>445</port><br />
</service><br />
<service><br />
<type>_device-info._tcp</type><br />
<port>0</port><br />
<txt-record>model=Xserve</txt-record><br />
</service><br />
</service-group><br />
<br />
Unter "model=Xserve" kann man dann das gewünschte Modell eintragen.<br />
<br />
== Ubuntu IPTables PPTP Pass Through ==<br />
Es hat mich einige Zeit gekostet, IPTables auf einem Server so zu konfigurieren, dass er VPN PPTP Pass Through erlaubt. Letztlich bringt IPTables ein Modul mit, dessen Aktivierung das erlaubt:<br />
sudo modprobe ip_nat_pptp<br />
Dann sollte PPTP klappen.<br />
<br />
== Linux-Netzwerkschnittstellen werden nicht richtig benannt ==<br />
Falls die Netzwerkschnittstellen auf einem neu installierten Linux nicht eth0 und eth1, sondern z.B. p4p1 heißen, liegt das daran, dass das Betriebssystem die BIOS-eigenen Namen verwendet. Das kann durch folgende Parameter in /etc/default/grub behoben werden:<br />
GRUB_CMDLINE_LINUX_DEFAULT=”biosdevname=0”<br />
GRUB_CMDLINE_LINUX=”biosdevname=0″<br />
<br />
danach einmal<br />
sudo update-grub<br />
ausführen und den Rechner neu starten.<br />
<br />
== External Commands in Nagios3 ausführen ==<br />
Nagios bringt eine Funktion mit, mit der sich z.B. Downtimes von überwachten Client über das Web eintragen lassen. Dies ist z.B. dann praktisch, wenn ein Client geplant länger nicht erreichbar ist.<br />
Standardmäßig ist diese Funktion zwar im Interface, aber nicht im Backend aktiviert (Fehler-Meldung: Error: Could not stat() command file /var/lib/nagios3/rw/nagios.cmd). Die Lösung ist auf [http://technosophos.com/2010/01/13/nagios-fixing-error-could-not-stat-command-file-debian.html] und [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=571801] dokumentiert.<br />
<br />
Änderungen in /etc/nagios3/nagios.cfg<br />
check_external_commands=1<br />
command_check_interval=15s<br />
#command_check_interval=-1<br />
command_file=/var/lib/nagios3/rw/nagios.cmd<br />
<br />
Änderungen in /etc/nagios3/cgi.cfg<br />
authorized_for_system_commands=*<br />
authorized_for_all_service_commands=*<br />
authorized_for_all_host_commands=*<br />
<br />
(* steht hier für alle authentifizierten Benutzer. Alternativ können die htpasswd-Benutzer angegeben werden.)<br />
<br />
Zusätzlich dazu müssen noch Dateirechte gesetzt werden:<br />
service nagios3 stop<br />
dpkg-statoverride --update --add nagios www-data 2710 /var/lib/nagios3/rw<br />
dpkg-statoverride --update --add nagios nagios 751 /var/lib/nagios3<br />
service nagios3 start<br />
<br />
Sollte das noch nicht klappen, muss der Apache-Benutzer noch in die Nagios-Gruppe aufgenommen werden:<br />
service nagios3 stop<br />
gpasswd -a www-data nagios<br />
service nagios3 start<br />
<br />
== Fail2Ban IP entsperren ==<br />
Zum ordentlichen Entsperren von versehentlich gesperrten IP-Adressen über Fail2Ban ist folgender Befehl auszuführen:<br />
fail2ban-client set JAIL unbanip IP<br />
Das JAIL bekommen wir entweder auf der Mail heraus oder über den Befehl<br />
fail2ban-client status<br />
<br />
<br />
== RSyslog - Log-Empfang aktivieren ==<br />
RSyslog bietet standardmäßig an, auch Logdateien von anderen Systemen zu sammeln. Das kann dann sinnig sein, wenn man viele Services auf verschiedenen Systemen hat und diese zentral loggen möchte.<br />
Das geht nach der Standard-Installation von Ubuntu ganz einfach über ein Editieren der Datei<br />
vi /etc/rsyslog.conf<br />
<br />
Hier müssen die Zeilen<br />
<br />
# provides UDP syslog reception<br />
#module(load="imudp")<br />
#input(type="imudp" port="514")<br />
<br />
# provides TCP syslog reception<br />
#module(load="imtcp")<br />
#input(type="imtcp" port="514")<br />
<br />
geändert werden in<br />
<br />
# provides UDP syslog reception<br />
module(load="imudp")<br />
input(type="imudp" port="514")<br />
<br />
# provides TCP syslog reception<br />
module(load="imtcp")<br />
input(type="imtcp" port="514")<br />
<br />
== OpenVPN Routing schlägt fehl ==<br />
Ich hatte einen VPN-Server aufgesetzt, der IP-Adressen aus dem gleichen Netz verteilt wie das Gateway, auf dem er lief, aufgesetzt. Die Verbindung war da und wenn auf den Rechner im LAN hinter dem VPN-Server die Router für das Subnetz korrekt eingestellt war, ging auch alles glatt. Nur eben nicht, ohne die Routingtabellen auf allen Clients anzufassen.<br />
Letztlich war das Problem, dass die VPN-Adressen sich von den Rechnern im LAN unterscheiden müssen und zwar dürfen diese nicht nur nicht schon belegt sein, sondern müssen zudem aus einem anderen Subnetz kommen als schon im LAN durch die Subnetzmaske abgedeckt wird.<br />
<br />
Konfigurationsbeispiel: Subnetz im LAN: 172.16.0.0/255.255.0.0<br />
<br />
Erst hatte ich 172.16.41.0/255.255.255.0 als VPN-Netz eingestellt. Das klappte nicht.<br />
<br />
Mit 10.8.0.0/255.255.255.0 als VPN-Netz klappt es ohne Probleme.<br />
<br />
Dazu muss ipv4_forward in der sysctl aktiviert sein und push "route 172.16.0.0 255.255.0.0" in der server.conf von OpenVPN eingestellt sein.<br />
<br />
== Xubuntu Belegung Volume Media Keys ==<br />
Bei der Installation meiner Xubuntu-Installation wurden die MediaKeys für die Lautstärke nicht ordentlich belegt. Das kann nachgeholt werden in Einstellungen > Tastatur > Tastenkürzel für Anwendungen. Hier müssen drei Befehle ergänzt werden:<br />
<br />
amixer set Master 5%- XF86AudioLowerVolume<br />
amixer set Master 5%+ XF86AudioRaiseVolume<br />
amixer sset Master toggle XF86AudioMute</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Eigenes_DynDNS_mit_PowerDNS&diff=200Eigenes DynDNS mit PowerDNS2019-05-17T13:46:55Z<p>Lukas: </p>
<hr />
<div>Vor einiger Zeit hat dyndns.org seinen freien dynamischen DNS-Dienst eingestellt und die Kunden so gezwungen, entweder in einen Premium-Account zu migrieren oder sich anderwaltig umzuschauen. Ich habe mich dann für no-ip.org entschieden, mit dessen Service ich bis heute sehr zufrieden. Lediglich einmal kam es zu DNS-Problemen, die dann aber auch schnell gelöst waren.<br />
Da ich öfter DynDNS-Dienste einsetze, lege ich für alle Kunden verschiedene Konten an, was dann natürlich gerne mal zu Passwortverwechslungen führt.<br />
<br />
DynDNS kann man aber auch selber machen. Der Trick ist in der c't 24/2013 und auch bei [[d:Mein_eigenes_DynDNS|Uwe Debacher]] beschrieben. Der besteht darin, dass nicht BIND als DNS-Server eingesetzt wird, sondern [https://www.powerdns.com/ PowerDNS], der seine Domain-Daten in einer Datenbank speichert. Dadurch sind sie durch PHP manipulierbar und können so ohne wenig Aufwand von außen aktualisiert werden.<br />
<br />
== Installation von PDNS ==<br />
Wir erstellen danach eine Datenbank mit einem Benutzer. Und fügen folgendes Datenbank-Schema ein:<br />
<br />
CREATE TABLE IF NOT EXISTS 'domains' (<br />
'id' int(11) NOT NULL,<br />
'name' varchar(255) NOT NULL,<br />
'master' varchar(128) DEFAULT NULL,<br />
'last_check' int(11) DEFAULT NULL,<br />
'type' varchar(6) NOT NULL,<br />
'notified_serial' int(11) DEFAULT NULL,<br />
'account' varchar(40) DEFAULT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'hostnames' (<br />
'hostname' varchar(255) NOT NULL,<br />
'userid' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'records' (<br />
'id' int(11) NOT NULL,<br />
'domain_id' int(11) DEFAULT NULL,<br />
'name' varchar(255) DEFAULT NULL,<br />
'type' varchar(10) DEFAULT NULL,<br />
'content' varchar(255) DEFAULT NULL,<br />
'ttl' int(11) DEFAULT NULL,<br />
'prio' int(11) DEFAULT NULL,<br />
'change_date' int(11) DEFAULT NULL,<br />
'ordername' varchar(255) DEFAULT NULL,<br />
'auth' tinyint(1) DEFAULT NULL<br />
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;<br />
<br />
CREATE TABLE IF NOT EXISTS 'users' (<br />
'id' varchar(255) NOT NULL,<br />
'password' varchar(255) NOT NULL<br />
) ENGINE=InnoDB DEFAULT CHARSET=latin1;<br />
<br />
ALTER TABLE 'domains'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'name_index' ('name');<br />
<br />
ALTER TABLE 'hostnames'<br />
ADD PRIMARY KEY ('hostname'), ADD UNIQUE KEY 'hostname_index' ('hostname');<br />
<br />
ALTER TABLE 'records'<br />
ADD PRIMARY KEY ('id'), ADD KEY 'rec_name_index' ('name'), ADD KEY 'nametype_index' ('name','type'), ADD KEY 'domain_id' ('domain_id'), ADD KEY 'orderindex' ('ordername'), ADD KEY 'id' ('id');<br />
<br />
ALTER TABLE 'users'<br />
ADD PRIMARY KEY ('id'), ADD UNIQUE KEY 'user_index' ('id');<br />
<br />
ALTER TABLE 'records'<br />
MODIFY 'id' int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=9;<br />
<br />
Unter Ubuntu sind folgende Pakete zu installieren, falls MySQL als Backend benutzt werden soll:<br />
apt-get update<br />
apt-get install pdns-server pdns-backend-mysql<br />
<br />
Hier werden wir beim Installieren nach MySQL-Zugangsdaten gefragt, diese tragen wir ein und lassen die Installation auch gleich die Datenbank-Struktur anlegen.<br />
<br />
Eigentlich steuert man PowerDNS über die Administrationsoberfläche [http://www.poweradmin.org/ PowerAdmin]. Das ist dank PHPMyAdmin aber eigentlich nicht nötig.<br />
<br />
PowerDNS läuft standardmäßig noch nicht.<br />
Wir passen die Datei /etc/powerdns/pdns.conf wie folgt an (Die Zeilen können einfach auskommentiert und neu eingefügt werden):<br />
allow-axfr-ips=<oeffentliche-ipv4-des-servers> 127.0.0.1 173.244.206.26 88.198.106.11<br />
allow-recursion=127.0.0.1<br />
daemon=yes<br />
master=yes<br />
<br />
Nun lässt PowerDNS den Zonen-Download vom lokalen Server und den Servern von BuddyNS zu (siehe unten), startet als Daemon und sieht sich als Zonen-Master (standardmäßig nämlich nicht).<br />
<br />
Nun startet PowerDNS aber noch nicht richtig. Dieser Fehler hat mich einige Zeit gekostet: Unter /etc/powerdns/pdns.d/ müssen zwei Konfiguration-Dateien angepasst werden:<br />
In /etc/powerdns/pdns.d/pdns.simplebind.conf kommentieren wir beide Zeilen aus:<br />
#launch=bind<br />
#bind-config=/etc/powerdns/bindbackend.conf<br />
und in /etc/powerdns/pdns.d/pdns.local.gmysql.conf kontrollieren wir die Zugangsdaten zu MySQL und ändern folgende Zeile von yes auf no:<br />
gmysql-dnssec=no<br />
Damit sollte PowerDNS via<br />
service pdns restart<br />
starten.<br />
<br />
== Eintragen der Zonen ==<br />
Damit sich unser Server auch als Master für die Domain sieht, müssen wir eine Master Zone anlegen. Das geht über PowerAdmin nach einer Anmeldung über den Link "Master Zone hinzufügen". Der Name der Zone ist der Name der Domain. Unter "Zonen auflisten" können wir dann die Zone mit dem kleinen Stift neben dem Namen bearbeiten. Hier sind vor allem erstmal drei Einträge der Marke "NS" wichtig:<br />
<br />
Diese Einträge sagen den weltweiten DNS-Servern, wer die DNS-Server für unsere Domain sind. Danach müssen wir natürlich die Standard-Records (A für Adressauflösung und MX für Mail) eintragen.<br />
<br />
== Zweiter Nameserver ==<br />
Für die Ausfallsicherheit sind Domains immer zwei unterschiedliche Nameserver zuzuweisen. Idealerweise sind beide auch nicht im gleichen Netz. Für alle, die keine zwei getrennten 24 Stunden erreichbaren Server betreiben, bietet sich der Service von http://www.buddyns.com an. Nach dem Registrieren mit Domainname, IP-Adresse des primären DNS-Servers (IP des eigenen Servers) und E-Mail-Adresse bekommt man ein Passwort zugeschickt, mit dem man Zugriff auf das Bullyboard hat:<br />
<br />
Hier ist besonders der Reiter "Zones" interessant.<br />
<br />
Bis alles korrekt eingestellt ist, ist der obige Balken noch rot. Haben wir noch keine Einstellungen beim Registrar vorgenommen, sollten die Felder "Authority declares BuddyNS" und "Registry declares BuddyNS" nicht auf OK stehen. Sollte hier aber alles andere stimmen, können wir die DNS-Einstellungen unter http://www.denic.de/hintergrund/nast.html testen. Dazu geben wir unseren Domainnamen und die beiden DNS-Server an. BuddyNS bittet darum, die regionalen Nameserver zu benutzen. Für Europa sind das e.ns.buddyns.com und c.ns.buddyns.com<br />
<br />
Gibt die Denic grünes Licht, können wir die Nameserver beim Registrar ändern (meist per Domain-Update o.ä. auslösbar).<br />
<br />
== Konfiguration Fritz!Box ==<br />
Die Grundidee ist einfach: Jede Nacht bekommt die Fritz!Box durch den Provider nach der Zwangstrennung eine neue IP-Adresse zugewiesen. Nach diesem Update soll die Fritz!Box die IP-Adresse des DynDNS neu setzen. Sie kann dann auf ein PHP-Script zugreifen, das die Daten in der Datenbank aktualisiert. Das sollte natürlich mit einem Passwort geschützt sein, damit kein Fremder die Domain kapern kann.<br />
<br />
Ich benutze momentan eine abgewandelte Version des Scriptes aus der c't und benutze mysqli statt PDO als Datenbank-Anbindung. Sehr wichtig ist es, dass die Seriennummer des DNS-Records im SOA-Record nach einer Änderung hochgesetzt wird. Der Autor arbeitet mit preg_match, um die entsprechende Stelle im Record zu finden und hochzusetzen.<br />
<br />
In der Fritz!Box kann man mit Platzhaltern arbeiten, um das PHP-Script aufzurufen. Mehr dazu findet sich in der AVM-Hilfe.<br />
<br />
Hinweise zur Konfiguration der Fritz!Box finden sich auch hier: http://www.heise.de/ct/inhalt/2013/24/196/</div>Lukashttps://www.lukasthiel.de/mediawiki/index.php?title=Root-Server_mit_Ubuntu_16.04&diff=199Root-Server mit Ubuntu 16.042019-03-20T20:02:36Z<p>Lukas: </p>
<hr />
<div>Eine neuere Version dieses Artikels steht [[Root-Server_mit_Ubuntu_16.04-Hetzner|hier]] zur Verfügung.<br />
<br />
Das aktuelle Angebot an Strato-Servern hat sich kaum geändert. Allerdings bietet Strato nun auch Ubuntu 16.04 als Betriebssystem an. Mal sehen, was sich bei der Installation so alles geändert hat.<br />
<br />
Offensichtlich bietet Strato standardmäßig nun keinen Backup-Platz mehr an. Das ist schade, da das "Managed Backup" extra kostet. Früher konnte man einfach ein Skript laufen lassen, dass die Platten regelmäßig auf einen FTP-Server sichert.<br />
Der Rechner hat folgende Eckdaten:<br />
* AMD Opteron 1385 mit 4 x 2,7 GHz (4x 5400.16 Bogomips)<br />
* 4 GB Arbeitsspeicher<br />
* 2 x 500 GB im RAID1-Verbund Festplattenspeicher<br />
<br />
Den Rechner gibt es drei Monate für 11€, dann für 22€ im Monat. Einrichtungspreis ist 29€.<br />
<br />
== Smartmontools ==<br />
Für Informationen über die Festplatte bieten sich die Smartmontools an:<br />
sudo apt-get update<br />
sudo apt-get install smartmontools<br />
<br />
Mit den Befehl folgenden Befehlen bekommen wir Informationen über die Fetplatten sda und sdb:<br />
sudo smartctl -a /dev/sda<br />
sudo smartctl -a /dev/sdb<br />
<br />
Die Platten sind mit 35705 und 35774 Stunden (~4 Jahre) definitiv nicht neu, weisen aber auch keine fatalen Fehler auf. Mein gebrauchter Root-Server als Serversondermodell lief schon 5 1/2 Jahre.<br />
<br />
== Webserver Apache2 ==<br />
Zur Bereitstellung von Webseiten benutzen wir den Apache-Webserver. Da der Server unter mehreren Namen erreichbar sein wird, richten wir VirtualHosts ein.<br />
<br />
Die Installation läuft denkbar einfach über<br />
<br />
sudo apt-get update<br />
sudo apt-get install apache2 apache2-utils apache2-doc php php-mysql php-pear libapache2-mod-php7.0<br />
<br />
Wir installieren also auch gleich PHP und PHP-PEAR mit. Apache kommt in der Version 2.4.18, bei PHP wird schon die neue Version 7 installiert.<br />
An den Konfigurationsdateien hat sich augenscheinlich nicht verändert. Die Standard-Seite ist aber ganz hübsch.<br />
<br />
Nach der Installation geht es an die eigentliche Konfiguration des Webservers. Ziel ist es, das eine Reihe von Anwendungen (Roundcube, PHPMyAdmin, etc.) nur einmal installiert werden müssen und dann allen eingerichteten Domains zur Verfügung stehen. Gleichzeitig sollen Dummies, die den Server über seine IP oder einen nicht vorhandenen Namen ansprechen, keine Dienste nutzen können, sondern lediglich eine Fehler-Seite sehen. Die folgende Konfiguration habe ich in Teilen in ihrer Version vom 12. November 2014 aus dem [[d:Root-Server_mit_OpenSuSE_13.1|Debacher-Wiki]] entnommen (CC-BY-SA). Wir legen also eine Grundkonfiguration für jeden "dummen" Aufruf an.<br />
<br />
Die VHosts werden später unter /var/www/vhosts/ angelegt. Unter /var/www/vhosts/default/htdocs/ findet sich dann die Fehlerseite und unter /var/www/htdocs/ die entsprechenden Anwendungen.<br />
Die Ordner erstellen wir nun einmal. Dazu kopieren wir auch die Standard-Seite in das entsprechende Verzeichnis:<br />
mkdir /var/www/htdocs<br />
mkdir /var/www/vhosts<br />
mkdir /var/www/vhosts/default<br />
mv /var/www/html /var/www/vhosts/default/htdocs<br />
<br />
Wichtig ist, dass wir die Datei vorher einmal sichern:<br />
<br />
cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.org<br />
cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org<br />
<br />
=== /etc/apache2/sites-available/000-default.conf ===<br />
<br />
ServerName default<br />
ServerAdmin webmaster@lukasthiel.de<br />
<br />
ServerTokens Major<br />
<br />
DocumentRoot /var/www/htdocs/<br />
<br />
# Aliase werden einmal zentral gesetzt. Diese Aliase sind von allen Domains aus erreichbar.<br />
Alias /webmail /var/www/htdocs/roundcube<br />
Alias /ftp /var/www/htdocs/webftp<br />
<br />
<Directory "/var/www/vhosts"><br />
AllowOverride All<br />
Options +FollowSymLinks<br />
Order allow,deny<br />
Allow from all<br />
<IfModule mod_php5.c><br />
</IfModule><br />
</Directory><br />
<br />
<IfModule mod_userdir.c><br />
UserDir disabled<br />
</IfModule><br />
<br />
<VirtualHost *:80><br />
ServerName default<br />
UseCanonicalName Off<br />
DocumentRoot /var/www/vhosts/default/htdocs/<br />
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"<br />
<br />
# Blocken der Anfragen an eingerichtete Dienste<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
<br />
<IfDefine MAILMAN><br />
ScriptAlias /mailman/ /var/www/htdocs/dummy<br />
Alias /mailmanicons/ /var/www/htdocs/dummy<br />
Alias /pipermail/ /var/www/htdocs/dummy<br />
</IfDefine><br />
<br />
<IfModule mod_ssl.c><br />
SSLEngine off<br />
</IfModule><br />
# Deaktivieren des Zugriffs auf die CGI-Skripte von irgendwo<br />
<Directory "/var/www/cgi-bin/"><br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Deny from all <br />
</Directory><br />
<Directory /var/www/vhosts/default/htdocs><br />
AllowOverride All<br />
Options None<br />
Order allow,deny<br />
Allow from all <br />
<br />
<IfModule mod_php5.c><br />
php_admin_flag engine on<br />
php_admin_flag safe_mode off<br />
</IfModule><br />
</Directory><br />
<br />
</VirtualHost><br />
<br />
=== /etc/apache2/sites-available/default-ssl.conf ===<br />
<IfModule mod_ssl.c><br />
<VirtualHost _default_:443><br />
ServerAdmin webmaster@localhost<br />
<br />
DocumentRoot /var/www/htdocs<br />
<Directory /var/www/><br />
Options -Indexes +FollowSymLinks +MultiViews<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
<br />
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/<br />
<Directory "/usr/lib/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
ErrorLog ${APACHE_LOG_DIR}/error.log<br />
<br />
# Possible values include: debug, info, notice, warn, error, crit,<br />
# alert, emerg.<br />
LogLevel warn<br />
<br />
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined <br />
<br />
# Blocken der Anfragen an eingerichtete Dienste<br />
Alias /webmail /var/www/htdocs/dummy<br />
Alias /pma /var/www/htdocs/dummy<br />
Alias /webftp /var/www/htdocs/dummy<br />
Alias /roundcube /var/www/htdocs/dummy<br />
<br />
<IfDefine MAILMAN><br />
ScriptAlias /mailman/ /var/www/htdocs/dummy<br />
Alias /mailmanicons/ /var/www/htdocs/dummy<br />
Alias /pipermail/ /var/www/htdocs/dummy<br />
</IfDefine><br />
<br />
Alias /doc/ "/usr/share/doc/"<br />
<Directory "/usr/share/doc/"><br />
Options Indexes MultiViews FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Deny from all<br />
Allow from 127.0.0.0/255.0.0.0 ::1/128<br />
</Directory><br />
SSLEngine on<br />
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem<br />
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <br />
SSLProtocol All -SSLv2 -SSLv3<br />
SSLHonorCipherOrder On<br />
SSLCompression off<br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA<br />
<FilesMatch "\.(cgi|shtml|phtml|php)$"><br />
SSLOptions +StdEnvVars<br />
</FilesMatch><br />
<Directory /usr/lib/cgi-bin><br />
SSLOptions +StdEnvVars<br />
</Directory><br />
<br />
BrowserMatch "MSIE [2-6]" \<br />
nokeepalive ssl-unclean-shutdown \<br />
downgrade-1.0 force-response-1.0<br />
# MSIE 7 and newer should be able to use keepalive<br />
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown<br />
<br />
</VirtualHost><br />
</IfModule><br />
<br />
Entscheidend ist, dass die angegebenen Pfade tatsächlich existieren, sonst gibt Apache beim nächsten Start eine Fehlermeldung aus. Sollten die Verzeichnisrechte nicht richtig gesetzt sein, kann das mittels<br />
sudo chown -R www-data.www-data /var/www/<br />
sudo chmod -R 0770 /var/www/<br />
nachgeholt werden.<br />
<br />
Nun geht es an die Konfiguration der Strato-Adresse. Ruft man den Server über seinen hXXXXXXX.stratoserver.net auf, kann man so beeinflussen, was angezeigt wird.<br />
<br />
=== /etc/apache2/sites-available/stratoserver.net.conf ===<br />
<VirtualHost *:80><br />
ServerName h1234xyz.stratoserver.net<br />
UseCanonicalName Off<br />
DocumentRoot /var/www/vhosts/default/htdocs<br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
ErrorLog /var/log/apache2/error.log<br />
<br />
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"<br />
# Soll PHPMyAdmin verfügbar sein, kann der Pfad hier aktiviert werden. <br />
# Alias /pma /var/www/htdocs/phpMyAdmin<br />
Alias /webstat /var/www/vhosts/default/webstat<br />
<IfModule mod_ssl.c><br />
SSLEngine off<br />
</IfModule><br />
<br />
<Directory "/var/www/cgi-bin/"><br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
<br />
<Directory /var/www/vhosts/default/htdocs><br />
AllowOverride All<br />
Options None<br />
Order allow,deny<br />
Allow from all <br />
<br />
<IfModule mod_php5.c><br />
php_admin_flag engine on<br />
php_admin_flag safe_mode off<br />
# php_admin_value include_path "/var/www/htdocs/horde/pear:/var/www/htdocs:./"<br />
# php_admin_value open_basedir "/var/www/htdocs:/tmp"<br />
</IfModule><br />
</Directory><br />
<br />
</VirtualHost><br />
<br />
<IfModule mod_ssl.c><br />
<br />
<VirtualHost *:443 ><br />
ServerName h1234xyz.stratoserver.net<br />
UseCanonicalName Off <br />
DocumentRoot /var/www/vhosts/default/httpsdocs <br />
<br />
CustomLog /var/log/apache2/access.log combined<br />
ErrorLog /var/log/apache2/error.log <br />
<br />
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"<br />
# Alias /pma /var/www/htdocs/phpMyAdmin<br />
# Alias /webftp /var/www/htdocs/webftp <br />
<br />
SSLEngine on<br />
<br />
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNUL<br />
SSLCertificateFile /var/www/vhosts/default/ssl/server.crt<br />
SSLCertificateKeyFile /var/www/vhosts/default/ssl/server.key<br />
SSLProtocol All -SSLv2 -SSLv3<br />
SSLHonorCipherOrder On<br />
SSLCompression off<br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA<br />
<br />
<Directory "/var/www/cgi-bin/"><br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Allow from all <br />
</Directory><br />
<br />
<Directory /var/www/vhosts/default/httpsdocs><br />
SSLRequireSSL<br />
AllowOverride None<br />
Options None<br />
Order allow,deny<br />
Allow from all <br />
</Directory><br />
</VirtualHost><br />
<br />
</IfModule><br />
<br />
Damit ist die Grundkonfiguration von Apache abgeschlossen. Für jeden neuen VirtualHost legen wir ab dann eine Datei als /etc/apache2/sites-avaiable/<domain>.conf an.<br />
<br />
Wichtig ist: Der Ubuntu-Apache unterscheidet zwischen aktivierten und verfügbaren Konfigurationen. Wir müssen also jede Datei noch einmal extra unter /etc/apache2/sites-enabled/ einbinden. Dazu einfach einen symbolischen Link erstellen:<br />
sudo ln -s /etc/apache2/sites-available/<domain>.conf /etc/apache2/sites-enabled/<domain>.conf<br />
Das muss selbstverständlich auch mit der Standardkonfiguration gemacht werden, sofern das nicht schon standardmäßig passiert ist.<br />
<br />
Eine Beispiel-Konfiguration für VirtualHosts findet sich ebenfalls im [[d:Einzelheiten_zur_Apache-Konfiguration|Debacher-Wiki]] (CC-by-sa). Dabei muss <dummy> mit der Domain ersetzt werden (in VI durch :%s/<dummy>/example.org. Die Verzeichnisse werden dann unterhalb von /var/www/vhosts/<dummy> angelegt. Hier ist es sinnig, nach Seiten mit aktiviertem SSL und Seiten ohne SSL zu unterscheiden. Wichtig ist, dass alle Konfigurationsdateien mit .conf enden, da sie sonst von Apache ignoriert werden.<br />
<br />
=== /etc/apache/sites-available/dummy.conf ===<br />
<br />
<VirtualHost *:80><br />
ServerName www.<dummy>:80<br />
ServerAlias <dummy><br />
UseCanonicalName Off<br />
DocumentRoot /var/www/vhosts/<dummy>/htdocs<br />
<br />
CustomLog /var/log/apache2/<dummy>.access.log combined<br />
ErrorLog /var/log/apache2/<dummy>.error.log<br />
<br />
CustomLog /var/log/apache2/vhosts.access.log vhost_combined<br />
<br />
ScriptAlias /cgi-bin/ /var/www/vhosts/<dummy>/cgi-bin/<br />
Alias /webstat /var/www/vhosts/<dummy>/webstat<br />
<br />
<IfModule mod_ssl.c><br />
SSLEngine off<br />
</IfModule><br />
<br />
<Directory /var/www/vhosts/<dummy>/htdocs><br />
<br />
<IfModule mod_php5.c><br />
php_admin_flag engine on<br />
php_admin_flag safe_mode off<br />
php_admin_value include_path "/var/www/vhosts/<dummy>/htdocs:.:/tmp:./:/usr/share/php5/PEAR/"<br />
php_admin_value open_basedir "/var/www/vhosts/<dummy>/htdocs:/tmp:.:/usr/share/php5/PEAR/"<br />
<br />
</IfModule><br />
<br />
<IfModule mod_python.c><br />
<Files ~ (\.py$)><br />
SetHandler python-program<br />
PythonHandler mod_python.cgihandler<br />
</Files><br />
</IfModule><br />
<br />
Options -Includes +ExecCGI<br />
</Directory><br />
<Directory "/var/www/vhosts/<dummy>/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -Includes<br />
Order allow,deny<br />
Allow from all <br />
</Directory><br />
<br />
</VirtualHost><br />
<br />
=== /etc/apache/sites-available/dummy-ssl.conf ===<br />
<IfModule mod_ssl.c><br />
<br />
<VirtualHost *:443><br />
ServerName www.<dummy>:443<br />
ServerAlias <dummy><br />
UseCanonicalName Off<br />
DocumentRoot /var/www/vhosts/<dummy>/htdocs<br />
<br />
CustomLog /var/log/apache2/<dummy>.access.log combined<br />
ErrorLog /var/log/apache2/<dummy>.error.log<br />
<br />
ScriptAlias /cgi-bin/ /var/www/vhosts/<dummy>/cgi-bin/<br />
Alias /webstat /var/www/vhosts/<dummy>/webstat<br />
<br />
SSLEngine on<br />
<br />
<Directory /var/www/vhosts/<dummy>/htdocs><br />
<br />
<IfModule mod_php5.c><br />
php_admin_flag engine on<br />
php_admin_flag safe_mode off<br />
php_admin_value include_path "/var/www/vhosts/<dummy>/htdocs:.:/tmp:./:/usr/share/php5/PEAR/"<br />
php_admin_value open_basedir "/var/www/vhosts/<dummy>/htdocs:/tmp:.:/usr/share/php5/PEAR/"<br />
</IfModule><br />
<br />
<IfModule mod_python.c><br />
<Files ~ (\.py$)><br />
SetHandler python-program<br />
PythonHandler mod_python.cgihandler<br />
</Files><br />
</IfModule><br />
<br />
Options -Includes +ExecCGI<br />
</Directory><br />
<br />
<Directory "/var/www/vhosts/<dummy>/cgi-bin"><br />
AllowOverride None<br />
Options +ExecCGI -Includes<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
SSLProtocol all -SSLv2<br />
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM<br />
SSLHonorCipherOrder On<br />
SSLCompression off<br />
<br />
# Add six earth month HSTS header for all users...<br />
Header add Strict-Transport-Security "max-age=15768000"<br />
SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA<br />
SSLCertificateFile /etc/letsencrypt/live/<dummy>/cert.pem<br />
SSLCertificateKeyFile /etc/letsencrypt/live/<dummy>/privkey.pem<br />
SSLCertificateChainFile /etc/letsencrypt/live/<dummy>/chain.pem<br />
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown<br />
CustomLog /var/log/apache2/<dummy>.ssl.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"<br />
<br />
</VirtualHost><br />
<br />
</IfModule><br />
<br />
Damit ist die Einrichtung des Webservers abgeschlossen.<br />
<br />
== Datenbank-Server ==<br />
Als Datenbank-Server benutzen wir MySQL. Diesen Server installieren wir ganz einfach per apt:<br />
sudo apt-get install mysql-server mysql-client<br />
<br />
Falls die Abfrage während der Installation nicht schon kommt, setzen wir dem root-Benutzer in MySQL ein neues Passwort:<br />
sudo mysqladmin -u root password "newpwd"<br />
<br />
== Mailserver ==<br />
Die Einrichtung des Mailservers ist immer wieder spannend, da bei Updates immer wieder kleine Änderungen durchgeführt werden. Wir verwenden Postfix als MTA und Dovecot als IMAP-Server.<br />
Zusätzlich arbeiten wir mit Virtuellen Hosts, damit ein Mailserver für mehrere Domains verantwortlich sein kann. Die Domains und ihre Mail-Accounts können dann über den Postfixadmin bequem im Netz verwaltet werden.<br />
<br />
Zunächst installieren wir Postfix und dessen Anbindung an MySQL:<br />
sudo apt-get install postfix postfix-mysql<br />
<br />
Falls bei der Installation ein Konfigurations-Dialog auftritt, wählen wir hier einfach erstmal "Keine Konfiguration" aus.<br />
<br />
Dann erstellen wir im MySQL-Server eine neue Datenbank "mail" und einen neuen Benutzer "mail" mit allen Rechten:<br />
root@server:/# mysql -u root -p<br />
mysql> CREATE DATABASE mail;<br />
mysql> GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';<br />
mysql> quit<br />
<br />
Die Konfiguration liegt in /etc/postfix wir wechseln also in das Verzeichnis und bearbeiten die (vielleicht neue) Datei main.cf<br />
<br />
root@server:/# cd /etc/postfix<br />
root@server:/# vi main.cf<br />
<br />
Dann richten wir die Datei wie folgt ein (denken Sie dran myhostname und myorigin an Ihre eigenen Bedürfnisse anzupassen).<br />
Mit Dovecot 2.0 hat sich einiges an der SASL-Authentifizierung geändert; das ist hier schon eingearbeitet:<br />
<br />
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)<br />
biff = no<br />
append_dot_mydomain = no<br />
#delay_warning_time = 4h<br />
myhostname = mail.example.com<br />
myorigin = /etc/mailname<br />
mydestination = mydestination = $myhostname, mail.example.com, h23XXXXX.stratoserver.net, localhost.stratoserver.net, localhost<br />
relayhost =<br />
mynetworks = 127.0.0.0/8 [::1]/128<br />
mailbox_size_limit = 0<br />
recipient_delimiter = +<br />
inet_interfaces = all<br />
inet_protocols = ipv4<br />
alias_maps = hash:/etc/aliases<br />
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf<br />
virtual_mailbox_base = /var/vmail<br />
virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf<br />
virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf<br />
virtual_minimum_uid = 150<br />
virtual_uid_maps = static:150<br />
virtual_gid_maps = static:8<br />
virtual_transport = dovecot<br />
smtpd_sasl_type = dovecot<br />
smtpd_sasl_path = private/auth<br />
smtpd_sasl_auth_enable = yes<br />
smtpd_delay_reject = yes<br />
smtpd_helo_required = yes<br />
<br />
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_rbl_client cbl.abuseat.org, reject_rbl_client ix.dnsbl.manitu.net, reject_rbl_client bl.spamcop.net, reject_rbl_client dul.dnsbl.sorbs.net, reject_unknown_client<br />
<br />
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname<br />
<br />
smtpd_sender_restrictions = reject_unknown_sender_domain<br />
<br />
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination <br />
<br />
<br />
# tls config<br />
#smtpd_use_tls = yes<br />
#smtp_tls_note_starttls_offer = yes<br />
#smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem<br />
#smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem<br />
#smtpd_tls_loglevel = 1<br />
#smtpd_tls_received_header = yes<br />
#smtpd_tls_session_cache_timeout = 3600s<br />
#smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3<br />
#tls_random_source = dev:/dev/urandom<br />
#tls_random_prng_update_period = 3600s<br />
# used for virtual vacation<br />
# transport_maps = hash:/etc/postfix/transport<br />
#dovecot_destination_recipient_limit = 1<br />
<br />
Diese Konfiguration legt die Mails in /var/vmail ab und benutzt den Benutzer vmail mit der UID 150 (legen wir gleich an):<br />
<br />
sudo useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail<br />
sudo mkdir /var/vmail<br />
sudo chmod 770 /var/vmail/<br />
sudo chown vmail:mail /var/vmail/<br />
<br />
Jetzt fangen wir an, die Maps zu konfigurieren. Hiermit bringen wir Postfix bei, wir er die Datenbank nach Mail-Adressen abfragen muss. Dafür müssen wir einige Dateien anlegen:<br />
<br />
sudo touch /etc/postfix/mysql_virtual_alias_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_domains_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
sudo touch /etc/postfix/mysql_virtual_mailbox_maps.cf<br />
<br />
/etc/postfix/mysql_virtual_alias_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = alias<br />
select_field = goto<br />
where_field = address<br />
additional_conditions = and active = '1'<br />
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_domains_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = domain<br />
select_field = domain<br />
where_field = domain<br />
additional_conditions = and backupmx = '0' and active = '1'<br />
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = quota<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
/etc/postfix/mysql_virtual_mailbox_maps.cf<br />
user = mail<br />
password = mail<br />
hosts = localhost<br />
dbname = mail<br />
table = mailbox<br />
select_field = CONCAT(domain,'/',maildir)<br />
where_field = username<br />
additional_conditions = and active = '1'<br />
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'<br />
<br />
Wichtig ist es, hier den Benutzernamen und das Passwort an die MySQL-Einstellungen anzupassen.<br />
<br />
Als letzte Postfix-Konfiguration müssen wir in der master.cf ganz unten die Pipe für Dovecot einrichten:<br />
dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d $(recipient)<br />
submission inet n - - - - smtpd<br />
-o smtpd_tls_security_level=encrypt<br />
-o smtpd_sasl_auth_enable=yes<br />
-o smtpd_sasl_type=dovecot<br />
-o smtpd_sasl_path=private/auth<br />
-o smtpd_sasl_security_options=noanonymous<br />
-o smtpd_sasl_local_domain=$myhostname<br />
-o smtpd_client_restrictions=permit_sasl_authenticated,reject<br />
-o smtpd_sender_login_maps=hash:/etc/postfix/virtual<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject<br />
<br />
Nachdem ich Probleme hatte, Mails mit Thunderbird ordentlich abzuliefern und immer wieder auf den Fehler:<br />
5.7.1 <mail@domain.tld>: Sender address rejected: not owned by user mail@domain.tld<br />
gestoßen bin, ist mir aufgefallen, dass folgende Zeile in der master.cf den Fehler zu verursachen scheint:<br />
-o smtpd_sender_restrictions=reject_sender_login_mismatch<br />
Sollte der Fehler also auftreten, kommentieren wir diese Zeile einfach aus.<br />
<br />
Gegen die Fehlermeldung, dass die /etc/aliases nicht gefunden wurde, führen wir einmal<br />
sudo newaliases<br />
aus.<br />
<br />
=== Dovecot ===<br />
Nun beginnen wir, den zweiten Teil des Mailservers anzupassen. Hierfür installieren wir Dovecot über apt:<br />
sudo apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql<br />
<br />
Wir können hier auch das Paket "dovecot-pop3d" weglassen, wenn wir keine POP3-Anmeldung am Server brauchen.<br />
<br />
Die Abfrage nach einem SSL-Zertifikat können wir entweder mit Ja beantworten. Dann richtet Dovecot ein selbstsigniertes SSL-Zertifikat ein. Falls wir eines haben, sagen wir Nein.<br />
<br />
Zur Sicherheit sichern wir die originale Konfigurationsdatei via<br />
sudo mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.org<br />
<br />
Anschließend können wir mit der Konfiguration von Dovecot unter /etc/dovecot/dovecot.conf beginnen. Diese Konfiguration kann einfach so kopiert werden. Es bringt auch eine SSL-Unterstützung mit, die aber von Haus aus deaktiviert ist. Natürlich müssen der Hostname und der Postmaster angepasst werden.<br />
<br />
auth_mechanisms = plain login<br />
disable_plaintext_auth = no<br />
first_valid_uid = 150<br />
hostname = mail.example.org<br />
last_valid_uid = 150<br />
log_timestamp = "%Y-%m-%d %H:%M:%S "<br />
mail_location = maildir:/var/vmail/%d/%u<br />
passdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
postmaster_address = xxx@example.com<br />
service auth {<br />
unix_listener /var/spool/postfix/private/auth {<br />
group = postfix<br />
mode = 0660<br />
user = postfix<br />
}<br />
unix_listener auth-userdb {<br />
group = mail<br />
mode = 0600<br />
user = vmail<br />
}<br />
}<br />
service imap-login {<br />
executable = imap-login<br />
inet_listener imap {<br />
port = 143<br />
}<br />
}<br />
service pop3-login {<br />
executable = pop3-login<br />
inet_listener pop3 {<br />
port = 110<br />
}<br />
}<br />
# Hier kann bei Bedarf die SSL-Verschlüsselung eingeschaltet werden.<br />
ssl = no<br />
#ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem<br />
#ssl_key = </etc/letsencrypt/live/example.org/privkey.pem<br />
userdb {<br />
args = /etc/dovecot/dovecot-sql.conf<br />
driver = sql<br />
}<br />
protocol imap {<br />
mail_max_userip_connections = 10<br />
}<br />
protocols = imap pop3<br />
<br />
Nun müssen wir Dovecot nur noch sagen, wie sich Dovecot die Anmelde-Daten beschaffen kann. Dafür bearbeiten wir die Datei /etc/dovecot/dovecot-sql.conf:<br />
<br />
driver = mysql<br />
connect = host=localhost dbname=mail user=mail password=mail<br />
# The new name for MD5 is MD5-CRYPT so you might need to change this depending on version<br />
default_pass_scheme = MD5<br />
# Get the mailbox<br />
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'<br />
# Get the password<br />
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'<br />
# If using client certificates for authentication, comment the above and uncomment the following<br />
#password_query = SELECT null AS password, '%u' AS user<br />
<br />
Hier müssen wir möglicherweise die Felder user= und password= an unsere Zwecke anpassen.<br />
<br />
Dann setzen wir noch die Rechte für Dovecot:<br />
sudo chmod 600 /etc/dovecot/*.conf<br />
sudo chown vmail /etc/dovecot/*.conf<br />
<br />
Dovecot ist jetzt konfiguriert. Momentan noch ohne SSL, aber das kommt später.<br />
<br />
=== Postfix Admin ===<br />
Zum Anlegen der Domains und Postfächer nutzen wir dden Postfixadmin, der passenderweise auch gleich das Datenbank-Schema für die gerade erstellte Konfiguration mitbringt.<br />
<br />
Wir laden den [http://sourceforge.net/projects/postfixadmin/ PostfixAdmin] von der Webseite herunter und entpacken ihn in ein eingerichtetes Verzeichnis z.B. einer Subdomain (z.B. mail.<domain>)<br />
<br />
sudo mkdir /var/www/vhosts/mail.<domain>/htdocs<br />
cd /var/www/vhosts/mail.<domain>/htdocs<br />
wget -O pfa.tgz https://sourceforge.net/projects/postfixadmin/files/latest/download<br />
tar xfz pfa.tgz<br />
<br />
Nun passen wir noch den Postfix Admin an unsere Zwecke an. Dazu wechseln wir in das vorhin angelegte Verzeichnis postfixadmin-X.X.X/ und editieren die Standardkonfiguration:<br />
<br />
cd ./postfixadmin-X.X.X/<br />
vi config.inc.php<br />
<br />
Hier passen wir folgende Parameter an:<br />
$CONF['postfix_admin_url'] = ‘'var/www/vhosts/mail.<domain>/postfixadmin/';<br />
$CONF['database_type'] = 'mysqli';<br />
$CONF['database_user'] = 'mail';<br />
$CONF['database_password'] = 'mail';<br />
$CONF['database_name'] = 'mail';<br />
(Natürlich an die eigenen Zwecke angepasst)<br />
<br />
Sind wir mit der Konfiguration fertig, setzen wir den Parameter<br />
$CONF['configured'] = false;<br />
auf true und können unter der angelegten Domain den Installer starten. (postfixadmin/setup.php)<br />
<br />
Hier müssen zwei PHP-Pakete nachinstalliert werden:<br />
sudo apt-get install php-mbstring php-imap<br />
Danach einmal Apache neu laden:<br />
sudo service apache2 reload<br />
<br />
Ist alles installiert, können wir einen Super-Admin einrichten, der alle Domains, Accounts und Administrator-Account im Postfixadmin konfigurieren kann.<br />
<br />
Nun ist der Mailserver eingerichtet. Wir starten nun die Services neu:<br />
<br />
service postfix restart<br />
service dovecot restart<br />
service apache2 restart<br />
service mysql restart<br />
<br />
Nun können wir unter http://mail.example.org/postfixadmin/ einen neuen Benutzer und eine neue Domain anlegen und einige Tests durchführen. Damit ist der Mailserver eingerichtet. <br />
<br />
== DNS Reverse ==<br />
Es empfiehlt sich, bei Strato einen Reverse DNS-Eintrag zu hinterlegen. Die DNS-Abfrage der IP-Adresse läuft dann nicht mehr auf den hXXXXXXX.stratoserver.net, sondern über einen eigenen DNS-Namen. Wichtig ist, dass der Name natürlich auch wieder in die IP-Adresse auflöst.<br />
<br />
Im Postfix und im Dovecot stellen wir dann den Hostnamen um. Vorteil ist, dass der Server dann eine höhere Reputation bekommt, als unter der stratoserver.net-Domain. Zusätzlich klingt das natürlich auch professioneller.<br />
<br />
<br />
== Nachtrag vom 19.10.2017 ==<br />
Unsere Uni-Server erfordern eine verschlüsselte Verbindung zwischen Mailservern. Die o.g. Konfiguration nutzt zwar TLS für die Verbindung zwischen Client und Server, aber nicht für den Transport der Mails über den eigenen Server hinaus. Hierfür sind folgende Ergänzungen in der main.cf nötig<br />
smtpd_tls_security_level = may<br />
smtp_tls_security_level = may<br />
Der Modus "may" bedeutet hier "Opportunistic TLS", d.h., dass eine TLS-Verbindung genutzt wird, sofern beide Server sich damit verstehen. Bietet der gegenübersprechende Server kein TLS an, wird auch keins genutzt. [http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps Postfix-Doku]</div>Lukas