A) Einführung ------------- Dieser Vorschlag zeigt die manuelle Installation von SealOne-Software unter Linux für die Verwendung eines SealOne-Hardwaretoken. Vorteil: - Normalerweise läuft unsinnigerweise auch bei ausgestecktem Token die SealOne-Software dauerhaft, solanger der Benutzer am grafischen Desktop eingeloggt ist. Dies ist mit der hier vorgeschlagenen Installationsmethode nicht mehr der Fall. Die SealOne-Software startet nun automatisch, wenn der SealOne-Hardwaretoken am USB eingesteckt wird. Beim Entfernen des Token wird sie automatisch beendet. Der Benutzer muss auch nicht eingeloggt sein am Rechner. - Normalerweise läuft die SealOne-Software mit den Rechten des Benutzers. Sie hat Internetzugriff und könnte also potentiell z.B. die Dateien des Benutzer ausspionieren. Da es sich nicht um Open-Source-Software handelt, läßt sich nicht überprüfen, ob sie das tut. Die SealOne-Software läuft mit dieser Installationsmethode nicht mehr mit den normalen Benutzerrechten, sondern sie läuft unter einem eigenen Benutzernamen "sealone". Nachteil: - Beim Einstecken des Token in den USB-Anschluss wird für einen kurzen Moment ein Text-Konsolenbildschirm angezeigt, d.h. es wird vom grafischen Desktop umgeschaltet auf z.B. tty9, und dann aber wird wieder zurückgeschaltet. B) Technische Hintergründe -------------------------- - Beim Einstecken des Token am USB-Anschluss werden zwei Geräte simuliert: * "Mass Storage" Enthält Programme wie z.B. "SealOne" oder ".bin/S1GUI" * "Human Interface Device" Darüber spricht wohl das SealOne-Programm mit dem Token - Als einzige erforderliche Datei der Firma SealOne wird das Executable "SealOne" verwendet. Das Executable "S1GUI" für Anzeigen im grafischen Desktop ist unnötig. - Das SealOne-Executable hat anscheinend einen bescheuerten unsinnigen "Schutzmechanismus". Dessen Anforderungen werden nacheinander Punkt für Punkt überprüft. Schlägt ein Punkt fehl, dann hängt das SealOne-Programm solange, bis der Punkt zumindest für einen kurzen Moment erfüllt ist: * Der Benutzername, unter dem SealOne läuft, muss an einer Bildschirmkonsole eingeloggt sein (tty1, tty2, ...). pts/1 ist beispielsweise nicht möglich. Die grafische Oberfläche ist erlaubt, wenn sie tatsächlich an einer Bildschirmkonsole läuft. Bei Debian ist das typisch die tty1. * Anscheinend muss der Bildschirm auch zumindest kurz einmal "aktiv" sein, also tatsächlich angezeigt werden. * Weitere Prüfungspunkte...??? - Es ist unklar, wie SealOne feststellt, ob sein Benutzername offiziell eingeloggt ist. Vielleicht via /var/log/wtmp? Es ist unklar, wie SealOne feststellt, welcher Bildschirm aktiv ist. Vielleicht via /sys/class/tty/tty0/active? - Bisher konnte der "Schutzmechanismus" nur auf diese Weise überwunden: * Der udev-Dienst als Reaktion auf USB-Insertion * einen systemd-Dienst, * welcher einen getty-Serverprozess in einem Konsolen-tty ausführt, * der dann automatisch den "sealone"-User einloggt und als Shell ein Skript aufruft, * was dann das SealOne-Programm startet und für einen kurzen Moment das Konsolen-tty anzeigt. Genutzt wird in diesem Installationsbeispiel die Konsole tty9. C) Beschaffung der Software --------------------------- Wie schon beschrieben: der USB-Stick emuliert u.A. ein CD-ROM-Laufwerk, auf welchem sich die Software befindet. Ansonsten läßt sie sich herunterladen. Stand 12.03.2025: Angeboten über: https://www.seal-one.com/download.de Tatsächliche selbstinstallierende Datei (für alle SealOne-Modelle): https://seal-one.com/SOInstLin.sh SealOne schlägt vor, in einem Aufwasch die Datei herunterzuladen und zu installieren: wget https://seal-one.com/SOInstLin.sh && sh SOInstLin.sh Da wird die Software einzig für den aufrufenden Benutzer komplett installiert in einem Verzeichnis ~/.sealone. Mit all den Nachteilen, also besser nicht dies ausführen! Besser manuell entpacken, was dann ein Unterverzeichnis "SealOne" anlegt: wget https://seal-one.com/SOInstLin.sh sed -e '1,/^exit$/d' SOInstLin.sh > SOInstLin.tgz tar xzf SOInstLin.tgz Die Liste der zur Verfügung gestellten Dateien, z.B. auch den versteckten S1GUI-Executables, läßt sich dann anschauen mit: tree -a SealOne Das benötigte SealOne-Executable befindet sich dann hier: ./SealOne/arm64/SealOne Für 64-Bit ARM-Architektur ./SealOne/armhf/SealOne Für 32-Bit ARM-Architektur (wohl nur wenn mit Floatingpoint-Hardware) ./SealOne/x64/SealOne Für 64-Bit PC ./SealOne/x86/SealOne Für 32-Bit PC D) Installation --------------- 1.) Das SealOne-Executable "SealOne" kopieren, z.B. nach /usr/local/bin/SealOne 2.) /usr/local/lib/sealonesrv.sh anlegen (mit x-Permission), mit Inhalt z.B.: #! /usr/bin/bash set -x set -m TTYACT=$(cat /sys/devices/virtual/tty/tty0/active) TTY=$(tty) if [ "${TTY:0:8}" != "/dev/tty" ]; then set +x echo "**** Dieses Script wurde nicht an einer Konsole aufgerufen. Programm SealOne wird nicht gestartet." else chvt ${TTY:8} # --nogui wäre eigentlich besser, aber dann unterdrückt SealOne ggf. gewisse Fehlermeldungen und zeigt nur seine Hilfeinfo # /usr/local/bin/SealOne --nogui & /usr/local/bin/SealOne & sleep 2 chvt ${TTYACT:3} fg %1 EXITSTAT=$? set +x echo "**** Programm SealOne hat sich beendet." fi echo "**** Nach Beenden dieser Shell wird ggf. der SealOne-Service (getty@${TTY:5}.service) neu gestartet" exec bash 3.) Einen sealone-Systembenutzer anlegen, z.B. mit adduser --system --group --home /tmp --shell /usr/local/lib/sealonesrv.sh sealone Das /etc/passwd für den Benutzer (home-Verzeichnis, Startscript) sollte dann z.B. sowas enthalten (ggf. korrigieren): sealone:x:124:143::/tmp:/usr/local/lib/sealonesrv.sh 4.) /etc/udev/rules.d/99-usb-sealone.rules anlegen z.B.: ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", \ ENV{PRODUCT}=="219c/10/100" \ RUN+="/usr/bin/systemctl restart getty@tty9.service" ACTION=="remove", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", \ ENV{PRODUCT}=="219c/10/100" \ RUN+="/usr/bin/systemctl stop getty@tty9.service" 5.) /etc/systemd/system/getty@tty9.service.d/override.conf anlegen, z.B. mit: [Service] ExecStart= ExecStart=-/sbin/agetty --autologin sealone --noclear %I 38400 linux 6.) udev-daemon und systemd neu laden. Dazu in einer Root-Shell ausführen: udevadm control -R systemctl daemon-reload