Jak domyślnie ustawić wszystkie obiekty w zasobniku AWS S3 jako publiczne?

151

Używam biblioteki PHP, aby przesłać plik do mojego zasobnika. Ustawiłem listę ACL na publiczny odczyt i zapis i działa dobrze, ale plik jest nadal prywatny.

Zauważyłem, że jeśli zmienię beneficjenta na Wszyscy , plik zostanie opublikowany. Chcę wiedzieć, jak ustawić domyślną odbiorcę dla wszystkich obiektów w moim zasobniku na „Wszyscy” . A może istnieje inne rozwiązanie umożliwiające domyślne upublicznienie plików ?

Kod, którego używam, znajduje się poniżej:

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;
}
mieszkanie1234
źródło

Odpowiedzi:

300

Idź do http://awspolicygen.s3.amazonaws.com/policygen.html Wypełnij szczegóły, takie jak: wprowadź opis obrazu tutaj W akcji wybierz "GetObject" Wybierz "Dodaj oświadczenie" Następnie wybierz "Generuj zasady"

Skopiuj przykładowy tekst:

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

Teraz przejdź do konsoli AWS S3, na poziomie zasobnika kliknij Właściwości, Rozwiń uprawnienia, a następnie wybierz Dodaj zasady zasobnika. Wklej powyższy wygenerowany kod do edytora i naciśnij Zapisz.

Wszystkie Twoje elementy w zasobniku będą domyślnie publiczne.

jaxxbo
źródło
8
To jest właściwa odpowiedź. W przeciwieństwie do wcześniejszej odpowiedzi, ten post nauczył mnie również, jak tworzyć zasady i co one robią. Po przeczytaniu tego mogę ręcznie napisać politykę.
Jason Cheladyn
2
Głosowałem za tą odpowiedzią z tego samego powodu co @liyicky, szczegółowe instrukcje były miłym wprowadzeniem, a nie tylko odpowiedzią.
brendo
To samo tutaj. AWS bywa czasami nieprzezroczysty i prawdopodobnie z bardzo dobrego powodu. Ta forma odpowiedzi jest pomocna od zera.
Jerome
Działa to, gdy dodajesz nowe pliki do zasobnika, ale muszę zmienić pliki, które już istnieją w zasobniku, aby były publiczne.
Radenko Zec
137

Jeśli chcesz, aby wszystkie obiekty były domyślnie publiczne, najprostszym sposobem jest zrobienie tego za pomocą zasad zasobnika zamiast list kontroli dostępu (ACL) zdefiniowanych dla każdego pojedynczego obiektu.

wprowadź opis obrazu tutaj

Możesz użyć Generatora zasad AWS, aby wygenerować politykę zasobnika dla swojego zasobnika.

Na przykład następujące zasady pozwolą każdemu odczytać każdy obiekt w Twoim zasobniku S3 (po prostu zastąp <bucket-name>nazwą swojego zasobnika):

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

Zasada zasobnika zawiera listę, Statementsa każda instrukcja ma Effect(albo Allowalbo Deny) listę czynności Actionswykonywanych przez Principal(użytkownika) na określonym Resource(oznaczonym symbolem Amazon Resource Namelub ARN).

Jest Idto tylko opcjonalny identyfikator zasad, a Sidopcjonalny unikalny identyfikator instrukcji.

W przypadku zasad segmentu S3 zasoby ARN mają postać:

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

Powyższy przykład umożliwia ( Effect: Allow) każdemu ( Principal: *) dostęp ( Action: s3:GetObject) do dowolnego obiektu w zasobniku ( Resource: arn:aws:s3:::<bucket-name>/*).

dcro
źródło
Czy nie ma sposobu z panelem sterowania?
ianaz
2
@ianaz Możesz dodać tę zasadę zasobnika do zasobnika za pośrednictwem konsoli AWS (panelu sterowania)
dcro
@ianaz zobacz moją odpowiedź poniżej.
jaxxbo
Zauważ również, że w powyższym linku znajduje się łącze „przykładowe zasady”, które podaje dokładne informacje potrzebne do wycięcia i wklejenia do generatora zasad. Ponieważ aws aktualizuje interfejsy API, jest to bardziej prawdopodobne. Dzisiejszego ranka zadziałało na mnie jak urok.
keithpjolley
Principal: *bardzo mi pomogło. Dzięki!
iedmrc
2

Mój problem był nieco inny, ale skoro to pytanie jest na górze wyszukiwarki Google, zostawię swoje rozwiązanie, może to komuś pomoże.

Miałem już wcześniej pełny dostęp do zasobnika S3, ale pewnego dnia po prostu zaczął wracać Access Denieddo wszystkich moich plików. Rozwiązanie było bardzo proste.

  1. Idź do Services-S3
  2. Kliknij swoje wiadro S3
  3. Przejdź do Permissionskarty, a następnie przejdź do Bucket Policykarty
  4. I kliknij Saveprzycisk.

Powinien ponownie przypisać uprawnienia do wszystkich plików.

wprowadź opis obrazu tutaj

Zresztą tutaj jest pełna, bucket policyktóra umożliwia upublicznienie wszystkich obiektów

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}
Serhii Popov
źródło