Политика IAM применительно к роли не работает - PullRequest
0 голосов
/ 10 мая 2018

У меня есть приложение узла, которое вызывает acceptRoleWithWebIdentity следующим образом:

var params = {
   DurationSeconds: 3600,   
   RoleArn: "arn:aws:iam::role/my_test_role",
   RoleSessionName: "session_name",
   WebIdentityToken: req.body.id_token
};



sts.assumeRoleWithWebIdentity(params, function(err, data) {

    //create s3 client with data.Credentials.SecretAccessKey, AccessKeyId, sessionToken
    //call s3.listObjectsV2({Bucket: 'my-bucket'}).

});

Нет, у меня есть роль в вызове IAM my_test_role. К этой роли прикреплена политика my_test_policy, которая выглядит следующим образом:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::my_bucket",
      "Condition": {"StringLike": {"s3:prefix": [
        "",
        "home/",
        "home/BOB/*"
      ]}}
    },
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::my_bucket/home/BOB",
        "arn:aws:s3:::my_bucket/home/BOB/*"
      ]
    }
  ]
}

В s3 у меня есть корзина my_bucket, и в этой корзине находится папка home. В доме куча пользовательских папок:

my_bucket/home/ALICE
my_bucket/home/BOB
my_bucket/home/MARY

Когда мое приложение узла перечисляет объекты, оно перечисляет все объекты в доме. Цель моей политики - ограничить листинг для пользователя, который принял на себя роль. Так что, если BOB взял на себя роль, он должен видеть только my_bucket / home / BOB и ничего больше. В конечном итоге я заменим жестко закодированный 'BOB' в политике на $ {my_oidc_url: sub}. Но прежде чем перейти к этому шагу, я подумал, что просто наберу "BOB" жестко и посмотрим, сработает ли это. Это не. Предполагаемые роли видит все папки. Какие-либо предложения?

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Чтобы проверить эту ситуацию, я сделал следующее:

  • Создание корзины Amazon S3 и загруженных файлов.

Содержимое:

2018-05-11 08:57:55      10096 foo
2018-05-11 08:57:38      10096 home/alice/foo
2018-05-11 08:57:32      10096 home/bob/foo
2018-05-11 08:57:51      10096 home/foo
2018-05-11 08:57:45      10096 home/mary/foo
  • Создана роль IAM с именем bob .

Разрешения:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListObjects",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket",
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "home/bob/*"
                    ]
                }
            }
        },
        {
            "Sid": "AccessObjects",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket/home/bob/*"
        }
    ]
}

(ListObjects эквивалентно ListBucket)

  • Принято на роль Боб

С помощью команды CLI:

aws sts assume-role --role-arn arn:aws:iam::123456789012:role/bob --role-session-name bob
  • Сохраненные полученные учетные данные в профиль bob

Я мог бы тогда сделать что-нибудь в пути home/bob, но ничего в других путях:

$ aws --profile bob s3 ls s3://my-bucket/home/bob/
    2018-05-11 09:16:23      10096 foo

$ aws --profile bob s3 cp foo s3://my-bucket/home/bob/foo
    upload: ./foo to s3://my-bucket/home/bob/foo                 

$ aws --profile bob s3 cp s3://my-bucket/home/bob/foo .
    download: s3://my-bucket/home/bob/foo to ./foo                  

$ aws --profile bob s3 ls s3://my-bucket/home/

    An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

$ aws --profile bob s3 ls s3://my-bucket/

    An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

Переменные политики

Хотя пользователя IAM можно легко заменить на переменную политики , это не так просто с предполагаемой ролью. Это потому, что переменные будут установлены на:

  • aws:username будет неопределенным
  • aws:userid будет установлен на role id:caller-specified-role-name

Это не так просто, как просто сослаться на значение 'bob'. Вы фактически должны назвать путь S3 примерно следующим образом: AIDAJQABLZS4A3QDU576Q:bob

0 голосов
/ 14 мая 2018

Хорошо, это закончилось несколькими вещами.

  1. мое приложение node.js не использовало мои временные учетные данные, а вместо этого использовало статические. Это произошло из-за того, что мой клиент s3 был неправильно инициализирован после вступления в роль.
  2. Мое приложение node.js отправляло пустой префикс, а также неправильный префикс в экземпляре
  3. У меня сработала следующая политика

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToSeeBucketListInTheConsole",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowRootAndHomeListingOfCompanyBucket",
            "Action": "s3:ListBucket",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::my-bucket2"
        },
        {
            "Sid": "DenyAllListingExpectForHomeAndUserFolders",
            "Effect": "Deny",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::my-bucket2",
            "Condition": {
                "Null": {
                    "s3:prefix": "false"
                },
                "StringNotLike": {
                    "s3:prefix": [
                        "",
                        "home/",
                        "home/${MY_OIDC_URL:sub}/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my-bucket2/home/${MY_OIDC_URL:sub}/*"
        }
    ]
    }
    
0 голосов
/ 10 мая 2018

В вашей политике s3:ListBucket вы разрешили указывать папку home/, поэтому, конечно, там будет все.

Если бы у вас был только каталог home/BOB/*, то я думаю, вы бы получили желаемое поведение.

...