## Diese Warnung ist Bestandteil jedes Howtos und darf nicht entfernt werden. {{{#!vorlage Warnung Die Verwendung dieses Howto geschieht auf eigene Gefahr. Insbesondere wird darauf hingewiesen, dass der Betrieb eines öffentlich erreichbaren Apache-Servers erhebliche Sicherheitsrisiken beinhaltet. Näheres dazu im Abschnitt [#Sicherheitshinweise Sicherheitshinweise]. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich zusätzlich an den Verfasser des Howtos. }}} [[Vorlage(Fortgeschritten)]] ## Bitte die Angaben zu dem letzten erfolgreichen Test dieser Anleitung eintragen: {{{#!vorlage Hinweis Diese Howto-Anleitung wurde zuletzt von [user:mubuntuHH:] am 18.10.2020 unter '''Ubuntu 18.04''' und '''Ubuntu 20.04''' erfolgreich getestet. }}} = Ziel = [[Bild(Wiki/Icons/service.png, align=left, alt="Server", 48)]] Es soll ein eigener, dezidierter Server (zu Hause) betrieben werden, der öffentlich über eine eigene Domain erreichbar ist, auch wenn der vom Server genutzte Internetanschluss eine täglich wechselnde IP-Adresse hat. Im Detail: Es sollen lokal ein oder mehrere Linux-Apache-Server betrieben werden (zum Beispiel ein klassischer [:LAMP:]-Server), die über das Internet über eine oder mehrere eigene Domains erreichbar sind. Die Fritz!Box und ein MyFRITZ!-Konto sollen dabei als Portweiterleitung und als Dynamisches DNS (DDNS oder DynDNS) dienen - ohne einen zusätzlichen DDNS-Anbieter. Ein DynDNS-Dienst ist notwendig, weil normalerweise bei einem herkömmlichen (privaten) Internetanschluss die Internet Protocol (IP) Adresse regelmäßig vom Anbieter neu vergeben wird, womit eine Weiterleitung einer Domain-Adresse an den Rechner zu Hause auf herkömmlichen Wege unmöglich ist. Idealerweise sollen die Verbindungen noch über gültige und anerkannte Transport Layer Security (TLS) - in der Vergangenheit vor allem auch unter Secure Sockets Layer (SSL) bekannt - verschlüsselt werden. {{{#!vorlage Hinweis Das Prinzip hinter dieser Anleitung funktioniert auch mit einem andern DDNS-Anbieter, anstatt einem MyFRITZ!-Konto, und auch mit praktisch jeden anderem Internetrouter, in dem man Portweiterleitungen einrichten kann. Der Fokus dieser Anleitung liegt jedoch auf der Fritz!Box in Verbindung mit einem MyFRITZ!-Konto. }}} [[Bild(szenario.png, 700, center)]] == Mögliche Anwendungsfälle == Mit Hilfe der hier dargestellten Konfiguration lassen sich viele Anwendungsfälle umsetzen. Nachfolgend eine Auswahl möglicher Szenarien: * Betrieb einer eigenen [:Cloud-Dienste/#Eigene-Cloud-Dienste:Cloud] („self-hosted“), um unabhängig von kommerziellen Cloud-Diensten und den damit verbundenen Folgen für den Datenschutz zu sein * Groupware-Dienste (gemeinsamer Kalender, Team- und Projektverwaltung, etc.) für die Familie oder kleine Teams, zum Beispiel mit der Open Source Software [https://www.egroupware.org/de/community/ EGroupware CE] {de} * Bilder mit der Familie und Freunden teilen - [:Bilder_verwalten/#Webbasierte-Bildverwaltungen:Webbasierte Bildverwaltungssysteme] * Ein privater [:Serverdienste/#Multimedia: Streaming-Dienst] für die eigene Video -und Musiksammlung * Oder einfach nur, um eine [:Webentwicklung:selbst gemachte Webseite] Freunden oder Kunden zu präsentieren = Voraussetzungen = * Eine oder mehrere Domains, gehostet bei einen beliebigen Anbieter, der es erlaubt, eigene CNAME-Einträge vorzunehmen * Eine Fritz!Box * Ein oder mehrere an die Fritz!Box angeschlossene Ubuntu-Rechner mit laufendem Apache-Server = Vorbemerkungen = In diesem Howto wird nicht für jede Einstellung in der Fritz!Box eine detaillierte Schritt-für-Schritt-Anleitung geliefert. Hierfür wird jeweils auf die ausführlichen Anleitungen in der [https://avm.de/service/fritzbox/fritzbox-7590/wissensdatenbank/ Wissensdatenbank] {de} von AVM, dem Hersteller der Fritz!Box, verlinkt. Zum besseren Verständnis werden folgende Seiten empfohlen: * [:Apache:] * [:TLS-Zertifikate:] * [wikipedia:IP-Adresse:] * [wikipedia:CNAME Resource Record:CNAME] * [wikipedia:Dynamisches_DNS:Dynamisches DNS (DDNS)] * [wikipedia:Portweiterleitung:] = Anleitung = ## Ausführliche Howto-Anleitung zum Lösen des Problems. == 1. Ein MyFRITZ!-Konto anlegen == Falls noch nicht geschehen, muss ein MyFRITZ!-Konto angelegt werden, das allen Besitzern einer Fritz!Box von AVM kostenlos angeboten wird. AVM hat hierzu eine [https://avm.de/service/myfritz/faqs/was-ist-myfritz-und-wie-nutze-ich-es/article/show/966_MyFRITZ-Konto-erstellen-und-in-FRITZ-Box-einrichten/ Schritt-für-Schritt-Anleitung] {de} veröffentlicht. Ist das erledigt, erhält man eine zufällig generierte eigene `myfritz.net` Subdomain, nach dem Muster: {{{ MEIN-SUBDOMAIN-SCHLÜSSEL.​myfritz.​net }}} myfritz.net kümmert sich nun darum, dass die Fritz!Box immer unter dieser Adresse erreichbar ist, auch wenn sich die IP täglich ändert, und fungiert damit als DDNS-Dienst. == 2. Fritz!Box Freigabe einrichten == Als nächstes muss nun eine sogenannte ''"Fritz!Box Freigabe"'' eingerichtet werden. Im Dialog-Fenster in der Fritz!Box ''"Internet ➡ Freigaben ➡ Portfreigaben ➡ Gerät für Freigaben hinzufügen"'' unter ''"Gerät"'' den gewünschten Ubuntu-Rechner auswählen und dann auf ''"Neue Freigabe"'' klicken. Hier ''"MyFRITZ!-Freigabe"'' anklicken - __nicht__ ''"Portfreigabe"''. Als ''"Anwendung"'' nun ''"HTTP-SERVER"'' auswählen. ''"Verzeichnis"'' leer lassen, dies wird später im Apache konfiguriert. ''"MyFRITZ!-Adresse"'' ebenfalls leer lassen; wird automatisch von der Fritz!Box vergeben. Normalerweise kann man die per Default eingetragenen Portangaben (80 für HTTP beziehungsweise 443 für [#Optional%3A-TLS-Verschluesselung HTTPS]) so belassen, da sie einer Standardinstallation eines Apache-Servers entsprechen. * [https://avm.de/service/fritzbox/fritzbox-7490/wissensdatenbank/publication/show/1376_MyFRITZ-Freigaben-einrichten/ Ausführliche Anleitung von AVM] {de} == 3. CNAME Umleitung aktivieren == Nun muss der CNAME-Eintrag beim Hoster angepasst werden. Dort gibt man den von MyFRITZ! vergebenen Subdomain-Domainnamen plus den vorangestellten Rechner-Namen des freigegebenen Ubuntu-Servers ein, also mit folgenden Schema: `UBUNTU-RECHNER-NAME`'''.'''`MEIN-SUBDOMAIN-SCHLÜSSEL`'''.'''`​myfritz.​net` Ohne Protokollangaben eintragen, also ohne `http://` oder `https://`. Die genau Angabe findet man, wenn man in der Fritz!Box die eingerichtete MyFRITZ!-Freigabe öffnet oder auch in der Übersicht seines [https://www.myfritz.net/ myfritz.net] {de} Benutzerkontos. {{{#!vorlage Hinweis Es kann erfahrungsgemäß mehrere Tage dauern, bis der CNAME-Eintrag greift und der Heimrechner auch tatsächlich und dauerhaft unter der eingerichteten Domain erreichbar ist. }}} == Optional: Virtual Host anlegen == Nun ist das Verzeichnis '''/var/www/html''' über die eingerichtete Domain erreichbar. Vielleicht möchte man aber nur ein bestimmtes Verzeichnis über die frisch eingerichtete Domain erreichbar machen. Das ist mittels der Einrichtung eines Virtual Hosts möglich. Ein Beispiel: Soll die neu eingerichtete Domain `example.com` auf das Verzeichnis '''/var/www/vhosts/example.com/public''' geleitet werden, so könnte die Apache-Konfigurationsdatei für einen Virtual Host folgendermaßen aussehen: {{{#!code apache ServerAdmin admin@example.com ServerName example.com DocumentRoot /var/www/vhosts/example.com/public ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined AllowOverride All }}} * [:Apache/Virtual_Hosts:Ausführliche Anleitung] == Optional: TLS-Verschlüsselung == Hat man die Domainweiterleitung wie in dieser Anleitung beschrieben eingerichtet, so ist es auch problemlos möglich, eine von den gängigen Browsern als vertrauenswürdig akzeptierte SSL-Verschlüsselung einzurichten. Dies sollte üblicherweise der Standard sein, da heutzutage kaum noch ein Browser ohne Warnungen und Umwege unverschlüsselte Verbindungen oder ein nicht offiziell gültiges Zertifikat akzeptiert. Dazu wird das Zertifikat direkt auf dem lokalen Server eingerichtet und __nicht__ bei dem Hoster oder bei ​myfritz.​net. Dies ist natürlich sehr komfortabel, da man auf dem lokalen Ubuntu-Rechner viel mehr Möglichkeiten hat und zum Beispiel die Erneuerung des Zertifikates automatisieren lassen kann. Zunächst muss aber direkt in der Fritz!Box eine weitere Freigabe eingerichtet werden, genau wie [#2-Fritz-Box-Freigabe-einrichten oben] beschrieben, mit dem Unterschied, dass als ''"Anwendung"'' ''"HTTP__S__-SERVER"'' gewählt werden muss (üblicherweise Port 443). {{{#!vorlage Hinweis Zwar ist es direkt in der Fritz!Box möglich, ein Sicherheitszertifikat automatisiert anlegen zu lassen (mit Let's Encrypt). Damit wird aber nur der externe Zugriff auf die Benutzeroberfläche der FRITZ!Box abgesichert. Eine Verschlüsselung der Verbindung zu einem angeschlossenen Ubuntu-Rechner ist damit leider nicht möglich. }}} Anleitungen um Zertifikate von [https://letsencrypt.org/de/ Let’s Encrypt] {de} unter Ubuntu einzurichten: * [:TLS-Zertifikate/#Let-s-Encrypt:] * [https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-18-04 Anleitung von digitalocean.com] {en} für [:18.04:Ubuntu 18.04] * [https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-20-04-de Anleitung von digitalocean.com] {de} für [:20.04:Ubuntu 20.04] = Mehrere Domains verwalten = Es ist möglich, mit dieser Methode beliebig viele Domains auf lokale Rechner umzuleiten und auch für jede einzelne ein eigenes TLS-Zertifikat anzulegen. Allerdings kann man in der Fritz!Box selbst pro Port nur eine einzige Weiterleitung einrichten, sprich: der Port 80 kann zum Beispiel nur für einen angeschlossenen Rechner allein vergeben werden. Mögliche Lösungsansätze: == Einen anderen Port vergeben == Bietet sich vor allem an, wenn die verschieden Domains auch auch auf unterschiedlichen an der Fritz!Box angeschlossenen Rechnern betrieben werden sollen. Dazu für den neuen Rechner eine MyFritz!-Freigabe wie folgt einrichten: * ''"Anwendung:"'' ''"Andere Anwendung"'' * ''"Bezeichnung:"'' beliebig, zum Beispiel "HTTP-SERVER II" * ''"Schema:"'' ''"http//:"'' * ''"Port an Gerät:"'' Einen beliebigen, freien vergeben, zum Beispiel 8080 * ''"Verzeichnis"'' und ''"MyFRITZ!-Adresse"'' frei lassen Gegebenenfalls für das ''"Schema" "https:// "''wiederholen, falls ein verschlüsselter Zugang erwünscht ist. Nun wieder beim Hoster für die gewünschte Domain einen CNAME-Eintrag vornehmen: `UBUNTU-RECHNER-NAME-2`'''.'''`MEIN-SUBDOMAIN-SCHLÜSSEL`'''.'''`​myfritz.​net` Ohne Protokollangaben eintragen und auch ohne Portangabe. Nachteil dieser Methode: Die Domain muss immer mit der Portangabe aufgerufen werden, zum Beispiel `www.example.com:8080/impressum`. == Virtual Hosts einrichten == Sollen die verschiedenen Domains (auch Subdomains) ohnehin nur auf einem Apache-Rechner betrieben werden, so ist dies die beste Methode * Die MyFritz!-Freigabe wie oben ganz normal für den Apache-Rechner einrichten * Auf dem Apache-Rechner für jede (Sub-)Domain einen Virtual Host anlegen * Beim Hoster für jede Domain beim CNAME-Eintrag die selbe myfritz.net-Subdomain-Adresse eintragen * Falls Verschlüsselung erwünscht, für jede Domain ein Zertifikat einrichten = Sicherheitshinweise = Wie immer bei einem Rechner, der öffentlich erreichbar ist, gilt: Man setzt sich damit dem beträchtlichen Risiko diverser bösartiger Attacken aus. Neben den üblichen Risiken, hier eine - nicht vollständige - Liste von Sicherheitsrisiken, die beim Befolgen dieser Anleitung entstehen: * Der Rechner ist nicht nur unter der Domain erreichbar sondern auch unter `UBUNTU-RECHNER-NAME.MEIN-SUBDOMAIN-SCHLÜSSEL.​myfritz.​net`, unter der aktuellen IP-Adresse der Fritz!Box und womöglich noch unter weiteren Adressen. * Hat man einen Virtual Host (siehe oben) für ein bestimmtes Verzeichnis eingerichtet, so ist das Verzeichnis '''/var/www/html''' mit einer Apache-Standardinstallation trotzdem noch erreichbar, wenn per IP oder der myfritz.net-Adresse zugegriffen wird. * Über den offenen Port an der Fritz!Box sind auch andere Rechner im selben internen Netzwerk gefährdet. * Hat ein Angreifer Kontrolle über den Apache-Server erlangt, sind auch andere am lokalen Netzwerk angeschlossene Geräte gefährdet. Es sind geeignete Maßnahmen zu treffen, um den Angriffen vorzubeugen. Auch die folgende Liste ist nur eine Auswahl und erhebt keinen Anspruch auf Vollständigkeit. * Bestimmte oder alle Verzeichnisse per Apache mit [:Sicherheits-Einmaleins/Passwörter:sicheren Passwörtern] schützen. [selfhtmlwiki:Webserver/htaccess/Passwortschutz:Anleitung in der selfhtml-Wiki] * Den Zugriff auf Apache-Verzeichnisse nur bestimmten (lokalen) IP-Adressen mittels [wikipedia:Weiße Liste:„Whitelisting“] erlauben, zum Beispiel nur Rechnern aus dem lokalen Netzwerk. [selfhtmlwiki:Webserver/htaccess/Zugriffskontrolle#IP-Adressen.2C_IP-Bereiche_oder_Namensadressen_zulassen.2Fausschlie.C3.9Fen:selfhtml-Wiki-Anleitung] * Den Apache-Server in einem isolierten Netz betrieben, zum Beispiel durch Einrichtung des sogenannten „LAN-Gastzugang“ in der Fritz!Box. Der Server selbst kann aber __nicht__ im „LAN-Gastzugang“ betrieben werden, da man dort keine Portweiterleitungen einrichten kann. [https://avm.de/service/fritzbox/fritzbox-7590/wissensdatenbank/publication/show/949_LAN-Gastzugang-in-FRITZ-Box-einrichten/ Anleitung von AVM] = Links = * [:FritzBox:] {Übersicht} * [:Serverdienste:] {Übersicht} * [:Apache/Sicherheit:Apache Sicherheit] * [:fail2ban:] Server gegen DoS absichern * [tag:Howto:Howto-Liste] {Übersicht} - Übersicht aller Howto-Artikel #tag: Howto