Datenbanken: die Wahl der Qual

Das dauerhafte Speichern von Daten nennt man im Fachchinesisch Persistieren. Damit man auf diese Daten gezielt auch wieder zugreifen kann, benötigt man eine Software, die Daten strukturiert und durchsuchbar macht. Eine solche Software nennt sich Datenbank Management System (DBMS). Damit man von einer Programmiersprache wie Java, Ruby, Python oder PHP auf eine Datenbank zugreifen kann, benötigt man einen entsprechenden Treiber. Dieser Treiber wird auch oft als Client bezeichnet, denn das DBMS ist der Server, welcher mehreren Clients Zugriff gestattet. In diesem Artikel kümmern wir uns nicht darum, wie man sich mit welcher Programmiersprache auf die entsprechenden Datenbanken verbinden kann, sondern schauen uns an, was es für unterschiedliche Datenbanktechnologien gibt und wofür diese eingesetzt werden.

[Relationale DB (Zeilen, Spalten) | GIS DB | embedded DB] 
[NoSQL | {Key Value Store | Document DB (JSON, XML) | Graph DB | Zeitreihen Server]

Mittlerweile gibt es für die klassischen Datenbanksysteme, die sogenannten relationalen Datenbanken, eine Vielzahl von Lösungen zur Auswahl. Sowohl kommerzielle, als auch professionelle freie Open Source Vertreter buhlen um die Gunst der Anwender. Im Web bieten die meisten Hoster zum Speichern der Daten die freien DBMS MySQL (Oracle) und MariaDB (Abspaltung von MySQL nach der Übernahme durch Oracle) ihren Anwendern zur Auswahl an. Wer seine Server allerdings selbst betreuen kann, kann natürlich auch auf das professionellere PostgreSQL setzen.

Postgres ist allerdings für die meisten PHP-Standardapplikationen eher ungeeignet, obwohl WordPress und Joomla dieses Datenbanksystem durchaus unterstützen. Probleme bereiten üblicherweise die Entwickler der Erweiterungen. Der Zugriff auf die Datenbanken erfolgt dann nicht über die Schnittstellen der Anwendung, sondern aus Unwissenheit wird oft über die nativen Befehle von MySQL auf die Daten zugegriffen.

In der kommerziellen Anwendungsentwicklung verwendet man üblicherweise Oracle oder den Microsoft SQL Server, je nachdem, wie affin man mit der Microsoft-Windows-Welt ist. Der Grund für den Einsatz kommerzieller Datenbankserver liegt im kostenpflichtigen Support, bei Bekanntwerden von Schwachstellen und Fehlern. Geschäftskritische Anwendungen, müssen das Fortbestehen des Herstellers und auch der Kunden dieser Anwendung sicherstellen. Gerade die Geschwindigkeit der Auslieferung von Korrekturen für Sicherheitsschwachstellen ist ein gewichtiger Grund für den Einsatz kommerzieller Software.

Die Funktionsweise von relationalen Datenbanken ist über Tabellen definiert. Die Spalten einer Tabelle definieren die Eigenschaft und eine Zeile der Tabelle bildet den Datensatz. Um einen expliziten Datensatz ansprechen zu können, muss eine Spalte (Primärschlüssel) eindeutige, nicht noch einmal in dieser Spalte vorkommende Einträge enthalten. Diese Eigenschaft der Primärschlüssel nennt sich unique. Über die Primärschlüssel lassen sich Verknüpfungen, sogenannte Relationen, zwischen den Tabellen aufbauen. Um den Artikel nicht ins Unermessliche ausufern zu lassen, belasse ich es an dieser Stelle mit der Tiefe zur Funktionsweise von relationalen Datenbanken und gehe zur nächsten Kategorie über.

Natürlich gibt es auch relationale Datenbanken, die nicht zeilenorientiert, sondern spaltenorientiert arbeiten. Dies ermöglicht effizientere Abfragen und Analysen, insbesondere bei großen Datenmengen. Hier sind einige der Hauptmerkmale und Vorteile spaltenorientierter Datenbanken:

  • Datenorganisation: Speichert Daten in Spalten, was die Verarbeitung spezifischer Spalten in Abfragen beschleunigt.
  • Komprimierung: Bietet oft bessere Komprimierungsraten für spaltenweise gespeicherte Daten, da ähnliche Datentypen hintereinander gespeichert werden.
  • Analytische Abfragen: Optimiert für Analysen und aggregierte Abfragen, die große Datenmengen schnell abfragen müssen.
  • Reduzierte I/O: Reduziert die Menge an Daten, die von der Festplatte gelesen werden müssen, da nur die benötigten Spalten abgerufen werden.

Spaltenorientierte Datenbanken sind Apache Cassandra, SAP Hanna, IBM DB2 und Amazon BigQuery mit klassichen Anwendungsfällen für:

  • Business Intelligence: Ideal für Datenbanken, die große Mengen an Daten für analytische Zwecke verarbeiten müssen.
  • Data Warehousing: Effizient bei der Speicherung und Analyse historischer Daten.
  • Echtzeitanalysen: Geeignet für Anwendungen, die schnelle Entscheidungen basierend auf aktuellen Daten treffen müssen.
IDLieferantArtikelPreisPackungMenge
13MongoDBJSON7.88Stück1
21XindiceXML15.67Stück1
// Zeilen orientierte DBMS
[{13, MongoDB, JSON, 7.88, Stück, 1} {21, Xindice, XML, 15.67, Stück, 1}]

// Spalten orientierte DBMS
[{13,21} {MongoDB, Xindice} {JSON, XML} {7.88, 15.67} {Stück, Stück} {1, 1}]

Um Daten für geografische Informationssysteme (GIS) wie Google Maps bereitzustellen, werden sogenannte Geospatial Datenbanken eingesetzt. Bei Geospatial Datenbanken handelt es sich um Erweiterungen relationaler Datenbanken, die für geometrische Objekte optimierte und standardisierte Tabellen und Relationen bereitstellen. Die GIS Erweiterung für PostgreSQL heißt PostGIS. Die Datensätze für das frei verfügbare OpenStreetMap liegen in einem spezialsierten XML Format vor und können aber auch in Geospatial Datenstrukturen transformiert werden.

Key – Value Speicher, werden oft in Konfigurationsdateien verwendet. Will man allerdings ein schnelles Caching-System aufbauen, benötigt man ein wenig mehr Komplexität. Denn die Schlüssel / Wert Bezeihung kann von einfachen Zeichenketten hin zu komplexen Objekten ausarten. Grundsätzlich besteht ein Speicher aus einem uniquen Schlüssel, dem je nach Datentyp Werte zugeordnet werden können. Datentypen können Zeichenketten (Strings), Zahlen (Integer, Float), Wahrheitswerte (Boolean) und Listen sein. Key – Value Datenbanken gehören zu den NoSQL Datenbanken, da die Abfrage nicht wie bei relationalen Datenbanken über SQL erfolgt, sondern datenbank- und herstellerspezifisch ist.

Typische Key -Value Datenbanken sind Redis, MemCached, Amazon DynamoDB und die etwas in die Tage gekommene BarkleyDB, die von Oracle übernommen wurde. Eine Eigenschaft von Key – Value Datenbanken ist, dass die Daten im Speicher gehalten und in regelmäßigen Abständen auf die Festplatte gesichert werden. Das Vorhalten der Daten im Arbeitsspeicher erfordert natürlich auch eine entsprechende Ausstattung der Maschine mit ausreichend RAM. Besonders bei großen Anwendungen kann für das Chaching eine enorme Datenmenge zusammenkommen.

Eine weitere Kategorie für Datenbanken sind Embedded-Datenbanken. Embedded meint auf Deutsch „eingebunden“ und bezieht sich auf den Datenbankserver. Das bedeutet im Konkreten, dass das Datenbanksystem keine eigenständige Installation ist, sondern als Bibliothek einen Teil der Anwendung darstellt. Der Vorteil einer solchen Lösung ist, dass die Installationsroutine der Anwendung einfacher ist. Meist geht das allerdings zulasten der Sicherheit, da viele der embedded Datenbanken keine zusätzliche Schicht für eine Benutzerverwaltung haben. Dieser Umstand gilt besonders für SQLite und die in Java implementierte H2. Aber auch die bereits erwähnte NoSQL BarkelyDB die als Java- oder C-Bibliothek verfügbar ist, hat keine Benutzerverwaltung. Das heißt, wer Zugriff auf die Anwendung hat, kann mit einem Client die Daten aus der Datenbank lesen. Daher sind die gerade genannten Systeme nicht für Anwendungen geeignet, die eine hohe Sicherheitsstufe erfordern.

Zur Java Version der BarkelyDB kann man noch sagen, dass die letzte verfügbare Implementierung aus dem Jahr 2017 stammt und in Java / Apache Ant als Quelltext vorhanden ist, der aber selbst kompiliert werden muss. Ein offizielles Binary von Oracle ist nicht mehr verfügbar, es können aber sogenannte inoffizielle Versionen im Maven Central Repository gefunden werden.

Wer eine voll funktionsfähige relationale Datenbank in seine Anwendung integrieren möchte, kann auf die embedded Variante von PostgreSQL – pgx – zurückgreifen, die alle Funktionen des PostgreSQL Servers lokal bereitstellt.

Die nächste Klasse der Datenbanken gehört wieder zu den NoSQL Vertretern. Dokumentenbasierte Datenbanken. Die beiden DBSM MongoDB und CouchDB sind im Funktionsumfang durchaus identisch, dennoch gibt es markante Unterschiede.

  • MongoDB wird aufgrund seiner umfangreichen Abfragesprache und hohen Performance häufig für Anwendungen gewählt, die komplexe Abfragen und Echtzeitanalysen erfordern.
  • CouchDB eignet sich besonders für Anwendungen, die Zuverlässigkeit, eine verteilte Architektur und einfache Replikation benötigen, insbesondere in Szenarien, in denen Offline-Zugriff unerlässlich ist.

Die grundlegende Arbeitsweise von Dokumentendatenbanken ist, dass sich das Schema aus der hinterlegten Datenstruktur ergibt. Diese Datenstrukturen haben meist das JSON Format und werden entsprechend angesprochen. Dokumente der selben Datenstruktur werden einer Collection zugeordnet. Es handelt sich also nicht um klassische Office Dokumente die in diesen Datenbanken abgelegt werden, sondern um Formate wie JSON und XML. Dokumentendatenbanken, die sich auf XML spezialisiert haben, sind Oracle XML DB oder Apache Xindice.

Viele Webentwickler, die sich auf FrontEnd (UX / UI) spezialisiert haben, greifen gern auf Dokumentdatenbanken zurück. Das erlaubt ihnen, die Daten im JSON Format abzulegen, um damit REST Zugriffe zu simulieren und damit die dynamischen Inhalte der Benutzeroberfläche zu befüllen.

Eine sehr exotische Variante der NoSQL Datenbanken sind die Gaphdatenbanken, die Daten als Graphen repräsentieren. Diese Speicherform ermöglicht das effiziente Ablegen von Informationen nach Beziehungen. Solche Beziehungen können Verlinkungen von Webseiten sein oder die Repräsentation einer Person in sozialen Medien. Aber auch die komplexen Beziehungen für Empfehlungssysteme können als Graph dargestellt werden. Die nachfolgende Abbildung zeigt ein einfaches Beispiel für Neo4J einer in Java implementierten Graphdatenbank, um sich eine Vorstellung des Einsatzszenarios machen zu können.

Andere Graphdatenbanken sind Amazon Neptune und ArangoDB.

Als letzte Datenbanklösung möchte ich die sogenannten Zeitreihen (Time Series) vorstellen. Da besonders im Kontext für den Betrieb von Anwendungen das Monitoring essenziell geworden ist, haben Daten, die als Zeitreihen vorliegen, an Bedeutung gewonnen. Typische Datenbanken, die sich auf die Verarbeitung von Zeitreihen spezialisiert haben, sind Prometheus und InfluxDB. Aber auch für klassische relationale Datenbanken gibt es entsprechende Erweiterungen. Die bereits mehrfach erwähnte PostgreSQL-Datenbank hat auch für diesen Anwendungsfall eine entsprechende Erweiterung namens TimescaleDB.

Natürlich kann man über das Thema noch viel mehr sagen. Schließlich füllen unzählige Bücher einige Regalmeter in Bibliotheken zum Thema Datenbanken. Für den Einstieg und die Übersicht zu den verschiedenen Datenbanksystemen beziehungsweise NoSQL Lösungen soll es aber an dieser Stelle genügen. Mit den Informationen aus diesem Artikel, haben sie nun eine Vorstellung, welche Datenbank sich für ihren speziellen Anwendungsfall eignet. Wir konnten auch sehen, dass relationale Datenbanken, insbesondere die freie Open Source Datenbank PostgreSQL mit den verfügbaren Erweiterungen, sehr universell einsetzbar sind. Weiterführende Themen zu Datenbanken sind die Datenmodellierung und Sicherheit gegen Hackerangriffe.


Das Netz vergisst nichts.

Das Internet hat ein ganz eigenes Gedächtnis, das beinahe nichts vergisst. Ein Teil dieses Gedächtnisses ist das 1996 durch Brewster Kahle initiierte Projekt archive.org welches sich zur Aufgabe gemacht hat, das Internet zu archivieren. Zentraler Bestandteil von archive.org ist die Wayback Machine.

Laut eigenen Angaben hat die WaybackMachine Zugriff auf einen Bestand von ca. 1 Trillion Webseiten. Ähnlich wie Google wird die Wayback Machine über ein einfaches Suchfeld bedient. In diesem Suchfeld kann man entweder nach einer konkreten Internetdomain oder nach einem konkreten Schlüsselwort suchen. Wenn zu dem gesuchten Begriff etwas im Bestand von archive.org gespeichert ist, zeigt die Kalenderansicht an, welchem Tag ein sogenannter Snapshot erstellt wurde. Alle Inhalte einer Domain, die an diesem Tag frei zugänglich sind, wurden in den Snapshot aufgenommen. So kann man leicht bereits gelöschte Inhalte durchaus wieder erreichen.

Wenn man mit der Wayback Machine arbeitet, muss man sich allerdings einiger Rahmenbedingungen im Klaren sein. Bei archive.org handelt es sich zwar um eine sogenannte Non-Profit-Organisation, die sich durch Spenden finanziert. Zudem hat archive.org seinen Hauptsitz in den Vereinigten Staaten von Amerika. In Anbetracht der enormen Kosten, die allein für die Erhebung und Speicherung der Daten entstehen, ist es schon mehr als nur eine Vermutung, dass bei diesem Projekt durchaus eine Nähe zu Behörden vorhanden ist. Auch offizielle Stellen haben nicht wenig Gründe, so einen Dienst zur Verfügung zu haben, ohne dabei auf die engen Rahmenbedingungen von offiziellen Regierungsorganisationen achten zu müssen.

Ein Problem, das sich aus der Arbeit mit der Wayback Machine ergibt, ist die Änderungsfrequenz der archivierten Homepages. Besonders bei kleinen Webseiten sind zwischen den Snapshots mehrere Änderungen vorgenommen worden. Aber auch vermeintlich große Webseiten, wie spiegelonline.de haben keinen täglichen Snapshot, wie man eigentlich erwarten könnte. Die Gründe dafür sind durchaus vielfältig. Zudem gibt es verschiedene Mechanismen, die Crawler vom Indizieren der Webseite abhalten. Sinn solcher Bemühungen kann es unter anderem sein, den Traffic auf dem eigenen Server zu begrenzen, damit die Ressourcen den Lesern zur Verfügung stehen und nicht durch Bots blockiert werden.

Ein anderes Thema der gewaltigen Datenmenge ist natürlich auch der Zugriff von künstlicher Intelligenz zum Trainieren großer LLMs. Große Plattformen fürchten um den Verlust ihrer Nutzer, ein Aspekt, den ich bereits 2023 thematisiert habe. Im Februar 2026 gab es hier auch eine öffentliche Diskussion zwischen dem Vorstand der Wayback Machine Mark Graham und Nieman Lab, die auch als Blog unter archive.org zu finden ist. Diesem Problem stehen die meisten Webseitenbetreiber gegenüber. Denn das Erstellen und Veröffentlichen von Inhalten kostet Zeit und auch Geld. Am Beispiel von elmar-dott.com sind das explizit Beträge, die für den Server, die Domain, Bücher und diverse Abonnements zu Buche schlagen. Da wir uns explizit gegen automatische Erstellungen von Inhalten aussprechen, basieren alle Artikel auf elmar-dott.com auf konkreten Erfahrungen und einer tiefen Recherche zu den einzelnen Themenbereichen. Das bedeutet auch, dass viele der beschriebenen Lösungen von den entsprechenden Autoren auch tatsächlich so genutzt werden. Damit KI die Inhalte nicht abgreift und wir somit außer von Webcrawlern keine wirklichen Besucher haben, sind hochwertige Informationen nur über ein Abo einsehbar. Das betrifft vor allem Referenzen, Quelltexte und ausgewählte Artikel.

Ein anderer Aspekt ist natürlich die Vertrauenswürdigkeit der gespeicherten Inhalte. Auch wenn das Motto von archive.org gemeinnützig ist und durch die Bemühungen, ein frei zugängliches Internet zu gewährleisten, heißt das noch lange nicht, dass archive.org nicht möglicherweise andere nicht offizielle Interessen vertritt. Elektronisch gespeicherte Inhalte lassen sich bekanntlich auch leicht manipulieren. So sind die über Archivierungsdienste erhobenen Inhalte vielmehr als Indiz zu werten. Natürlich würde es Möglichkeiten geben, die erhobenen Inhalte gegen Veränderung zu schützen. Die Blockchain wäre eine solche Möglichkeit, Manipulationen zu erkennen.

Im Premiumartikel Erntezeit beschreibe ich, wie man über verschiedene freie und kostenpflichtige APIs Informationen erheben kann. Auch die Wayback Machine kann für brisante Rechercheaufgaben herangezogen werden. Denn wie so immer gilt auch in Unternehmen: Wo gehobelt wird, fallen Späne. Kleine Missgeschicke sind nun mal menschlich und bisweilen kann es vorkommen, dass Unternehmen ‚aus Versehen‘ brisante Interna veröffentlichen. Das können Fehlermeldungen auf der Webseite sein, die verraten, welches DBMS oder welcher Server im Einsatz ist. Sobald man davon Kenntnis erlangt, dass Informationen, die missbraucht werden können, in irgendeinem Datenbestand auftauchen, ist die erste Handlung, den Inhaber des Datenbestandes zu kontaktieren und um Löschung zu bitten. Oft hilft hier eine Erklärung und ein freundliches Wort.

Natürlich ist archive.org nicht einzig auf Webseiten spezialisiert. Das Ziel ist, eine umfassende Bibliothek zu erstellen, was natürlich auch das Digitalisieren von copyrightfreien Büchern umfasst. Ähnlich dem Projekt Gutenberg. Aber auch Filme, Audio und Software sind im Archiv zu finden. Interessanterweise findet man archive.org auch im Onion Tor Netzwerk unter einer eigenen Onion-Domain.

Natürlich ist archive.org nicht die einzige Organisation, die versucht, das Internet zu speichern. Auch die Webseite archive.today hat dieses Ziel. Allerdings ist der Datenbestand von archive.today nicht so umfassend. Dafür kann man die eigene URL über ein Eingabefeld rasch übermitteln und schon ist die Webseite auch im Bestand aufgenommen.

Wie wir sehen können, gibt es durchaus einige Perlen im Internet. Um sich intensiv mit Recherchetechniken auseinanderzusetzen, muss man kein Journalist sein. Auch der Bereich Reconnaissance (dt. Aufklärung) in der Cyber Security erfordert einiges an Gespür. Nicht ohne Grund heißt es: Wissen ist Macht.


Java Enterprise – eine Übersicht

Wenn Sie sich mit Java Enterprise beschäftigen möchten, mag es anfangs etwas überwältigend und verwirrend wirken. Aber keine Sorge, es ist nicht so schlimm, wie es scheint. Für den Anfang genügen grundlegende Kenntnisse über die Ideen und Konzepte.

Die Java Serie

zuletzt geändert::

Da Java EE weder ein Werkzeug noch ein Compiler ist, den man wie das Java Development Kit (JDK), auch bekannt als Software Development Kit (SDK), herunterlädt und verwendet, handelt es sich bei Java Enterprise um eine Reihe von Spezifikationen. Diese Spezifikationen werden durch eine API unterstützt, die wiederum eine Referenzimplementierung besitzt. Die Referenzimplementierung ist ein herunterladbares Paket namens Application Server.

Seit Java EE 8 wird Java Enterprise von der Eclipse Foundation gepflegt. Oracle und die Eclipse Foundation konnten sich nicht auf eine gemeinsame Vereinbarung zur Nutzung der Marke Java einigen, die Oracle gehört. Kurz gesagt: Die Eclipse Foundation benannte Java EE in Jakarta EE um. Dies hat auch Auswirkungen auf ältere Projekte, da sich in Jakarta EE 9 die Paketpfade von javax zu jakarta geändert haben. Jakarta EE 9.1 aktualisiert alle Komponenten von JDK 8 auf JDK 11.

Für die Entwicklung von Jakarta Enterprise [1]-Anwendungen sind einige Voraussetzungen erforderlich. Zunächst muss die richtige JDK-Version ausgewählt werden. Die Laufzeitumgebung Java Virtual Machine (JVM) ist bereits im JDK enthalten und muss nicht separat installiert werden. Eine gute Wahl ist stets die neueste LTS-Version. Java 17 JDK wurde 2021 veröffentlicht und wird bis 2024 unterstützt.

Um die Oracle-Lizenzbeschränkungen zu umgehen, können Sie auf eine freie Open-Source-Implementierung des JDK umsteigen. Eine der bekanntesten freien Varianten ist OpenJDK von adoptium [2]. Eine weitere interessante Implementierung ist GraalVM [3], das auf OpenJDK basiert. Die Enterprise Edition von GraalVM kann Ihre Anwendung um das 1,3-Fache beschleunigen. Für den Produktiveinsatz ist eine kommerzielle Lizenz der Enterprise Edition erforderlich. GraalVM enthält außerdem einen eigenen Compiler.

  Version  Year  JSR  Servlet  Tomcat  JavaSE
J2EE – 1.21999
J2EE – 1.32001JSR 58
J2EE – 1.42003JSR 151
Java EE 52006JSR 244
Java EE 62009JSR 316
Java EE 72013JSR 342
Java EE 82017JSR 366
Jakarta 820194.09.08
Jakarta 920205.010.08 & 11
Jakarta 9.120215.010.011
Jakarta 1020226.010.111
Jakarta 1120236.111.017
Jakarta 12under development6.221

Die obige Tabelle ist nicht vollständig, enthält aber die wichtigsten aktuellen Versionen. Sollten Ihnen weitere Informationen fehlen, schreiben Sie mir gerne eine Nachricht.

Bitte beachten Sie, dass die Jakarta EE-Spezifikation ein bestimmtes Java SDK benötigt und der Anwendungsserver möglicherweise ein anderes Java JDK als Laufzeitumgebung benötigt. Die beiden Java-Versionen müssen nicht identisch sein.

Dependencies (Maven):

<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-api</artifactId>
    <version>${version}</version>
    <scope>provided</scope>
</dependency> 
<dependency>
    <groupId>org.eclipse.microprofile</groupId>
    <artifactId>microprofile</artifactId> 
    <version>${version}</version>
    <type>pom</type>
    <scope>provided</scope>
</dependency>

Im nächsten Schritt wählen Sie die Implementierung der Jakarta EE-Umgebung. Das bedeutet, Sie entscheiden sich für einen Anwendungsserver. Es ist sehr wichtig, dass der gewählte Anwendungsserver mit der auf Ihrem System installierten JVM-Version kompatibel ist. Der Grund dafür ist einfach: Der Anwendungsserver ist in Java implementiert. Wenn Sie ein Servlet-Projekt entwickeln möchten, benötigen Sie keinen vollständigen Anwendungsserver. Ein einfacher Servlet-Container wie Apache Tomcat (Catalina) oder Jetty enthält alles Notwendige.

Referenzimplementierungen für Jakarta Enterprise sind beispielsweise: Payara (ein Fork von Glassfish), WildFly (ehemals JBoss), Apache Geronimo, Apache TomEE, Apache Tomcat und Jetty.

Vielleicht haben Sie schon von Microprofile [4] gehört. Keine Sorge, es ist gar nicht so kompliziert, wie es zunächst scheint. Microprofiles sind im Allgemeinen eine Teilmenge von JakartaEE zum Ausführen von Microservices. Sie wurden um verschiedene Technologien erweitert, um den Status der Dienste zu verfolgen, zu beobachten und zu überwachen. Version 5 wurde im Dezember 2021 veröffentlicht und ist vollständig kompatibel mit JakartaEE 9.


Core Technologies

Plain Old Java Beans

POJOs sind vereinfachte Java-Objekte ohne Geschäftslogik. Diese Art von Java-Beans enthält lediglich Attribute und die zugehörigen Getter und Setter. POJOs:

  • Erweitern keine vordefinierten Klassen: z. B. ist public class Test extends javax.servlet.http.HttpServlet keine POJO-Klasse.
  • Enthalten keine vordefinierten Annotationen: z. B. ist @javax.persistence.Entity public class Test keine POJO-Klasse.
  • Implementieren keine vordefinierten Schnittstellen: z. B. ist public class Test implements javax.ejb.EntityBean keine POJO-Klasse.

(Jakarta) Enterprise Java Beans

Eine EJB-Komponente, auch Enterprise Bean genannt, ist ein Codeblock mit Feldern und Methoden zur Implementierung von Modulen der Geschäftslogik. Man kann sich eine Enterprise Bean als Baustein vorstellen, der allein oder zusammen mit anderen Enterprise Beans verwendet werden kann, um Geschäftslogik auf dem Java-EE-Server auszuführen.

Enterprise Beans sind entweder zustandslose oder zustandsbehaftete Session Beans oder Message-Driven Beans. Zustandslos bedeutet, dass die Session Bean und ihre Daten gelöscht werden, sobald der Client die Ausführung beendet hat. Eine Message-Driven Bean kombiniert die Eigenschaften einer Session Bean mit denen eines Message Listeners und ermöglicht es einer Geschäftskomponente, asynchron (JMS-)Nachrichten zu empfangen.

(Jakarta) Servlet

Die Java-Servlet-Technologie ermöglicht die Definition HTTP-spezifischer Servlet-Klassen. Eine Servlet-Klasse erweitert die Funktionalität von Servern, die Anwendungen hosten, auf die über ein Anfrage-Antwort-Programmiermodell zugegriffen wird. Obwohl Servlets auf jede Art von Anfrage reagieren können, werden sie üblicherweise zur Erweiterung der von Webservern gehosteten Anwendungen eingesetzt.

(Jakarta) Server Pages

JSP ist eine UI-Technologie, mit der sich Servlet-Code-Schnipsel direkt in ein textbasiertes Dokument einfügen lassen. JSP-Dateien werden vom Compiler in ein Java-Servlet umgewandelt.

(Jakarta) Server Pages Standard Tag Library

Die JSTL kapselt Kernfunktionen, die vielen JSP-Anwendungen gemeinsam sind. Anstatt Tags verschiedener Anbieter in Ihren JSP-Anwendungen zu mischen, verwenden Sie einen einzigen, standardisierten Tag-Satz. Die JSTL enthält Iterator- und Bedingungs-Tags zur Ablaufsteuerung, Tags zur Bearbeitung von XML-Dokumenten, Internationalisierungs-Tags, Tags für den Datenbankzugriff mit SQL sowie Tags für häufig verwendete Funktionen.

(Jakarta) Server Faces

JSF ist ein Framework für Benutzeroberflächen zur Entwicklung von Webanwendungen. JSF wurde eingeführt, um das Problem von JSP zu lösen, bei dem Programmlogik und Layout stark voneinander getrennt waren.

(Jakarta) Managed Beans

Managed Beans sind leichtgewichtige, containerverwaltete Objekte (POJOs) mit minimalen Anforderungen. Sie unterstützen eine kleine Anzahl grundlegender Dienste wie Ressourceninjektion, Lebenszyklus-Callbacks und Interceptors. Managed Beans stellen eine Verallgemeinerung der von der Java Server Faces-Technologie spezifizierten Managed Beans dar und können überall in einer Java-EE-Anwendung eingesetzt werden, nicht nur in Webmodulen.

(Jakarta) Persistence API

Die Java Persistence API (JPA) ist eine auf Java-Standards basierende Lösung für die Datenpersistenz. Sie nutzt ein objektrelationales Mapping, um die Lücke zwischen einem objektorientierten Modell und einer relationalen Datenbank zu schließen. Die Java Persistence API kann auch in Java-SE-Anwendungen außerhalb der Java-EE-Umgebung verwendet werden. Hibernate und Eclipse Link sind Beispiele für JPA-Implementierungen.

(Jakarta) Transaction API

Die JTA bietet eine Standardschnittstelle zur Abgrenzung von Transaktionen. Die Java-EE-Architektur stellt standardmäßig einen automatischen Commit zur Verfügung, der Transaktions-Commits und -Rollbacks verarbeitet. Ein automatischer Commit bedeutet, dass alle anderen Anwendungen, die auf Daten zugreifen, nach jedem Lese- oder Schreibvorgang die aktualisierten Daten sehen. Führt Ihre Anwendung jedoch zwei voneinander abhängige Datenbankzugriffe durch, sollten Sie die JTA-API verwenden, um den Beginn, den Rollback und den Commit der gesamten Transaktion – einschließlich beider Operationen – festzulegen.

(Jakarta) API for RESTful Web Services

JAX-RS definiert APIs für die Entwicklung von Webdiensten gemäß dem REST-Architekturstil (Representational State Transfer). Eine JAX-RS-Anwendung ist eine Webanwendung, die aus Klassen besteht, die als Servlet in einer WAR-Datei zusammen mit den erforderlichen Bibliotheken verpackt sind.

(Jakarta) Dependency Injection for Java

Dependency Injection für Java definiert einen Standardsatz von Annotationen (und ein Interface) für die Verwendung injizierbarer Klassen wie Google Guice oder dem Sprig Framework. Auf der Java-EE-Plattform bietet CDI Unterstützung für Dependency Injection. Konkret können Injektionspunkte nur in einer CDI-fähigen Anwendung verwendet werden.

(Jakarta) Contexts & Dependency Injection for Java EE

CDI definiert eine Reihe von Kontextdiensten, die von Java-EE-Containern bereitgestellt werden und es Entwicklern erleichtern, Enterprise Beans zusammen mit Java Server Faces in Webanwendungen zu verwenden. CDI ist für die Verwendung mit zustandsbehafteten Objekten konzipiert, bietet aber auch viele weitere Einsatzmöglichkeiten und ermöglicht Entwicklern ein hohes Maß an Flexibilität bei der Integration verschiedener Komponententypen auf lose gekoppelte, aber typsichere Weise.

(Jakarta) Bean Validation

Die Bean-Validierungsspezifikation definiert ein Metadatenmodell und eine API zur Validierung von Daten in Java-Beans-Komponenten. Anstatt die Datenvalidierung auf mehrere Schichten, wie Browser und Server, zu verteilen, können die Validierungsbedingungen zentral definiert und schichtübergreifend genutzt werden.

(Jakarta) Message Service API

Die JMS-API ist ein Messaging-Standard, der es Java-EE-Anwendungskomponenten ermöglicht, Nachrichten zu erstellen, zu senden, zu empfangen und zu lesen. Sie ermöglicht eine lose gekoppelte, zuverlässige und asynchrone verteilte Kommunikation.

(Jakarta) EE Connector Architecture

Die Java-EE-Connector-Architektur wird von Softwareherstellern und Systemintegratoren verwendet, um Ressourcenadapter zu erstellen, die den Zugriff auf Enterprise-Informationssysteme (EIS) unterstützen und in jedes Java-EE-Produkt integriert werden können. Ein Ressourcenadapter ist eine Softwarekomponente, die es Java-EE-Anwendungskomponenten ermöglicht, auf den zugrunde liegenden Ressourcenmanager des EIS zuzugreifen und mit diesem zu interagieren. Da ein Ressourcenadapter spezifisch für seinen Ressourcenmanager ist, existiert typischerweise für jeden Datenbanktyp oder jedes Enterprise-Informationssystem ein eigener Ressourcenadapter.

Die Java EE Connector Architecture ermöglicht eine leistungsorientierte, sichere, skalierbare und nachrichtenbasierte Transaktionsintegration von Java EE-basierten Webdiensten mit bestehenden Enterprise-Integrated-Systemen (EIS), die sowohl synchron als auch asynchron arbeiten können. Bestehende Anwendungen und EIS, die über die Java EE Connector Architecture in die Java EE-Plattform integriert wurden, lassen sich mithilfe von JAX-WS und Java EE-Komponentenmodellen als XML-basierte Webdienste bereitstellen. JAX-WS und die Java EE Connector Architecture ergänzen sich somit ideal für die Enterprise Application Integration (EAI) und die durchgängige Geschäftsintegration.

(Jakarta) Mail API

Java-EE-Anwendungen nutzen die JavaMail-API zum Versenden von E-Mail-Benachrichtigungen. Die JavaMail-API besteht aus zwei Teilen:

  • einer Anwendungsschnittstelle, die von den Anwendungskomponenten zum Versenden von E-Mails verwendet wird,
  • und einer Dienstschnittstelle.

Die Java-EE-Plattform beinhaltet die JavaMail-API mit einem Dienstanbieter, der es Anwendungskomponenten ermöglicht, E-Mails über das Internet zu versenden.

(Jakarta) Authorization Contract for Containers

Die JACC-Spezifikation definiert einen Vertrag zwischen einem Java-EE-Anwendungsserver und einem Autorisierungsrichtlinienanbieter. Alle Java-EE-Container unterstützen diesen Vertrag. Die JACC-Spezifikation definiert java.security.Permission-Klassen, die dem Java-EE-Autorisierungsmodell entsprechen. Sie legt fest, wie Containerzugriffsentscheidungen an Operationen auf Instanzen dieser Berechtigungsklassen gebunden werden. Darüber hinaus definiert sie die Semantik von Richtlinienanbietern, die die neuen Berechtigungsklassen nutzen, um die Autorisierungsanforderungen der Java-EE-Plattform zu erfüllen, einschließlich der Definition und Verwendung von Rollen.

(Jakarta) Authentication Service Provider Interface for Containers

Die JASPIC-Spezifikation definiert eine Service-Provider-Schnittstelle (SPI), über die Authentifizierungsanbieter, die Mechanismen zur Nachrichtenauthentifizierung implementieren, in Client- oder Server-Container bzw. Laufzeitumgebungen zur Nachrichtenverarbeitung integriert werden können. Die über diese Schnittstelle integrierten Authentifizierungsanbieter verarbeiten Netzwerknachrichten, die ihnen von ihren aufrufenden Containern bereitgestellt werden. Sie transformieren ausgehende Nachrichten so, dass der Absender jeder Nachricht den Absender und der Empfänger den Absender authentifizieren kann. Eingehende Nachrichten werden von den Authentifizierungsanbietern authentifiziert, und die im Zuge der Nachrichtenauthentifizierung ermittelte Identität wird an die aufrufenden Container zurückgegeben.

(Jakarta) EE Security API

Ziel der Java EE Security API-Spezifikation ist die Modernisierung und Vereinfachung der Sicherheits-APIs. Dies geschieht durch die Etablierung einheitlicher Ansätze und Mechanismen sowie die Ausblendung komplexerer APIs aus der Entwicklersicht, wo immer möglich. Java EE Security führt die folgenden APIs ein:

  • SecurityContext-Schnittstelle: Bietet einen einheitlichen Zugriffspunkt, über den Anwendungen Aspekte der Aufruferdaten prüfen und den Zugriff auf Ressourcen gewähren oder verweigern können.
  • HttpAuthenticationMechanism-Schnittstelle: Authentifiziert Aufrufer einer Webanwendung und ist ausschließlich für die Verwendung im Servlet-Container vorgesehen.
  • IdentityStore-Schnittstelle: Bietet eine Abstraktion eines Identitätsspeichers, der zur Authentifizierung von Benutzern und zum Abrufen von Aufrufergruppen verwendet werden kann.

(Jakarta) Java API for WebSocket

WebSocket ist ein Anwendungsprotokoll, das Vollduplex-Kommunikation zwischen zwei Teilnehmern über TCP ermöglicht. Die Java-API für WebSocket erlaubt es Java-EE-Anwendungen, Endpunkte mithilfe von Annotationen zu erstellen, die die Konfigurationsparameter des Endpunkts festlegen und seine Lebenszyklus-Callback-Methoden definieren.

(Jakarta) Java API for JSON Processing

JSON-P ermöglicht Java-EE-Anwendungen das Parsen, Transformieren und Abfragen von JSON-Daten mithilfe des Objektmodells oder des Streaming-Modells.

JavaScript Object Notation (JSON) ist ein textbasiertes Datenaustauschformat, das von JavaScript abgeleitet ist und in Webdiensten und anderen verbundenen Anwendungen verwendet wird.

(Jakarta) Java API for JSON Binding

JSON-B stellt eine Bindungsschicht für die Konvertierung von Java-Objekten in und aus JSON-Nachrichten bereit. JSON-B ermöglicht zudem die Anpassung des standardmäßigen Mapping-Prozesses dieser Bindungsschicht durch Java-Annotationen für ein bestimmtes Feld, eine JavaBean-Eigenschaft, einen Typ oder ein Paket oder durch die Implementierung einer Strategie zur Benennung von Eigenschaften. JSON-B wurde mit der Java EE 8-Plattform eingeführt.

(Jakarta) Concurrency Utilities für Java EE

Concurrency Utilities for Java EE ist eine Standard-API zur Bereitstellung asynchroner Funktionen für Java EE-Anwendungskomponenten durch die folgenden Objekttypen: Managed Executor Service, Managed Scheduled Executor Service, Managed Thread Factory und Context Service.

(Jakarta) Batch Applications for the Java Platform

Batch-Jobs sind Aufgaben, die ohne Benutzerinteraktion ausgeführt werden können. Die Spezifikation „Batch Applications for the Java Platform“ (BAJP) ist ein Batch-Framework, das die Erstellung und Ausführung von Batch-Jobs in Java-Anwendungen unterstützt. Das Framework besteht aus einer Batch-Laufzeitumgebung, einer auf XML basierenden Job-Spezifikationssprache, einer Java-API zur Interaktion mit der Batch-Laufzeitumgebung und einer Java-API zur Implementierung von Batch-Artefakten.

Resources

Abonnement / Subscription

[English] This content is only available to subscribers.

[Deutsch] Diese Inhalte sind nur für Abonnenten verfügbar.


Es muss nicht immer gleich Kali Linux sein!

Kali Linux [1] und Parrot Linux [2] gelten unter den Linux Distributionen, als die erste Wahl, wenn es um Security und Penetration Testing geht. Viele einschlägige Programme sind auf diesen Distributionen bereits vorinstalliert und können sozusagen out of the Box benutzt werden.

Allerdings muss man auch sagen, dass Kali und auch Parrot, wegen ihrer Spezialisierung nicht unbedingt die alltagstauglichsten Linux Distributionen sind. Für die tägliche Nutzung sind eher Ubuntu für Einsteiger und Debian für fortgeschrittene Anwender verbreitet. Aus diesem Grund werden Kali und Parrot meist als virtuelle Maschinen mit VirtualBox oder dem VMWare Player aufgesetzt und genutzt. Ein durchaus praktikabler Ansatz, vor allem wenn es darum geht, sich erst einmal die Distribution anzuschauen, bevor man sie auf den Rechner nativ installiert.

Aus meiner Sicht ist das sogenannte Distributions-Hopping, das manche Leute unter Linux betreiben, eher hinderlich, sich an ein System zu gewöhnen, um damit effizient arbeiten zu können. Auf welches Linux die Wahl fällt, hängt vor allem vom eigenen Geschmack ab und von den Anforderungen, was man damit machen möchte. Entwickler und Systemadministratoren, werden wahrscheinlich eine Neigung zu Debian haben, einer Version, von der viele andere Distributionen abgeleitet wurden. Windowsumsteiger erfreuen sich oft an Linux Mint, und so lässt sich die Liste weiter fortsetzen.

Wer sich als Hacker fühlen möchte, entscheidet sich gern für eine Kali-Installation. Oft sind dabei Dinge wie Privatsphäre und anonymes Surfen im Internet die eigentlichen Bewegründe. Hierzu hatte ich bereits Kodachi Linux, das auf anonymes Surfen im Internet spezialisiert ist, vorgestellt. Natürlich muss man ganz klar sagen, dass es im Internet keine wirkliche anonyme Kommunikation gibt. Man kann aber die Anzahl möglicher Lauscher mit einigen leicht umzusetzenden Maßnahmen massiv reduzieren. Das Thema Privatsphäre habe ich auf diesem Blog in mehreren Artikeln zur Ansprache gebracht. Auch wenn es für viele eine unpopuläre Meinung ist. Aber eine Linux VM die über ein Apple- oder Windows-Betriebssystem zum anonymen Surfen hergenommen wird, verfehlt ihren Nutzen vollständig.

Der erste Punkt in der Rubrik „Privatsphäre“ ist der Internetbrowser. Ganz gleich, welchen man verwendet und wie sehr die verschiedenen Hersteller den Schutz der Privatsphäre hervorheben, in der Realität ist es wie in dem Märchen „Des Kaisers neue Kleider“. Den meisten Nutzern ist das Tor / Onion Netzwerk namentlich bekannt. Dahinter steckt der Torbrowser, den man einfach über die Webseite des Tor Projektes [3] herunterladen kann. Nach dem Download und dem Entpacken des Verzeichnisses lässt sich der Tor Browser über das Startscript auf der Konsole öffnen.

./Browser/start-tor-browser

Wer im Tor-Netzwerk unterwegs ist, kann URLs mit der Endung .onion besuchen. Ein großer Teil dieser Seiten ist als das sogenannte Darknet bekannt und sollte mit großer Vorsicht angesurft werden. Zu einem kann man hier auf sehr verstörende und auch illegale Inhalte stoßen, aber auch Opfer von Phishing Attacken und Ähnlichem werden. Ohne zu sehr auf die Details einzugehen, wie das Tor-Netzwerk genau funktioniert, sollte man sich durchaus im Klaren sein, dass man auch hier nicht völlig anonym unterwegs ist. Auch wenn man sich den großen Big-Tech-Firmen weitgehend entzieht, haben Behörden, vor allem wenn es um illegale Aktionen geht, durchaus Mittel und Möglichkeiten. Dazu gibt es in der einschlägigen Presse genügend Beispiele.

Wenn man nun darüber nachdenkt, wie das Internet in groben Zügen funktioniert, findet man auch schon den nächsten wichtigen Punkt: Proxy Server. Proxy Server sind sogenannte Stellvertreter, die ähnlich wie im Tor-Netzwerk die Anfragen ins Internet nicht an die Homepage direkt senden, sondern über einen fremden Server, der diese Anfrage weiterleitet und dann die Antwort zurückliefert. Ruft man zum Beispiel über einen Proxy die Internetseite von Google auf, so erscheint bei Google lediglich die IP-Adresse des Proxy Servers. Auch der eigene Provider sieht nur, dass man eine Anfrage zu einem bestimmten Server geschickt hat. Dass dieser Server dann eine Anfrage an Google stellt, sieht der Provider in den eigenen Logfiles nicht. Auf beiden Seiten, beim Provider und auf der Ziel Internetseite erscheint nur der Proxy Server. In der Regel versichern die Betreibe von Proxy Servern, dass sie selbst keine Logs mit der Original-IP ihrer Klienten speichern. Leider gibt es für diese Aussagen keine Garantie. Um hier die Wahrscheinlichkeit, erkannt zu werden, weiter zu reduzieren, kann man mehrere Proxy-Verbindungen hintereinanderschalten. Mit dem Konsolenprogramm proxychain, lässt sich dieses Vorhaben leicht umsetzen. ProxyChain ist unter Debian Distributionen schnell mit dem Paketmanager APT installiert.

sudo apt-get install proxychains4

Die Verwendung ist ebenso einfach. Über die Konfigurationsdatei /etc/proxychain.conf wird das Verhalten für proxychain festgelegt. Wenn man den Arbeitsmodus von stricht_chain auf random_chain ändert, wird bei jeder Verbindung eine andere Variation der einzelnen Proxy-Server zufällig zusammengestellt. Am Ende der Konfigurationsdatei kann man die einzelnen Proxy-Server eintragen. Dazu sind einige Beispiele in der Datei enthalten. Um proxychain zu verwenden, ruft man es einfach über die Konsole auf, gefolgt von der Anwendung (dem Browser), welche über die Proxys die Verbindung ins Internet aufbaut.

Proxychanin firefox
## RFC6890 Loopback address range
## if you enable this, you have to make sure remote_dns_subnet is not 127
## you'll need to enable it if you want to use an application that 
## connects to localhost.
# localnet 127.0.0.0/255.0.0.0
# localnet ::1/128

Die wirkliche Herausforderung ist das Finden geeigneter Proxy-Server. Für den Anfang findet man unter [4] eine große Auswahl weltweit freier Proxys.

Das alleinige Verwenden von Proxys für Verbindungen ins Internet biete nur bedingte Anonymität. Damit sich zwei Computer unterhalten, wird zwar eine IP Adresse benötigt, die über den Provider des Internetzugangs zur richtigen geografischen Adresse, wo der Computer steht, verknüpft werden kann. Über die Netzwerkkarte wird allerdings noch eine weitere Information ins Netz gesendet. Die sogenannte MAC Adresse, mit der man einen Computer direkt identifizieren kann. Da man nicht bei jedem Neustart des Computers eine neue Netzwerkkarte einbauen muss, um eine andere MAC-Adresse zu bekommen, kann man ein kleines, einfaches Tool namens macchanger nutzen. Dies ist wie proxychain ebenfalls problemlos über APT zu installieren. Nach der Installation kann man den Autostart festlegen und man muss sich entscheiden, ob immer dieselbe MAC Adresse oder jedes Mal eine zufällig neu generierte MAC Adresse verwendet werden soll.

Die bisher vorgestellten Maßnahmen nützen natürlich nur dann etwas, wenn die Verbindung ins Internet auch verschlüsselt ist. Das geschieht über die sogenannten Secure Socket Layer (SSL). Wenn man sich nicht über einen VPN mit dem Internet verbindet und die aufgerufenen Webseiten anstatt von https nur http verwenden, kann man mit einem beliebigen Paketsniffer (z. B. dem Programm Wireshark) die Kommunikation mitschneiden und den Inhalt der Kommunikation im Klartext lesen. Auf diese Weise werden in öffentlichen Netzwerken (WiFi) Passwörter oder vertrauliche Nachrichten ausgespäht. Wir können sehr sicher davon ausgehen, dass Internetprovider sämtliche Kommunikation ihrer Kunden über sogenannte Paketfilter laufen lassen, um verdächtige Aktionen zu erkennen. Bei https Verbindungen können diese Filter nicht in die Pakete hineinschauen.

Nun könnte man auf die Idee kommen, mit all den bisher beschriebenen Maßnahmen sich illegal in ein fremdes Netzwerk zu verbinden. Schließlich weiß dann keiner, dass man da ist, und alle Aktivitäten im Internet werden dem Anschlussinhaber zugeordnet. Aus diesem Grund möchte ich ausdrücklich darauf hinweisen, dass in so ziemlich allen Ländern solche Aktionen strafbar sind und man, wenn man dabei erwischt wird, schnell im Gefängnis landen kann. Wer mehr über das Thema WiFi Sicherheit erfahren möchte, um das eigene Netzwerk vor illegalem Zugriff zu schützen, findet im Mitgliederbereich (Subscription) einen ausführlichen Workshop zu Aircrack-ng.

Der nächste Punkt auf der Liste zum Thema Privatsphäre ist E-Mail. Für die meisten Menschen ist es einfach nicht möglich, dass sie ihren eigenen E-Mail Server betreiben. Der Aufwand ist enorm und auch nicht ganz kostengünstig. Deswegen werden Angebote von Google, Microsoft und Co. einen E-Mail-Dienst bereitzustellen, gern angenommen. Wer diesen Dienst nicht über einen lokalen Client nutzt und die verschickten E-Mails nicht kryptografisch verschlüsselt, kann sich sicher sein, dass die Mail Anbieter die Mails scannen und mitlesen. Außnahmslos! Da die Konfiguration eines Mail Clients mit funktionierender Verschlüsselung eher ein Geek Thema ist, genauso wie das Betreiben eines eigenen Mailservers, sind hier die Optionen sehr eingeschränkt. Einzige Lösung ist der Schweizer Anbieter Proton [5], der auch kostenfreie Mail-Accounts bereitstellt. Proton wirbt mit dem Schutz der Privatsphäre ihrer Kunden und setzt diesen durch strikte Verschlüsselung um. Ob man dennoch vertrauliche Nachrichten per E-Mail verschicken sollte, muss jeder für sich selbst klären. Das gilt natürlich auch für die verfügbaren Messenger, die mittlerweile sehr viel für Telefonie genutzt werden.

Viele Menschen haben sich einmal selbst gegoogelt, um zu erfahren, welche digitalen Spuren sie im Internet bisher hinterlassen haben. Dies kratzt natürlich nur an der Oberfläche, denn die Leute im Personalwesen von größeren Firmen und Konzernen nutzen effektivere Wege. Ein sehr professionelles Werkzeug ist Matego, aber auch im Open Source Bereich findet sich ein mächtiges Tool, das so einige Sachen zutage fördern kann. Auch hierzu gibt es für Subscriber einen entsprechenden Workshop. Denn wenn man seine Spuren findet, kann man sich auch daran machen, sie zu verwischen.

Wie man sehen kann, ist das Thema Privatsphäre und Anonymität sehr umfangreich und mit diesem kleinen Artikel auch nur oberflächlich behandelt. Dennoch ist die Informationstiefe ausreichend, um einen ersten Eindruck des Sachverhalts zu bekommen. Es reicht bei weitem nicht aus, sich ein System wie Kali aufzusetzen, wenn man die Grundlagen nicht kennt, um die Werkzeuge auch korrekt einzusetzen. Denn wenn man die verschiedenen Puzzelteile nicht akkurat zusammensetzt, bleibt die erhoffte Wirkung, sich durch Anonymität mehr Privatsphäre im Internet zu verschaffen. Dieser Artikel erklärt auch auf technischer Ebene meinen persönlichen Standpunkt, wieso es keine sichere, anonyme elektronische Kommunikation gibt. Wer sich in das Thema einarbeiten möchte, erzielt mit einer sinnvollen Strategie und dem stückweise erweiterten eigenen System schneller Erfolge, als mit einem bereits vorgefertigten Allround Werkzeug wie Kali Linux.

Ressourcen

Abonnement / Subscription

[English] This content is only available to subscribers.

[Deutsch] Diese Inhalte sind nur für Abonnenten verfügbar.

Altersverifikation durch systemd in Linux-Distributionen

Seit 2025 haben einige Länder bereits eine Altersverifikation für die Nutzung von Social Media und generell auch für das Internet eingeführt. Vorreiter dieser Welle sind Australien und das Vereinigte Königreich. Aber auch einige Bundesstaaten in den USA sind bereits auf den Zug aufgesprungen. In der EU soll die Altersverifikation bis 2027 ausgerollt werden. Italien und Frankreich haben bereits entsprechende Gesetze verabschiedet. Die neue Regierung, die in Deutschland seit Beginn 2025 die Geschicke der Bürger leitet, ist ebenfalls für die Bevormundung der Bürger. Das demonstrierten die Machthaber durch einen Passus im Koalitionsvertrag, der die flächendeckende Einführung der eID in Deutschland vorsieht. In diesem Artikel zeige ich gesellschaftliche und technische Aspekte auf, die über kurz oder lang auf uns Bürger zukommen werden.

Unter dem Deckmantel des Jugendschutzes soll Kindern und Jugendlichen unter 16 Jahren der Zugriff auf gefährdende Inhalte wie Pornografie verwehrt werden. Aber auch soziale Medien wie Facebook, X und andere Plattformen werden von den Maßnahmen betroffen sein. Bereits jetzt werden verschiedene Inhalte auf YouTube nur angemeldeten Nutzern zugänglich gemacht.

Würde man sich wirklich um das Wohl der Kinder kümmern, würde man sich darauf konzentrieren, sie bei der Ausbildung einer stabilen und gesunden Persönlichkeit zu fördern. Das beginnt bereits bei einem ausgewogenen, gesunden Schulessen, welches für jeden Schüler zu einem leistbaren Betrag zur Verfügung stehen sollte. Aber auch bereits im Schulunterricht Medienkompetenz zu vermitteln, wäre ein Schritt in die richtige Richtung. Das sind nur kurze Beispiele, die aufzeigen, dass die Begründung zur Einführung einer Altersverifikation Augenwischerei ist und grundsätzlich andere Ziele verfolgt werden.

Es geht um die Bevormundung und Kontrolle eines jeden einzelnen Bürgers. Es ist ein Verstoß gegen das Selbstbestimmungsrecht. Denn eins muss allen klar sein: Damit man weiß, dass eine Person das entsprechende Alter für restriktive Inhalte auch tatsächlich hat, müssen sich alle Menschen, die den eingeschränkten Inhalt betrachten möchten, ausweisen. Diesen Nachweis wird man ausschließlich mit der eID erbringen können. Sobald eine kritische Masse erreicht ist, die ihre eID nutzt, wird dies zum Standard für Bezahlung und alle möglichen anderen Dinge. Es klingt ein wenig prophetisch, wenn man die Offenbarung des Johannes aus dem Neuen Testament kennt.

Das zweite Tier brachte alle dazu – ob groß oder klein, reich oder arm, ob Herr oder Sklave –, auf der rechten Hand oder der Stirn ein Zeichen zu tragen. Ohne dieses Zeichen konnte niemand etwas kaufen oder verkaufen.  Offenbarung 13:16

Es ist also abzusehen, dass die Verweigerung des Einzelnen, die eID anzunehmen, ihn vollständig aus der digitalen Welt verbannen wird. Parallel dazu werden Möglichkeiten verschwinden, die im richtigen Leben, dem sogenannten analogen Raum, Alternativen bilden. Ich möchte aber an dieser Stelle nicht zu prophetisch werden. Es kann sich jeder für sich selbst ausmalen, welche Konsequenzen die Einführung der digitalen ID für das eigene Leben haben wird. Ich werde nun ein wenig auf technische Details eingehen und Denkanstöße zur bürgerlichen Notwehr anregen. Denn ich bin mir sehr sicher, dass eine breite Akzeptanz der eID vorhanden ist. Auch wenn die konkreten Gründe variieren, lassen sie sich auf den persönlichen Komfort und die Bequemlichkeit reduzieren. Wer ab hier weiterliest, ist in der absoluten Selbstverantwortung, Dinge eigenständig umzusetzen und sich das notwendige Wissen anzueignen. Es wird keine schnelle, einfache Lösung von der Stange geben. Mann muss aber auch kein Nerd sein. Der Wille zum eigenständigen Denken genügt völlig, um die technischen Zusammenhänge schnell zu verstehen. Es ist wie man so sagt: keine Raketentechnologie.

Leute, die auf Apple- oder Microsoft Produkte setzen, haben keine andere Möglichkeit, als zu freien Betriebssystemen zu wechseln. Smartphones haben überhaupt keine alltagstaugliche Alternative zu den Banking-Apps und Messengern. Es hat schon einen Grund, wieso man sich für Telegram und Signal Messenger mit einer funktionierenden Telefonnummer anmelden muss. Denn die Chats werden vom Telefon auf die Desktop Anwendung synchronisiert. Also bleibt der Computer, der im Idealfall nicht neuer als von 2020 sein sollte. Hierzu habe ich bereits einen Artikel veröffentlicht.

Sämtliche Linux-Distributionen funktionieren problemlos auf alter und auch auf leistungsschwacher Hardware. Ein Wechsel zu Linux ist mittlerweile auch leicht zu bewältigen und in wenigen Wochen ist man auch an das neue System gewöhnt. Soweit bisher die Theorie.

Seit Kalenderwoche 13 im Jahr 2026 geht allerdings ein Aufschrei von der Linux Community durch alle sozialen Medien. Das Programm systemd hatte einen Commit in das öffentliche Quellcode Repository, das ein Feld Geburtstag zur Altersverifikation hinzugefügt worden. Wer nun denkt, na gut, bloß ein Programm, dann lasse ich das weg, muss wissen, dass systemd für System Deamon steht. Es ist neben dem Kernel eines der wichtigsten Programme in einer Linux-Distribution. Es ist unter anderem dafür verantwortlich, dass beim Einschalten des Rechners notwendige Dienste und Programme gestartet werden.

Dieser Datensatz enthält bereits grundlegende Benutzermetadaten wie Name, E-Mail-Adresse und Standort. Das Feld speichert ein vollständiges Datum im Format JJJJ-MM-TT und kann nur von Administratoren, nicht von Benutzern selbst, festgelegt werden.

Lennart Poettering, der Entwickler von systemd, hat klargestellt, dass diese Änderung Folgendes betrifft:

» Es handelt sich um ein optionales Feld im JSON-Objekt userdb. Es ist weder eine Richtlinien-Engine noch eine API für Anwendungen. Wir definieren das Feld lediglich, um es zu standardisieren, falls Benutzer das Datum dort speichern möchten. Die Verwendung ist jedoch völlig optional. «

Quelle: It’s FOSS

Diese ganzen Ereignisse werfen auch ein neues Licht auf das Treffen von Linus Torvalds und Bill Gates am 22 Juni 2025, die sich nach 30 Jahren erstmalig persönlich begegnet sind. Es ist ein absolutes No Go in der Linux Community, den Nutzer des Rechners zu bevormunden und in dessen Privatsphäre einzugreifen. Und es gibt starke Stimmen, die sich gegen das Vorhaben von systemd stemmen. Man kann aber nicht absehen, wie stark die Gegenwehr aufrechterhalten bleibt, wenn staatlicher Druck auf die standhaften Revoluzzer ausgeübt wird.

Der erste Ansatz als Lösung dieses Problems ist die Verwendung einer Linux-Distribution, die kein systemd verwendet. Bekanntere Distributionen, die ohne systemd auskommen, sind Gentoo, Slackware und Alpine Linux. Wer wie ich und viele andere ein reines Debian verwenden, kann einmal einen Blick auf Devuan (Version für 3/2026 ist 6.1 Excalibur) werfen, welches von aktuellen Debian Versionen einen Fork erstellt hat, der ohne systemd auskommt.

Man muss auch erwähnen, dass systemd bei Hardcore Linuxern durchaus schon immer kritisch gesehen wird. Es gilt einfach als zu aufgebläht. Wer bereits seine Distribution schon länger laufen hat, hadert oft damit, diese einfach zu wechseln. Linux ist wie ein guter Wein. Es reift mit der Zeit und Neuinstallationen werden unter Powerusern als unnötig angesehen, da sich einfach alles wieder reparieren lässt. Auch Migrationen auf neuere Majorversionen verlaufen in aller Regel problemlos. Daher ist es auch kein Problem, systemd gegen das leichtgewichtigere SysVinit auszutauschen. Die einzige Voraussetzung dafür ist, dass man keine Angst vor der Linux Bash hat. Allerdings sind auch hier Grenzen gesetzt. Wer den Gnome3 Desktop verwendet, sollte zuerst den Desktop zu einer Variante wechseln, die nicht auf systemd aufbaut. Devuan Linux zeigt uns hier die Alternativen: KDE Plasma, Mate (Gnome2 Fork), Cinnamon (für Windowsumsteiger) oder das rudimentäre Xfce. Bevor man loslegt, sollte man aus Sicherheitsgründen mindestens seine Daten sichern und nach Möglichkeit auch die Festplatte clonen, um bei Problemen den Urzustand wiederherzustellen.

Da ich aufgrund der Aktualität des Themas noch keine Zeit gefunden habe, das Tutorial selbst auszuprobieren, verweise ich auf die englischsprachige Homepage linuxconfig.org mit der Anleitung in Debian systemd mit sysVinit zu ersetzen.

Ein riesengroßer Vorteil von Linux ist, dass man als Nutzer die volle Kontrolle über die Aktualisierungen hat. Es ist nicht so wie bei Microsoft Windows, dass man zum Update gezwungen wird, und wenn man es nicht durchführt, indem man etwa das Internet ausschaltet, verweigert der Rechner nach einer Weile den Start, bis das Update durchgeführt wurde. Auch wenn man unter Linux in aller Regel bestimmen kann, welche Updates man haben möchte, gibt es keinen Grarant, dass zumindest bei einem künftigen MajorUpdate nicht doch die Altersverifikation über die Hintertür untergeschoben wird. Es ist durchaus möglich, dass diese Technologie bereits als Schläfer im System enthalten ist und nur aktiviert werden muss. Seit einigen Jahren habe ich die Angewohnheit, alle Installationsdateien von Programmen, die ich benutze, zu archivieren, sodass ich problemlos noch ein Ubuntu Mate von 2017 aus dem Hut zaubern kann. Anwendungen nutze ich gern als AppImage. Aber auch die reinen Installationspakete, unter Debian sind das die deb Dateien, bevorzuge ich gegenüber den Varianten aus dem Paketmanager. Denn manchmal brauche ich eine alte Variante oder eine sehr neue Version, die nicht in den Distributionspaketen enthalten ist. Auf diese Weise lässt sich auch ein in die Tage gekommenes System noch aktuell und sicher halten.

Vermutlich ist es wie so oft. Keine Suppe wird so heiß gegessen, wie sie serviert wird. Ich denke weniger, dass der Zwang zur digitalen ID über Nacht kommen wird. Vermutlich wird es ein schleichender Prozess, der den Menschen, die sich der totalen Kontrolle durch autoritäre Instanzen entziehen, das Leben schwer macht. Es wird sich durchaus für entschlossene Menschen immer ein Weg finden. Dazu muss man allerdings selbst aktiv werden und nicht passiv auf den großen Erlöser warten. Der war schon da, vor sehr langer Zeit.

Eine Handvoll JAVA – Key Features der einzelnen Versionen

Die objektorientierte Programmiersprache Java wurde von James Gosling entworfen. Die erste Version wurde 1995 von der Firma Sun Microsystems veröffentlicht. Nach der Übernahme von Sun Microsystems durch Oracle im Jahr 2010 wurde Java Teil des Oracle Produktportfolios.

zu letzt geändert:

Die Java Serie

  • Java 21 LTS
  • Java 20
  • Java 19
  • Java 18
  • Java 17 LTS
  • Java 16
  • Java 15
  • Java 14
  • Java 13
  • Java 12
  • Java 11 LTS
  • Java 10
  • Java 9
  • Java 8
  • Java 7
  • Java 6
  • Java 5 / J5SE
  • Java 1.4
  • Java 1.3
  • Java 1.2 / Java2

Um Java-Programme auf dem Computer ausführen zu können, wird eine sogenannte virtuelle Maschine benötigt. Der Download dieser JVM heißt JRE (Java Runtime Environment). Wer selbst in der Programmiersprache Java entwickeln möchte, benötigt den zugehörigen Compiler, der unter dem allgemeinen Begriff SDK (Software Development Kit) oder etwas spezieller als JDK (Java Development Kit) bekannt ist. Das JDK enthält natürlich auch die dazu passende Laufzeitumgebung (die JVM).

Mit dem Erscheinen des Releases für Java 9 im September 2017 gab Oracle einen 6-monatigen Releasezyklus für künftige Java Versionen bekannt. Somit erscheint jedes Jahr im März und im September eine neue Version der beliebten Programmiersprache. Aber keine Sorge, es ist nicht notwendig, den Lizenzbestimmungen von Oracle zu folgen und in diesem Turnus die eigene Java Version zu aktualisieren. Um Unternehmen genügend Stabilität für die IT‑Infrastruktur zu bieten, erscheint jedes sechste Java Release als sogenanntes LTS (Long Term Support) und hat eine Laufzeit von drei Jahren, ab Erscheinen. Hierzu habe ich bereits einen tieferführenden Artikel veröffentlicht.

Mit dem häufigen Releasezyklus kommen natürlich auch mit jeder neuen Java-Version einige neue Schlüsselfunktionen in den Sprachkern. Hier kann man schnell den Überblick verlieren. Folglich habe ich eine kleine Übersicht zusammengetragen. Wer sich zusätzlich einen Überblick über die einzelnen Java Enterprise Versionen verschaffen möchte, dem sei mein entsprechender Artikel zu Java EE empfohlen.

Versionsübersicht

Um uns nicht zu sehr in Details zu verstricken, beginne ich mit der Version 1.2, die auch als JAVA 2 bekannt ist und 1998 veröffentlicht wurde. Die wichtigsten Funktionen von Java2 sind die grafische SWING API und die Vorstellung des Just In Time Compliers (JIT).

Im Jahr 2000 erschien die Version 1.3 mit Funktionen wie JNDI (Java Naming and Directory Interface) sowie JPDA (Java Platform Debugger Architecture).

Gleich zwei Jahre später, im Jahr 2002, erschien die Version 1.4, die, die verfügbare Standardbibliothek um Funktionen wie reguläre Ausdrücke, Logging API, integrierten XML & XSLT Prozessor, Image I/O API und New I/O erweiterte.

Mit der 2004 veröffentlichten Version 1.5 änderte sich auch die Bezeichnung beziehungsweise die Zählweise der Versionen. Java wird als Majorversion hochgezählt, was so viel bedeutet, dass man fortan von JAVA5 spricht. Ganz der Analogie, wie es bereits bei der Version 1.2 der Fall war. Die Java5 Standardedition (SE), oder kurz J5SE bringt eine Menge Änderungen für den Entwickleralltag, Dazu zählen: Autoboxing/ Unboxing, Annotations, Enums und Generics.

Die 2006 erschienene Java6 SE erweiterte die XML Funktionalität mit dem StAX Parser, stellte JAX-WS für Web Services bereit und brachte den Scripting Language Support, der es ermöglichte, Skriptsprachen wie JavaScript auf der JVM auszuführen. Wichtigste Vertreter sind die beiden JVM‑Sprachen Kotlin (2011, JetBrains) und Scala (2004).

Lange fünf Jahre später und erstmalig unter der Regie von Oracle erblickte Java7 SE 2011 das Licht der Welt. In diesem Java Release wurde der Diamond Operator <> eingeführt. Weitere Maßnahmen, die Sprache zu vereinfachen und die Ausdruckstärke zu erhöhen, waren die Vereinfachung der varargs-Methoden-Deklaration und die Möglichkeit, in Switch-Anweisungen Strings zu verwenden. Auch auf die Aussagen, Exceptions seien langsam und sollten sparsam benutzt werden, wurde Rechnung getragen und das Exception-Handling verbessert.

// Diamond Operator
List<String> myList = new ArrayList<>();

// varargs (variable-length arguments)
public void myMethod(String... args);

Java8 SE machte mit der Erscheinung 2014 wieder einen erheblichen Schritt. In diesem Release spendierte Oracle der Java Community lang ersehnte Features wie Lambdafunktionen und die Stream API, um die wichtigsten Neuerungen herauszugreifen. Zudem wurde die Date & Time API komplett überarbeitet und Änderungen von der bis dahin weitverbreiteten JODA-Time Bibliothek inspiriert.

// ForEach Lambda
myList.forEach(element -> System.out.println(element));

//Stream API
myList.stream()
    .filter(element -> element.startsWith("A"))
    .forEach(System.out.println); 

Mit dem Release 2017 für Java9 SE kam eine Zäsur. Wegen der Einführung des Modulsystems wurde die gesamte Standardbibliothek umgearbeitet, damit die einzelnen APIs nicht mehr in einer gigantischen JAR zusammengefasst sind. Die dadurch entstandenen Module haben nun weniger Speicher in Anspruch genommen. Die massiven Änderungen erforderten für viele bereits langjährige Projekte enorme Kräfte, auf die neue Java Version zu migrieren. Außerdem wurde mit Java9 die Java Shell, kurz JShell eingeführt. Ein Kommandozeilenwerkzeug, in dem Javafunktionen als Script ausgeführt werden können.

// module-info.java
module com.example.myapp {
  requires java.base;
  exports com.example.myapp;
}

Weitere erhebliche Veränderungen brachte das Release Java10 SE, welches nur wenige Monate nach Java9 in 2018 veröffentlicht wurde und weitere Migrationsaufwände nach sich zog. Hier wurde das Local-Variable-Type Interface mit dem zugehörigen Schlüsselwort var eingeführt. Zudem startet mit dem Release 10 auch das Time-Based Versioning für die Sprache Java. Im Zyklus von 6 Monaten kommt eine neue Major-Version jeweils im März und September. Alle 3 Jahre wird eine LTS-Version veröffentlicht.

// the var KeyWord
public static void main(String[] args) {
  var message = "Hello World, Java10!";
  System.out.println(message);
}


Bereits im Herbst 2018 wurde die erste Langzeitversion für Java veröffentlicht. Das Release Java11 besitzt den Zusatz LTS und erhält für 3 Jahre Updates. Aufgrund der kurzen Releaszyklen enthält diese Version nur wenige API Änderungen. Vor allem die Klasse String bekam viele neue Methoden spendiert, die den Umgang mit Zeichenketten vereinfachen sollen.

// String FUnctions
String text = new String(" Helle Java 11 LTS world! ");
text.strip();
text.isBlank();
text.lines().count();

Die wichtigste Änderung der im Frühjahr 2019 erschienenen Java12 SE Version, ist neben einigen API Erweiterungen die Möglichkeit, in switch Anweisungen Expressions zu nutzen.

// switch expressions
Var day = 1;
String weekday = switch(day) {
    default -> "";
    case 1 -> "Monday";
    case 2 -> "Tuesday";
    ...  
}

Java13 SE erschien planmäßig im Herbst 2019 und verbesserte die Expressions in switch Anweisungen. Zudem wurden Textblöcke eingeführt, die ressourcenfressende String‑Konkatenationen überflüssig machen.

// textblock
String text = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim 
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut 
aliquip ex ea commodo consequat. Duis aute irure dolor in 
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla 
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in 
culpa qui officia deserunt mollit anim id est laborum.
""";

Mit dem Release für Java14 SE im März 2020 wurden Records eingeführt. Diese Datenstrukturen sollen den Code kompakter und lesbarer machen, da Getter und Setter nicht mehr explizit definiert werden müssen.

// records
public record Person (String name, String address) {}

Das im Herbst 2020 erschienene Release Java15 SE standardisierte die Textblöcke und führte sealed Klassen ein. Sealed bedeutet so viel wie versiegelt und unterbindet die Möglichkeit, dass eine Klasse vererbt werden kann.

// inheritance protection
public sealed class Shape permits Circle {
    // Class body
}

public final class Circle extends Shape {
    // Class body
}

2021 standardisierte das Release für Java16 SE verschiedene Funktionen, unter anderem Sealed Classes, Pattern Matching für instanceof und Records.

// Pattern Matching instanceof with auto cast
if (obj instanceof String s) {
    System.out.println(s);
}

Java17 SE LTS, erschien wieder planmäßig im Herbst 2021 und löste nach drei Jahren Java11 SE LTS ab. In dieser Version wurden die Java Applet API und der Security Manager als deprecated markiert.

Die Version Java18 SE setzte die UTF-8-Codepage als Standard für die JVM. Außerdem wurde die Vector API mit dem Status „experimental“ eingeführt.

// Java Vector API
import jdk.incubator.vector.*;
import java.util.Random;

public class VectorExample {
    // Use preferred vector species for optimal CPU performance
    static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;

    // Vectorized implementation using the Vector API
    static void sqrtsumVector(float[] a, float[] b, float[] c) {
        int i = 0;
        int upperBound = SPECIES.loopBound(a.length); // Efficient loop bound

        // Process data in chunks matching the vector length
        for (; i < upperBound; i += SPECIES.length()) {
            var va = FloatVector.fromArray(SPECIES, a, i);
            var vb = FloatVector.fromArray(SPECIES, b, i);
            var vc = va.mul(va)           // a[i]²
                      .add(vb.mul(vb))    // + b[i]²
                      .neg();             // - (a[i]² + b[i]²)
            vc.intoArray(c, i);           // Store result
        }

        // Handle remaining elements (tail case) with scalar loop
        for (; i < a.length; ++i) {
            c[i] = -(a[i] * a[i] + b[i] * b[i]);
        }
    }
}   

Das Ende 2022 erschienene Release Java19 SE brachte neben einigen Optimierungen und integrierte das Projekt Loom um virtuelle Threads zu ermöglichen. Auch die Foreign Function & Memory API fand ihren Einzug in die JVM.

// Natice C Memory allocation & Slicing in Java 
Arena arena = Arena.ofAuto();
MemorySegment memorySegment = arena.allocate(12);

MemorySegment segment1 = memorySegment.asSlice(0, 4);
MemorySegment segment2 = memorySegment.asSlice(4, 4);
MemorySegment segment3 = memorySegment.asSlice(8, 4);

VarHandle intHandle = ValueLayout.JAVA_INT.varHandle();

intHandle.set(segment1, 0, Integer.MIN_VALUE);
intHandle.set(segment2, 0, 0);
intHandle.set(segment3, 0, Integer.MAX_VALUE);

Java20 SE, das wie gewohnt im Frühjahr erschien, brachte 2023 keine neuen Funktionen, sondern konzentrierte sich darauf, dass bereits eingeführte Features stabilisiert wurden.

Im Herbst 2023 erschien mit Java21 SE LTS wieder eine Long Term Support Version. In diesem Release wurden Virtual Thread finalisiert.

public class VirtualThreadsExample {
  public static void main(String[] args) throws
InterruptedException {
    var executor =
      Executors.newVirtualThreadPerTaskExecutor();
    executor.submit( () ->
      System.out.println("Running in virtual thread"));
    executor.submit( () ->
      System.out.println("Running another virtual thread"));
    Thread.sleep(1000);
    complete
  }
}

Performante Hardware unter Linux für lokale KI Anwendungen

Wer ein wenig mit lokalen LLM herumspielen möchte, findet rasch die Limitationen heraus. Nicht jeder hat einen massiv aufgerüsteten Desktop Rechner mit 2 TB Arbeitsspeicher und eine CPU, auf der man unter Volllast Spiegeleier braten kann. Eher typisch ist ein Laptop mit 32 GB RAM oder wie bei mir, ein Lenovo P14s mit 64 GB RAM. Trotz dieser üppigen Ausstattung scheitert es oft daran, ein etwas umfangreicheres KI Modell zu laden, denn 128 GB RAM sind für viele dieser Modelle eher Standard. Nun kann man bei aktuellen Laptops auch keinen Arbeitsspeicher nachrüsten, weil die Chips direkt auf der Platine verlötet sind. Das gleiche Problem haben wir natürlich auch mit der Grafikkarte. Deswegen habe ich mir beim Laptopkauf angewöhnt, nahezu die Maximalausstattung zu konfigurieren, und hoffe dann, damit 5–8 Jahre lang meine Ruhe zu haben. Gerade die Qualität der Lenovo ThinkPad Serie hat mich bisher bei diesem Vorhaben nicht enttäuscht. Mein aktuelles System ist circa 2 Jahre alt und läuft so weit zuverlässig.

Als Betriebssystem nutze ich seit Jahren Linux und aktuell habe ich Debian 13 am Laufen. Im Vergleich zu Windows sind Linux- und Unix-Distributionen wesentlich ressourcenschonender und nutzen die Leistung nicht für grafische Animationen und komplexe Farbverläufe, sondern ermöglichen eine leistungsstarke Umgebung für die verwendeten Anwendungen. Daher auch mein dringender Rat, für alle, die lokale LLMs probieren möchten: sich einen leistungsstarken Rechner zu besorgen und diesen mit Linux zu betreiben. Aber der Reihe nach. Schauen wir uns zuerst die einzelnen Hardwarekomponenten etwas genauer an.

Beginnen wir mit der CPU. Für LLMs, CAD Anwendungen und auch Computerspiele gilt, dass diese Berechnungen durchführen, die hervorragend parallel verarbeitet werden können. Bei parallel ausgeführten Berechnungen ist die Anzahl der verfügbaren CPU‑Kerne ein wichtiges Kriterium. Je mehr Kerne, umso mehr parallele Berechnungen können ausgeführt werden.

Natürlich müssen die Prozessoren die Daten für die Berechnung schnell anfragen können. Hier kommt der Arbeitsspeicher (RAM) ins Spiel. Je mehr Arbeitsspeicher vorhanden ist, umso effizienter können die Daten zur Berechnung bereitgestellt werden. Bezahlbare Laptops kann ma bereits mit 32 GB RAM finden. Natürlich steigt der Anschaffungspreis mit mehr RAM exponentiell. Sicher gibt es einige hochgezüchtete Gamer-Geräte im Consumerbereich, die ich allerdings wegen der meist kurzen Lebensdauer und dem dazu vergleichsweise hohen Preis eher nicht empfehlen kann.

Der nächste logische Schritt in der Hardwarekette ist die Festplatte. Einfache SSDs beschleunigen den Transfer zum Arbeitsspeicher enorm, aber es gibt noch Steigerungen. NVMe Karten ab 2 GB Speicherkapazität können in der 4. Generation bis zu 7000 MB/s erreichen.

Bei der Grafikkarte haben wir bei Laptops so unsere Probleme. Aufgrund der Größe und der benötigten Leistung , sind die in Laptops verbauten Grafikkarten eher ein Kompromiss, als ein wirkliches Highlight. Dabei wäre eine gute Grafikkarte ideal für parallele Berechnungen, wie sie bei LLMs durchgeführt werden. Als Lösung können wir den Laptop mit einer externen Grafikkarte verbinden. Dank der Bitcoin Miner aus der Krypto Community wurde hier bereits einiges an Erfahrung gesammelt. Damit man allerdings eine externe Grafikkarte an den Laptop anschließen kann, muss man auch einen Anschluss haben, der diese Datenmenge verarbeiten kann. USB 3 ist für unser Vorhaben viel zu langsam und würde den Vorteil der externen Grafikkarte durch die geringe Datenrate massiv ausbremsen.

Die Lösung für unser Problem lautet Thunderbolt. Äußerlich sehen Thunderbolt-Anschlüsse wie USB-C aus, sind aber um einiges schneller. Thunderbolt erkennt man an dem kleinen Blitz (siehe Abbildung 1) auf den Kabeln, beziehungsweise an den Buchsen. Es sind also nicht die Anschlüsse für die Stromversorgung. Um sicherzustellen, ob man auf dem Computer Thunderbolt zur Verfügung hat, kann man dies mit einem kleinen Linux Shell Befehl nachprüfen.

ed@local: $ lspci | grep -i thunderbolt
00:07.0 PCI bridge: Intel Corporation Raptor Lake-P Thunderbolt 4 PCI Express Root Port #0
00:07.2 PCI bridge: Intel Corporation Raptor Lake-P Thunderbolt 4 PCI Express Root Port #2
00:0d.0 USB controller: Intel Corporation Raptor Lake-P Thunderbolt 4 USB Controller
00:0d.2 USB controller: Intel Corporation Raptor Lake-P Thunderbolt 4 NHI #0
00:0d.3 USB controller: Intel Corporation Raptor Lake-P Thunderbolt 4 NHI #1

In meinem Fall zeigt mir die Ausgabe meines Computers, dass zwei Thunderbolt Anschlüsse in der Version 4 vorhanden sind.

Um nun eine externe Grafikkarte anzuschließen, benötigen wir ein Trägersystem, auf das eine PCI Karte gesteckt werden kann. Hier bietet die Firma ANQUORA mit dem ANQ-L33 eGPU Enclosure eine gute Lösung. Das Board kann eine Grafikkarte mit bis zu drei Slots aufnehmen. Der Kostenpunkt liegt zwischen 130 und 200 Euro. Hinzu kommt noch ein Standard ATX Netzteil, das für die Stromversorgung benötigt wird. Die Leistung des Netzteils ergibt sich aus dem Stromverbrauch der Grafikkarte. Das Netzteil sollte man auch nicht zu günstig einkaufen, da die Geräuschentwicklung den ein oder anderen stören könnte. Die offene Bauform des Boards gibt genügend Freiheiten bei der Auswahl der Grafikkarte.

Die Auswahl der Grafikkarte wiederum ist ein ganz eigenes Thema. Da ich als Betriebssystem Linux verwende, benötige ich auch eine Grafikkarte, die von Linux unterstützt wird. Für die Beschleunigung von LLMs benötigt man eine Grafikkarte mit möglichst vielen GPU Kernen und entsprechend hohem internen Arbeitspeicher. Damit sich die Anschaffung auch lohnt und man wirklich einen Leistungsschub bemerkt, sollte die Karte mit mindestens 8 GB RAM ausgestattet sein. Mehr darf natürlich immer sein, nur steigt dann auch der Preis der Karte schnell exorbitant an. Hier lohnt sich durchaus auch ein Blick in den Gebrauchtmarkt.

Rechnet man alle Kosten zusammen, beläuft sich die Investition für eine externe GPU auf mindestens 500 Euro. Natürlich ist hier nur eine preiswerte Grafikkarte mit berücksichtigt. Hochwertige Grafikkarten können allein bereits problemlos die 500 Euro Priesbremse überschreiten. Wer im Bereich Grafikkarten gern seine Expertise beisteuern möchte, ist gern eingeladen, einen Artikel beizusteuern.

Damit man nun seine Einkaufstour nicht auf Blaue beginnt und dann über das Ergebnis enttäuscht ist, ist es sehr ratsam, sich vorher zu überlegen, was man mit der lokalen LLM machen möchte. Zur Unterstützung bei der Programmierung benötigt man weniger Rechenpower als für die Generierung von Grafiken und Audio. Wer LLMs professionell nutzt, kann durch die Anschaffung einer sehr hochpreisigen Grafikkarte durch selbst gehostete Modelle im Vergleich zu den Kosten für beispielsweise Claud Code erheblich einsparen. Die Spezifikation von LLMs richtet sich nach den verfügbaren Parametern. Hier gilt: Je mehr Parameter, umso genauer ist die Antwort und umso mehr Rechenleistung wird benötigt. Bei der Genauigkeit unterscheidet man zudem:

  • FP32 (Single-Precision Floating Point): Standardgenauigkeit, benötigt den meisten Speicherplatz. (z.B. 32 Bit pro Parameter)
  • FP16 (Half-Precision Floating Point): Halbe Genauigkeit, halbiert den Speicherbedarf im Vergleich zu FP32, kann aber die Genauigkeit leicht reduzieren. (z.B. 16 Bit pro Parameter / 4Byte)
  • BF16 (Brain Floating Point): Eine weitere Option für halbgenaue Berechnungen, oft bevorzugt in Deep Learning aufgrund seiner besseren Leistung bei bestimmten Operationen. (z.B. 16 Bit pro Parameter / 2 Byte)
  • INT8/INT4 (Integer Quantization): Noch geringere Präzision, reduziert den Speicherbedarf drastisch und beschleunigt die Inferenz, kann aber zu einem größeren Genauigkeitsverlust führen. (z.B. 8 Bit pro Parameter / 1 Byte).

Weitere Einflüsse auf die Hardwareanforderungen für LLM haben die Punkte:

  • Batch Size: Die Anzahl der Eingabeanfragen, die gleichzeitig verarbeitet werden.
  • Kontextlänge (Context Length): Die maximale Länge des Textes, den das Modell bei einer Anfrage berücksichtigen kann. Längere Kontextlängen benötigen mehr Speicherplatz, da der gesamte Kontext im Speicher gehalten werden muss.
  • Modellarchitektur: Verschiedene Architekturen haben unterschiedliche Speicheranforderungen.

Um abzuschätzen, wie hoch der Speicherverbrauch eines Modells wird, kann man folgende Berechnung heranziehen: Parameter * Genauigkeit = Speicherverbrauch für das Modell.

7.000.000.000 Parameter * 2 Bytes/Parameter (BF16) = 14.000.000.000 Bytes = 14 GB

Bei den Hardwareempfehlungen sollte man auf die Dokumentation des Modells Rücksicht nehmen. Diese geben meist nur die minimalen beziehungsweise durchschnittlichen Anforderungen an. Es gibt allerdings allgemeine Richtwerte, an dene man sich orientieren kann.

  • Kleine Modelle (bis 7 Milliarden Parameter): Eine GPU mit mindestens 8 GB VRAM sollte ausreichen, besonders wenn Sie Quantisierung verwenden.
  • Mittlere Modelle (7-30 Milliarden Parameter): Eine GPU mit 16 GB bis 24 GB VRAM ist empfehlenswert.
  • Große Modelle (über 30 Milliarden Parameter): Mehrere GPUs mit jeweils mindestens 24 GB VRAM oder eine GPU mit sehr viel VRAM (z.B. 48 GB, 80 GB) sind erforderlich.
  • CPU-only: Für kleine Modelle und einfache Experimente kann die CPU ausreichend sein, aber die Inferenz wird deutlich langsamer sein als auf einer GPU. Hier ist ein großer RAM-Bedarf wichtig (mehrere GB / 32+).

Wir sehen, dass die Nutzung lokal laufender LLMs durchaus realistisch sein kann, wenn man die entscheidende Hardware vorrätig hat. Es muss nicht immer gleich ein Supercomputer sein, dennoch sind die meisten Lösungen bei den üblichen Elektronikkaufhausketten von der Stange und nicht wirklich geeignet. Somit habe ich mit diesem Artikel die Grundlagen für eigene Experimente gelegt.


Risiko Cloud & Serverless

Die Wolke ist eine der innovativsten Entwicklungen, seit der Jahrtausendwende und ermöglicht uns eine flächendeckende Nutzung neuronaler Netze, die wir im Volksmund als Large Language Models (LLM) bezeichnen. Dieser Technologiesprung ist nur noch durch Quantencomputing zu übertreffen. Aber genug der Buzzwords für die SEO-Optimierung, stattdessen schauen wir einmal hinter die Kulissen. Beginnen wir erst einmal damit, was Cloud überhaupt ist, und legen dafür die ganzen Marketingbegriffe einmal beiseite.

Am besten kann man sich die Wolke als gigantischen Supercomputer vorstellen, der aus vielen kleinen Computern bausteinartig zusammengesetzt wurde. Dadurch hat man theoretisch beliebig viel CPU‑Leistung, Arbeitsspeicher und Festplattenspeicher zusammenschalten. Auf diesem Supercomputer, der in einem Rechenzentrum läuft, können nun wiederum virtuelle Maschinen bereitgestellt werden, die einen echten Computer mit einer freidefinierbaren Hardware simulieren. Auf diese Weise können die physischen Hardwareresourcen optimal auf die bereitgestellten virtuellen Maschinen aufgeteilt werden.

Bei Cloud unterscheiden wir grob drei unterschiedliche Betriebslevel: Infrastructure as a Service (IaaS), Platform as a Service (PaaS) und Software as a Service. Die nachfolgende Abbildung gibt eine Vorstellung davon, wie sich diese Ebenen aufteilen.

Vereinfacht kann man sagen, dass bei IaaS durch den Anbieter lediglich die Hardwarespezifikation bereitgestellt wird. Also CPU, RAM, Festplatte und Internetanschluss. Über die Administrationssoftware z. B. Kubernetes kann man nun eigene virtuelle Maschinen/Container erstellen und die entsprechenden Betriebssysteme und Services selbst installieren. Die gesamte Verantwortung der Sicherheit und des Netzwerkrouting liegt hier beim Kunden selbst. PaaS hingegen stellt bereits eine rudimentär eingerichtete virtuelle Maschine inklusive des ausgewählten Betriebssystems bereit. Was man schlussendlich auf diesem System oberhalb der Betriebssystemebene installiert, ist einem selbst überlassen. Aber auch hier ist das Thema Sicherheit zu großen Teilen in den Händen des Kunden. Bei den meisten Hostinganbietern sind typische PaaS-Produkte sogenannte virtuelle Server. Die geringste Freiheit haben Nutzer bei SaaS. Hier hat man meist nur die Berechtigung, durch ein Benutzerkonto eine Software zu nutzen. Sehr typische SaaS Produkte sind E-Mail Konten, aber auch sogenannte Managed Server. Managed Server findet man größtenteils zum Bereitstellen von eigenen Internetseiten. Hier wird die Version der Programmiersprache und der Datenbank durch den Betreiber des Servers vorgegeben.

Gerade die Managed Server haben eine lange Tradition. Sie kamen zur Jahrtausendwende auf um eine sofort benutzbare Umgebung für dynamische PHP Webseiten mit MySQL Datenbankanbindung bereitzustellen. Ähnlich verhält es sich mit den neu in Mode gekommenen Serverless Produkten. Je nach Erfahrungslevel kann man nun bei den Großen Anbietern AWS, Google und Microsoft Azure entsprechende Produkte kaufen.

Der Gedanke ist also, keine eigenen Server mehr für die Dienste zu betreiben und somit den kompletten Aufwand für Hardware, Betrieb und Sicherheit an die Cloudbetreiber auszulagern. Grundsätzlich ist das auch kein schlechter Gedanke, besonders wenn es sich um kleine Unternehmen oder Startups handelt, die einerseits nicht viele finanzielle Mittel zur Verfügung haben oder ihnen einfach das administrative Know-how für Netzwerk, Linux und Serversicherheit fehlt.

Natürlich kommt man mit vollständig extern verwalteten Serverless Angeboten auch schnell an Grenzen. Gerade wenn man die eigene entwickelte Individualsoftware Serverless mit möglichst wenig Aufwand in der Cloud bereitstellen möchte, kommt man an so manchem Stolperstein vorbei. Ein Problem ist oft die flexible Erweiterbarkeit bei wechselnden Anforderungen. Sicher kann man hier aus dem Portfolio der verschiedenen Anbieter Produkte zukaufen und diese wie ein Bausteinset beliebig kombinieren, aber die anfallenden Kosten können sich dabei schnell überschlagen.

Grundsätzlich ist an einem pay per use Modell (also bezahle, was du verwendest) nichts auszusetzen. Für Personen und Organisationen mit kleinem Geldbeutel ist das auf den ersten Blick keine schlechte Lösung. Aber auch hier sind es die kleinen Details, die schnell zu ernsthaften Problemen anwachsen können.

Wenn man sich für einen beliebigen Cloudanbieter entscheidet, ist man gut beraten, möglichst auf dessen proprietäre Management- und Automatisierungsprodukte zu verzichten und stattdessen nach Möglichkeit auf etablierte allgemeine Produkte auszuweichen. Bindet man sich mit allen Konsequenzen an einen Anbieter, so wird es nur unter sehr großem Aufwand möglich sein zu einem anderen Anbieter z wechseln. Änderungen der AGB oder kontinuierlich steigende Kosten sind mögliche Gründe für einen erzwungenen Wechsel. Daher prüfet, wer sich ewig bindet.

Aber auch unbedachte Ressourcennutzung in Cloudsystemen, z. B. durch falsche Konfigurationen oder ungünstige Deploy-Strategien, kann zu einer Kostenexplosion führen. Hier ist man gut beraten, wenn es die Möglichkeit gibt, Limits einzustellen, diese zu aktivieren. sodass man ab einem bestimmten Betrag darauf hingewiesen wird, dass nur noch ein ‚bestimmtes‘ Kontingent zur Verfügung steht. Gerade bei hochverfügbaren Diensten, die plötzlich sprunghaft enorm viele neue Anwender bekommen, können schnell durch solche Limits vom Netz abgestöpselt werden. Daher ist man immer gut beraten, möglichst zwei Lösungen im Bereich Cloud zu nutzen, eine für Entwicklung und eine separate für das Produktivsystem, um das Offlinerisiko zu minimieren.

Ähnlich wie beim Trading an der Börse, kann man auch bei Cloud Services wie AWS Schranken definieren. Die Stops an der Börse sollen verhindern, dass man eine Aktie nicht zu billig verkauft oder zu teuer einkauft. Durch das Pay per Use Modell ist es in der Cloud nicht viel anders. Hier muss man beim Anbieter geeignete Grenzen setzen, die verhindern, dass die Rechnung den Verfügungsrahmen des Kontos sprengt. Auch in der Cloud sind die Grenzen dynamisch. Das heißt, die Rahmenbedingungen verändern sich stetig, was bedeutet, dass die notwendigen Grenzen regelmäßig den Erfordernissen angepasst werden müssen. Um Engpässe rechtzeitig zu erkennen, sollte ein aussagekräftiges Monitoring etabliert sein. Die Mindestanforderung für ein AWS Node wird durch dessen Requests bestimmt. Die obere Schranke der verfügbaren Ressourcen wird durch das Limit bestimmt. Mit Werkzeugen wie Kubecost von IBM lässt sich die Kostenüberwachung in K8 Clustern weitgehend automatisieren.

Für Cloudentwicklungsumgebungen sollte man den eigenen Entwickler‑ und DevOps-Team auch ein wenig auf die Finger schauen. Wenn für eine einfache JavaScript Angular App ein NPM Docker Container von über 2 GB jedes Mal on the fly erstellt wird, sollte man diese Strategie durchaus hinterfragen. Auch wenn die Cloud scheinbar unendlich viele Ressourcen dynamisch allokieren kann, heißt das nicht, dass dies dann auch kostenfrei passiert.

Natürlich ist auch das Thema Sicherheit ein wichtiger Faktor. Natürlich kann man dem Cloudbetreiber so weit vertrauen, wenn er sagt, dass alles verschlüsselt ist und ein Zugriff auf Kundendaten und Geschäftsgeheimnisse nicht möglich ist. Sicher kann man davon ausgehen, dass die Informationen, die bei den meisten Unternehmungen abzugreifen sind, selten einen spannenden oder gar aufregenden Inhalt haben, der für große Cloudbetreiber von Interesse sein könnte. Wer dennoch auf Nummer sicher gehen möchte, sollte das Thema Serverless vollständig abschreiben und eher mit dem Gedanken spielen, seine eigene Cloud zu betreiben. Das geht dank moderner und freier Software mittlerweile leichter als gedacht.

Aus persönlicher Erfahrung habe ich gelernt, dass bei der Komplexität moderner Webanwendungen ein effizientes Monitoring mit Grafana und Prometheus oder anderen Lösungen wie dem ELK Stack oder Slunk unverzichtbar ist. Doch gerade mit der Datenerhebung und der richtigen Auswertung haben so manche DevOps Teams so ihre Schwierigkeiten. Hier sind vor allem die IT-Entscheider gefragt, sich einen technischen Überblick zu verschaffen, um nicht auf die wohlklingenden Marketingfallen bei Cloud und Serverless hereinzufallen.


Soviel die Schutern tragen können

Eine Erzählung über das Leben, den Jakobsweg und den inneren Frieden.

Erhältlich als: Taschenbuch / Kindle E-Book

Mit einem Geleitwort von Anasatsia Umrik

Wer bis an das Ende der Welt gehen möchte, ist gut beraten, sich zu überlegen, mit welcher Last man sich auf den Weg macht. Die Entscheidungen, die wir treffen, können einen Spaziergang schnell in eine Qual verwandeln. Eine wirkliche Freiheit erlangen wir, indem wir lernen, uns nicht an unnötige Dinge zu klammern. In diesem kleinen Buch erzähle ich meine Geschichte. Ich beschreibe, wie ich über das Loslassen in die persönliche Unabhängigkeit gelangen konnte. Vielleicht finden sie in meinen Zeilen die Inspiration, einen eigenen Weg zu beginnen. Es würde mich freuen, den Anstoß zu einer positiven Veränderung beitragen zu können.

Marco Schulz, published 05/2024 / 2. Auflage / 137 Seiten / ISBN: 979-8282740042


Der Blog [EnRebaja.wordpress.com] der während des Jakonsweges entstanden ist, enthält natürlich noch viele weitere interessante Geschichten. ein BEsuch dort lohnt sich durchaus.