Xenial Linuxclient offline nutzen

Hallo,

wir wollen im neuen Schuljahr den Xenial-Musterclient einsetzen. Hat jemand nach der Anleitung

anwenderwiki:linuxclient:offlineusage [CommunityWiki]

einen Xenial-Client mit automatischer Offline-Erkennung konfiguriert und im Einsatz?
Unsere Service-Firma kann dies für uns leider nicht mit vertretbarem Aufwand realisieren.

LG
Jürgen

Hallo Jürgen,

Ich habe standardmäßig einen Benutzer “lehrer” mit Passwort “lehrer” installiert, dessen Passwort ich beim online-Modus ändere, dazu halte ich eine zweite shadow-Datei vor. Sie wird, falls das Netzwerk erreichbar ist, geändert:

# Rechte für Shadow ändern
if [ -e /tmp/network.ok ] ; then
    mv /mnt/etc/shadow_xenial_lehrergeaendert /mnt/etc/shadow
    chmod 640 /mnt/etc/shadow
fi

LG
Max

Hallo Jürgen,

eine einfachere Variante müsste so gehen:

  • man legt einen lokalen User an
  • in einem geeigneten Startskript wird folgende Regel ergänzt:

iptables -A OUTPUT -m owner --uid-owner lokaleruser -j DROP

Wer sich als User “lokaleruser” anmeldet, der kommt nicht ins Netz, ganz egal, ob der Rechner online oder offline ist. Das Passwort dieses Users kann dann publiziert werden.

Viele Grüße

Jörg

Hallo Max, hallo Jörg,

vielen Dank für die Tipps - werde ich nach meinenm Urlaub ausprobieren.

LG
Jürgen

Hallo Jörg,

man legt einen lokalen User an
in einem geeigneten Startskript wird folgende Regel ergänzt:
iptables -A OUTPUT -m owner --uid-owner lokaleruser -j DROP

habe ich gemacht, der lokale User heißt „offline“.
Beim Ausführen der Startdatei offline-user_ohne_Netzzugriff mit dem Inhalt

iptables -A OUTPUT -m owner --uid-owner offline -j DROP

erscheint folgende Fehlermeldung:

offline@r29-servicepc3:/usr/sbin$ ./offline-user_ohne_Netzzugriff
owner: Could not determine whether revision 1 is supported, assuming it is.
modprobe: ERROR: could not insert ‚ip_tables‘: Operation not permitted
iptables v1.6.0: can’t initialize iptables table `filter’: Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Was muss ich ändern?

VG
Jürgen

Hallo,

meine Zeilen lauten so (getestet unter Mint17 - Ubuntu 14.04):

iptables -A OUTPUT -d 10.16.1.254 -p all -m owner --uid-owner $localuser -j DROP
iptables -A OUTPUT -s 10.16.1.254 -p all -m owner --uid-owner $localuser -j DROP

Damit wird dem $localuser (bei Dir offlne) der Empfang ( -s von Source) und das Senden ( -d von Destination) an den IPfire verboten. Das hat zur Folge, dass $localuser das Laptop an anderen Netzwerke verwenden kann, wenn man z.B. außer Haus auf Fortbildung ist.

Vielleicht hilft’s.

Gruß
Stefan

Hallo Jürgen,

versuchst Du iptables unter dem Benutzer offline zu manipulieren? Das wird wohl nicht funktionieren, da man dafür root-Rechte braucht.

Bei mir läuft ein Startskript (Bootskript) unter rc.local (Ubuntu 14.04) zum Anlegen und konfigurieren des lokalen Benutzers. Ab 14.10 muss rc-local aber wohl erst noch aktiviert werden, weil auf systemd umgestellt wurde.

ich würde Dir raten die iptables-Befehle einmal händisch als root auszuführen und die Wirkung unter dem Benutzer offline zu testen. Erst wenn das funktioniert würde ich die Befehle in ein Skript packen und das Starten des Skriptes testen.

Gruß
Stefan

Hallo Jürgen,

ich habe meine Offline-Lösung hier gepostet:

Gruß
Stefan

Hallo Jürgen,

wie sieht’s denn inzwischen aus mit iptables unter xenial (16.04)? Hast Du es einmal als root versucht?


Hier mein Update für trusty (14.04) mit iptables v1.4.21

  • Das Folgende funkioniert bei mir als root, wenn es den Benutzer offline gibt:

  • Das Folgende funktioniert nur, wenn man über den IPfire als Proxy gezwungen wird (was bei den meisten LMN-Systemen und auch an unserer Schule nicht der Fall ist) und wenn $localuser für einen lokalen Benutzer steht, den es gibt:

Gruß
Stefan

Hallo Stefan,

entschuldige die späte Antwort - ich war im Urlaub.

iptables -A OUTPUT -m owner --uid-owner offline -j DROP

funktioniert nur, wenn ich als root den Befehl an der Konsole eingebe.
ABER: unter Ubuntu 16.04 xenial als Eintrag in rc.local leider NICHT.

Vermutlich wird rc.local nicht ausgeführt.
Auch dein Skript legt zwar den User, die Startdatei und den Eintrag in rc.local an, aber der User keinnetz ist trotzdem online.

Hat jemand einen Tipp, wie man unter xenial dafür sorgen kann, dass rc.local ausgeführt wird. Googlen hat keine Lösung gebracht.

Viele Grüße
Jürgen

Gruß
Stefan

Habe es gerade bei mir nochmal überprüft mit trusty (14.04). Der lokale User keinnetz kann nicht surfen.

Per rc.local wird pro lokalem Benutzer ein Skript ausgeführt. Dieses legt den Benutzer an und setzt auch den IPTABLES-Eintrag. Wenn der Benutzer keinnetz also nach Anwenden des Postsync-Skriptes angelegt wurde, muss rc.local ausgeführt worden sein.

Gruß
Stefan

P.S:

Hier das vom Postsync angelegte und per rc.local auszuführende Skript (/var/localuser/boot/keinnetz.sh):

#!/bin/bash
rm -rf /home/keinnetz
useradd --create-home --skel /home/linuxadmin --base-dir /home --password sakvXOddUgl9M keinnetz
sleep 3
rm -rf /home/keinnetz/Home_auf_Server
mkdir /var/localuserdata/keinnetz
ln -s /var/localuserdata/keinnetz /home/keinnetz/Home_auf_Server
chmod -R 700 /var/localuserdata/keinnetz
chown -R keinnetz:keinnetz /var/localuserdata/keinnetz
iptables -A OUTPUT -m owner --uid-owner keinnetz -j DROP
exit 0

Hi

nachdem ich heute einen Erfolg hatte, will ich den auch teilen:
ich habe ubuntu 16.04 mein offlinenutzer heißt “anonym” und auch bei mir wird iptables gesetzt, bislang allerdings so, dass alle Netzwerke, die mit e* anfangen, gesperrt sind, WLAN also geht dann noch, weil es bei uns nur WLAN mit authentifizierung (coova) gibt. Aber die Idee mit dem 10.16.1.254 finde ich auch super.

bislang habe ich beim Synchronisieren wie hier beschrieben den Netzwerkstatus abgefragt. Unseren Lehrern ist das Booten bei Atom-Möhren aber zu langsam und sie wollen sich nicht mit “lehrer”/“lehrer” oder ähnlichem pseudo-auth-kram anmelden (letzteres ist auch aus meiner Sicht quatsch) und jetzt hab ich mir folgendes ausgedacht:

  • benutze das GRUB-Bootmenü: zwei einträge darin starten das Ubuntu direkt, also ohne LINBO.
  • Der erste Eintrag enthält den Kernelparameter “lmn-offline”, der zweite nicht. Beim Booten gibt es jetzt zwei Möglichkeiten:
    • der initramfs-Teil startet ein Skript und legt die wichtigsten Sachen fest, die vor dem Booten (oder relativ früh beim Booten) sein müssen (bei mir: für lightdm ein autologin und die LDAP-Abfrage in /etc/nsswitch.conf abschalten)
    • ein systemd-Kommando erledigt die Aufgaben, muss aber vor lightdm oder auch anderen services gestartet sein.
  • Die Iptables-Geschichte macht dann ein skript bei mir, das beim Autologin des Benutzers “anonym” ausgeführt wird (z.B. wird auch /home/linuxadmin kopiert und dann nötige Änderungen für den anonym-Benutzer zusätzlich kopiert)
  • Beim Ausloggen wird noch ein Skript ausgeführt, das /home/anonym wieder aufräumt und/oder einfach immer runterfährt, ein Ausloggen und neu einloggen ist bei meiner Situation sinnlos.
  • Wie oben beschrieben kommt der User nicht übers Kabel ins Internet, aber über WLAN nach Coova-Anmeldung.
  • Ein Link auf davs://cloud erlaubt dann nachträglich noch den Zugriff auf die eigene Cloud

Tatsächlich ist es mir vor einem Jahr noch nicht gelungen, ein funktionierendes systemd zu erstellen und die initramfs-Idee kam mir erst am Montag: beides funktioniert, ich bin häppy.
VG, Tobias

1 „Gefällt mir“

Hi @Tobias,

Hast du das Skript irgendwo öffentlich liegen oder könntest es mir schicken? Ich finde deine Lösung toll und und würde das gern bei uns auch so umsetzen. Würde mir einiges Zeit sparen…

LG Stephan

Hi Stephan,

ich benutze die initramfs methode jetzt, hoffe ich habe alles von der systemd-methode noch behalten, dass es bei dir funktioniert:

10:41/0 server /var/linbo/linuxmuster-client/ubuntu1604 # find offline-using-systemd/
offline-using-systemd/
offline-using-systemd/root
offline-using-systemd/root/linuxmuster-offline-switch
offline-using-systemd/etc
offline-using-systemd/etc/systemd
offline-using-systemd/etc/systemd/system
offline-using-systemd/etc/systemd/system/offline-check.service
offline-using-systemd/etc/systemd/system/network.target.wants
offline-using-systemd/etc/systemd/system/network.target.wants/offline-check.service

dann der service:

10:41/1 server /var/linbo/linuxmuster-client/ubuntu1604 # ls -la offline-using-systemd/etc/systemd/system/network.target.wants/offline-check.service 
lrwxrwxrwx 1 root root 41 Nov 21 13:20 offline-using-systemd/etc/systemd/system/network.target.wants/offline-check.service -> /etc/systemd/system/offline-check.service

10:42/0 server /var/linbo/linuxmuster-client/ubuntu1604 # cat offline-using-systemd/etc/systemd/system/offline-check.service 
[Unit]
Description=Offlinecheck from kernel parameter
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/root/linuxmuster-offline-switch

[Install]
WantedBy=network.target

und noch das skript:

10:41/0 server /var/linbo/linuxmuster-client/ubuntu1604 # less offline-using-systemd/root/linuxmuster-offline-switch 
#!/bin/sh 

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
    prereqs)
    prereqs
    exit 0
    ;;
esac

## use kernel cmdline to determine offline status
## prepare Offline Mode

if grep lmn-offline /proc/cmdline >/dev/null 2>&1 ; then
    echo "------ Offline Mode -------"
    echo "activate offline-mode only: do autologin"
    cp -f /etc/linuxmuster-client/offlinecheck/50-autologin.conf /etc/lightdm/lightdm.conf.d/ 
    echo "don't use LDAP in nsswitch.conf"
    cp -f /etc/linuxmuster-client/offlinecheck/nsswitch.conf.offline /etc/nsswitch.conf
fi

exit 0

das initramfs geht so:

root@linboclient01:~# cat /etc/initramfs-tools/scripts/init-bottom/linuxmuster-offline-switch
#!/bin/sh 

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
    prereqs)
    prereqs
    exit 0
    ;;
esac

#cat /proc/cmdline
#echo ${rootmnt}
#ls /
#read
#sh

mount $ROOT /root/ -o remount,rw

if grep "lmn-offline" /proc/cmdline >/dev/null 2>&1 ; then
    echo "------ Offline Mode -------"
    echo "activate offline-mode only: do autologin"
    cp -f ${rootmnt}/etc/linuxmuster-client/offlinecheck/50-autologin.conf ${rootmnt}/etc/lightdm/lightdm.conf.d/ 
    echo "don't use LDAP in nsswitch.conf"
    cp -f ${rootmnt}/etc/linuxmuster-client/offlinecheck/nsswitch.conf.offline ${rootmnt}/etc/nsswitch.conf
    mount $ROOT /root/ -o remount,ro
else
    echo "------ Online Mode -------"
    echo "activate online-mode: no autologin"
    rm  ${rootmnt}/etc/lightdm/lightdm.conf.d/50-autologin.conf
    echo "use LDAP in nsswitch.conf"
    cp -f ${rootmnt}/etc/linuxmuster-client/offlinecheck/nsswitch.conf.online ${rootmnt}/etc/nsswitch.conf
fi

mount $ROOT /root/ -o remount,ro

#read
exit 0

und man muss einmal den initramfs neu bauen, ansonsten erledigen das die update-skripte von debian sowieso immer dann, wenn ein kernel installiert wird.

VG, Tobias

1 „Gefällt mir“

Hi @Tobias,

noch mal vielen Dank für die Skripte. Eine Frage habe ich noch, weil ich das glaube ich noch nicht ganz verstanden habe:

Du hast also zwei Einträge im Grub-Menü auf deinem Laptop, Offline Mode und Online Mode, richtig? D.h. standardmäßig wird der Offline-Mode gebootet und wenn deine Kollegen sich doch mal anmelden wollen, dann wählen sie den Online-Modus?

vG Stephan

Hi,

noch eine Frage: Starten deine Grub-Einträge einfach das Betriebsystem oder machen die Start+Sync?

vG Stephan

Hi Stephan,

# egrep '(menuentry|vmlinuz)' /var/linbo/boot/grub/xenialmate_xp_mobil.cfg
menuentry 'LINBO management' --class linux {
menuentry 'Ubuntu (schnell, ohne LAN-Kabel, WLAN falls verfuegbar)' --class ubuntu_start {
 if [ -e /vmlinuz -a -e /initrd.img ]; then
  linux /vmlinuz root=/dev/sda2 ro splash lmn-offline
 elif [ -e /vmlinuz -a -e /initrd ]; then
  linux /vmlinuz root=/dev/sda2 ro splash lmn-offline
 elif [ -e /vmlinuz -a -e /initrd.img ]; then
  linux /vmlinuz root=/dev/sda2 ro splash lmn-offline
 elif [ -e /vmlinuz ]; then
  linux /vmlinuz root=/dev/sda2 ro splash lmn-offline
menuentry 'Ubuntu (schnell, mit LAN-Kabel)' --class ubuntu_start {
 if [ -e /vmlinuz -a -e /initrd.img ]; then
  linux /vmlinuz root=/dev/sda2 ro splash 
 elif [ -e /vmlinuz -a -e /initrd ]; then
  linux /vmlinuz root=/dev/sda2 ro splash 
 elif [ -e /vmlinuz -a -e /initrd.img ]; then
  linux /vmlinuz root=/dev/sda2 ro splash 
 elif [ -e /vmlinuz ]; then
  linux /vmlinuz root=/dev/sda2 ro splash 
menuentry 'Ubuntu (Sync+Start)' --class ubuntu_syncstart {
menuentry 'Ubuntu (Neu+Start)' --class ubuntu_newstart {

Ich starte die nicht gesynct, wg. der Geschwindigkeit. Bei Linux geht das ja direkt ohne reboot, wenn nicht gesynct wird.

das „lmn-offline“ habe ich von Hand eingetragen, wie ich die gesamte Datei von Hand editiert habe.

VG, Tobias

1 „Gefällt mir“

Hi Tobias,

danke dir. Ich habe angefangen das bei uns so umzusetzen. Danke für deine Vorarbeit und deine Ideen!

vG Stephan