PKI Android : Installer, gérer, sécuriser et utiliser un secret

Preview:

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

}

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

arambaux@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 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.

Recommended