启用Cognito认证后访问AWS Elasticsearch端点遭遇`anonymous is not authorized to perform: es:ESHttpGet`错误的排查求助
解决AWS Elasticsearch(OpenSearch)Cognito认证后的匿名访问权限问题
看到你遇到了{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet"}的错误,结合你已经配置了Cognito认证但还是无法访问的情况,我来梳理下可能遗漏的配置步骤和修复方法:
1. 确认Cognito与ES域的关联是否完整
首先要确保你在ES域的细粒度访问控制设置里,已经正确绑定了Cognito用户池和身份池:
- 登录AWS控制台,进入你的Elasticsearch(OpenSearch)域详情页
- 找到**“Fine-grained access control”**(细粒度访问控制)选项,确认“Amazon Cognito authentication”已经启用,并且选择了正确的用户池和身份池
- 这里要注意:如果你启用了细粒度访问控制,ES会优先用它来做权限校验,而你提供的资源策略(JSON配置)主要是用来控制哪些请求能到达ES服务,两者需要配合使用
2. 调整ES资源访问策略
你当前的策略指定了Cognito认证角色作为Principal,但可以优化一下,添加条件确保请求来自已认证的Cognito身份,同时覆盖所有需要的HTTP操作:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<<Account_Number>>:role/Cognito_kibana_identitiesAuth_Role" }, "Action": "es:ESHttp*", "Resource": "arn:aws:es:us-east-2:<<Account_Number>>:domain/<<Domain_Name>>/*", "Condition": { "StringEquals": { "aws:PrincipalTag/cognito-identity-id": "${cognito-identity-id}" } } } ] }
另外,如果你启用了细粒度访问控制,还需要在ES内部(或通过Kibana)给Cognito认证的用户/组分配具体的权限,比如all_access或者针对特定索引的read/write权限——资源策略只是放行请求,细粒度策略才控制用户能操作哪些数据。
3. 确保请求携带Cognito认证凭证
直接在浏览器访问ES端点是不会自动带上Cognito身份的,你需要通过正确的方式发起请求:
- 优先通过Kibana访问:Kibana已经集成了Cognito的认证流程,登录Kibana后发起的请求会自动带上认证凭证
- 如果用Postman/curl等工具,需要先通过Cognito获取ID Token,然后在请求头里添加
Authorization: Bearer <你的Cognito_ID_Token>,或者用AWS SigV4签名请求(取决于你的ES认证配置)
4. 检查Cognito认证角色的信任关系
打开IAM控制台,找到你的Cognito_kibana_identitiesAuth_Role,检查它的信任策略是否允许Cognito身份池的认证用户Assume这个角色,正确的信任策略应该类似:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "<你的Cognito身份池ID>" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }
如果信任关系配置错误,Cognito认证后的用户无法获取到这个角色的权限,请求就会被判定为匿名访问。
内容的提问来源于stack exchange,提问作者Vidhya Dhara
相关产品推荐
相关产品推荐

