Das Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende und diskutiere in unserem Chat mit.
Heute möchte ich euch wissen lassen, welche Kombination es geworden ist.
Die Hardware
Ich habe mich für ein wiederaufbereitetes Lenovo T570 entschieden, welches für günstige 240 Euro im Onlinehandel verfügbar war. Da war dann auch noch für 30 Euro ein Schutzbrief drin, der Flüssigkeiten und Stürze abdeckt.
Mit dem Intel Core-i5 der 6. Generation, 8 GB RAM und einer 256 GB SSD bietet dieses Gerät mehr als ausreichend Leistung.
Das Gerät weist einige Gebrauchsspuren auf. Den Preis empfinde ich dennoch günstig, da Geräte dieser Klasse nicht unter 1.000 Euro Neupreis zu bekommen sind. Viel wichtiger jedoch ist, dass der Nutzer sich ebenfalls über das Gerät freut.
Linux-Distribution und Desktopumgebung
Wer die Wahl hat, hat die Qual. Um mir einen ersten Eindruck zu verschaffen, habe ich mir einen USB-Stick mit Ventoy und einer Auswahl an verschiedenen Linux-Distributionen erstellt. So konnte ich die verschiedenen Live-Systeme booten und prüfen, ob alles funktioniert und wie es sich in der Oberfläche navigieren lässt.
Schlussendlich habe ich mich für Debian Cinnamon entschieden. Dies machte nach dem ersten kurzen Test insgesamt den besten Eindruck. Firefox, Thunderbird, Bookmarks, Desktop-Verknüpfungen und Zoom-Client waren schnell eingerichtet und das Gerät bereit zur Übergabe.
Die Übergabe ist erfolgt
Mit der Übergabe gab es eine kurze Einweisung in das Gerät:
Wo schließt man das Netzteil an
Wo schaltet man das Gerät ein
Wie meldet man sich an
Wo findet man die Programme inkl. Tests aller wichtigen Dienste
Druck eines Anhangs aus Thunderbird
Wie fährt man das Gerät herunter
So reibungslos hat das bisher noch nie geklappt. Die Nutzungserfahrung ist positiv. Wir freuen uns.
Ende 2021 bin ich von einem Raspberry Pi 4 mit 4 GB auf einen Intel NUC7PJYH mit Proxmox VE umgestiegen. Hauptgrund damals war, dass bei mir das Upgrade von Raspberry Pi OS 10 auf...
Ikey Doherty ist kein Unbekannter in der Linux-Szene. Er zeichnet unter anderem für Solus Os und den Budgie-Desktop verantwortlich. Jetzt stellt er nach vier Jahren Entwicklung sein von Grund auf gebautes Betriebssystem Serpent OS vor.
Für viele Beteiligte in Projekten im Bereich Freier Software und Open Source sind Konferenzen das Salz in der Suppe. In zwei Wochen bietet die FrOSCon wieder Gelegenheit zu Hacking und Socializing.
Das Crowdfunding für das neue SBC des US-amerikanischen Unternehmens Particle begann heute auf Kickstarter. Die gut ausgestattete Platine ist mit dem Raspberry-Pi-Ökosystem kompatibel und bietet Ubuntu 24.04 als Standard-Distribution.
Vor einiger Zeit habe ich beschlossen eine Serie von Artikeln zum Thema Nextcloud auf dem RasPi auf meinem Blog intux.de zu veröffentlichen. Ziel ist es, eine eigene Cloud zu erstellen, die produktiv nutzbar ist. Diese soll später über das Internet erreichbar sein.
Was benötigt man dafür?
Um langfristig sicherzustellen, dass alles funktioniert, empfehle ich, die neueste Hardware zu verwenden, wie den Raspberry Pi 5. Allerdings würde hier auch ein Einplatinencomputer der vorherigen Generation mit 4GB RAM ausreichen.
Hier eine Auflistung der für das Projekt eingesetzten Komponenten:
Raspberry Pi 5
offizielles Gehäuse für den Raspberry PI 5
offizielles Netzteil für den Raspberry PI 5 (8GB RAM)
32GB MicroSD (SanDisk Extreme microSD UHS-I)
Vorbereitung
Diese kleine Anleitung soll helfen, das Projekt Nextcloud auf dem Raspberry Pi nicht nur umzusetzen, sondern auch besser zu verstehen. Der Schwerpunkt liegt dabei auf der Software und der Konfiguration. So können später auftretende Fehler besser lokalisiert und abgestellt werden.
Der Raspberry Pi wird als LAMP-Server (Linux, Apache, MariaDB, PHP) dienen, die Nextcloud zu betreiben. Wie man diese vier Bausteine aufsetzt, zeige ich im folgenden Abschnitt.
LAMP-Server
Installation
Der erste Baustein der installiert wird, ist Linux. Hierbei handelt es sich um das Betriebssystem Raspberry Pi OS. Dieses spielt man ganz einfach mit dem Raspberry Pi Imager auf die MicroSD.
Hier wählt man (siehe Screenshot) das zu installierende Betriebssystem aus. In diesem Fall ist es das Raspberry Pi OS (64-bit). Im Imager können vorab einige Einstellungen vorgenommen werden. Ich werde in dieser Anleitung einfache Bezeichnungen und Passwörter verwenden. Diese können während der Installation entsprechend frei angepasst werden!
Raspberry Pi Imager – OS und SD-Karte auswählenRaspberry Pi Imager – OS-Einstellungen vornehmen
Über das Zahnrad des Imagers lässt sich das Raspberry Pi OS vorkonfigurieren. Hier trägt man für den Anfang die entsprechenden Daten ein:
Danach wählt man am PC/Notebook die MicroSD aus, auf die geschrieben werden soll.
Raspberry Pi Imager – Schreibvorgang
Zum Schluss werden die Daten auf die MicroSD geflasht. Ist dies erledigt, kann die Karte ausgeworfen und in den vorbereiteten Raspbberry Pi (Kühlkörper, Gehäuse, Lüfter) geschoben werden. Dieser wird dann via LAN-Kabel mit dem heimischen Router verbunden und über das Netzteil mit Strom versorgt.
Natürlich könnte der RasPi auch via WLAN mit dem Router kommunizieren. Hiervon rate ich jedoch ab, da über die Funkverbindung oft nicht die volle Geschwindigkeit einer Ethernet-Verbindung genutzt werden kann. Weiterhin kann es zu Verbindungsabbrüchen bzw. -lücken kommen.
Nachdem der Raspberry Pi mit Strom versorgt wird, startet dieser. Ist der Raspberry Pi hochgefahren, kann dieser via arp-scan vom PC/Notebook im Netzwerk lokalisiert werden. In meinem Fall hat er die IP-Adresse 192.168.178.136.
sudo apt install arp-scan
sudo arp-scan -l
Identifizieren des RasPi mit arp-scan
Zugriff auf den Pi erhalte ich nun via zuvor im Imager aktiviertem SSH-Zugang.
ssh Benutzer@IP-Adresse
Zugang via SSH
Ist man eingeloggt, empfiehlt es sich die Lokalisierung über raspi-config auf deutsch (siehe Screenshots) umzustellen. Damit wird Datum und Uhrzeit des Servers an die europäische Zeitzone (Berlin) angepasst.
Nachdem die Installation durchgelaufen ist, kann man zum Testen den Webserver Apache via Browser über die Web-Adresse http://ip erreichen.
Anschließend wird die von der Nextcloud benötigte Datenbank installiert. Zuerst wird jedoch die mysql_secure_installation durchgeführt. Ich empfehle hier das Ganze gemäß meinen Empfehlungen (Enter, n, n, y, y, y, y) zu durchlaufen. Hierbei wird für den MariaDB-Server kein separates Root-Passwort vergeben, der anonyme User wird gelöscht, die Remote-Root-Anmeldung wird verboten, die Test-DB wird gelöscht und die Änderungen ausgeführt.
sudo mysql_secure_installation
If you’ve just installed MariaDB, and you haven’t set the root password yet, the password will be blank, so you should just press enter here. Enter
Switch to unix_socker_authentication [Y/n] n Change the root password? [Y/n] n Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] y Remove test database and access to it? [Y/n] y Reload privilege tables now? [Y/n] y
Nachdem dieser Schritt durchgeführt wurde, kann über folgenden Befehl die Datenbank erstellt werden.
sudo mysql -u root -p
In meinem Fall heißen die Datenbank und der Benutzer „nextcloud“. Die Datenbank liegt dann auf dem „localhost“.
> CREATE DATABASE nextcloud;
> CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'geheim';
> GRANT ALL ON nextcloud.* TO 'nextcloud'@'localhost';
> FLUSH PRIVILEGES;
> \q
Im Nachgang wechselt man in das Verzeichnis /var/www/html, wo die Nextcloud installiert wird. Die letzte Version wird vom Entwickler herunter geladen und entpackt. Danach wird die nicht mehr benötigte Zip-Datei wieder gelöscht und die Rechte der Dateien an den Benutzer www-data übertragen.
Nun ist die Nextcloud über http://ip/nextcloud (http://102.168.178.136/nextcloud) erreichbar. Man legt den Admin fest und trägt die Daten der zuvor erstellten MariaDB-Datenbank in die Eingabemaske ein. Hat das alles geklappt, dann dauert die Einrichtung ein paar Minuten und die Nextcloud steht bereit zum ersten Login des neuen Administrators.
Administrator-Konto anlegen
Vorschau
Im nächsten Teil zeige ich, wie man die App Collabora Online – Built-in CODE Server (ARM64) in der Nextcloud via Terminal installiert.
Murena arbeitet beständig an der Verbesserung seines mobilen Betriebssystems /e/OS. Mit v2.2 haben Eltern mit Parental Control jetzt ein Werkzeug zur Kontrolle der Surf-Zeiten der Kinder zur Hand.
In diesem Überblick beschreibe ich am Beispiel der Proxmox inventory source, wie eine eigene Inventory Source im Ansible Automation Controller hinzugefügt werden kann.
Die folgenden Schritte wurden mit der Ansible Automation Platform 2.4 getestet. Die einzelnen Schritte sollten in gleicher Weise auch in Ansible AWX ausgeführt werden können.
Um diesem Text folgen zu können, werden Kenntnisse im Umgang mit Ansible und Git auf der Kommandozeile vorausgesetzt.
Der Text verweist, wo möglich, auf bestehende Dokumentation. Es handelt sich bei diesem Text nicht um ein klassisches Tutorial. Er dient mir als Gedächtnisstütze und mag euch eine Anregung sein, bzw. im besten Fall die Wissenslücken schließen, die sich mit der Dokumentation allein nicht schließen lassen.
Für das Beispiel in diesem Text werden Hosts aus der Bestandsliste eines PVE als Inventory Source hinzugefügt. Die dabei verwendete Vorgehensweise kann auch für andere Inventory Plugins verwendet werden. Die Entwicklung von Inventory Plugins ist jedoch nicht Gegenstand dieses Textes. Hierzu wird auf die Dokumentation unter „Developing dynamic inventory“ verwiesen.
Mein Kollege Steffen Scheib hat mir geholfen, das Proxmox-Plugin zu konfigurieren, wofür ich ihm an dieser Stelle nochmal ganz herzlich danke. Es liegt auf meiner Arbeitsstation als Ansible Project in folgender Verzeichnisstruktur vor:
Mit Ausnahme der Datei vault_password_file wurden alle Dateien und Verzeichnisse in Git aufgenommen. Ich verwende einen einfachen Git-Server in meiner Laborumgebung, auf welchen ich meine lokalen Repositorys pushe. Der Automation Controller synchronisiert das Projekt aus dem Git-Repo, um es als Inventory Source verfügbar zu machen.
Das Proxmox Inventory Plugin befindet sich in einem Git-Repository, auf welches mit SSH-Key-Authentifizierung zugegriffen werden kann. Damit auch der Automation Controller auf dieses Repository zugreifen kann, wird ein Credential vom Typ Source Control erstellt.
Beipsiel für einen Source Control Credential Typ im Ansible Automation Controller
Der SSH-Private-Key wurde von meinem Host hochgeladen und verschlüsselt im Automation Controller gespeichert. Der Key lässt sich in der GUI nicht wieder sichtbar machen, lediglich ersetzen.
Die Datei vault_password_file befindet sich jedoch nicht im Git, da sie das Passwort im Klartext enthält. Aus diesem Grund möchte ich die Datei auch nicht auf dem Automation Controller ablegen. Irgendwie müssen auf dem Automation Controller jedoch Credentials hinterlegt werden, um die Ansible Vault encrypted_strings zu entschlüsseln. Die Lösung steckt in diesem Kommentar auf Github. Im Automation Controller User Guide gibt es dazu Chapter 11. Custom credential types.
Das Schlüssel-Wert-Paar secret: true stellt sicher, dass das Passwort verschlüsselt gespeichert wird. Es kann danach im Automation Controller nicht mehr im Klartext angezeigt werden. Nachdem der neue Credential Typ erstellt ist, kann dieser instanziiert werden:
Beispiel des neuen Custom Credential Typs ‚encrypted_vault_password‘
Das Vault Passwort wird in das entsprechende Formularfeld kopiert. Es ist standardmäßig nicht sichtbar und wird wie oben bereits erwähnt, verschlüsselt gespeichert. Mit diesem Credential verfügt der Automation Controller nun über die notwendigen Informationen, um das Proxmox Inventory auszulesen.
Die Fotoverwaltung Immich als freie Alternative zu Google Photos hat ein neues Unterstützungsmodell zur Finanzierung der weiteren Entwicklung vorgestellt. Die Software bleibt aber weiterhin in vollem Umfang frei nutzbar.
Das mit Firefox 128 und der „Privacy Preserving Attribution“ (PPA) Funktion dürften die meisten mitbekommen haben. Ich zeige euch in diesen Beitrag, wie ihr die PPA Funktion unter Linux, Windows, macOS und Android deaktivieren...
🚀 Schnell: geschrieben in Rust für blitzschnelle Geschwindigkeit und Speichersicherheit ☁️ Leicht: kein JavaScript, keine Werbung, kein Tracking, keine Aufblähung 🕵 Privat: alle Anfragen werden über den Server geleitet, einschließlich Medien 🔒 Sicher: starke Content Security Policy verhindert Browser-Anfragen an Reddit
Browser Addons:
Mit dieser Erweiterung könnt ihr sämtlichen Reddit Traffic in eurem Browser auf eine Redlib Instanz umleiten.
Das Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende und diskutiere in unserem Chat mit.
Homeserver und NAS haben Konjunktur. Mit HexOS steigt ein neuer Mitbewerber in den Markt ein, der eine einfache, aber trotzdem leistungsfähige NAS-Software entwickelt.
Auch nach der Veröffentlichung von Plasma 6.1 gönnen sich die Entwickler bei KDE keine Pause und arbeiten bereits fleißig an der Fehlerbereinigung sowie an neuen Funktionen für Plasma 6.2
In diesem Beitrag gebe ich einige Beispiele mit Erklärungen zu Ansible Conditionals, welche mir in der Dokumentation fehlen. Dieser Artikel dient mir zur Erinnerung und mag Einsteigern helfen, ein besseres Verständnis der Bedingung is defined zu gewinnen.
Wird in einem Task eine Variable verwendet, welche nicht definiert ist, bricht Ansible die Verarbeitung eines Playbooks mit einem Fehler ab. Der folgende Code-Block zeigt ein einfaches Playbook mit anschließender Ausgabe des Playbooklaufs, um dies zu verdeutlichen. Der Task beinhaltet dabei bereits eine Bedingung. Er soll nur dann ausgeführt werden, wenn die Variable my_var den Wert Hello world! enthält.
]$ cat test_conditionals.yml
---
- name: Play around with conditionals
hosts: localhost
gather_facts: false
tasks:
- name: >-
When all conditionals are met, print the variable value using
ansible.builtin.debug
when:
- my_var == "Hello world!"
ansible.builtin.debug:
var: my_var
]$ ansible-playbook -i hosts test_conditionals.yml
PLAY [Play around with conditionals] *******************************************
TASK [When all conditionals are met, print the variable value using ansible.builtin.debug] ***
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'my_var == \"Hello world!\"' failed. The error was: error while evaluating conditional (my_var == \"Hello world!\"): 'my_var' is undefined. 'my_var' is undefined\n\nThe error appears to be in '/home/tronde/ansible/test_conditionals.yml': line 7, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: >-\n ^ here\n"}
PLAY RECAP *********************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Der Text 'my_var' is undefined in obiger Fehlerausgabe benennt den Grund des Scheiterns.
Nun gibt es Fälle, in denen Tasks, welche undefinierte Variablen enthalten, nicht zum Abbruch des gesamten Playbooks führen sollen. Stattdessen soll der betroffene Task einfach übersprungen werden. Dies erreicht man mit der Bedingung `is defined`. Der nächste Code-Block liefert wieder ein Beispiel dazu.
]$ cat test_conditionals.yml
---
- name: Play around with conditionals
hosts: localhost
gather_facts: false
tasks:
- name: >-
When all conditionals are met, print the variable value using
ansible.builtin.debug
when:
- my_var is defined
- my_var == "Hello world!"
ansible.builtin.debug:
var: my_var
]$ ansible-playbook -i hosts test_conditionals.yml
PLAY [Play around with conditionals] *******************************************
TASK [When all conditionals are met, print the variable value using ansible.builtin.debug] ***
skipping: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=0 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Der Task mit der undefinierten Variable wurde übersprungen (skipped) und das Playbook erfolgreich beendet.
Im nächsten Beispiel habe ich die Variable my_var im Playbook definiert und den passenden Wert zugewiesen.
]$ cat test_conditionals.yml
---
- name: Play around with conditionals
hosts: localhost
gather_facts: false
vars:
my_var: Hello world!
tasks:
- name: >-
When all conditionals are met, print the variable value using
ansible.builtin.debug
when:
- my_var is defined
- my_var == "Hello world!"
ansible.builtin.debug:
var: my_var
]$ ansible-playbook -i hosts test_conditionals.yml
PLAY [Play around with conditionals] *******************************************
TASK [When all conditionals are met, print the variable value using ansible.builtin.debug] ***
ok: [localhost] => {
"my_var": "Hello world!"
}
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Das war auch schon alles für heute. Ihr seht, es ist keine Hexerei. Mir hilft es, die Bedeutung von is defined zu erinnern, wenn ich es einmal aufgeschrieben habe.
Zum Ende gibt es noch einen Code-Block, der zeigt, dass dies auch mit Dictionaries funktioniert:
]$ cat test_conditionals.yml
---
- name: Play around with conditionals
hosts: localhost
gather_facts: false
vars:
my_dict:
my_var: Hello world!
tasks:
- name: >-
When all conditionals are met, print the variable value using
ansible.builtin.debug
when:
- my_dict.my_var is defined
- my_dict.my_var == "Hello world!"
ansible.builtin.debug:
var: my_dict.my_var
]$ ansible-playbook -i hosts test_conditionals.yml
PLAY [Play around with conditionals] *******************************************
TASK [When all conditionals are met, print the variable value using ansible.builtin.debug] ***
ok: [localhost] => {
"my_dict.my_var": "Hello world!"
}
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
In der Kategorie Ansible findet ihr weitere Artikel rund um Ansible. Viel Spaß beim Stöbern.
Das Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende und diskutiere in unserem Chat mit.
Das Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende und diskutiere in unserem Chat mit.
Das Ubuntu 22.04 Buch für Einsteiger Seit Juni 2024 ist das neue Buch von Linux Autor Josef Moser über Ubuntu 24.04 LTS erhältlich. Wie immer handelt es sich dabei um eine sogenannte Schnellanleitung. Das bedeutet, dass es sich inhaltlich hauptsächlich an Linux Einsteiger richtet. Ubuntu zählt zu den beliebtesten Linux Betriebssystemen. Alle zwei Jahre veröffentlicht… Weiterlesen Ubuntu 24.04 Buch von Josef Moser veröffentlicht
EndeavourOS, eine beliebte, auf Arch Linux basierende Linux-Distribution feiert ihr fünfjähriges Bestehen. Mit dieser Ausgabe kehr auch der zuvor eingestellte ARM-Zweig wieder zurück.
Eine von Qualys entdeckte Sicherheitslücke im OpenSSH-Server mit einem CVSS-Score von 9 wurde geschlossen. Erfolgreiche Angreifer erhalten automatisch Root-Rechte.
Dem Forscherteam von Qualys ist es gelungen, eine ältere Sicherheitslücke in OpenSSH, die schon eigentlich längst geschlossen war, erneut auszunutzen. Die neue Lücke wird als CVE-2024-6387 geführt und ist deswegen brisant, weil Sie bei Erfolg dem Angreifer Root-Rechte ohne vorherige Authentifizierung ermöglicht. Die nötigen Bedingungen für ein Ausnutzen der Lücke sind allerdings nicht ganz trivial.
Die gesamte Erläuterung der Sicherheitslücke ist im Bericht von Qualys umfangreich erläutert wollen. Wenn wir es schaffen, werden wir diesen schon Mittwoch im Risikozone-Podcast detaillierter erläutern.
So viel sei gesagt: die Lücke existierte schon mal als CVE-2006-5051, wurde dann gefixt und konnte jetzt (erstmals) ausgenutzt werden, da der eigentlich kritische Teil 2020 wieder versehentlich eingebaut wurde.
Der Fehler selber baut darauf, dass syslog() zur Protokollierung asynchron aufgerufen wird, obwohl die Funktion nicht "async-signal-safe" ist. Kann ein Angreifer Timingeigenschaften ausnutzen, wird er in die Lage versetzt, Code einzuschleusen, der in einem privilegierten Teil von OpenSSH ausgeführt wird. Der Zeitaufwand ist allerdings hierfür nicht zu unterschätzen, da das Codefragment nur bei einem Verbindungstimeout aufgerufen wird.
Es ist gemäß des Qualys-Berichtes hervorzuheben:
Die OpenSSH-Versionen vor 4.4p1 (2006) sind angreifbar, sofern sie nicht explizit gepatcht wurden.
Die OpenSSH-Versionen zwischen 4.4p1 und 8.5p1 (2021) hatten nicht den besagten Code drin.
Die OpenSSH-Versionen ab 8.5p1 hatten den Code wieder drin.
Mit OpenSSH 9.8p1 wurde die Lücke gepatcht.
Mit anderen Worten: abhängig von eurem System ist die Schwachstelle vorhanden, weswegen ihr in eure Distribution schauen solltet, ob es Updates gibt.
OpenSSH ist nichtsdestotrotz im Hinblick auf seine Rolle und Exposition eines der sichersten Programme der Welt. Die Software ist ein sehr stringent abgesicherter Dienst, der u. a. auf Sandboxing-Mechansimen setzt, um den Umfang der Codesegmente, die als root ausgeführt werden, gering zu halten. Diese Lücke ist eine der seltenen Situationen, in der trotzdem ein Security-Bug vorhanden ist. Dabei ist eine Ausnutzung vergleichsweise aufwändig.
FOSSWELT will deutschsprachige Projekte und Teilhaber aus dem Foss-Umfeld näher zusammenbringen, um Synergien zu schaffen und unsere Nische auszuweiten.
Der COSMIC Desktop von System76 weckt hohe Erwartungen. Bis zum Ende Juli haben die Entwickler nun eine erste Alpha-Version des auf Rust basierenden Desktops angekündigt.
Mit » Everything LTS« bietet Canonical einen Dienst zur Erstellung kundenspezifischer, distro-agnostischer Container, die mit Ubuntu Pro 12 Jahre Support erhaltenj.