403使用Sig v4:'将数据从AWS Lambda索引到Elasticsearch时出错;没有[INDEX:DATA/WRITE/BULK]'的权限 [英] 403 Error when indexing data from AWS Lambda to Elasticsearch using Sig v4: 'no permissions for [indices:data/write/bulk] '

查看:63
本文介绍了403使用Sig v4:'将数据从AWS Lambda索引到Elasticsearch时出错;没有[INDEX:DATA/WRITE/BULK]'的权限的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的函数可以从本地Jupyter笔记本将单个和批量文档索引到我的AWS Elasticsearch,但当我部署到Lambda时,它一直返回此错误:

"errorMessage": "AuthorizationException(403, 'security_exception', 'no permissions for
[indices:data/write/bulk] and User [name=arn:aws:iam::xxxxxxxxxxxx:role/MyLambdaRole,
backend_roles=[arn:aws:iam::xxxxxxxxxxxx:role/MyLambdaRole], requestedTenant=null]')"

My Elasticsearch域(v7.7)配置如下:

Fine-grained access control: Enabled
Master user type: Internal user database
SAML authentication: Disabled
Amazon Cognito for authentication: Disabled
Require HTTPS: Enabled
Encryption at rest: Enabled
KMS master keyarn:aws:kms:us-east-1:xxxxxxxxxxxxx:key/<aws/es key>
Node-to-node encryption: Enabled

域的访问策略包含:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "*"
    }
  ]
}

MyLambdaRole的IAM策略包含:

...
        {
            "Action": [
                "es:*"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        }
    ]
在Kibana中,我在Security-&>Role Mappings->;All_Access下映射了我的AWS管理员IAM用户和MyLambdaRole。我尝试了将它们添加到后端角色和将它们添加到SECURITY_MANAGER的不同组合。

Lambda使用AWS Signature v4身份验证,ElasticSearch客户端版本为7.7.0:

import boto3
from elasticsearch import Elasticsearch, RequestsHttpConnection, helpers
from requests_aws4auth import AWS4Auth

session = boto3.Session()
credentials = session.get_credentials().get_frozen_credentials()

awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, 
    session.region_name, 'es', session_token=credentials.token)

host = 'search-es-domain.us-east-1.es.amazonaws.com'

es = Elasticsearch(
    hosts = [{'host': host, 'port': 443}],
    http_auth = awsauth
    use_ssl = True,
    verify_certs = True,
    connection_class = RequestsHttpConnection
)

# Single indexing call
document = { my data }
es.index(index="my_index", doc_type="_doc", id=doc_id, body=document)

# Bulk indexing call
k = ({ my data })
helpers.bulk(es, k)

如果我将http_auth = awsauth替换为我的Kibana凭据http_auth = (kibana_username, kibana_password),它将返回状态200,但随后不会在索引中创建新文档,这很奇怪。

我想知道我可能遗漏了什么,或者我的配置可能在哪里关闭。

推荐答案

这是因为启用了细粒度访问控制。我遇到了完全相同的问题,细粒度访问控制会导致问题。您的笔记本可能正在使用您指定的主ARN,该ARN具有访问权限,基本上始终被允许。

我重新创建了ES实例,禁用了细粒度访问控制,并仅在适合我们的设置时使用域策略。

单击此处阅读更多内容,并注意到突出显示的部分Re User/IAM混合,无法正常工作。

https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/fgac.html

这篇关于403使用Sig v4:&#39;将数据从AWS Lambda索引到Elasticsearch时出错;没有[INDEX:DATA/WRITE/BULK]&#39;的权限的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆