jboss eap 8 upgrade
  • JBoss EAP
  • Learning Friday

JBoss EAP 8 Upgrade - Follow up

Wie bereits in Teil 1 & 2 unserer JBoss EAP Upgrade Serie beschrieben, haben wir unsere Erkenntnisse über das Major-Upgrade in 4 Teilen beschrieben. In diesem Beitrag sind die letzten beiden Teile zusammengefasst.

Teil 3: Elytron Security Subsystem

Das Elytron Security Subsystem gibt es bereits seit EAP 7.1. Allerdings wurde in den EAP 7.x Versionen parallel noch das frühere Security Subsystem unterstützt, das jetzt als Legacy-Subsystem bezeichnet wird. Wir vermuten daher, dass in vielen Organisationen nicht auf Elytron umgestellt wurde.

Was ist mit Legacy Security?

In der Praxis haben wir viele Erfahrungen mit Systemen gesammelt, in denen selbst geschriebene Login-Module eingesetzt werden. Grundsätzlich ist es kein Problem, wenn das Know-How und der Source-Code vorhanden sind, bzw. wenn es Ressourcen für die Migration der Login-Module auf Elytron gibt. Es kann aber immer wieder vorkommen, dass eigene Login-Module auf EAP8 AS-IS weiterverwendet werden müssen. Ist es möglich und wenn ja, wie aufwändig ist es, einen „Adapter“ einzurichten? Wir wollten diese Fragen beantworten und haben ein eigenes Login-Modul für das alte Security-Subsystem implementiert. Im Wesentlichen ist das eine Implementierung des Interfaces javax.security.auth.spi.LoginModule.

Kurze Antwort: Ja, das ist möglich. Wir haben dazu den JAAS-Realm von Elytron verwendet.

Welche Schritte sind dafür nötig?

Zuerst wird die Login-Modul Klasse in ein JBoss-Modul (com.gepardec.training.jboss.loginmodule) gepackt und im modules Verzeichnis abgelegt. Die Konfiguration des Login-Moduls erfolgt nicht mehr in der standalone.xml, sondern in einer eigenen JAAS Login Configuration Datei. Diese hat folgende Struktur.

<name used by application to refer to this entry> {
   <LoginModule> <flag> <LoginModule options>;
   <optional additional LoginModules, flags and options>;
};

In unserem Beispiel speichern wir

test {
com.gepardec.training.jboss.loginmodule.SimpleUsersRolesLoginModule required 
       user1=max password1="max@123" role1=users
       user2=moritz password2="moritz@123" role2=friends
    ;
};

in einer Datei namens JAAS-login-modules.conf im Konfigurationsverzeichnis der JBoss-Instanz. Unser LoginModul kennt nur zwei Benutzer, die direkt in der JAAS Login Configuration konfiguriert werden. Für Produktion ist so ein LoginModul natürlich nicht geeignet.

 Zuletzt konfigurieren wir noch den jaas-realm im Elytron Subsystem mittels JBoss-CLI:

set CONFIG_DIR=`:resolve-expression(expression=${jboss.server.config.dir})`

/subsystem=elytron/jaas-realm=myAppsRealm:add(\
    entry=test,\
    path=$CONFIG_DIR/JAAS-login-modules.config,\
    module=com.gepardec.training.jboss.loginmodule)

/subsystem=elytron/security-domain=myapps:add(\
    default-realm=myAppsRealm,\
    realms=[{realm=myAppsRealm}],\
    permission-mapper=default-permission-mapper)

/subsystem=elytron/http-authentication-factory=example-loginconfig-http-auth:add(\
    http-server-mechanism-factory="global",\
    mechanism-configurations=[{mechanism-name="BASIC",\
    mechanism-realm-configurations=[{realm-name="FSRealmUsers"}]}],\
    security-domain=myapps)

/subsystem=undertow/application-security-domain=myapps:add(\
    security-domain=myapps)

Der Workaround mit CONFIG_DIR ist zugegeben nicht elegant, aber ein Bug WFCORE-6186 verhindert derzeit noch, das bessere relative-to Attribut zu verwenden. Das war’s! Wir haben zuerst unsere Test-Applikation auf EAP 7.4 mit diesem Login-Modul für das Legacy-Security-Subsystem getestet und dann auf EAP 8 mit demselben Login-Modul über JAAS-Realm. Authentifizierung und Autorisierung haben wie erwartet ohne Fehler funktioniert.

Zusammenfassend erscheint uns diese Lösung für Legacy LoginModule durchaus praktikabel. Auch mit umfangreichen Konfigurationsoptionen bleibt die Konfiguration lesbar. Alternativ könnte man die Funktion des LoginModuls neu in einem Security Realm implementieren. Mittel- und langfristig ist das auch empfehlenswert.

Teil 4: Windup

In Teil 2  haben wir EAP 8 erfolgreich installiert und uns auf die Suche nach Sourcen gemacht. Jetzt geht es darum, die Applikationen auf Jakarta 10 zu bringen.

Was ist Windup?

Als Aufwandsminimierer will ich Arbeit nicht doppelt machen und Erkenntnisse, die sich andere mühsam erarbeitet haben, wiederverwenden. Um große Applikationen einfacher (auf JBoss) zu migrieren, wurde Windup entwickelt. Ursprünglich nur für Auswertungen entwickelt, bietet es mittlerweile auch die Möglichkeit OpenRewrite Regeln einzubinden. Damit können Sourcen auch automatisiert verändert werden.

Bevor wir aber in die Funktionen abtauchen, starten wir mit einer Begriffsklärung. Zuerst gibt es das Open Source (Upstream) Projekt  Windup. Darauf aufbauendes hat Red Hat zwei Produkte entwickelt:

MTR ist, ähnlich wie Windup ein Werkzeug, das lokal installiert und ausgeführt werden kann. Es gibt zwei Ausführungsformen, eine Web Console, die auf einem Applikationsserver (Wildfly/EAP) läuft und eine Commandline Applikation (CLI). Für MTR gibt es auch einen Kubernetes Operator, der die Web Console auf Kubernetes installiert.

MTA beinhaltet auch Windup, allerdings ist der Scope ein wenig anders. MTA zielt auf die Modernisierung ganzer Applikationslandschaften, vorrangig für die Migration auf Kubernetes / OpenShift. Es verwendet dafür die Konveyor Projekte (z.B. Tackle) mit deren Hilfe Inventories von Projekten und ein Fragenkatalog für Assessments bereitgestellt werden. Installiert wird MTA über einen Kubernetes Operator.

Installation

Für unsere Versuche haben wir Windup 6.2.1 verwendet. Auf der Downloadseite findet man Zips für die Web Console und CLI. Mit insgesamt über 1,7GB für die Downloads, die ausgepackt ca. 3GB auf die Platte bringen, sind die Pakete  nicht gerade schlank geraten. Hier würde ich mir ein bisschen mehr Bewusstsein über die Beschränktheit von Ressourcen wünschen.

Für die Web Console wird ein WildFly verwendet, der mittels run_windup.sh gestartet wird. Die Web Console benötigt derzeit Java 11, das wie üblich mittels JAVA_HOME Environment Variable gesetzt werden kann.

Analyse

Nach dem Start des Servers ist Windup unter http://localhost:8080/windup-ui/ erreichbar.

Darin kann man ein Projekt anlegen. Windup kann entweder Sourcen oder Binaries analysieren. Durch Angabe des Source Verzeichnisses eines Maven Projektes bekommt man etwas detailliertere Informationen gegenüber einem Binary.

Für die Analyse gibt man an, was die Zielplattform sein soll. Z.B. eap8 und openjdk17 und Jakarta EE9 (wir benötigen eigentlich Jakarta 10, das ist allerdings in unserer Version nicht verfügbar) für die Änderungen im Package Namen.

eap 8 windup create project

Danach kann die Analyse gestartet werden.

Neben einem Überblick über gefundene Issues liefert Windup auch eine ganze Reihe von erkannten Technologien.

eap8 windup analysis

Für jedes Issue wird der genaue Ort in der entsprechenden Datei als auch eine Erklärung angezeigt:

eap8 windup issue
eap8 windup source

Den Aufwand zur Behebung berechnet Windup in “Story Points”. Diese sagen nicht direkt etwas über zu investierende Zeit aus, aber im Vergleich mit anderen Projekten erhält man eine grobe Einschätzung über zu erwartende Aufwände. An diesem Punkt allerdings eine Warnung. Tiefe Trixereien und eigene Eingriffe in den Applicationsserver erkennt Windup nicht. Wenn sowas gemacht wurde, können die Aufwände für die Migration beträchtlich höher sein als Windup berechnet.

Statt mit dem Windup-GUI kann man die Analyse auch mit dem Command Line Interface durchführen:

bin/windup-cli --source eap7 --target eap8 openjdk17 hibernate6 \
    --input /home/esiegl/src/ticket-monster/demo \
    --output /home/esiegl/tmp/reports

Welche Source oder Target Optionen verfügbar sind kann mit –listSourceTechnologies bzw. –listTargetTechnologies ausgegeben werden. Das Ergebnis kann, wie beim GUI, mittels Browser angezeigt werden.

Anpassen der Sourcen

Wenn Windup schon Probleme erkennt, warum repariert es sie dann nicht gleich? Und in einem gewissen Ausmaß kann es das auch. Als Technology Preview beinhaltet Windup OpenRewrite Regeln um z.B. eine Applikation von EAP7 auf EAP8 hochzuziehen. Dies wird mittels Windup CLI gemacht.

Nach Download und Auspacken des Windup CLI Pakets kann z.B. der folgende Befehl ausgeführt werden:

bin/windup-cli --openrewrite \
    --input /home/esiegl/src/ticket-monster/demo \
    -Drewrite.configLocation=\
        `pwd`/rules/openrewrite/jakarta/javax/imports/rewrite.yml \
    -DactiveRecipes=org.jboss.windup.JavaxToJakarta  --goal run

Mit der Regel org.jboss.windup.JavaxToJakarta  ändert Windup (bzw. OpenRewite) z.B. die Namespaces und passt auch einige Dependecies im Maven POM an. Ein paar Punkte, die Windup selbst erkennt, wie z.B. Anpassen des Namspaces in web.xml sind in der OpenRewrite Regel nicht enthalten und bleiben noch für manuelles Ausbessern oder für einen Pull-Request im Windup Projekt.

Fazit

Windup hat im Laufe der Jahre einige Funktionen angesammelt und gibt einen guten Eindruck über eine Applikation. Für den Einsteiger ist es ein wenig unübersichtlich und Bedarf Gewöhnung. Im Hinblick auf die Migration auf EAP8 hat es einige gute Regeln, die beträchtliches Wissen über die notwendigen Änderungen beinhalten. Ein großes Plus ist die Integration mit OpenRewrite, die auch als Technology Preview bereits guten Mehrwert bringt.

Falls man sehr viele JEE Applikationen in seiner Organisation hat und eine OpenShift Installation betreibt, dann lohnt sich auch ein Blick auf das Migration Toolkit for Applications zu werfen. Darin gibt es  noch zusätzliche Features, wie Analyse der Maven Dependencies, aber auch zusätzliche Komplexität. Aber das ist eine andere Geschichte, die vielleicht ein andermal erzählt wird.

Hier gehts zu Teil 1 & 2

geschrieben von:
Erhard & Egor
WordPress Cookie Plugin von Real Cookie Banner