Spec-Zone .ru
спецификации, руководства, описания, API
След: Механизм Расширения
Урок: Создание Безопасных Расширений
Установка Полномочий для Расширений
Домашняя страница > Механизм Расширения > Создание Безопасных Расширений

Установка Полномочий для Расширений

Если Менеджер безопасности находится в силе, следующие условия должны быть встречены, чтобы включить любому программному обеспечению, включая программное обеспечение расширения, выполнить секретные операции безопасности:

Давайте смотреть на каждое из этих условий в немного большем количестве деталей с некоторыми примерами.

Используя Класс PrivilegedAction

Предположите, что Вы хотите изменить RectangleArea class в примере расширения предыдущего урока, чтобы записать прямоугольные области в файл, а не в stdout. Запись в файл, однако, является секретной операцией безопасности, так, если Ваше программное обеспечение соберется работать под менеджером безопасности, то Вы должны будете отметить свой код, как привилегированный. Есть два шага, которые Вы должны сделать, чтобы сделать так:

  1. Вы должны поместить код, который выполняет секретные операции безопасности в пределах run метод объекта типа java.security.PrivilegedAction.
  2. Следует использовать это 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 предоставленный по умолчанию. После удаления значения по умолчанию предоставляют запись, можно ввести новую запись предоставления для определенных полномочий, включая:

Полномочия в документации JDK обеспечивают детали о каждых из этих полномочий. Давайте смотреть, те должны были использовать RectangleArea в качестве расширения.

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, см. урок Файлов 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.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Создание Безопасных Расширений
Следующая страница: Изоляция Пакетов в Расширениях