Ограничить лямбда-разрешения для доступа к VPC

При развертывании лямбда-функции в VPC вам необходимо предоставить набор разрешений, связанных с сетевым интерфейсом, для роли выполнения лямбда-выражения. Руководства по AWS совет использовать для этого управляемую политику AWSLambdaVPCAccessExecutionRole, которая выглядит так:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface",
                "ec2:AssignPrivateIpAddresses",
                "ec2:UnassignPrivateIpAddresses"
            ],
            "Resource": "*"
        }
    ]
}

Как видите, эта политика не ограничивает сетевые интерфейсы, которые может изменять лямбда, что потенциально позволяет ему вмешиваться в работу сети за пределами собственного VPC. Я хотел бы ограничить действия, которые лямбда может выполнять, для VPC или подсетей, в которых она фактически развернута. Однако до сих пор мне не удалось разработать рабочую политику для этого.

Пробовал проверить VPC в политике так:

"Condition": {"StringEquals": {"ec2:Vpc": "${my_vpc_arn}" }}

но все равно получил отказ в разрешении.

Событие CloudTrail содержит следующее сообщение авторизации), расшифрованное с помощью aws sts decode-authorization-message): https://pastebin.com/P9t3QWEY, где я не вижу полезных ключей для проверки.

Итак, можно ли ограничить лямбду, развернутую в VPC, только изменением определенных сетевых интерфейсов?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
1 453
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Служба Lambda должна иметь возможность создавать и удалять сетевые интерфейсы в вашем VPC. Это связано с тем, что общий ENI будет развернут в VPC. Как только все контексты выполнения будут завершены, этот общий ENI будет снова удален. Это также объясняет, почему необходимы разрешения на описание, поскольку службе, вероятно, необходимо выяснить, развернут ли уже общий ENI для конкретной лямбда-функции.

К сожалению, это означает, что вы не можете ограничить операции удаления/изменения какими-либо конкретными ENI, поскольку они создаются и удаляются динамически.

В соответствии с документацией конкретные разрешения, необходимые для роли:

  • ec2: Создать сетевой интерфейс
  • ec2: Описать сетевые интерфейсы
  • ec2:удалитьсетевойинтерфейс

Я проверил документацию, и действия «Создать + Удалить» позволяют (среди прочего) выполнять следующие условия:

  • ec2:Подсеть
  • ec2:Vpc

Это означает, что это должно быть возможно. Возможно, вам поможет разделение разрешений ec2:* на отдельное выражение с вышеупомянутыми условиями.

Спасибо за ваш ответ, но, как я уже сказал, я попытался проверить точные предложенные вами условия (ec2:Vpc и ec2:Subnet) с помощью «Condition»: {«StringEquals»: {«ec2:Vpc»: «${my_vpc_arn }" }}, но это вызвало ошибку PermissionDenied. Похоже, что эти ключи по какой-то причине не устанавливаются в запросах.

demosito 24.12.2020 12:49
Ответ принят как подходящий

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AccessToSpecificVPC",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:UnassignPrivateIpAddresses",
                "ec2:AssignPrivateIpAddresses",
                "ec2:DescribeNetworkInterfaces"
            ],
            "Resource": "*",
            "Condition": {
                "ArnLikeIfExists": {
                    "ec2:Vpc": "arn:aws:ec2:<your-region>:<your-account-id>:vpc/<vpc-id>"
                }
            }
        },
        {
            "Sid": "CWLogsPermissions",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",

                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

С частью «IfExists» это действительно работает, спасибо! Однако мне интересно, действительно ли это означает, что изменение интерфейса при создании лямбды отличается от его обновления в качестве обычного пользователя/роли IAM. т.е. когда я выдаю ec2: CreateNetworkInterface, в запросе будет ключ ec2: Vpc, а во время развертывания лямбда - нет. Если это так, то это решение правильное.

demosito 24.12.2020 13:27

@demosito Вы можете получить больше информации о ifExistsздесь. Как там объясняется, иногда для выполнения некоторых действий требуется доступ к различным ресурсам. Без IfExist условие будет применяться для каждого такого ресурса, даже если он может не поддерживать такое условие, что приведет к отказу. Ifexists применяет условия к ресурсам и действиям, которые предоставляют такой ключ условия.

Marcin 24.12.2020 13:33

Я понимаю это, однако условие без IfExists не работает, даже если «Действие» содержит одну запись (я тестировал с ec2:CreateNetworkInterface). Это означает, что ключ ec2:Vpc действительно отсутствует в этом запросе, хотя согласно документации должен. Что приводит меня к выводу, что при развертывании лямбда-функции эти действия выполняются как-то иначе.

demosito 24.12.2020 15:53

Другие вопросы по теме