Когда / как использовать границу разрешений в бессерверной функции?

Ниже шаблона 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) и запретить доступ к другим ресурсам (в группе журналов).

1) Нужно ли мне использовать границу разрешений или политику для обеспечения соблюдения этих правил? для вышеуказанного шаблона SAM ...

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

2)

Какова процедура создания Граница разрешений? через шаблон SAM для функции Lambda .. потому что он запрашивает ARN


person overexchange    schedule 14.07.2019    source источник


Ответы (2)


В этом случае я бы не рекомендовал использовать границы разрешений. Вышеупомянутые разрешения создаются 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: '*'

Используйте атрибут Policies в FunctionInvokeRole, чтобы указать свои собственные политики.

person Matus Dubrava    schedule 14.07.2019
comment
1) Если я создам свою собственную роль, не будет ли автоматически создана роль по умолчанию (например, somestack-HelloWorldFunctionRole-AAAAAAAAA)? 2) В чем здесь проблема с подходом к разрешительной границе? логика оценки правил занимает больше времени ... с подходом границ разрешений? - person overexchange; 15.07.2019
comment
Это правильно. Если вы создадите свою собственную роль, роль по умолчанию не будет создана. Имя по-прежнему будет похожим, в приведенном выше случае это будет что-то вроде lambda-test-FunctionInvokeRole-RWD8ZEKI8U8T, но это то, которое вы явно определили в своем шаблоне с вашими собственными разрешениями, а не по умолчанию, с разрешениями по умолчанию. - person Matus Dubrava; 15.07.2019
comment
В чем проблема с подходом к разрешительной границе? Вас беспокоит, что логика оценки правил требует больше времени ... с подходом с границами разрешений? - person overexchange; 15.07.2019
comment
Нет, не совсем. Проблема в том, что здесь их нет необходимости. Это скорее расширенная функция, используемая, когда нам нужно ограничить доступ между учетными записями и для управления несколькими учетными записями. Все, что вам нужно в вашем случае с точки зрения разрешений, может быть достигнуто без установки границ, поэтому вы просто усложняете ситуацию, оставляя больше места для ошибок. - person Matus Dubrava; 15.07.2019
comment
да, вы правы ... stackoverflow.com / questions / 57031490 /. какая-нибудь подсказка по этому поводу? - person overexchange; 15.07.2019
comment
Какова цель AssumeRolePolicyDocument? со службой lambda.amazonaws.com и действием как sts:AssumeRole - person overexchange; 15.07.2019
comment
Получаю ошибку: The following resource(s) failed to create: [MyLambdaRole]. . Rollback requested by user. после развертывания - person overexchange; 15.07.2019
comment
AssumeRolePolicyDocument - это определение доверительных отношений между ролью и лямбда-функцией. - person Matus Dubrava; 15.07.2019
comment
В приведенном выше шаблоне нет MyLambdaRole. Вы уверены, что не меняли? Потому что я могу развернуть вышеуказанный шаблон без ошибок. - person Matus Dubrava; 15.07.2019
comment
Policyname может быть любым, кроме root? - person overexchange; 14.08.2019
comment
Да, но есть ограничения, такие как длина и использование специальных символов. - person Matus Dubrava; 14.08.2019
comment
когда мы говорим sts:assumeRole, какое название роли он принимает? - person overexchange; 14.08.2019
comment
Не совсем уверен, о чем вы спрашиваете. Предположим, что роль в приведенном выше шаблоне - это просто название действия, которое принадлежит политике доверия. Вы не звоните sts:AssumeRole напрямую в этом случае. - person Matus Dubrava; 14.08.2019
comment
какой пользователь создает FunctionInvokeRole в стеке Cloudformation? - person overexchange; 14.08.2019
comment
Опять же, я не уверен, какова ваша цель с этим вопросом, потому что очевидный ответ заключается в том, что роль создается не пользователем, а службой, которая называется, ну, CloudFormation, и эта служба создает роль, и каждый ресурс в этом шаблон от имени объекта IAM (пользователя или роли), который выполняет вызов API развертывания CF. - person Matus Dubrava; 15.08.2019

Я думаю, вам следует использовать политику.
Границы разрешений - это функция AWS IAM, которая в основном предназначена для «делегирования управления разрешениями доверенным сотрудникам» (т.е. вы хотите дать некоторым пользователям возможность создавать существующих пользователей AWS или управлять ими). [1]

В качестве администратора, который изначально настраивает систему, использование разрешений с инструкциями, содержащими действия Allow и Deny, должно быть достаточным для достижения желаемого.

Изменить:

Вы можете ограничить ресурс, которому предоставляется разрешение, например, с помощью следующей политики:

- 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/

person Martin Löper    schedule 14.07.2019
comment
Если я добавлю вышеупомянутые правила (упомянутые в yaml) в качестве политики, то эти правила станут подмножеством существующих правил (упомянутых в JSON). Не так ли? Если я добавлю приведенные выше правила (в yaml) как PermissionBoundary, тогда правила yaml пересекаются с правилами JSON = правила yaml .. Не так ли? - person overexchange; 14.07.2019
comment
Если все дело в ограничении ресурсов, то я бы посоветовал вам достичь пересечения с помощью действия Deny и атрибута NotResource (см. Редактирование). - person Martin Löper; 15.07.2019