Index

Comprendre le modèle de sécurité Java et le Java Service Wrapper

Le Java Service Wrapper implémente une série de Permissions, qui peuvent être utilisées pour contrôler entièrement l'accès à l'API du Wrapper à l'aide du modèle de sécurité Java standard.

Comme expliqué dans la section ci-dessous, l'utilisateur peut définir les permissions souhaitées dans un fichier de politique sans aucun code Java. Ce fichier de politique est ensuite utilisé par le Java Service Wrapper via la classe Security Manager.

AVERTISSEMENT

Java 17 déprécie le Security Manager. L'utilisation de ce modèle de sécurité n'est plus recommandée.

Contrôler un autre service depuis une application Java

Le Wrapper permet de démarrer, d'arrêter, d'interroger et d'effectuer d'autres opérations sur n'importe quel service d'un système en envoyant les codes de contrôle appropriés. Cela peut être très puissant, mais une utilisation incorrecte peut également ouvrir de graves problèmes de sécurité sur un serveur. Pour cette raison, l'accès à la méthode WrapperManager.sendServiceControlCode(...) est désactivé par défaut. Pour l'utiliser, il est nécessaire qu'un Security Manager soit installé dans la JVM et que des permissions spécifiques soient accordées.

Sachez que le fait de définir un security manager entraînera probablement l'échec de nombreuses fonctionnalités de votre application avec des erreurs de sécurité. Il est nécessaire d'accorder les permissions appropriées à votre application. Consultez le tutoriel Oracle suivant pour plus d'informations sur les security managers : http://docs.oracle.com/javase/tutorial/essential/environment/security.html

Configurer un Security Manager

La façon la plus simple de configurer un security manager dans votre JVM est d'ajouter les propriétés suivantes à votre fichier wrapper.conf :

Exemple de configuration :
wrapper.java.additional.1=-Djava.security.manager
wrapper.java.additional.2=-Djava.security.policy=../conf/java.policy

java.security.manager :

La première propriété système, java.security.manager (J2SE 5.0) (JavaSE6), indique à Java qu'un security manager doit être créé lors de la création de la JVM.

java.security.policy :

La seconde propriété système, java.security.policy (J2SE 5.0) (JavaSE6), indique ensuite l'emplacement d'un fichier qui décrira les permissions à accorder au sein de votre application.

Le fichier de politique est un simple fichier texte.

Exemple de fichier de politique :
// Give Wrapper classes full permissions
grant codeBase "file:../lib/wrapper.jar" {
        permission java.security.AllPermission;
};

// Grant various permissions to a specific service.
grant codeBase "file:../lib/-" {
        permission org.tanukisoftware.wrapper.security.WrapperServicePermission
"myservice", "interrogate,start,stop";
};

Le premier bloc accorde aux classes de wrapper.jar toutes les permissions pour tout faire. Ceci est recommandé, car le Wrapper doit pouvoir lancer l'intégralité de votre application, ce qui signifie que tout ce que fait votre application provient du Wrapper.

Le second bloc signifie que toutes les autres classes dans les jars de votre répertoire lib peuvent effectuer des appels pour interroger, démarrer et arrêter le service « myservice » via le Wrapper. Si ce bloc n'est pas présent, les appels entraîneront le lancement de SecurityExceptions.

API WrapperManager.fireUserEvent

Dans la version 3.5.8 du Wrapper, la possibilité d'appeler des événements définis par l'utilisateur via l'API WrapperManager a été ajoutée. Bien qu'il s'agisse d'une fonctionnalité puissante destinée à faciliter l'utilisation des événements utilisateur pour les développeurs, elle peut également soulever des préoccupations de sécurité si un programme devait être autorisé à appeler tous les événements utilisateur depuis lui-même.

Pour apporter une solution à ces préoccupations, l'API utilise la classe WrapperUserEventPermission qui peut être définie dans le fichier de politique du SecurityManager.

Exemple de fichier de politique :
grant codeBase "file:../lib/some.jar" {
        permission org.tanukisoftware.wrapper.security.WrapperUserEventPermission "fireUserEvent", "-10, 50, 100-200, 555-";
}

L'exemple ci-dessus accorde à la bibliothèque "../lib/some.jar" la permission d'appeler les userEvents suivants :

  • « -10 » : si le numéro de début d'une plage n'est pas spécifié, cela signifie que la séquence commence par sa première valeur, c'est-à-dire « 1 »

  • « 50 » : les numéros peuvent être définis individuellement

  • « 100-200 » : tous les numéros compris entre 100 et 200 (100 et 200 inclus)

  • « 555- » : tous les numéros de 555 jusqu'à la limite supérieure des numéros d'événements disponibles, c'est-à-dire 32767.

NOTE

Par souci de cohérence, les numéros doivent être triés, ce qui signifie que les exemples suivants seraient invalides : "5, -4", "1, 8-10, 7", "9-, 7", etc. Toute mauvaise configuration entraînera une erreur d'accès refusé.