2016-07-07 12 views
0

Ich habe mehrere Benutzergruppen (die in Cognito über einen eigenen Identitätspool verfügen), die auf Endpunkten in API Gateway unterschiedliche Rechte haben. Ich verwalte die Zugriffsrechte mit den IAM-Rollen. Zum Beispiel habe ich diese Richtlinie für einen Identitätspool:Feinkörniges Zugriffsmanagement mit AWS Cognito und API Gateway

{ 
    "Sid": "Stmt1467885818000", 
    "Effect": "Allow", 
    "Action": [ 
     "apigateway:Invoke" 
    ], 
    "Resource": [ 
     "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/usergroup/*" 
    ] 
} 

Jetzt möchte ich Zugriffsregeln haben, basierend auf einer einzelnen Identitäten. Der Grund ist, dass ich Ressourcen habe, die nur von dem Benutzer geändert werden können, der die Ressourcen "onwetzt" (oder aufgelistet ist, wie man auf die Ressource zugreifen darf).

Kann ich irgendwie IAM dafür benutzen? Meine Idee ist so etwas wie dieses:

"Resource": [ 
     "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/<my-user-name>/*" 
    ] 

Also diese Weise kann jeder Benutzer nur die Endpunkte mit seinen Benutzernamen (und diesen Benutzernamen als Lambda weitergeleitet werden können, die sicher sein können, dass der angegebene Benutzer das Recht hat, führe die Aktion durch).

Ist das möglich? Wenn nicht, wie würde ich feinkörnigen Zugriff konfigurieren?

+0

Welche Integration verwenden Sie mit API Gateway? HTTP-Proxy, Lambda-Funktionen oder AWS Service Proxy? –

+0

Verschiedene. Aber meistens Lambda. – Nathan

Antwort

0

Sie könnten IAM conditions verwenden, um die Benutzeridentität zu überprüfen. Werfen Sie einen Blick auf eine this blog post, um weitere Beispiele zu sehen. Es sollte so aussehen:

{ 
    "Effect": "Allow", 
    "Action": [ 
     "apigateway:Invoke" 
    ], 
    "Resource": [ 
     "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/<my-user-name>/*" 
    ], 
    "Condition": { 
     "StringEquals": { 
      "cognito-identity.amazonaws.com:aud": "us-east-1:<identity-pool-id>", 
      "cognito-identity.amazonaws.com:sub": "us-east-1:<identity-id>" 
     } 
    } 
} 

Aber ich würde Ihnen empfehlen, anders zu verfahren.

In der API-Gateway-Integrationskonfiguration können Sie pass the Cognito pool and identity to the lambda. Dann kennen Sie im Lambda die Identität des Anrufers (und Sie können Cognito API anrufen, wenn Sie weitere Informationen über die Benutzeridentität benötigen).

Sie können Endpunkte erstellen, die wie GET /user/me/my-resource aussehen können und Aktionen durchführen, abhängig von der Cognito-Identität des API-Gateway-Aufrufers. Sie müssen x Endpunkte und Richtlinien für jede Identität in Ihrem Cognito-Identitäts-Pool nicht erstellen.