AppAmor vs Docker

Beobachtet auf einer Installation von Debian 12 bei Hetzner nach der Installation von docker.

Tritt auf wenn ein Kernel mit AppAmor aktiv genutzt wird; scheinbar ist das bei Hetzner der Fall

docker run --name postgres --network postgres -e POSTGRES_PASSWORD=bubu#db --restart unless-stopped -v postgres:/var/lib/postgresql/data -d postgres

Status: Downloaded newer image for postgres:latest
4ac3ffe1d811a7c897390b8c9f07a283c4e1ef506dc1987a8b4a9a48367bfed8
Resultiert in
docker: Error response from daemon: AppArmor enabled on system but the docker-default profile could not be loaded: running `apparmor_parser apparmor_parser --version` failed with output:
error: exec: "apparmor_parser": executable file not found in $PATH.
Lösung
apt install apparmor

Von Identitätsverwirrung, nordischen Göttern und Abstammung

Ziel war es über Linux (Mint) Lineage OS auf ein Samsung Galaxy Tab S5e zu flashen.

Lineage ist eine Distribution des OpenSource Android Betriebssystem (also ohne google-Modifikationen). Hier zu finden: https://lineageos.org/

Samsung Galaxy Tab S5e ist ein leichtgewichtiges 10-Zoll-Tablet.
Es ist schon 2019 erschienen, hat aber eine gute Akkulaufzeit (mehrere Stunden Nutzung), für den üblichen Nutzer ausreichend RAM 4 oder 6 GB, eine hinreichende Kamera (8 oder 13 MP), 64 oder 128 GB eingebauten Speicher, so wie Unterstützung von SD-Karten bis 512 GB.
Die CPU ist ebenfalls für normale Nutzung völlig hinreichend (2 Kerne mit 2.0 GHz und 6 mit 1.7 GHz Taktung - 64 Bit ARM).
Die Geräte sind gebraucht günstig zu bekommen (um die 150 Euro, teilweise darunter).
Samsung erlaubt das einfache entsperren des Bootloaders, was die ganze Prozedure erheblich vereinfacht.

Das entsperren des Bootloaders führt zum Verlust der Garantie. Das kann NICHT rückgängig gemacht werden.

Namen - Schall und Rauch

Es gibt 2 Varianten des Galaxy Tab S5e, eine mit LTE, die andere unterstützt nur WiFI (aka. WLAN, die mit LTE hat natürlich auch WLAN).

Read more…

Sich in den Fuß taggern

Zum Zweck alle möglichen Maschinen nach der Installation mit einer Grundkonfiguration auszustatten habe ich ein Playbook.
Im Prinzip wird das nur einmal nach der Installation ausgeführt und soll für alle möglichen Installationen vom Spielserver, produktive Server, bis hin zu Arbeitssystemen genutzt werden. Ein Teil dieser Systeme wird danach nicht mehr per Ansible betreut.

Um verschiedene Konfigurationen zu erlauben benutze ich Tags.

Auszug des Plays:
      - name: htop installed
        ansible.builtin.apt:
          name: htop
          state: present
      - name: zsh installed
        ansible.builtin.apt:
          name: zsh
          state: latest
      - name: zshrc copied
        become: false
        tags:
        - mod_user
        ansible.builtin.copy:
          src: ~/.zshrc
          dest: "{{ ansible_user_dir }}/.zshrc"
      - name: Copy vim config
        become: false
        tags:
        - mod_user
        ansible.builtin.copy:
          src: ./init.lua
          dest: "{{ ansible_user_dir }}/.config/nvim/"
      - name: "{{ ansible_user }}'s shell is zsh"
        tags:
        - mod_user
        block:
        - name: Get installed packages
          ansible.builtin.package_facts:
            manager: apt
        - name: "Default shell zsh for {{ ansible_user }}"
          when: ansible_facts.packages['zsh'] is defined
          ansible.builtin.user:
            name: "{{ ansible_user }}"
            shell: /usr/bin/zsh

Der Aufruf sieht dann z.B. so aus:

ansible-playbook -t mod_user,server -i 192.168.127.48,  primer.yml -u someone

Read more…

404 Module not Found

couldn’t resolve module/action 'ansible.builtin.systemd_service'.

ERROR! couldn't resolve module/action 'ansible.builtin.systemd_service'. This often indicates a misspelling, missing collection, or incorrect module path.

The error appears to be in '/somewhere/primer.yml': line 123, column 9, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

          dest: /etc/systemd/logind.conf.d/
      - name: Reload logind config
        ^ here

Tätsächlich heißt das Modul in älteren Version ansible.builtin.systemd .
In neueren Versionen funktioniert der alte Name weiterhin.

Nicht einschlafen

Ich habe einen alten Laptop als Spielserver aufgesetzt.
Leider geht selbiger in den Standby-Modus sobald man den Deckel/Bildschirm schließt.

Eigentlich hatte ich erwartet das auf dem System ein acpid läuft der auf die APCI-Ereignisse reagiert - so war das jedenfalls als ich "jung" war ;)
Ich musste aber feststellen das das nicht der Fall ist. Worauf mich gleich das Gefühl beschlich das man den bestimmt durch irgendein systemd-Etwas ersetzt hat - heute ist schließlich alles systemd.
Und tatsächlich macht es ein systemd-Dienst - systemd-logind - ist ja auch naheliegend, er reagiert auf acpi-Events, also heißt er systemd-ac… ohh wait…

Egal, die Lösung ist recht einfach:

/etc/systemd/logind.conf
[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#UserStopDelaySec=10
#HandlePowerKey=poweroff
#HandlePowerKeyLongPress=ignore
#HandleRebootKey=reboot
#HandleRebootKeyLongPress=poweroff
#HandleSuspendKey=suspend
#HandleSuspendKeyLongPress=hibernate
#HandleHibernateKey=hibernate
#HandleHibernateKeyLongPress=ignore
#HandleLidSwitch=suspend
#HandleLidSwitchExternalPower=suspend

Read more…

Mach mich Wurzel

Ziel/Problem

Ich habe ein Ansible-Playbook welches ich beim Aufsetzen von Servern (oder auch anderen Maschinen) nutze.

Nutzt man ein Standard-Debian-Image legt man einen Nicht-Root-User bei der Installation an der sich per ssh einglogen kann.
Allerdings ist per Default kein sudo installiert und der Nicht-Root-Nutzer ist nicht in den sudoer-Dateien, kann also keine Befehle per sudo ausführen.

Man kann also nicht per ansible root-Befehle ausführen ohne ein Passwort hinterlegen/angeben zu müssen.

Ziel ist es das zu ändern:

  • Sicherstellen das sudo installiert ist

  • Festellen ob sudo (ohne Passwort) für den Nicht-Root-Nutzer funktioniert

    • ggf. ihn in die sudoers einzutragen

    • wenn notwendig interaktiv einmalig das root-Passwort abfragen

Read more…

Keine Magie - Certbot mit Webserver, ohne Plugin

Als ich das Blog eingerichtet habe, musste ich auch SSL konfigurieren.
Wie viele benutze ich dafür Letsencrypt über Certbot.

Damit certbot ein Zertifikat ausstellen kann muss nachgewiesen werden das man die praktische Verfügungsgewalt über die Domain hat für die man ein Zertifikat ausgestellt bekommen möchte. Das geht u.a. in dem man den Response für eine Challenge die man gesendet bekommt entweder als DNS-Eintrag hinterlegt, auf der Maschine die über den DNS-Namen erreichbar ist einen Standalone-Webserver starten lässt (certbot bringt den mit) oder in einem vorhandenen Webserver auf jener Maschine ihn in einer Datei hinterlegt.

Der Weg per Domain-Eintrag war mir zu umständlich, ein Standalone-Webserver geht nicht, weil auf dem System schon apache2 läuft der das Blog ausliefern soll und damit die notwendigen Ports belegt sind.
Verblieb also der Weg per vorhandenem Webserver.
Dafür bringt certbot Plugins für apache2 und nginx mit, die Magie machen.

Magie mag ich nicht, jedenfalls nicht wenn ich sie nicht verstehe oder selbst gemacht habe (was nicht zwangsläufig das Gleiche ist ;)).
Sie hat immer den Nachteil das im unwahrscheinlichen Fall eines Druckabfalls… ähh… auftreten eines Problems hat man keine Ahnung was abgeht.

Im folgenden also die Lösung wie man es manuell macht.

Problem

Certbot per Schreiben in das Webroot ermöglichen den Response auf die Challenge für die Zertifikatserstellung zu schreiben. Gleichzeitig Zugriff auf das Blog nur über TLS zulassen.

Read more…

Registrieren einer neuen Domain bei Hetzner

Eine Domain registrieren sollte eigentlich ganz einfach sein, zumal bei einem Hoster wie Hetzner.
Einfach gewünschten, freien Domainnamen eingeben paar Klicks und fertig.

Sollte so sein… ist es aber nur wenn man weiß wo man die Klicks bei Hetzner machen muss und welche Stolpersteine es gibt.

Ich brauchte eine neue Domain für dieses Blog und den restlichen Kram den ich beruflich tue.
Es hat mich über 30 Minuten gedauert herauszufinden wo ich die Klicks machen muss.
Die Domain verweist über 24 Stunden danach immer noch nicht auf den Server wo es hinverweisen soll, was daran liegt das per Default keine DNS-Server (also auch nicht die von Hetzner, was naheliegend wäre) bei der Registrierung der Domain hinterlegt werden. Das das nicht automatisch passiert habe ich erst später festgestellt.

User Registrieren

Read more…

Aktivieren der Müllabfuhr in Cyrus

Jeden Tag bringt man den Müll raus, aber irgendwie stapelt er sich nur neben der Mülltonne. - Die Müllabfuhr kommt nicht.
So in etwa ging es mir mit unserem Cyrus-IMAP "Mailserver"… die Benutzer leerten ihre Papierkörbe, aber der Speicherbedarf der Mails stieg immer weiter an, 2 mal mussten größere Platten gebucht werden beim Provider.
Nach einigem Untersuchen stellte ich fest das Mails die eigentlich gelöscht waren zwar aus Sicht der Benutzer weg waren, im Dateisystem waren sie aber noch vorhanden.

Tatsächlich markiert Cyrus Mails und Mailboxen nur als gelöscht, löscht sie aber nicht.
Das liegt daran das dazu die Datenbanken neu aufgebaut werden müssen, was mit hoher CPU-Last und I/O-Operationen einhergeht.

Die Müllabfuhr manuell bestellen

Um Mails zu endgültig zu löschen kann man folgenden Befehl nutzen:

Read more…

Wieso eigentlich AsciiDoc

why

Subjektiv weil ich scheinbar den Drang habe nach besseren Lösungen zu suchen als die die am weitestverbreiteten ist.
Mir sind die ausgetrampelten Wege meist zu langweilig, ich muss einen neuen, eventuell besseren Weg finden, sonst wird es mir schnell langweilig.
Ein einfaches, so macht man das ist mir zu unbefriedigend, ich will mindestens wissen warum man das so macht und ggf. welche Alternativen es gibt…

Ach so… die Artikel in diesem Blog werden bisher in AsciiDoc erstellt, das wäre der Kontext für diesen Artikel ;)

Objektiv betrachtet weil…

Warum überhaupt Markup-Sprachen und nicht HTML

Um zu verstehen warum AsciiDoc muss man verstehen warum überhaupt Markup-Sprachen und nicht einfach gleich HTML schreiben.
Häufig wird die Markup-Sprache ja letzen Endes auch wieder nur in HTML umgewandelt (manchmal auch in PDF, ePUB oder irgendetwas anderes, aber das könnte man mit HTML auch machen).
O.K. technisch gesehen ist Hyper Text Markup Language - aka. HTML auch eine Markup-Sprache, aber ich meine hier Markup im Sinne von Markdown, ReST (reStructuredText), AsciiDoc.

In der Regel aus diesen Gründen:

Sicherheitgründe - Zum Beispiel in einem Forum möchte man Benutzern erlaubern ihre Texte in fest definiertem Umfang zu gestalten, Farbe, Fett schreiben, Schriftgröße, Italic. Ggf. lässt man noch das einbinden von Bildern zu.
Markdown (häufig in diesem Bereich genutzt) bietet (oder kann darauf beschränkt werden) diesen limitierten Umfang. Der Compiler übersetzt Zeichenfolgen wie **Something** in entsprechendes HTML mit den entsprechenden CSS-Klassen.
Bestimmte Zeichenfolgen werden also fest in bestimmte HTM/CSS-Strukturen umgesetzt.
Unbeschränktes HTML hingegen würde zum Beispiel erlauben CSS-Klassen zu überschreiben und damit durch einfaches Posten die gesamte Seite umzugestalten. Oder das einbinden von Scripten, die ggf. Cross-Site-Scripting-Angriffe erlauben und damit Benutzer-Daten stehlen
Man muss bedenken: Durch das Posten (oder anderweitige hinterlegen von Daten) in einer Web-Applikation ändert ein Benutzer die gerenderte Website, HTML unterscheidet nicht zwischen Daten die Teil der eigentlichen Web-Applikation sind und Daten die durch eine dritte Partei (Benutzer) eingebracht wurden, es ist alles Teil der gleichen gerenderten Website und hat die gleichen "Rechte".

Templating/Geschlossene Systeme - Redakionssysteme, Blog-Systeme oder Systeme zum Erstellen technischer Dokumentation nutzen Templates die in Teilen bereits definieren wie die eine Seite aussehen soll und grob strukturiert ist.
Ein Bild zum Beispiel kann immer von einem sichtbaren Kasten umgeben sein. Nach einer Überchrift ein Absatz kommen, Überschriften in ein Inhaltsverzeichnis eingefügt werden usw.
Damit sich der eigentliche Schreiber darüber keine Gedanken machen muss schreibt er in Markup, der Text Processor wandelt dann anhand von Regeln das Markdown in entsprechende HTML-Strukturen um, die die gewünschten zusätzlichen Elemente und Formatierungen enthalten.

Einfachheit - Autoren wollen sich auf das Schreiben konzentrieren.
Ein Markup-System sollte also so wenig zusätzliche Schreibarbeit wie möglich verursachen, einfach zu merkende Symbole nutzen (schnell ins Blut übergehen).

Fett schreiben in HTML:

Der folgende Text<span class="bold">ist fett geschrieben</span>

In AcsiiDoc:

Der folgende Text **ist fett geschrieben**

Oder bei Tabellen:

HTML
<table>
  <tr>
    <th>Erste</th>
    <th>Zweite</th>
  </tr>
  <tr>
    <td>Datensatz 1, Spalte 1</td>
    <td>Datensatz 1, Spalte 2</td>
  </tr>
  <tr>
    <td>Datensatz 2, Spalte 1</td>
    <td>Datensatz 2, Spalte 2</td>
  </tr>
</table>
AsciiDoc
|===
|Erste|Zweite

|Datensatz1, Spalte1|Datensatz1, Spalte 1
|Datensatz2, Spalte1|Datensatz2, Spalte2
|===

O.K, aber warum nun AsciiDoc?

Es gibt 3 größere Markup-Player:

Sprache Standardisierung Dokumentatiton Umfang Einfachheit Verbreitung Werkzeugmenge

Markdown

Gibt verschiedene Dialekte mit verschiedenem Umfang

+

-
Über Erweiterungen ggf. gegeben

++

++

++

ReStructured Text

++

-

++

-

+

+

AsciiDoc

++

++

++

+

-

-

Markdown ist gut für einfache Dokumentation, da leicht zu lernen und einfache Syntax. Es ist nicht sauber spezifiziert und es gibt sehr viele Varianten, die ggf. über Erweiterungen erweitert ;) werden können.
RestructuredText ist umfangreich, man kann damit so ziemlich alles machen. Die Dokumentation ist aber eher schwer zu verstehen für normale Anwender und die Syntax teiweilse kompliziert und zeichenreich.

Tabelle in reStructuredText:
======  ======  ======
 Eins    Zwei   Länger
======  ======  ======
Wahr    Wahr    Falsch
Falsch  Falsch  Falsch
======  ======  ======
Tabelle in AsciiDoc
|===
|Eins|Zwei|Länger
|Wahr|Wahr|Falsch
|Falsch|Falsch|Falsch
|===

Oben sind die einfachsten Versionen von Tabellen in reStructuredText und AcsiiDoc zu sehen.
Die reStructuredText erfordert sehr viel mehr Steuerzeichen (die Menge der == orientiert sich am längsten Wert in der Spalte). Das Problem das die Syntax "ausführlicher" ist gibt es bei reStructuredText öfter.

Hinzu kommt das die offizielle Dokumentation von reStructuredText sich eher zäh ließt, da sie sich vom Styl eher an Entwickler von Software, als an Benutzer richtet.

Pro

  • Syntax für Grunddinge einfach wie Markown

  • Syntax so kurz wie möglich gehalten

    • man wird also weniger vom Schreiben abgelenkt

  • Umfangreich/komplexe Möglichkeiten

  • gute Dokumentation

    • Dokumentation ist benutzerorientiert

  • Standardisiert

Contra

  • Nicht weit verbreitet

  • wenig Software unterstützt es nativ

  • es gibt im Prinzip nur einen Prozessor (asciidoctor)

    • alle anderen Implementierungen sind Übersetzungen in andere Sprachen oder nicht vollständig