Какие учетные данные использовать в Lambda API Gateway для доступа к другим сервисам AWS - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть пул пользователей Cognito и шлюз API, использующий авторизатор Cognito User Pool.Каждый пользователь в пуле назначается группе с ролью IAM.С этой настройкой клиент аутентифицируется с помощью Cognito, а затем отправляет идентификатор токена на шлюз API, который авторизует запрос и передает его в функцию Lambda.Затем лямбда выполняет другие службы (DynamoDB и S3).У меня вопрос, какие учетные данные мне нужно использовать в лямбде?

Одним из вариантов является использование идентификатора токена, переданного в лямбду из шлюза API, для получения временных учетных данных из STS.Это в основном позволяет мне использовать групповую роль IAM пользователя для доступа к другим ресурсам AWS и выглядит следующим образом:

var credentials = new CognitoAWSCredentials(
    "us-east-1:...", // Identity pool ID
    RegionEndpoint.USEast1 // Region
);

credentials.AddLogin(
    "cognito-idp.us-east-1.amazonaws.com/us-east-...", // User pool ID
    "eyJraWQiOiJi..." // ID token
);

// use credentials to access AWS services

Другой вариант заключается в использовании роли выполнения, назначенной функции Lambda, но это выглядит таклучше подходит для других сценариев ... может быть, те, где лямбда выполняется как часть события?Я также, кажется, не понимаю, как получить эти учетные данные в самой лямбде.

Есть ли что-то еще, что я пропускаю?Какой подход лучше использовать здесь?

Обновление

То, что у меня было выше, было почти правильным, но не совсем.Прежде всего, выясните, нужен ли вашим пользователям несанкционированный доступ.Если это так, перейдите в свой пул удостоверений и включите несанкционированный доступ.

Чтобы получить доступ / секретные ключи для неавторизованных пользователей, вы должны сделать что-то вроде этого (используя C # SDK, но следующие принципы применимы к другим языкам):

var client = new AmazonCognitoIdentityClient(
    new AnonymousAWSCredentials(), // We're making public API calls
    RegionEndpoint.USEast1); // Your Region

var identityId = await client.GetIdAsync(new GetIdRequest
{
    AccountId = "****", // AWS account ID
    IdentityPoolId = "us-east-1:****" // Identity Pool ID
});

var credentials = await client.GetCredentialsForIdentityAsync(new GetCredentialsForIdentityRequest()
{
    IdentityId = identityId.IdentityId
});

// Use credentials.Credentials when calling AWS services

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

Чтобы получить учетные данные для аутентифицированных пользователей, вы сделаете следующее:

var client = new AmazonCognitoIdentityClient(
    new AnonymousAWSCredentials(), // We're making public API calls
    RegionEndpoint.USEast1); // Your region

var getIdentityIdRequest = new GetIdRequest
{
    AccountId = "****", // AWS Account ID
    IdentityPoolId = "us-east-1:****" // Identity Pool ID
};

getIdentityIdRequest.Logins.Add(
    "cognito-idp.us-east-1.amazonaws.com/us-east-1****", // User Pool ID
    idToken); // ID Token

var identityId = await client.GetIdAsync(getIdentityIdRequest);

var getCredentialsRequest = new GetCredentialsForIdentityRequest()
{
    IdentityId = identityId.IdentityId
};

getCredentialsRequest.Logins.Add(
    "cognito-idp.us-east-1.amazonaws.com/us-east-1****",
    idToken);

var credentials = await client.GetCredentialsForIdentityAsync(getCredentialsRequest);

// Use credentials.Credentials when calling AWS services

You 'Для этого понадобится идентификационный токен, поэтому сначала выполните аутентификацию и извлеките идентификационный токен из ответа.Если пользователь, имеющий маркер идентификатора, принадлежит к группе в Cognito с назначенной ролью IAM, учетные данные, возвращенные из приведенного выше кода, будут для этой роли.Если пользователь не назначен в группу или группа не имеет роли, вы получите учетные данные для роли IAM аутентифицированного пользователя , назначенной для пула идентификаторов.

Также, как было предложено@thomasmichaelwallace, вышеупомянутое может быть сделано или из Lambda или из внешнего интерфейса API Gateway / Lambda, но только если вы используете AWS_IAM Authorizer, потому что это единственный, который принимает секретные ключи и ключи доступа для авторизации.Если вы просто используете Cognito Authorizer, как и я, вам нужно будет передать идентификационный токен в вашу лямбду и получить, чтобы ваша лямбда получила учетные данные.

1 Ответ

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

Исходя из вашего примера, вы эффективно используете для этого встроенный метод ( Cognito Federated Identities ). Возможно, вы могли бы пойти еще дальше и получить доступ к своим ресурсам непосредственно из приложения, используя эти учетные данные (вместо того, чтобы мешать использовать API-Gateway + Lambda).

Роль выполнения в Lambda - это роль (учетные данные), с которой вызывается лямбда (их не нужно устанавливать, и вы не должны вызывать new CognitoAWSCredentials). Как вы и предполагали, это ограничивает возможности лямбды (для каждой лямбды, а не для инициатора).

Если Cognito Federated Identities работают на вас, то имеет смысл использовать их, поскольку они предоставляют способ использования IAM для обеспечения уровня авторизации вашего приложения; и, возможно, означает, что вы несете ответственность за строительство меньше. Не все приложения вписываются в этот шаблон, поэтому AWS предоставляет вам варианты.

...