【问题标题】:AWS IAM Roles and policies in simple English?简单英语的 AWS IAM 角色和策略?
【发布时间】:2018-04-07 12:59:00
【问题描述】:

我一直在使用 AWS PHP 开发工具包,似乎获得了除 IAM 角色和权限之外的所有内容。

谁能用最简单的术语向我解释 IAM 角色是如何工作的,并用简单的英语解释以下术语:StatementIdActionARN,最重要的是Principal

为了让您了解我困惑的根源,这是我最近遇到的一个问题。我正在尝试创建一个 API 网关,其中资源的方法触发 Lambda 函数。直到我复制粘贴了这一点,它才起作用:

$lambdaClient->addPermission([
                'FunctionName' => 'fn name',
                'StatementId' => 'ManagerInvokeAccess',
                'Action' => 'lambda:InvokeFunction',
                'Principal' => 'apigateway.amazonaws.com',
            ]);

但在其他一些线程中,有人建议使用以下内容:

const permissions = {
    FunctionName: target,
    StatementId: 'api-gateway-execute',
    Action: 'lambda:InvokeFunction',
    Principal: 'apigateway.amazonaws.com',
    SourceArn: 'arn:aws:execute-api:' + nconf.get('awsRegion') + ':' + nconf.get('awsAccountId') + ':' + nconf.get('apiGatewayId') + '/*'};

为什么第一个不包含任何帐户信息,而第二个却包含?还有另一个人粘贴了一些完全不同的东西来为him 工作。最后一个例子中有很多键(比如“Fn::Join”),我什至不知道从哪里开始以及它的作用。

如何确定在哪里可以找到这些政策?我们是否只是从某个地方复制粘贴它们是否有办法确定它们。如果是这样,必须始终指定哪些键。

任何帮助都将不胜感激,因为我现在完全糊涂了。

【问题讨论】:

    标签: amazon-web-services amazon-iam aws-php-sdk


    【解决方案1】:
    How does one figure out where to find these policies?
    

    您需要参考特定服务的 AWS 文档,以了解它们支持的原则、操作和语句。例如,如果您需要了解 DynamoDB 的策略,请查看DynamoDB API Permissions。一开始可能会让人感到困惑,因为 AWS 需要使用 IAM 来授权他们的所有服务,但随着时间的推移它变得直截了当。

    让我解释一下政策的各个部分

    • StatementId(Sid) - 它只是和可选的语句标识符(例如 1、2、abcd 等),对于某些服务(例如 SQS、SNS),它需要唯一性。

    • 操作 - 您的策略允许在 AWS 服务上执行的操作。例如,对于 DynamoDB,您可以允许创建表、放置新项目等。对于 EC2 实例,它可以允许启动和停止。

    • ARN(Amazon Resource Name) - 这是唯一标识 AWS 资源(如 EC2 服务器、S3 存储桶、DynamoDB 表甚至 IAM 策略、角色等)的唯一名称。

    • Principal - 委托人将限制允许使用此策略的人员。它可以是允许或拒绝访问资源的用户(IAM 用户、联合用户或假定角色用户)、AWS 账户、AWS 服务或其他委托人实体。

    此外,您还需要包含Resource 参数,您可以在其中使用通配符“*”或包含帐户ID 的ARN。

    【讨论】:

    • 谢谢,这确实澄清了一些事情。创建 lambda 函数时,我希望它能够完全访问 S3 存储桶(例如 bucket)。我如何为此创建策略(我的意思是我知道在哪里复制粘贴该策略,即如何在完全理解的情况下从头开始创建它)。谢谢!
    • 说到S3,你需要了解更多的概念。可以通过 IAM 策略、存储桶策略和访问控制列表授予对 S3 的访问权限。使用 Lambda 访问 S3 存储桶时,您需要有一个 IAM 策略,不仅可以授予对 S3 的访问权限,还需要允许 Lambda 承担具有该策略的 IAM 角色。为此,在角色中除了策略之外,还需要添加信任关系。如果您在创建角色时选择向导中的 Lambda,则会自动创建信任关系。
    【解决方案2】:

    首先,欢迎来到 AWS 的世界!!! :-D

    让我试着用一个类比来解释你对如何理解 IAM(一般)的疑问。

    认为有一个组织叫做 ORG1。

    Deparments of ORG1: HR-dept, Test-dept, DEV-dept

    Employees of ORG1: EMP1、EMP2、EMP3 ... EMP10

    Members of HR dept: HR1、HR2、HR3

    现在我想为 HR 部门创建一个角色,以授予他们雇用/暂停员工的权限。该政策如下所示:

    {
        "Version": "2012-10-17", // This is version of the template. Don't change this. This is NOT a date field for your use.
        "Statement": [
            {
                "Sid": "SOME-RANDOM-ID-WITH-NUMBER-1P1PP43EZUVRM", // This is used as ID in some cases to identify different statments
                "Principal": HR-dept, // the dept who is allowed to assume this role or the one who is allowed to invoke this role
                "Effect": "Allow", // has only 2 values: ALLOW/DENY. Either You want to provided the below privileges or you want to striped off these privileges.
                "Action": [
                    "hire",
                    "suspend",
                ],  // these are privileges which are granted
                "Resource": "EMP1", // the entity on whom do you want to apply those actions on. In this case employee EMP1.
                "Condition": {
                    "ArnLike": {
                        "AWS:SourceArn": "HR*" // You want anyone from HR-dept whose id starts with HR to be able to execute the action.ie HR1,HR2 or HR3 .
                    }
                }
            }
        ]
    }
    

    现在尝试从相同的角度理解下面的代码(这段代码在内部创建了一个类似于上面的模板):

    const permissions = {
            FunctionName: target,
            StatementId: 'api-gateway-execute', // This is just an ID. Dont sweat about it.
            Principal: 'apigateway.amazonaws.com', //which entity group the invoker belongs to
            Action: 'lambda:InvokeFunction', // The privilege you are giving to API gateway api's
            SourceArn: 'arn:aws:execute-api:.. blah blah blah' // ie. the exact  Id of api-gateway which all has rights to invoke lambda function
    }; 
    

    在 AWS 中,ARN 是资源的唯一 ID。有点像公司里的EmployeeId。这是全球独一无二的。

    相信我,起初您似乎很难理解您在 AWS 中尝试做的事情,但在某个时候,您会开始逐渐适应,因为您会越过所面临的每一个障碍。然后您会惊叹于 AWS 功能的可定制性。

    【讨论】:

    • 哇.. 这太棒了!感谢您用如此简单的术语解释它。现在更有意义了。我会经常回来做类比!好吧,再多做一两件事,这个“Fn::Join”业务是什么?当它说'Action' => 'sts:AssumeRole' 是什么意思。这有什么特殊含义吗?
    • Fn::Join 是一个concat 方法,它将您作为输入提供的字符串列表与您选择的分隔符连接起来。检查此[链接]。(docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…)例如:"Fn::Join" : [ "-", [ "us", "east", "1" ] ] 会给你"us-east-1"
    • 'Action' => 'sts:AssumeRole' 允许您的 lambda 函数访问使用 security Token Service(sts) 的 AssumeRole api,该 API 生成并返回临时凭证以访问策略中定义的资源.
    【解决方案3】:

    我认为大多数答案都是正确的,但这是来自马的嘴/伟大的 AWS 文档(完整的信用)

    Role:IAM 角色是一种 IAM 身份,您可以在您的账户中创建它并拥有特定权限。

    Policies:IAM 策略定义操作的权限,无论您使用何种方法执行操作

    通常你有一个角色,你为你的角色分配策略。

    回答您问题的最后一部分“如何确定在哪里可以找到这些政策”。这完全取决于您要执行的操作,但始终以最少的权限开始(与 linux 文件权限相同的概念不提供 777 )。您如何定义您的策略,您的 AWS 账户中已经定义了标准的策略,但您可以使用以下工具来自定义您的策略

    https://awspolicygen.s3.amazonaws.com/policygen.html

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 2018-11-02
      • 2018-09-29
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      相关资源
      最近更新 更多