使用Python进行Elasticsearch查询中的用户认证

38

我正在使用Python使用elasticsearch。我的代码看起来有点像这样:

from elasticsearch import Elasticsearch

if __name__ == '__main__': 
    index="IndexPosition"
    es=Elasticsearch(['https://localhost:8080'])
    res = es.search(index='{0}'.format(index), doc_type="log",size=1000, from_=0, body={ "query": {
    "match": {
      
        ...Match condition
      }
    }
  }})

现在,由于架构的更改,用户身份验证已添加到elasticsearch中。假设用户名为"user",密码为"pass"。我该如何在查询中传递用户名和密码?

8个回答

63
你需要按照下面的示例将用户名和密码传递给Elasticsearch对象:
es = Elasticsearch(['http://localhost:8080'], basic_auth=('user', 'pass'))
你也可以使用http_auth,但该参数已被弃用,应避免使用。

你是怎么找到 http_auth 参数的? - GeneticsGuy
请查看此链接以获取最新版本:https://stackoverflow.com/a/77505322/7116645 - undefined

23
您可以在URL中传递用户名和密码:
例子: 用户名:elastic 密码:changeme
es = Elasticsearch(hosts="http://elastic:changeme@localhost:9200/")

使用 CURL

curl -X GET "elastic:changeme@localhost:9200/"

为什么 这个 解决方案适合我,但上面的 (http_auth=(user, pwd)) 却不行呢?另外,明文保存密码对于概念验证来说是可以的,但长期来看我无法这样做。有什么建议可以隐藏密码吗? - Guy
1
@Guy 避免在代码中硬编码凭据的常见方法是使用环境变量。https://pypi.org/project/python-dotenv/ 允许您将凭据放入 .env 文件中,并从那里加载它们作为环境变量。 - Jonáš Jančařík

4
在 Elasticsearch 8.x 中,http_auth 参数已被弃用,请分别使用 basic_authbearer_auth
Elasticsearch >= 8.x 基本身份验证示例:
es = Elasticsearch(['https://localhost:8080'], basic_auth=('user', 'pass'))

以下是Elasticsearch < 8.x基本身份验证示例:

es = Elasticsearch(['http://localhost:8080'], http_auth=('user', 'pass'))

2

是的,使用es = Elasticsearch(hosts="http://username:password@es-endpoint:es-port/")

在es版本7.7.1中测试成功


你好,我在尝试查看索引是否存在时遇到了身份验证错误。你能提供一些示例代码吗?我使用的是“res = esClient.indices.exists('metadata-store')”,在创建带有用户名/密码的esClient对象之后。 - Yuva

2
我正在Docker上运行ElasticSearch。ElasticSearch v8.10会自动启用额外的安全性(例如使用证书)。可以通过运行以下命令将证书复制到本地机器:
docker cp elasticsearch:/usr/share/elasticsearch/config/certs/http_ca.crt .
或者,如果不在Docker上:
cp /usr/share/elasticsearch/config/certs/http_ca.crt .
参见: 使用CA证书验证HTTPS在Docker中运行Elasticsearch-启动单节点集群(7-8)
from elasticsearch import Elasticsearch

# Password for the 'elastic' user generated by Elasticsearch
ELASTIC_PASSWORD = "<elastic_password>"

es = Elasticsearch(
    "https://localhost:9200",
    ca_certs="/path/to/http_ca.crt",
    basic_auth=("elastic", ELASTIC_PASSWORD)
)

# Successful response!
es.info()

这对我来说很有效,使用Docker中的Elasticsearch。 - undefined

1
es = Elasticsearch([{'host': 'localhost', 'port': '8080'}], http_auth=('user', 'pass'))

0

Girish Kumar答案适用于在本地运行没有httpselastic-search。 但是,如果启用了安全性(这是ElasticSearch >=8.0的默认行为),那么您还需要传递有关CA证书的更多详细信息。 user2514157在他们的答案中尝试提到了这一点,但这仅适用于Docker容器。 对于本地的ElasticSearch实例,您还可以选择传递SHA-256指纹,您可以在ElasticSearch首次运行时复制它,否则您可以从这里重新生成。 一旦您获得了SHA-256指纹,您只需执行以下操作:

es_obj = Elasticsearch([{'host': 'localhost', 'port' : 9200, 'scheme': 'https'}], ssl_assert_fingerprint=_es_ca_cert, basic_auth=(_es_username, _es_passkey), timeout=10)

print(es_obj.info()) # To verify the connection

使用ssl_assert_fingerprint选项添加您实例的指纹。
参考自这里

0

您可以使用以下主机URL配置连接Elasticsearch

es = Elasticsearch(hosts="http://user:pass@localhost:9200/")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接