Ограничьте доступ к S3 предварительно подписанными URL-адресами из определенного диапазона IP-адресов и лямбды. не может совмещать оба условия - S3 Policy - PullRequest
0 голосов
/ 11 октября 2019

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

В этом случае, мы добиваемся, чтобы получить доступНапример, мой локальный диапазон IP или VPC IP и функция Lambda.

Я создал следующую политику S3 Bucket:

{
    "Version": "2019-10-10",
    "Statement": [
        {
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::480311425080:role/<lambda role name>",
                    "arn:aws:sts::480311425080:assumed-role/<lambda role name>/<Lambda function name>"
                ],
                "Service": "lambda.amazonaws.com"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<bucket name>/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "<ip adress>/32",
                        "<ip adress>/32"
                    ]
                }
            }
        }
    ]
}

Итак, как вы видите, я использую NotPrincipalчтобы исключить мою соответствующую роль и Lambda от отказа, и я использую NotIpaddress для исключения моих действительных IP-адресов от отказа.

В этом случае я все еще могу подключиться к S3 из моей функции Lambda, но также и для подключенияк этому от "предположительно ни одного авторизованного IP-адреса". Таким образом, условие

            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "<ip adress>/32",
                        "<ip adress>/32"
                    ]
                }
            }

не работает должным образом.

Возможно, вы бы сказали использовать только роль ARN для NotPrincipal, но оно также не работает.

Помещение принципала только в качестве роли "без указания arn с лямбда-функцией"

            "NotPrincipal": {
                "AWS": "arn:aws:iam::880719415082:role/lambda_s3_access"
            },

применяет условие IP-фильтрации, но не позволяет Lambda подключиться.

Любая идея?

С уважением,

Ршад

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Я нашел решение проблемы с комментариями. Ниже я прокомментирую некоторые детали.

Имея VPC ...

1. Добавить Lambda для VPC `. Для этого выполните: [1]

2. Создайте конечные точки VPC для AWS S3 или любого другого компонента AWS,Функция Lambda получит доступ, так что Lambda сможет получить к ним доступ VPC.

3. Адаптировать способ создания клиента boto S3 так, чтобы он использовалpath вместо подключения по virtual host к S3 «по умолчанию». Это делается:

s3 = boto3.client('s3', 'us-west-2', config=Config(s3={'addressing_style': 'path'}))

Для получения подробной информации, проверьте: [2]

РЕДАКТИРОВАТЬ 15/10/2019

Мы только что проверили это, и, создав VPC endpoint для S3, Lambda может подключаться к S3 без изменения способа создания клиента с boto3. Мы продолжаем использовать старую форму:

s3 = boto3.resource('s3')

и затем отбрасываем:

s3 = s3 = boto3.client('s3', 'us-west-2', config=Config(s3={'addressing_style': 'path'}))

END EDIT 15/10/2019

4. Создайте новую политику для роли IAM, которая используется в Lambda и для которой создается presigned-urls. так что мы ограничиваем доступ к нашим диапазонам IP-адресов и к нашему VPC «для обеспечения доступа к лямбда»

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "******/32",
                        "******/32"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpc": "vpc-******"
                }
            }
        }
    ]
}

ССЫЛКИ :

[1] https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html

[2] https://boto3.amazonaws.com/v1/documentation/api/1.9.42/guide/s3.html#changing-the-addressing-style

0 голосов
/ 12 октября 2019

По умолчанию корзины Amazon S3 являются закрытыми. Следовательно, не должно быть необходимости использовать оператор Deny , если вы не хотите переопределять разрешения, предоставленные в другой политике. (Например, администраторы могут получить доступ ко всем корзинам, но эта корзина является исключением.)

Чтобы предоставить лямбда-функции доступ к корзине Amazon S3:

  • Создание роли IAM с разрешением доступа к корзине
  • Назначение роли IAM функции Lambda

Если вы хотите, чтобы экземпляр Amazon EC2 также имел доступведро, назначьте аналогичную роль для экземпляра. В общем случае не должно быть необходимости назначать доступ к сегменту "для VPC". Вместо этого предоставьте разрешение ресурсам, которые хотят получить доступ к корзине.

Чтобы предоставить доступ к корзине с вашего собственного (личного) IP-адреса , создайте политику корзины для желаемой корзины S3. :

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::examplebucket/*",
      "Condition": {
         "IpAddress": {"aws:SourceIp": "54.240.143.55/32"}
      } 
    } 
  ]
}
...