【问题标题】:Cognito Credentials are not authorized to perform Execute apiCognito Credentials 无权执行 Execute api
【发布时间】:2020-06-29 07:37:13
【问题描述】:

我正在尝试使用 AWS Cognito 组创建基于角色的访问控制。我定义了以下角色和策略来拒绝访问资源

CognitoAuthRole:
      Type: AWS::IAM::Role
      Properties:
        Path: /
        AssumeRolePolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: "Allow"
              Principal:
                Federated: "cognito-identity.amazonaws.com"
              Action:
                - "sts:AssumeRoleWithWebIdentity"
              Condition:
                StringEquals:
                  "cognito-identity.amazonaws.com:aud":
                    Ref: CognitoIdentityPool
                "ForAnyValue:StringLike":
                  "cognito-identity.amazonaws.com:amr": authenticated
        Policies:
          - PolicyName: "CognitoAuthorizedPolicy"
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: "Deny"
                  Action: "*"
                  Resource: "*"

然后我创建了一个名为 admin incognito user pool 的组,并分配了一个具有策略的角色,让用户按如下方式调用 API

CognitoUserPoolGroupAdmin:
  Type: AWS::Cognito::UserPoolGroup
  Properties:
    UserPoolId:
      Ref: CognitoUserPool
    GroupName: Admin
    Precedence: 0
    RoleArn:
      Fn::GetAtt:
        - AdminRole
        - Arn

AdminRole:
      Type: AWS::IAM::Role
      Properties:
        Path: /
        RoleName: AdminRole
        AssumeRolePolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: "Allow"
              Principal:
                Federated: "cognito-identity.amazonaws.com"
              Action:
                - "sts:AssumeRoleWithWebIdentity"
              Condition:
                StringEquals:
                  "cognito-identity.amazonaws.com:aud":
                    Ref: CognitoIdentityPool
                "ForAnyValue:StringLike":
                  "cognito-identity.amazonaws.com:amr": authenticated
        Policies:
          - PolicyName: CognitoAdminPolicy
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: "Allow"
                  Action:
                    - "execute-api:Invoke"
                  Resource:
                    - arn:aws:execute-api:ap-south-1:****:***/*/GET/user

然后我创建了一个用户并添加到组管理员并获得临时凭据,然后尝试调用 API 并在邮递员中得到以下 403 错误

“用户: arn:aws:sts::******:assumed-role/auth-service-dev-CognitoAuthRole-1JO2U7LKRJRBB/CognitoIdentityCredentials 无权执行:execute-api:Invoke on resource: arn:aws:execute-api:ap-south-1:********2015:****/dev/GET/user 明确否认”

这运行良好,并在删除和重新部署云形成堆栈后开始导致此错误。

【问题讨论】:

  • 您已明确拒绝 CognitoAuthorizedPolicy 中的所有内容。显式拒绝总是胜出。
  • @Marcin。 AWS 不是更优先考虑 Group 角色吗?
  • 没有。 explicit deny 在权限评估链中的任何位置都会覆盖任何允许。检查政策是如何评估的here
  • @Marcin 谢谢你给了我一个提示。我错过了在 ID 池的 Authentication Providers 部分配置 Authenticated role selection。将其从“使用默认角色”更改为“从令牌中选择角色*”修复了问题。您提供的资源告诉我,我对评估工作方式的理解是错误的。
  • 没问题。刚刚添加了答案以供将来参考。

标签: amazon-web-services aws-api-gateway amazon-cognito serverless-framework


【解决方案1】:

根据 cmets,问题是 explicit deny。来自docs

如果代码发现甚至有一个明确的拒绝适用,代码 返回拒绝的最终决定。

基本上,explicit deny 总是胜过任何allow

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 2021-02-08
    • 2019-06-21
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多