Execute a função Lambda com as mesmas permissões do usuário que invoca o endpoint do API Gateway
Eu tenho a seguinte configuração:
REST API Gateway contendo um terminal com uma integração de proxy Lambda e protegida usando o AWS_IAMautorizador. Os usuários finais recuperam credenciais temporárias da AWS de um Cognito Identity Poolem troca de tokens recuperados de um Cognito User Poole, em seguida, chamam a API usando essas credenciais.
Quando os usuários chamam o API Gateway, quero que a função lambda invocada seja executada com as mesmas permissões do usuário invocador. Por exemplo, se o usuário só tiver permissão para ler itens do DynamoDB com um PK de CUSTOMER1234, quero que a função lambda também tenha apenas essa permissão. Diferentes usuários terão diferentes permissões, portanto, não posso "embutir" isso em minhas permissões Lambda.
Este parece ser um caso de uso bastante comum, mas não consegui encontrar nenhuma documentação sobre como fazer algo assim.
Uma possibilidade seria enviar as credenciais AWS (ou seja, chave de acesso e chave secreta) do usuário com cada solicitação e, em seguida, construir uma nova sessão usando essas credenciais no Lambda, mas esta provavelmente é uma ideia terrível (também aumenta o tempo de execução da função em 5x).
Respostas
Não parece uma boa ideia enviar credenciais da AWS pela rede, pois existe a chance de que elas possam ser interceptadas por um invasor e usadas para acessar seus recursos até que expirem.
Pode ser possível usar o JWT do seu pool de usuários do Cognito para obter as credenciais da AWS na função lambda, por exemplo, usando:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'IDENTITY_POOL_ID',
Logins: {
'cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>': 'ID_TOKEN'
}
});
Isso significaria que suas chamadas de API de lambda seriam executadas usando a função mapeada em seu pool de identidade, e você poderia usar a condição LeadingKeys para garantir que sua identidade da web pudesse acessar apenas seus próprios dados:
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": ["${cognito-identity.amazonaws.com:sub}"]
}
}
No entanto, isso aumentaria o tempo de processamento porque você está fazendo chamadas de API extras ( CognitoIdentityCredentials()faz 2 chamadas de API nos bastidores) em cada solicitação para obter as credenciais. Além disso, você não poderia usar a autorização AWS_IAM em seu método de gateway de API porque ainda não terá as credenciais. Então, você está falando sobre ter duas configurações de autorização. Um para permitir que sua identidade da web chame o método API Gateway e um segundo para que sua função Lambda seja executada como seu usuário.
Então, talvez suas escolhas sejam:
Faça suas chamadas de API diretamente de seu cliente
Em vez de usar o API Gateway, você pode fazer chamadas de API do DynamoDB diretamente do cliente. Isso funcionaria bem com a configuração do seu pool de identidade, já que você pode fazer a CognitoIdentityCredentials()chamada apenas uma vez quando o usuário fizer login para obter as credenciais da AWS. As chamadas subsequentes do DynamoDB seriam feitas com suas permissões de usuário e você poderia usar a condição LeadingKeys para garantir que seu usuário acessasse apenas seus próprios dados.
Aceite que sua função lambda sempre será executada com a mesma função de execução
Se você quiser usar o API Gateway apoiado pelo Lambda, poderá simplesmente aceitar que usará os Autorizadores Lambda ou Cognito para autorizar seus usuários a executar o método API e, em seguida, alguma autorização adicional no nível do aplicativo na função Lambda para garantir eles apenas chamam seu próprio espaço de partição. Na verdade, dessa forma você pode não precisar do pool de identidade, mas apenas usar a subdeclaração do token JWT do pool de usuários. Afinal, você terá validado o JWT que contém o subnão foi adulterado e que foi emitido pelo pool de usuários e cliente de aplicativo corretos, para que possa confiar em seu conteúdo.
Você pode integrar o API Gateway diretamente com o DynamoDB
Dependendo da lógica necessária, em vez de ter seu método de API apoiado por uma função lambda, você pode integrar seu método de gateway de API diretamente com o DynamoDB, conforme mostrado neste tutorial amazon . Novamente, você usaria o subdo JWT validado como a chave de partição para impor o acesso correto aos dados.