kezdõlap | home

lapanet | blog | maroknyi IV. - egy maroknyi titok


valószínűleg marginális érdeklõdésre tart számot a smart kártya (chipkártya) - fetisizmusom. már nagyon-nagyon régen szerettem volna rendes bejelentkezést, telepítettem win 2003-ra ad-t meg ca-t meg keresztbe-kasul mindenfélét. aztán feladtam egy jó ideig. egészen addig, amíg fel nem fedeztem magamnak a linuxot, és amíg meg nem jelent egy kulcs howto (majdnem) az összes szükséges részlettel. lelkes amatõrként még izzadtam kis vért, de végül csak sikerült. mivel az eredménnyel nagyon elégedett vagyok, úgy gondoltam megosztom a megoldást.

a dolog ott kezdõdik, hogy ubuntu 10.04. ez lehet, hogy elavult, meg régi meg ilyesmi, de a 2.6.32 phc kernel fél wattal kevesebbet fogyaszt a 3.x-nél, ami nálam a minimálszerveren csaknem 6-8% különbség. elegendõ tapasztalat van hozzá, ismert és kiismert rendszer, amin az általam használt dolgok hibamentesen futnak. ahogy a 2003-at azóta is a legjobb / leghatékonyabb / legtökéletesebb windowsnak tartom, úgy nem váltanék soha vissza rá, mert a 10.04-en (persze sok tanulás és küzdelem árán) mindent magasabb színvonalon tudtam megvalósítani. de inkább elkezdem.


hardver

mégpedig azzal, hogy a kártyázáshoz kell egy kártya. mégpedig nem mindegy milyen chippel. miután az összes általam fellelhetõ kártyáról kiderült, hogy nem alkalmasak, végül beadtam a derekam. itt lehet kapni kártyát és olvasót is. itt már fel lehet szisszenni, hogy ezeket nem adják olcsón. szerencsés esetben a banktól kapott az ember valamilyen olvasót, nekem a notikba praktikusan expresscard került. hozzáteszem ezek a használt gemplushoz képest olcsó eszközök, és sokkal kényelmesebbek is. kevésbé kell bedugni a(z esetleg csonkított) kártyát, és a fogadó nyílás sem olyan idétlen, hogy a család folyton mellé dugdossa. a gemplus megoldása elég ótvar, na.

ott kezdünk, hogy egy kártya nem kártya. ilyen vagy olyan okból ezek a kártyák nálam néha megmakkannak, ami ugyan szoftveresen javítható, de azt meg nehéz ha az ember nem tud belépni a gépbe. én legalább 2 kártyát javaslok, vagy gépenként / családtagonként / loginonként egyet + legalább 1 pót. alapvetõen akármennyi ugyanolyan kártyát csinálhat az ember, ha úgy tartja kedve. a fentebb vásárolt kártyák tök fehér, szimpla bankkártyák. persze van usb-s sim foglalatos kütyü is, ami érdekes de szerintem elég uncsi pölö kulccsomóval küzdeni a bejelentkezéshez.

a kártya nálam jellemzõen folyamatosan a gépben van, gyerkõc egyiknek a kiálló részét le is törte, úgyhogy ki sem lóg. alapvetõen nincs is szükség folyton cibálni. persze ez ebben a formában elvileg kiváltható lenne a gépbe épített tpm chippel, de egyrészt ez szükség esetén mégiscsak kivehetõ, meg amint írtam van belõle pót. nem nagyon találtam leírást a tpm kulcsok bakupolására, hacsak nem csinál az ember wines domain enrollmentet meg mittoménmit. akkor meg ha megmakkan az alaplap nem annyira jó. de továbbra is vérkezdõ vagyok, lehet hogy az infóim és a következtetéseim totál rosszak.


driver

oké, megvan a kártya, megvan az olvasó, telepíthetjük a csomagokat:

apt-get install opensc pcsc-tools libccid libengine-pkcs11-openssl libpam-pkcs11

nano /etc/opensc/opensc.conf

provider_library = /lib/libpcsclite.so.1

az error_file kezdetű sort /dev/null -ra irányítjuk, egyébként mindenféle piros szövegeket kapunk normál működéskor is.

reader_drivers = pcsc;

ezt követõen kicsit át kell írnunk a démonok sorrendjét, egyébként a login ablakra nem szedi össze magát, csak második nekifutásra:

update-rc.d -f pcscd remove
update-rc.d -f pcscd defaults 21

az adott cardman és gemalto pcie olvasó plug & play volt, a másik gép pcmcia-s gemplus kütyüjéhez az alábbi varázslat kellett:

nano /etc/reader.conf.d/gem.conf

FRIENDLYNAME     "GEMplus PCMCIA Reader"
DEVICENAME       /dev/ttyS1
LIBPATH          /usr/lib/pcsc/drivers/serial/libccidtwin.so
CHANNELID        0x2f8

aztán (ez még mindig csak a pcmcia-hoz)

update-reader.conf
/etc/init.d/pcscd restart

az alapvetõ működés tesztje elõször kártya nélkül, majd bedugott kártyával:

lapa@inox:~$ pcsc_scan
PC/SC device scanner
V 1.4.16 (c) 2001-2009, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.5.3
Scanning present readers...
0: OmniKey CardMan 4321 00 00

Wed Nov 28 22:46:05 2012
 Reader 0: OmniKey CardMan 4321 00 00
  Card state: Card removed,

Wed Nov 28 22:46:08 2012
 Reader 0: OmniKey CardMan 4321 00 00
  Card state: Card inserted,
  ATR: 3B 9F 9...

ha ez van akkor örülünk, mert a hardverek működnek.


kulcsok

elõször minden kártyát inicializálunk. hogy teljes legyen a kép inkább ott kezdem, hogy a kártyát akárhányszor újra tudjuk építeni, de minden újrainicializálás elõtt törölni kell. ezt a törlést az elsõ esetben nyilván nem kell megtennünk, de ez a teljes folyamat:

lapa@inox:~$ pkcs15-init -E
Using reader with a card: OmniKey CardMan 4321 00 00
lapa@inox:~$

ezzel töröltük a kártyát, jöhet az inicializálás. az elsõ lényeges, hogy a névnek két tagból kell állnia, nekem legalábbis a késõbbi certifika-csinálásokkor nem sikerült anélkül. a második, hogy meg kell adnunk egy pin kódot. amennyire én értettem a pin kód szükségessége kártyafüggõ, és ennél a kártyánál 4-8 szám és asszem betű is lehet. én a klasszik 4 számjegyet választottam. harmadikként meg lehet adni egy puk kódot (unblock code), én ezt mindig becsülettel meg is tettem. a kártya 3 rossz pin után tilt.

pkcs15-init -C --label "lapa juzer"
Using reader with a card: Feitian SCR301 00 00
New User PIN.
Please enter User PIN:
Please type again to verify:
Unblock Code for New User PIN (Optional - press return for no PIN).
Please enter User unblocking PIN (PUK):
Please type again to verify:

ha 3-szor elrontanánk a pint, akkor

gnome-terminal -e 'pkcs15-tool --unblock-pin'

több ugyanolyan kártyához jobb külsõ kulcsot csinálni. ez a következõképp néz ki:

lapa@inox:~$ openssl genrsa -des3 -out /tmp/mykey.key 2048
Generating RSA private key, 2048 bit long modulus
....................................+++
..............+++
e is 65537 (0x10001)
Enter pass phrase for /tmp/mykey.key:
Verifying - Enter pass phrase for /tmp/mykey.key:
lapa@inox:~$

a generált kulcsot visszatuszkoljuk a kártyára. valamiért sokszor kéri a pint. (most látom a tündér nem csinál csúszkát a hosszú sorokhoz, milyen jópofa. a \ jel lesz a sortörés, az ilyeneket egy sornak kérem értelmezni a jövõben, \ nélkül)

lapa@inox:~$ pkcs15-init -S /tmp/mykey.key --auth-id ff --label "scpk" \
--public-key-label "scpuk"
Using reader with a card: OmniKey CardMan 4321 00 00
Please enter passphrase to unlock secret key:
User PIN required.
Please enter User PIN:
User PIN required.
Please enter User PIN:
User PIN required.
Please enter User PIN:
User PIN required.
Please enter User PIN:
lapa@inox:~$

ezután ellenõrizzük mi történt:

lapa@inox:~$ pkcs15-tool -D

...
Public RSA Key [scpuk]
 Com. Flags  : 2
 Usage       : [0x4], sign
 Access Flags: [0x0]
 ModLength   : 2048
 Key ref     : 0
 Native      : no
 Path        : 3f0050153045
 Auth ID     :
 ID          : 45
...

itt feljegyezzük a kulcsok ID-jét (utolsó sor, 45). következõnek lekérünk egy certifikát a kártyáról:

lapa@inox:~$ openssl
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so \
-pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:opensc-pkcs11.so
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/lib/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine
OpenSSL>

oké, betöltöttük a kártyaizélgetést, jön a tényleges lekérés:

OpenSSL> req -new -x509 -days 3650 -keyform engine -engine pkcs11 \
-key id_45 -out /tmp/cert
engine "pkcs11" set.
PKCS#11 token PIN:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:HU
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:lapa juzer
Email Address []:lapa@juzer.hu
OpenSSL>

itt érdemes megnézni a 3650-es számot, ami 10 év minõségmegõrzési idõt jelent. nem volt vicces ugyanis, mikor egy év múltán az egész család visszament neandervölgyibe egy lejárt certifika miatt.

kilépünk az openssl-bõl, és visszamásoljuk a fikát a kártyára:

OpenSSL> ^C
lapa@inox:~$ pkcs15-init -X /tmp/cert --auth-id ff --id 45 --format pem
Using reader with a card: OmniKey CardMan 4321 00 00
User PIN required.
Please enter User PIN:
User PIN required.
Please enter User PIN:
lapa@inox:~$

nemsokára készen vagyunk. elmondjuk a rencörnek, hogy ne zárolja a kártyát, egyébként nem tudnánk több mindenre használni egymás után.

sudo nano /etc/opensc.conf

itt ki kell venni a komment jelet az alábbi sor elõl:

lock_login = false;


bejelentkezés

elsõnek a bejelentkezést varázsoljuk meg:

sudo mkdir /etc/pam_pkcs11

zcat /usr/share/doc/libpam-pkcs11/examples/pam_pkcs11.co\
nf.example.example.gz | sudo tee /etc/pam_pkcs11/pam_pkcs11.conf

mkdir /etc/pam_pkcs11/cacerts /etc/pam_pkcs11/crls

nano /etc/pam_pkcs11/pam_pkcs11.conf

use_mappers = pwent; (a többi törölhetõ)

következik a certifika másolása

sudo cp /tmp/cert /etc/pam_pkcs11/cacerts

cd /etc/pam_pkcs11/cacerts
sudo pkcs11_make_hash_link

nano /etc/passwd

lapa:x:1000:1000:lapa juzer:/home/lapa:/bin/bash

itt fontos, hogy "lapa juzer" egyezzen a kártya cn-jével és ne legyen mögötte ,,,

addgroup scard
adduser lapa scard

sudo nano /etc/pam.d/common-auth

...
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

auth    [success=3 default=ignore]  pam_pkcs11.so

# here are the per-package modules (the "Primary" block)
auth    [success=2 default=ignore]  pam_unix.so nullok_secure
...

ezzel készen vagyunk. elméletileg ezen a ponton az ubuntu bejelentkezõ képernyõje már "Enter User PIN for lapa juzer" -rel fogad, és a pint beírva beléphetünk. mindazonáltal itt még megmarad a lehetõség a jelszavas belépésre is.

kisebb üröm az örömben, hogy bár beenged a gépszörny, de nem nyitja ki nekünk a keyringet. ez pölö wifi jelszavaknál kellemetlen (ethernetet kell használni, ugye), de a kevésbé paranoidok lenullázhatják a keyring jelszót. természetesen ez nagyon nem ajánlott. ugyanígy nem nyitja ki a tündér a titkol ecryptfs partíciókat sem. erre majd úgyis truecrypt lesz mindjárt.

elõtte azonban a talán leggyakrabban használt sudo bigyóztatást csináljuk meg, az alábbiak szerint:

sudo nano /etc/pam.d/sudo

#%PAM-1.0

auth sufficient pam_pkcs11.so

@include common-auth
@include common-account

ezután teszt (sudo -k sudotlanít):

lapa@inox:/etc/pam_pkcs11/cacerts$ sudo -k
lapa@inox:/etc/pam_pkcs11/cacerts$ sudo -i
Please insert your Smart card or enter your username.
Found the Smart card.
Welcome lapa juzer (User PIN)!
Smart card PIN:
root@inox:~#

bár a grafikus felületen a sudo jelszó kérésnél "password"-öt kér, a pint elfogadja.


ssh bejelentkezés

jöhetnek az izgalmasabb dolgok, például a svájci bicska ssh. sajnos a 10.04-ben lévõ ssh kliens még nem támogatja a kártyázást, legegyszerűbb egy újabbat letölteni és felrakni:

apt-get install zlib1g-dev

dpkg -i /l/app/vnc/ssh/libssl1.0.0_1.0.0d-2ubuntu1_amd64.deb
dpkg -i /l/app/vnc/ssh/openssh-server_5.8p1-7ubuntu1_amd64.deb
dpkg -i /l/app/vnc/ssh/openssh-client_5.8p1-7ubuntu1_amd64.deb

ha megvan az új ssh (amúgy minimum 5.4), akkor

pkcs15-tool --read-ssh-key 45

ahol 45 a korábban már használt ID. eztán a szerveren az rsa-val kezdõdõ sor(ok) megy

~/.ssh/authorized_keys -be, egyetlen új sorba. ezután lehet tesztelni:

lapa@inox:/etc/pam_pkcs11/cacerts$ ssh localhost
The authenticity of host '[localhost]:22 ([127.0.0.1]:22)' can't be established.
RSA key fingerprint is ....
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:22' (RSA) to the list of known hosts.
Enter PIN for 'lapa juzer (User PIN)':
Linux inox 2.6.32-31-generic-phc #61~phc0-Ubuntu SMP...
Ubuntu 10.04.4 LTS
...
lapa@inox:~$ exit
logout
Connection to localhost closed.
lapa@inox:/etc/pam_pkcs11/cacerts$


távoli könyvtár csatolása

és ha már ez az ssh-zás ilyen egyszerűen négygombosan megy, én elkezdtem ezt használni a helyi hálózati meghajtók csatolására is. mivel a jegyzeteim kicsit kuszák a pontos protokollt nem tudom elmondani, de ezek vannak fenn a kliensen (azaz sshfs és fuse):

lapa@inox:/etc/pam_pkcs11/cacerts$ sshfs -V
SSHFS version 2.2
FUSE library version: 2.8.6
fusermount version: 2.8.6
using FUSE kernel interface version 7.12
lapa@inox:/etc/pam_pkcs11/cacerts$

a hálózati meghajtó csatolása így néz ki:

sshfs -o ro lapa@szerver:/konytar /media/valami/ -p 22

a -o ro írásvédetté teszi a megosztást, a becsatolás a /media/ könytárba pedig meg fogja jeleníteni egy meghajtóként a távoli kütyüt. nyilván paranoid lan-on titkolni, de sebességben még a hardveresen nem gyorsított 1.6 ghz c2d cpu-val is csak brutál átviteleknél van különbség sambához képest (35 vs. 28 MB/s). viszont így transzparens, ugyanezzel a módszerrel a világon bárhol becsatolom az otthoni meghajtót. nem tudom, hogy ez mennyire magától értetõdõ, de jól bírja a kábel kihúzás-bedugást is egy darabig.


távoli asztal

belemelegedve az ssh-ba elég sokat sírtam a távoli asztal miatt. a linuxos kliensekkel nekem sehogyse jött össze rendesen a dolog, az egyikben semmit nem tudtam állítani, a másik döglassú volt valami miatt. vagy féltucat kliens kipróbálása után végre megtaláltam az ssvnc-t, ami azóta is remekül szolgál. elõször is le kell tölteni az 1.0.29 verziót, mert már nem tudom miért, de kell valamihez. ezután a távoli gépre is pin kóddal jlentkezhetünk be, valahogy így:

env SSVNC_ONCE_ONLY=1, SSVNC_FINISH_SLEEP=0, SS\
VNC_SCALE='0.63' /usr/lib/ssvnc/Unix/tsvnc lapa@masikgep

itt csak skálázás van, mert a másik gép képernyõje nagyobb. kis sávszélességnél lehet mindenféle egyszerűsítéssel élni:

env VNCVIEWERCMD_EXTRA_OPTS='-use64 -grey' SSVNC_ONCE_ON\
LY=1, SSVNC_FINISH_SLEEP=0, SSVNC_SCALE='0.93' /usr/lib/ssvnc/Unix/ts\
vnc lapa@masikgep

ezen kívül van még vagy félezer kapcsoló, amihez lövésem sincs. többek között azt sem sikerült kiderítenem, hogy hogyan tudom windowsosan már a login képernyõtõl uralni a távolt, a fejlesztõ meg megunta, hogy értetlenkedek. ha valaki rájön hogyan lehet megcsinálni nyert egy üveg pezsgõt tõlem.

nem tartozik a tárgyhoz, de ha nagyon kell, akkor lehet rendes terminálszervert is csinálni a gépbõl:

apt-get install neatx-server

paranccsal, amihez a nomachine klienssel windows-lájk terminálkliensként csatlakozhatunk. bár ssh-n megy ez is, sajnos nem támogatja a smart kártyázást.


titkolt partíció

végszóként összefoglalom az adatok titkolását is. az ubuntu beépített megoldása ahogy írtam nem támogatja a harvderkulcsot, úgyhogy részemrõl a truecrypt mellett tettem le a voksom. ez teljes mértékben támogatja a tokeneket, és elég egyértelmű a korábban linkelt eredeti leírás is. címszavakban azonban összefoglalom, mert ha nincs minden jól belõve klikkolgatni kell:

preferences --> security tokens: /usr/lib/opensc-pkcs11.so és close session.

tools --> keyfile generator (akár bármilyen létezõ fájl is lehet, de nem szerencsés olyat választani, ami valaha is létezett ramon meg a kártyákon kívül valahol titkosítatlanul. a dolog másik fele, hogy a truecrypt partíciót a fájl nélkül a jósisten se nyitja ki, úgyhogy érdemes egy (azaz több) biztonsági mentést csinálni, pölö gpg-vel és egy rettentõ hosszú jelszóval betitkolva.

preferences --> manage token keyfiles --> import --> pin --> megjelenik --> cancel.

preferences --> keyfiles --> add token files --> pin --> kiválaszt. ugyanitt "use keyfiles by default" pipa.

ha minden igaz innentõl az adott token kulccsal titkolt partíció az alábbiak szerint nyílik:

truecrypt --> auto-mount devices --> kis ablak --> enter --> pin --> örülünk.

természetesen kombinálható jelszóval, más fájlokkal, satöbbi. meglévõ truecrypt meghajtók gyorsan átállíthatók erre a kulcsra.

viszont ez még mindig kézimatyizás, meg (nálam legalábbis) sudo. hogy a titkolt partíció egyszerűen csatlakoztatható legyen én az alábbi primitív parancsot tákoltam össze:

sudo gnome-terminal -x truecrypt -t --verbose --auto-mount=dev\
ices --keyfiles=token://slot/0/file/x --token-lib=/usr/lib/opensc/open\
sc-pkcs11.so --password=""

ez két terminált nyit egymás után, elsõben a sudo, másodikban a truecrypt részére kéri a pint, ezzel csatlakoztatja a fellelhetõ partíciókat.