Linbo 4.2, Wlan, Kennwort verteilen

Hallo liebe Tüftler,

ich habe erfolgreich den ersten Laptop mit Linbo via Wlan synchronisiert (Juhuu!). Das wird es uns so viel leichter machen Laptops zurück zu setzen.

Linbo verbindet sich mit einem versteckten WLAN und PSK. Nach dem Systemstart soll sich der Rechner mit einem anderen WLan und anderem PSK verbinden. Diesen PSK möchte ich auch mal ändern können und muss dann entsprechend verteilt werden. Bisher mach ich das via Start-Skript, was im LAN auch gut funktioniert. ABER: Beim Synchronisieren mit Linbo im WLAN geht das natürlich nicht.

Ins Image möchte ich den PSK nicht legen (zu viele unterschiedliche Geräte mit unterschiedlichen WLAN-Karten)

Nun meine Frage: Ist es möglich bei der Synchronisation (z.B. via Bootskript GitHub - linuxmuster/linuxmuster-linbo7: Next generation linbo ) Windows den PSK irgendwie mitzuteilen, z.B. ins Dateisystem zu schreiben, worauf ich dann via Startskript zugreifen kann?

Welche Möglichkeiten seht ihr?
Vielen Dank
Simon

Hi.
Ohne Deine Begeisterung schmälern zu wollen…

Wir hatten bei uns folgende Situation:
Es gibt 30 Laptops mit Windows 10 in einer Verleihstation. Diese Geräte waren vor einiger Zeit per PSK im „Geräte-WLAN“ und wir dachten, dass damit alles gut sei — aber weit gefehlt! Die findigen Schüler konnten den PSK völlig problemlos im Klartext ermitteln und anschließend für ihre Privatgeräte nutzen. Da sich sowas natürlich ruck-zuck herumspricht und Schüler niemals dicht halten, hat sich der PSK in Null-Komma nix unter den Schülern verbreitet. Kurz danach haben wir uns gewundert, dass der IP-Pool voll war und diverse Schulgeräte keine IP-Adresse mehr bekommen haben. Nach etwas Suche war die Lücke schnell gefunden und es war klar, dass es keine gute Idee ist, einen PSK mit in das Windows Image zu packen. Ob sich das in der Zwischenzeit geändert hat und Windows das nachgebessert hat, weiß ich nicht. Aber ich wollte es nur kurz teilen, damit ihr nicht über den gleichen Fehler stolpert….
Viele Grüße,
Michael

Hallo Michael,

dass sich ein ausgelesener Schlüssel schnell verbreitet, ist klar. Müssten die SuS dazu aber nicht auch noch MAC-Spoofing betreiben, um dann nicht nur irgendeine IP per DHCP zu erhalten, sondern eine, die in der devices eingetragen ist und mit der sie dann in’s Internet kommen?

Viele Grüße,
Jochen

Hallo Jochen
Es war kein grünes Netz. Die Geräte waren da nicht einzeln erfasst. Aber genau das haben wir anschließend geändert….
Viele Grüße
Michael

Hallo Michael, danke für die Rückmeldung,

Genau das will ich nicht, denn bei Änderung des PSK müsste ich für nicht nur jede Geräteklasse, sondern jeden unterschiedlichen Netzwerkkartentyp das Image neu bauen.

Ja, das ist bei uns nicht anders und auch nicht wirklich schwer. MS hat das richtig toll gemacht: Viele verschiedene Möglichkeiten den PSK auszulesen; Einige davon kann man blocken, andere nur wenn man zusätzlich die cmd vernagelt (aber genau das will ich nicht). Dennoch hat unser Dienstleister genau das empfohlen: PSK ins Image (heul).

Leider haben wir eine LANCOM Firewall vom Dienstleister bekommen, damit funktioniert die WLAN-Steuerung über die LMN wohl nicht (zumindest wurde es trotz Versprechungen seit 2 Jahren nicht bei uns umgesetzt).
Die Idee ist daher neben ab und zu wechselndem PSK, via Unifi-Controller von Anfang nur Geräte mit entsprechender MAC rein zu lassen. Das erschwert es den nicht so findigen Schülern die Info von den Findigen einfach weiter zu nutzen. Insbesondere nutzen diese oft als Gerätenamen ihren Klarnamen. Mit der Infor an welchen AP sie gerade hängen, hab ich ein zwei Schüler direkt damit konfrontiert und die MAC der größten Sünder gleich mal blockiert, das hat das ganze dann etwas entschärft.

Deshalb nochmal meine Frage: Kann ich mit den neuen Linbofunktionen PSKs beim Synchronisieren (z.B. via Skript) irgendwo ablegen. Ich möchte dann danach z.B. via Bootskript darauf zugreifen und den PSK einspielen. Auf diese Weise wäre eine Systemweite Änderung des PSK ohne neues Imaging auch auf WLAN-Geräten möglich. (Momentan geht das nur, wenn ich diese Geräte an die LAN-Dose hänge, denn dann kann ich beim Boot auf den Server zugreifen. Bei WLAN geht das aber nicht, denn Linbo hat zwar WLAN-Zugang, dieser überdauert aber nicht beim Bootvorgang.)

Danke fürs Weiterdenken
Simon

Hallo Simon, für mich klingt das so, als müsstest Du „nur“ herausfinden, wo Windows dieses Information speichert. Alles andere konnte LINBO zB über einen Postsync doch schon immer an die richtige Stelle kopieren, oder??
Viele Grüße
Michael

Du musst doch nur ein lokales Startscript schreiben und in dein Image packen, was dir aus einer lokalen Datei die Wifi Credentials einliest.
Diese Datei packst du per Linbo postsync (via Wifi) in einen geschützten Ordner auf den nur System Zugriff hat.
Aber auf sowas komplexes kommt der Dienstleister sicher auch wenn man ihn nett fragt :stuck_out_tongue:

Hallo Michael, hallo Till,

Hatte ich bisher noch nie gemacht und daher nicht auf dem Schirm. Danke für den Hinweis.

Ja, das weiß ich wie das geht. Werde ich ausprobieren.

Ist es möglich innerhalb des postsync-Skripts die Linbo-Gruppe abzufragen? Dann könnte ich z.B. den PSK auf diejenigen Systeme schreiben, die auch mit WLAN genutzt werden sollen (haben dann eine eigene Gruppe), aber nicht auf alle anderen Geräte die das selbe Image verwenden.

Sicherlich, dass ich hier nachfrage hat ja auch nichts mit dem Dienstleister zu tun. Unsere bisherige Lösung (Wlan-Profil - falls verändert - via Bootskript vom Server laden und aktivieren) habe ich ja mit Hilfe des Dienstleisters erstellt. Mit dem neuen Linbo haben sich die Rahmenbedingungen geändert. Aktuell habe ich Zeit, der Dienstleister ist ausgebucht, und da geht es schneller, wenn ich hier im Forum nachfrage: Eine brauchbare Antwort über Nacht ist doch super!
Gleichzeitig profitieren alle anderen Forumsleser: Ich poste hier meine Lösung, sobald diese funktioniert.

2 „Gefällt mir“

Nicht nötig — der Mechanismus für das postsync ist so gemacht, dass -je nachdem wo Du die zu verteilende Datei hin kopierst- immer direkt für die richtigen Clients bereitgestellt wird

Guck mal hier:
https://docs.linuxmuster.net/de/latest/clients/postsync/basics.html

Da gibt es auch das universelle Postsync-Script

Hallo Michael,

so wie das lese, wird das postsync Skript pro Image abgespeichert.
Ich verwende ein und das selbe Image aber in mehreren Gruppen.

Meine Frage bezog sich darauf, ob ich im postsync Skript abfragen kann, welche Gruppe der Rechner hat auf den das Image gerade gesynct wurde.

Grüße
Simon

Das ist kein Problem….
Man kann bei postsync bis runter zum einzelnen Client festlegen, wer eine Datei bekommen soll und wer nicht. Wenn es pro Hardwareklasse verteilt werden soll, ist das genauso möglich wie auch gleich für alle Clients.
Man muss sich da nur einmal einlesen und die anzulegende Struktur auf dem Server verstehen — danach läuft das wie von selbst…

Du kannst aber auch einfach die Gruppe auslesen, finde ich übersichtlicher für so etwas. Die Variablen findest du in den Environment Variablen wenn du dich mal auf einem Rechner per Linbo anmeldest :slight_smile:

1 „Gefällt mir“

So und hier kommt die (momentane Lösung):

  1. update-linbofs pre hook erstellen und update-linbofs ausführen
#!/bin/bash
# /var/lib/linuxmuster/hooks/update-linbofs.pre.d/01_copy_wlan_profile 
# nomisge AT live.de 
# 20240326
#

echo "### Copy Wlan Profile ###"

# copies profile to linbofs; <dir> entsprechend anpassen
profile="<dir>/WLAN-Schule.xml"
cp "$profile" etc
  1. Geplante Aufgabe im Image mit folgenden Skripten installieren.

/srv/linbo/linuxmuster-win/install.cmd (angepasst):

REM Installiert geplante Aufgaben für linuxmuster.net
REM nomisge AT live.de
REM thomas@linuxmuster.net
REM 26.03.2024

REM alte Tasks zuerst deinstallieren
call %SystemDrive%\linuxmuster-win\uninstall.cmd

REM erstellt linuxmuster-start-tasks, die beim Start ausgeführt werden
schtasks /Create /XML %SystemDrive%\linuxmuster-win\linuxmuster-start-tasks.xml /TN linuxmuster\linuxmuster-start-tasks

/srv/linbo/linuxmuster-win/uninstall.cmd (angepasst)

REM entfernt die geplanten linuxmuster-tasks
REM nomisge AT live.de
REM thomas@linuxmuster.net
REM 26.03.2024

schtasks /delete /TN linuxmuster-start-tasks /f
schtasks /delete /TN linuxmuster-shutdown-tasks /f
schtasks /delete /TN linuxmuster\linuxmuster-start-tasks /f
schtasks /delete /TN linuxmuster\linuxmuster-shutdown-tasks /f

/srv/linbo/linuxmuster-win/linuxmuster-start-tasks.xml (führt start-tasks.cmd mehrmals aus, da WLAN Schnittstelle evtl. noch nicht bereit):

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2015-09-21T10:33:20.1523216</Date>
    <Author>Administrator</Author>
    <Description>Run tasks defined C:\linuxmuster-win\start-tasks.cmd</Description>
    <URI>\linuxmuster\linuxmuster-start-tasks</URI>
  </RegistrationInfo>
  <Triggers>
    <BootTrigger>
      <Enabled>true</Enabled>
    </BootTrigger>
    <BootTrigger>
      <Enabled>true</Enabled>
      <Delay>PT10S</Delay>
    </BootTrigger>
    <BootTrigger>
      <Enabled>true</Enabled>
      <Delay>PT20S</Delay>
    </BootTrigger>
    <BootTrigger>
      <Enabled>true</Enabled>
      <Delay>PT30S</Delay>
    </BootTrigger>
    <BootTrigger>
      <Enabled>true</Enabled>
      <Delay>PT1M</Delay>
    </BootTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-18</UserId>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>StopExisting</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>false</AllowHardTerminate>
    <StartWhenAvailable>true</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
    <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
    <Priority>7</Priority>
    <RestartOnFailure>
      <Interval>PT1M</Interval>
      <Count>3</Count>
    </RestartOnFailure>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>%SystemDrive%\linuxmuster-win\start-tasks.cmd</Command>
    </Exec>
  </Actions>
</Task>
  1. start-tasks.cmd anpassen und set-wlan-profile.cmd anlegen, danach update-linbofs ausführen:
REM /srv/linbo/linuxmuster-win/start-tasks.cmd 
REM Tasks, die beim Start ausgefuehrt werden
REM nomisge AT live.de
REM thomas@linuxmuster.net
REM 26.03.2024

REM Stelle sicher, dass linuxmuster-win versteckt ist.
if exist %SystemDrive%:\linuxmuster-win\ (
	ATTRIB +h %SystemDrive%:\linuxmuster-win
)

REM Wlan Profil setzen, falls vorhanden
if exist %SystemDrive%\linuxmuster-win\set-wlan-profile.cmd call %SystemDrive%\linuxmuster-win\set-wlan-profile.cmd

REM Eigenes Skript aufrufen, falls vorhanden
if exist %SystemDrive%\linuxmuster-win\custom.cmd call %SystemDrive%\linuxmuster-win\custom.cmd
REM /srv/linbo/linuxmuster-win/set-wlan-profile.cmd 
REM Setze Wlan-Profil falls Änderung vorliegt.
REM nomisge AT live.de
REM 26.03.2024

rem # Aktualisiere Wlan Profil

if exist %SystemDrive%\linuxmuster-win\WLAN-Schule.xml (
	rem # Lösche alle Wlan Profile; sinnvoll, falls jemand ein anderes profil aktiviert hat.
	netsh wlan delete profile name=* i=*
	rem # Installiere Wlan Profil, welches via postsync gespeichert wurde.
	netsh wlan add profile filename=%SystemDrive%\linuxmuster-win\WLAN-Schule.xml
)
  1. Postsyncscript für entsprechendes Image in Schulkonsole anlegen und device-import durchführen: Dank dem Hinweis von @Till wird das Profil nur für Geräte deren Gruppe „_wlan“ enthält kopiert.
#!/bin/sh
if  [[ $HOSTGROUP == *"_wlan"* ]]; then
  mkdir /mnt/windows```

  ISNVME=$(fdisk -l | grep nvme)
  if [ -n "$ISNVME" ]; then
    echo "Found nvme, try to mount it..."
    WINDISK="/dev/nvme0n1p3"
  else
    echo "Device has no nvme fallback to sda..."
    WINDISK="/dev/sda3"
  fi

  mount "$WINDISK" /mnt/windows
  cp /etc/WLAN-Schule.xml /mnt/windows/linuxmuster-win/

  umount /mnt/windows
  rm -rf /mnt/windows
fi

Hinweis: Beim Imageing sollte sichergestellt werde, dass C:\linuxmuster-win\WLAN-Schule.xml nicht aus Versehen ins Image aufgenommen wird.

Es gibt noch Optimierungsbedarf, dafür aber mehr im folgenden Post. Feedback mit Verbesserungsvorschlägen ist immer Willkommen.

Verbesserungswünsche:

Ich würde gerne, sobald das WLAN-Profil erfolgreich (d.h. eine Netzwerkverbindung besteht) installiert wurde, verhindern, dass es erneut installiert wird. Bisher ist dies notwendig, da das WLAN-Interface nicht sofort verfügbar ist, wenn die Aufgabe das erste Mal ausgeführt wird.

Hierfür würde ich gerne in /srv/linbo/linuxmuster-win/set-wlan-profile.cmd prüfen, ob eine Verbindung besteht und falls ja, die Datei C:\linuxmuster-win\WLAN-Schule.xml einfach löschen. Da habe ich in der mir zur Verfügung stehenden Zeit aber noch keine Möglichkeit gefunden.
Kann man evtl. prüfen, ob ein Netzwerkpfad erreichbar ist? Oder eine Datei/Webseite im Netzwerk?

Ich kann nicht einfach nachdem der netsh Befehl ausgeführt wurde die C:\linuxmuster-win\WLAN-Schule.xml Datei löschen, da der netsh Befehl bei fehlender WLAN-Schnittstelle ausgeführt wird ohne aber das WLAN-Profil zu installieren. Meine Versuche zu prüfen, ob der Befehl mit Fehler ausgeführt wurde, haben bisher nur dazu geführt, dass das ganze Skript nicht mehr funktioniert hat.

Ich bin für Ideen offen! Danke.

Hallo *,
die von mir geänderten Dateien wurden wohl bei einem Update überschrieben.
Weiß jemand welches Paket dafür verantwortlich ist, dann kann ich das evtl. blocken.

LG
Simon