Kategorien: Software-Schutz

CodeMeter Docker-Support

Mit der CodeMeter Version 7.30 wurden mehrere neue Features eingebaut, um das Arbeiten mit geschützten Applikationen in Container-Systemen wie Docker zu verbessern. Mit diesen Änderungen lässt sich CodeMeter ganz im Sinne des Grundprinzips Immer nur eine App pro Container“ betreiben. Und es gibt eine spezielle Bindung für CmActLicenses innerhalb eines Docker-Containers.

Auf einem „normalen“ System geht CodeMeter davon aus, dass die CodeMeter-Bibliotheksfunktionen in der geschützten Applikation einen CodeMeter Lizenzserver auf demselben System vorfinden. Durch die Isolierung der Container sah bisher eine in Container A laufende Applikation einen in einem Container B laufenden CodeMeter Lizenzserver nicht. Dies wird jetzt durch das Hinzufügen eines separaten Netzwerks gelöst.

CodeMeter-Netzwerk

Dieses CodeMeter-Netzwerk muss allen beteiligten Containern hinzugefügt werden. Ebenso muss in allen Containern die Adresse des Containers mit dem CodeMeter Lizenzserver über die Umgebungsvariable CODEMETER_HOST angegeben werden. Eine Erkennung der Containerisierung in der CodeMeter-Bibliothek sorgt dafür, dass diese Umgebungsvariable ausgelesen wird und direkt mit dem CodeMeter Lizenzserver kommuniziert wird. Der CodeMeter Lizenzserver nimmt diese Verbindungen als lokale Verbindungen (und nicht etwa als Netzwerkverbindungen) an. Das heißt insbesondere, dass man von diesem CodeMeter Lizenzserver aus auch Lizenzen verwenden kann, die an einem anderen Host mit CodeMeter als Netzwerkserver bereitgestellt werden.

Schauen wir uns als Beispiel eine Applikation an, die ein Bild mit einem ausgewählten Effekt versieht. Für jedes Bild, das ein Anwender berechnet haben möchte, wird eine Container-Instanz gestartet, die als Einstiegspunkt die geschützte Applikation aufruft. Die Bilddaten und alle gewünschten Parameter werden als Optionen mitgegeben. Sobald die Berechnung erfolgt ist, beendet sich die Applikation und damit auch der Container. Werden mehrere Bilder gleichzeitig oder zeitlich überlappend berechnet, wird jeweils eine Instanz gestartet. Es laufen also mehrere Instanzen parallel. Wenn die Applikation eine CodeMeter-Lizenz zum Betrieb benötigt, greift diese beim Start auf den in der Konfiguration hinterlegten CodeMeter Lizenzserver zu und belegt dort eine Lizenz. Wird die Applikation beendet, gibt sie die belegte Lizenz wieder frei. Üblicherweise läuft in solch einem Szenario daher genau ein Container mit einem CodeMeter Lizenzserver, auf den die mehrfach laufenden geschützten Applikationen zugreifen.

Für alle CodeMeter-spezifischen Interaktionen mit dem CodeMeter Lizenzserver wird ebenfalls ein separater Container gestartet. Beispiele solcher Interaktionen sind der Betrieb eines (einzigen) CodeMeter WebAdmins oder die Verwendung des Kommandozeilentools cmu zum Einspielen von Lizenzen oder Auflisten von Informationen. Die von Wibu-Systems als Beispiel zur Verfügung gestellte Konfiguration verwendet dazu dasselbe Image wie für den Container mit dem CodeMeter Lizenzserver, jedoch mit anderen Einstiegspunkten.

Gebundene Lizenzen

Die zweite wesentliche Neuerung für Docker ist die Bereitstellung einer speziellen Bindung für CmActLicenses. Bei einer CmActLicense werden bei der Erstellung auf dem Zielsystem die Hardwareeigenschaften ausgelesen und für das patentierte SmartBind-Verfahren nach einem hinterlegten Rezept so kombiniert, dass kleinere Veränderungen am System nicht zu einem Brechen der Lizenz führen, hingegen größere Veränderungen oder gar der Betrieb auf einem anderen System die Lizenz unbrauchbar machen.

Die Herausforderung hier war, dass eine Duplizierung, also das Starten einer zweiten Instanz des Containers mit dem CodeMeter Lizenzserver, auf keinen Fall die vorhandenen Lizenzen verdoppeln sollte. Die Lösung besteht in der Verwendung eines Named Volume. Dieses Named Volume wird in den Container mit dem CodeMeter Lizenzserver eingehängt und die CmActLicense wird sowohl an dieses Volume gebunden als auch auf diesem Named Volume abgelegt. In Kombination mit einem Sperrmechanismus kann dadurch die aktivierte CmActLicense nicht mehrfach betrieben werden, überlebt aber trotzdem den Wechsel des Containers, in den sie eingebunden ist. Das passiert zum Beispiel beim Austausch des Containers mit dem CodeMeter Lizenzserver gegen einen Container, der auf einem Image mit einer neueren Version von CodeMeter basiert. Bei so einem Versionsupdate braucht also nur der alte Container gestoppt und einer mit der neuen Version gestartet werden. Damit die Bindung auch sicher durchgeführt und überprüft werden kann, benötigt der Container mit dem CodeMeter Lizenzserver für den Betrieb einer CmActLicense Zugriff auf den Docker-Socket.

Aufgrund der Abstraktionsmöglichkeiten einer Container-Umgebung lässt sich der Betrieb einer CmActLicense in einem Docker-Container nicht so gut schützen wie auf einem realen System. Daher ist es weiterhin notwendig, CmActLicenses für Container-Umgebungen explizit freizuschalten (zum Beispiel CmBox-Pgm-Option-lopt:vm,container“). Grundsätzlich sollte man daher überlegen, ob eine Lizenz in einem Container wirklich notwendig ist.

Lizenzen in der Cloud

Von dem (lokal notwendigen) Container mit dem CodeMeter-Lizenzserver (kurz: dem CodeMeter Docker-Container) kann man sehr gut auf Lizenzen in der Cloud zugreifen. Die Lizenzen in einem CmCloudContainer stecken gefühlt direkt in dem Docker-Container und bieten dabei aber höchste Sicherheit gegen Lizenzmissbrauch. Die Zählung der Lizenzen findet zunächst vordergründig im CodeMeter Docker-Container statt; die Lizenzen werden aber ebenso in der CmCloud selbst gezählt und verwaltet. Es ist bei einer CmCloud-Lizenz daher nicht möglich, mehr als die bereitgestellten Lizenzen gleichzeitig zu verwenden. Wenn Sie sicher sein können, dass Ihr CodeMeter Docker-Container eine immer verfügbare Internetverbindung hat, dann ist die Verwendung von Lizenzen in einem CmCloudContainer eine sehr gute Wahl.

Lizenzen im Netzwerk

Wir haben oben gelernt, dass die Zugriffe aus dem App-Container im CodeMeter Docker-Container als lokale CodeMeter-Zugriffe gewertet werden. Genau das ermöglicht uns jetzt, alternativ zu einer CmActLicense im Docker-Container oder einem CmCloudContainer auch Lizenzen im Netzwerk zu verwenden. Dazu benötigen Sie einen immer erreichbaren Rechner, an den Sie einen oder mehrere CmDongles anstecken oder CmActLicenses aktivieren. Diese Lizenzen können von anderen Rechnern in Ihrem Netzwerk verwendet werden, und damit auch vom CodeMeter Docker-Container. Dazu genügt es, im Profiling des im CodeMeter Docker-Container laufenden CodeMeter Lizenzservers (der hier als Client fungiert) den Namen oder die Adresse des CodeMeter Lizenzservers (mit Serverfunktionalität) anzugeben. Schon werden die Lizenzanfragen der geschützten Applikation zunächst zum CodeMeter Lizenzserver im Docker-Container geschickt und von dort an alle hinterlegten CodeMeter Lizenzserver im Netzwerk weitergegeben. Wir sehen also, dass uns die Trennung der Applikation vom CodeMeter Lizenzserver nicht in der Nutzung einschränkt.

Nebenbedingungen

Das Docker-Image mit den CodeMeter-Komponenten muss auf einem Linux basieren, das glibc verwendet. In den Beispielen verwenden wir ein schlankes Image, das auf Debian basiert. Für die Container mit den geschützten Applikationen wird mit der nächsten Version diese Voraussetzung entfallen. Wibu-Systems arbeitet daran, sowohl die CodeMeter-Bibliothek bereitzustellen als auch die CodeMeter Protection Suite zu erweitern, sodass die geschützten Applikationen auf der in Docker-Umgebungen beliebten Linux-Variante Alpine lauffähig sein werden.

 

KEYnote 42 – Herbstausgabe 2021

Nach oben