【问题标题】:AWS IAM Fine-Grained Access Control though APIGateway and Lambda通过 API Gateway 和 Lambda 进行 AWS IAM 细粒度访问控制
【发布时间】:2018-03-21 11:29:09
【问题描述】:

我是 AWS 新手,并且继承了一个现有项目。

项目使用Vue.js作为前端,数据存储在DynamoDB中。用户身份验证是使用 Cognito 完成的,并附加了 IAM 角色。通过 APIGateway 和 Lambda 从数据库中通过不同的角色检索数据。

前端角色

可信实体:cognito-identity.amazonaws.com

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": [
            "*"
        ]
    },
    {
        "Effect": "Allow",
        "Action": [
            "execute-api:Invoke"
        ],
        "Resource": [
            "*"
        ]
    }
]
}

后端角色

可信实体: 身份提供者 apigateway.amazonaws.com, 身份提供者 lambda.amazonaws.com

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Stmt1493183261000",
        "Effect": "Allow",
        "Action": [
            "dynamodb:BatchGetItem",
            "dynamodb:BatchWriteItem",
            "dynamodb:DeleteItem",
            "dynamodb:DescribeStream",
            "dynamodb:DescribeTable",
            "dynamodb:GetItem",
            "dynamodb:GetRecords",
            "dynamodb:GetShardIterator",
            "dynamodb:ListStreams",
            "dynamodb:ListTables",
            "dynamodb:PutItem",
            "dynamodb:Query",
            "dynamodb:Scan",
            "dynamodb:UpdateItem",
            "dynamodb:UpdateTable"
        ],
        "Resource": [
            "arn:aws:dynamodb:us-east-1:*:table/foo",
            "arn:aws:dynamodb:us-east-1:*:table/bar",
            "arn:aws:dynamodb:us-east-1:*:table/bar/index/dayKey-captureTime-index"
        ]
    }
]
}

但是,我需要对用户进行授权,这样我就可以将 Group 分配给某些用户,这样他们就可以访问特定的项目,并限制对 dynamoDB 中其他项目的访问

我阅读了有关 IAM 细粒度访问控制的信息,但它不起作用,因为用户通过 APIGateway 与数据库通信,APIGateway 可以访问所有数据。

我可以放弃 APIGateway 和 Lambda,让用户直接与 DynamoDB 对话(这似乎是个坏主意,因为 Lambda 对数据做了一些工作,而这种方法会使我的应用程序与 AWS 的连接过于紧密)。

或者我可以创建具有不同权限的其他 API,这似乎不是正确的方法。

有人有什么建议吗?或者知道更好的方法?

【问题讨论】:

  • 你是怎么解决这个问题的?

标签: lambda amazon-dynamodb aws-api-gateway amazon-iam access-control


【解决方案1】:

API 网关支持低至方法级别的访问控制。很难动态控制对 DDB 中特定项目的访问,但如果您谈论的是特定的静态项目,那么您可以将表/项目硬编码到 API GW 或 Lambda 层中,并使用 API 控制对该 API 方法的访问网关权限。

使用 API Gateway 访问控制可能会迫使您稍微调整/重新设计 API。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Permission",
      "Action": [
        "execute-api:Invoke"           
      ],
      "Resource": [
        "arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/resource-path"
      ]
    }
  ]
} 

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html

【讨论】:

    【解决方案2】:

    我也面临同样的问题。

    前端执行一个 API 网关端点。然后 API 端点触发一个 lambda 函数与数据库进行交互。所以实际上,如果我们想在 IAM 策略级别进行限制,我们应该在具有元素的函数执行角色的策略中进行限制。但问题是,我找不到任何方法来访问策略级别函数的传入参数以在条件下使用它们。

    看来最好的方法是在函数代码(业务逻辑级别)中放置一个条件。

    这些文档可能会对您有所帮助..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2019-05-16
      • 2021-08-27
      相关资源
      最近更新 更多