Odmowa dostępu podczas wywoływania operacji PutObject z uprawnieniem na poziomie zasobnika

108

Postępowałem zgodnie z przykładem na http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html#iam-policy-example-s3, aby dowiedzieć się, jak przyznać użytkownikowi dostęp tylko do jednego zasobnika.

Następnie przetestowałem konfigurację za pomocą wtyczki W3 Total Cache Wordpress. Test nie powiódł się.

Próbowałem również odtworzyć problem za pomocą

aws s3 cp --acl=public-read --cache-control='max-age=604800, public' ./test.txt s3://my-bucket/

i to się nie udało

upload failed: ./test.txt to s3://my-bucket/test.txt A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied

Dlaczego nie mogę przesłać do mojego zasobnika?

Greg
źródło

Odpowiedzi:

204

Odpowiadając na moje własne pytanie:

Przykładowa polityka przyznała dostęp PutObject, ale musiałem również przyznać dostęp PutObjectAcl.

Musiałem się zmienić

"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"

od przykładu do:

"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"

Musisz także upewnić się, że Twój zasobnik jest skonfigurowany tak, aby klienci ustawiali publicznie dostępną listę ACL, odznaczając te dwa pola:

wprowadź opis obrazu tutaj

Greg
źródło
2
Dziękuję Ci! Nie jestem pewien, dlaczego własna dokumentacja Amazon jest wyłączona. Możesz również chcieć dołączyć "s3: AbortMultipartUpload", aby przerwane wysyłanie mogło zostać poprawnie wyczyszczone.
Hashcut
próbki zasad S3 umieszczone tutaj docs.aws.amazon.com/IAM/latest/UserGuide/ ...
E.Big
1
btw to nie działa dla mnie. boto3 interakcja, nawet z polityką s3fullaccess Otrzymuję „Odmowa dostępu dla PutObject”
E.Big
2
W moim przypadku to działa z AWS cli, ale nie jest to wrokign z boto
Hardik Gajjar
3
Miałem pełny dostęp S3, ale brakowało mi blokowania nowych publicznych list ACL i przesyłania obiektów publicznych. Dziękuję Ci!
the_ccalderon
37

Miałem podobny problem. Nie używałem rzeczy ACL, więc nie potrzebowałem s3:PutObjectAcl.

W moim przypadku robiłem (w Serverless Framework YML):

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName"

Zamiast:

- Effect: Allow
  Action:
    - s3:PutObject
  Resource: "arn:aws:s3:::MyBucketName/*"

Co dodaje /*na końcu wiadra ARN.

Mam nadzieję że to pomoże.

movermeyer
źródło
2
Potrzebowałem tego z / *
cyrf
tak było również w przypadku mnie
Visualspark
10

Po prostu waliłem głową w ścianę, próbując zmusić przesyłanie S3 do pracy z dużymi plikami. Początkowo mój błąd brzmiał:

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

Potem spróbowałem skopiować mniejszy plik i otrzymałem:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

Mogłem wyświetlać obiekty w porządku, ale nie mogłem zrobić nic innego, mimo że miałem s3:*uprawnienia w mojej polityce roli. Skończyło się na tym, że przerobiłem politykę na następującą:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "*"
        }
    ]
}

Teraz mogę przesłać dowolny plik. Zastąp my-bucketnazwą swojego zasobnika. Mam nadzieję, że to pomoże komuś, kto przez to przechodzi.

Ken J
źródło
2
To daje: Brak wymaganego pola Principal :(
Sameera K
2
Otrzymuję również następujący błąd: Brak wymaganego pola Dyrektor
Karan Sharma
jak to robisz w yml
ichimaru
Uwaga: dzięki temu użytkownik / rola IAM będą mieć dostęp do listy kluczy we wszystkich zasobnikach. Używaj ostrożnie; najlepiej unikać używania "Resource": "*".
Darian Moody
Dodaj - „Principal”: „*”, - poniżej „Effect”: „Allow”, aby rozwiązać problem z brakującym wymaganym polem
meck373
9

Na wypadek, gdyby to pomogło komuś innemu, w moim przypadku używałem CMK (działało dobrze, używając domyślnego klucza aws / s3)

Musiałem przejść do mojej definicji klucza szyfrowania w IAM i dodać programistycznego użytkownika zalogowanego do boto3 do listy użytkowników, którzy „mogą używać tego klucza do szyfrowania i odszyfrowywania danych z poziomu aplikacji oraz podczas korzystania z usług AWS zintegrowanych z KMS”.

PeskyGnat
źródło
To mi pomogło. Dzięki! Ten sam błąd co uprawnienia, ale w rzeczywistości był to szyfrowanie.
Vicente Rocha
6

Miałem podobny problem z przesyłaniem do zasobnika S3 chronionego szyfrowaniem KWS. Mam minimalne zasady, które pozwalają na dodawanie obiektów pod określonym kluczem s3.

Musiałem dodać następujące uprawnienia KMS do moich zasad, aby umożliwić roli umieszczanie obiektów w zasobniku. (Może być nieco więcej niż jest to wymagane)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:ListKeys",
                "kms:GenerateRandom",
                "kms:ListAliases",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:ImportKeyMaterial",
                "kms:ListKeyPolicies",
                "kms:ListRetirableGrants",
                "kms:GetKeyPolicy",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:ListResourceTags",
                "kms:ReEncryptFrom",
                "kms:ListGrants",
                "kms:GetParametersForImport",
                "kms:TagResource",
                "kms:Encrypt",
                "kms:GetKeyRotationStatus",
                "kms:GenerateDataKey",
                "kms:ReEncryptTo",
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:<MY-REGION>:<MY-ACCOUNT>:key/<MY-KEY-GUID>"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
            <The S3 actions>
            ],
            "Resource": [
                "arn:aws:s3:::<MY-BUCKET-NAME>",
                "arn:aws:s3:::<MY-BUCKET-NAME>/<MY-BUCKET-KEY>/*"
            ]
        }
    ]
}
Spangen
źródło
Niesamowite. Skopiowałem uprawnienia z domyślnego aws/s3klucza zarządzanego do zasad IAM dołączonych do roli (nie w zasadach KMS) i działa dobrze. Jedyne działania potrzebowałem przeciwko KMS Arns były: kms:Encrypt, kms:Decrypt, kms:ReEncrypt*, kms:GenerateDataKey*, kms:DescribeKey. Potem tylko standardowe uprawnienia S3.
z0r
3

Otrzymałem ten sam komunikat o błędzie dotyczący błędu, który popełniłem: Upewnij się, że używasz prawidłowego s3 URI, takiego jak: s3://my-bucket-name/

(Jeśli my-bucket-name jest oczywiście w katalogu głównym twojego aws s3)

Nalegam na to, ponieważ podczas kopiowania wklejania wiadra s3 z przeglądarki dostajesz coś takiego https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/?region=my-aws-regiontab=overview

Tak więc popełniłem błąd, używając, s3://buckets/my-bucket-namektóre podnosi:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

amiabl
źródło
1

U mnie korzystałem z wygasłych kluczy uwierzytelniających. Wygenerowałem nowe i boom.

Mark Jackson
źródło
1

Podobnie jak w jednym poście powyżej (z wyjątkiem tego, że korzystałem z poświadczeń administratora), aby załadować S3 do pracy z dużym plikiem 50M.

Początkowo mój błąd brzmiał:

An error occurred (AccessDenied) when calling the CreateMultipartUpload operation: Access Denied

Zmieniłem multipart_threshold, aby był powyżej 50M

aws configure set default.s3.multipart_threshold 64MB

i dostałem:

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

Sprawdziłem ustawienia publicznego dostępu do zasobnika i wszystko jest dozwolone. Stwierdziłem więc, że dostęp publiczny można zablokować na poziomie konta dla wszystkich zasobników S3 :

S3 może blokować publiczną listę ACL na poziomie konta

dovka
źródło
1

Jeśli ustawiłeś dostęp publiczny do zasobnika i nadal nie działa, edytuj zasadę zasobnika i wklej:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::yourbucketnamehere",
                "arn:aws:s3:::yourbucketnamehere/*"
            ],
            "Effect": "Allow",
            "Principal": "*"
        }
    ]
}
Den Pat
źródło
Pracował dla mnie, stworzyłem nowe wiadro S3, udostępniłem je w pełni publicznie. Jego zapisywalny obiekt put_object, ale kończy się niepowodzeniem podczas wykonywania operacji put_object z opcją / ACL =. Dziwne?
Doug F
0

Jeśli określono własny klucz KMS zarządzany przez klienta do szyfrowania S3, musisz również podać flagę --server-side-encryption aws:kms, na przykład:

aws s3api put-object --bucket bucket --key objectKey --body /path/to/file --server-side-encryption aws:kms

Jeśli nie dodasz flagi, --server-side-encryption aws:kmsCLI wyświetli AccessDeniedbłąd

Benjamin Slabbert
źródło
0

Udało mi się rozwiązać ten problem, udzielając pełnego dostępu s3 do Lambda z polityk. Utwórz nową rolę dla Lambda i dołącz politykę z pełnym dostępem S3 do niej.

Mam nadzieję, że to pomoże.

głęboki bajaj
źródło
0

Napotkałem ten sam problem. Mój zasobnik był prywatny i miał szyfrowanie KMS. Udało mi się rozwiązać ten problem, dodając dodatkowe uprawnienia KMS w roli. Poniższa lista to absolutny minimalny zestaw potrzebnych ról.

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "AllowAttachmentBucketWrite",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "kms:Decrypt",
            "s3:AbortMultipartUpload",
            "kms:Encrypt",
            "kms:GenerateDataKey"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/*",
            "arn:aws:kms:kms-key-arn"
        ]
    }
  ]
}

Źródła: https://aws.amazon.com/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/

Aditya Kar
źródło