Зачем вашему проекту нужен java.policy?

от автора

Привет, меня зовут Валерия, я работаю Java-разработчиком в компании SimbirSoft. В этой статье я расскажу вам о java.policy: что это, зачем его использовать и как подключить к проекту. 

В некоторых проектах к исполняемому программному коду, написанному на Java 17 и ниже, отдел информационной безопасности предъявляет повышенные требования. Например, ограничения на доступ к файловой системе или подключение только к определенным ресурсам по принципу запрещено все, что не разрешено. Одним из способов реализации этого является включение java.policy. Java.policy — это файл политики безопасности, используемый в Java для управления доступом к ресурсам и операциям, которые могут быть выполнены приложениями Java. 

Разберем, в каких случаях включение java.policy полезно:

1. Применение сторонних библиотек и модулей. Если ваше приложение использует сторонние библиотеки или модули, файл java.policy позволяет контролировать, какие разрешения имеют эти библиотеки, особенно, если библиотека может выполнять операции, которые могут угрожать безопасности.

2. Ограничение доступов к приложению. Файл java.policy позволяет явно указывать, какие действия и доступы разрешены для вашего приложения. Это необходимо, если приложение выполняет операции, требующие повышенных привилегий, такие как доступ к файловой системе, сетевым ресурсам или другим системным ресурсам.

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

4. Обеспечение гарантии безопасности. Для некоторых приложений, особенно тех, которые разрабатываются для корпоративного использования или обработки конфиденциальной информации, соблюдение стандартов безопасности является обязательным. Файл java.policy помогает гарантировать, что ваше приложение обеспечивает необходимые требования безопасности.

5. Адаптация разрешений. При переносе приложения в различные среды, например, с разработки на тестирование или с тестирования на продакшен, могут быть разные требования к безопасности. Настройка java.policy позволяет адаптировать разрешения в зависимости от окружения.

6. Управление разрешениями в процессе отладки. Во время разработки и тестирования вы можете использовать файл java.policy, чтобы временно расширить или ограничить разрешения вашего приложения. Это позволяет выявить, какие именно разрешения необходимы для корректной работы приложения, и облегчает процесс отладки.

Java.policy позволяет настраивать разрешения для приложения, работая с различными уровнями безопасности. Разрешения прописываются в специальном файле java.policy в виде правил, определяющих, какие действия разрешены для приложений Java. Эти правила могут касаться доступа к файлам, сетевым ресурсам, системным свойствам и т.д. Файл состоит из набора записей, каждая из которых может предоставлять разрешения для определенных JAR-файлов и/или классов.

Синтаксис описания правил следующий:

permission <тип разрешения> <параметры>, <действия>;

Например:

grant codeBase "file:/path/to/your/application.jar" { permission java.io.FilePermission "/path/to/file", "read,write"; permission java.net.SocketPermission "*", "connect,resolve"; };

Здесь мы разрешаем коду из application.jar читать и записывать файлы в папке path/to/file, а также любые сетевые соединения. Если необходимо строго ограничить отправку http-запросов, то разрешение на подключение будет прописано в следующем виде:

permission java.net.SocketPermission "www.example.com", "connect";

В java.policy можно указывать различные типы разрешений, такие как:

 - java.io.FilePermission — доступ к файловой системе (чтение, запись, удаление и т.д.).

 - java.net.SocketPermission — доступ к сети (подключение, прослушивание и т.д.).

- java.util.PropertyPermission — работа со свойствами, необходима в частности для логгеров.

- java.lang.RuntimePermission — общие разрешения, необходимые для работы приложения, например, permission java.lang.RuntimePermission «getenv.*» – чтение информации из окружения.

- java.awt.AWTPermission — доступ к графическому интерфейсу.

- javax.management.MBeanPermission — работа с бинами.

- javax.security.auth.kerberos.KerberosPrincipalPermission — разрешения для работы с Kerberos.

— и другие специфические разрешения.

То есть, если вы подключаете java.policy к spring-boot-проекту, работающему с Kerberos, файл с разрешениями будет выглядеть примерно так:

grant { permission java.lang.RuntimePermission "getenv.*"; permission java.lang.RuntimePermission "accessUserInformation"; permission java.lang.RuntimePermission "accessSystemModules"; permission java.lang.RuntimePermission "accessDeclaredMembers"; permission java.lang.RuntimePermission "createClassLoader"; permission java.lang.RuntimePermission "createSecurityManager"; permission java.lang.RuntimePermission "closeClassLoader";  permission java.lang.RuntimePermission "getClassLoader"; permission java.lang.RuntimePermission "getProtectionDomain"; permission java.lang.RuntimePermission "modifyThread"; permission java.lang.RuntimePermission "modifyThreadGroup"; permission java.lang.RuntimePermission "manageProcess"; permission java.lang.RuntimePermission "reflectionFactoryAccess"; permission java.lang.RuntimePermission "setContextClassLoader"; permission java.lang.RuntimePermission "setFactory"; permission java.lang.RuntimePermission "shutdownHooks"; permission java.util.PropertyPermission "*" ,"read,write"; permission javax.management.MBeanPermission "*#-[*]", "registerMBean"; permission javax.management.MBeanPermission "*#-[*]", "queryNames"; permission javax.management.MBeanPermission "*#-[*]", "getAttribute"; permission javax.management.MBeanPermission "*", "getMBeanInfo"; permission javax.management.MBeanPermission "*", "unregisterMBean"; permission java.io.FilePermission "/" ,"read";    permission java.net.SocketPermission "postgres:5432", "connect,accept,resolve"; permission java.sql.SQLPermission "setNetworkTimeout"; permission java.util.logging.LoggingPermission "control"; permission javax.security.auth.kerberos.ServicePermission "*", "accept,initiate"; permission javax.security.auth.kerberos.KerberosPrincipalPermission "*"; permission javax.security.auth.kerberos.KeyTabPermission "*", "read"; permission javax.security.auth.AuthPermission "createLoginContext.GssExample"; permission javax.security.auth.AuthPermission "doAs"; permission javax.security.auth.AuthPermission "modifyPrivateCredentials"; permission javax.security.auth.AuthPermission "doAsPrivileged"; permission javax.security.auth.AuthPermission "modifyPrincipals"; }

Для того чтобы включить контроль доступа через java.policy, необходимо запустить jar со следующими параметрами (первый параметр — для режима отладки):

1. Djava.security.debug=access  2. Djava.security.manager 3. Djava.security.policy=/path/config/java.policy 4. -jar   app-service-1.0.jar  > /path/logs/app.log 2>&1

Первый пункт включает логирование всех запросов к доступу, и благодаря этому (в сочетании с четвертым пунктом) в файле app.log будет следующая информация:

access: access allowed ("java.io.FilePermission" "/path/app-service-1.0.jar"  "read") access: access allowed ("java.util.PropertyPermission" "java.io.tmpdir" "read").

Второй пункт включает контроль через java.policy, а третий указывает путь к файлу с правилами.

Как это работает?

Например, у нас есть участок кода, который отсылает электронное письмо. При попытке подключения к smpt-серверу менеджер безопасности проверяет, есть ли у кодовой базы соответствующее разрешение. Если его нет, то будет выброшено следующее исключение:

Failed messages: java.security.AccessControlException: access denied ("java.net.SocketPermission" "our-smtp-server" "resolve")    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:410).

Для решения этой проблемы необходимо прописать в java.policy разрешение:

permission "java.net.SocketPermission" "our-smtp-server", "resolve";

Таким образом, алгоритм подключения java.policy к проекту можно описать следующим образом:

1. Прописать разрешения на доступ к свойствам и переменным окружения.

2. Прописать доступы ко всем сетевым ресурсам (БД, ldap, smtp), к которым ваше приложение будет подключаться.

3. При использовании Kerberos прописать разрешения для него.

4. Прописать разрешение для MBean.

5. Запустить приложение с включенным java.policy.

6. Протестировать весь функционал приложения, при возникновении исключения добавить необходимое разрешение в java.policy.

7. Повторять шаги 5-6 до стабилизации работы приложения.

Вывод

В этой статье я объяснила, почему подключение java.policy к проекту является рабочим способом обеспечения дополнительной безопасности и одним из вариантов организации управления доступом к ресурсам в вашем Java-приложении.

Спасибо за внимание! Подписывайся на наши соцсети и блог, где мы публикуем другие полезные материалы, в том числе и для java-разработчиков:

Telegram

ВКонтакте

Habr

YouTube

Дзен


ссылка на оригинал статьи https://habr.com/ru/articles/888832/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *