Tomcat Realm manager и JMX MBeans#

Realm — это «база данных» имен пользователей и паролей, которые идентифицируют пользователей веб-приложения (или набора веб-приложений), а также перечень ролей, связанных с каждым пользователем. Каждый из пользователей может иметь любое количество ролей.

Tomcat определяет Java-интерфейс (org.apache.catalina.Realm), который реализуется через «подключаемые» компоненты для установки соединения и содержит реализации Realm для поддержки подключения к различным источникам информации об аутентификации:

  • JNDIRealm - позволяет интегрировать аутентификацию и авторизацию пользователей с использованием данных, хранящихся в LDAP-каталоге или других каталогов, поддерживающих протокол LDAP.

  • JDBCRealm — позволяет интегрировать аутентификацию и авторизацию пользователей с использованием данных, хранящихся в реляционной базе данных. Использует JDBC (Java Database Connectivity) для подключения к базе данных и выполнения SQL-запросов для проверки учетных данных и получения ролей пользователей.

  • DataSourceRealm - позволяет интегрировать аутентификацию и авторизацию пользователей с использованием данных, хранящихся в реляционной базе данных. Использует JNDI (Java Naming and Directory Interface) для получения подключения к базе данных через DataSource.

  • UserDatabaseRealm — позволяет управлять аутентификацией и авторизацией пользователей с использованием данных, хранящихся в XML-файле. Не требует подключения к внешним базам данных или каталогам.

  • JAASRealm — позволяет управлять аутентификацией и авторизацией пользователей с использованием JAAS (Java Authentication & Authorization Service).

  • MemoryRealm - позволяет управлять аутентификацией и авторизацией пользователей с использованием данных, хранящихся в оперативной памяти. Данные о пользователях и ролях загружаются из XML-файла при запуске и хранятся на протяжении всей работы сервера.

  • CombinedRealm - позволяет управлять аутентификацией и авторизацией пользователей с использованием нескольких Realm.

  • LockOutRealm - является дополнением для CombinedRealm. Позволяет реализовать отключение пользователя при большом количестве неудачных попыток аутентификации за определенный период времени.

Ведение журнала в Realm#

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

Tomcat использует JULI — Apache Commons Logging, который связан с использованием фреймворка java.util.logging, что гарантирует независимое ведение журнала Tomcat и веб-приложений.

Типы событий, доступные для записи в журнале:

  • Удачная аутентификация;

  • Неудачная аутентификация;

  • Ошибки авторизации;

  • Ошибки Realm;

  • Другие события.

JULI включен по умолчанию и поддерживает конфигурацию для каждого загрузчика классов в дополнение к обычной глобальной конфигурации java.util.logging. Это означает, что ведение журнала можно настроить на следующих уровнях:

  • SEVERE - критические ошибки.

  • WARNING - предупреждения.

  • INFO - информационные сообщения.

  • FINE - детальные сообщения.

  • FINER - более детальные сообщения.

  • FINEST - максимально детализированные сообщения.

Шифрование паролей в Tomcat Realm manager#

В Tomcat пароли пользователей, хранящиеся в различных реализациях Realm, могут быть зашифрованы с использованием алгоритмов хеширования. Tomcat поддерживает несколько алгоритмов хеширования: MD5, SHA-1, SHA-256, SHA-512 и другие.

По умолчанию пароли пользователей хранятся в открытом виде.

Пароли пользователей преобразуются в хеш с использованием одного из представленных выше алгоритмов. Хешированный пароль сохраняется в базе данных, XML-файле или другом хранилище. При аутентификации введенный пользователем пароль хешируется и сравнивается с сохраненным хешем.

Настройка JMX MBeans#

Tomcat использует технологию JMX MBeans для реализации оптимального управления своими компонентами. Описания JMX MBeans для Catalina находятся в файле mbeans-descriptors.xml. При создании пользовательских компонентов нужно добавить описания MBeans, чтобы избежать исключения ManagedBean is not found.

Описания MBeans для пользовательских компонентов добавляются в файл mbeans-descriptors.xml. Файл должен находиться в том же пакете, что и классы, которые он описывает. Синтаксис файла определяется DTD-файлом.

Пример записи для пользовательского Realm аутентификации LDAP может выглядеть следующим образом:

<mbean         name="LDAPRealm"
              className="org.apache.catalina.mbeans.ClassNameMBean"
              description="Custom LDAPRealm"
              domain="Catalina"
              group="Realm"
              type="com.myfirm.mypackage.LDAPRealm">

    <attribute   name="className"
                 description="Fully qualified class name of the managed object"
                 type="java.lang.String"
                 writeable="false"/>

    <attribute   name="debug"
                 description="The debugging detail level for this component"
                 type="int"/>
    .
    .
    .
</mbean>