Upload
philippe-prados
View
146
Download
4
Embed Size (px)
DESCRIPTION
Comment installer, gérer, sécuriser et utiliser une clef privée ? Comment partager une clef privée entres applications? Comment résister au vol du téléphone? Via des API cachées, des scénarios originaux et autres subtilités.
Citation preview
1
Tél : +33 (0)1 58 56 10 00
Fax : +33 (0)1 58 56 10 01
www.octo.com© OCTO 2013
50, avenue des Champs-Elysées
75008 Paris - FRANCE
Philippe Prados
Aurélien Rambaux17 Juin 2013
Installer, gérer, sécuriser et utiliser
une clef privée dans Android
2
Infrastructure à clés publiques
Sauvegarder un certificat
Partager un certificat
Un scénario possible chez un client
Au menu
3
Tél : +33 (0)1 58 56 10 00
Fax : +33 (0)1 58 56 10 01
www.octo.com© OCTO 2013
50, avenue des Champs-Elysées
75008 Paris - FRANCE
Qu’est-ce ?
Infrastructure à clés publiques (PKI)
4
Fichier signé numériquement par une autorité
Equivalent à une carte d’identité
Authentification sur le mode « je possède »
Considéré comme plus sécurisé qu’un mot de passe
Sert de preuve juridique
Signature basé sur du chiffrement asymétrique
Qu’est-ce qu’un certificat numérique ?
5
Ce que je chiffre avec l’un…
… je le déchiffre avec l’autre
Une clé privée liée à une clé publique
6
Objectif d’une PKI :
Authentification mutuelle forte
Confidentialité
Non-répudiation
Pour les mobiles :
Gérer l’accès à un intranet
Gérer le vol de mobile
Infrastructure à clés publiques (PKI)
7
Comment sauver un certificat dans un espace sécurisé du
téléphone ?
Comment résister au vol du téléphone ?
Comment contrôler l’accès au certificat aux seules applications
autorisées ?
Comment distribuer le certificat aux terminaux
Dans cette session
8
Tél : +33 (0)1 58 56 10 00
Fax : +33 (0)1 58 56 10 01
www.octo.com© OCTO 2013
50, avenue des Champs-Elysées
75008 Paris - FRANCE
Comment sauvegarder un secret dans un
espace sécurisé du téléphone ?
Sauver un secret
9
Approche traditionnelle
Secure Element (SE)
Chiffrement du disque
Conteneur de certificats clients Android
KeyChain
Keystore
Approche mise en œuvre en mission
Comment sauvegarder un secret ?
10
Sauvegarder le certificat :
Non chiffré sur disque
Exploitable par analyse statique de disque
Chiffré sur disque
Mot de passe à demander encore et encore
Utiliser onSaveIntanceState() ou un extra de l’Intent
Gestion lourde
« Accessible » sur le disque
Chiffrer le disque du terminal
Pas garanti
Approche traditionnelle
11
SE : composant électronique communiquant via des trames
binaires
Disponible dans le terminal et/ou dans la carte SIM
Avantage d’un SE :
Mémorise clefs privées, accès VPN, générateurs de mots de passe
à usage unique…
Résiste aux attaques physiques
Implémente matériellement les algorithmes standards de
cryptographie (DES, AES, RSA)
Secure Element (SE) 1/2
12
Accessible via la couche NFC mais …
… impossible d’installer des application dans le SE
… impossible de communiquer avec par une application classique
Utilisé par Google Wallet
Secure Element (SE) 2/2
13
Limité à l’identification VPN et Wifi (< sdk 14)
Installation depuis la carte SD
L’effacement du certificat n’est pas physique !
Utilise le KeyStore Android
Conteneur de certificats clients
14
Pour les version d’Android supérieur à 14
Permet d’exploiter les certificats clients du terminal
Approche officielle : KeyChain
KeyChain.choosePrivateKeyAlias(this,
new KeyChainCallBack() {
@Override
public void alias(String alias) {
mAlias=alias;
}
},
new String[] {"RSA"}, // List of acceptable key types. null for any
null, // issuer, null for any
"internal.example.com", // host name of server requesting the cert
443, // port of server requesting the cert, -1 if
// unavailable
null); // alias to preselect, null if unavailable
15
La callback retourne le nom du certificat et
autorise l’application à l’utiliser
KeyChain…
KeyChain.getCertificateChain(this, mAlias);
KeyChain.getPrivateKey(this, mAlias);
16
Installation via API
KeyChain
Intent intent = KeyChain.createInstallIntent();
// Controle le nom du certificat
intent.putExtra(KeyChain.EXTRA_NAME, CERT_NAME);
intent.putExtra(KeyChain.EXTRA_PKCS12, out.toByteArray());
startActivityForResult(intent, RESULT_CODE);
17
KeyStore
Protégé par un mot de passe utilisateur
(version antérieure à 3.x)
Lié au verrouillage du téléphone (à partir
de la version 3.x)
Mais pas d’API officielle !
Ça n’empêche pas de jouer avec…
18
Récupérer la classe android.security.KeyStore
Changer le nom du package
Pour le débloquer :
Comment utiliser le KeyStore
put(), get(), byte[]
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
context.startActivity(
new Intent("android.credentials.UNLOCK"));
} else {
context.startActivity(
new Intent("com.android.credentials.UNLOCK"));
}
19
Simulation des API du KeyChain pour les versions antérieures
(sdk < 14)
Sur Github
Les certificats ne peuvent être partagées entre applications
Exploite le KeyStore
https://github.com/pprados/android-keychain-backport
https://github.com/pprados/android-keychain-backport-androlib
android-keychain-backport
20
Tél : +33 (0)1 58 56 10 00
Fax : +33 (0)1 58 56 10 01
www.octo.com© OCTO 2013
50, avenue des Champs-Elysées
75008 Paris - FRANCE
Via AccountAuthenticator
Partager un certificat
21
Proposer un Account pour l’intranet
Il porte et distribue la clé privée aux
applications de confiance
Le besoin
22
<service
android:name=".CertificateAuthenticationService"
android:exported="true" >
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
<meta-data
android:name="android.accounts.AccountAuthenticator"
android:resource="@xml/certificate_authenticator" />
</service>
Le service…
23
<account-authenticator
xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="fr.prados.android.account.certificate"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"
android:label="@string/authenticator_certificate_label“
/>
La description du compte…
24
Normalement utilisé pour du OAuth…
… détourné pour communiquer le certificat par la
mAccountManagerCallback
Utilisation…
mAccountManager.invalidateAuthToken(mAccountType, mAuthToken);
mAccountManager.getAuthToken(
mAccount, // Account retrieved using getAccountsByType()
mAuthTokenType, // Auth scope
mOptions, // Authenticator-specific options
this, // Your activity
mAccountManagerCallback, // Callback
mHandler); // Callback called if an error occurs
HttpsURLConnection.setDefaultSSLSocketFactory(mSocketFactory);
25
Dans getAuth
Privilège de l’appelant
public static final String KEY_CALLER_UID =
(VERSION.SDK_INT>=VERSION_CODES.HONEYCOMB) ?
AccountManager.KEY_CALLER_UID : "callerUid";
public static final String KEY_CALLER_PID =
(VERSION.SDK_INT>=VERSION_CODES.HONEYCOMB) ?
AccountManager.KEY_CALLER_PID : "callerPid";
if (options == null)
return errorDenied();
int pid = options.getInt(KEY_CALLER_PID);
int uid = options.getInt(KEY_CALLER_UID);
if (mContext.checkPermission(PERMISSION, pid, uid) ==
PackageManager.PERMISSION_DENIED)
return errorDenied();
}
26
Tél : +33 (0)1 58 56 10 00
Fax : +33 (0)1 58 56 10 01
www.octo.com© OCTO 2013
50, avenue des Champs-Elysées
75008 Paris - FRANCE
Un scénario possible
27
Enrôlement de quelques centaines de terminaux
Gestion des CDD
Gestion d’oubli des terminaux
Grande facilité et souplesse de déploiement sans sacrifier la
sécurité
L’expérience utilisateur doit être la plus simple possible !
Contraintes de sécurité : un certificat pour un triplet
Employé
Téléphone (IMEI)
SIM
Objectif de la mission
28
Enregistrement des triplets dans le SI
L’utilisateur saisi son identifiant sur le
terminal
C’est tout !
Il récupère son certificat (clés privée et
publique)
Il est protégé et partagé dans le terminal
Notre approche
29
Requête vers le serveur avec l’identité de l’utilisateur
Le serveur génère le certificat et le chiffre avec <IMEI> +
<random>
<random> est envoyé par SMS
Le téléphone capable de déchiffrer prouve son identité (le triplet
est résolu)
Processus d’enrôlement
30
Expérience utilisateur simple
Seulement 2 écrans
31
La durée de vie du certificat peut être courte (CDD)
Facilité de déploiement
En cas de vol, ajout du certificat client dans la CRL
Un utilisateur peut avoir plusieurs devices
En cas d’oubli, génération d’un certificat temporaire
Pas chère !
Adaptable à la dernière version de Chrome
Avantages de la solution
32
Tél : +33 (0)1 58 56 10 00
Fax : +33 (0)1 58 56 10 01
www.octo.com© OCTO 2013
50, avenue des Champs-Elysées
75008 Paris - FRANCE
Merci ! Des question ?
Philippe Prados
Aurélien RambauxG+ http://goo.gl/xljZS
33
Technologies de sauvegarde
des Secrets
Remarques
Sauvegarde dans le contexte de
l'application.
Les données ne sont pas chiffrées. Elles sont
vulnérables au vol du téléphone.
SE dans la carte à puce Inaccessible aux applications
SE dans le terminal Inaccessible aux applications
Chiffrement du disque Non obligatoire. Ne protège pas de vulnérabilités
des applications ou du téléphone allumé.
KeyStore Conteneur sécurisé mais non officiel. Il peut être
modifié dans les prochaines versions d'Android.
À ce jour, le meilleur endroit où sauver les secrets.
KeyChain Gestion officielle de gestion des certificats clients.
Non disponible avant l'API 14. Nous proposons
une librairie de compatibilité pour les versions
comprise entre 7 et 14.