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.
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
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.
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?
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.
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.
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:
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.
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):
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
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…
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.
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?