Weryfikacja użytkownika PenDrivem. nie musisz sto razy dziennie wklepywać hasła.

Awatar użytkownika
PanCiasteczko
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 07 sty 2007, 16:03
Płeć: Mężczyzna
Wersja Ubuntu: 10.10
Środowisko graficzne: Fluxbox
Architektura: x86

Weryfikacja użytkownika PenDrivem. nie musisz sto razy dziennie wklepywać hasła.

Post autor: PanCiasteczko »

W tym how-to postaram sie opisać jak skonfigurować Ubuntu tak, aby użytkownicy byli weryfikowani przez PenDrive USB.

Dzięki temu przy logowaniu i innych czynnościach wymagających autentykacji (np podczas korzystania z sudo) nie będzie trzeba wpisywać hasła - wystarczy że przed rozpoczęciem pracy z systemem, podepniemy nasz PenDrive do USB, po podaniu loginu nie będziemy proszeni o hasło (bez względu na to czy korzystamy z graficznego managera takiego jak gdm czy logujemy sie w terminalu).

Jest to moim zdaniem dobre i przydatne rozwiązanie do domowych maszyn. Nie musisz setki razy dziennie wpisywać swojego hasła a mimo to masz pewność że nikt niepowołany nie będzie korzystał z twojego systemu.

UWAGA! to how-to opisuje między innymi zmianę sposobu logowania się do systemu!
Jeżeli coś pójdzie nie tak możesz utracić całkowicie możliwość zalogowania się!
Będziesz zmuszony cofnąć zmiany korzystając z innego systemu (np na LiveCD).
Uważaj na to co robisz!



1. Co będzie potrzebne?
PenDrive. Jeżeli system ma więcej niż jednego użytkownika, nie każdy musi takowy posiadać, możemy skonfigurować Ubuntu tak aby w przypadku nie wykrycia Pena pytał się o hasło. Na Penie trzeba będzie utworzyć 1-megabajtową dodatkową partycje (wszystko dalej opisane) która będzie zawierała dane do identyfikacji, więc najlepiej zbackupować jego zawartość!



2. Jak to działa?
Na naszym Ubuntu tak jak w większości dzisiejszych dystrybucji, weryfikacją tożsamości użytkownika zajmuje się biblioteka - Linux-PAM czyli otwarta implementacja interfejsu PAM.
Wszelkie aplikacje które weryfikują użytkownika(takie jak login, gdm, xdm, sshd, sudo, etc...) wywołują sobie funkcje z tejże biblioteki. A ta biblioteka korzysta z dostępnych w systemie modułów.

Dzięki Linux-PAM można zmienić sposób logowania się do systemu bez żadnego przekompilowania czegokolwiek. Administrator systemu w plikach konfiguracyjnych ustala jakie przypisać moduły do jakich aplikacji. Domyślnie wszystkie te aplikacje korzystają z modułu - pam_unix który odpowiada za standardową weryfikacje użytkownika hasłem (korzysta z pliku /etc/shadow). To można oczywiście zmienić i za chwilę właśnie to zrobimy.



3. Moduł pam_usbauth
pam_usbauth jest jednym z wielu dostępnych w sieci pam-modułów. Zawiera on potrzebne funkcje do weryfikacji PenDrivem. Na stronie domowej projektu (http://usbauth.delta-xi.net/doku.php) są dostępne pakiety deb. Albo pobieramy je stamtąd i korzystając z ulubionych narzędzi instalujemy deba albo po prostu kopiujemy poniższy kod do konsoli:

Kod: Zaznacz cały

wget http://dl.delta-xi.net/usbauth_v0.3-2_i386.deb
sudo dpkg -i usbauth_v0.3-2_i386.deb


4. Przygotowanie Pendriva
Wpinamy naszego Pena do USB. Teraz utworzymy wcześniej wspomnianą 1 megabajtową partycje. Będą na niej przechowywane losowo wygenerowane klucze aby upewnić się by nikt z podobnym do twojego Penem nie korzystał z twojej maszyny. Do tego celu można użyć dowolnego narzędzia. Partycja nie musi być sformatowana, nie musi to być pierwsza partycja. Jeżeli wiesz jak to zrobić to przejdź do punktu 5 a jeżeli nie to tutaj podaje jedną z metod:

Uwaga! żeby sie nie rozwodzić to opisze metodę która usuwa wszystkie dane z pendriva. Jeżeli mamy jakieś dane to albo kombinujemy sami albo przegrywamy wszystko na dysk.
użyjemy gparted (jeśli nie mamy to instalujemy: 'sudo apt-get install gparted').
wpisujemy w konsoli:

Kod: Zaznacz cały

sudo gparted
  1. w prawym górnym rogu mamy wybór urządzenia - wybieramy naszego Pena (jeśli nie wiemy który to, to patrzymy na rozmiary i zapamiętujemy ścieżkę do pliku urządzenia! (np. /dev/sda))
  2. najprawdopodobniej masz na nim utworzoną jedną partycje fat32, kliknij na nią, kliknij Delete(Usuń)
  3. kliknij New(Nowa), i w okienku ustaw:
    • NewSize(MiB) = 1
    • Create as = Primary Partition
    • Filesystem = unformatted
    • Round to cylinders = yes (jeżeli nie zależy nam krytycznie na miejscu, partycja zostanie nieznacznie powiększona)
  4. kliknij ok,
    Właśnie dodałeś 1 megową partycje na klucze
  5. kliknij na 'unallocated' , kliknij New
  6. w okienku: Filesystem zmień na fat32, New Size zostaw taki jak jest czyli maksymalne,
  7. kliknij Ok
    Właśnie dodałeś partycję na dane.
    okienko gparted powinno wyglądać mniej-więcej tak:
    Obrazek
  8. Jeśli jesteś pewny że wszystko jest OK kliknij Apply i czekaj aż Pen zostanie poprawnie sformatowany.


5. Konfiguracja pam_usbauth
Teraz Sprawdzimy numer seryjny naszego Pena. Podłączamy go do portu USB i wydajemy polecenie:

Kod: Zaznacz cały

cat /proc/bus/usb/devices
* jeżeli polecenie nie działa to patrz na dół tego HOWTO(do działu UWAGI).
W gąszczu linijek wyszukujemy sekcje dotyczącą naszego Pena (gdzieś powinno wypisać jego markę i model)
U mnie np. ta sekcja wygląda tak:

Kod: Zaznacz cały

...
T:  Bus=04 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#=  5 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0951 ProdID=1600 Rev= 1.00
S:  Manufacturer=Kingston
S:  Product=DataTraveler II 
S:  SerialNumber=5B59030A3C24
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I:  If#= 0 Alt= 0 #EPs= 3 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=83(I) Atr=03(Int.) MxPS=  64 Ivl=1ms
...
to co nas interesuje to to za "SerialNumber=" (w moim przypadku 5B59030A3C24), zapamiętujemy to.

Nasz świeżo zainstalowany moduł pam_usbauth korzysta z pliku konfiguracyjnego aby sprawdzić jakim użytkownikom jakie urządzenia są przyporządkowane.
Aby nie bawić się w jego ręczną edytowanie, twórca modułu napisał również narzędzie do konfiguracji - uapasswd.
Zostało ono zainstalowane w naszym systemie wraz z paczką deb.
UWAGA! poniższe polecenie formatuje partycje podaną jako {ŚCIEŻKA 1} zanim je wklepiesz przeczytaj ten punkt do końca!
Wpisujemy w konsoli:

Kod: Zaznacz cały

sudo /usr/sbin/uapasswd -u {UŻYTKOWNIK} -p anystring -d {ŚCIEŻKA 1} -d {ŚCIEŻKA 2} -w -s {SERIAL} -c -o
zastępując następujące kawałki:
{UŻYTKOWNIK} - tutaj podajemy swoją nazwę użytkownika
{ŚCIEŻKA 1} - tutaj podajemy ścieżkę do pliku partycji naszego pena na której chcemy przechowywać klucze i dane do autentykacji, dane na tej partycji zostaną utracone!, jeżeli plik pena to /dev/sda i do podziału partycji korzystałeś z opisanego tu sposobu to plik pierwszej partycji to /dev/sda1, jeżeli plik pena to /dev/sdb to plik pierwszej partycji to /dev/sdb1 itd...
{ŚCIEŻKA 2} - udev dynamicznie tworzy plik urządzenia przy każdym podłączeniu pena, więc np. jak inny pendrive będzie już podłączony to twój zamiast pod /dev/sda będzie dostępny pod /dev/sdb. Dlatego tutaj możemy podać alternatywną sprawdzaną ścieżkę, najlepiej zmienić literkę po /dev/sd bo ona odpowiada przeważnie nr urządzenia. Ścieżek możemy podać więcej, każdą poprzedzoną argumentem "-d" (tylko pierwsza zostanie sformatowana)
np dla pendriva pod /dev/sda:

Kod: Zaznacz cały

sudo /usr/sbin/uapasswd -u {UŻYTKOWNIK} -p anystring -d /dev/sda1 -d /dev/sdb1 -d /dev/sdc1 -d /dev/sdd1 -w -s {SERIAL} -c -o
{SERIAL} - tu podajemy nr seryjny urządzenia który przed chwilą zapamiętaliśmy

w moim przypadku komenda wyglądała tak:

Kod: Zaznacz cały

sudo /usr/sbin/uapasswd -u francio -p anystring -d /dev/sdb1 -d /dev/sdc1 -w -s 5B59030A3C24 -c -o
znaczenie pozostałych parametrów:
"-p anystring" - tu można podać hasło które PAM będzie używał do komunikacji z urządzeniem (nam nie będzie potrzebne), anystring sprawi iż hasło zostanie losowo wygenerowane.
"-w" ten parametr sprawia iż program zapisze dane do autentykacji do pierwszej podanej za pomocą parametru "-d" partycji
"-c" włącza identyfikację pena po serialu
"-o" ten parametr włącza -one-time-passwords. przy każdym logowaniu dane na pendrivie będą zmieniane i hasło będzie generowane na nowo

Jeżeli masz dwa pendrive'y i chcesz logować się przy pomocy dowolnego z nich, powyższe polecenie musisz wykonać dla każdego z urządzeń tylko że:
  • zamień "anystring" na dowolny ciąg znaków (tak aby na każdym Penie był taki sam)
  • pomiń parametr "-o"
Podobnie postępójemy jeżeli chcemy aby dwóch urzytkowników logowało się za pomocą jednego Pendrive'a (komende wykonujemy dla każdego z nich pomijając parametr "-o" i zamieniając anystring na jakieś hasło)

krok nr 5 powtórz dla każdego posiadającego pendrive użytkownika!



6. Konfiguracja PAM
Skonfigurowaliśmy właśnie nasz moduł, teraz musimy skonfigurować PAM tak aby wybrane przez nas aplikacje z niego korzystały.

Ulubionym naszym edytorem edytujemy plik /etc/pam.d/common-auth np.

Kod: Zaznacz cały

sudo gedit /etc/pam.d/common-auth
w katalogu /etc/pam.d znajdują sie pliki których nazwy odpowiadają nazwom programów korzystających z PAM, plik który edytujemy jest na Ubuntu wykonywany przez pozostałe tak aby nie trzeba było zmieniać wszystkiego osobno.

Oprócz kilku skomentowanych linii (zaczynających się od #) plik ten powinien zawierać tylko jedną linie i wyglądać jakoś tak:

Kod: Zaznacz cały

#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.).  The default is to use the
# traditional Unix authentication mechanisms.
#
auth    required        pam_unix.so nullok_secure
nieskomentowana linijka oznacza mniej więcej tyle:
Do autentykacji(auth) wymagany jest(required) moduł standardowj autentykacji hasłem unixa (pam_unix) z parametrem(nullok_secure).
Jak już mówiłem to właśnie moduł pam_unix zajmuje sie zapisem haseł i ich odczytem z pliku /etc/shadow i tego typu rzeczami.
To ta linijka sprawia ze w terminalu systemowym, czy w graficznym okienku logowania musisz podać swoje hasło żeby się zalogować.

Aby włączyć weryfikacje Pendrive'm dodajemy linijkę nad tą linijką tak aby wyglądało to następująco:

Kod: Zaznacz cały

#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.).  The default is to use the
# traditional Unix authentication mechanisms.
#
auth    sufficient      pam_usbauth.so
auth    required        pam_unix.so nullok_secure
dodana linijka oznacza tyle co:
do autentykacji(auth) wystarczający(sufficient) jest moduł pam_usbauth.so

linijki w konfiguracji wykonywane są od góry do dołu dzięki czemu po podaniu loginu najpierw PAM sprawdzi czy jest podłączony pendrive odpowiadający użytkownikowi jeśli tak to weryfikacja kończy sie powodzeniem (bo moduł ten jest wystarczający czyli sufficient) a jeśli nie to użytkownik pytany jest o hasło.

Po szczegóły odsyłam do dokumentacji LinuxPAM- http://www.kernel.org/pub/linux/libs/pa ... M_SAG.html



7. Testy
  • Na wszelki wypadek nie wylogowujemy się z aktualnej sesji.
  • Klikamy Alt+Ctrl+F2 by przełączyć się na inny terminal.
  • Wpisujemy naszą nazwę użytkownika i naciskamy enter.
  • Jeżeli wszystko poszło w porządku i nasz pendrive jest podłączony to powinniśmy bez pytania o hasło być już zalogowani.
    Pam_usbauth ma pewne opóźnienie związane z czytaniem danych z pena więc jak nie działa to odłącz i podłącz pena, odczekaj kilka sekund i spróbuj ponownie. Jeżeli nadal nie działa to najprawdopodobniej coś zrobiłeś źle :)
  • Wpisujemy 'logout' i odpinamy pendrive.
  • Wpisujemy nazwę użytkownika i jeżeli zostaliśmy poproszeni o hasło to znaczy że wszystko gra
  • Wracamy do sesij X (Ctrl+Alt+F7)

W przypadku graficznych logowań pole hasło należy pozostawiać puste (nacisnąć enter).



KONIEC

Mam nadzieje że how-to było pomocne, za błędy przepraszam, za wszelkie uwagi będę wdzięczny, zapraszam na PW.

UWAGI:


1)
Po czasie zauważyłem że Windows nie radzi sobie z PenDrivem sformatowanym zgodnie z tym HOWTO,
rozwiązaniem być może byłoby utworznie partycji na dane jako pierwszej a tej z kodami na drugim miejscu, niestety nie mam windy zeby to sprawdzić, jak komuś się uda to zrobić to bede wdzięczny za info na priv.

EDIT
Dostałem info od użytkownika Apocalypse że takie rozwiązanie działa (tj zamiana partycji miejscami, fat32 na początku)


2)
polecenie:

Kod: Zaznacz cały

cat /proc/bus/usb/devices

na ubuntu 7.10 pokazuje błąd że nie ma takiego pliku.
EDIT
Użytkownik ukasz zauważył że serial można zobaczyć wydając polecenie:

Kod: Zaznacz cały

 sudo lsusb -v 
więc niżej opisane rozwiązanie ma mały sens.
Rozwiązanie:
Edytujemy plik: '/etc/init.d/mountdevsubfs.sh' i odkomentowywójemy kilka linijek za linijką o nr 40 żeby to wyglądało tak:

Kod: Zaznacz cały

 # Magic to make /proc/bus/usb work
 #
 mkdir -p /dev/bus/usb/.usbfs
 domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
 ln -s .usbfs/devices /dev/bus/usb/devices
 mount --rbind /dev/bus/usb /proc/bus/usb
i teraz albo albo rebootujemy albo po prostu odpalamy ten skrypt:

Kod: Zaznacz cały

$ sudo /etc/init.d/mountdevsubfs.sh start
I teraz już powinno działać.
Po detale odsyłam tutaj: https://bugs.launchpad.net/ubuntu/gutsy ... bug/156085
ODPOWIEDZ

Wróć do „Instalacja i konfiguracja systemu”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 16 gości