OSGi Pas à Pas/Chap05
Sécurité
Rédacteur(s): Didier Donsez
La sécurité dans OSGi est basée sur la sécurité de Java 2 reposant sur les permissions. Dans une application Java classique, les permissions sont décrites pour l'application dans un fichier java.policy
qui est chargée au lancement de la machine virtuelle. Comme le caractère de la plate-forme OSGi est de fonctionner sans interruption, ce modèle de déploiement des permissions n'est pas adapté à OSGi. La spécification OSGi définit un service standard permettant de configurer les permissions accordées à chaque bundle déployé.
Remarque: La spécification ne considère pas la sécurité des communications avec la passerelle lors des opérations d'administration. Celle-ci est à la charge des bundles assurant l'administration.
Rappel sur les Permissions Java 2
Notion de SecurityManager
Rappel sur JAAS
Administration de Permission
Le spécification OSGi ajoute également trois permissions propres à son fonctionnement :
- AdminPermission autorise le bundle à installer, démarrer, arrêter d'autres bundles.
- ServicePermission autorise l'enregistrement ou la liaison de services
- PackagePermission autorise l'importation ou l'exportation de paquetages
Conditional Permission Admin
La version 4 de la spécification OSGi ajoute un mécanisme de déploiement des permissions dans les bundles qui les demandent. Les permissions sont utilisés par le gestionnaire de permission que si le fichier jar du bundle est entièrement signé par l'administrateur de la plateforme.
Contrôle des permissions par les bundles
La vérification des permissions d'un bundle appelant est à la charge du développeur du bundle appelé. Cette vérification peut se faire à 2 moments :
- au moment de l'appel à getService() du ServiceReference
- puis après la liaison, au cours des invocations de méthodes du service.
Pour cela, le développeur doit enregistrer un ServiceFactory qui
- vérifie si le bundle qui cherche à se lié au servant en a bien le droit
- puis retourner un décorateur (patron de conception à la Gamma) de son service qui vérifiera les permissions de l'appelant lors de chaque appel des méthodes protégées.
exemple de VendorServiceServiceFactory (TODO)
public class VendorServiceServiceFactory inmplements ServiceFactory { private VendorService vendorService; ... }
exemple de VendorServiceSecurityDecorator (TODO)
public class VendorServiceSecurityDecorator implements VendorService { private VendorService vendorService; ... public VendorServiceSecurityDecorator(Bundle bundle, VendorService vendorService) { } buy() { } }