понедельник, 20 марта 2017 г.

Расширенная безопасность запуска jvm приложений

Линия поведения приложений в JRE представлена объектом java.security.Policy. Он определяет, что можно делать для кода из разных источников, выполняя эти приложения под разными доверителями. Это касаться приложений, которые будут запускаться по менеджером безопасности и аплетов.

В зависимости от реализации 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";
      ...
  };
"
Неиталики в шаблоне - ключевые слова, италики - переменные.
Дальнейшее разбирательство продолжается здесь.
И живой примерчик.

Комментариев нет:

Отправить комментарий