Как написать AWS Bucket Policy с принципалом SES и принципалом роли IAM - PullRequest
0 голосов
/ 02 ноября 2018

Первоначально я настроил SES для получения электронных писем, и в ходе этого процесса я создал политику корзины, которая позволяла службе помещать электронные письма в S3. Теперь у меня есть лямбда-функция, которая должна быть в состоянии использовать STS, чтобы взять на себя роль и получить доступ к тому же сегменту. К сожалению, я не могу определить правильную политику, позволяющую как службе, так и роли IAM получить доступ к одному и тому же сегменту, сейчас я получаю «доступ запрещен». Я использовал симулятор политики, чтобы убедиться, что все остальное функционировало должным образом, например, я добавил общую политику с большим количеством действий для целевой роли, и если я скажу симулятору игнорировать политику сегмента, то он скажет, что МОЖЕТ получить доступ к файлам.

Я пытался создать два оператора, один с основным установленным значением 'services', а другой с целевыми ролями (добавили два только для того, чтобы посмотреть, сработает ли какой-либо из них)

{
"Version": "2012-10-17",
"Id": "Policy1478013193612",
"Statement": [
    {
        "Sid": "Stmt1478013187203",
        "Effect": "Allow",
        "Principal": {
            "Service": "ses.amazonaws.com"
        },
        "Action": [
            "s3:PutObject",
            "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::email-01-bucket/*"
    },
    {
        "Sid": "Stmt55",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:sts::[id-num-with-no-dashes]:assumed-role/[role-name]/[session-name]",
                "arn:aws:iam::[id-num-with-no-dashes]:role/[role-name]"
            ]
        },
        "Action": [
            "s3:PutObject",
            "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::email-01-bucket/*"
    }
]
}

Я также пытался поместить это в 1 утверждение:

{
"Version": "2012-10-17",
"Id": "Policy1478013193612",
"Statement": [
    {
        "Sid": "Stmt1478013187203",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:sts::[id-num-with-no-dashes]:assumed-role/[role-name]/[session-name]",
                "arn:aws:iam::[id-num-with-no-dashes]:role/[role-name]"
            ],
            "Service": "ses.amazonaws.com"
        },
        "Action": [
            "s3:PutObject",
            "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::email-01-bucket/*"
    }
]
}

Кстати, путь к файлу: ARN: AWS: s3 ::: электронная почта-01-ведро / электронная почта / [файл-идентификатор]

Я не могу поставить ListBucket, так как он выдаст ошибку.

Любая помощь приветствуется: D

Дайте мне знать, если я должен добавить что-нибудь еще

[Update]

Чтобы упростить поиск правильной политики, я опишу то, что у меня настроено в данный момент в симуляторе политики IAM. Я предполагаю, что если мы сможем заставить его работать здесь, то оно должно работать с лямбда-функцией.

Роль: serviceDev

К этой роли прикреплены две политики.

1) serviceFS:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:PutBucketLogging",
            "s3:ListBucket"
        ],
        "Resource": "arn:aws:s3:::email-01-bucket/*"
    }
]
}

2) AWSLambdaBasicExecutionRole

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": "*"
    }
]
}

В симуляторе политики:

Раскрывающийся список Select Service установлен на S3

Раскрывающийся список Select Action установлен на GetObject

Под Resource> Object Я ввожу путь к существующему файлу arn:aws:s3:::email-01-bucket/email/u245hnt85uivpfkrrlhgo0jt86gfjgnca2fgocg1 (после двойной проверки, что файл действительно существует)

Как только я это сделаю, слева появится раздел Resource Policies, в котором будет показана политика Bucket, прикрепленная к моему корзине, со следующей политикой:

{
"Version": "2012-10-17",
"Id": "Policy1478013193612",
"Statement": [
    {
        "Sid": "Stmt1478013187203",
        "Effect": "Allow",
        "Principal": {
            "Service": "ses.amazonaws.com"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::email-01-bucket/*"
    }
]
}

Теперь вот где я заблудился, возвращаясь к области Resource> Object, где я указываю путь к существующему файлу, есть флажок, помеченный Include Resource Policy, если я сниму флажок затем симулятор говорит, что разрешение было разрешено, НО если я проверю , то я получаю следующую ошибку: The simulation could not be performed! : Simulation failed!

1 Ответ

0 голосов
/ 05 ноября 2018

Насколько я понимаю ваши требования, вам нужна одна политика S3 (чтобы позволить SES помещать объекты в ваше S3), и вам нужна одна роль IAM, которую ваша функция Lambda будет использовать для вывода списка и для размещения / получения объекты в этом ведре. Роль IAM также нуждается в доверительных отношениях, позволяющих сервису AWS Lambda выполнять роль от вашего имени (чтобы вам не приходилось вручную принимать эту роль в своем коде).

В частности:

  • не добавлять лямбда-разрешения в политику S3 Bucket
  • не используйте STS в Lambda, чтобы взять на себя роль; просто настройте лямбду с этой ролью
  • как правило, вам не нужно явно кодировать что-либо в вашей функции Lambda, связанной с принятием ролей или получением разрешений (служба Lambda делает все за вас)

Политика S3 Bucket:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BUCKET-NAME/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "AWSACCOUNTID"
                }
            }
        }
    ]
}

Роль IAM:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "sidlist",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BUCKET-NAME"
        },
        {
            "Sid": "sidputget",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::BUCKET-NAME/*"
        }
    ]
}

Доверительные отношения на роль IAM:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Я не уверен, почему вы включили s3: PutBucketLogging в свой пример, но если он вам действительно нужен, добавьте его в роль IAM Lambda против ресурса arn: aws: s3 ::: BUCKET-NAME (не arn: ресурс aws: s3 ::: BUCKET-NAME / * - это действие с корзинами, а не с объектами)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...