【问题标题】:When/How to use permission boundary in serverless function?何时/如何在无服务器功能中使用权限边界?
【发布时间】:2019-11-23 14:57:29
【问题描述】:

SAM 模板下方:

  HelloWorldFunction:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: hello-world/
      Handler: app.LambdaHandler
      Runtime: nodejs8.10
      Events:
       MySQSEvent:
        Type: SQS
        Properties:
          Queue: !GetAtt somequeue.Arn
          BatchSize: 10


  somequeue:
    Type: AWS::SQS::Queue

使用以下策略自动创建默认角色(JSON):

{
    "roleName": "somestack-HelloWorldFunctionRole-AAAAAAAAA",
    "policies": [
    {
    "document": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "sqs:ReceiveMessage",
            "sqs:DeleteMessage",
            "sqs:GetQueueAttributes",
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "*"
        }
      ]
    },
    "name": "AWSLambdaSQSQueueExecutionRole",
    "id": "ANPAJFWJZI6JNND4TSELK",
    "type": "managed",
    "arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole"
  },
  {
    "document": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource": "*"
        }
      ]
    },
    "name": "AWSLambdaBasicExecutionRole",
    "id": "ANPAJNCQGXC42545SKXIK",
    "type": "managed",
    "arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
  }
],
"trustedEntities": [
  "lambda.amazonaws.com"
]
}

我们需要对特定资源的特定操作强制执行访问规则(如下 yaml 所示)并拒绝访问其他资源(在 log-group 中)。

1) 我是否需要使用权限边界或策略来执行以下这些规则?对于上述 SAM 模板...

- Effect: Allow
Action:
  - "logs:CreateLogGroup"
Resource:
  - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:*"

2)

创建Permission boundary的过程是什么?通过 Lambda 函数的 SAM 模板.. 因为它要求 ARN

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-iam aws-serverless aws-sam


    【解决方案1】:

    我不建议在这种情况下使用权限边界。上述权限由 SAM 默认创建。如果您需要更多限制性权限,那么您可以创建自己的角色并使用该角色,而不是由 SAM 自动创建的角色。

    如果您使用自己的角色,SAM 不会为其添加额外权限,因此您可以根据需要对其进行定制。

    这是一个示例,说明如何做到这一点。

    Transform: 'AWS::Serverless-2016-10-31'
    Resources:
        ThumbnailFunction:
            Type: 'AWS::Serverless::Function'
            Properties:
                Runtime: nodejs8.10
                Handler: index.handler
                CodeUri: ./src
                Role: !GetAtt FunctionInvokeRole.Arn
                Events:
                    MySQSEvent:
                        Type: SQS
                        Properties:
                            Queue: !GetAtt somequeue.Arn
                            BatchSize: 10
    
        somequeue:
            Type: AWS::SQS::Queue
    
        FunctionInvokeRole:
            Type: AWS::IAM::Role
            Properties:
                AssumeRolePolicyDocument:
                    Version: '2012-10-17'
                    Statement:
                        - Effect: 'Allow'
                          Principal:
                              Service:
                                  - 'lambda.amazonaws.com'
                          Action:
                              - 'sts:AssumeRole'
                Policies:
                    - PolicyName: 'root'
                      PolicyDocument:
                          Version: '2012-10-17'
                          Statement:
                              - Effect: 'Allow'
                                Action: '*'
                                Resource: '*'
    

    使用FunctionInvokeRole 中的Policies 属性来指定您自己的策略。

    【讨论】:

    • 1) 如果我创建自己的角色,那么默认角色(如somestack-HelloWorldFunctionRole-AAAAAAAAA)不会自动创建吗? 2) 这里的权限边界方法有什么问题?规则评估逻辑需要更多时间......使用权限边界方法?
    • 没错。如果您创建自己的角色,则不会创建默认角色。名称仍然相似,在上述情况下,它类似于lambda-test-FunctionInvokeRole-RWD8ZEKI8U8T,但它是您在模板中明确定义的具有您自己的权限的名称,而不是具有默认权限的默认名称。
    • 这里的权限边界方法有什么问题?您是否担心规则评估逻辑需要更多时间......使用权限边界方法?
    • 不,不是。问题是这里没有必要使用它们。当我们需要限制跨账户访问和多账户管理时,它们更像是一种高级功能。您在权限方面所需的一切都可以在不设置边界的情况下实现,因此您只会使事情复杂化,为错误留出更多空间。
    • 是的,你是对的...stackoverflow.com/questions/57031490/…。这有什么线索吗?
    【解决方案2】:

    我认为您应该使用策略。
    权限边界是 AWS IAM 的一项功能,主要旨在“将权限管理委托给受信任的员工”(即您希望让某些用户能够创建或管理现有 AWS 用户)。 [1]

    作为最初配置系统的管理员,使用包含 AllowDeny 操作的语句的权限应该足以实现您想要的。

    编辑:

    您可以通过以下策略限制授予权限的资源,例如:

    - Effect: Deny
    Action:
      - "logs:CreateLogGroup"
    NotResource:
      - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:*"
    

    参考文献

    [1]https://aws.amazon.com/de/blogs/security/delegate-permission-management-to-developers-using-iam-permissions-boundaries/

    【讨论】:

    • 如果我将上述规则(在 yaml 中提到)添加为策略,那么这些规则将成为现有规则的子集(在 JSON 中提到)。不是吗?如果我将上述规则(在 yaml 中)添加为 PermissionBoundary 那么,yaml 规则交集 JSON 规则 = yaml 规则.. 不是吗?
    • 如果只是为了限制资源,那么我建议您通过使用 Deny 操作和 NotResource 属性来实现交集(请参阅编辑)。
    猜你喜欢
    • 2017-07-07
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2018-07-07
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多