Линия поведения приложений в JRE представлена объектом java.security.Policy. Он определяет, что можно делать для кода из разных источников, выполняя эти приложения под разными доверителями. Это касаться приложений, которые будут запускаться по менеджером безопасности и аплетов.
В зависимости от реализации Policy правила могут браться из разных источников, но в реализации по умолчанию они находятся в статических файлах конфигурации.
Не обязательно знать формат таких файлов, можно воспользоваться графической утилитой PolicyTool.
По умолчанию есть один общесистемный файл правил, и один необязательный файл правил пользователя.
Общесистемный по умолчанию находится в
Эти места можно поменять через свойства файла настроек безопасности
$JAVA_HOME/lib/security/java.security:
Как можно догадаться мы можем добавить еще файлов для перегрузки правил настройки через policy.url.3, policy.url.4 ... policy.url.n. Файлы могут находится удаленно и быть доступными по сетевым протоколам.
Если файлов в указанных местах нет, то применяются правила по умолчанию (они те же, что указаны в тех установках JRE/JDK, где можно увидеть общесистемный файл).
Один момент, что если один из урлов окажется с несуществующий файлом правил, то все последующие урлы даже читаться не будут.
-Djava.security.policy=mypolicy - прочитать еще один дополнительный файл правил по безопасности из текущей директории с именем mypolicy
SomeApp указание класса с методом мейн для запуска.
Если нужно проигнорировать системный и пользовательский файлы правил(и любые другие файлы указанные в $JAVA_HOME/lib/security/java.security файле), нужно указать двойное равно ==:
Но все это не будет работать, если в файле настройки безопасности будет указана следующая настройка:
Кстати если тип хранилища JKS, то его указывать не обязательно.
Менеджер безопасности понимает какой сертификат из хранилища брать по псевдониму/ам с записи разрешения, чтобы проверить подпись на архиве с приложением.
Неиталики в шаблоне - ключевые слова, италики - переменные.
Дальнейшее разбирательство продолжается здесь.
И живой примерчик.
В зависимости от реализации Policy правила могут браться из разных источников, но в реализации по умолчанию они находятся в статических файлах конфигурации.
Не обязательно знать формат таких файлов, можно воспользоваться графической утилитой PolicyTool.
По умолчанию есть один общесистемный файл правил, и один необязательный файл правил пользователя.
Общесистемный по умолчанию находится в
$JAVA_HOME/lib/security/java.policyПользовательский файл находится в
~/.java.policy
Эти места можно поменять через свойства файла настроек безопасности
$JAVA_HOME/lib/security/java.security:
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
Как можно догадаться мы можем добавить еще файлов для перегрузки правил настройки через policy.url.3, policy.url.4 ... policy.url.n. Файлы могут находится удаленно и быть доступными по сетевым протоколам.
Если файлов в указанных местах нет, то применяются правила по умолчанию (они те же, что указаны в тех установках JRE/JDK, где можно увидеть общесистемный файл).
Один момент, что если один из урлов окажется с несуществующий файлом правил, то все последующие урлы даже читаться не будут.
Определение дополнительных файлов правил во время выполнения
java -Djava.security.manager -Djava.security.policy=mypolicy SomeApp-Djava.security.manager - гарантирует, что стандартный менеджер по безопасности установлен, если его нет все свалится.
-Djava.security.policy=mypolicy - прочитать еще один дополнительный файл правил по безопасности из текущей директории с именем mypolicy
SomeApp указание класса с методом мейн для запуска.
Если нужно проигнорировать системный и пользовательский файлы правил(и любые другие файлы указанные в $JAVA_HOME/lib/security/java.security файле), нужно указать двойное равно ==:
java -Djava.security.manager -Djava.security.policy==mypolicy SomeApp
Но все это не будет работать, если в файле настройки безопасности будет указана следующая настройка:
policy.allowSystemProperty=falseПо умолчанию она true.
Изменение реализации java.security.Policy
По умолчанию используется sun.security.provider.PolicyFile. Но мы можем переопределить $JAVA_HOME/lib/security/java.security:
policy.provider=policy.provider=com.mycom.MyPolicy
Содержимое файла правил безопасности
Файл содержит в себе:
- определение файла с базами данных ключей и сертификатов;
- записи разрешений(grants).
Если какая-то запись упоминает псевдоним подписчика или псевдоним принсипала, то сразу необходимо, чтобы файл базы данных был указан. На данный момент файл может быть только
один, + урл паролей файла базы данных.
Формат следующий
keystore "some_keystore_url", "keystore_type", "keystore_provider";
keystorePasswordURL "some_password_url";
Например: $JAVA_HOME/lib/security/java.security:
keystore ".keystore", "JKS, "keystore_provider"; keystorePasswordURL "some_password_url"; policy.url.1=http://foo.example.com/fum/some.policyТо файл баз данных попытается быть найденным здесь http://foo.example.com/fum/.keystore, но можно указать абсолюный путь, тогда не будет этих слепок с урлами файлав правил.
Кстати если тип хранилища JKS, то его указывать не обязательно.
Записи разрешений
Как я уже упомянул, выполняемый код, может быть определен пришедшим из конкретного источника кода(объект CodeSource). Источник кода определяется не только урлом, откуда он прибыл, но и он подвязан на сертификат с общественным ключом внутри, который соответствует частному, которым подписали архив с кодом.Менеджер безопасности понимает какой сертификат из хранилища брать по псевдониму/ам с записи разрешения, чтобы проверить подпись на архиве с приложением.
grant signedBy "signer_names", codeBase "URL",
principal principal_class_name "principal_name",
principal principal_class_name "principal_name",
... {
permission permission_class_name "target_name", "action",
signedBy "signer_names";
permission permission_class_name "target_name", "action",
signedBy "signer_names";
...
};
"Неиталики в шаблоне - ключевые слова, италики - переменные.
Дальнейшее разбирательство продолжается здесь.
И живой примерчик.
Комментариев нет:
Отправить комментарий