web-dev-qa-db-fra.com

Comment rendre tous les objets du compartiment AWS S3 publics par défaut?

J'utilise une bibliothèque PHP pour télécharger un fichier dans mon compartiment. J'ai défini l'ACL sur public-read-write et cela fonctionne bien, mais le fichier est toujours privé.

J'ai trouvé que si je change le Bénéficiaire à Tout le monde, cela rend le fichier public. Ce que je veux savoir, c'est comment faire en sorte que le bénéficiaire par défaut sur tous les objets dans mon compartiment soit défini sur "Tout le monde". Ou existe-t-il une autre solution pour rendre les fichiers publics par défaut?

Le code que j'utilise est ci-dessous:

public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array()) {
    if ($input === false) return false;
    $rest = new S3Request('PUT', $bucket, $uri);

    if (is_string($input)) $input = array(
        'data' => $input, 'size' => strlen($input),
        'md5sum' => base64_encode(md5($input, true))
    );

    // Data
    if (isset($input['fp']))
        $rest->fp =& $input['fp'];
    elseif (isset($input['file']))
        $rest->fp = @fopen($input['file'], 'rb');
    elseif (isset($input['data']))
        $rest->data = $input['data'];

    // Content-Length (required)
    if (isset($input['size']) && $input['size'] >= 0)
        $rest->size = $input['size'];
    else {
        if (isset($input['file']))
            $rest->size = filesize($input['file']);
        elseif (isset($input['data']))
            $rest->size = strlen($input['data']);
    }

    // Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
    if (is_array($requestHeaders))
        foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);
    elseif (is_string($requestHeaders)) // Support for legacy contentType parameter
        $input['type'] = $requestHeaders;

    // Content-Type
    if (!isset($input['type'])) {
        if (isset($requestHeaders['Content-Type']))
            $input['type'] =& $requestHeaders['Content-Type'];
        elseif (isset($input['file']))
            $input['type'] = self::__getMimeType($input['file']);
        else
            $input['type'] = 'application/octet-stream';
    }

    // We need to post with Content-Length and Content-Type, MD5 is optional
    if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false)) {
        $rest->setHeader('Content-Type', $input['type']);
        if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);

        $rest->setAmzHeader('x-amz-acl', $acl);
        foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
        $rest->getResponse();
    } else
        $rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');

    if ($rest->response->error === false && $rest->response->code !== 200)
        $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
    if ($rest->response->error !== false) {
        trigger_error(sprintf("S3::putObject(): [%s] %s", $rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
        return false;
    }
    return true;
}
130
condo1234

Allez à http://awspolicygen.s3.amazonaws.com/policygen.html Remplissez les détails tels que: enter image description here Dans Action, sélectionnez "GetObject". Sélectionnez "Ajouter une instruction", puis sélectionnez "Générer la stratégie".

Copiez l'exemple de texte:

{
  "Id": "Policy1397632521960",
  "Statement": [
    {
      "Sid": "Stmt1397633323327",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketnm/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

Accédez maintenant à votre console AWS S3. Au niveau du compartiment, cliquez sur Propriétés, développez les autorisations, puis sélectionnez Ajouter une stratégie de compartiment. Collez le code généré ci-dessus dans l'éditeur et cliquez sur Enregistrer.

Tous vos articles dans le panier seront publics par défaut.

276
jaxxbo

Si vous souhaitez rendre tous les objets publics par défaut, la méthode la plus simple consiste à utiliser une stratégie de compartiment à la place des listes de contrôle d'accès définies dans chaque objet.

enter image description here

Vous pouvez utiliser AWS Policy Generator pour générer une stratégie de compartiment pour votre compartiment.

Par exemple, la politique suivante permet à quiconque de lire chaque objet de votre compartiment S3 (il suffit de remplacer <bucket-name> par le nom de votre compartiment):

{
  "Id": "Policy1380877762691",
  "Statement": [
    {
      "Sid": "Stmt1380877761162",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket-name>/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

La stratégie de compartiment contient une liste de Statements et chaque instruction comporte un Effect (soit Allow ou Deny) pour obtenir une liste de Actions exécutée par Principal (l'utilisateur) sur le Resource spécifié (identifié par un Amazon Resource Name ou ARN).

La Id n'est qu'un identifiant de politique facultatif et le Sid est un identifiant d'instruction unique facultatif.

Pour les règles de compartiment S3, les ARN de ressources se présentent comme suit:

arn:aws:s3:::<bucket_name>/<key_name>

L'exemple ci-dessus permet à (Effect: Allow) n'importe qui (Principal: *) d'accéder à (Action: s3:GetObject) de tout objet du compartiment (Resource: arn:aws:s3:::<bucket-name>/*).

122
dcro