1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/forview-storm

Клонировать/Скачать
SECURITY.md 37 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 24.06.2025 03:21 f4d009d

Безопасное выполнение Apache Storm

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

Брандмауэр/Уровень ОС

Вы всё ещё можете иметь безопасный кластер Storm без включения формальной аутентификации и авторизации. Однако для этого обычно требуется настроить вашу операционную систему для ограничения выполняемых действий. Это обычно хорошая идея даже если вы планируете запуск кластера с использованием аутентификации.

Точные детали того, как настроить эти меры предосторожности, сильно различаются и выходят за рамки данного документа.

Обычно полезно включить брандмауэр и ограничить входящие сетевые соединения только теми, которые исходят из самого кластера и из доверенных хостов и служб. Полный список портов, используемых Storm, приведён ниже.

Если данные, обрабатываемые вашим кластером, являются чувствительными, возможно, лучше всего будет настроить IPsec для шифрования всех данных, передаваемых между хостами в кластере.

Порты| Установленный порт | Конфиг Storm | Хосты/процессы клиента | Сервер |

|--------------------|--------------|------------------------|--------| | 2181 | storm.zookeeper.port | Nimbus, supervisors и рабочие процессы | Zookeeper | | 6627 | nimbus.thrift.port | Клиенты Storm, supervisors и UI | Nimbus | | 8080 | ui.port | Веб-браузеры клиентов | UI | | 8000 | logviewer.port | Веб-браузеры клиентов | Logviewer | | 3772 | drpc.port | Внешние DRPC клиенты | DRPC | | 3773 | drpc.invocations.port | Рабочие процессы | DRPC | | 3774 | drpc.http.port | Внешние HTTP DRPC клиенты | DRPC | | 670{0,1,2,3} | supervisor.slots.ports | Рабочие процессы | Рабочие процессы |### UI/Logviewer

Процессы UI и logviewer предоставляют возможность не только видеть, что делает кластер, но и управлять запущенными топологиями. Общепринято, чтобы эти процессы были доступны только пользователям кластера.

Как правило, требуется некоторая форма аутентификации, с использованием Java servlet фильтров:

ui.filter: "фильтр.класс"
ui.filter.params: "параметр1": "значение1"

или путем ограничения портов UI/журнальных просмотров только для принятия соединений от локальных хостов, а затем использование их в качестве прокси с помощью другого веб-сервера, такого как Apache httpd, который может аутентифицировать/авторизовать входящие соединения и проксировать соединение к процессу Storm. Чтобы это работало, процесс UI должен иметь параметр logviewer.port установленным на порт прокси в его storm.yaml, в то время как журналы просмотров должны иметь этот параметр установленным на фактический порт, к которому они будут привязаны. Фильтры сервлета предпочтительны, так как они позволяют отдельным топологиям указывать, кто имеет доступ к связанным с ними страницам, а кто нет.Интерфейс Storm можно настроить для использования AuthenticationFilter из hadoop-auth.

ui.filter: "org.apache.hadoop.security.authentication.server.AuthenticationFilter"
ui.filter.params:
   "type": "kerberos"
   "kerberos.principal": "HTTP/nimbus.witzend.com"
   "kerberos.keytab": "/vagrant/keytabs/http.keytab"
   "kerberos.name.rules": "RULE:[2:$1@$0]([jt]t@.*EXAMPLE.COM)s/.*/$MAPRED_USER/ RULE:[2:$1@$0]([nd]n@.*EXAMPLE.COM)s/.*/$HDFS_USER/DEFAULT"

Необходимо создать принципал 'HTTP/{hostname}' (здесь hostname должен быть тем, где запущен демон UI).После настройки пользователи должны выполнить kinit перед использованием UI. Пример:

curl -i --negotiate -u:anyUser -b ~/cookiejar.txt -c ~/cookiejar.txt http://storm-ui-hostname:8080/api/v1/cluster/summary
  1. Firefox: Перейти в about:config и найти network.negotiate-auth.trusted-uris, дважды щелкнуть, чтобы добавить значение "http://storm-ui-hostname:8080"
  2. Google Chrome: запустить из командной строки с параметрами: google-chrome --auth-server-whitelist="*storm-ui-hostname" --auth-negotiate-delegate-whitelist="*storm-ui-hostname"
  3. IE: Настроить доверенные сайты, чтобы включить "storm-ui-hostname" и разрешить переговоры для этого сайта

Внимание: В случае использования AD MIT Kerberos ключ больше по размеру, чем стандартный размер заголовка запроса сервера UI Jetty. Убедитесь, что вы установили ui.header.buffer.bytes в 65536 в storm.yaml. Подробнее см. STORM-633

UI / DRPC SSL

Оба UI и DRPC позволяют пользователям настроить SSL.

UI

Для UI пользователи должны задать следующие параметры в storm.yaml. Создание хранилищ ключей с правильными ключами и сертификатами должно быть выполнено до этой настройки.

  1. ui.https.port
  2. ui.https.keystore.type (например, "jks")
  3. ui.https.keystore.path (например, "/etc/ssl/storm_keystore.jks")
  4. ui.https.keystore.password (пароль хранилища ключей)
  5. ui.https.key.password (пароль приватного ключа)необязательные параметры
  6. ui.https.truststore.path (например, "/etc/ssl/storm_truststore.jks")
  7. ui.https.truststore.password (пароль хранилища доверия)
  8. ui.https.truststore.type (например, "jks") Если пользователи хотят настроить двухфакторную аутентификацию
  9. ui.https.want.client.auth (если это установлено в true, сервер запрашивает клиентский сертификат для аутентификации, но поддерживает соединение, если аутентификация не предоставлена)
  10. ui.https.need.client.auth (если это установлено в true, сервер требует от клиента предоставить аутентификацию)

DRPC

аналогично UI, пользователи должны настроить следующие параметры для DRPC:1. drpc.https.port 2. drpc.https.keystore.type (например, "jks") 3. drpc.https.keystore.path (например, "/etc/ssl/storm_keystore.jks") 4. drpc.https.keystore.password (пароль keystore) 5. drpc.https.key.password (пароль приватного ключа)

необязательные параметры конфигурации: 6. drpc.https.truststore.path (например, "/etc/ssl/storm_truststore.jks") 7. drpc.https.truststore.password (пароль truststore) 8. drpc.https.truststore.type (например, "jks")

Если пользователи хотят настроить двухстороннюю аутентификацию: 9. drpc.https.want.client.auth (если это установлено в true, сервер запрашивает сертификат клиента для аутентификации, но поддерживает соединение, если аутентификация не предоставлена) 10. drpc.с.https.need.client.auth (если это установлено в true, сервер требует от клиента предоставления аутентификации)

Аутентификация (Kerberos)

Storm предлагает поддержку плагинной аутентификации через Thrift и SASL. В этом примере рассматривается только Kerberos, так как это распространенная конфигурация для большинства проектов больших данных.

Настройка KDC и конфигурация Kerberos на каждом узле выходит за рамки этого документа, и предполагается, что вы уже выполнили эти шаги.

Создание сервисных принципов и keytabs

Каждый сервер Zookeeper, Nimbus и DRPC сервер будут нуждаться в сервисном принципе, который, согласно традиции, включает полное доменное имя хоста, на котором он будет работать. Обратите внимание, что пользователь zookeeper должен быть zookeeper.Управители и пользовательские интерфейсы также нуждаются в принципе для выполнения своих задач, но поскольку они используют исходящие соединения, им не требуется быть сервисными принципами.

Вот пример того, как настроить принципы Kerberos, но детали могут варьироваться в зависимости от вашего KDC и ОС.

# Zookeeper (Необходим один из этих для каждого узла в агрегате Zookeeper)
sudo kadmin.local -q 'addprinc zookeeper/zk1.example.com@STORM.EXAMPLE.COM'
sudo kadmin.local -q "ktadd -k /tmp/zk.keytab  zookeeper/zk1.example.com@STORM.EXAMPLE.COM"
# Nimbus и DRPC
sudo kadmin.local -q 'addprinc storm/storm.example.com@STORM.EXAMPLE.COM'
sudo kadmin.local -q "ktadd -k /tmp/storm.keytab storm/storm.example.com@STORM.EXAMPLE.COM"
# Все UI, лог-просмотрщики и управители
sudo kadmin.local -q 'addprinc storm@STORM.EXAMPLE.COM'
sudo kadmin.local -q "ktadd -k /tmp/storm.keytab storm@STORM.EXAMPLE.COM"

Убедитесь, что распределены keytab'ы на соответствующие узлы и установлены права доступа файловой системы так, чтобы только беспроводные пользователи, запускающие ZK или Storm, имели доступ к ним.#### Настройка Kerberos для Storm

Как Storm, так и Zookeeper используют конфигурационные файлы JAAS для аутентификации пользователя. Каждый файл JAAS может содержать несколько разделов для различных интерфейсов.

Чтобы включить аутентификацию Kerberos в Storm, вам нужно установить следующие параметры в storm.yaml:

storm.thrift.transport: "backtype.storm.security.auth.kerberos.KerberosSaslTransportPlugin"
java.security.auth.login.config: "/путь/к/файлу/jaas.conf"
```Процессы Nimbus и supervisor также будут подключаться к ZooKeeper (ZK), и мы хотим настроить их для использования Kerberos для аутентификации с ZK. Для этого добавьте

-Djava.security.auth.login.config=/путь/к/файлу/jaas.conf

```yaml
nimbus.childopts: "-Xmx1024m -Djava.security.auth.login.config=/path/to/file/jaas.conf"
ui.childopts: "-Xmx768m -Djava.security.auth.login.config=/path/to/file/jaas.conf"
supervisor.childopts: "-Xmx256m -Djava.security.auth.login.config=/path/to/file/jaas.conf"
```Файл `jaas.conf` должен выглядеть примерно так для узлов Storm.

Раздел `StormServer` используется процессами Nimbus и DRPC Nodes. Этот раздел не требуется на узлах supervisor.

Раздел `StormClient` используется всеми клиентами Storm, которые хотят общаться с Nimbus, включая UI, LogViewer и supervisor. Мы будем использовать этот раздел на шлюзах, но структура будет немного другой.

Раздел `Client` используется процессами, которые хотят общаться с Zookeeper, и действительно требуется только для Nimbus и supervisor.

Раздел `Server` используется серверами Zookeeper.

Наличие незадействованных разделов в файле JAAS не является проблемой.

```markdown
StormServer {
    com.sun.security.auth.module.Krb5LoginModule необходим
    useKeyTab=true
    keyTab="$keytab"
    storeKey=true
    useTicketCache=false
    principal="$principal";
};
StormClient {
    com.sun.security.auth.module.Krb5LoginModule необходим
    useKeyTab=true
    keyTab="$keytab"
    storeKey=true
    useTicketCache=false
    serviceName="$nimbus_user"
    principal="$principal";
};
Client {
    com.sun.security.auth.module.Krb5LoginModule необходим
    useKeyTab=true
    keyTab="$keytab"
    storeKey=true
    useTicketCache=false
    serviceName="zookeeper"
    principal="$principal";
};
Server {
    com.sun.security.auth.module.Krb5LoginModule необходим
    useKeyTab=true
    keyTab="$keytab"
    storeKey=true
    useTicketCache=false
    principal="$principal";
};

Приведенный ниже пример основан на сгенерированных keytabs

StormServer {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/keytabs/storm.keytab"
    storeKey=true
    useTicketCache=false
    principal="storm/storm.example.com@STORM.EXAMPLE.COM";
};
StormClient {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/keytabs/storm.keytab"
    storeKey=true
    useTicketCache=false
    serviceName="storm"
    principal="storm@STORM.EXAMPLE.COM";
};
```Client {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/keytabs/storm.keytab"
    storeKey=true
    useTicketCache=false
    serviceName="zookeeper"
    principal="storm@STORM.EXAMPLE.COM";
};
Server {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    keyTab="/keytabs/zk.keytab"
    storeKey=true
    useTicketCache=false
    serviceName="zookeeper"
    principal="zookeeper/zk1.example.com@STORM.EXAMPLE.COM";
};
```Nimbus также будет преобразовывать имя принципала в локальное имя пользователя, чтобы другие службы могли использовать это имя. Для настройки этого для аутентификации Kerberos установите

storm.principal.tolocal: "backtype.storm.security.auth.KerberosPrincipalToLocal"


Это требуется только на nimbus, но не повредит на любом узле.
Также нам нужно сообщить топологиям, кто является демоном supervisor и демоном nimbus с точки зрения ZooKeeper.

storm.zookeeper.superACL: "sasl:${nimbus-user}"


Здесь *nimbus-user* — это Kerberos-пользователь, используемый nimbus для аутентификации с ZooKeeper. Если ZooKeeper удаляет хост и реалм, то это тоже должно быть удалено.

#### Кластер ZooKeeper

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

authProvider.1 = org.apache.zookeeper.server.auth.SASLAuthenticationProvider kerberos.removeHostFromPrincipal = true kerberos.removeRealmFromPrincipal = true


И вы хотите включить jaas.conf в командной строке при запуске сервера, чтобы он мог найти keytab.

-Djava.security.auth.login.config=/jaas/zk_jaas.conf


#### Шлюзы

Идеально, если конечному пользователю потребуется запустить только `kinit` перед взаимодействием с Storm. Для обеспечения этого процесса без проблем, необходимо, чтобы по умолчанию конфигурация `jaas.conf` на шлюзах выглядела примерно так:

StormClient { com.sun.security.auth.module.Krb5LoginModule required doNotPrompt=false useTicketCache=true serviceName="${nimbus_user}"; };


### Настройка авторизации

*Аутентификация* выполняет задачу проверки личности пользователя, но также нам нужна *авторизация*, которая выполняет задачу контроля над тем, что каждый пользователь может делать.

Предпочтительным модулем авторизации для Nimbus является *SimpleACLAuthorizer*. Чтобы использовать *SimpleACLAuthorizer*, установите следующее:

```yaml
nimbus.authorizer: "backtype.storm.security.auth.authorizer.SimpleACLAuthorizer"

Для DRPC используется отдельная конфигурация авторизатора. Не используйте SimpleACLAuthorizer для DRPC.

Модуль SimpleACLAuthorizer должен знать, кто такие пользователи-наблюдатели, и он должен знать обо всех администраторах, включая пользователя, запускающего демона UI.

Эти параметры устанавливаются через nimbus.supervisor.users и nimbus.admins соответственно. Каждый из них может быть полным именем принципала Kerberos или именем пользователя с удалённым хостом и реалмом.

Серверы журналирования имеют свои собственные конфигурации авторизации. Эти параметры устанавливаются через logs.users и logs.groups. Они должны быть установлены для администраторских пользователей или групп для всех узлов в кластере.Когда топология отправляется, отправляющий пользователь может указать пользователей в этом списке. Указанные пользователи и группы, а также пользователи из глобальной конфигурации будут иметь доступ к журналам рабочих процессов отправленной топологии в журнале просмотра.### Настройка безголового пользователя и группы для контроллеров

Чтобы обеспечить изоляцию пользователей в многопользовательской среде, необходимо запускать контроллеры и безголовых пользователей и группы, уникальные для выполнения на контроллерах. Чтобы сделать это, следуйте нижеуказанным шагам.

  1. Добавьте безголового пользователя на все контроллеры.
  2. Создайте уникальную группу и сделайте её основной группой для безголового пользователя на контроллерах.
  3. Установите следующие свойства для Storm на этих контроллерах.

Многопользовательский распорядчик задач

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

storm.scheduler: "backtype.storm.scheduler.multitenant.MultitenantScheduler"

Обратите внимание, что многие функции этого планировщика зависят от аутентификации Storm. Без них планировщик не сможет определить пользователя и не сможет правильно изолировать топологии. Цель многопользовательского планировщика состоит в том, чтобы обеспечить способ изоляции топологий друг от друга, но также ограничить ресурсы, доступные отдельному пользователю в кластере.Планировщик имеет одну конфигурацию, которую можно установить либо через файл storm.yaml, либо через отдельный конфигурационный файл под названием multitenant-scheduler.yaml, который должен быть размещен в той же директории, что и storm.yaml. Предпочтительно использовать multitenant-scheduler.yaml, так как его можно обновлять без необходимости перезапуска Nimbus.В настоящее время в файле multitenant-scheduler.yaml присутствует только одна конфигурация, multitenant.scheduler.user.pools — это карта, которая связывает имя пользователя с максимальным количеством узлов, гарантированных для использования этим пользователем для своих топологий.

Пример:

multitenant.scheduler.user.pools: 
    "evans": 10
    "derek": 10

Запуск рабочих процессов от имени пользователя, который отправил топологию

По умолчанию Storm запускает рабочие процессы от имени пользователя, который запускает supervisor. Это не идеально с точки зрения безопасности. Чтобы заставить Storm запускать топологии от имени пользователя, который их запустил, установите следующее значение:

supervisor.run.worker.as.user: true

Для обеспечения безопасности Storm требуется настроить несколько файлов.

Выполняемый файл worker-launcher является специальным программным обеспечением, которое позволяет supervisor запускать рабочие процессы от имени разных пользователей. Для того чтобы это работало, он должен принадлежать root, но группа должна быть установлена как группа, к которой принадлежит только безымянный пользователь supervisor. Он также должен иметь права доступа 6550. Существует также файл конфигурации worker-launcher.cfg, обычно расположенный в /etc/, который должен выглядеть примерно так:

storm.worker-launcher.group=$(worker_launcher_group)
min.user.id=$(min_user_id)
```где `worker_launcher_group` — это та же группа, к которой принадлежит `supervisor`, а `min.user.id` установлен как первое реальное значение ID пользователя в системе.
Этот файл конфигурации также должен принадлежать `root` и не иметь прав записи для группы или всех пользователей.### Имитация пользователя
Клиент Storm может отправлять запросы от имени другого пользователя. Например, если пользователь `userX` отправляет рабочий процесс Oozie, а в ходе выполнения этого рабочего процесса пользователь `oozie` хочет отправить топологию от имени `userX`, он может сделать это с помощью функции имитации. Чтобы отправить топологию от имени другого пользователя, вы можете использовать API `StormSubmitter.submitTopologyAs`. В качестве альтернативы, вы можете использовать `NimbusClient.getConfiguredClientAs`, чтобы получить клиент Nimbus от имени другого пользователя и выполнять любое действие Nimbus (например, завершение работы, балансировка, активация, деактивацию) с помощью этого клиента.Чтобы обеспечить доступ только для авторизованных пользователей к имитации, вы должны запустить nimbus с параметром `nimbus.impersonation.authorizer`, установленным на `backtype.storm.security.auth.authorizer.ImpersonationAuthorizer`.
Компонент `ImpersonationAuthorizer` использует `nimbus.impersonation.acl` в качестве списка разрешений для авторизации пользователей. Ниже приведен пример конфигурации nimbus для поддержки имитации:```yaml
nimbus.impersonation.authorizer: backtype.storm.security.auth.authorizer.ImpersonationAuthorizer
nimbus.impersonation.acl:
    impersonating_user1:
        hosts:
            [список разделённых запятыми хостов, с которых impersonating_user1 имеет право имитировать других пользователей]
        groups:
            [список разделённых запятыми групп, чьих пользователей impersonating_user1 имеет право имитировать]
    impersonating_user2:
        hosts:
            [список разделённых запятыми хостов, с которых impersonating_user2 имеет право имитировать других пользователей]
        groups:
            [список разделённых запятыми групп, чьих пользователей impersonating_user2 имеет право имитировать]

Для поддержки использования Oozie можно использовать следующую конфигурацию:

nimbus.impersonation.acl:
    oozie:
        hosts:
            [oozie-host1, oozie-host2, 127.0.0.1]
        groups:
            [some-group-that-userX-is-part-of]
```### Автоматическое предоставление и продление учетных данных
Индивидуальные топологии имеют возможность предоставлять учетные данные (билеты и токены) сотрудникам, чтобы те могли получить доступ к защищенным службам. Экспонирование этого процесса для всех пользователей может быть проблематичным.
Чтобы скрыть этот процесс от пользователей в общем случае, можно использовать плагины для заполнения учетных данных, распаковывать их на стороне сотрудников в объект java Subject и также позволять Nimbus периодически продлевать учетные данные, если это необходимо.
Эти параметры контролируются следующими конфигурациями. topology.auto-credentials — это список java-плагинов, все из которых должны реализовать интерфейс IAutoCredentials для заполнения учетных данных на шлюзе и распаковки их на стороне сотрудников. В безопасном кластере Kerberos они должны быть установлены по умолчанию на backtype.storm.security.auth.kerberos.AutoTGT.
nimbus.credential.renewers.classes также должны быть установлены на это значение, чтобы Nimbus мог периодически продлевать TGT от имени пользователя.nimbus.credential.renewers.freq.secs контролирует частоту опроса продлителя для проверки необходимости продления учетных данных, но значение по умолчанию должно быть достаточно. Кроме того, Nimbus сам по себе может использоваться для получения учетных данных от имени пользователя, отправляющего топологии. Это можно настроить с помощью параметра `nimbus.autocredential.plugins.classes`, который представляет собой список полностью квалифицированных имен классов, все из которых должны реализовать интерфейс `INimbusCredentialPlugin`. Nimbus будет вызывать метод `populateCredentials` всех конфигурируемых реализаций в процессе отправки топологии. Вы должны использовать эту конфигурацию вместе с параметрами `topology.auto-credentials` и `nimbus.credential.renewers.classes`, чтобы учетные данные могли быть заполнены на стороне рабочих узлов, а Nimbus мог автоматически обновлять их. В настоящее время есть два примера использования этой конфигурации: `AutoHDFS` и `AutoHBase`, которые автоматически заполняют делегирующие токены HDFS и HBase для отправителя топологии, чтобы они не были вынуждены распространять ключевые таблицы на всех возможных рабочих узлах.

### Ограничения
По умолчанию Storm позволяет отправлять топологии любого размера. Однако ZK и другие системы имеют ограничения на максимальный размер топологии. Следующие параметры позволяют вам ограничивать максимальный размер топологии.| YAML Параметр | Описание |
|------------|----------------------|
| nimbus.slots.perTopology | Максимальное количество слотов/рабочих узлов, которое может использовать топология. |
| nimbus.executors.perTopology | Максимальное количество исполнителей/потоков, которое может использовать топология. |

### Удаление старых логов
Демон Logviewer теперь также отвечает за удаление старых лог-файлов умерших топологий.

| YAML Параметр | Описание |
|--------------|-------------------------------------|
| logviewer.cleanup.age.mins | Минимальный возраст (по времени последнего изменения) лог-файла рабочего узла, чтобы он был рассмотрен для удаления. (Логи живых рабочих узлов никогда не удаляются: Их логи переключаются через logback.) |
| logviewer.cleanup.interval.secs | Интервал времени в секундах, через который демон Logviewer удаляет логи рабочих узлов. |

### Разрешение конкретным пользователям или группам доступа к Storm

С помощью SimpleACLAuthorizer любой пользователь с действительной керберской билетом может развернуть топологию или выполнять дальнейшие операции, такие как активация, деактивация, доступ к информации о кластере. Этот доступ можно ограничить, указав параметры `nimbus.users` или `nimbus.groups`. Если указан параметр `nimbus.users`, только пользователи из этого списка могут развертывать топологию или получать доступ к кластеру. Аналогично параметр `nimbus.groups` ограничивает доступ к кластеру Storm только пользователям, которые принадлежат этим группам.Для настройки укажите следующую конфигурацию в файле storm.yaml```yaml
nimbus.users: 
   - "тестовый_пользователь"

или

nimbus.groups: 
   - "шторм"

DRPC

Надеемся рассказать больше об этом в ближайшее время

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/forview-storm.git
git@api.gitlife.ru:oschina-mirror/forview-storm.git
oschina-mirror
forview-storm
forview-storm
master