İzinler s3 olduğunda ListObjects for ListObjects için AccessDenied: *


135

Alıyorum:

ListObjects işlemi çağrılırken bir hata oluştu (Erişim Reddedildi): Erişim Reddedildi

S3 klasörümden klasör almaya çalıştığımda.

Bu komutu kullanarak:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

Paket için IAM izinleri şöyle görünür:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

Başarmak copyve lsbaşarılı olmak için neyi değiştirmem gerekiyor ?


1
Benim durumumda, awsbir kullanıcı için yapılandırdım ve bunu başka bir kullanıcıdan cronjob adı verilen bash betiği içinde kullandım, yani erişim anahtarı ve erişim belirteci yanlıştı / ayarlanmadı. Çözümüm, kimlik bilgilerini ( AWS_ACCESS_KEY_IDve AWS_SECRET_ACCESS_KEY) burada açıklandığı gibi doğrudan bash komut dosyama koymaktı .
Uwe Keim

Yanıtlar:


200

S3 klasöründeki nesneler üzerinde komut uygulama izni verdiniz, ancak paketin kendisi üzerinde herhangi bir işlem gerçekleştirme izni vermediniz.

Politikanızı biraz değiştirmek şuna benzer:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}

Ancak, bu muhtemelen gerekenden daha fazla izin verir. En Az Ayrıcalık Verme konusundaki AWS IAM en iyi uygulamasının ardından aşağıdaki gibi görünecektir:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucketname/*"
          ]
      }
  ]
}

40
Bu çok geniş bir eylem listesi. Liste ve kopya hakları için gerekli eylemler neler önerirsiniz.
dom farr

6
@domfarr OPs politikasını onun için çalışmasını sağlamak için mümkün olan en az şeyi yapıyordum. Belirli bir sorunuz varsa, bunu yorumlarla etiketlemek yerine bu sitede ayrı bir soru olarak göndermelisiniz. S3 eylemlerinin listesine bakmak ve istediğiniz politikayı oluşturmak gerçekten kolay olsa da.
Mark B

4
Etiketlemiyordum. OP, kopya ve ls için gerekli olanı talep etti. Kova seviyesi eksikliği dahil edildi, ancak Eylemleri ayarlamadınız ... dolayısıyla benim yorumum.
dom farr

1
Belki de doğrudan EC3'e uygun bir rol atamak işe yaramalı. :)
ChikuMiku

6
Ayrıca "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]benim yaptığım gibi yazmadığınızdan da emin olun (yani sadece bir bölü işareti istiyorsunuz *) - bu hatanın tüm listObjectsaramalarımın başarısız olmasına neden olduğunu anlamam 4 uzun saatimi aldı ...
Dániel Kis-Nagy

36

Bahsettiğiniz gibi "aws s3 cp s3: // paket adı / data / all-data /. --Recursive" komutunu kullanarak tüm s3 paket nesnelerini kopyalamak istiyorsanız, işte bunu yapmak için güvenli ve asgari bir politika:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

Bu politikadaki ilk ifade, belirli bir paketin alt dizinindeki nesnelerin listelenmesine izin verir. Kaynağın S3 klasörünün arnı olması gerekir ve listeyi yalnızca bu paketteki bir alt dizinle sınırlamak için "s3: önek" değerini düzenleyebilirsiniz.

Bu politikadaki ikinci ifade, nesnelerin belirli bir alt dizinde paketin içine alınmasına izin verir. Bu, "s3: // paket-adı / veri / tüm-veri /" yolu içindeki her şeyi kopyalayabileceğiniz anlamına gelir. Bunun "s3: // paket-adı / veri /" gibi üst yollardan kopyalama yapmanıza izin vermediğini unutmayın.

Bu çözüm, AWS CLI komutlarının kullanımını sınırlamaya özeldir; AWS konsolu veya API aracılığıyla S3 erişimini sınırlamanız gerekirse daha fazla politikaya ihtiyaç duyulacaktır. Buraya bir göz atmanızı öneririm: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/ .

Buna benzer bir sorun burada bulunabilir ve bu da beni verdiğim çözüme yönlendirdi. https://github.com/aws/aws-cli/issues/2408

Bu yardımcı olur umarım!


1
Eğer gibi Aslında, öyle görünüyor olabilir kısıtlamak ListBucket: Bir alt anahtar için stackoverflow.com/a/35952877/89218
paleozogt

Bana haber verdiğiniz için teşekkürler, bunu mevcut projelerimden bazılarında deneyeceğim!
Robert Smith

Teşekkürler. İlk olmayan cevabın bana yardımcı olabileceğini hiç düşünmemiştim
Vyacheslav Tsivina


Yanıtı, belirli bir alt klasör altında bulunan nesneleri listelemeyi sınırlamak için bir koşul eklemek üzere düzenledim. Yardım için teşekkürler!
Robert Smith

8

"Arn: aws: 3 ::: grup adı" veya "arn: aws: 3 ::: grup adı *" yoluyla paket için Kaynak belirtmelisiniz. İkincisi, kovanın nesneleri üzerinde de manipülasyonlara izin verdiği için tercih edilir. Eğik çizgi olmadığına dikkat edin!

Listeleme nesneleri, Bucket üzerinde bir işlemdir. Bu nedenle, "s3: ListBucket" eylemi gereklidir. Kovaya bir nesne eklemek, Nesne üzerinde bir işlemdir. Bu nedenle, "s3: PutObject" eylemi gereklidir. Elbette, ihtiyaç duyduğunuz başka eylemler eklemek isteyebilirsiniz.

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}

21
ile ilgili sorun arn:aws:s3:::bucketname*, aynı zamanda erişime izin vermesidirarn:aws:s3:::bucketname-with-suffix
Guss

1
Yazıldığı gibi, bu kötü bir politikadır; onu kullanma. S3: ListBucket'a arn: aws: s3 ::: demet adı ve s3: PutObject karşı arn: aws: s3 ::: kovaadı / *
jarmod

7

S3'e erişemedim çünkü

  • ilk önce örnekte anahtar erişimini yapılandırdım (başlatma sonrasında rol eklemek imkansızdı)
  • birkaç ay unuttum
  • örneğe ekli rol
  • erişmeye çalıştı. Yapılandırılan anahtar rolden daha yüksek önceliğe sahipti ve kullanıcıya gerekli S3 izinleri verilmediğinden erişim reddedildi.

Çözüm:, rm -rf .aws/credentialsardından awsrol kullanır.


1
Aynı sorun. Bunun bir belirtisi, bir kullanıcının aynı EC2 düğümünde başka bir kullanıcının erişemeyeceği şeylere erişebilmesidir.
Doc Kaos

6

Aşağıdaki gibi ilkeyi kullanırken aynı hatayı aldım, ancak s3: ListObjects işlemi için "s3: ListBucket" kullanıyorum.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

Sonra bir satır "arn: aws: s3 ::: grupadı" ekleyerek düzelttim.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}

4

Hatanın "s3: ListObjects" eyleminden kaynaklandığını düşünüyordum, ancak "S3 klasörü için ListObjects için AccessDenied" sorununu çözmek için "s3: ListBucket" eylemini eklemem gerekiyordu


4

Ben de aynı sorunla karşılaştım. Kimlik bilgileri yapılandırmasını ekledim:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

içine "~ / .aws / kimlik" + varsayılan profil için terminali yeniden başlatın.

Çoklu profil durumunda --profile arg'nin eklenmesi gerekir:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

nerede PROFILE_NAME :

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

Kimlik bilgilerinin ve çoklu profillerin nasıl yapılandırılacağı hakkında daha fazla bilgiyi burada bulabilirsiniz


2

Aşağıdakileri denedim:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}

Bu bana hatayı verdi:

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

Bu formu kullanmak işe yaradı:

aws s3 ls {bucket name}

0

Kabul edilen yanıtla aynı yönde ancak küçük (önemli) farklılıklar içeren ve daha fazla ayrıntı ekleyen bir yanıt ekliyorum.

Aşağıdaki yapılandırmayı düşünün:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<Bucket-Name>"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
    }
  ]
}

Politika programlı verir yazma-silme erişimi ve iki bölüme ayrılır: aksiyon kova düzeyinde izinleri sağlar ve diğer eylemler Kovanın içindeki nesnelerin izinlerini gerektirir.
ListBucketPutObject/DeleteObject

İlk Kaynak öğesi , uygulamaların paketteki tüm nesneleri listeleyebilmesi arn:aws:s3:::<Bucket-Name>için ListBucketeylemi belirtir .

İkinci Kaynak öğesi , uygulamaların paketteki nesneleri yazabilmesi veya silebilmesi arn:aws:s3:::<Bucket-Name>/*için PutObject, ve DeletObjecteylemlerini belirtir .

Paket düzeyinde ve nesne düzeyinde ayrıntılı izinleri belirtmek için güvenlik nedenlerinden ötürü iki farklı "saat" e ayrılması önemlidir.

Sadece GetObject2. blokta belirtmiş olsaydım ne olurdu, programlı erişim durumunda aşağıdaki gibi bir hata alırdım:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.


-1

Benzer bir sorunla karşılaştım, benim için sorun bash_profile dosyamda ayarlanmış farklı AWS anahtarlarına sahip olmamdı.

Burada benzer bir soruyu yanıtladım: https://stackoverflow.com/a/57317494/11871462

Bash_profile dosyanızda çakışan AWS anahtarlarınız varsa, AWS CLI varsayılan olarak bunları kullanır.


-1

Bu sorunu yaşadım gereksinimim kullanıcının belirli bir yola yazmasına izin vermek istedim

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

ve bu değişiklikle sorun çözüldü

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.