Spec-Zone .ru
спецификации, руководства, описания, API
|
Если Менеджер безопасности находится в силе, следующие условия должны быть встречены, чтобы включить любому программному обеспечению, включая программное обеспечение расширения, выполнить секретные операции безопасности:
PrivilegedAction
объект.PrivilegedAction
экземпляр.Давайте смотреть на каждое из этих условий в немного большем количестве деталей с некоторыми примерами.
Предположите, что Вы хотите изменить RectangleArea
class в примере расширения предыдущего урока, чтобы записать прямоугольные области в файл, а не в stdout. Запись в файл, однако, является секретной операцией безопасности, так, если Ваше программное обеспечение соберется работать под менеджером безопасности, то Вы должны будете отметить свой код, как привилегированный. Есть два шага, которые Вы должны сделать, чтобы сделать так:
run
метод объекта типа java.security.PrivilegedAction
.PrivilegedAction
возразите как параметр в звонке doPrivileged
метод java.security.AccessController
.Если мы применяем те направляющие линии к RectangleArea
class, наше определение class выглядело бы примерно так:
import java.io.*; import java.security.*; public final class RectangleArea { public static void writeArea(final java.awt.Rectangle r) { AccessController. doPrivileged(new PrivilegedAction() { public Object run() { try { int area = r.width * r.height; String userHome = System.getProperty("user.home"); FileWriter fw = new FileWriter( userHome + File.separator + "test" + File.separator + "area.txt"); fw.write("The rectangle's area is " + area); fw.flush(); fw.close(); } catch(IOException ioe) { System.err.println(ioe); } return null; } }); } }
Единственный метод в этом class, writeArea
, вычисляет область прямоугольника, и пишет область в вызванный файл area.txt
в test
каталог в соответствии с корневым каталогом пользователя.
Чувствительные к безопасности операторы, имеющие дело с выходным файлом, помещаются в пределах run
метод нового экземпляра PrivilegedAction
. (Отметьте это run
требует что Object
экземпляр быть возвращенным. Возвращенный объект может быть null
.) Новое PrivilegedAction
экземпляр тогда передают как параметр в звонке AccessController.doPrivileged
.
Для получения дополнительной информации об использовании doPrivileged
, см. API для Привилегированных Блоков в документации JDK™.
Обертывание чувствительного к безопасности кода в a PrivilegedAction
объект этим способом является первым требованием для того, чтобы позволить расширению выполнить секретные операции безопасности. Второе требование: то, чтобы заставлять менеджера безопасности предоставить привилегированному коду соответствующие полномочия.
Политика безопасности в силе во времени выполнения определяется файлом политики. Политика значения по умолчанию устанавливается файлом lib/security/java.policy
в программном обеспечении JRE.
Файл политики присваивает полномочия безопасности программному обеспечению при использовании записей предоставления. Файл политики может содержать любое число записей предоставления. У файла политики значения по умолчанию есть эта запись предоставления для установленных расширений:
grant codeBase "file:${{java.ext.dirs}}/*" { permission java.security.AllPermission; };
Эта запись определяет что файлы в каталогах, определенных file:${{java.ext.dirs}}/*
должны быть предоставлены вызванное разрешение java.security.AllPermission
. (Отметьте это с Java 6, java.ext.dirs
обращается к classpath - как путь каталогов, каждый из которых может содержать установленные расширения.) Не слишком трудно предположить это java.security.AllPermission
установленные расширения предоставлений все полномочия безопасности, которые возможно предоставить.
По умолчанию, тогда, у установленных расширений нет никаких ограничений безопасности. Программное обеспечение расширения может выполнить секретные операции безопасности, как будто не было никакого установленного менеджера безопасности, при условии, что чувствительный к безопасности код содержится в экземпляре PrivilegedAction
переданный как параметр в a doPrivileged
вызвать.
Чтобы ограничить полномочия, предоставленные расширениям, Вы должны изменить файл политики. Чтобы отрицать все полномочия ко всем расширениям, Вы могли просто удалить вышеупомянутую запись предоставления.
Не все полномочия являются столь же всесторонними как java.security.AllPermission
предоставленный по умолчанию. После удаления значения по умолчанию предоставляют запись, можно ввести новую запись предоставления для определенных полномочий, включая:
java.awt.AWTPermission
java.io.FilePermission
java.net.NetPermission
java.util.PropertyPermission
java.lang.reflect.ReflectPermission
java.lang.RuntimePermission
java.security.SecurityPermission
java.io.SerializablePermission
java.net.SocketPermission
RectangleArea.writeArea
метод нуждается в двух полномочиях: один, чтобы определить путь к корневому каталогу пользователя, и другому, чтобы записать в файл. Принятие, что RectangleArea
class связывается в файле area.jar
, Вы могли предоставить полномочия записи, добавляя эту запись в файл политики:
grant codeBase "file:${java.home}/lib/ext/area.jar" { permission java.io.PropertyPermission "user.home", "read"; permission java.io.FilePermission "${user.home}${/}test${/}*", "write"; };
codeBase "file:${java.home}/lib/ext/area.jar"
часть этой записи гарантирует, что любые полномочия, определенные этой записью, будут применяться только к area.jar
. java.io.PropertyPermission
доступ разрешений к свойствам. Первый параметр, "user.home"
, называет свойство, и второй параметр, "read"
, указывает, что свойство может быть считано. (Другой выбор "write"
.)
java.io.FilePermission
доступ разрешений к файлам. Первый параметр, "${user.home}${/}test${/}*"
, указывает на это area.jar
предоставляется разрешение, чтобы получить доступ ко всем файлам в test
каталог, который находится в корневом каталоге пользователя. (Отметьте это ${/}
независимый от платформы разделитель файлов.) Второй параметр указывает, что предоставляемый доступ к файлу только для того, чтобы записать. (Другие варианты для второго параметра "read"
, "delete"
, и "execute"
.)
Можно использовать файл политики, чтобы установить дополнительные ограничения для полномочий, предоставленных расширениям, требуя, чтобы они были подписаны доверяемым объектом. (Для анализа подписания и проверки файлов JAR, см. урок
Чтобы позволить проверку подписи расширений или другого программного обеспечения в соединении с предоставлением полномочий, файл политики должен содержать keystore запись. keystore запись определяет, какой keystore должен использоваться в проверке. У записей Keystore есть форма
keystore "keystore_url";
URL keystore_url является или абсолютом или относительный. Если это относительно, URL относительно расположения файла политики. Например, чтобы использовать значение по умолчанию keystore используемый keytool, добавьте эту запись в java.policy
keystore "file://${user.home}/.keystore";
Чтобы указать, что расширение должно быть подписано, чтобы предоставить полномочия безопасности, Вы используете signedBy
поле. Например, следующая запись указывает что расширение area.jar
должен быть предоставлен перечисленные полномочия, только если это подписывается пользователями, идентифицированными в keystore псевдонимами Роберт и Рита:
grant signedBy "Robert,Rita", codeBase "file:${java.home}/lib/ext/area.jar" { permission java.io.PropertyPermission "user.home", "read"; permission java.io.FilePermission "${user.home}${/}test${/}*", "write"; };
Если codeBase
поле опускается, поскольку в следующем "предоставлении", полномочия предоставляют любому программному обеспечению, включая установленный или загружают расширения, которые подписываются "Робертом" или "Ритой":
grant signedBy "Robert,Rita" { permission java.io.FilePermission "*", "write"; };
Для получения дальнейшей информации о формате файла политики, см. раздел 3.3.1 из Спецификации Архитектуры безопасности в документации JDK.