Как предоставить выборочный доступ для лямбда-выполнения федеративному пользователю в политике AWS IAM? - PullRequest
2 голосов
/ 01 июня 2019

Я пытаюсь предоставить доступ к лямбда-исполнению для выбора членов в группе. Пользователи проходят аутентификацию через PingFederate. У меня проблема с предоставлением этого избирательного доступа федеративному пользователю.

У меня есть пользовательская политика IAM (allow-lambda-invocation-селективная), присоединенная к этой роли. Несмотря на то, что политика проходит проверку и симуляция политики показывает, что доступ разрешен, при попытке выполнить лямбда-функцию я получаю сообщение

Calling the invoke API action failed with this message: User:arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234 is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:123456789012:function:my-lambda-function

Вот моя политика: allow-lambda-invocation-селективный

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync",
                "lambda:ListVersionsByFunction",
                "lambda:GetFunction",
                "lambda:ListAliases"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function",
            "Condition": {
                "StringEquals": {
                    "aws:userid": "arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:ListFunctions",
                "lambda:ListEventSourceMappings",
                "lambda:ListLayers",
                "lambda:ListLayerVersions"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:userid": "arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234"
                }
            }
        }
    ]
}

Я что-то упустил?

1 Ответ

0 голосов
/ 01 июня 2019

Я пытаюсь понять вашу проблему. Поправь меня, если я сделал неверное предположение.

  1. У каждой группы / пользователя уже есть своя роль.

Когда вы аутентифицируете своих пользователей, они играют свою роль. myuser1234, при аутентификации получит роль arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234, верно? Можно ли создать одну роль для каждой группы и удалить свойство conditions (см. Пункт 2, объясняющий почему)?

// role-for-grp-l2
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync",
                "lambda:ListVersionsByFunction",
                "lambda:GetFunction",
                "lambda:ListAliases"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:ListFunctions",
                "lambda:ListEventSourceMappings",
                "lambda:ListLayers",
                "lambda:ListLayerVersions"
            ],
            "Resource": "*"
        }
    ]
}
  1. Проблема с aws:userid

Читая документы о ключе aws:userid, мы можем обнаружить, что этот ключ имеет значение, заданное идентификатор роли: имя-роли-вызывающего абонента ,

где идентификатор роли - это уникальный идентификатор роли , а имя-роли-вызывающего абонента определяется параметром RoleSessionName , переданным в запрос AssumeRole.

Итак, aws:userid имеет значение, подобное AIDAJQABLZS4A3QDU576Q:SomeNameYouGive. По этой причине ваше условие никогда не будет соответствовать arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234, и пользователь не сможет выполнить эти действия.

  1. Использование условий другим способом

Предполагая, что RoleSessionName является именем пользователя, вы можете использовать условия следующим образом:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync",
                "lambda:ListVersionsByFunction",
                "lambda:GetFunction",
                "lambda:ListAliases"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function",
            "Condition": {
                "StringLike": {
                    "aws:userid": "*:myuser1234"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:ListFunctions",
                "lambda:ListEventSourceMappings",
                "lambda:ListLayers",
                "lambda:ListLayerVersions"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "aws:userid": "*:myuser1234"
                }
            }
        }
    ]
}

при желании вы можете удалить * подстановочный знак, получив role id, используя AWS CLI с помощью команды:

aws iam get-role --role-name ROLE_NAME

и изменение условия следующим образом:

"Condition": {
   "StringEquals": {
       "aws:userid": "ROLE_ID:myuser1234"
   }
}

...