Utilizzo delle Smartcard su GNU/Linux

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

    22-Jan-2018
  • Category

    Software

  • view

    439
  • download

    7

Embed Size (px)

Transcript of Utilizzo delle Smartcard su GNU/Linux

  1. 1. Usiamolesmartcard conGNU/Linux Alberto Maria Fiaschi aka Buda Gruppo Utenti Linux Pisa
  2. 2. AcosaserveunaSmartcard? Atenereprivatalachiaveprivata! Lacrittografiasimmetricahailproblemadicondividereuna chiave,mentrenellacrittografiaasimmetricailprincipale puntodeboleconsistenelmanteneresegretaunadelledue chiavi.(Finchnoncisarannosufficientiqbit) Lechiavipossonoesseregeneratedirettamentesullacartae quellaprivatanonneuscirmai!
  3. 3. ConcettibaseCifratura Crittografiasimmetrica:sicondividelastessachiaveper criptareedecriptare.Implicauncanalesicuroperscambio chiave. Crittografiaasimmetrica:siusanoduechiavidistintetotalmente intercambiabili.Seunausatapercriptarel'altrausataper decifrare.Unadelleduechiavivienedivulgatal'altradeve esseremantenutasegreta.Persicurezzadisolitoarchiviatacon crittografiasimmetrica. Lachiavepubblicavieneusatadaunpotenzialeinterlocutore percifrareunmessaggiochesarquindidecifrabilesolodal possessoredellaprivata.
  4. 4. ConcettibaseAutenticit Ilfattocheleduechiavisonointerscambiabili,(possonoessere usatesiapercifrarecheperdecifrare),echelachiaveprivata detenutadaununicosoggetto,deteminailfattochelacrittografia asimmetricapossaessereusatacomecriteriodiautenticit.Sesi riesceadecriptareunmessaggioconunachiavepubblicaci certificacheilsolomittentepossibilesiailpossessoredella corrispondentechiaveprivate.Quindisesicriptaconlachiave privatasifirma. Scaturiscelanecessitdiunterzo,chesiaaffidabile,che certifichichequellacoppiadichiavisiarealmentedetenutada queldeterminatosoggetto:CertificateauthorityCA.
  5. 5. ConcettibaseCertificato Uncertificatounfilechecontieneleinformazioniattead identificareunivocamenteunsoggettouniteallachiave pubblicadiquest'ultimo.Iltutto(hash)vienefirmatocon lachiaveprivatadelsoggettostessoepoitrasmessoalla CAefirmatoconlasuachiaveprivata.Suipcsono preinstallatiicertificatidelleCAriconosciuteperpoter verificarelavaliditdiuncertificato.Ovviamenteposso creareunamiaCA;).
  6. 6. ConcettibaseCRL CertificateRevocationListSeunachiaveprivataviene compromessa(perditaperesempiodismartcard)laCA emetterauncertificatodirevocaperinformaredellanon piattendibilitdiquellafirma. Allaverificadellafirmaisoftwaredovrebbero sempreconsultareleCRL(online).
  7. 7. Smartcard=Praticit Senzasmartcardlachiaveprivatadeveesserecriptata conunapassphrasenonconunapassword!Questone rendescomodol'utilizzoofaricorrereall'usodiunagente cheperpufacilitarnelacompromissioneincasodi malware Lasmartcardgarantiscedaunattaccoditipobruteforce mettendounlimiteaitentativi.Quindipossiamo utilizzareunPINcortoconsicurezza.Inoltreunasua compromissionesicuramenterilevata.Dovela Smartcard?
  8. 8. Standard Glistandardservonopernonessererispettati! Glistandardservonoacoordinarel'attivitfrai3attori:il software,illettoredismartcard,lasmartcard. PKCS=PubblickeyCritoographyStandard PKCS#15formato:comesonoscrittiidatisullasmartcard.ISO/IEC781615 PKCS#11contrattoapplicativo.Interfacciaapi.ISO/IEC781611 T=0/T=1protocollivellosubususbT0characterorientedT1blockoriented concontrollodierrore.ISO/IEC78163.Moltointeoriaognilettoreche mostaT0/T1neloutputdilsusbdovrebbeesseresupportatodalCCID freesoftwaredriver.CCID=chipcardinterfacedeviceprotocol APDUApplicationProtocolDataUnits:sequenzadibyteche corrispondonoacomandiISO/IEC78161
  9. 9. Pacchettinecessari. pcsclite:installademonepcscd(PC/SCspecifichedi unconsorziodivendorperiteroperabilitafrapce smartcardInteroperabilitySpecificationforIntegrated CircuitCardsandPersonalComputerSystems) cciddriverlettoriusb(T0/T1)(vedixml /usr/lib/readers/usb/ifdccid.bundle/Contents/Info.plist) openscutilitiperusarelasmartcard:leggerla,scriverla, cifrare,firmare. Libreriaopenscpkcs11.soimplemetapkcs#11. Consultate anche : http://www.regione.toscana.it/servizi-online/servizi- sicuri/carta-sanitaria-elettronica/guida-all-uso
  10. 10. Utilizzonelbrowser NelcasodellaCNSpossiamoutilizzarelalibreriaopenscpkcs11.sosenzainstallare softwareproprietario(comeperesempioindicailsitodellaregione).Perpoterfirmarei documentiinveceservesoftwareproprietariovistochenonrispettatoinpienolo standardPKCS#15 Installazionefirefox: modifica preferenze avanzate tabcertificati pulsantedispositividi sicurezza pulsantecarica nomemodulo:opensc nomefilemodulo: /usr/lib/openscpkcs11.so Installazionechromium: dallapropriahomeilseguentecomando modutildbdirsql:.pki/nssdb/add"OpenSC"libfile/usr/lib/openscpkcs11.so InUbuntu64bit:/usr/lib/x86_64linuxgnu/openscpkcs11.so InUbuntu32bit:/usr/lib/i386linuxgnu/openscpkcs11.so
  11. 11. 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)
  12. 12. OpenSCpkcs11tool Con il comando pkcs11-tool va sempre specificata la libreria che supporta linterfaccia 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
  13. 13. OpenSCpkcs15tool 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
  14. 14. smartcardconssh 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 loutput 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 [email protected] (usare /etc/ssh/ssh_config per non scriverlo sempre) Ovviamente non si pu usare ssh-agent.
  15. 15. PAM:pam_pkcs11 PAM: 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.
  16. 16. PossibiliMapping # 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
  17. 17. Configurazionestep1 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
  18. 18. Cofigurazionestep2 Verificare che nel file /etc/pam_pkcs11/pam_pkcs11.conf sia ipostato cert_policy = ca,signature; Test della cofigurazione con pklogin_finder Se in output viene visualizzato il nome dellutente locale allora la configurazione corretta. In caso di problemi debug=true; nel file/etc/pam_pkcs11/pam_pkcs11.conf anche 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_ORIG nel file /etc/pamd.d/login commentare riga contenete auth . pam_unix.so #auth required pam_unix.so try_first_pass likeauth nullok aggiungere riga auth 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.
  19. 19. ConfigurazioneFine. 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.
  20. 20. Gestioneeventi 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
  21. 21. Creiamolanostrasmartcard! Acquistiare una smartcard scrivibile supportata. Inizializzazione: Con opensc >12 sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 648219 oppure pkcs15-init -E -C --pin 1111 --puk 1111 #pin fittizzi non vengono effettivamente impostati Verr richiesto immissione Security Officer PIN Impostazione 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 pubblica pkcs15-init --generate-key "RSA/2048" --auth-id 01 --id 10 --label "Mia Private Key" --public-key-label "Mia Public Key"
  22. 22. Lanostrasmartcard: ScrivereilCertificato 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: #openssl Openssl> 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 key Openssl>req -new -x509 -days 3650 -keyform engine -engine pkcs11 -key slot_02-id_10 -out mysmartcard.req.pem openssl>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 corrispondente pkcs15-init -X mysmartcard.cert.pem -id 10
  23. 23. Partizionecriptata consmartcard Fonte: https://blog.g3rt.nl/luks-smartcard-or-token.html creo file con valori random per usarla come password del luks la dimensione per una rsa 2048 bit (si pu criptare solo blocchi multipli della chiave) dd if=/dev/urandom of=/tmp/mykey bs=1 count=245 creo il volume criptato sulla partizione sdb1 che deve essere vuota cryptsetup --key-file=/tmp/mykey--verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/sdb1 mappo la partizione criptata come /dev/mapper/segreto cryptsetup luksOpen /dev/sdb1 segreto creo il file-system mkfs.ext4 /dev/mapper/segreto cripto la password con chiave pubblica pkcs15-tool --read-public-key 10 >/tmp/publickey.pem openssl rsautl -inkey /tmp/publickey.pem -pubin -encrypt -pkcs -in /tmp/mykey -out /boot/encryptedkey.pkcs1 elimino in modo sicuro la password in chiaro shred -n5 -vz /tmp/mykey per montare il volume dovro creare uno script che avr un comando simile a questo pkcs15-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.
  24. 24. Backuppossibile! Seperdooppuresirompelasmartcardchehoutilizzatoper cifraredeidatioppureusatacomecontenitoredellechiavidella miaCAcosafaccio!!! Hopersoirrimediabilmentelamiachiaveprivata? possibileinizzializzareunasmartcardconunachiave simmetricainmanierachesiapossibileesportarelachiave privatainmanieracriptataemagaririversarlasuunaltra smartcard.DeviceKeyEncryptionKey(DKEK). DKEKusaunachiaveAESa256Bitchepossibile suddividereinpipezzi/custodipermaggiorsicurezza.
  25. 25. DeviceKeyEncryptionKey Ogni custode crea la sua chiave sc-hsm-tool --create-dkek-share dkek-share-custode1.pbe sc-hsm-tool --import-dkek-share dkek-share-custode2.pbe si inizzializza la carta dicendo che si usano due custodi sc-hsm-tool --initialize --so-pin 3537363231383830 --pin 648219 --dkek- shares 2 ogni custode importa la propria chiave (in qualsiasi ordine) sc-hsm-tool import-dkek-share dkek-share-custode1.pbe sc-hsm-tool import-dkek-share dkek-share-custode2.pbe si generano le chiavi pkcs11-tool --module /usr/local/lib/opensc-pkcs11.so -l --pin 648219 --keypairgen --key-type rsa:2048 --id 10 esportazione della chiave privata cripatata aes256 sc-hsm-tool --wrap-key wrap-key.bin --key-reference 1 --pin 648219 scrittura su un altra smartcard inizializzata nello stesso modo deve avere la stessa chiave DKEK sc-hsm-tool --unwrap-key wrap-key.bin --key-reference 10 --pin 648219 Fonte: https://github.com/OpenSC/OpenSC/wiki/SmartCardHSM
  26. 26. 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