2017-01-25 6 views
2

Ich habe eine API-Gateway, die von einem Front-End-Javascript-Anwendung zugegriffen wird. In diesem Sinne können wir den Zugriff auf einen API-Schlüssel nicht einschränken (ich glaube nicht?), Also würde ich ihn gerne auf die IP-Adresse beschränken ... aber ich kann keinen Weg finden, dies zu tun . Ist das überhaupt möglich, da es nicht von einem Server kommt?Begrenzen der öffentlichen API Gateway zu bestimmten IP

So ist die Website auf S3 mit Cloudfront in Front gehostet. Das API-Gateway akzeptiert einige Schlüssel und das trifft ein Lambda-Skript und wird in dynamodb gespeichert. Wenn jemand wollte, könnten sie einfach mit Werten aufspotten. Ich möchte nur, dass die Web-App in der Lage ist, mit ihr zu sprechen. Ich lerne immer noch viel AWS! Ich hoffte, ich könnte Shield oder WAF benutzen, aber es scheint ein Nein zu sein. Irgendwelche Vorschläge?

Antwort

3

Natürlich ist es keine gute Idee, einen Berechtigungsnachweis oder einen API-Schlüssel in Ihrer App fest zu codieren. In den meisten Fällen finden Sie Artikel zur Verwendung von Web-Providern für föderierte Identitäten zur Autorisierung Ihrer API Aufrufe über API-Gateway (siehe Setting Credentials in a Web Browser), aber da Sie CloudFront verwenden, gibt es eine andere Problemumgehung dafür.

Sie können Ihren API-Schlüssel (oder sogar IAM-Anmeldeinformationen) in einer separaten Datei in S3 speichern, aber den Zugriff auf eine bestimmte IP-Adresse beschränken, damit Ihr Skript den Schlüssel abrufen und den API-Aufruf ausführen kann. Alle anderen IP-Adressen können den API-Schlüssel nicht abrufen. Daher kann die API-Methode nicht aufgerufen werden.

  1. Fordern Sie Ihre Benutzer auf, nur über CloudFront auf Ihre Inhalte zuzugreifen. Siehe: Using an Origin Access Identity to Restrict Access to Your Amazon S3 Content. Auf diese Weise kann der API-Schlüssel nicht mit S3-URLs abgerufen werden.
  2. Geben Sie das AWS-Konto an, das Sie zum Erstellen der signierten URL verwenden möchten. Siehe: Specifying the AWS Accounts That Can Create Signed URLs and Signed Cookies (Trusted Signers).
  3. Erstellen Sie eine signierte URL mit einer benutzerdefinierten Richtlinie mit einem langfristigen Ablaufdatum. Siehe: Creating a Signed URL Using a Custom Policy. Durch die Verwendung einer benutzerdefinierten Richtlinie (im Gegensatz zu einer vordefinierten Richtlinie) können Sie die IP-Adresse oder den Bereich der IP-Adressen der Benutzer angeben, die auf Ihre Inhalte zugreifen können. Diese generierte signierte URL wird immer dann verwendet, wenn Sie die API-Methode aufrufen möchten.
  4. Wählen Sie Ihre Verteilung in Cloudfront und fügen Sie ein Verhalten mit einem Pfad Muster, die auf Ihre API-Schlüssel-Datei verweist, zum Beispiel api-key.json. Stellen Sie sicher, dass Viewer-Zugriff beschränken auf Ja für das Verhalten festgelegt ist. Stellen Sie sicher, dass dieses Verhalten Vorrang vor dem Standardverhalten hat, indem Sie es oben in der Liste platzieren, d. H. Die Priorität lautet 0.
  5. Vergewissern Sie sich, dass einschränken Viewer-Zugang zu Keine für das Standard Cache-Verhalten festgelegt ist, die über alle Ihre Inhalte öffentlich außer für die API-Schlüssel-Datei machen.

HINWEIS: Wenn Sie Ihre signierte URL sicher sind, gespeichert ist, sicher und niemand hat Zugang zu ihm können Sie die IP-Adresse Anforderung aus Ihrer benutzerdefinierten Richtlinie zu entfernen, da es überflüssig wäre für die IP-Adresse zu überprüfen in diesem Fall. Natürlich können Sie stattdessen eine vordefinierte Richtlinie verwenden.

+0

Außerhalb der Box. Ich mag das. –

+0

Danke dafür. Ich bin mir nicht sicher, ob dies oder irgendeine Lösung in diesem Setup funktionieren würde. Da die Anwendung Frontend ist, ist die Server-IP niemals zum Senden verfügbar, glaube ich nicht? –

+0

Da Ihre Front-End-App statisch ist, werden die clientseitigen Skripts auf Ihrem lokalen Computer ausgeführt. Daher lautet die IP-Adresse in diesem Zusammenhang * IHRE * IP, nicht S3/CloudFront. Falls Sie an Ihrem Standort keine statische IP-Adresse haben, können Sie die signierte URL speichern und Ihre App so konfigurieren, dass sie sie als Parameter akzeptiert, um die API-Schlüsseldatei abzurufen. Ich hoffe, der Ansatz ist jetzt klar. –

Verwandte Themen