it-swarm.com.de

Wie kann ich Amazon s3 mit einer vorab festgelegten URL widersprechen?

Ich versuche, die signierte URL zum Hochladen von Bildern in den S3-Bucket zu verwenden. Folgendes ist meine Bucket-Policy: 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::12345678:user/myuser",
                    "arn:aws:iam::12345678:root"
                ]
            },
        "Action": [
                "s3:List*",
                "s3:Put*",
                "s3:Get*"
            ],
            "Resource": [
                "arn:aws:s3:::myBucket",
                "arn:aws:s3:::myBucket/*"
            ]
        }
    ]
}

Ich generiere die signierte URL vom Server wie folgt:

var aws = require('aws-sdk');
aws.config = {
    accessKeyId: myAccessKeyId,
    secretAccessKey: mySecretAccessKey
};

var s3 = new aws.s3();
s3.getSignedUrl('putObject', {
    Bucket: 'myBucket',
    Expires: 60*60,
    key: 'myKey'
}, function (err, url) {
    console.log(url);
});

Ich bekomme die URL. Wenn ich versuche, ein Objekt zu platzieren, erhalte ich folgende Fehlermeldung: 

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>FXXXXXXXXX</RequestId>
    <HostId>fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId>
</Error>

Update 1

Hier ist die Richtlinie von myuser:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:iam::2xxxxxxxxxxx:user/myuser",
                "arn:aws:iam::2xxxxxxxxxxx:root"
            ]
        },
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::myBucket",
            "arn:aws:s3:::myBucket/*"
        ]
    }
  ]
}

Update 2 Ich kann nur hochladen, wenn die folgende Option festgelegt ist. Ich verstehe nicht, was die Verwendung von Bucket-Richtlinien ist, wenn nur die manuelle Auswahl der Berechtigung funktioniert. 

 Permission for everyone

Update 3 

Der folgende Code funktioniert. Jetzt ist das einzige Problem die signierte URL

 #!/bin/bash

 file="$1"

 bucket="mybucket"
 resource="/${bucket}/${file}"
 contentType="image/png"
 dateValue=`date -R`
 stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
 s3Key="AKxxxxxxxxxxxxxxxxx"
 s3Secret="/Wuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret}     -binary | base64`
 curl -X PUT -T "${file}" \
   -H "Host: ${bucket}.s3.amazonaws.com" \
   -H "Date: ${dateValue}" \
   -H "Content-Type: ${contentType}" \
   -H "Authorization: AWS ${s3Key}:${signature}" \
   https://${bucket}.s3.amazonaws.com/${file}
17
Pravin

Es ist mir gelungen, eine Datei mit Ihrem Code erfolgreich hochzuladen. 

Hier sind die Schritte, die ich befolgt habe:

  1. Erstellt einen neuen Bucket und einen neuen IAM-Benutzer

  2. Legen Sie die IAM-Benutzerrichtlinie wie folgt fest:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt1418647210000",
                "Effect": "Allow",
                "Action": [
                    "s3:Put*"
                ],
                "Resource": [
                    "arn:aws:s3:::myBucket/*"
                ]
            }
        ]
    }
    
  3. KEINE Bucket-Richtlinie erstellt

  4. Verwenden Sie Ihren Code zum Generieren der vorsignierten URL:

    var aws = require('aws-sdk');
    aws.config = {
        accessKeyId: myAccessKeyId,
        secretAccessKey: mySecretAccessKey
    };
    
    var s3 = new aws.s3();
    s3.getSignedUrl('putObject', {
        Bucket: 'myBucket',
        Expires: 60*60,
        Key: 'myKey'
    }, function (err, url) {
        console.log(url);
    });
    
  5. Kopieren Sie die URL auf dem Bildschirm und verwenden Sie curl, um den Upload wie folgt zu testen:

    curl.exe -k -X PUT -T "someFile" "https://myBucket.s3.amazonaws.com/myKey?AWSAccessKeyId=ACCESS_KEY_ID&Expires=1457632663&Signature=Dhgp40j84yfjBS5v5qSNE4Q6l6U%3D"
    

In meinem Fall dauerte es in der Regel 5-10 Sekunden, bis die Änderungen der Richtlinie wirksam wurden. Wenn sie beim ersten Mal fehlschlägt, senden Sie sie bitte für eine Weile.

Hoffe das hilft.

12
Volkan Paksoy

Sie haben die Berechtigungen für den Bucket richtig eingerichtet, um den Zugriff durch den Benutzer zu ermöglichen.

Sie müssen jedoch auch die Richtlinie des Benutzers bearbeiten, damit der Benutzer auf den S3-Dienst zugreifen kann.

Bearbeiten Sie die IAM-Richtlinie des Benutzers, dessen Anmeldeinformationen Sie zum Generieren der selbstsignierten URL verwenden. So etwas wird definitiv alles abdecken:

{
  "Statement": [
    {
      "Sid": "AllowAllS3Access",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
2
Rory
  1. Klicken Sie in Ihrer IAM-Konsole auf Benutzer
  2. Wählen Sie in der rechten Liste den von Ihnen verwendeten IAM-Benutzer aus (sollte "myuser" sein).
  3. Wählen Sie Berechtigungen auf den Unterregisterkarten
  4. Klicken Sie auf Richtlinie anhängen und wählen Sie AmazonS3FullAccess aus

Die letzte Seite ist wie das .

Sie können auch die Unterregisterkarte Security Credentials (Sicherheitsanmeldeinformationen) überprüfen. Ihre accessKeyId sollte sich in der Liste befinden. Der secretAccessKey kann einfach nicht mehr bekommen.

2
Hank Chiu

Es kann auch Ihnen helfen:) .__ Fügen Sie einen ContentType property hinzu:

s3.getSignedUrl('putObject', {
    Bucket: 'myBucket',
    Expires: 60*60,
    Key: 'myKey',
    ContentType: 'image/jpeg',
}, function (err, url) {
   console.log(url);
});
1
Hugo Mallet