ACL в Knox
Вы можете ограничить доступ к сервисам кластера с помощью встроенного механизма авторизации сервисного уровня. Данный механизм реализован на основе списков контроля доступа (Access Control Lists, ACL). ACL подразумевает наличие "белых списков" пользователей, групп и IP-адресов, которым разрешен доступ к ресурсу.
Настройка
Для настройки доступа к сервису требуется добавить в топологию Knox (knox/conf/topologies/admin.xml) провайдер авторизации:
<provider>
<role>authorization</role>
<name>AclsAuthz</name>
<enabled>true</enabled>
</provider>
Отредактировать топологию или создать новую можно с помощью REST API сервиса Knox. Данный провайдер позволяет использовать авторизацию на уровне сервиса и не более. Для дальнейшей настройки потребуется создать "белый список" для сервиса.
Например, существует следующая топология с определением сервиса (knox/conf/topologies/test_topology.xml):
<topology>
<name>test-topology</name>
<service>
<role>WEBHDFS</role>
<url>http://localhost:50070/webhdfs</url>
</service>
</topology>
Чтобы создать для неё "белый список", следует добавить в провайдер следующую информацию:
<provider>
<role>authorization</role>
<name>AclsAuthz</name>
<enabled>true</enabled>
<param>
<name>webhdfs.acl</name>
<value>[user list];[group list];[IP list]</value>
</param>
</provider>
где:
-
[user list]
— перечисленные через запятую пользователи, которым разрешен доступ; -
[group list]
-- перечисленные через запятую группы, членам которых разрешен доступ; -
[IP list]
— перечисленные через запятую IP-адреса, с которых разрешен доступ.
ВАЖНО
ACL может работать в двух режимах. В режиме по умолчанию — Альтернативным вариантом работы является режим
|
В режиме AND
вы можете использовать подстановочный знак *
для разрешения доступа всем, в то время как в режиме OR
этот же подстановочный знак запрещает доступ.
Пример
Следующий пример демонстрирует, как ограничить доступ к сервису Solr кластера ADPS. Ограничение доступа к любому другому сервису Hadoop выполняется идентичным образом.
-
Например, существует следующая топология для Solr:
<?xml version="1.0" encoding="UTF-8"?> <topology> <uri>https://stikhomirov-adps.ru-central1.internal:8443/gateway/solr</uri> <name>solr</name> <timestamp>1733257387073</timestamp> <generated>true</generated> <redeployTime>0</redeployTime> <gateway> <provider> <role>authentication</role> <name>HadoopAuth</name> <enabled>true</enabled> <param> <name>config.prefix</name> <value>hadoop.auth.config</value> </param> <param> <name>hadoop.auth.config.cookie.domain</name> <value>ru-central1.internal</value> </param> <param> <name>hadoop.auth.config.cookie.path</name> <value>/</value> </param> <param> <name>hadoop.auth.config.kerberos.keytab</name> <value>/etc/security/keytabs/HTTP.service.keytab</value> </param> <param> <name>hadoop.auth.config.kerberos.name.rules</name> <value>DEFAULT</value> </param> <param> <name>hadoop.auth.config.kerberos.principal</name> <value>HTTP/stikhomirov-adps.ru-central1.internal@AD.RANGER-TEST</value> </param> <param> <name>hadoop.auth.config.simple.anonymous.allowed</name> <value>false</value> </param> <param> <name>hadoop.auth.config.token.validity</name> <value>1800</value> </param> <param> <name>hadoop.auth.config.type</name> <value>kerberos</value> </param> </provider> <provider> <role>identity-assertion</role> <name>Default</name> <enabled>true</enabled> </provider> </gateway> <service> <role>SOLR</role> <url>http://stikhomirov-adps.ru-central1.internal:8983/solr/</url> </service> </topology>
-
Добавьте в неё провайдер авторизации, как описано в настройке:
<provider> <role>authorization</role> <name>AclsAuthz</name> <enabled>true</enabled> <param> <name>solr.acl</name> <value>s_tikhomirov_krb1;*;*</value> </param> </provider>
В данном случае работа производится на керберизованном кластере, поэтому имя принципала Kerberos подходит в качестве имени пользователя.
-
Попробуйте получить доступ к сервису Solr через Knox:
$ curl -ik --negotiate -u : -X GET https://stikhomirov-adps.ru-central1.internal:8443/gateway/solr/solr
-
При верно описанных условиях в ответе вы получите код HTML-страницы. В противном случае вернется код ошибки
403 Forbidden
.