web-dev-qa-db-fra.com

Amazon S3 prend-il en charge la requête HTTP avec l'authentification de base?

Je souhaite configurer un compte Amazon S3, créer un compartiment, télécharger des données, et que ces données seront disponibles via HTTP GET avec une authentification de base .

Je sais qu'il existe plusieurs façons d'obtenir l'authentification des données S3 (chaîne de requête, etc.), mais j'aimerais pouvoir fournir un schéma simple de nom d'utilisateur/mot de passe pour l'authentification.

Est-ce possible?

43
Blastt

Vous pouvez le développer vous-même en tant qu'application Web ou en tant que partie de votre application existante. Il consomme les requêtes HTTP, récupère leur composant URI, le convertit en nom d'objet S3 et utilise getObject () pour obtenir son contenu (à l'aide de l'un des SDK S3 disponibles, par exemple AWS Java SDK ).

Sinon, vous pouvez essayer une solution hébergée - s3auth.com (je suis un développeur). C'est un projet open source, et vous pouvez voir comment ce mécanisme est implémenté en interne dans l'une de ses classes principales . La demande HTTP est traitée par le service, puis convertie de nouveau en schéma d'authentification interne à Amazon S3:

http: // s3auth: [email protected]/texry/packages.png

Ce diagramme d'architecture explique comment le projet est mis en œuvre. L'image PNG est chargée depuis le compartiment Amazon S3 maven.s3auth.com, qui n'est pas lisible anonymement. L'URL complète de cette image est

http://s3auth:[email protected]/texry/packages.png

Consultez également cet article: Authentification HTTP de base pour les buckets S3

21
yegor256

En superposant plusieurs services AWS, vous pouvez obtenir quelque chose de proche de l’autorisation HTTP de base.

  1. Créez un site statique s3.
  2. Créez une distribution CloudFront pour desservir le site statique s3 (utilisez l'URL du site statique et non le nom du compartiment)
  3. Utilisez AWS WAF pour créer une règle qui autorise uniquement les demandes avec l'en-tête http Authorization approprié. Ce sera une règle de correspondance de contrôle sur le contenu de l'en-tête d'autorisation.
  4. Utilisez Route53 pour router un domaine personnalisé vers la distribution CloudFront

Vous devriez maintenant avoir un site statique accessible uniquement avec le nom d'utilisateur et le mot de passe corrects.

REMARQUE: avec cette configuration, vos informations d'identification ne vous seront pas demandées car la demande est bloquée avec un 403 Forbidden au lieu de 401 Unauthorized.

REMARQUE: Vous pouvez créer directement une distribution CloudFront devant un compartiment s3, mais vous ne pourrez pas utiliser par défaut un fichier d'index racine dans des sous-dossiers.

12
TomDotTom

La réponse courte est non, ne pas utiliser l'authentification de base. Mais voici un moyen qui est effectivement identique à l’authentification de base, et qui est plus facile que d’autres solutions répertoriées. Je crois que c'est sécurisé, mais je ne suis pas sûr.

Vous pouvez définir des conditions sur les compartiments s3 qui correspondent aux en-têtes de la demande. Par exemple, vous pouvez utiliser les en-têtes useragent et referer comme quelque chose d'équivalent à nom d'utilisateur et mot de passe dans l'authentification de base. Normalement, l’utilisateur est le navigateur et le système d’exploitation (comme Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0), et le référent est la page Web précédente. 

Voici un exemple de politique de compartiment s3 qui permet de placer des objets et d'obtenir des objets en faisant correspondre l'agent utilisateur et le référant (modification de note: BUCKETNAME, USERNAME, PASSWORD, AWS_REGION et FILENAME avec vos détails):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "allow-username-and-password-access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::BUCKETNAME/*",
            "Condition": {
                "StringEquals": {
                    "aws:UserAgent": "USERNAME",
                    "aws:Referer": "PASSWORD"
                }
            }
        }
    ]
}

Pour placer une ressource dans le compartiment, vous pouvez utiliser une requête curl comme celle-ci (remarque: BUCKETNAME, USERNAME, PASSWORD, AWS_REGION et FILENAME):

curl --user-agent USERNAME --referer PASSWORD --upload-file "FILENAME" --request PUT "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME"

Pour utiliser la ressource, vous pouvez utiliser quelque chose comme ceci:

curl --user-agent USERNAME --referer PASSWORD "https://s3-AWS_REGION.amazonaws.com/BUCKETNAME/FILENAME" > FILENAME

Encore une fois, je pense que c'est sécurisé, en tant qu'utilisateur, et que le référant doit être chiffré si vous utilisez https, mais s'il vous plaît, dites-moi si ce n'est pas le cas. 

11
Jordan Stewart

Non, ce n'est pas possible. Vous devez vous conformer à Amazons Authentication API

Découvrez quelques-uns des emballages listés ici

9
willbt

J'essayais moi-même de trouver une solution à ce problème. This post ici les a tous listés. Citant les lignes:

Cela fait des mois que je cherche une solution pour ajouter l’authentification HTTP de base aux compartiments S3 sur Amazon. Il existe des options impliquant des URL pré-signées (un seul objet), l'utilisation d'un service gratuit ou commercial tiers (problèmes de confidentialité), la création d'un EC2/Heroku/etc. avec les middleware aux requêtes proxy (compliquées et non serveur), en utilisant redirections de page et stratégies de compartiment (non sécurisé).

Solution de politique de seau: J'ai personnellement essayé ceci et cela me semble parfaitement sûr (à moins que vous ne puissiez contourner les politiques de seau). Cela nécessite juste un seau s3 pour fonctionner. Simple à mettre en œuvre. Idée basique: 

  1. Restreindre l'accès à l'ensemble du site, sauf autoriser l'accès public au fichier d'entrée et au fichier secret.
  2. Fichier d'entrée secure.html qui accepte une entrée utilisateur pour le mot de passe et redirige vers le fichier secret
  3. Fichier secret thisisasecret qui redirige vers le fichier principal (index.html) qui héberge le contenu réel du site
  4. Fichier principal main.html qui autorise uniquement l'accès aux demandes provenant du même site.
  5. Tous les autres contenus, tels que les fichiers css, js, seraient restreints par une règle de compartiment qui leur permettrait d'être servis si la requête émanait de l'URL de votre compartiment.

Utilisation de aws Lambda @ Edge: Cette solution nécessite le fonctionnement de s3, aws lambda et aws cloudfront. Idée basique: 

  1. Créez un secure.html. Créez des zones de texte pour saisir les informations d'identification de base de l'utilisateur ici. Ce fichier doit être accessible au public et appeler une fonction lambda.
  2. Lors de la configuration de cloudfront, créez un comportement indiquant «si vous souhaitez atteindre index.html, vous devez le faire via une URL signée». 
  3. Comme ci-dessus, créez une stratégie de compartiment pour autoriser l'accès aux fichiers js, css, etc. uniquement lorsque Origin est votre URL de compartiment. 
2
rahuljain1311

Je viens de AdroitLogic. À propos de l'article lié, il montre comment UltraESB peut être placé entre votre client et Amazon S3 pour authentifier vos demandes. Si nécessaire, il peut créer un service "proxy" qui acceptera l'authentification de base de votre client et enverra les informations d'identification comme prévu par Amazon S3. Cela pourrait être fait de manière triviale et cacherait toute complexité pour votre client.

0
Asankha Perera

Regardez ma réponse ici dans cette question quelque peu liée.

La question était d'obtenir une liste d'objets de compartiment sans une authentification de connexion S3 trop lourde. Donc, de votre question, ma réponse n’explique pas vraiment votre demande pour Http-request with basic username/password authentication - mais donne plutôt la possibilité de rendre le compartiment privé et de récupérer ses données en connaissant une identity-pool (ID) et une Amazon Resource Name (ARN) (que vous pouvez considérer comme similaires à un nom d’utilisateur et un mot de passe). Bien sûr, pour obtenir les identifiants (ID) et (ARN), vous devez effectuer certains réglages dans les pages principales AWS comme décrit dans ma réponse en 17 étapes ici ... - et cela ne fait pas partie de la requête GET mais plutôt dans la structure AWSS3 fournie par Amazon. J'espère que cela vous donne encore plus d'options à votre question;)

0
iKK