AWS Временные учетные данные STS S3 Доступ запрещен PutObject - PullRequest
0 голосов
/ 10 февраля 2020

Я следую Как использовать AWS IAM с STS для доступа к AWS ресурсам - 2-е наблюдение сообщение в блоге, и я понимаю, что Принцип политики S3 Bucket запрашивает временные учетные данные, один подход было бы жестко закодировать идентификатор этого пользователя, но пост пытается более элегантный подход к оценке делегированного пользователя STS (когда это работает).

arn: aws: iam :: 409812999999999999: policy / fts-accept-role

политика пользователя IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "*"
        }
    ]
}

arn: aws: s3: :: find-taylor-swift

политика сегмента s3

{
    "Version": "2012-10-17",
    "Id": "Policy1581282599999999999",
    "Statement": [
        {
            "Sid": "Stmt158128999999999999",
            "Effect": "Allow",
            "Principal": {
                "Service": "sts.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::finding-taylor-swift/*"
        }
    ]
}


conor@xyz:~$ aws configure --profile finding-taylor-swift
AWS Access Key ID [****************6QNY]: 
AWS Secret Access Key [****************+8kF]: 
Default region name [eu-west-2]: 
Default output format [text]: json
conor@xyz:~$ aws sts get-session-token --profile finding-taylor-swift
{
    "Credentials": {
        "SecretAccessKey": "<some text>", 
        "SessionToken": "<some text>", 
        "Expiration": "2020-02-11T03:31:50Z", 
        "AccessKeyId": "<some text>"
    }
}
conor@xyz:~$ export AWS_SECRET_ACCESS_KEY=<some text>
conor@xyz:~$ export AWS_SESSION_TOKEN=<some text>
conor@xyz:~$ export AWS_ACCESS_KEY_ID=<some text>
conor@xyz:~$ aws s3 cp dreamstime_xxl_concert_profile_w500_q8.jpg s3://finding-taylor-swift
upload failed: ./dreamstime_xxl_concert_profile_w500_q8.jpg to s3://finding-taylor-swift/dreamstime_xxl_concert_profile_w500_q8.jpg An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
conor@xyz:~$

AWS CLI был настроен, как описано в Использование временных учетных данных безопасности с AWS CLI

"Когда вы запускаете команды AWS CLI, AWS CLI ищет учетные данные в определенном порядке c - сначала в переменных среды, а затем в файле конфигурации. Поэтому после того, как вы поместите временные учетные данные в переменные среды, CLI AWS использует эти учетные данные по умолчанию. (Если в команде указан параметр профиля, CLI AWS пропускает переменные среды. Вместо этого CLI AWS просматривает файл конфигурации, который позволяет при необходимости переопределять учетные данные в переменных среды.)

В следующем примере показано, как можно установить переменные среды для временных учетных данных безопасности, а затем вызвать команда AWS CLI. Поскольку в команду CLI AWS не включен параметр профиля, CLI AWS сначала ищет учетные данные в переменных среды и поэтому использует временные учетные данные. "

1 Ответ

0 голосов
/ 11 февраля 2020

Нет необходимости использовать Bucket Policy для вашего сценария. Политика корзины применяется к корзине Amazon S3 и обычно используется для предоставления доступа, который указан c для корзины (например, publi c access).

Использование роли IAM

Если вы хотите sh предоставить групповой доступ для определенного c пользователя IAM, группы IAM или роли IAM, то разрешения должны быть присоединены к объекту IAM, а не к корзине.

(Для get-session-token см. Конец моего ответа.)

Настройка

Давайте начнем с создания роли IAM, аналогичной той, которая была у вас. Я выбираю Создать роль , затем для доверенного лица выбираю Другая AWS учетная запись (поскольку это будет пользователь IAM, а не служба).

I затем создайте встроенную политику для роли IAM, чтобы разрешить доступ к корзине:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket"
        }
    ]
}

(Обычно не рекомендуется назначать разрешения s3:*, поскольку это позволяет пользователю удалить содержимое и даже удалить корзину. Попробуйте ограничить его минимальными разрешениями, которые фактически требуются.)

Доверительные отношения в роли IAM определяют, кому разрешено предполагать роль. Это может быть один человек или кто-либо другой в учетной записи (если им было разрешено звонить AssumeRole). В моем случае я назначу его всей учетной записи:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::MY-ACCOUNT-ID:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Теперь есть несколько различных способов занять роль ...

Простой метод: IAM Роль в файле учетных данных

CLI AWS имеет возможность указать роль IAM в файле учетных данных и автоматически примет на себя роль.

См .: Использование роли IAM в AWS CLI

Чтобы использовать это, я добавляю раздел в свой файл .aws/config:

[profile foo]
role_arn = arn:aws:iam::MY-ACCOUNT-ID:role/MY-ROLE-NAME
source_profile = default

Я мог бы затем просто использовать это с помощью:

aws s3 ls s3://my-bucket --profile foo

Это успешно позволяет мне получить доступ к этому указанному c сегменту.

Сложный метод: Примите роль самостоятельно

Скорее чем позволить AWS CLI делать всю работу, я также могу взять на себя роль:

aws sts assume-role --role-arn arn:aws:iam::MY-ACCOUNT-ID:role/MY-ROLE-NAME --role-session-name foo

{
    "Credentials": {
        "AccessKeyId": "ASIA...",
        "SecretAccessKey": "...",
        "SessionToken": "...",
        "Expiration": "2020-02-11T00:43:30+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA...:foo",
        "Arn": "arn:aws:sts::MY-ACCOUNT-ID:assumed-role/MY-ROLE-NAME/foo"
    }
}

Затем я добавил эту информацию в файл .aws/credentials:

[foo2]
aws_access_key_id = ASIA...
aws_secret_access_key = ...
aws_security_token= ...

Да, вы можете добавить это в файл учетных данных, используя aws configure --foo2, но он не запрашивает токен безопасности. Поэтому вам необходимо отредактировать файл учетных данных, чтобы добавить эту информацию в любом случае.

Затем я использовал профиль:

aws s3 ls s3://my-bucket --profile foo2

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

Использование GetSessionToken

В приведенных выше примерах используется IAM Role . Это обычно используется для предоставления доступа к нескольким учетным записям или для временного принятия более мощных учетных данных (например, администратора, выполняющего важные операции).

Ваш вопрос содержит ссылки get-session-token. Это обеспечивает временных учетных данных на основе существующих учетных данных пользователя и разрешений . Таким образом, они не могут получить дополнительные разрешения в рамках этого вызова API.

Этот вызов обычно используется либо для предоставления токена MFA, либо для предоставления ограниченных по времени учетных данных для целей тестирования. Например, я мог бы предоставить вам учетные данные, которые позволят вам эффективно использовать моего пользователя IAM, но только в течение ограниченного времени.

...