Wie man SSL für local self hosted Services mit Kubernetes für Mac und IOS einrichtet

Wenn man lokal ein paar Services hosted, dann möchte man natürlich trotzdem SSL Verschlüsselung nutzen – zum einen um einfach die ständigen Sicherheitswarnungen vom Browser zu unterbinden, aber auch da man einfach keinem Netzwerk blind vertrauen sollte – selbst dem eigenen. In meinem Fall kam dann noch hinzu, dass manche iOS Apps zwingend nach gültigen SSL Zertifikaten verlangen.

Lokale SSL Zertifikate sind self-signed bzw. Selbst-Signiert. Normalerweise werden Zertifikate von diveresen Anbietern im Netz gegen Geld angeboten, damit diese sicherstellen, dass man auch die Person/Firma ist, die man vorgibt zu sein. In den letzten Jahren hat Let’s encrypt diese Abzocke endlich beendet und das ganze kostenlos gemacht, indem die Verifizierung automatisiert per DNS+HTTP Abfragen automatisiert werden konnte.

Alle diese Anbieter funktionieren nur, weil Betriebssysteme und Browser diesen Stellen vertrauen und damit Zertifikaten, die von diesen sogn. root certificates beglaubigt wurden, auch vertrauen . Dabei ist das root Zertifikat in der Regel unendlich lange gültig, alle Sub-Zertifikate die von dieser Stelle ausgegeben wurden sind jedoch in der Regel zeitlich begrenzt.

Dieser ganze Hokuspokus wird erstmal nur gemacht, um Vertrauen herzustellen und sicherzustellen, dass wenn ich google.com aufrufe und dort steht, dass die Verbindung gesichert ist und der Gegenstelle vertraut wird, dass dem auch so ist. Damit wird z.b. verhindert, dass ich zwar mit einer Website spreche, die behauptet google.com zu sein, aber eigentlich ein Man-in-the-middle Angreifer ist, der mich verdeckt auf einen anderen Server geleitet hat.

Denn unabhängig vom Vertrauen kann man natürlich die Verbindung mit den Zertifikaten verschlüsseln, nur bringt das eben nicht viel wenn ich nicht weiß, ob mein Gegenüber das richtige Gegenüber ist.

Das erstmal zu den Grundlagen.

Das Vorgehen für lokale Self-Signed Zertifikate ist etwas anders: Zunächst erstellen wir uns eine CA, also eine eigene Ausgabestelle für Zertifikate. Anschließend müssen wir diese CA auf allen unseren Geräten hinterlegen und ihr das Vertrauen aussprechen. Ab diesem Moment können wir damit neue Unterzertifikate erstellen, denen dann auf allen diesen Geräten automatisch auch vertraut wird und eine SSL Verbindung zustande kommt.

In meinem Fall wollte ich das ganze so einfach wie möglich halten und habe mich daher für ein Lokales Wildcard Zertifikat (*.bytelude.intern) entschieden.

Die Schritte dafür sind folgende:

Zertifikate erstellen

1. CA Key und Cert anlegen (bitte ein sicheres Passwort verwenden, wenn danach gefragt wird und dieses sicher hinterlegen!):

openssl genpkey -algorithm RSA -aes128 -out private-ca.key -outform PEM -pkeyopt rsa_keygen_bits:2048
openssl req -x509 -new -nodes -sha256 -days 3650 -key private-ca.key -out self-signed-ca-cert.crt

2. Key und Certificate Request für das Bytelude Unterzertifikat anlegen

openssl genpkey -algorithm RSA -out bytelude.key -outform PEM -pkeyopt rsa_keygen_bits:2048
openssl req -new -key bytelude.key -out bytelude.csr

3. Config für das Bytelude Unterzertifikat anlegen. Inhalt der Datei bytelude.ext:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.bytelude.intern
# Optionally add IP if you're not using DNS names:
IP.1 = 192.168.1.3

Sowohl für den DNS als auch den IP Eintrag könnt ihr mehrere Einträge mit fortlaufender Nummer machen.

4. Bytelude Unterzertifikat erzeugen

openssl x509 -req -in bytelude.csr -CA self-signed-ca-cert.crt -CAkey private-ca.key -CAcreateserial -out bytelude.crt -days 365 -sha256 -extfile bytelude.ext

Dieses letzte Zertifikat ist nun das konkrete Zertifikat, welches ihr z.B. im Webserver hinterlegt. Dieses ist in diesem Beispiel ein Jahr lang gültig und muss dann erneuert werden – dafür reicht dieser letzte Befehl aus, sofern die restlichen Dateien noch da sind.

Die Datei “self-signed-ca-cert.crt” ist das Zertifikat, welches ihr auf euren Geräten hinterlegen müsst.

Mac

Auf dem Mac zieht man es einfach in die Schlüsselbundverwaltung. Anschließend öffnet ihr die Informationen zu diesem Zertifikat und stellt dort das Vertrauen auf “Immer vertrauen”.

iPhone/iPad

Schickt euch das Root CA Cert (“self-signed-ca-cert.crt”) per Airdrop oder anderweitig an das entsprechende Gerät. Anschließend öffnet/installiert ihr es auf dem Gerät und geht dann in: Einstellungen, Allgemein und dann “VPN und Geräteverwaltung” und installiert dort das neue Zertifikat final.

Anschließend muss dem neu installierten Zertifikat noch das Vertrauen ausgesprochen werden, was über Einstellungen, Allgemein, Info und dann “Zertifikatsvertrauenseinstellungen” erledigt wird:

Wenn dieser Schalter aktiviert ist, dann werden ab sofort alle Zertifikate von dieser CA als vertrauenswürdig eingestuft, also auch eure Unterzertifikate.

 

Kubernetes

Als letzten Schritt muss nun noch das Unterzertifikat in eure Kubernetes Instanz eingespielt werden. Das geht über folgenden Befehl:

kubectl -n kube-system create secret tls default-ingress-cert --key=bytelude.key --cert=bytelude.crt --dry-run=client --save-config -o yaml  | kubectl apply -f -

Zusätzlich müsst ihr noch folgende Ressource in eurem Kubernetes System entweder anlegen oder editieren:

apiVersion: traefik.containo.us/v1alpha1
kind: TLSStore
metadata:
  name: default
  namespace: kube-system
spec:
  defaultCertificate:
    secretName: default-ingress-cert

In meinem Fall ist Traefik der Default Ingress, bei Nginx könnte das Vorgehen evtl abweichen.

Nachdem all das erledigt ist, muss beim jeweiligen Service nur noch der Ingress so konfiguriert werden, dass er auch TLS/SSL spricht:

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: freshrss
  namespace: freshrss
  annotations:
    kubernetes.io/ingress.global-static-ip-name: freshrss-ip
spec:
  tls:
  - hosts:
      - freshrss.bytelude.intern
  rules:
  - host: freshrss.bytelude.intern
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: freshrss
            port:
              number: 80

Damit das funktioniert müsst ihr natürlich die entsprechende URL in eurem DNS (z.B. freshrss.bytelude.intern) hinterlegt haben. In meinem Fall habe ich in meinem Ubiquity Router einfach eine Wildcard DNS hinterlegen können, sodass alles was *.bytelude.intern ist auf die gleiche IP zeigt.

Wenn ihr nun alles richtig gemacht habt, dann sollte beim Aufruf von https://freshrss.bytelude.intern keine Sicherheits-Warnung kommen und das Schlosssymbol eures Browsers sollte auch geschlossen sein und somit eine sichere Verbindung vorhanden sein.

Wenn das eine Jahr herum ist und ihr ein neues Unterzertifikat erstellt habt, sollte ein erneutes Ausführen des Befehls

kubectl -n kube-system create secret tls default-ingress-cert --key=bytelude.key --cert=bytelude.crt --dry-run=client --save-config -o yaml | kubectl apply -f -

ausreichen, sodass ab sofort das neue Zertifikat verwendet wird. Damit sollte sich das ganze auch relativ einfach automatisieren lassen.

Wie man Neodymium Magneten aus Festplatten von ihrer Basis befreit

Durch meine Elektronik-Spielereien schaue ich auch immer in alten Geräten, was man so an Ersatzteilen gewinnen kann. Bei alten Festplatten sind das zb extrem starke Neodymium Magneten. Das Problem: sie sind in der Regel extrem fest auf ein Stück Metall geklebt. Und mit diesem Video habe ich eine relativ einfache Lösung gefunden, wie man sie abbekommt:

Wie man einen eigenen Collabora Server für Nextcloud in Docker und hinter einem Nginx Reverse Proxy korrekt startet

Um innerhalb von Nextcloud so eine Art Google-Docs betreiben zu können, benötigt man zum einen die Nextcloud-Office-App, aber auch einen extra Server (Collabora), der quasi als Backend für das Office dient. Letztendlich handelt es sich da um eine Headless Open-Office Instanz, wenn ich das richtig verstanden habe.

Im besten Fall betreibt man Nextcloud ohnehin auf dem eigenen Server innerhalb von Docker, dann sollte die Kommunikation mit dem Collabora Server kein Problem sein.

Da in meinem Beispiel die Nextcloud Instanz von Hetzner gehosted wird, war es notwendig, dass der Collabora Server über das Internet kontaktiert wird und eben nicht im gleichen Netzwerk hängt. Und da ist die Dokumentation etwas schwammig bzw. einfach falsch. Denn in der Dokumentation, die man so im Netz finden kann, wird gesagt, dass man eine Environment-Variable namens “domain” definieren muss, die dann ein Regex der Nextcloud Domain enthält (damit nur Requests von dieser Domain bearbeitet werden).

Der entsprechende Code wurde aber geändert, sodass mehrere Nextcloud Server auf Collabora zugreifen können. Statt “domain” muss die Environmentvariable “aliasgroup1” heißen und sie enthält die komplette Domain inkl Portangabe (Durch Komma getrennt kann man mehrere URLs übergeben).

Beispiel:

aliasgroup1=https://meine.domain.com:443

In meinem konkreten Beispiel habe ich die Konfiguration, dass auf dem Server für Colabora Docker mit dem allseits bekannten Lets Encrypt Nginx Companion läuft. Das nette an diesem Setup ist, dass man allen weiteren Docker Containern auf diesem Server nur drei Env-Variablen mitgeben muss und schon erstellt und verwaltet das System automatisiert die Lets Encrypt Zertifikate.

In dieser Kombination ist es wichtig, Collabora mitzuteilen, dass es sich nicht um SSL kümmern soll, was man mit der Env-Variable

extra_params=--o:ssl.enable=false --o:ssl.termination=true

erreicht. Ausserdem muss der Collabora Container im privileged Modus laufen!

Mein Setup in Ansible sieht dann letztenlich so aus:

- docker_container:
    name: collabora
    image: collabora/code
    state: started
    detach: yes
    restart_policy: always
    privileged: yes
    expose:
      - 9980
    env:
      aliasgroup1: https://nextcloud.domain.com:443
      VIRTUAL_HOST: office.domain.com
      LETSENCRYPT_HOST: office.domain.com
      VIRTUAL_PORT: "9980"
      LETSENCRYPT_EMAIL: ich@meins.de
      extra_params: "--o:ssl.enable=false --o:ssl.termination=true"

Das Equivalent auf der Console sollte dann so aussehen:

docker run --name=collabora --env=aliasgroup1=https://nextcloud.domain.com:443 --env=VIRTUAL_HOST=office.domain.com --env=LETSENCRYPT_HOST=office.domain.com --env=VIRTUAL_PORT=9980 --env=LETSENCRYPT_EMAIL=ich@meins.de --env='extra_params=--o:ssl.enable=false --o:ssl.termination=true' --privileged --expose=9980 --restart=always --detach=true collabora

Wenn das erledigt ist und der Server läuft, kann man in Nextcloud den Admin Bereich öffnen und dort auf den Punkt “Office” gehen. Hier stellt man den Collabora Server ein und klickt auf Speichern:

Anschließend geht man in Nextcloud auf den “Dateien” Tab und klickt dann oben auf das Plus, um eine neue Datei zu erzeugen:

Anschließend öffnet man das Dokument und sollte nun die Office Oberfläche sehen. Falls eine Fehlermeldung kommt, und man es “später nochmal versuchen soll”, geht auf den Server wo Collabora läuft und schaut in die Logs des Containers.

Wenn ihr da irgendwas von

Terminating connection. Error: No acceptable WOPI hosts found matching the target host [nextcloud.domain.com] in config.

seht, dann habt ihr die Domain in der Environment Variable nicht korrekt übergeben. Überprüft vor allem, ob es sich überhaupt um die gleiche Domain wie in der Fehlermeldung handelt. Diese ist in jedem Fall die korrekte Domain und sollte so auch in der “aliasgroup1” drin stehen!

Telegraf kann SNMP Daten vom Ubiquiti Edge Router Max nur teilweise abrufen

Aktuell versuche ich per Telegraf über das SNMP Protokoll die Daten meines Routers abzugreifen und diese in eine InfluxDB zu packen, damit ich die Daten dann in Grafana überwachen kann. Soweit klappt das auch, aber sobald ich meine Glasfaser mal ausnutze und mit vollen 250Mbit einen Download laufen habe, dann setzt Telegraf mit solchen Meldungen aus:

E! Error in plugin [inputs.snmp]: agent ---: gathering table ifXTable: performing bulk walk for field ifAlias: Request timeout (after 4 retries)

Sprich, er bekommt Timeouts beim Abrufen der Daten. Nach langem hin und her sieht es wohl so aus, als ob der Parameter “max_repetitions = 50” das Problem verursacht. Stellt man diesen auf 20 oder nur 15, dann gehen die Fehler auf einmal weg und man kann auch in kürzeren Intervalen Abfragen tätigen.

Meine Config sieht aktuell so aus:


[[inputs.snmp]]
# List of agents to poll
agents = [ "IP_DES_SNMP_SERVERS" ]
# Polling interval
interval = "60s"
# Timeout for each SNMP query.
timeout = "10s"
# Number of retries to attempt within timeout.
retries = 5
# SNMP version, values can be 1, 2, or 3
version = 2
# SNMP community string.
community = "global"
# The GETBULK max-repetitions parameter
max_repetitions = 15
...

Die ganze Config, mit der man einen Ubiquiti Edge Router auslesen kann, findest du hier: https://grafana.com/grafana/dashboards/1756 unter “Collector Configuration Details”.

[Quicktip] Wie man auf dem iPhone Zeitrafferaufnahmen einer GoPro Kamera in ein Video umwandelt

GoPro Kameras verfügen neben dem Video- und dem Foto-Modus auch über eine Zeitraffer Funktion. In dieser werden in festgelegten Abständen Fotos geschossen, welche dann später mittels der GoPro Software am Rechner zu einem Video zusammengefügt werden können.

Nun sind wir bereits im Jahr 2021 und ich möchte mittlerweile eigentlich alles was Videoschnitt angeht auch einfach unterwegs auf dem iPhone oder iPad machen können. nur leider ist das gar nicht so einfach. Man bekommt die Zeitraffer Aufnahmen zwar mit der GoPro App von der Kamera heruntergeladen und die App erkennt das ganze auch als zusammenhängendes Werk – ein einfaches Video kann man mit ihr aber trotzdem nicht erzeugen. Nachdem ich dann den größten Teil der Apps durchforstet habe stieß ich leider immer wieder auf das Problem, dass die vielen Zeitraffer Apps nur die direkte Aufnahme von Zeitraffer Videos ermöglichen, nicht aber das zusammensetzen von einzelnen Bildern die man bereits in der Foto App hat. Mit Ausnahme eines 30€ Schnittprogramms, welches die Funktion wohl unterstützt. Das war mir für diesen einen Einsatzzweck dann doch zu teuer.

Nach etwas hin und her habe ich mir dann die Shortcuts/Kurzbefehle App angesehen und über einen Trick kann man die gewünschten Videos so direkt am Handy erzeugen: man erstellt eine neue “Sharing App”, die Bilder als Input nimmt und erstellt dann aus den Bildern ein Gif – und aus dem Gif dann ein Video 🙄 😂

In der Shortcuts/Kurzbefehle App sieht das dann so aus:

Um aus der App eine Sharing App zu machen müsst ihr oben rechts auf die drei Punkte tippen und dann “Im Share-Sheet anzeigen” aktivieren. Sinnvollerweise sollte bei “Share-Sheet-Typen” Bilder ausgewählt sein.

Bei den Einstellungen für das Gif müsst ihr mit dem Wert bei “Sekunden pro Foto” ein bisschen spielen. Soweit ich das sehe kann der Wert nur 2 Stellen hinter dem Komma. 30 Bilder/s wären 0,03333333333… daher habe ich hier erstmal 0,04 genommen. 0,03 war mir dann etwas zu schnell, kommt aber eben auf das Video an.

 

Speichert das ganze ab, und dann könnt ihr in der Fotos App die entsprechenden Fotos markieren, teilen und wählt dann eure eben erstellte Shortcuts-App auf. Nachdem der Fortschrittsbalken durch ist solltet ihr das fertig gerenderte Video in euer Foto-App sehen. Irritierenderweise ist der Sharing-Bildschirm weiter offen…

Chrome scheint Videosoftware unter MacOS auszubremsen

Creative Director Felipe Baez von der Agentur Cre8ive Beast hat bemerkt, dass sich Final Cut Pro deutlich langsamer wird, und teilweise sogar abstürzen kann. Grund dafür ist das “Video-Toolbox” Framework, welches von MacOS bereitgestellt wird. Chrome nutzt dieses Framework und klaut somit die Ressourcen anderen Programmen, wie eben Final Cut Pro. Das gleiche Problem tritt auch z.B. bei Handbrake auf, und somit wahrscheinlich auch bei weiteren Video-Editoren.

Aktuell ist der Ratschlag: sobald man irgendeine Art von Videoschnitt macht, sollte Chrome nicht laufen.

Bei dieser Gelegenheit rate ich wirklich JEDEM dazu, sich den aktuellen Firefox nochmal anzusehen. War er in den letzten Jahren eher langsam und behäbig geworden, ist er nun seit ca. 0,5-1 Jahr wieder in seiner alten Form zurück. Er ist super schnell (teilweise sogar schneller als Chrome), hat die gleichen Funktionen, und ganz wichtig: nimmt Privatsphäre und Datenschutz höchstwahrscheinlich deutlich ernster als andere Browserhersteller. Ich bin schon vor einer ganzen Weile umgestiegen (auf meinem Mac und auch auf iPhone/iPad) und bereue es in keinster Weise!

via Golem

WordPress zeigt nur die Überschriften, aber nicht den Artikel Inhalt / Content an

Bei einem Umzug von WordPress hatte ich auf einmal das Phänomen, dass die Seite an sich wunderbar funktionierte, jedoch nur die Blog Post Überschriften und nicht den Content anzeigte.

Komischerweise war der Content beim Bearbeiten des Artikels vorhanden, also tippte ich erst auf das Template. Da ich jedoch ein WordPress Default Template in Verwendung hatte, konnte das schnell ausgeschlossen werden.

Die Lösung brachte dann der allgemeine WordPress Universal-Tip: Alle Plugins deaktivieren und dann einzeln wieder anschalten. Und siehe da, das (leider) komplett veraltete “wp-slimbox-reloaded” hatte den Fehler verursacht. Irgendwie hat es den Render-Prozess des Artikel Contents zerschossen. Sobald ich das Plugin deaktiviert hatte, lief die Seite wieder wie gewohnt 🙂

1und1 Probleme mit CNAME, ssl/https, root domain und Weiterleitungen

Sorry, ich wollte alles in der Überschrift unterbringen 🙂

Um was geht es denn genau?

Nehmen wir an, du betreibst einen externen Dienst, der unter deiner Domain gehosted wird (DEINE-DOMAIN.de), die du bei 1und1 gekauft/geparkt hast bzw. dort per DNS verwaltest. Dieser externe Dienst nutzt CNAME Einträge, um Subdomains deiner Domain direkt nutzen zu können. Im konkreten Fall www.DEINE-DOMAIN.de.

 

Kurzer Abriss, was ein CNAME ist: statt A bzw. AAAA Einträge mit IPs zu hinterlegen, kann man mittels CNAME eine Subdomain deiner Hauptdomain auf eine ganz andere Domain verweisen. Beispiel:

blog.DEINE-DOMAIN.de hat einen CNAME auf DEIN-NAME.wordpress.com

Wenn nun jemand blog.DEINE-DOMAIN.de aufruft, dann geht der DNS-Server (also der von der Domain) auf DEIN-NAME.wordpress.com und zieht sich dort die A bzw. AAAA Einträge und liefert diese so zurück, als ob sie der Domain blog.DEINE-DOMAIN.de zugewiesen wären. Das große Problem ist hier: das geht immer nur mit Subdomains von DEINE-DOMAIN.de, also z.B. www.DEINE-DOMAIN.de.

 

Zurück zum aktuellen Fall: Rufst du in deinem Setup nun DEIN-NAME.de im Browser auf, so wirst du die Meldung bekommen, dass diese Seite nicht erreichbar ist. Also, bei 1und1 eine http Weiterleitung auf www.DEINE-DOMAIN.de eingerichtet. Klappt nur nicht. Denn: Der 1&1-Standarteintrag für A und AAAA Record deiner Domain muss bestehen, damit die http Weiterleitung überhaupt funktionieren kann. Leider bekommt man diesen Hinweis nur in einem kleinen versteckten Nebensatz in der 1&1 Hilfe-Ecke.

Nun haben moderne Browser aber die (gute) Angewohnheit, per Default ein https vor die von dir eingetippte Domain zu setzen (zumindest war es bei mir in Chrome und Firefox so). Und dann kann man die Seite schon wieder nicht aufrufen, den nun bekommt man einen SSL Fehler. Was muss man also nun tun? Richtig, wenn man es einfach haben will, bestellt man ein 1&1 SSL Zertifikat, dann klappt auch die Weiterleitug von https://DEINE-DOMAIN.de auf https://www.deine-domain.de.

 

Fotorealismus mit der Unreal Engine 4

Mir fehlen die Worte! Dieses Video wurde mit der unreal engine 4 gerendert. Sprich, theoretisch könnten spiele zukünftig so aussehen.

Die Landschaft wurde auf Island mittels 3D Scanner erfasst, und dann wurde mit den Engine nachgebaut. Ein Meisterwerk!