【问题标题】:API Key Authentication in Elasticsearch with python使用 python 在 Elasticsearch 中进行 API 密钥身份验证
【发布时间】:2020-04-11 01:51:00
【问题描述】:

我希望找到弹性搜索 python 框架问题的答案。也许我完全失明或做错了什么,但我现在很困惑,找不到合适的答案。

我目前正在尝试使用elasticsearch python framework 与我的弹性搜索 API 建立连接,我的代码如下所示:

from elasticsearch import Elasticsearch

def create_es_connection(host: str, port: int, api_key_id: str, api_key: str, user: str, pw: str) -> Elasticsearch:
    return Elasticsearch([f"https://{user}:{pw}@{host}:{port}"])

这工作正常。然后我为我的 testuser 创建了一个 API 密钥,我也将它提供给了上面的函数。我现在正在尝试做类似这样的事情:Elasticsearch([f"https://{api_key_id}:{api_key}@{host}:{port}"]) 所以,我想完全省略用户和密码,因为关于这个 sn-p 背后的更大项目,我在保存时感觉不太好我项目中的用户/密码凭据(甚至可能将其推送到我们的 git 服务器)。迟早,这些凭据必须在某个地方输入,我在想只保存 API 密钥并使用它进行身份验证可能更安全。不幸的是,这并没有按我的计划进行,我找不到任何关于如何仅使用 API 密钥进行身份验证的信息。

我做错了什么?事实上,我对此发现的太少了,以至于我在这里质疑我的基本理解。感谢您的回复!

【问题讨论】:

    标签: python api authentication elasticsearch key


    【解决方案1】:

    我的工作配置是:

    es = Elasticsearch(['localhost:9200'], api_key=('DuSkVm8BZ5TMcIF99zOC','2rs8yN26QSC_uPr31R1KJg'))
    

    【讨论】:

    • 这对我有用。 api_key 显然在使用 api_key=('api_key_id', 'api_key')。这确实应该记录在某个地方。
    • @CptSnuggles 我在文档中找到了这个 [链接] (elasticsearch-py.readthedocs.io/en/master/…)。不知道它是什么时候添加的,但它现在似乎在那里!
    • 这不起作用,而是我得到了整个范围的 http.client.RemoteDisconnected 垃圾
    【解决方案2】:

    Elasticsearch 的文档展示了如何生成和使用(在页面底部)API 密钥:https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html

    curl -H "Authorization: ApiKey ..." http://localhost:9200/_cluster/health
    

    -H 表示“标题”,因此要在 Python 中执行相同操作,您需要设置此标题。翻阅 elasticsearch 模块源代码告诉我,您可能只能执行以下操作:

    Elasticsearch([f'http://{host}:{port}'], api_key=api_key)
    

    原因是Elasticsearch.__init__方法的**kwargs被传递给Transport.__init__,其中的**kwargs被传递给Connection.__init__, which takes an api_key arg,然后在 _get_api_key_header_val 构造相应的标头。

    以下代码显示 api 密钥头被添加到请求的 HTTP 头中:

    import elasticsearch, logging, http.client
    http.client.HTTPConnection.debuglevel = 5
    logging.basicConfig(level=logging.DEBUG)
    c = elasticsearch.Elasticsearch(['localhost'], api_key='TestApiKey')
    print(c.cluster.health(wait_for_status='green'))
    

    这绝对是应该添加到 Elasticsearch 文档中的内容。

    【讨论】:

    • 嗨安德烈亚斯,谢谢您的回复!不幸的是,像你建议的那样添加这个是行不通的。错误:https://pastebin.com/raw/0x96LSJV 更多信息,我目前正在使用最新版本中的所有组件(7.5.0 中的 Elastic 和更新的 python 框架)。
    • 我更新了我的答案以表明传递 api_key 参数确实设置了正确的 HTTP 标头。您的 ES 拒绝请求可能还有另一个原因 - xpack 安全性可能被禁用,或者您可能必须启用 HTTPS。
    • 您说的完全正确,密钥已正确传递给标题。我现在也可以在http_urllib3 中重建它。 X-Pack 和 https 实际上是启用的,但也许我在那里的某个地方错误配置了一些东西,要仔细检查一下。
    • 到目前为止,我在 elasticsearch 日志中发现了一些 WARN 消息:elasticsearch_1 | {"type": "server", "timestamp": "2019-12-19T14:41:57,747Z", "level": "WARN", "component": "o.e.x.s.a.AuthenticationService", "cluster.name": "elasticsearch", "node.name": "elasticsearch", "message": "Authentication using apikey failed - invalid ApiKey value", "cluster.uuid": "0DNPuMBRQ7yN9SB34yYz9w", "node.id": "vj82JxvhTi6HbfZ5if54Ow" ,
    猜你喜欢
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多