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?
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
En superposant plusieurs services AWS, vous pouvez obtenir quelque chose de proche de l’autorisation HTTP de base.
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.
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.
Non, ce n'est pas possible. Vous devez vous conformer à Amazons Authentication API
Découvrez quelques-uns des emballages listés ici .
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:
Utilisation de aws Lambda @ Edge: Cette solution nécessite le fonctionnement de s3, aws lambda et aws cloudfront. Idée basique:
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.
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;)