J'implémente un téléchargement direct de fichiers depuis la machine cliente vers Amazon S3 via l'API REST en utilisant uniquement JavaScript, sans aucun code côté serveur. Tout fonctionne bien mais une chose m'inquiète ...
Lorsque j'envoie une demande à l'API REST Amazon S3, je dois signer la demande et mettre une signature dans l'en- Authentication
tête. Pour créer une signature, je dois utiliser ma clé secrète. Mais tout se passe du côté client, donc la clé secrète peut être facilement révélée à partir de la source de la page (même si j'obscurcit / crypte mes sources).
Comment puis-je gérer cela? Et est-ce vraiment un problème? Peut-être que je peux limiter l'utilisation de clé privée spécifique uniquement aux appels d'API REST à partir d'une origine CORS spécifique et uniquement aux méthodes PUT et POST ou peut-être lier la clé uniquement à S3 et à un compartiment spécifique? Peut-être existe-t-il d'autres méthodes d'authentification?
La solution «sans serveur» est idéale, mais je peux envisager d'impliquer certains traitements côté serveur, à l'exclusion du téléchargement d'un fichier sur mon serveur, puis de l'envoi vers S3.
Réponses:
Je pense que ce que vous voulez, ce sont des téléchargements basés sur un navigateur utilisant POST.
Fondamentalement, vous avez besoin d'un code côté serveur, mais il ne fait que générer des stratégies signées. Une fois que le code côté client a la stratégie signée, il peut télécharger à l'aide de POST directement vers S3 sans que les données passent par votre serveur.
Voici les liens officiels de la documentation:
Schéma: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
Exemple de code: http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html
La politique signée irait dans votre html sous une forme comme celle-ci:
Notez que l'action FORM envoie le fichier directement à S3 - pas via votre serveur.
Chaque fois qu'un de vos utilisateurs souhaite télécharger un fichier, vous créez le
POLICY
etSIGNATURE
sur votre serveur. Vous renvoyez la page dans le navigateur de l'utilisateur. L'utilisateur peut alors télécharger un fichier directement sur S3 sans passer par votre serveur.Lorsque vous signez la stratégie, vous faites généralement expirer la stratégie après quelques minutes. Cela oblige vos utilisateurs à parler à votre serveur avant le téléchargement. Cela vous permet de surveiller et de limiter les téléchargements si vous le souhaitez.
Les seules données allant vers ou depuis votre serveur sont les URL signées. Vos clés secrètes restent secrètes sur le serveur.
la source
${filename}
au nom de la clé, donc pour l'exemple ci-dessus,user/eric/${filename}
au lieu de simplementuser/eric
. S'iluser/eric
s'agit d'un dossier déjà existant, le téléchargement échouera silencieusement (vous serez même redirigé vers le success_action_redirect) et le contenu téléchargé n'y sera pas. Je viens de passer des heures à déboguer cela en pensant que c'était un problème d'autorisation.Vous pouvez le faire via AWS S3 Cognito, essayez ce lien ici:
http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Amazon_S3
Essayez également ce code
Changez simplement la région, l'IdentityPoolId et le nom de votre bucket
la source
Vous dites que vous voulez une solution «sans serveur». Mais cela signifie que vous n'avez pas la possibilité de mettre aucun de "votre" code dans la boucle. (REMARQUE: une fois que vous avez donné votre code à un client, c'est «son» code maintenant.) Verrouiller CORS ne va pas aider: les gens peuvent facilement écrire un outil non Web (ou un proxy Web) qui ajoute l'en-tête CORS correct pour abuser de votre système.
Le gros problème est que vous ne pouvez pas différencier les différents utilisateurs. Vous ne pouvez pas autoriser un utilisateur à lister / accéder à ses fichiers, mais empêcher les autres de le faire. Si vous détectez un abus, vous ne pouvez rien y faire sauf changer la clé. (Ce que l'attaquant peut vraisemblablement obtenir à nouveau.)
Votre meilleur pari est de créer un "utilisateur IAM" avec une clé pour votre client javascript. Ne lui donnez l'accès en écriture qu'à un seul compartiment. (mais idéalement, n'activez pas l'opération ListBucket, cela la rendra plus attrayante pour les attaquants.)
Si vous aviez un serveur (même une simple micro-instance à 20 $ / mois), vous pourriez signer les clés sur votre serveur tout en surveillant / prévenant les abus en temps réel. Sans serveur, le mieux que vous puissiez faire est de surveiller périodiquement les abus après coup. Voici ce que je ferais:
1) Faites régulièrement pivoter les clés de cet utilisateur IAM: chaque nuit, générez une nouvelle clé pour cet utilisateur IAM et remplacez la clé la plus ancienne. Puisqu'il y a 2 clés, chaque clé sera valable 2 jours.
2) activez la journalisation S3 et téléchargez les journaux toutes les heures. Définissez des alertes sur "trop de téléchargements" et "trop de téléchargements". Vous voudrez vérifier à la fois la taille totale du fichier et le nombre de fichiers téléchargés. Et vous voudrez surveiller à la fois les totaux globaux, ainsi que les totaux par adresse IP (avec un seuil inférieur).
Ces vérifications peuvent être effectuées "sans serveur" car vous pouvez les exécuter sur votre bureau. (c'est-à-dire que S3 fait tout le travail, ces processus sont juste là pour vous alerter en cas d'abus de votre compartiment S3 afin que vous n'obteniez pas une facture AWS géante à la fin du mois.)
la source
En ajoutant plus d'informations à la réponse acceptée, vous pouvez consulter mon blog pour voir une version en cours d'exécution du code, en utilisant AWS Signature version 4.
Va résumer ici:
Dès que l'utilisateur sélectionne un fichier à télécharger, procédez comme suit: 1. Appelez le serveur Web pour lancer un service afin de générer les paramètres requis
Dans ce service, appelez le service AWS IAM pour obtenir des informations temporaires
Une fois que vous avez les informations, créez une stratégie de compartiment (chaîne codée en base 64). Signez ensuite la stratégie de compartiment avec la clé d'accès secrète temporaire pour générer la signature finale
renvoyer les paramètres nécessaires à l'interface utilisateur
Une fois cela reçu, créez un objet de formulaire html, définissez les paramètres requis et POSTEZ-le.
Pour des informations détaillées, veuillez vous référer à https://wordpress1763.wordpress.com/2016/10/03/browser-based-upload-aws-signature-version-4/
la source
C'est là que vous avez mal compris. La raison même pour laquelle les signatures numériques sont utilisées est que vous pouvez vérifier que quelque chose est correct sans révéler votre clé secrète. Dans ce cas, la signature numérique est utilisée pour empêcher l'utilisateur de modifier la politique que vous avez définie pour la publication du formulaire.
Les signatures numériques telles que celle présentée ici sont utilisées pour la sécurité sur tout le Web. Si quelqu'un (NSA?) Était vraiment capable de les briser, il aurait des cibles beaucoup plus grandes que votre seau S3 :)
la source
J'ai donné un code simple pour télécharger des fichiers du navigateur Javascript vers AWS S3 et répertorier tous les fichiers du compartiment S3.
Pas:
Pour savoir comment créer Create IdentityPoolId http://docs.aws.amazon.com/cognito/latest/developerguide/identity-pools.html
Accédez à la page de console de S3 et ouvrez la configuration des cors à partir des propriétés du compartiment et écrivez le code XML suivant dans celle-ci.
Créez un fichier HTML contenant le code suivant, modifiez les informations d'identification, ouvrez le fichier dans le navigateur et profitez-en.
la source
Si vous n'avez pas de code côté serveur, votre sécurité dépend de la sécurité de l'accès à votre code JavaScript côté client (c'est-à-dire que tous ceux qui ont le code peuvent télécharger quelque chose).
Je recommanderais donc de créer simplement un compartiment S3 spécial qui est accessible en écriture public (mais non lisible), de sorte que vous n'avez pas besoin de composants signés côté client.
Le nom du bucket (un GUID par exemple) sera votre seule défense contre les téléchargements malveillants (mais un attaquant potentiel ne pourra pas utiliser votre bucket pour transférer des données, car il est écrit uniquement pour lui)
la source
Voici comment générer un document de politique à l'aide de nœuds et sans serveur
L'objet de configuration utilisé est stocké dans SSM Parameter Store et ressemble à ceci
la source
Si vous souhaitez utiliser un service tiers, auth0.com prend en charge cette intégration. Le service auth0 échange une authentification de service SSO tiers contre un jeton de session temporaire AWS avec des autorisations limitées.
Voir: https://github.com/auth0-samples/auth0-s3-sample/
et la documentation auth0.
la source