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

Post on 29-Jun-2015

1.966 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

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

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

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

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 ?

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

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 SDL’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 certificatintent.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.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"));}

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

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 00Fax : +33 (0)1 58 56 10 01www.octo.com© OCTO 2013

50, avenue des Champs-Elysées75008 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 tripletEmployé

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 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/xljZSarambaux@octo.com

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.

top related