Comment sainement configurer la stratégie de sécurité dans Tomcat 6

Je suis en utilisant Tomcat 6.0.24, tel que conditionné pour Ubuntu Karmic. La stratégie de sécurité par défaut de Ubuntu Tomcat paquet est assez strictes, mais semble simple. Dans /var/lib/tomcat6/conf/policy.d, il existe une variété de fichiers que d'établir une stratégie par défaut.

Intéressant de noter au début:

  • Je n'ai pas changé le stock d'installation tomcat à tous-pas de nouveaux bocaux dans sa commune lib(s), pas de server.xml changements, etc. Mettre la .fichier war dans le webapps répertoire est la seule action de déploiement.
  • l'application web, je suis le déploiement échoue avec des milliers de refus d'accès en vertu de la présente politique par défaut (tel que rapporté dans le journal grâce à la -Djava.security.debug="access,stack,failure" système de la propriété).
  • de désactiver le gestionnaire de sécurité entièrement résultats dans les pas d'erreurs que ce soit, et de la bonne application de la fonctionnalité

Ce que je voudrais faire est d'ajouter une application spécifique de la politique de sécurité du fichier à la policy.d annuaire, ce qui semble être une pratique recommandée. J'ai ajouté ceci à policy.d/100myapp.policy (comme un point de départ -- je voudrais, éventuellement, d'en simplifier les autorisations accordées uniquement à ce que l'application a réellement besoin):

grant codeBase "file:${catalina.base}/webapps/ROOT.war" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.base}/webapps/ROOT/-" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/-" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/lib/-" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/classes/-" {
  permission java.security.AllPermission;
};

Note la dérouillée autour d'essayer de trouver le bon codeBase déclaration. Je pense que c'est probablement mon problème fondamental.

De toute façon, le ci-dessus (en réalité que les deux premières subventions semblent avoir aucun effet) presque œuvres: les milliers de refus d'accès sont allés, et je suis à gauche avec un seul. Pertinentes de la trace de la pile:

java.security.AccessControlException: access denied (java.io.FilePermission /var/lib/tomcat6/webapps/ROOT/WEB-INF/classes/com/foo/some-file-here.txt read)
  java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
  java.security.AccessController.checkPermission(AccessController.java:546)
  java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
  java.lang.SecurityManager.checkRead(SecurityManager.java:871)
  java.io.File.exists(File.java:731)
  org.apache.naming.resources.FileDirContext.file(FileDirContext.java:785)
  org.apache.naming.resources.FileDirContext.lookup(FileDirContext.java:206)
  org.apache.naming.resources.ProxyDirContext.lookup(ProxyDirContext.java:299)
  org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:1937)
  org.apache.catalina.loader.WebappClassLoader.findResource(WebappClassLoader.java:973)
  org.apache.catalina.loader.WebappClassLoader.getResource(WebappClassLoader.java:1108)
  java.lang.ClassLoader.getResource(ClassLoader.java:973)

Je suis assez convaincu que le fichier réel de déclenchement de la négation n'est pas pertinent; il est juste un fichier de propriétés que l'on vérifie pour l'option paramètres de configuration. Ce qui est intéressant, c'est que:

  1. il n'existe pas dans ce contexte
  2. le fait que le fichier n'existe pas, finit par lancer une exception de sécurité, plutôt que de java.io.File.exists() simplement retourner false (bien que je suppose que c'est juste une question de sémantique de l'autorisation de lecture).

Une autre solution (en plus il suffit de désactiver le gestionnaire de sécurité dans tomcat) est d'ajouter un ouvert la permission de mon fichier de stratégie:

grant {
  permission java.security.AllPermission;
};

Je suppose que cela est fonctionnellement équivalent à désactiver le gestionnaire de sécurité.

Je suppose que je dois être le codeBase déclaration dans ma subventions subtilement mal, mais je ne vois pas pour le moment.

InformationsquelleAutor cemerick | 2010-04-15