当前位置: 首页 > 知识库问答 >
问题:

AWS CDK-无法在Lambda中担任细粒度授权的角色

顾俊誉
2023-03-14

我对AWS的细节相当陌生,所以原谅我一个愚蠢的问题。我在寻找答案,但我没有找到任何问题来回答我的问题。

我正在构建一个项目,我试图使用这个AWS教程正确地完成权限:https://aws.amazon.com/blogs/apn/partitioning-pooled-multi-tenant-saas-data-with-amazon-dynamodb/

我创建了角色和策略:

const tenantUserRole = new Role(this, "TenantUserRole", {
      assumedBy: new ServicePrincipal("lambda.amazonaws.com"),
    });
table.grantReadWriteData(tenantUserRole);

然后,在我的Lambda中,我试图:

const role = await stsClient.send(
    new AssumeRoleCommand({
      Policy: getPolicy("tenant"),
      RoleArn: process.env.TENANT_ROLE_ARN,
      RoleSessionName: "foo",
    })
  );

这不工作,因为我在Lambda得到一个错误:

{“errorType”:“AccessDenied”,“errorMessage”:“User:arn:aws:sts::xxx:假定角色/ProjectStack-createUserServiceRoleB9D8AADE-GRDI6MWXA5MY/ProjectStack-createUserC6ED88E6-K0S95UXTN9MH无权在资源上执行:sts:AssumeRole:arn:aws:iam::xxx:角色/ProjectStack-TenantuseroB8D3A-11N644X7UF0SR”,“跟踪”:[“拒绝访问:用户:arn:aws:sts::xxx:假定角色/ProjectStack-createUserServiceRoleB9D8AADE-GRDI6MWXA5MY/ProjectStack-createUserC6ED88E6-K0S95UXTN9MH无权在资源上执行:sts:AssumeRole:arn:aws:iam::xxx:角色/ProjectStack-TenantusErrorLeb79B8D3A-11N644X7UF0SR”,

目标是始终基于用户上下文解析权限,因此我应该在CDK堆栈中执行哪些操作,以使所有lambda都能够执行必须执行的操作?

共有2个答案

范麒
2023-03-14

关于谁是校长,似乎存在误解。

当您在Lambda函数中试图调用其他AWS API操作时,实际上不是服务Lambda。亚马逊。com进行调用,但Lambda函数所承担的角色。

这意味着不允许服务lambda。亚马逊。com若要假定您的租户错误,您需要允许函数使用的角色假定该角色。

您需要配置假设角色策略以及lambda函数角色的权限,以便允许它调用sts: AssumeRole。

顾昌翰
2023-03-14

正如@Maurice所描述的,应该信任角色而不是服务主体(llambda.amazonaws.com)。下面是CDK代码。

TenantUserRoleapiRole信任,该角色正被aws lambda

import * as cdk from '@aws-cdk/core';
import * as iam from '@aws-cdk/aws-iam';

export class CdkWorkshopStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // aws lambda role
    const lambdaRole = new iam.Role(this, 'apiRole', {
      roleName: 'apiRole',
      assumedBy:  new iam.ServicePrincipal('lambda.amazonaws.com'),
    });
    // trusted by TenantUserRole for access
    const tenantUserRole = new iam.Role(this, 'TenantUserRole', {
      roleName: 'TenantUserRole',
      assumedBy: new iam.ArnPrincipal(lambdaRole.roleArn),
    });

    // policy to allow assume role TenantUserRole
    lambdaRole.addToPolicy(
      new iam.PolicyStatement({
        resources: [tenantUserRole.roleArn],
        actions: ['sts:AssumeRole'],
      })
    );
  }
}

这里看起来像是角色的信任策略。

❯❯ aws  iam get-role --role-name TenantUserRole
{
    "Role": {
        "Path": "/",
        "RoleName": "TenantUserRole",
        "RoleId": "AROA2WXKNDTKKGFADASD",
        "Arn": "arn:aws:iam::1234567890:role/TenantUserRole",
        "CreateDate": "2021-03-03T23:34:13+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "arn:aws:iam::1234567890:role/apiRole"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "Description": "",
        "MaxSessionDuration": 3600,
        "RoleLastUsed": {}
    }
}

策略允许aws lambda角色承担TenantUserRole

❯❯ aws iam get-role-policy  --role-name apiRole  --policy-name apiRoleDefaultPolicy771DC0DD
{
    "RoleName": "apiRole",
    "PolicyName": "apiRoleDefaultPolicy771DC0DD",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Resource": "arn:aws:iam::1234567890:role/TenantUserRole",
                "Effect": "Allow"
            }
        ]
    }
}

如何对IAM角色使用信任策略

在lambda中,你需要在假设TenantUserRole之后,你需要使用这些凭据并创建Dynamodb客户端,然后使用该客户端进行api调用putItem

import boto3

def lambda_handler(event, context):
    sts = boto3.client('sts')
    // assume TenantUserRole
    creds = sts.assume_role(
        RoleArn='arn:aws:iam::1234567890:role/TenantUserRole',
        RoleSessionName="tempsession"
        )
    // Use Credentials from the assume call to make dynamodb client
    tenant_user_dyanmodb_client = boto3.client(
    'dynamodb',
    aws_access_key_id=creds.get('Credentials').get('AccessKeyId'),
    aws_secret_access_key=creds.get('Credentials').get('SecretAccessKey'),
    aws_session_token=creds.get('Credentials').get('SessionToken')
    )

   // call put item
    tenant_user_dyanmodb_client.put_item(TableName='fruitSalad', Item={'fruitName':{'S':'Banana'},'key2':{'N':'value2'}})

 类似资料:
  • 问题内容: 我正在尝试使用Restlet实现RESTful API,除了基本的角色和方法授权者之外,我发现的东西很少。我已经在数据库中存储了用户可以访问的路由和这些路由的方法。我现在遇到的问题是如何在Authorizer中获取路径。这是我需要收集的资源吗?我应该如何精确路由到授权者?我已经发布了到目前为止我正在查看的内容,如何在授权器中获取路径或资源。感谢您提供任何信息,尽管我浏览了书籍和许多通用

  • 本文向大家介绍Spring Security 中细化权限粒度的方法,包括了Spring Security 中细化权限粒度的方法的使用技巧和注意事项,需要的朋友参考一下 有小伙伴表示微人事(https://github.com/lenve/vhr)的权限粒度不够细。不过松哥想说的是,技术都是相通的,明白了 vhr 中权限管理的原理,在此基础上就可以去细化权限管理粒度,细化过程和还是用的 vhr 中用

  • 我正在编写一个从诊断包中收集信息的工具。此工具的结果将写入Firestore进行分析。该工具是用Python编写的,并作为一个包分发,包括。服务帐户的json。该服务帐户用于验证数据库中的读写操作。下面是每个包中使用的数据库组件的一个片段: 我正在寻找缩小FiRecovery的权限,因为目前,所有拥有这些凭据的用户都可以完全访问FiRecovery。查看文档,这似乎是不可能的: 使用带有服务号的F

  • Delegation roles Delegation roles allows assigning signing privileges to other repository collaborators. This is particularly interesting in organizations that have multiple people working on the same

  • Using a delegation key The collaborator can now push to the repository using Docker Content Trust. Docker will automatically choose and pick the right key for the targets/release role. Edit the file o