Normale Ansicht

Es gibt neue verfügbare Artikel. Klicken Sie, um die Seite zu aktualisieren.
Ältere BeiträgeBlogs

Security Tools: Trivy – Docker Container auf Sicherheitslücken durchsuchen

09. Januar 2022 um 20:17

Container sind nach wie vor in alle Munde. Wer, der Einfachheit halber, mit Docker hantiert, der sollte regelmäßig die Aktualität der verwendeten Images prüfen. Nicht erst seit Log4j verbergen sich unerwünschte Sicherheitslücken in veralteten Images.

trivy

Trivy

Das Open-Source-Tool Trivy bietet die Möglichkeit lokale Images, direkt im Filesystem oder entfernte Repositorys nach Lücken zu scannen. Das Programm scannt unter anderen Base Images wie Alpine, Debian, Ubuntu, CentOS, SUSE, Photon OS, Paketmanager und andere Abhängigkeiten mithilfe der eigenen Schwachstellendatenbank ab.

Die Trivy Datenbank basiert auf NVD und diverser Security Meldungen einzelner Programmiersprachen (siehe).

Installation Trivy Security Scanner Debian/Ubuntu

sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

Einen Scan mit Trivy anstoßen

Um die Übersicht der Scanergebnisse zu behalten, empfiehlt es sich, die Ausgabe auf kritische Lücken zu beschränken

trivy image --severity HIGH,CRITICAL IMAGENAME

trivy-scan

Das Tool erlaubt es ebenfalls einen HTML Report zu veröffentlichen

trivy image --format template --template "@contrib/html.tpl" -o report.html golang:1.12-alpine

trivy-ergebnisse

Trivy kann auch das Filesystem untersuchen.

trivy fs /path/to/project

Schlussendlich kann auch direkt via GitHub gescannt werden.

trivy repo https://github.com/knqyf263/trivy-ci-test

Fazit

Wer Docker im Einsatz hat, sollte die verwendeten Images regelmäßig auf Sicherheitslücken und Abhängigkeiten prüfen. Der Profi baut seine Images sicher selbst und weiß, was er tut, allerdings übersieht ein DevOp auch dort mal Abhängigkeiten. Auch hier schafft Trivy praktische Abhilfe, denn es lässt ich schnell in CI Workflows, beispielsweise von Gitlab integrieren.

Download

XEP-0156 reparieren

06. Januar 2022 um 10:44

Mein XMPP-Server ist vor einiger Zeit mal wieder durch den Complience-Test gefallen, da das Modul XEP-0156 schlapp gemacht hatte. Nun konnte ich die freien Tage über den Jahreswechsel nutzen und den Fehler fixen. Damit die Konfiguration nicht verloren geht, möchte ich diese hier kurz festhalten.

Zur Ausstattung

Mein XMPP-Server läuft unter Prosody 0.11.10 auf Debian 11 Bullseye. Als Webserver wird Apache2 eingesetzt.

Konfiguration

So sieht der VirtualHost aus:

<VirtualHost *:80>

        RewriteEngine On
        RewriteCond %{HTTPS} !=on
        RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

        ServerAdmin info@intux.de
        DocumentRoot /var/www/html/intux

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
	CustomLog /var/log/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

	ServerName intux.de
	ServerAlias www.intux.de
	RewriteCond %{SERVER_NAME} =intux.de [OR]
	RewriteCond %{SERVER_NAME} =www.intux.de
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>

	Protocols h2 h2c http/1.1

<Location /http-bind>
        Order allow,deny
        Allow from all
</Location>

<Location ~ "/\.well-known/host-meta(\.json)?">
    Header set Access-Control-Allow-Origin "*"
</Location>

        RewriteEngine On
	RewriteRule ^/http-bind$ http://intux.de:5280/http-bind [P,L]

	ServerAdmin info@intux.de
        DocumentRoot /var/www/html/intux
        Header always set Strict-Transport-Security "max-age=31536000"
        Header set Access-Control-Allow-Origin "*"
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        CustomLog /var/log/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

	Include /etc/letsencrypt/options-ssl-apache.conf
	ServerName intux.de
	ServerAlias www.intux.de

	SSLCertificateFile /etc/letsencrypt/live/intux.de-0003/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/intux.de-0003/privkey.pem
</VirtualHost>
</IfModule>

<IfModule mod_proxy.c>
    <IfModule mod_proxy_wstunnel.c>
    ProxyTimeout 900
    <Location "/xmpp-websocket">
        ProxyPreserveHost On
        ProxyPass "ws://localhost:5280/xmpp-websocket"
    </Location>
    </IfModule>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Hier die host-meta:

<?xml version='1.0' encoding='utf-8'?>
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
  <Link rel="urn:xmpp:alt-connections:xbosh"
        href="https://intux.de/http-bind" />
  <Link rel="urn:xmpp:alt-connections:websocket"
        href="wss://intux.de:443/xmpp-websocket" />
</XRD>

Die Konfiguration der prosody.cfg.lua:

pidfile = "/var/run/prosody/prosody.pid"

storage = "sql"

sql = {
    driver = "MySQL";
    database = "prosody";
    host = "localhost";
    username = "bn";
    password = "pw";
}

plugin_paths = { "/usr/lib/prosody/prosody-modules" }

admins = {"intux@intux.de" }
modules_enabled = {
	"roster";
	"saslauth";
 	"tls";
	"dialback";
	"disco";
	"private";
	"blocklist";
	"version";
	"uptime";
	"time";
	"ping";
	"posix";
	"pep";
	"register";
	"admin_adhoc";
	"motd";
	"welcome";
	"proxy65";
	"watchregistrations";
	"register_web";
	"admin_web";
	"http_upload_external";
	"mam";
	"csi";
	"carbons";
	"smacks";
	"lastlog";
	"cloud_notify";
	"omemo_all_access";
	"server_contact_info";
	"profile";
	"vcard_legacy";
	"pep_vcard_avatar";
	"websocket";
	"bookmarks";
	"bosh";
	"http_altconnect";
	"turncredentials";
}

log = {
 debug = "/var/log/prosody/prosody.log";
 error = "/var/log/prosody/prosody.err";
}

legacy_ssl_ports = { 5223 }

default_archive_policy = false;
archive_expires_after = "1m";

c2s_require_encryption = true
s2s_require_encryption = true
s2s_secure_auth = true
s2s_secure_domains = { "trashserver.net", "jabber.de", "jabber.org", "xmpp.org" }
s2s_insecure_domains = {}

http_upload_external_base_url = "https://upload.intux.de/upload/"
http_upload_external_secret = "prosody2016."
http_upload_external_file_size_limit = 10000000

proxy65_ports = { 5212 }

authentication = "internal_hashed"

turncredentials_host = "cloud.intux.de"
turncredentials_secret = "18c5a842b57336a16c97255c4fc1aeb5336e3b6a9254b6bd148d789d8a740779"
turncredentials_port = 5349

consider_websocket_secure = true;
cross_domain_websocket = true;
consider_bosh_secure = true;
cross_domain_bosh = true;

allow_registration = true
min_seconds_between_registrations = 300
registration_blacklist = { "83.218.198.86", "109.185.243.100", "93.114.0.93", "93.114.11.136", "92.114.216.80" }

ssl = {
	protocol = "tlsv1_2";
        key = "/etc/prosody/certs/privkey.pem";
        certificate = "/etc/prosody/certs/fullchain.pem";

        dhparam = "/etc/prosody/certs/dh-4096.pem";

        ciphers = "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED:!AES128:!CAMELLIA128";

        options = { "no_sslv2", "no_sslv3", "no_ticket", "no_compression", "cipher_server_preference", "single_dh_use", "single_ecdh_use" }

}

contact_info = {
  abuse = { "mailto:abuse@intux.de", "xmpp:intux@intux.de" };
  admin = { "mailto:admin@intux.de", "xmpp:intux@intux.de" };
  feedback = { "mailto:admin@intux.de", "xmpp:intux@intux.de" };
  sales = { "mailto:admin@intux.de", "xmpp:intux@intux.de" };
  security = { "mailto:admin@intux.de", "xmpp:intux@intux.de" };
  support = { "xmpp:admin@intux.de", "xmpp:intux@intux.de" };
}

VirtualHost "intux.de"

Component "proxy.intux.de" "proxy65"

	proxy65_acl = { "intux.de" }

Component "conference.intux.de" "muc"
        name = "intux.de Chatrooms"
        restrict_room_creation = false
        max_history_messages = 500
        modules_enabled = {
                "mam_muc",
		"vcard_muc",
        }
        muc_log_by_default = false

Compliance status for intux.de 100%. 😀

NextcloudPi angesehen

04. Januar 2022 um 17:18

Wie schön wäre es doch, seine Daten sicher zu Hause aufzubewahren, sie immer und überall verfügbar zu haben und diese nicht an zweifelhafte Cloud-Dienstleister auszulagern. Geht das? Na klar, mit der Nextcloud!

Hierzu benötigt man nicht viel. Ein Raspberry Pi mit Internetanschluss und etwas Interesse sich mit dieser interessanten Materie zu beschäftigen reicht völlig aus. Ich bevorzuge generell die klassische Installation der Cloud-Software auf einem LAMP-Server.

Einen etwas einfacheren Weg zur eigenen Cloud geht OWN YOUR BITS. Die Entwickler stellen komplette Images zur Verfügung, um die Cloud ohne Linux-Erfahrung in den eigenen vier Wänden zu realisieren.

Installation

Ich habe mir nun einmal NextcloudPi für den Raspberry Pi etwas genauer angesehen. Das Image hierzu ist 4,3GB groß und kann direkt von der Webseite kostenlos heruntergeladen und eingesetzt werden. Dabei muss man natürlich aufpassen, dass das richtige Download-Paket ausgewählt wird. Ist dies geschehen, wird das Image entpackt und z.B. mit dem Raspberry Pi Imager auf eine mindestens 16GB-große MicroSD geschrieben.

Der erste Kontakt

Nachdem die MicroSD in den Raspberry Pi eingelegt und dieser gestartet wurde (ohne Bildschirm, Tastatur und Maus), erreicht man NextcloudPi über die lokale Adresse https://nextcloudpi.local im heimischen Netzwerk. Voraussetzung ist jedoch der vorherige Anschluss des Einplatinencomputers über LAN-Kabel an den Router.

Wenn alles funktioniert, wird man nach dem Booten von folgendem Bildschirm begrüßt. 

NextcloudPi – Erstkontakt

Hier bekommt man Benutzernamen und Passwörter für das NextcloudPi Webinterface sowie die Nextcloud. Nach der Aktivierung gelangt man nun in den NextcloudPi-Maschinenraum. Dazu wird das erste Passwort benötigt, welches später auch geändert werden kann. Weiter geht es mit einem Installations-Wizard, welcher dabei hilft die Cloud mit einer Festplatte oder SSD über USB zu erweitern. Außerdem hat man nun die Möglichkeit das System über einen DynDNS-Anbieter von außen über das Internet erreichbar zu machen.

NextcloudPi – Installations-Wizard

Im Webinterface lassen sich serverseitig einige Einstellungen erledigen, ohne jedoch wirklich selbst Serverkenntnisse besitzen zu müssen. Das birgt allerdings die Gefahr, dass das System ungewollt beschädigt werden kann, was mir tatsächlich einige Male gelungen ist. Um nun in solch einer Situation zur Reparatur selbst Hand anzulegen, muss an den Raspberry Pi ein Monitor und eine Tastatur angeschlossen werden, damit auf den eigentlichen Server zugegriffen werden kann. Dies geht nun direkt auf dem Raspberry Pi oder nach SSH-Aktivierung von einem anderen Computer. Im letzteren Fall kann der RasPi wieder von den zuvor angeschlossenen Peripheriegeräten getrennt werden. Ohne ein wenig Linux-Erfahrung ist man aber hier aufgeschmissen.

Die Nextcloud

Die Nextcloud erreicht man nach erfolgreicher Beendung der Installationsroutine über https://nextcloudpi oder die vom Router für den Raspberry Pi vergebene IP-Adresse. In meinem Fall: https://192.168.178.32. Falls die DynDNS-Adresse zu diesem Zeitpunk schon eingerichtet und in die config.php über das Webinterface aufgenommen wurde, wäre die Nextcloud-Instanz auch über die vergebene Web-Adresse erreichbar, vorausgesetzt die Ports 80 und 443 sind am Router auf Port Forwarding gesetzt.  Das Login erfolgt nun über das am Anfang vergebene zweite Passwort. Begrüßt wird der neue Nutzer nun erstmalig von der eigenen Cloud-Instanz. Ratsam wäre es hier, einen neuen Benutzer als Administrator anzulegen und den User ncp später zu löschen.

Nextcloud - Login

Auch in der Nextcloud sind Änderungen am System mit äußerster Vorsicht vorzunehmen! Die Erstellung eines Backups ist aus meiner Sicht vorher ebenfalls unverzichtbar. So wurde ich z.B. nach einem App-Upgrade komplett ausgesperrt, da die Cloud dauerhaft im Wartungsmodus verharrte.

Auch anzumerken ist, dass die verwendete Nextcloud-Version nicht up to date ist, wie auch das auf Debian basierende Raspberry Pi OS. Das ist aber nicht weiter schlimm, da diese Versionen eine Langzeitunterstützung seitens der Entwickler erfahren. Die aktuelle Nextcloud-Version ist die 23. Auf NextcloudPi läuft Version 21 und Raspberry Pi OS 10, aktuell v11.

Nextcloud – Fehlermeldungen

Wie man oben im Bild sehen kann, kommt es noch zu diversen Fehlermeldungen, die ebenfalls ohne Serverkenntnisse nicht beseitigt werden können. Es müssen Pakete nachinstalliert werden, bzw. sind Eingriffe in die Konfigurationsdatei der Nextcloud-Instanz notwendig.

Fazit

NextcloudPi ist mit Sicherheit ein interessantes Projekt, welches es dem User erlaubt, schnell eine eigene Nextcloud-Instanz auf dem Einplatinencomputer Raspberry Pi einzurichten und in Betrieb zu nehmen. Die Erreichbarkeit aus dem Internet wird bei Bedarf über eine DynDNS-Adresse realisiert. Wer nicht die neueste Version der Nextcloud einsetzen muss und bereit zu Abstrichen ist, für den ist das System durchaus empfehlenswert.

Meinen Zugang zur Cloud konnte ich problemlos via 2FA mit einem YubiKey absichern.

Leider fehlt ein Turn-Server im System, welcher es quasi unmöglich macht Videokonferenzen via nachinstallierter App Talk zu führen. Ein Turn-Server kann aber im Nachhinein auf dem Raspberry Pi noch nachinstalliert werden. Auch hierzu sind Linux-Kenntnisse von Vorteil.

Jahresrückblick 2021 und Ausblick

31. Dezember 2021 um 22:30

In wenigen Minuten endet 2021. Wagen wir deshalb einen kurzen Blick zurück und schauen, was uns erwartet.

Dieses Jahr habe ich im Blog 20 Artikel verfasst, bei denen ich überwiegend dem Open-Source-Schwerpunkt treu geblieben bin. Es gibt darüber hinaus eine komplett neue Kategorie „Wirtschaft“, die ich erstmals im Mai diesen Jahres ausprobiert habe. Hier soll es mehr um aktuelle Entwicklungen in der Wirtschaft, speziell bei Kryptowährungen und Smart Contracts, gehen. Bitcoin, Ethereum & Co. haben sowieso dieses Jahr dominiert und mehrfach neue Höchststände erreicht. Auch hier schreitet die Entwicklung schnell voran und wird uns in den nächsten Jahren begleiten.

Hier schließt nahtlos das Jahr 2022 an. Ich möchte diesen Blog kontinuierlich fortführen und weiterentwickeln. Selbstverständlich könnt ihr auch im kommenden Jahr spannende Artikel erwarten. Der Microblog wurde bereits in diesem Jahr tiefer in den Blog integriert, sodass die kürzeren Beiträge einfacher erreichbar werden. So sich die Gelegenheit bietet, wird der Microblog auch stärker ausgebaut.

Ich wünsche euch jedenfalls jetzt einen guten Rutsch und vor allem viel Gesundheit und Freude im Jahr 2022!

Bash-Kommandos erklären lassen

31. Dezember 2021 um 17:08

Wer Linux intensiv nutzt, wird um die Kommandozeile nicht herumkommen. Hier läuft meist eine Shell, die kompatibel zur Bash ist oder bei der es sich direkt um die Bash handelt.

Interessant bei Bash (und vielen anderen Shells) ist die Leistungsfähigkeit. So beschränkt sich die Kommandozeile nicht auf einfache Programmaufrufe, sondern bietet einige Ausdrücke, die in Verbindung mit kleinen Hilfsprogrammen unter anderem bedingte Anweisungen oder Schleifen ermöglichen. Leider ist die Syntax im Gegensatz zu anderen Skriptsprachen manchmal ungewohnt, weswegen unregelmäßige Anwender öfter mal in der Dokumentation nachlesen müssen.

Eine interessante Unterstützung bietet hierbei explainshell.com. Hier kann man einen Bash-Ausdruck eingeben und ihn sich von der Seite erklären lassen. Dabei werden nicht nur die Manpages der verwendeten Kommandos wie find, grep oder git, sondern auch die passenden Auszüge der bash-Manpage selber eingebunden. Dies wird zusätzlich anschaulich visualisiert.

Der Quellcode von explainshell.com ist GPL-3-lizenziert und auf GitHub verfügbar.

In eigener Sache: Weitere Spendenmöglichkeiten

Von: dominion
29. Dezember 2021 um 10:14

Ihr könnt adminForge und die datensparsamen kostenlosen Services ab sofort nicht nur über PayPal und Banküberweisung unterstützen. Neu sind: Liberapay, Bitcoin und RollerCoin – ein kostenloses Crypto-Game. Liberapay Du möchtest dich mit einem freiwilligen...

by adminForge.

Ein guter Pomodoro Timer

28. Dezember 2021 um 18:30

Seit Längerem suche ich nach einem guten Pomodoro Timer für Debian/Ubuntu. Die Auswahl hierfür ist nicht gerade groß. Außerdem bin ich vielleicht in diesem Punkt auch etwas zu anspruchsvoll, was die Suche deutlich erschwert hat.

Der perfekte Timer sollte in meiner GNOME-Shell oben im Tray übersichtlich Platz finden und auch eine Stoppuhr-Funktion beinhalten. So bin ich unter Debian 10 auf die GNOME-Extension Time ++ gestoßen, die bis zum Wechsel auf Debian 11 Bullseye auch sehr gut ihren Dienst verrichtete.

Mit der vermehrten Verwendung von Ubuntu auf neueren Rechnern fiel mir jedoch auf, dass sich die Erweiterung zwar installieren ließ, jedoch die App die Einstellungen blockierte und somit für mich quasi unbrauchbar war. Den Text blendete ich bis dahin gern aus, was nun nicht mehr funktionierte.

Time ++ Symbol und Text
Einstellungen nicht verfügbar

Bei der Suche nach einer Lösung und dem damit verbundenen Experimentieren, habe ich nun einen Weg gefunden, der für mich auf Debian 11 und Ubuntu 20.04 LTS funktionierten sollte.

Hierbei lädt man einfach die letzte Version des Entwicklers herunter, entpackt die Zip-Datei und legt das Verzeichnis „timepp-master“ zusätzlich in /home/BENUTZERNAME/.local/share/gnome-shell/extensions/ ab. Dann wird die Extension noch einmal kurz aus und wieder an geschaltet.

Timer ++ Symbol
Time ++ Einstellungen

Nun steht dem konzentrierten Arbeiten nichts mehr im Weg.

WordPress Disable Admin Notice

27. Dezember 2021 um 09:40

Ich habe soeben eines meiner Lieblingsplugins des Jahres entdeckt. Wie eine Seuche greifen die Meldungen im administrativen Bereich von WordPress um sich. Trotz vermehrten Rufe nach einer Änderung gibt es hier nicht wirklich ein Vorankommen. Das Plugin ermöglicht mir die administrativen Meldungen von Plugins komplett abzuschalten, oder auch Meldungen nur für bestimmte Plugins freizugeben. Hier ... Weiterlesen

Der Beitrag WordPress Disable Admin Notice erschien zuerst auf Got tty.

Raspberry Pi Zero 2

23. Dezember 2021 um 20:15

Seit Ende Oktober 2021 ist die Raspberry-Pi-Familie um ein weiteres Mitglied gewachsen: Der Raspberry Pi Zero 2 löst die vorangegangenen Zero-Modelle ab. Das wichtigste Unterscheidungsmerkmal ist die wesentlich schnellere CPU im System-on-a-Chip (SoC) mit der Bezeichnung BCM2710A1. Dahinter versteckt sich eine Variante des SoC aus dem Raspberry Pi 3. Der Zero 2 glänzt jetzt mit 4 Cores und einer Taktfrequenz von 1 GHz. Damit ist die Rechenleistung um ein Vielfaches höher als bisher.

Persönlich war meine größte Befürchtung, dass sich die höhere Geschwindigkeit auch in einer spürbar höheren Leistungsaufnahme widerspiegeln würde. Tatsächlich ist dies aber laut Messungen von hackaday.com nur teilweise der Fall. Zwar fließen unter Volllast knapp 450 mA Strom (entspricht einer Leistungsaufnahme von 2,2 W). Die Leistungsaufnahme ist damit fast 2,5 mal höher als bei den bisherigen Zero-Modellen. Errechnet man allerdings die CPU-Leistung pro Watt, dann ist der Zero 2 der effizienteste Minicomputer, den die Raspberry Pi Foundation bisher produziert hat. Im Leerlauf sind Zero und Zero 2 fast genauso sparsam (rund 0,4 W beim Zero, rund 0,5 W beim Zero 2).

Der Raspberry Pi Zero 2

Wenn Ihnen die maximale Leistungsaufnahme des Zero 2 zu hoch ist, können Sie durch einen Kernel-Option drei der vier Cores sperren. Damit sinkt die Leistungsaufnahme unter Volllast auf die Hälfte, die Geschwindigkeit allerdings auf ein Viertel. Details dazu können Sie im Blog nachlesen.

Eigener Test

Ich habe den Zero 2 mit Raspberry Pi OS Lite (Bullseye) ausprobiert. Eigentlich wollte ich Hostnamen, WLAN und SSH-Zugang vorweg im Raspberry Pi Imager konfigurieren; beim ersten Versuch hat dies überhaupt nicht funktioniert. Beim zweiten Versuch wurden immerhin der Hostname und das Passwort korrekt gesetzt, aber die WLAN-Verbindung funktionierte wieder nicht. Es ist mir nichts anderes übrig geblieben, als den Zero 2 an einen Monitor und eine Tastatur anzuschließen und die Konfiguration manuell in raspi-config vorzunehmen. Das ist ärgerlich, weil gerade der Zero 2 mit seinen wenigen und exotischen Anschlüssen für eine Headless-Installation prädestiniert ist.

Nachdem diese Hürden gemeistert waren, verhielt sich der Zero 2 unauffällig. Gemessen daran, dass es sich um ein Zero-Modell handelt, läuft der Mini-Computer verblüffend schnell und (z.B. während Updates) ohne unangenehm heiß zu werden.

Eckdaten

  • Größe: 65 mm x 30 mm
  • SoC: BCM2710A1, 4 Cortex-A53-Cores
  • RAM: 512 MByte
  • Anschlüsse: 2 x Micro-USB (1 x Stromversorgung, 1 x Daten), Mini-HDMI, Mini-Kameraanschluss (erfordert Adapter)
  • WLAN 2,4 GHz 802.11b/g/n
  • Bluetooth 4.1
  • Leistungsaufnahme: 0,4 W (Leerlauf) bis 2,2 W (alle 4 Cores unter Volllast)
  • 40 GPIOs (Lötkontakte, keine Steckerleiste!)

Beachten Sie, dass sämtliche Zero-Modelle, also auch der neue Zero 2, mit einem Mini-HDMI-Anschluss ausgestattet sind. Der Raspberry Pi 4B verwendet dagegen Micro-HDMI. Sie brauchen also für den Zero 2 ein eigenes Kabel oder einen Adapter.

Preis

Das ursprüngliche Zero-Modell wurde ursprünglich als Raspberry Pi für nur fünf Euro beworben. Tatsächlich war er aber nur schwer zu diesem Preis erhältlich (und wenn, dann nur bei der Abnahme hoher Stückzahlen). Beim Zero 2 sieht es aktuell noch schlimmer aus: Laut geizhals ist das Gerät aktuell (Dez. 2021) generell schwer erhältlich und kostet beachtliche 30 Euro — Schnäppchen ist das keines! Der hohe Preis hat mit Corona, dem allgemeinem Chip-Mangel, dem Brexit etc. zu tun, ist also nicht unbedingt die Schuld der Raspberry Pi Foundation. Trotzdem: Wer den Zero 2 kauft, tut dies sicher nicht wegen des günstigen Preises, sondern weil er/sie einen winzigen, leistungseffizienten, Pi-kompatiblen Mini-Computer sucht.

Fazit

  • tolle Hardware, aber mit 512 MB RAM nicht Desktop-tauglich
  • aktuell viel zu teuer
  • Headless-Inbetriebnahme gescheitert

Von Java 11 zu Java 17

21. Dezember 2021 um 19:23

Seit einigen Jahren erscheinen halbjährlich neue Java-Versionen. In dieser Versionsflut stechen die LTS-Versionen (Long Term Support) heraus. Zuletzt war das Java 11, aktuell ist es Java 17. Eine gute Gelegenheit also, einen Blick auf die Neuerungen von Java der letzten Jahre zu werfen.

Ich beschränkt mich in diesem Artikel auf die (aus meiner Sicht) wichtigsten Neuerungen. Daneben gibt es eine Menge weiterer neuer Features, die je nach Zielgruppe durchaus interessant sind. Werfen Sie gegebenenfalls einen Blick auf die Links am Ende dieses Artikels!

Oracle JDK wieder uneingeschränkt frei

In den vergangenen Jahren hat Oracle versucht, den JDK-Zugang für die kommerzielle Nutzung kostenpflichtig zu machen. Zwar standen die halbjährlichen Java-Versionen stets zum kostenfreien Download zur Verfügung, aber bei den LTS-Version wollte Oracle Geld für Updates sehen.

Man kann sich natürlich auch ins Knie schießen. Der wenig überraschende Effekt war, dass gefühlt jede größere IT-Firma ein eigenes JDK auf OpenJDK-Basis ins Leben rief. (Der Java-Quellcode ist ja Open Source.) Unter Privatanwendern außerhalb der Linux-Szene waren vor allem die Downloads der Seite https://adoptopenjdk.net/ beliebt. Mittlerweile ist daraus das Projekt Adoptium geworden, an dem unter anderem IBM, Microsoft und Red Hat mitarbeiten.

Wie dem auch sei, seit Java 17 bietet auch Oracle das JDK wieder uneingeschränkt frei an. Natürlich braucht es dazu eine eigene Lizenz, die Oracle No-Fee Terms and Conditions, leicht zu merken als NFTC. Wem fällt das alles nur ein?

Records

Die vermutlich spannendste Neuerung der letzten drei Jahre sind Records. Das neue Schlüsselwort record bietet einen besonders effizienten Weg an, um Klassen zu definieren, deren Objekte unveränderlich (immutable) sind. Die Zeile

public record Rectangle(double length, double width) { }

definiert eine Klasse mit den unveränderlichen Instanzvariablen length und width, die über die gleichnamigen Methoden ausgelesen werden können (length() und width()). Einen geeigneten Konstruktor bekommen Sie frei Haus geliefert, ebenso brauchbare Implementierungen von toString, equals und hashCode.

Bei Bedarf können Sie Records mit eigenen Methoden und (mit Einschränkungen) mit eigenem Konstruktor-Code ausstatten. Records können Schnittstellen implementieren, aber keine Vererbung nutzen (also weder selbst erben noch als Basis für Vererbung dienen).

Besonders gut eignen sich Records für Data Transfer Objects (DTOs). Dieser Fachbegriff bezeichnet den Datenaustausch zwischen Methoden oder anderen Software-Komponenten.

Mehrzeilige Zeichenketten

Ebenfalls jahrelang auf der Wunschliste vieler Java-Entwickler stand die Möglichkeit, mehrzeilige Zeichenketten zu formulieren. Wie in einigen anderen Programmiersprachen werden solche Zeichenketten mit """ eingeleitet und abgeschlossen.

String sql = """
    SELECT books.id, title, publId, name 
    FROM books 
    JOIN publishers ON publId = publishers.id  
    WHERE books.id >= 167""";

// entspricht in älteren Java-Versionen:
String sql =
    "SELECT books.id, title, publId, name\n" +
    "FROM books\n" +
    "JOIN publishers ON publId = publishers.id\n" +
    "WHERE books.id >= 167";

Die neue Syntax mit """ hat drei Besonderheiten:

  • Nach den einleitenden Zeichen """ muss eine neue Zeile folgen.
  • Nur wenn die abschließenden Zeichen """ in einer neuen Zeile angegeben
    werden, endet auch die letzte Zeile mit dem Zeilenumbruchzeichen \n.

  • Die Position der abschließenden Zeichen """ bestimmt die Einrücktiefe des
    Texts.

Der letzte Punkt erfordert noch einmal ein Beispiel:

String s = """
       abc
         efg
    """; 
// entspricht s = "   abc\n" +
//                "     efg\n";

Weil """ hier gegenüber dem Inhalt der Zeichenkette drei Zeichen weiter links platziert wurde, beginnt jede Zeile der Zeichenkette mit drei Leerzeichen.

Endlich lesbare switch-Ausdrücke

Die in den Grundzügen von C übernommene Syntax von switch war in der Vergangenheit so, dass man Einsteigern eigentlich nur davon abraten konnte. Die alte Syntax bleibt weiterhin gültig, aber parallel dazu besteht nun eine zweite Variante, die in manchen Fällen tatsächlich präzisen, gut lesbaren Code liefert:

switch(ausdruck) {
    case konstante1, k2 -> { anweisung1a; a1b; }
    case k3, k4, k5     -> { a2a; a2b; a3b}
    default             -> { a3a; a3b; }
}

Wenn der switch-Ausdruck dazu dient, einen Wert einzustellen, gibt es noch eine Vereinfachung. Wie in Kotlin können Sie die gesamte switch-Konstruktion als Ausdruck betrachten und das Ergebnis direkt einer Variablen zuweisen. Vergessen Sie nicht, dass Sie in diesem Fall den gesamten Ausdruck mit einem Strichpunkt beenden müssen!

int result = switch(ausdruck) {
               case konstante1, k2 -> 1;
               case k3, k4, k5     -> 2;
               default             -> -1;
             };

Abschließend noch ein konkretes Beispiel:

String month = "März";
int days =  
    switch(month) {
        case "Januar", "März", "Mai", "Juli", "August",
             "Oktober", "Dezember" -> 31; 
        case "April", "Juni", "September", 
             "November" -> 30;      
        case "Februar"  -> 28; // oder 29, wenn Schaltjahr
        default -> 0;
    };

Mehr Komfort für instanceof

Der Operator instanceof wird häufig vor einem Downcast verwendet, um sicherzustellen, dass die Variable tatsächlich ein Objekt des erforderlichen Typs enthält:

if(bike instanceof EBike) {
    var eb = (EBike)bike;             
    // eb gibt Zugriff auf EBike-spezifische Methoden und -Variablen 
}

In Java 17 lässt sich der Code wie folgt verkürzen:

if(bike instanceof EBike eb) {
    // eb gibt Zugriff auf EBike-spezifische Methoden und -Variablen 
}

Innerhalb des if-Blocks steht nun die Variable eb mit dem Datentyp EBike zur Verfügung.

Nächste LTS-Version vermutlich schon 2023

Oracle plant, auf einen zweijährigen LTS-Zyklus umzusteigen. Ganz fix ist das noch nicht, aber wenn der Plan realisiert wird, dann wird Java 21 die nächste LTS-Version sein und im Herbst 2023 erscheinen.

Fazit

Ich bleibe bei meiner Ansicht: Das bessere Java heißt heute Kotlin.

Aber man muss Oracle zugestehen: Im Rahmen des engen Kompatibilitätskorsetts ist gelungen, Java in wesentlichen Details zu modernisieren. Begeisterung ruft das kaum hervor, aber es natürlich dennoch ein Fortschritt für alle, die im Java-Kosmos gefangen sind. Die Dominanz von Java in bestimmten Segmenten der Software-Industrie wird damit weiter zementiert.

Quellen, Links, Downloads

Koordinierungsstelle Open Source und Digitale Souveränität

10. Dezember 2021 um 21:56

Stadt Dortmund prüft Institutionalisierung von Freier Software

FOSS Koordinierungsstelle

Bild: FOSS Koordinierungsstelle

Im Rahmen ihrer Digitalisierungsstrategie (Roadmap Memorandum zur Digitalisierung 2020 – 2025) prüft die Stadt Dortmund derzeit die Einrichtung einer Koordinierungsstelle Open Source und Digitale Souveränität. Der strukturierten Entwicklung einer Open-Source-Governance zur Bearbeitung der vielschichtigen Aspekte von Open Source würde mit dieser Koordinierungsstelle ein institutioneller Rahmen gegeben. Das Ziel Open Source in Kommunen als einen Baustein für mehr Digitale Souveränität zu verankern, erfordert die tägliche Widmung einer professionellen Aufmerksamkeit in den Behörden. Dies ist eine ämterübergreifende Aufgabe, welche u.a. IT-Steuerung und -Management, Vergabe und Beschaffung, Organisationsmanagement, Finanzmanagement und Controlling, rechtliche Fragen, sowie die Rolle der Verwaltung im Open-Source-Ökosystem und viele weitere Aspekte in einer Gesamtstrategie zusammenführen muss. Für Do-FOSS gehört zu den Aufgaben der Koordinierungsstelle Open Source in Zukunft zum Beispiel auch die Zusammenarbeit mit dem Zentrum für Digitale Souveränität der öffentlichen Verwaltung (ZenDiS), welches derzeit unter der Schirmherrschaft des Beauftragten der Bundesregierung für Informationstechnik (BfIT) aufgebaut wird. Mit dem Wissensaufbau und der Entwicklung praxistauglicher Lösungswege, könnte die Koordinierungsstelle Open Source zudem wertvolle Vorarbeiten leisten, welche von anderen Kommunen aufgegriffen werden können. Ein solches Open-Source-Mindset im Sinne interkommunaler Synergien begrüßt Do-FOSS ebenso wie die Einrichtung der Koordinierungsstelle selbst.

Koordinierungsstelle Open Source und Digitale Souveränität

Das „Memorandum zur Digitalisierung 2020 bis 2025“ verweist bereits auf die hohe Bedeutung von Open Source für die digitale Souveränität der Kommune, indem es fordert, wo möglich Open Source Software zu nutzen und die von der Verwaltung entwickelte oder zur Entwicklung beauftragte Software der Allgemeinheit zur Verfügung zu stellen. Eine Potentialanalyse zur Anwendung von Open Source in der Stadtverwaltung Dortmund befindet sich bereits in Arbeit. Die Ergebnisse werden den politischen Gremien voraussichtlich im 1. Quartal 2022 vorgelegt. Auf Basis dieser Ergebnisse sollte eine Open Source-Strategie für die Stadt Dortmund abgeleitet werden, die anhand standardisierter Bewertungskriterien die Entscheidungsfindung für den Einsatz von Open Source-Software unterstützt und einen Fahrplan zur Sicherstellung der digitalen Souveränität enthält. Dazu ist es notwendig Aspekte der Wirtschaftlichkeit, Sicherheit und Praktikabilität des Einsatzes von Open Source-Lösungen transparent zu machen und sinnvoll abzuwägen. Dazu ist die Durchführung von Technologieanalysen und einem zugehörigen Normenscreening ebenso notwendig, wie die Vernetzung mit staatlichen sowie nicht-staatlichen Open Source-Initiativen auf nationaler wie internationaler Ebene.

Um dies zu erreichen und gleichzeitig eine institutionalisierte Schnittstelle zwischen dosys, Datenschutz, Politik und gesellschaftlichen Initiativen sicherzustellen, wird die Einrichtung einer Koordinierungsstelle für Open Source und Digitale Souveränität im CIIO geprüft.

Quelle: Anlage zur Roadmap Memorandum zur Digitalisierung 2020 – 2025, S. 50

Digitale Souveränität und Open Source in Kommunen

Wer sich bezüglich der aktuellen Diskussion rund um das Thema Digitale Souveränität und den Zusammenhang zu Open Source weitergehend informieren will, sei auf die folgende Diskussion verwiesen. Mit Datum vom 04.11.2021 hat der Digitale Staat Online / Behörden Spiegel die Onlinediskussion Digitale Souveränität und Open Source in Kommunen veranstaltet:

Was bedeutet Souveränität für Kommunen und wie müssen sie sich in einer zunehmend digitalisierten Welt aufstellen, um souverän zu handeln und zu gestalten? Konkrete Hebel zur Stärkung der Digitalen Souveränität sind beispielsweise die konsequente Forderung von Offenen Standards und der vermehrte Einsatz von Open-Source-Software (OSS) in der Öffentlichen Verwaltung.

Do-FOSS-Geschäftsführer Christian Nähle hat an der Diskussion teilgenommen und gibt Einblick in die aktuelle Open-Source-Entwicklung der Stadt Dortmund und die weitere Open-Source-Arbeit der Kommunalen Gemeinschaftsstelle für Verwaltungsmanagement (KGSt) für eine Open-Source-Governance. Außerdem äußert er seine Wünsche nach Fördermitteln für einen Open-Source-Infrastrukturfonds an die neue Bundesregierung.



Link zum Video
Digitaler Staat Online: Digitale Souveränität und Open Source in Kommunen. Link zu YouTube!

Im verlinkten Video finden sich die wesentlichen Aussagen von Do-FOSS an den Zeitmarken 31,57, 1:02,47, 1:21,16 und 1:27,04.

Fazit

Für Do-FOSS stellt es eine Notwendigkeit dar, zukünftig in alle IT-Entscheidungen die Auswirkungen auf die Digitale Souveränität einzubeziehen. Eine Koordinierungsstelle Open Source ist zur Etablierung einer Open-Source-Governance unabdingbar.

Dokument zum Herunterladen

Die Roadmap zur Digitalisierung 2020 – 2025 inkl. Anlage kann hier heruntergeladen werden.

CC0
Soweit im gesetzlichen Rahmen möglich verzichtet der Autor auf alle Urheber- und damit verwandten Rechte an diesem Werk.
Es kann beliebig genutzt, kopiert, verändert und veröffentlicht werden.
Für weitere Informationen zur Lizenz, siehe hier.

The post Koordinierungsstelle Open Source und Digitale Souveränität appeared first on Do-FOSS.

ssh-rsa bei OpenSSH 8.8 explizit aktivieren

30. November 2021 um 09:14

Im Februar 2020 wurde schon angekündigt, dass OpenSSH die Unterstützung von ssh-rsa auslaufen lässt. Umgesetzt wurde dies in Version 8.8, die vor gut einem Monat veröffentlicht wurde.

Leider unterstützt nicht jedes System moderne HostKeyAlgorithms. Ein solches Beispiel konnte ich die Tage z. B. bei einem Switch beobachten konnte. Hier erscheint folgender Fehler:

Unable to negotiate with 192.168.1.1 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

In so einem Fall kann man ausnahmsweise doch noch ssh-rsa erlauben und das geht entweder per Option im ssh-Aufruf:

ssh -o HostKeyAlgorithms=+ssh-rsa 192.168.1.1

oder man trägt es in die ~/.ssh/config dauerhaft ein:

Host XYZ
    HostName 192.168.1.1
    HostkeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa

📚 Python (2. Aufl.) erschienen

23. November 2021 um 14:12

Die zweite Auflage von »Python — Der Grundkurs« ist erschienen. Für die Neuauflage habe ich dieses äußerst erfolgreiche Buch im Hinblick auf die aktuelle Python-Version 3.10 vollständig aktualisiert und in vielen Details verbessert:

  • Assignment Expressions (Zuweisung und Vergleich kombinieren)
  • Neue Formatierungssyntax `f'{varname}‘
  • Vereinigung von Dictionaries
  • Pattern Matching (Tupel, Listen und Sets mit Mustern auswerten)
  • Stärkere Berücksichtigung von VSCode als Python-Editor

Am Grundkonzept des Buchs hat sich nicht geändert: Der kostengünstige Grundkurs richtet sich an Einsteiger, die parallel zum Buch Python in der Schule, im Studium oder in der Arbeit lernen, sowie an Umsteiger von anderen Programmiersprachen, die rasch die Eigenheiten von Python erlernen wollen.

Viele Beispiele aus der Praxis sowie Übungsaufgaben helfen dabei, Python ohne allzu viel Theorie kennenzulernen. Im handlichen Taschenbuchformat ist das Buch auch unterwegs ein idealer Begleiter. Mehr Details zum Buch gibt es hier:

https://kofler.info/buecher/python/

Kotlin-Updates: Kotlin 1.6

21. November 2021 um 17:20

Seit einigen Tagen ist Kotlin 1.6 verfügbar. Dieser Beitrag geht auf die wichtigsten Neuerungen im Vergleich zu Version 1.5 ein. Die Kurzfassung: Kotlin 1.6 ist ein »kleines« Release, für die meisten Entwickler gibt es keine wirklich dramatische Änderungen. Auch die Verbesserungen in der Standardbibliothek sind eher Kleinigkeiten.

Dieser Text bezieht sich auf die folgenden Versionsnummern:

IntelliJ: 2021.2.3
Kotlin: 1.6.0
JDK: 17

Weitere Kotlin-Update-Artikel auf meiner Website finden Sie hier:

https://kofler.info/tag/kotlin-updates

Exhaustive »when«

In Kotlin 1.6 beklagt sich der Compiler, wenn eine when-Konstruktion für Enumerationen, boolesche Werte oder für Datentypen nicht alle möglichen Fälle erfasst, also nicht »exhaustive« ist. Aktuell können Sie diese Warnung noch ignorieren, aber in Kotlin 1.7 wird daraus ein Fehler. Spätestens dann müssen Sie die when-Konstruktion so formulieren, dass sämtliche Fälle erfasst werden (am einfachsten durch einen else-Block).

enum class Days {
    Monday, Tuesday, Wednesday, Thursday, 
    Friday, Saturday, Sunday
}

val day = Days.Friday
when(day) {
    Days.Monday, Days.Tuesday -> println("Wochenanfang")
    Days.Wednesday, Days.Thursday -> println("Wochenmitte")
    Days.Friday -> println("Fast geschafft")
    // Warnung:  Non exhaustive 'when' statements on enum will be prohibited 
    // in 1.7, add 'Saturday', 'Sunday' branches or 'else' branch instead
}

Standardbibliothek

readln: Wenn Sie mit readLine() eine Datei zeilenweise auslesen, liefert die Funktion entweder die nächste Zeile oder null. Nunmehr gibt es zwei Varianten zu readline, die die ursprüngliche Form längerfristig ablösen sollen:

  • readlnOrNull() verhält sich wie ehemals readLine(), ist aber klarer benannt und hat mehr Ähnlichkeiten mit println.
  • readln() löst dagegen einen Fehler aus, wenn das Ende der Datei erreicht ist, und kann statt dem wenig eleganten readLine()!! verwendet werden.

readLine() bleibt uns vorerst erhalten, soll aber in kommenden Kotlin-Versionen deprecated werden.

typeOf: typeOf<Typ> liefert ein KClass-Objekt, das Typ beschreibt. Die Funktion stand zwar schon seit Kotlin 1.3.40 zur Verfügung, ursprünglich aber nur für die JVM-Variante. Nunmehr kann typeOf in allen drei Kotlin-Varianten (also auch JS und Native) verwendet werden.

Duration-API: Die Duration API (beschrieben in Abschnitt 7.3 meines Kotlin-Buchs) gilt nun als stabil. Das gilt allerdings nicht für andere kotlin.time-Klassen zur Zeitmessung. Die in Kotlin 1.5 abgeschaffte Notation

val myDur = 2.minutes + 3.seconds - 10.milliseconds * 0.66

ist erfreulicherweise wieder eingeführt worden, erfordert nun aber Importe der betreffenden Companion-Eigenschaften, hier also:

import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
import kotlin.time.Duration.Companion.milliseconds

Unsupported class file major version 61

Meine ersten Tests mit Kotlin scheiterten an Java 17. Auf meinem Rechner ist auch die JDK 17 installiert. Anscheinend ist das Build-System dazu nicht kompatibel. IntelliJ war nicht in der Lage, das minimalistische Console Template zu kompilieren und zeigte eine wenig hilfreiche Fehlermeldung an:

Could not open init generic class cache for initialization script '/tmp/wrapper_init4.gradle' (/crypt/home/kofler/.gradle/caches/7.1/scripts/954mesz5ux7usmane6uzpuni1).
> BUG! exception in phase 'semantic analysis' in source 
> unit '_BuildScript_' Unsupported class file major version 61

Eine kurze Suche in stackoverflow ergab, dass Kompatiblitätsprobleme zwischen Gradle und der JDK 17 die Ursache sein könnten. Ich habe dann die JDK-Version für das Build-System auf 11 zurückgesetzt, und alles funktionierte. Merkwürdig. (Es geht hier nicht um die JDK für das eigentliche Projekt, die darf sehr wohl 17 sein.)

Die von JVM eingesetzte JVM sollte nicht allzu aktuell sein …

Quellen/Links

Sonstiges:

SWAP des Raspberry Pi vergrößern

03. November 2021 um 17:39

Neulich hatte ich Bedarf den SWAP eines Raspberry Pi, auf dem ein Raspberry Pi OS läuft, zu erweitern, da dieser ständig überlief. Hier sind per Standard 100MB eingerichtet. Diesen Wert galt es nun auf 1000MB anzuheben.

Diese Änderung kann ganz einfach wie folgt umgesetzt werden. Dazu ruft man mit dem Editor Nano die Datei  /etc/dphys-swapfile auf

sudo nano /etc/dphys-swapfile

sucht den entsprechenden Eintrag und ändert den Wert, wie im Beispiel auf 1000.

CONF_SWAPSIZE=1000

Nach dem Abspeichern via Ctrl + o, dem Verlassen des Editors mit Ctrl + x und einem anschließenden Reboot, steht die neue Größe des SWAP-Speichers zur Verfügung.

sudo reboot

SONOFF Zigbee 3.0 USB Dongle Plus: Z-Stack 3.x.0 Firmware unter Linux aktualisieren

02. November 2021 um 05:25

Ich habe mir vor kurzem den „SONOFF Zigbee 3.0 USB Dongle Plus“ gekauft. Dieser wird standardmäßig mit der Z-Stack 3.x.0 Firmware Version „20210120“ ausgeliefert, die (Stand November 2021) aktuelle Z-Stack Firmware Version ist „20210708“....

❌
❌