Utilizzo delle Smartcard su GNU/Linux

26
Usiamo le smartcard con GNU/Linux  Alberto Maria Fiaschi aka Buda Gruppo Utenti Linux Pisa

Transcript of Utilizzo delle Smartcard su GNU/Linux

Page 1: Utilizzo delle Smartcard su GNU/Linux

Usiamo le smartcard con GNU/Linux  

Alberto Maria Fiaschi aka BudaGruppo Utenti Linux Pisa

Page 2: Utilizzo delle Smartcard su GNU/Linux

A cosa serve una Smartcard ?

A tenere privata la chiave privata!

La crittografia simmetrica ha il problema di condividere una chiave, mentre nella crittografia asimmetrica il principale punto debole consiste nel  mantenere  segreta una delle due chiavi. (Finché non ci saranno sufficienti qbit)

Le chiavi possono essere generate direttamente sulla carta e quella privata non ne “uscirà” mai !

 

Page 3: Utilizzo delle Smartcard su GNU/Linux

Concetti base ­ Cifratura

Crittografia simmetrica: si condivide la stessa chiave per criptare e decriptare. Implica un canale sicuro per scambio chiave.

Crittografia asimmetrica: si usano due chiavi distinte totalmente intercambiabili. Se una è usata per criptare l'altra è usata per decifrare. Una delle due chiavi viene divulgata l'altra deve essere mantenuta segreta. Per sicurezza di solito archiviata con crittografia simmetrica.

La chiave pubblica viene usata da un potenziale interlocutore per cifrare un messaggio che sarà quindi decifrabile solo dal possessore della privata. 

Page 4: Utilizzo delle Smartcard su GNU/Linux

Concetti base – Autenticità

Il fatto che  le due chiavi sono interscambiabili ,( possono essere usate sia per cifrare che per decifrare), e che la chiave privata è detenuta da un unico soggetto, detemina il fatto che la crittografia asimmetrica possa essere usata come criterio di autenticità. Se si riesce a decriptare un messaggio con una chiave pubblica ciò certifica che il solo mittente possibile sia il possessore della corrispondente chiave private. Quindi se si cripta con la chiave privata si firma.

Scaturisce la necessità  di un terzo, che sia affidabile, che certifichi che quella coppia di chiavi sia realmente detenuta da quel determinato soggetto: Certificate authority ­ CA.

Page 5: Utilizzo delle Smartcard su GNU/Linux

Concetti base ­ Certificato

Un certificato è un file che contiene le informazioni atte ad identificare univocamente un soggetto unite alla chiave pubblica di quest'ultimo. Il tutto (hash) viene firmato con  la chiave privata del soggetto stesso e poi trasmesso alla CA e firmato con la sua chiave privata. Sui pc sono preinstallati i certificati delle CA riconosciute per poter verificare la validità di un certificato. Ovviamente posso creare una mia CA  ;­) .

Page 6: Utilizzo delle Smartcard su GNU/Linux

Concetti base ­ CRL

Certificate Revocation List – Se una chiave privata viene compromessa (perdita per esempio di smart­card) la CA emettera un certificato di revoca per informare della non più attendibilità di quella firma. 

Alla verifica della firma i software dovrebbero sempre consultare le CRL (on­line).

Page 7: Utilizzo delle Smartcard su GNU/Linux

Smartcard = Praticità

Senza smartcard la chiave privata deve essere criptata con una passphrase non con una password! Questo ne rende scomodo l'utilizzo o fa ricorrere all'uso di un agente che però può facilitarne la compromissione in caso di «malware»

La smartcard garantisce da un attacco di tipo brute­force mettendo un limite ai tentativi. Quindi possiamo utilizzare un PIN „corto“ con sicurezza. Inoltre una sua compromissione è sicuramente rilevata. «Dove è la Smartcard?»

Page 8: Utilizzo delle Smartcard su GNU/Linux

Standard Gli standard servono per non essere rispettati!

Gli standard servono a coordinare l'attività fra i 3 attori : il software, il lettore di smartcard, la smart card. PKCS = Pubblic key Critoography Standard 

PKCS #15 formato: come sono scritti i dati sulla smartcard. ISO/IEC 7816­15

PKCS #11 contratto applicativo. Interfaccia api. ISO/IEC 7816­11

T=0/T=1 protocol ­livello su bus usb  T0 character­oriented  T1 block­oriented con controllo di errore. ISO/IEC 7816­3 . „Molto in teoria“ ogni lettore che mosta T0/T1 nel output di lsusb dovrebbe essere supportato dal CCID free software driver.  CCID = chip card interface device protocol

APDU Application Protocol Data Units: sequenza di byte che corrispondono a comandi ISO/IEC 7816­1

Page 9: Utilizzo delle Smartcard su GNU/Linux

Pacchetti necessari. pcsc­lite :  installa demone pcscd (PC/SC specifiche di 

un consorzio di vendor per iteroperabilita fra pc e smartcard Interoperability Specification for Integrated Circuit Cards and Personal Computer Systems)

ccid  driver lettori usb (T0/T1) (vedi xml /usr/lib/readers/usb/ifd­ccid.bundle/Contents/Info.plist)

opensc  utiliti per usare la smartcard: leggerla, scriverla, cifrare, firmare.Libreria opensc­pkcs11.so implemeta pkcs #11 . 

Consultate anche : http://www.regione.toscana.it/servizi-online/servizi-sicuri/carta-sanitaria-elettronica/guida-all-uso

Page 10: Utilizzo delle Smartcard su GNU/Linux

Utilizzo nel browserNel caso della CNS possiamo utilizzare la libreria opensc­pkcs11.so senza installare software proprietario (come per esempio indica il sito della regione). Per poter firmare i documenti invece serve software proprietario visto che non è rispettato in pieno lo standard PKCS #15

Installazione firefox:modifica   preferenze   avanzate   tab certificati   pulsante dispositivi di → → → →sicurezza   pulsante carica   nome modulo: opensc  nome file modulo: → → →/usr/lib/opensc­pkcs11.soInstallazione chromium:dalla propria home il seguente comandomodutil ­dbdir sql:.pki/nssdb/ ­add "OpenSC" ­libfile /usr/lib/opensc­pkcs11.so

In Ubuntu 64bit :  /usr/lib/x86_64­linux­gnu/opensc­pkcs11.soIn Ubuntu 32bit :  /usr/lib/i386­linux­gnu/opensc­pkcs11.so

Page 11: Utilizzo delle Smartcard su GNU/Linux

OpenSC

● opensc-tool

● -l elenca i lettori disponibili.

● -D elenca i driver delle smartcard supportate.

● --list-algorithms se è presente una smartcard ne eleca algoritmi supportati.(rsa/1024 rsa/2048)

● Opensc-explorer: tool piú di basso livello.

File di configurazione : /etc/opensc.conf(in caso di problemi impostare debug=1)

Page 12: Utilizzo delle Smartcard su GNU/Linux

OpenSC  pkcs11­tool

Con il comando pkcs11-tool va sempre specificata la libreria che supporta l‘interfaccia PKCS #11 da utilizzare.--module /usr/lib/opensc-pkcs11.so

pkcs11-tool ha molte opzioni e permette di fare quasi tutte le operazioni possibili con una smart card ma in un modo non molto intuitivo… e per niente user-friendly..

Con -L possiamo visualizzare la lista degli slot esistenti.

La sitasssi slot_“num-slot“-id_“num-key“ in alcuni casi serve per identificare la chiave che vogliamo adoperare.

Per esempio slot_2-id_1

Page 13: Utilizzo delle Smartcard su GNU/Linux

OpenSC pkcs15­tool pkcs15-tool -D : visualizza tutto il contenuto della smartcard.

(ovviamente per pin e chiavi private visualizza solo i loro identificativi ma non i loro valori)

--list-public-key : lista id chiavi pubbliche.

--list-key : lista id chiavi private.

--read-public-key id-key : visualizza la chiave pubblica in formato pem.

-c : lista certificati.

-r id-cert :visualizza il certificato in formato pem.

Esempio rendere intellegibile certificato con id 01 pkcs15-tool -r 01 | openssl x509 -text -noout

Page 14: Utilizzo delle Smartcard su GNU/Linux

smartcard con ssh

pkcs15-tool --read-ssh-key idkey visualizza chiave pubblica in formato ssh utile per abilitare logon via ssh usando la smartcard ( a volte va in errore usare al suo posto ssh-keygen -D /usr/lib/opensc-pkcs11.so)quindi per autorizzare il logon via ssh per un determinato utente basta aggiungere l‘output del comando a ~/.ssh/authorized_keys (pc-server)

ssh-keygen -D /usr/lib/opensc-pkcs11.so >> ~/.ssh/authorized_keys

per collegarsi con smartcaed inserita (pc client):

ssh -I /usr/lib/opensc-pkcs11.so utente@host (usare /etc/ssh/ssh_config per non scriverlo sempre)

Ovviamente non si può usare ssh-agent.

Page 15: Utilizzo delle Smartcard su GNU/Linux

PAM : pam_pkcs11PAM: Plugabe Pluggable Authentication Modules permette di poter decidere il metodo di autenticazione per ogni applicazione . Le configurazioni sono scritte in : /etc/pam.d/[nomeApplicazione]

Per autenticarsi con la smartcard installare pam_pkcs11.Configurazione in /etc/pam_pkcs11/pam_pkcs11.conf

Prossimi passi da fare per usare la Carta Nazionale die Servizi come logon sul nostro pc:- definire quali CA accettare ,(quale root CA si deduce dalla parte ffinale del subject scritto nel certificato presente sulla carta)- impostare la libreria da utilizzare - nel nostro caso opensc-pkcs11.so.- indicare come mappare il nome presente nel certificato con un utente locale.

Page 16: Utilizzo delle Smartcard su GNU/Linux

Possibili Mapping # subject - Cert Subject to login file based mapper

# pwent - CN to getpwent() login or gecos fields mapper

# ldap - LDAP mapper

# opensc - Search certificate in ${HOME}/.eid/authorized_certificates

# openssh - Search certificate public key in ${HOME}/.ssh/authorized_keys

# mail - Compare email fields from certificate

# ms - Use Microsoft Universal Principal Name extension

# krb - Compare againts Kerberos Principal Name

# cn - Compare Common Name (CN)

# uid - Compare Unique Identifier

# digest - Certificate digest to login (mapfile based) mapper

# generic - User defined certificate contents mapped

# null - blind access/deny mapper

Page 17: Utilizzo delle Smartcard su GNU/Linux

Configurazione step 1 Copiare certificati CA (DER O PEM) nella cartella /etc/pam_pkcs11/cacerts/ (download da URL scritto nel certicato)

Andare in /etc/pam_pkcs11/cacerts/ e come root eseguire pkcs11_make_hash_link crea link simbolici usati per trovare CA dal modulo PAM.

Se non esiste creare la cartella crl in /etc/pam_pkcs11 Usiamo il mapper subject quindi editiamo il file /etc/pam_pkcs11/pam_pkcs11.conf e mettiamo use_mappers = subject

Creare file /etc/pam_pkcs11/subject_mapping con una riga del tipo:[Subject certificato] [nome-utente]→ (freccia fatta con meno maggiore) Subject certificato visualizzabile con pkcs11_listcerts

Page 18: Utilizzo delle Smartcard su GNU/Linux

Cofigurazione step 2Verificare che nel file /etc/pam_pkcs11/pam_pkcs11.conf sia ipostatocert_policy = ca,signature; Test della cofigurazione con pklogin_finder Se in output viene visualizzato il nome dell‘utente locale allora la configurazione è corretta.In caso di problemi debug=true; nel file/etc/pam_pkcs11/pam_pkcs11.confanche nella riga relativa al mapper usato.

Superato il test procediamo con modificare la configurazione di pam. Conviene all'inizio cambiare un solo servizio per poter ripristinare la situazione precedende in caso di problemi. Se si ha un sistema con logon grafico possiamo provare con il servizio login in caso di problemi accederemo sempre tramite logon grafico.Se sietenutenti esperti fate il viceversa ;-)

Backup per poter tornare indiero: sudo cp -a /etc/pam.d /etc/pam.d_ORIGnel file /etc/pamd.d/login commentare riga contenete auth …. pam_unix.so #auth required pam_unix.so try_first_pass likeauth nullokaggiungere rigaauth required pam_pkcs11.so config_file=/etc/pam_pkcs11/pam_pkcs11.conf

Andare in una tty (CTRL+ALT+F2) e provare ad effettuare un login.

● Se invece è presente auth include nomeDiUnFile copiare il file incluso con un altro nome, modificarlo come sopra e poi includere quello.

Page 19: Utilizzo delle Smartcard su GNU/Linux

Configurazione ­ Fine.

Se tutte le prove hanno avuto esito positivo possiamo procedere a cambiare l'autenticazione per tutti i servizi.

Di solito la maggior parte delle distribuzioni fanno includere a tutti i servizi una o più configurazioni generali di base, quindi basta cambiare quei file . Prima effettuarne una copia aggiungendo un suffisso al nome originale (per esempio _ORIG).

ATTENZIONE: sshd deve usare la configurazione originale quindi modificare il file /etc/pamd.d/ssh per che includa la copia con suffisso _ORIG

Se volete usare la smartcard con ssh usate il metodo precedentemente descritto.

Page 20: Utilizzo delle Smartcard su GNU/Linux

Gestione eventi

● Tramite il file di configurazione /etc/pam_pkcs11/pkcs11_eventmgr.confè possibile far eseguire dei comandi all'inserimento o alla rimozione della smartcard .Blocchiamo lo schermo con xscreensaver: event card_remove { on_error = ignore; action ="xscreensaver-command -lock“#oppure =“notify-send -t 2000 -c 'Status' 'Smartcard rimossa. Blocco!' -i 'system-lock-screen'; sleep 2; xscreensaver-command -lock" }

event card_insert { on_error = ignore ; action = "xscreensaver-command -deactivate"; }

● Eseguire /usr/bin/pkcs11_eventmgr all avvio della sessione grafica.In xfce impostazioni sessione e avvio tab avvio automatico pulsante aggiungi → → →inserire nome e descrizione e in comando mettere → /usr/bin/pkcs11_eventmgr

Oppure creare manualmente un file di tipo .desktop in ~/.config/autostart

Page 21: Utilizzo delle Smartcard su GNU/Linux

Creiamo la nostra smartcard! 

Acquistiare una smartcard scrivibile supportata. Inizializzazione:Con opensc >12 sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 648219oppurepkcs15-init -E -C --pin 1111 --puk 1111 #pin fittizzi non vengono effettivamente impostati

Verrà richiesto immissione Security Officer PINImpostazione pin e puck per il primo slot:pkcs15-init -P -a 1 -l "Il mio PIN"Generazione coppia di chiavi associate al pin numero 1 (cambiare in RSA/1024 se la carta non supporta 2048)id è il numero usato per identificare chiave privata e pubblicapkcs15-init --generate-key "RSA/2048" --auth-id 01 --id 10 --label "Mia Private Key" --public-key-label "Mia Public Key"

Page 22: Utilizzo delle Smartcard su GNU/Linux

 La nostra smartcard:Scrivere il Certificato

E' necessario sia installato il pacchetto engine_pkcs11 per far si che openssl usi la smartcard per le operazioni che utilizzano la chiave privata. Avviare openssl in maniera interattiva e immettere i seguenti comandi:#opensslOpenssl> engine -t dynamic -pre SO_PATH:/usr/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib/opensc-pkcs11.so

una volta caricata la libreria si può generare il certificato e auto-firmarlo (man openssl) Fare attenzione ad id slot e id keyOpenssl>req -new -x509 -days 3650 -keyform engine -engine pkcs11 -key slot_02-id_10 -out mysmartcard.req.pemopenssl>x509 -engine pkcs11 -signkey slot_02-id_10 -keyform engine -in mysmartcard.req.pem -out mysmartcard.cert.pem

Ottenuto il nostro certificato scriviamolo sulla smartcard con lo stesso id della coppia di chiavi corrispondentepkcs15-init -X mysmartcard.cert.pem -id 10

Page 23: Utilizzo delle Smartcard su GNU/Linux

Partizione criptata„con smartcard“

Fonte: https://blog.g3rt.nl/luks-smartcard-or-token.html

creo file con valori random per usarla come password del luksla dimensione è per una rsa 2048 bit (si può criptare solo blocchi multipli della chiave)dd if=/dev/urandom of=/tmp/mykey bs=1 count=245creo il volume criptato sulla partizione sdb1 che deve essere vuotacryptsetup --key-file=/tmp/mykey--verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/sdb1mappo la partizione criptata come /dev/mapper/segretocryptsetup luksOpen /dev/sdb1 segretocreo il file-systemmkfs.ext4 /dev/mapper/segretocripto la password con chiave pubblicapkcs15-tool --read-public-key 10 >/tmp/publickey.pemopenssl rsautl -inkey /tmp/publickey.pem -pubin -encrypt -pkcs -in /tmp/mykey -out /boot/encryptedkey.pkcs1elimino in modo sicuro la password in chiaroshred -n5 -vz /tmp/mykey

per montare il volume dovro creare uno script che avrà un comando simile a questopkcs15-crypt --decipher --input /boot/encryptedkey.pkcs1 --pkcs1 --raw | cryptsetup --key-file=- luksOpen /dev/sdb1

A scapito di un po di sicurezza ma con più comodità posso automatizzare il montaggio della partizione senza alcun prompt. Se la smartcard è presente basta aggiungere il parametro –pin 1111 a pkcs15-crypt. Ricordarsi di togliere smartcard subito dopo il montaggio.

Page 24: Utilizzo delle Smartcard su GNU/Linux

Backup possibile!

Se perdo oppure si rompe la smartcard che ho utilizzato per cifrare dei dati oppure usata come contenitore delle chiavi della mia CA cosa faccio!!!Ho perso irrimediabilmente la mia chiave privata ?

È possibile inizzializzare una smartcard con una chiave simmetrica in maniera che sia possibile esportare la chiave privata in maniera criptata e magari riversarla su un altra smartcard.  Device Key Encryption Key (DKEK).DKEK usa una chiave  AES a 256­Bit  che è possibile suddividere in più pezzi/custodi per maggior sicurezza.

Page 25: Utilizzo delle Smartcard su GNU/Linux

Device Key Encryption Key 

Ogni custode crea la sua chiavesc-hsm-tool --create-dkek-share dkek-share-custode1.pbesc-hsm-tool --import-dkek-share dkek-share-custode2.pbesi inizzializza la carta dicendo che si usano due „custodi“sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 648219 --dkek-shares 2ogni custode importa la propria chiave (in qualsiasi ordine)sc-hsm-tool –import-dkek-share dkek-share-custode1.pbesc-hsm-tool –import-dkek-share dkek-share-custode2.pbesi generano le chiavipkcs11-tool --module /usr/local/lib/opensc-pkcs11.so -l --pin 648219 --keypairgen --key-type rsa:2048 --id 10esportazione della chiave privata cripatata aes256sc-hsm-tool --wrap-key wrap-key.bin --key-reference 1 --pin 648219scrittura su un altra smartcard inizializzata nello stesso mododeve avere la stessa chiave DKEKsc-hsm-tool --unwrap-key wrap-key.bin --key-reference 10 --pin 648219

Fonte: https://github.com/OpenSC/OpenSC/wiki/SmartCardHSM

Page 26: Utilizzo delle Smartcard su GNU/Linux

Fonti.✔ https://en.wikipedia.org/wiki

✔ https://github.com/OpenSC/OpenSC/wiki/

✔ https://github.com/LudovicRousseau/CCID

✔ https://blog.g3rt.nl/luks-smartcard-or-token.html