【问题标题】:How can you dynamically grant permissions to an AWS Lambda function to access resources?如何动态授予 AWS Lambda 函数访问资源的权限?
【发布时间】:2023-04-03 15:19:01
【问题描述】:

我在 AWS 中创建了一个 lambda 函数,用于基于查找访问资源。

例如:我想通过 API Gateway 查询一个客户 FOO 的 dynamoDB 表 FOO_BAR。

请求进来,我确定了它的表 FOO 是必需的,并且我希望能够将策略应用于我当前的 lambda 函数/会话,该策略将授予对 FOO_BAR 表的访问权限。

我的问题是:为了让 lambda 函数能够查询表 FOO_BAR,创建 lambda 函数时配置的执行角色需要具有读取权限,我不想授予该角色任何通配符访问权限。

使用的 API 通过自定义授权方,在这里我应用了访问 API 的策略;我还希望我的 lambda 函数也能继承自定义 Authorizer 生成的策略。

您能否动态授予 lambda 函数访问资源的权限?

谢谢!

【问题讨论】:

    标签: amazon-web-services dynamic resources aws-lambda policy


    【解决方案1】:

    您的 Lambda 函数无法从您的自定义授权方继承权限。

    您可以在 Lambda 函数中授予权限或生成新的 IAM 凭证,并通过单独的客户端实例将这些凭证用于 DynamoDB 调用。

    我不确定您的方法是否比通配符提供任何安全优势。授予自身权限的函数具有完全相同的安全级别。

    【讨论】:

    • 谢谢kixorz,我也得出了同样的结论。就我而言,通过 api 访问资源在时间上过于昂贵,因此我实现了 STS 并允许根据生成的策略直接访问资源。这减少了 Lambda 函数中的 pullup/teardown 时间。这对于访问 SQS 之类的资源效果更好。用户 1 通过我们的 api 通过 sts 获得一个令牌,该令牌仅授予对其资源的访问权限。
    • 非常好的解决方案!
    【解决方案2】:

    您可以使用 AWS.STS 的假设角色功能

    /**
     * Assume Role for cross account operations
     */
    assumeRole() {
        let policy = {
            "Version": "2012-10-17",
            "Statement": {
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "arn:aws:iam::356035958081:role/xyzRole"
            }
        };
        let params = {
            RoleArn: 'arn:aws:iam::356035958081:role/xyzRole',
            RoleSessionName: 'awssdk',
            Policy: JSON.stringify(policy)
        };
        console.info("Assuming Role with params:", params);
        let sts = new AWS.STS();
        return new Promise((resolve, reject) => {
            sts.assumeRole(params, (error, data) => {
                if (error) {
                    console.log(`Could not assume role, error : ${JSON.stringify(error)}`);
                    reject({
                        statusCode: 400,
                        message: error["message"]
                    });
                } else {
                    console.log(`Successfully Assumed Role details data=${JSON.stringify(data)}`);
                    resolve({
                        statusCode: 200,
                        body: data
                    });
                }
            })
        });
    
    }
    

    这将返回凭据

            Credentials.AccessKeyId,
            Credentials.SecretAccessKey,
            Credentials.SessionToken
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-27
      • 2021-03-21
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多