MedShake / MedShakeEHR-base

Base pour MedShakeEHR
GNU General Public License v3.0
36 stars 21 forks source link

Authentification par la CPS #31

Open bugeaud opened 6 years ago

bugeaud commented 6 years ago

Une authentification par la CPS est souhaitable. Ceci renforcerait la sécurisation des échanges et permettrait de faciliter l'accès au service.

Pour celà, il faut activer l'authentification par certificat client requis et n'ajouter dans les AC autorisées que les IGC de Sesam Vital / MSSanté. Ensuite, il sera possible d'extraire une valeur d'attribut de confiance du certificat pour servir de base à l'identité.

Ceci apporterait aussi le SSO en cas de présence de cache de code PIN sur le middleware de la CPS.

Le manipulation n'est pas trés complexe côté Apache, par contre, je n'ai pas de vision actuellement comment connecter un champ présentant l'identité de la CPS sur l'authentification de MedShake EHR.

Il est à noter que ceci nécessitera la présence d'un certificat serveur (par exemple généré via le certbot de letsencrypt).

MedShake commented 6 years ago

Re,

Bon, là je lis du russe, car tout cela sort totalement de ce que je sais faire :-) Je sais cependant que tout cela est nécessaire, car MedShakeEHR doit à terme dialoguer avec le DMP (comme le LAP, c'est une nécessité pour être reconnu). Coïncidence, j'ai commencé à survoler hier soir ceci : http://esante.gouv.fr/sites/default/files/ASIP-PTS_Guide-de-mise-en-oeuvre-d-une-authentification-forte-avec-une-carte-CPS_20130625_v0.2.2_0.pdf

Pour tenter de répondre aux questions : quel type de donnée sera envoyé à MedShakeEHR et par quelle méthode ? Qu'a besoin de stocker l'EHR ? S'il y a besoin de conserver quelque chose, il est probable qu'une colonne soit à ajouter à la table people.

Concernant le certificat, il me semble que le processus de letsencrypt nécessite un accès ouvert sur le net, ce qui est ici contradictoire avec l'objectif de fonctionnement en ethernet. Un certificat auto signé n'est-il pas une option ?

B.

bugeaud commented 6 years ago

Pour let'sencrypt il est possible d'utiliser la validation DNS. Ainsi, il suffit de disposer d'un domaine DNS (il en existe des gratuits) et d'y enregistrer l'IPv4 de sa machine (même si c'est une IPv4 privée type 10.a.b.c ou 192.168.d.e ou tout autre). Ensuite sur la LAN interne, il faut enregistrer l'IPv4 locale avec le nom de domaine correspondant (ou laisser le DNS externe réndre à sa place, ce qui suppose que la machine peut faire des requètes DNS vers l'extérieur). Tant que l'on peut ajouter des champs dans l'entrée DNS de cette machine comme demander par le certbot pour prouver son autorité sur le domaine.

https://serverfault.com/questions/750902/how-to-use-lets-encrypt-dns-challenge-validation

Concernant l'authentifiation, Apache va indiquer qu'un certificat client est requis d'une autorité précise (les racines correspondant aux CPS), le client va envoyer un certificat client correspondant qui va être validé par Apache (bonne racine, certificat pas expiré, etc). Il sera utilisé pour s'authentifir. Pour celà, il y a plusieurs façon. Une classique est d'utiliser le champ UserPrincipal Name (cf. http://integrateurs-cps.asipsante.fr/documents/IGC-CPS2ter-Certificats-X.509-CPS2ter-et-CPS3.1-V1.1_0.pdf §4.4.1.10 p19 ) qui correspond à un identifiant unique associé à l'utilisateur.

Ce champ peut être extrait du certificat et envoyé sous forme d'entêtes à une couche aplicative (PHP ici), via l'option : SSLOptions +StdEnvVars

Ainsi, les requètes coté PHP vont arriver ensuite avec des pseudo-entêtes du style : SSL_CLIENT_SAN_Email_0 SSL_CLIENT_SAN_OTHER_msUPN_0

Il est à noter qu'il peut y en avoir plusieurs, dans un tel cas, les champs ont des indices numériques de fin supérieurs à 0.

Les valeurs contenues peuvent être mise en correspondance avec les utilisateurs de l'application. Si les valeurs correspondent à des identifiants utilisateurs actifs, utilisateur peut être directement authentifié sans passer par un formulaire de login demandant un mot de passe par exemple.

C'est cette dernière partie sur laquelle je n'ai pas de vue actutellement : quel framework de securité utilisée, quel processus d'authentification, comment l'intercepté de façon sécurisée en cas d'authentification par carte à puce...

Cdt, JB

MedShake commented 6 years ago

En 2 mots car je vais être indispo : l'authentification est gérée par la class msUser. C'est très basique. Pour le reste, il faut que je digère tout ça ... en particulier, je ne vois pas comment sont associés utilisateurs et carte CPS.

B.

MedShake commented 6 years ago

Des news camarade codeur ? Je suis prêt à en découdre avec mssanté et le DMP :-)

bugeaud commented 6 years ago

Pas pû avancer (des soucis à gerer à coté) ... de m'y attaquer sur la fin de semaine.

bugeaud commented 6 years ago

Bonjour,

PI, j'ai une configuration docker pour un projet php qui permet de faire de l'authentification client double facteur (carte à puce). Je la pousserais dans https://github.com/bugeaud/cps-site-moi DQP.

Elle construit l'ensemble des fichiers requis à partir des P7b des deux IGC (CPS2Ter et CPS3). La configuration proposée de base permet à des ports de cartes classe 1 de CPS2Ter et CPS3 STANDARD et FORT de s'y connecté.

Il me reste à voir pour relier l'entête [SSL_CLIENT_SAN_OTHER_msUPN_0] (de la forme y.zzz@carte-cps.fr) avec l'identification de EHR.

Pour le reste je n'ai pas regardé la partie DMP encore. Mais j'anticipe qu'il faut une identité "Serveur" car le monde médical n'est pas trés fan des SSO client par principe. Car n'ayant pas d'API Gateway, ils préfère faire des "bon vieux" contrats avec des "éditeurs". Une approche plus '90... on est loin du JSON/JWT.

++ JB

bugeaud commented 6 years ago

Pour information, une démonstration d'identification par CPS / Apache utilisant Let's Encrypt est disponible sur : https://github.com/bugeaud/cps-site-moi

MedShake commented 6 years ago

Super, merci ! Si je comprends bien, tout se joue dans la configuration du vhost apache et dans le dialogue standard qui va en résulter entre le serveur et le navigateur ? Le bout de code PHP a priori n'est que le test de ce résultat via une variable.

Reste à voir le problème qui est que la carte CPS est en général dans un lecteur pour générer de la FSE et que ce lecteur n'est pas de type PC / SC ... Pas certain que le navigateur sache aller le chercher ...

B.