2013-12-09 4 views
2

У меня есть приложение, которое использует различные сторонние API, один из сторонних API, выполняется в отдельном потоке.Java Security Manager в потоках

Я хочу, чтобы один конкретный поток имел доступ к определенному каталогу и ограничивал этот поток для доступа к другим каталогам моего локального диска.

Возможно ли это благодаря менеджеру безопасности java?

ответ

1

Предполагая, что библиотека, которую вы намереваетесь доверять, хорошо написана, вы можете установить разрешения для каждой библиотеки в файле политики и добавить вызовы к java.security.AccessController.doPrivileged в потоке или вокруг его построения. Обычная оговорка о том, что плохо написанный доверенный код позволит ненадежному коду воспользоваться своим доверием.

«Пользовательский» менеджер безопасности, как правило, не нужен, так как Java 2, выпущенный в 1998 году, но, похоже, появляется в значительной народной памяти.

2

Если я правильно понимаю, похоже, что вы хотите ограничить доступ к файловой системе для одной из сторонних библиотек, которые вы используете. Что касается Java SecurityManager, то тот факт, что эта конкретная сторонняя библиотека работает в отдельном потоке, не имеет значения: политики безопасности Java предоставляют разрешения на основе того, где загружен код, независимо от того, был ли он подписан или пользователь, который запускать код, но не на основе того потока, в котором выполняется код.

Чтобы ограничить доступ определенной библиотеки к определенным областям файловой системы, вам понадобится файл политики, который предоставляет необходимые разрешения ко всему вашему другому коду и ограниченные разрешения для библиотеки, которую вы хотите ограничить. Если предположить, что код вы работаете в набор отдельных файлов .jar, и вы не хотите никаких ограничений на любой другой код, файл политики будет выглядеть примерно так:

grant codebase "file:/path/to/your-application.jar" { 
    permission java.security.AllPermission; 
}; 

grant codebase "file:/path/to/trusted-library.jar" { 
    permission java.security.AllPermission; 
}; 

grant codebase "file:/path/to/another-trusted-library.jar" { 
    permission java.security.AllPermission; 
}; 

grant codebase "file:/path/to/restricted-library.jar" { 
    permission java.io.FilePermission "/path/to/particular/directory", "read,write"; 
    // Any additional permissions this library needs 
}; 

Это может возьмите пробную версию и ошибку, чтобы узнать, какие другие конкретные разрешения вам понадобятся для предоставления ограниченной библиотеке, чтобы она работала правильно.

Если вам действительно нужно ограничить доступ к определенному потоку, вам нужно написать собственный SecurityManager и переопределить методы checkPermission, чтобы они проверяли, какой поток вызывает метод, чтобы определить, должно ли это разрешение предоставляется. Вам нужно будет добавить методы к настраиваемому SecurityManager, чтобы ваш код приложения мог регистрировать, какие потоки должны быть ограничены, и вам нужно будет убедиться, что эти дополнительные методы не могут быть вызваны ограниченным кодом, например, путем создания и проверка пользовательского разрешения.

Написание индивидуальных диспетчеров безопасности обычно более рискованно, чем использование стандартного SecurityManager, поэтому вы захотите провести тщательное тестирование, если вы примете этот подход.

Смежные вопросы