अनुमतियाँ s3: * के लिए S3 बाल्टी के लिए ListObjects के लिए AccessDenied


134

मैं समझ रहा हूं:

ListObjects ऑपरेशन को कॉल करते समय एक त्रुटि हुई (AccessDenied): एक्सेस अस्वीकृत

जब मैं अपने S3 बाल्टी से फ़ोल्डर प्राप्त करने का प्रयास करता हूं।

इस कमांड का उपयोग करना:

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

बाल्टी के लिए IAM अनुमतियाँ इस तरह दिखती हैं:

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

मुझे सफलतापूर्वक copyऔर lsसफलतापूर्वक करने के लिए क्या बदलने की आवश्यकता है ?


1
मेरे मामले में, मैंने awsएक उपयोगकर्ता के लिए कॉन्फ़िगर किया था और इसे किसी अन्य उपयोगकर्ता से क्रोनजोब-कॉल स्क्रिप्ट के अंदर उपयोग किया था, जिसका अर्थ है कि एक्सेस कुंजी और एक्सेस टोकन गलत / परेशान थे। मेरा समाधान सीधे मेरे bash स्क्रिप्ट फ़ाइल में क्रेडेंशियल्स ( AWS_ACCESS_KEY_IDऔर AWS_SECRET_ACCESS_KEY) को यहाँ वर्णित के रूप में रखना था ।
उवे कीम

जवाबों:


199

आपने S3 बाल्टी के अंदर वस्तुओं पर कमांड करने की अनुमति दी है, लेकिन आपने बाल्टी पर कोई भी कार्य करने की अनुमति नहीं दी है।

आपकी नीति में थोड़ा बदलाव इस तरह दिखेगा:

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

हालाँकि, यह शायद जरूरत से ज्यादा अनुमति देता है। AWS IAM के बाद ग्रैंटिंग लिवर प्रिविलेज की सबसे अच्छी प्रथा कुछ इस तरह दिखाई देगी:

{
  "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
यह बहुत विस्तृत कार्य सूची है। अधिकारों की सूची और प्रतिलिपि के लिए, आप जो सुझाव देंगे वह आवश्यक कार्रवाई है।
डोम फर्र

6
@domfarr मैं सिर्फ ओपी नीति को समायोजित करने के लिए न्यूनतम संभव कर रहा था ताकि वह उसके लिए काम कर सके। यदि आपके पास एक विशिष्ट प्रश्न है, तो आपको टिप्पणियों के साथ इस पर टैग करने के बजाय इस साइट पर एक अलग प्रश्न के रूप में पोस्ट करना चाहिए। हालांकि S3 कार्यों की सूची को देखना और अपनी इच्छित नीति का निर्माण करना वास्तव में आसान होना चाहिए।
मार्क बी

4
मैं टैग नहीं कर रहा था। ओपी ने अनुरोध किया कि प्रतिलिपि और एलएस के लिए क्या आवश्यक था। बाल्टी स्तर की कमी की कमी को शामिल किया गया था, लेकिन आपने क्रियाओं को समायोजित नहीं किया ... इसलिए मेरी टिप्पणी।
डोम फर्र

1
शायद EC3 को एक उपयुक्त भूमिका प्रदान करने के लिए सीधे काम करना चाहिए। :)
चिकूमीकू २ '

6
यह भी सुनिश्चित करें कि "Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]मैंने ऐसा नहीं लिखा है (जैसे कि आप केवल पहले एक स्लैश चाहते हैं *) - इस गलती का एहसास करने में मुझे 4 घंटे लग गए, क्योंकि मेरे सभी listObjectsकॉल विफल हो गए ...
DANiel Kis-Nagy

35

यदि आप कमांड "aws s3 cp s3: // बकेट-नाम / डेटा / ऑल-डेटा / .recursive" का उपयोग करके सभी s3 बाल्टी ऑब्जेक्ट्स की प्रतिलिपि बनाना चाहते हैं, जैसा कि आपने उल्लेख किया है, तो ऐसा करने के लिए एक सुरक्षित और न्यूनतम नीति है।

{
  "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/*"
          ]
      }
  ]
}

इस नीति में पहला कथन किसी विशिष्ट बकेट की उप निर्देशिका के अंदर वस्तुओं को सूचीबद्ध करने की अनुमति देता है। संसाधन को S3 बाल्टी का arn होना चाहिए, और लिस्टिंग को केवल उस बाल्टी में उप-निर्देशिका में सीमित करने के लिए आप "s3: उपसर्ग" मान को संपादित कर सकते हैं।

इस नीति में दूसरा कथन एक विशिष्ट उप-निर्देशिका में बाल्टी के अंदर वस्तुओं को प्राप्त करने की अनुमति देता है। इसका मतलब है कि "s3: // बाल्टी-नाम / डेटा / ऑल-डेटा /" पथ के अंदर कुछ भी आप कॉपी कर पाएंगे। ध्यान रखें कि यह आपको "s3: // बाल्टी-नाम / डेटा /" जैसे मूल रास्तों से कॉपी करने की अनुमति नहीं देता है।

यह समाधान AWS सीएलआई कमांड के लिए उपयोग सीमित करने के लिए विशिष्ट है; यदि आपको AWS कंसोल या API के माध्यम से S3 एक्सेस को सीमित करने की आवश्यकता है, तो अधिक नीतियों की आवश्यकता होगी। मेरा सुझाव है कि यहां एक नज़र डालें: https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

इसी तरह का एक मुद्दा यहां पाया जा सकता है जो मुझे उस समाधान की ओर ले गया जो मैं दे रहा हूं। https://github.com/aws/aws-cli/issues/2408

उम्मीद है की यह मदद करेगा!


1
वास्तव में, ऐसा लगता है कि आप एक उपकुंजी तक सीमित कर सकते हैंListBucket : stackoverflow.com/a/35952877/89218
paleozogt

मुझे बताने के लिए धन्यवाद, मैं अपनी कुछ वर्तमान परियोजनाओं पर यह कोशिश करूँगा!
रॉबर्ट स्मिथ

धन्यवाद। कभी नहीं सोचा था कि गैर-पहला उत्तर मेरी मदद कर सकता है
व्यस्कलेव त्सविना

यह वास्तव में संभव है, aws.amazon.com/blogs/security/…
citynorman

मैंने लिस्टिंग ऑब्जेक्ट्स को सीमित करने के लिए एक विशेष उप-फ़ोल्डर के अंतर्गत आने वाली स्थिति को शामिल करने के लिए उत्तर संपादित किया है। सहायता के लिए धन्यवाद!
रॉबर्ट स्मिथ

8

आपको "arn: aws: 3 ::: bucketname" या "arn: aws: 3 ::: bucketname *" के माध्यम से बाल्टी के लिए संसाधन निर्दिष्ट करना होगा। बाद को पसंद किया जाता है क्योंकि यह बाल्टी की वस्तुओं पर भी हेरफेर की अनुमति देता है। नोटिस कोई स्लैश नहीं है!

वस्तुओं को सूचीबद्ध करना बाल्टी पर एक ऑपरेशन है। इसलिए, कार्रवाई "s3: ListBucket" की आवश्यकता है। बकेट में ऑब्जेक्ट जोड़ना ऑब्जेक्ट पर एक ऑपरेशन है। इसलिए, कार्रवाई "s3: PutObject" की आवश्यकता है। निश्चित रूप से, आप आवश्यकतानुसार अन्य कार्यों को जोड़ना चाह सकते हैं।

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

21
के साथ समस्या arn:aws:s3:::bucketname*यह भी करने के लिए उपयोग की अनुमति देता हैarn:aws:s3:::bucketname-with-suffix
Guss

1
जैसा कि लिखा गया है, यह एक खराब नीति है; इसका उपयोग न करें। यह s3 की अनुमति देना चाहिए: arn के खिलाफ ListBucket: aws: s3 ::: bucketname और s3: PutObject for arn: aws: s3 ::: bucketname / *
jarmod

7

मैं S3 तक पहुँचने में असमर्थ था क्योंकि

  • पहले मैंने उदाहरण पर मुख्य पहुंच को कॉन्फ़िगर किया (यह लॉन्च के बाद भूमिका संलग्न करना असंभव था)
  • कुछ महीनों के लिए इसके बारे में भूल गया
  • उदाहरण के लिए संलग्न भूमिका
  • तक पहुँचने की कोशिश की। कॉन्फ़िगर की गई कुंजी में भूमिका की तुलना में अधिक प्राथमिकता थी, और उपयोग से इनकार कर दिया गया था क्योंकि उपयोगकर्ता आवश्यक S3 अनुमतियों के साथ प्रदान नहीं किया गया था।

समाधान: rm -rf .aws/credentialsतबaws भूमिका का उपयोग करता है।


1
ठीक वैसी ही समस्या। इसका एक लक्षण यह होगा कि एक उपयोगकर्ता उन चीजों तक पहुंच बना सकता है जो दूसरे उपयोगकर्ता समान EC2 नोड पर नहीं कर सकते हैं।
डॉक्टर

6

नीचे दी गई नीति का उपयोग करते समय मुझे वही त्रुटि मिली, हालांकि मेरे पास s3: ListObjecting ऑपरेशन के लिए "s3: ListBucket" है।

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

फिर मैंने एक पंक्ति "arn: aws: s3 ::: bucketname" जोड़कर इसे ठीक किया

{
"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

मैं सोच रहा था कि त्रुटि "s3: ListObjects" कार्रवाई के कारण है, लेकिन मुझे "S3 बाल्टी के लिए ListObjects के लिए AccessDenied" समस्या को हल करने के लिए कार्रवाई "s3: ListBucket" को जोड़ना पड़ा।


4

मैंने उसी मुद्दे का सामना किया। मैंने अभी-अभी क्रेडेंशियल कॉन्फ़िगरेशन जोड़ा है:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

में "~ / .aws / साख" + डिफ़ॉल्ट प्रोफ़ाइल के लिए टर्मिनल को पुनः आरंभ।

बहु प्रोफाइल के मामले में - लाभकारी arg को जोड़ने की आवश्यकता है:

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

जहां PROFILE_NAME :

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

क्रेडेंशियल्स और मल्टी प्रोफाइल को कैसे कॉन्फ़िगर किया जा सकता है, इसके बारे में अधिक जानकारी यहां पाई जा सकती है


2

मैंने निम्नलिखित कोशिश की:

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

इससे मुझे त्रुटि मिली:

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

इस फार्म का उपयोग कर काम किया:

aws s3 ls {bucket name}

0

मैं उसी उत्तर के साथ स्वीकृत उत्तर के रूप में उत्तर दे रहा हूं लेकिन छोटे (महत्वपूर्ण) अंतर के साथ और अधिक विवरण जोड़ रहा हूं।

नीचे विन्यास पर विचार करें:

{
  "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>/*"]
    }
  ]
}

नीति कार्यक्रम संबंधी अनुदान लिखने हटाने का उपयोग और दो भागों में विभाजित किया गया है: कार्रवाई बाल्टी स्तर पर अनुमतियाँ प्रदान करता है और अन्य कार्यों बाल्टी के अंदर की वस्तुओं पर अनुमति की आवश्यकता।
ListBucketPutObject/DeleteObject

पहला संसाधन तत्व कार्रवाई के arn:aws:s3:::<Bucket-Name>लिए निर्दिष्ट करता ListBucketहै ताकि एप्लिकेशन बाल्टी में सभी वस्तुओं को सूचीबद्ध कर सकें।

दूसरा संसाधन तत्व , और कार्यों के arn:aws:s3:::<Bucket-Name>/*लिए निर्दिष्ट करता है ताकि एप्लिकेशन बाल्टी में किसी भी ऑब्जेक्ट को लिख या हटा सकें।PutObjectDeletObject

बाल्टी-स्तर और ऑब्जेक्ट-स्तरीय ठीक दाने वाली अनुमतियों को निर्दिष्ट करने के लिए सुरक्षा कारणों से दो अलग-अलग 'आरएनएस' में अलगाव महत्वपूर्ण है।

ध्यान दें कि यदि मैंने केवल GetObjectदूसरे ब्लॉक में निर्दिष्ट किया होता तो क्या होता, प्रोग्रामेटिक एक्सेस के मामलों में मुझे एक त्रुटि प्राप्त होती है जैसे:

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


-1

एक समान मुद्दों में भाग गया, मेरे लिए समस्या यह थी कि मेरे पास मेरे bash_profile में अलग-अलग AWS कुंजी सेट थीं।

मैंने यहां एक ऐसे ही सवाल का जवाब दिया: https://stackoverflow.com/a/57317494/11871462

यदि आपके पास अपने bash_profile में AWS कुंजियाँ हैं, तो इसके बजाय AWS CLI डिफॉल्ट करता है।


-1

मेरे पास यह आवश्यकता थी कि मेरी आवश्यकता उपयोगकर्ता को विशिष्ट पथ पर लिखने की अनुमति दे

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

और इस परिवर्तन से समस्या हल हो गई

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.