Sziasztok!
Kiknek?
- Laptopot, vagy más hordozható számítógépet használsz, amin Linux fut (mindegy milyen).
- Több helyszínen élsz/dolgozol, ahol eltérőek a hálózati beállítások
- A számítógépet több felhasználó is használ(hat)ja, de eltérő beállításokkal
- Nem elég az IP cím, DNS, gateway beállítás
- Szükséged van CIFS megosztások (~ samba share, ~ windows share) felcsatolására
- Szükséged van HTTP/FTP Proxy beállítások módosítására helyszínfüggően (és nem kézzel akarod csinálni)
- SMTP/IMAP/POP3 levelező szerverek beállításai is teljesen helyszínfüggőek.
Cél
Célunk egy olyan megoldást találni, amivel a fenti igények kielégíthetőek, azaz:
- Dinamikus helyszínváltoztatás
- Automatikus (tényleg, nehogy már én kattintgassak)
- Helyszínfelismerés (MAC cím, SSID alapján)
- Okos legyen (lásd fentebb)
Windows Világ
Windows-os világban erre épkézláb alternatíva alig van, találtam egyet, a MobileNet xy valamit, de már el is felejtettem hogy hívják. Az hihetetlenül sokat tudott.
Az IBM/Lenovo termékeket használók jól ismerik az ThinkVantage AccessConnections -t.
Az AccessConnections jó, csak nincs Linuxra.
Linux Világ
Linux operációs rendszereken a de facto szabvány a NetworkManager kezd lenni.
A NetworkManager jó, csak nem eléggé.
Alapértelmezésben nagyon sokmindent nem tud, amit egy ilyen területi megoldásra biztosításani kell enterprise környezetben (vagy komoly felhasználóknak).
Mit nem tud a Network Manager?
Ez úgy is megfogalmazhatnám, hogy miért is írtam ezt a blogot. :)
A helyzet tipikus: egyszerű dolgokról nagyon sok fórum és blog van, de az igazi fogós kérdésekről senki nem beszél. Én erről szeretnék.
Amit nem tud a NetworkManager:
- A hálózati megosztások felmountolása
- Proxy kezelés
- Felhasználótól függő beállítások (más felhasználóval más share-eket mountol fel, vagy más jogokkal)
- Alapértelmezett nyomtató átállítása
- Tűzfalbeállítások kezelése helyszínfüggően
Lehetőségek
A NetworkManager büszkén hirdeti, hogy tud scriptelni, azaz a Network Manager Dispatcher lefuttatja a /etc/NetworkManager/dispatcher.d könyvtárban lévő scripteket, amennyiben (!) az illető szkript fájl csoport által nem írható és nem is SETUID-os.
A scriptek két paramétert kapnak:
- hálózati interfész neve (pl. eth0, wlan0, pan0, tun0, stb...)
- hálózati interfész státusza: up/down.
Ez szuper, csak az a baj, hogy a scripteknek pont erre a két paraméterre nincs szüksége, pontosabban ez édes kevés.
Megoldandó problémák
- A NetworkManager daemonként fut, így a dispatcher is. Ez a következőket okozza: Nem tudjuk milyen felhasználó jelentkezett éppen be, mert nem örökli a daemon a session-t. Ez elég nagy baj, ha van két felhasználód, pl. beaver és bogi, fel akarsz csatolni hálózati megosztásokat, de ugyanarra a megosztásra bogi-nak és beaver-nek más-más jogai vannak. Nem is beszélve a home könyvtárakról.
- /etc/fstab és Samba Credentials: halva született ötlet, mert ebben az esetben is meg kell adni a credentials fájl helyét, méghozzá boot folyamat során, amikor még nem történt login (!). Ebből adódóan a /etc/fstab-ban nem fogod tudni kezelni a felmountolást. Amint semmiképpen nem akarunk meglátni egy /etc/fstab fájlban az ez: /home/bogi/otthon.creds, mert akkor mindig minden bogi-val lesz csatolva.
- "Felmountolni guestént" szokták még az okos fórumok javasolni: Na persze, komoly helyen egyrészt nincs quest, másrészt biztonságtalan, harmadrészt, aki a guestnek írások jogokat ad, az meg is érdemli, hogy összebarmolják az adatait illetéktelenek. Abszolút felejtős.
- Tudnom kell a környezet nevét, ezt alapból nem kapjuk meg paraméterként.
- Módosítani kell a GConf-ot.
- Felhasználóként kell mountolnunk!
Megoldásom
- nm-tool nevű kis segédprogrammal lekérdezhetőek a NetworkManager által beállított dolgok, beleértve a helyszín nevét. Ez kényelmes kezelést biztosít
- Lesz egy vezérlő script a /etc/NetworkManager/dispatcher.d könyvtárban, ami meghatározza a helyszínt és hívja a helyszínfüggő scripteket. Ez a script a driver.sh nálam.
- A helyszínfüggő scripteket szabályos elnevezéssel láttam el, hogy könnyen kezelhető legyen programatikusan és a /usr/local/bin -ben helyeztem el.
- A felhasználó nevét és home könyvtárát egy GDM eseményhez társított script nyeri ki és helyezi el a /tmp/nm-user.txt és /tmp/nm-home.txt fájlokban. Így, a jól ismert, osztott állományok módszerét használva már megtudhatjuk az aktuális felhasználót. Amúgy meg nem :)
- Felhasználóként kell mountolnunk, ezért módosítanom kellett a /etc/sudoers fájlt is. (Ez most elég biztonságtalan, majd később megerősítem).
- A kívánt felhasználókat jelenleg hozzá kell adni a sudo csoporthoz. Ezt javítani kell.
/etc/sudoers:
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL) ALL
# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) NOPASSWD:ALL
#
#includedir /etc/sudoers.d
/etc/NetworkManager/dispatcher.d/driver.sh:
#!/bin/bash
#Ez a script fogja eldönteni a tényleges helyszínt és hívja a többi scriptet, melyeket a /usr/local/bin -ben helyezünk el
#post-<up|down>-<helyszín>.sh sémával
wait_for_process() {
PNAME=$1
PID=`/usr/bin/pgrep $PNAME`
while [ -z "$PID" ]; do
sleep 1;
echo "1 sec passed." >> $LOG
PID=`/usr/bin/pgrep $PNAME`
done
}
wait_for_process nm-applet
if [ "`nm-tool | grep -c "Otthon"`" -gt 0 ]; then
LOCATION="home"
fi
if [ "`nm-tool | grep -c "NI"`" -gt 0 ]; then
LOCATION="ni"
fi
if [ "$2" = "up" ]; then
source /usr/local/bin/post-up-$LOCATION.sh
fi
if [ "$2" = "down" ]; then
source /usr/local/bin/post-down-$LOCATION.sh
fi
/usr/local/bin/post-up-home.sh:
#Megosztások felmountolása
HOMEFILE=/tmp/nm-home.txt
if [ -e $HOMEFILE ]; then
REALHOME=`cat /tmp/nm-home.txt`
else
REALHOME=$HOME
fi
sudo mount -t cifs //torch/homes /mnt/net/$LOCATION/home -o credentials=$REALHOME/.$LOCATION.creds >> $LOG
sudo mount -t cifs //torch/Public /mnt/net/$LOCATION/public -o credentials=$REALHOME/.$LOCATION.creds
sudo mount -t cifs //torch/Feltoltesek /mnt/net/$LOCATION/feltöltések -o credentials=$REALHOME/.$LOCATION.creds
sudo mount -t cifs //torch/Letoltesek /mnt/net/$LOCATION/letöltések -o credentials=$REALHOME/.$LOCATION.creds
sudo mount -t cifs //torch/homes/Dokumentumok $REALHOME/Dokumentumok -o credentials=$REALHOME/.$LOCATION.creds
sudo mount -t cifs //torch/homes/Képek $REALHOME/Képek -o credentials=$REALHOME/.$LOCATION.creds
sudo mount -t cifs //torch/Public/Zenék $REALHOME/Zenék -o credentials=$REALHOME/.$LOCATION.creds
#Proxy beállítása
export http_proxy=http://192.168.0.2:3128/
export ftp_proxy=http://192.168.0.2:3128/
gconftool-2 -t string -s /system/proxy/mode "manual" >> $LOG
gconftool-2 -t string -s /system/proxy/secure_host "192.168.0.2"
gconftool-2 -t int -s /system/proxy/secure_port 3128
gconftool-2 -t string -s /system/proxy/ftp_host "192.168.0.2"
gconftool-2 -t int -s /system/proxy/ftp_port 3128
gconftool-2 -t bool -s /system/http_proxy/use_http_proxy true
gconftool-2 -t bool -s /system/http_proxy/use_same_proxy true
gconftool-2 -t string -s /system/http_proxy/host "192.168.0.2"
gconftool-2 -t int -s /system/http_proxy/port 3128
Figyeljük meg, hogy a Debian/Ubuntu által alapból a home könyvtárban adott Zenék, Videók, Dokumentumok könyvtárakra fogunk mountolni, azaz, mindig azt a környzetet fogom látni ami, ahol éppen kell. A cégnél a céges dokumentumokat, otthon az otthoniakat.
A home könyváradban ehhez, hogy működjön, lennie kell egy .home.creds fájlnak, de ezt már könnyen elkészíted magadnak.
/etc/gdm3/PostLogin/Default:
#!/bin/sh
#
# Note: this is a sample and will not be run as is. Change the name of this
# file to <gdmconfdir>/PostLogin/Default for this script to be run. This
# script will be run before any setup is run on behalf of the user and is
# useful if you for example need to do some setup to create a home directory
# for the user or something like that. $HOME, $LOGIN and such will all be
# set appropriately and this script is run as root.
echo $HOME > /tmp/nm-home.txt
echo $USER > /tmp/nm-user.txt
A megoldásom hiányosságai
Sajnos nem sikerült tökéletes munkát végeznem, ugyanis:
- Jelszó nélküli sudo-zást igényel a módszer, ez biztonságtalan olyan céges környezetben, ahol egy laptopot akár több ember is használat
- Mindenki, aki használni akarja ezt a feature-t, tagja kell, hogy legyen a sudo csoportnak, ami szintén biztonsági aggályokat vet fel.
Ezen a részen még dolgozok, és küldöm a javításokat, ha kitalálom hogyan a legjobb.
Mindazonáltal egy laptopon nem látok nagy veszélyt abban, hogy a jogosult felhasználók root jogot kapnak uk-muk-fuk, de azért valóban nem ártana kicsit enhance-olni.
Zárszó
És innentől kezdve jössz te.
Ahogy a klasszikus "Japán játék használati útmutatója" mondta: Ha vagytok egyed és nincs játszó, önmagatokból, összerakni és az nyer aki előbb.
Más szóval: Sok sikert, és ha tudjátok fokozni az okosságomat, akkor szívesen látok minden megjegyzést, javítást, javaslatot.
Szabi