octo - droidcon - pki android : installer, gérer, sécuriser et utiliser un secret

33
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 Rambaux 17 Juin 2013 Installer, gérer, sécuriser et utiliser une clef privée dans Android

Upload: octo-technology

Post on 29-Jun-2015

1.965 views

Category:

Technology


0 download

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.

TRANSCRIPT

Page 1: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

1

Tél : +33 (0)1 58 56 10 00Fax : +33 (0)1 58 56 10 01www.octo.com© OCTO 2013

50, avenue des Champs-Elysées75008 Paris - FRANCE

Philippe Prados

Aurélien Rambaux17 Juin 2013

Installer, gérer, sécuriser et utiliser une clef privée dans Android

Page 2: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

2

Infrastructure à clés publiques

Sauvegarder un certificat

Partager un certificat

Un scénario possible chez un client

Au menu

Page 3: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

3

Tél : +33 (0)1 58 56 10 00Fax : +33 (0)1 58 56 10 01www.octo.com© OCTO 2013

50, avenue des Champs-Elysées75008 Paris - FRANCE

Qu’est-ce ?

Infrastructure à clés publiques (PKI)

Page 4: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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 ?

Page 5: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

5

Ce que je chiffre avec l’un…

… je le déchiffre avec l’autre

Une clé privée liée à une clé publique

Page 6: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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)

Page 7: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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

Page 8: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

8

Tél : +33 (0)1 58 56 10 00Fax : +33 (0)1 58 56 10 01www.octo.com© OCTO 2013

50, avenue des Champs-Elysées75008 Paris - FRANCE

Comment sauvegarder un secret dans un espace sécurisé du téléphone ?

Sauver un secret

Page 9: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

9

Approche traditionnelle

Secure Element (SE)

Chiffrement du disque

Conteneur de certificats clients Android

KeyChain

KeystoreApproche mise en œuvre en mission

Comment sauvegarder un secret ?

Page 10: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

10

Sauvegarder le certificat :Non chiffré sur disque

Exploitable par analyse statique de disque

Chiffré sur disqueMot de passe à demander encore et encore

Utiliser onSaveIntanceState() ou un extra de l’IntentGestion lourde

« Accessible » sur le disque

Chiffrer le disque du terminalPas garanti

Approche traditionnelle

Page 11: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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

Page 12: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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

Page 13: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

13

Limité à l’identification VPN et Wifi (< sdk 14)

Installation depuis la carte SDL’effacement du certificat n’est pas physique !

Utilise le KeyStore Android

Conteneur de certificats clients

Page 14: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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

Page 15: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

15

La callback retourne le nom du certificat et autorise l’application à l’utiliser

KeyChain…

KeyChain.getCertificateChain(this, mAlias);KeyChain.getPrivateKey(this, mAlias);

Page 16: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

16

Installation via API

KeyChain

Intent intent = KeyChain.createInstallIntent();// Controle le nom du certificatintent.putExtra(KeyChain.EXTRA_NAME, CERT_NAME); intent.putExtra(KeyChain.EXTRA_PKCS12, out.toByteArray());startActivityForResult(intent, RESULT_CODE);

Page 17: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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…

Page 18: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

18

Récupérer la classe android.security.KeyStoreChanger 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"));}

Page 19: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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

Page 20: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

20

Tél : +33 (0)1 58 56 10 00Fax : +33 (0)1 58 56 10 01www.octo.com© OCTO 2013

50, avenue des Champs-Elysées75008 Paris - FRANCE

Via AccountAuthenticator

Partager un certificat

Page 21: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

21

Proposer un Account pour l’intranet

Il porte et distribue la clé privée aux applications de confiance

Le besoin

Page 22: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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…

Page 23: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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…

Page 24: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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);

Page 25: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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();}

Page 26: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

26

Tél : +33 (0)1 58 56 10 00Fax : +33 (0)1 58 56 10 01www.octo.com© OCTO 2013

50, avenue des Champs-Elysées75008 Paris - FRANCE

Un scénario possible

Page 27: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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 tripletEmployé

Téléphone (IMEI)

SIM

Objectif de la mission

Page 28: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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

Page 29: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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

Page 30: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

30

Expérience utilisateur simple

Seulement 2 écrans

Page 31: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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

Page 32: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

32

Tél : +33 (0)1 58 56 10 00Fax : +33 (0)1 58 56 10 01www.octo.com© OCTO 2013

50, avenue des Champs-Elysées75008 Paris - FRANCE

Merci ! Des question ?

Philippe Prados

Aurélien RambauxG+ http://goo.gl/[email protected]

Page 33: OCTO - DroidCon - PKI Android : Installer, gérer, sécuriser et utiliser un secret

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 applicationsSE dans le terminal Inaccessible aux applicationsChiffrement 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.