Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Руководство [7.17] ›Защита Elastic Stack ›Защита клиентов и интеграций

Java-клиент и безопасность

Устарело в 7.0.0.

TransportClient устарело в пользу Java High Level REST-клиента и будет удалено в Elasticsearch 8.0. В руководстве по миграции описаны все шаги по миграции.

Функции безопасности Elasticsearch поддерживают Java транспортный клиент для Elasticsearch. Транспортный клиент использует тот же транспортный протокол, что и узлы кластера для межузловой связи. Он очень эффективен, так как ему не нужно сериализовывать и десериализовывать JSON-запросы, как обычному REST-клиенту.

Использование Java Node-клиента с защищёнными кластерами не рекомендуется и не поддерживается.

Настройка транспортного клиента для работы с защищённым кластером

Для использования транспортного клиента с защищённым кластером необходимо:

  1. Настроить X-Pack транспортный клиент.
  2. Настроить пользователя с необходимыми привилегиями для запуска транспортного клиента. Встроенная роль transport_client Elasticsearch, предоставляющая соответствующие разрешения кластера для работы транспортного клиента с защищённым кластером. Транспортный клиент использует API Nodes Info для получения информации о узлах в кластере.
  3. Настроить транспортный клиент. Как минимум, необходимо настроить xpack.security.user, чтобы включить имя и пароль пользователя транспортного клиента в запросы. Следующий фрагмент настраивает учетные данные пользователя глобально — каждый запрос, отправленный с этим клиентом, включает учетные данные transport_client_user в своих заголовках.

    import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
    ...
    
    TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
            .put("cluster.name", "myClusterName")
            .put("xpack.security.user", "transport_client_user:x-pack-test-password")
            ...
            .build())
        .addTransportAddress(new TransportAddress("localhost", 9300))
        .addTransportAddress(new TransportAddress("localhost", 9301));

    Если вы настраиваете транспортный клиент без SSL, пароли отправляются в открытом виде.

    Вы также можете добавить заголовок Authorization в каждый запрос. Если вы настроили глобальные учетные данные авторизации, заголовок Authorization переопределяет глобальные учетные данные авторизации. Это полезно, когда приложение имеет нескольких пользователей, которые обращаются к Elasticsearch с помощью одного и того же клиента. Вы можете установить глобальный токен для пользователя, имеющего только роль transport_client, и добавить роль transport_client к отдельным пользователям.

    Например, следующий фрагмент добавляет заголовок Authorization в запрос поиска:

    import org.elasticsearch.common.settings.SecureString;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.TransportAddress;
    import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
    
    import static UsernamePasswordToken.basicAuthHeaderValue;
    ...
    
    TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
            .put("cluster.name", "myClusterName")
            .put("xpack.security.user", "transport_client_user:x-pack-test-password")
            ...
            .build())
        .build()
        .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
        .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9301))
    
    String token = basicAuthHeaderValue("test_user", new SecureString("x-pack-test-password".toCharArray()));
    
    client.filterWithHeader(Collections.singletonMap("Authorization", token))
        .prepareSearch().get();
  4. Включить SSL для проверки подлинности клиентов и шифрования сообщений. Для включения SSL необходимо:

    1. Настроить пути к ключу и сертификату клиента, а также к сертификатам удостоверяющих центров. Проверка подлинности клиента требует, чтобы каждый клиент имел сертификат, подписанный надёжным удостоверяющим центром.

      Проверка подлинности клиента включена по умолчанию. Сведения о отключении проверки подлинности клиента см. в Отключение проверки подлинности клиента.

      import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
      ...
      
      TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
              .put("cluster.name", "myClusterName")
              .put("xpack.security.user", "transport_client_user:x-pack-test-password")
              .put("xpack.security.transport.ssl.enabled", true)
              .put("xpack.security.transport.ssl.key", "/path/to/client.key")
              .put("xpack.security.transport.ssl.certificate", "/path/to/client.crt")
              .put("xpack.security.transport.ssl.certificate_authorities", "/path/to/ca.crt")
              ...
              .build());
    2. Включить транспорт SSL, установив xpack.security.transport.ssl.enabled в значение true в конфигурации клиента.

      import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
      ...
      
      TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
              .put("cluster.name", "myClusterName")
              .put("xpack.security.user", "transport_client_user:x-pack-test-password")
              .put("xpack.security.transport.ssl.enabled", true)
              .put("xpack.security.transport.ssl.key", "/path/to/client.key")
              .put("xpack.security.transport.ssl.certificate", "/path/to/client.crt")
              .put("xpack.security.transport.ssl.certificate_authorities", "/path/to/ca.crt")
              .put("xpack.security.transport.ssl.enabled", "true")
              ...
              .build())
          .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
          .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9301))
Отключение проверки подлинности клиента

Если вы хотите отключить проверку подлинности клиента, вы можете использовать клиентский транспортный протокол. Более подробную информацию см. в Разделение трафика между узлами и клиентами.

Если вы не используете проверку подлинности клиента и подписываете сертификаты узлов Elasticsearch собственным удостоверяющим центром, необходимо указать путь к сертификату CA в конфигурации клиента.

import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
...

TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
        .put("cluster.name", "myClusterName")
        .put("xpack.security.user", "test_user:x-pack-test-password")
        .put("xpack.security.transport.ssl.certificate_authorities", "/path/to/ca.crt")
        .put("xpack.security.transport.ssl.enabled", "true")
        ...
        .build())
    .addTransportAddress(new TransportAddress("localhost", 9300))
    .addTransportAddress(new TransportAddress("localhost", 9301));

Если вы используете публичный удостоверяющий центр, которому уже доверяет среда выполнения Java, вам не нужно устанавливать xpack.security.transport.ssl.certificate_authorities.

Подключение анонимно

Чтобы транспортный клиент мог подключиться анонимно, необходимо назначить анонимному пользователю привилегии, определённые в роли transport_client. Анонимный доступ, конечно же, также должен быть включён. Дополнительные сведения см. в Включение анонимного доступа.

Клиент безопасности

Функции безопасности Elastic Stack предоставляют API через класс SecurityClient. Чтобы получить экземпляр SecurityClient, сначала необходимо создать XPackClient, который является оболочкой над существующими Elasticsearch-клиентами (любой класс клиента, реализующий интерфейс org.elasticsearch.client.Client).

Следующий пример демонстрирует, как можно очистить кэши областей с помощью SecurityClient:

Client client = ... // create the transport client

XPackClient xpackClient = new XPackClient(client);
SecurityClient securityClient = xpackClient.security();
ClearRealmCacheResponse response = securityClient.authc().prepareClearRealmCache()
    .realms("ldap1", "ad1") 
    .usernames("rdeniro")
    .get();

Очищает кэши областей ldap1 и ad1 для пользователя rdeniro.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/java-clients.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API