Talend ESB: Crypter les variables de contexte avec Camel et Jasypt

Jasypt pour « Java Simplified Encryption » inclus nativement dans le framework Apache Camel va vous permettre de crypter facilement les différents mots de passe utilisés dans les variables de contexte de vos développements Talend.

Introduction

Jasypt permet d’ajouter des fonctionnalités de cryptage au sein d’un projet java avec peu d’effort et sans connaissance approfondie en cryptographie. Jasypt est donc une librairie simplifiée dédiée au cryptage, nous allons voir comment l’implémenter dans le studio afin de crypter le contexte de Talend. Sachez que Jasypt n’implémente pas d’algorithme de cryptage, la librairie utilise soit ceux inclus dans l’extension JCE fournie par la JDK ou ceux proposés par des fournisseurs tierces tel que bouncy castle, ce qui facilite l’intégration avec diverses technologies telles que Spring security ou Hibernate. Le cryptage étant simplifié, il n’est pas pour autant bradé, l’efficacité est égale à l’utilisation directe de l’API JCE, les bonnes pratiques forceront l’utilisation du standard et ses hauts niveaux de sécurité.

Les règles d’or du cryptage

Pour le fun et même si ce n’est pas le type de cryptage utilisé dans l’article, je ne résiste pas à l’envie de vous faire partager cet excellent article du site officiel de Jasypt, ce rappel est dédié aux bonnes pratiques du cryptage des mots de passe en base de données.

Password based encryption versus Digest

Le PBE qui est le sujet principal de l’article, il est utilisé lorsque vous devez reconstruire un mot de passe, par exemple pour se connecter à une base de données, il vous faudra un mot de passe maître pour décrypter le mot de passe désiré, le cryptage est donc tout à fait réversible.

Le digest quant à lui ne sert qu’à obtenir une chaine de caractère immuable en appliquant un algorithme comme le MD5 sur votre mot de passe, il vous suffit de comparer le hachage obtenu pour valider ou non ce mot de passe, il est impossible de faire un retour en arrière.

Au passage, j’ai envie de partager cette anecdote qui me rappelle une SSII pour laquelle je travaillais où un collègue m’annonce qu’il a voulu « remettre à zéro son mot de passe » et qu’on lui a renvoyé tout cela en clair !!! C’est évidemment gravissime, un mot de passe doit être haché et ne doit jamais être reconstruit ou déduit ni encore moins être stocké même EN CLAIR, le mot de passe étant corrompu, je vous laisse imaginer le temps perdu à réinitialiser les différents comptes sur internet même si l’on doit en théorie utiliser un mot de passe différent par compte 🙂

Plan d’action

Il s’agira de fusionner le contexte de Talend avec le contexte de Camel via l’objet PropertyPlaceHolder qui est directement inspiré de Spring, puis d’utiliser un parser afin de lier Jasypt pour crypter/décrypter les variables en mode PBE.

Pré-requis

Avant le développement dans Talend, il faut stocker le mot de passe maître à l’abri des regards indiscrets, le plus sûr est encore de le mettre dans une variable d’environnement qui sera propre à chaque système. L’idée n’est pas mauvaise lorsque l’on sait que seul l’administrateur peut faire cette action.

Taper par exemple la commande ci-dessous pour définir le mot de passe « secret », rien ne vous empêche de le convertir en base64, juste au cas où un curieux verrait passer vos variables d’environnement par dessus votre épaule.

Sous windows
 setx /M "jasypt_master_password" "secret"

Sous linux
 export jasypt_master_password=secret

La route Camel

L’exemple ressemble à ceci, il faut deux choses importantes:

  • Enregistrer un bean avec le contenu du contexte de Talend qui est pour rappel un simple objet Properties
  • Ensuite un composant cConfig pour indiquer la dépendance Jasypt ainsi que le code permettant de lier les 2 contextes.

Le détail du cBeanRegister

Voici le code et les détails du composant cConfig


import org.apache.camel.component.jasypt.JasyptPropertiesParser;
import org.apache.camel.component.properties.PropertiesComponent;

JasyptPropertiesParser jp = new JasyptPropertiesParser();
jp.setPassword(System.getenv().get("jasypt_master_password"));

//On récupère la référence du contexte de Talend pour créer le composant
PropertiesComponent pc = new PropertiesComponent("ref:talendContext");
pc.setPropertiesParser(jp);
camelContext.addComponent("properties", pc);

La ligne numéro 4 récupère la valeur de la variable d’environnement système nommée « jasypt_master_password »

Crypter les mots de passe

Téléchargez Jasypt avec ce lien puis via l’outil en ligne de commande lancer la commande suivante:

 encrypt.bat input="This is my message to be encrypted" password="secret" 

Le résultat est le suivant:

LXpZaujCYV1jNSeN2oCohrkxZpIsDAQvbVHgL+O4fP38lsAIke+SHaQ2s0xUyEd7

Il suffit ensuite de créer une variable de contexte dans Talend avec le préfixe ENC() et d’y inclure le résultat du cryptage comme ceci:

Ne vous reste plus qu’à appeler vos variables de contexte à la manière de Spring grâce à la syntaxe de la double accolade -> {{key}}

Attention que le format classique context.encoded_password ne décryptera pas la chaine de caractères mais l’affichera telle quelle.

Voici le résultat attendu

Conclusion

Simple et efficace, la libraire Jasypt nous réconcilie avec les techniques de cryptage trop souvent peu ou mal utilisées. C’est un framework extrêmement extensible et répondra à tous vos besoins en terme de sécurité de données.

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Petit calcul pour valider votre commentaire! merci * Time limit is exhausted. Please reload CAPTCHA.