【问题标题】:NIFI nipyapi.nifi.rest.ApiException: (401) Reason: Unauthorized. KNOX GatewayNIFI nipyapi.nifi.rest.ApiException:(401)原因:未经授权。诺克斯网关
【发布时间】:2018-12-11 14:06:10
【问题描述】:
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/sam/Documents/freenet/nifi-automation/src/compose.py", line 122, in <module>
    compose_services(env_config, types, NIFI_VERSION, False, bench)
  File "/home/sam/Documents/freenet/nifi-automation/src/compose.py", line 11, in compose_services
    pg = ProcessorGroups(NIFI_VERSION)
  File "/home/sam/Documents/freenet/nifi-automation/src/components/processor_group.py", line 9, in __init__
    processor_groups = nipyapi.canvas.list_all_process_groups(pg_id='root')
  File "/home/sam/Documents/freenet/nifi-automation/venv/lib/python3.6/site-packages/nipyapi/canvas.py", line 178, in list_all_process_groups
    root_flow = recurse_flow(pg_id)
  File "/home/sam/Documents/freenet/nifi-automation/venv/lib/python3.6/site-packages/nipyapi/canvas.py", line 64, in recurse_flow
    return _walk_flow(get_flow(pg_id))
  File "/home/sam/Documents/freenet/nifi-automation/venv/lib/python3.6/site-packages/nipyapi/canvas.py", line 85, in get_flow
    raise ValueError(err.body)
ValueError: No applicable policies could be found. Contact the system administrator.

Process finished with exit code 1

我有一些 NIFI 自动化脚本,当我在不安全的集群(localhost/或 somehwere)上运行时,它们运行良好,但是 我在运行 KNOX 网关 后面的 URL 时收到此错误。 我可以在 nipyapi.access_api 类中看到一些函数

  • def knox_callback(**kwargs)
  • def knox_callback_with_http_info(self, **kwargs):
  • def knox_request(self, **kwargs):
  • def knox_request_with_http_info(self, **kwargs):

我无法理解如何使用这些或与类中的任何其他功能相结合来克服这个问题?有什么想法吗?

EDIT1: 首先使用security.py 功能的IM 是secure_login。在文档中,其书面登录需要通过 https 进行安全连接。在调用此方法之前,必须指定主机并配置 SSLContext(如果需要)。 set_service_ssl_context 这个函数可以达到目的,但我不确定我是否需要它,因为一种方式 TSL 不需要它。

但我有一个困惑。我有两个 URL,一个带有 LDAP 登录的 Knox URl 另一个直接 URI(尽管它也重定向到 knox-Ldap 序列)当我给 Knox url 时,我得到一个与直接 URL 不同的错误。

从我得到的直接 URI

File /nipyapi/security.py", line 130, in service_login
    username=username, password=password)
nipyapi.nifi.rest.ApiException: (409)
Reason: Conflict
HTTP response body: Username/Password login not supported by this NiFi.

如果是 Knox uri,它会在相同的行上抛出相同的连接错误异常,但是

nipyapi.nifi.rest.ApiException: (404)
Reason: Not Found

所以我假设我必须使用直接 url。其次,为什么它说用户不适合。我可以手动登录。来自 LDAP 序列。 我当前的请求是以匿名用户身份进行的,因此我将使用 Certs 并尝试使用 PEM 文件的 set_service_ssl_context 函数。

顺便说一句,下面是两个网址。

"nifi_host": "https://****.****.net:8443/nifi-api", 直接网址

"nifi_host": "https://****-****.****.net:8443/gateway/****-sso/nifi-api", knox url

编辑 2: 即使使用以下代码,我的请求也会在服务器上以匿名方式接收。

nipyapi.security.set_service_ssl_context(service='nifi', ca_file=None, client_cert_file="bi.keystore", client_key_file=None, client_key_password="infraop6043")
nipyapi.security.service_login(username='myuser', password='mypass')

这里出现连接错误

nipyapi.nifi.AccessApi().create_access_token(username=username,password=password) 并显示此错误 HTTP 响应正文:此 NiFi 不支持用户名/密码登录

我不确定如何正确使用 set_service_ssl_context。也许我应该尝试直接使用letsencrypt-root-ca而不是bi.keystore:letsencrypt.org/certs/isrgrootx1.pem.txt或我的本地系统ca-certs。

我的 toolkit-cli 属性文件是

*baseUrl=https://svc-hadoop-utilities-pre-c3-02.jamba.net:18443

keystore=/home/jread/nifi-toolkit/bi.keystore

keystoreType=JKS

keystorePasswd=infraop6043

keyPasswd=

truststore=/usr/lib/java/jre/lib/security/cacerts

truststoreType=JKS

truststorePasswd=changeit

proxiedEntity=CN=bijobs.jamba.net*

【问题讨论】:

    标签: apache-nifi knox-gateway apache-ranger


    【解决方案1】:

    您收到的错误消息“找不到适用的政策。联系系统管理员。通常由 Ranger 插件在启用安全性并且不允许您连接的用户时生成,我没有看到 Knox 生成它。

    当您为 NiFi 启用 Knox 时,您能否确认您没有启用无策略的 Ranger,这就是您收到的错误消息? 如果您查看 nifi-app.log,我怀疑您会看到同样的错误,这表明 NiPyAPi 只是在传输 NiFi 由于安全设置不完整而产生的错误。

    【讨论】:

    • 游侠已设置。之前,如前所述,我使用不安全的集群来部署东西。现在我想用这个有 Knox 和 ranger 的。但我无法弄清楚要使用的 API 或顺序。
    • 是的,之前部署的流程是由本地匿名用户执行的。我显然不会在这里获得授权。我知道如果想在 NIFI 中进行一些身份验证,必须执行 LDAP/Kerberos/OpenID 等,然后获取访问令牌并传递给 API。但我不知道如何使用 Ranger+Knox 来做到这一点。任何帮助将不胜感激
    • 因此您需要按照 Ranger 文档将您的特定身份提供者(例如 LDAP)与 Ranger 集成,然后在 Ranger 中创建 NiFi 策略以允许特定用户执行操作。然后在 Nipy 中,您将能够使用 security.py 方法以该用户身份登录,它应该为您处理令牌
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2011-03-06
    • 2018-05-19
    • 2020-06-11
    • 2017-02-22
    • 2018-10-08
    相关资源
    最近更新 更多