มีนโยบาย S3 ในการ จำกัด การเข้าถึงเพื่อดู / เข้าถึงที่เก็บข้อมูลเดียวหรือไม่?


123

ฉันมีที่เก็บข้อมูลง่ายๆที่ดูเหมือนimages.mysite.comใน S3 ของฉันและที่เก็บข้อมูลอื่น ๆ ที่มีการสำรองข้อมูล ฯลฯ

ฉันต้องการอนุญาตให้ผู้ใช้บางรายสามารถเข้าถึงที่images.mysite.comเก็บข้อมูลเพื่ออัปโหลดภาพ อย่างไรก็ตามฉันไม่ต้องการให้เขาเห็นถังอื่น ๆ ไม่ใช่ว่ามีอยู่จริง

ฉันไม่สามารถกำหนดนโยบายที่ทำเช่นนี้ได้ ทุกครั้งที่ฉันลองสิ่งที่ จำกัด มันจะลงเอยด้วยการบล็อกรายชื่อของที่เก็บข้อมูลใด ๆ


ฉันโหวตให้ปิดคำถามนี้เป็นนอกประเด็นเพราะน่าจะอยู่ใน Superusers
Tonny Madsen

สามารถสร้างนโยบายได้ที่: awspolicygen.s3.amazonaws.com/policygen.html
Suhail Gupta

ที่เกี่ยวข้อง: จำกัด รายการของบุ้งกี๋สำหรับผู้ใช้เฉพาะ
kenorb

1
ทำไมไม่เพียงแบ่งปัน URL ของถัง https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/- วิธีนี้จะช่วยป้องกันไม่ให้พวกเขาเห็นรายการทั้งหมดและไม่เปลี่ยนแปลงอะไรในนโยบายปัจจุบันของคุณ
treecoder

คำตอบ:


119

ฉันได้ลองใช้วิธีนี้มาระยะหนึ่งแล้วและในที่สุดก็ได้วิธีแก้ปัญหาที่ใช้งานได้ คุณต้องใช้ "ทรัพยากร" ที่แตกต่างกันขึ้นอยู่กับประเภทของการกระทำที่คุณกำลังดำเนินการ นอกจากนี้ฉันยังรวมการดำเนินการบางอย่างที่ขาดหายไปในคำตอบก่อนหน้า (เช่นDeleteObject) และ จำกัด บางอย่างเพิ่มเติม (เช่นPutBucketAcl)

ตอนนี้นโยบาย IAM ต่อไปนี้ใช้ได้ผล:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::itnighq",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl"
      ],
      "Resource": "arn:aws:s3:::itnighq/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {}
    }
  ]
}

การดำเนินการเกี่ยวกับที่เก็บข้อมูลและการดำเนินการเกี่ยวกับวัตถุต้องมี arn ที่แตกต่างกัน


9
นี่คือคำตอบที่ดีขอบคุณ อาจเป็นที่น่าสังเกตว่าความหมายของสิทธิ์ s3: ListAllMyBuckets คือผู้รับนโยบายนี้สามารถดูที่เก็บข้อมูล (root's) ทั้งหมดของคุณได้ ไม่มีการเปิดเผยข้อมูลโดยตรง แต่อาจมีความอ่อนไหว / สับสนเกี่ยวกับชื่อที่เก็บข้อมูล เป็นไปได้ที่จะลบการอนุญาตเฉพาะนี้และสิ่งต่างๆยังคงใช้งานได้ (แม้ว่า "s3cmd ls" etc จะไม่ส่งคืนที่เก็บข้อมูลเป้าหมายก็ตาม)
Mike Repass

91
สิ่งนี้ไม่ได้ป้องกันไม่ให้ผู้ใช้เห็นชื่อที่เก็บข้อมูลอื่น ๆ !
metdos

2
@metdos คุณสามารถป้องกันไม่ให้ผู้ใช้เห็นชื่อที่เก็บข้อมูลอื่น ๆ โดยลบนโยบายสุดท้ายออก
Hendra Uzia

20
หากต้องการดูรายการที่เก็บข้อมูลในคอนโซล (ดังนั้นจึงใช้คอนโซลสำหรับการเข้าถึงที่เก็บข้อมูล) คุณต้องให้สิทธิ์ListAllMyBucketsและGetBucketLocationสำหรับบัคเก็ต S3 ทั้งหมด ( "arn:aws:s3:::*"จะใช้งานได้แทนที่จะ"*"เป็นทรัพยากร) ตามที่ระบุไว้ในบล็อกโพสต์ AWS นี้ "นอกจากนี้คุณยังไม่สามารถเลือกที่เก็บข้อมูลบางส่วนได้ดังนั้นผู้ใช้ต้องได้รับอนุญาตให้แสดงรายการที่เก็บข้อมูลทั้งหมดสำหรับการเข้าถึงคอนโซล"
jwadsack

10
นี่คือคำแนะนำที่น่ากลัว มันอันตรายและเฉพาะสิ่งที่ OP ไม่ต้องการ ดูคำตอบของAndreas StankewitzและBFarสำหรับวิธีแก้ปัญหาที่เป็นไปได้
AndreKR

37

กรณีการใช้งานของเรา: จัดเตรียมพื้นที่สำรองสำหรับไคลเอนต์ของแอปพลิเคชันระบบคลาวด์ของเราที่ลูกค้าสามารถเข้าถึงได้โดยตรงโดยใช้เครื่องมือ S3 ทั่วไป แน่นอนไม่มีลูกค้าคนใดเห็นว่าลูกค้ารายอื่นมีอะไร

ดังที่ cloudberryman อธิบายว่า "คุณสามารถแสดงรายการที่เก็บข้อมูลทั้งหมดหรือไม่ก็ได้" ดังนั้นเราจึงต้องคิดวิธีแก้ไข พื้นหลัง:

จำเป็นต้องให้สิทธิ์ ListAllMyBuckets แก่ผู้ใช้เพื่อให้คอนโซล AWS S3 หรือ S3Fox เชื่อมต่อโดยไม่มีข้อความแสดงข้อผิดพลาด แต่ ListAllMyBuckets จะแสดงที่เก็บข้อมูลทั้งหมดโดยคำนึงถึงทรัพยากรที่ได้รับมอบหมาย (จริงๆแล้วเฉพาะ arn: ... ::: * เท่านั้น) นั่นเป็นข้อผิดพลาดที่ร้ายแรงถ้าคุณถามฉัน Btw การปฏิเสธ ListBucket สำหรับที่เก็บข้อมูลทั้งหมดไม่ได้ป้องกันไม่ให้แสดงรายการเนื่องจาก ListBucket ให้สิทธิ์ในการแสดงรายการเนื้อหาของที่เก็บข้อมูล

มี 3 ความเป็นไปได้ที่ฉันถือว่าเป็นวิธีแก้ปัญหา ฉันเลือกข้อสุดท้าย

(1) ใช้ชื่อที่เก็บข้อมูลที่เป็นความลับเช่น GUID

ข้อดี: ติดตั้งง่าย

ข้อเสีย: จัดการได้ยากโดยเฉพาะลูกค้า (จินตนาการว่าจะพบ GUID ที่เฉพาะเจาะจงซึ่งมีคนอื่น ๆ อีกหลายพันคน) ยังแสดงจำนวนที่เก็บข้อมูล = จำนวนลูกค้าที่ใช้บริการสำรองข้อมูล

(2) ใช้ถังเดียวกับโฟลเดอร์เฉพาะของไคลเอ็นต์

นี่คือวิธีที่ Amazon แนะนำโดยตัวอย่าง S3 / IAM เพื่อให้มีพื้นที่ในการเข้าถึงโดยผู้ใช้บางคนหรือกลุ่มผู้ใช้เท่านั้น ดู: AWS ตัวอย่างนโยบาย IAM

ข้อได้เปรียบ: ติดตั้งค่อนข้างง่ายไปกับแนวคิดของ AWS

ข้อเสีย: บังคับให้แสดงการมีอยู่ของที่เก็บข้อมูลทั้งหมดแบบสาธารณะเพื่อให้ลูกค้าสามารถค้นหาที่เก็บข้อมูล "บ้าน" ได้ การบัญชี AWS ให้สถิติการใช้งานที่เก็บข้อมูล แต่ไม่ใช่การใช้โฟลเดอร์ซึ่งทำให้ยากต่อการคำนวณต้นทุนตามลูกค้า

(3) อย่าให้สิทธิ์การเข้าถึงสำหรับ ListAllMyBuckets

ข้อได้เปรียบ: คุณจะได้รับสิ่งที่คุณต้องการ: ลูกค้าไม่สามารถมองเห็นที่เก็บข้อมูลของลูกค้ารายอื่นได้

ข้อเสีย: ลูกค้ามองไม่เห็นที่เก็บข้อมูลของตนเอง S3Browser มาพร้อมกับข้อความ "ไม่สามารถทำได้" และขอชื่อที่เก็บข้อมูลเพื่อป้อน S3Fox แสดงข้อความแสดงข้อผิดพลาดเมื่อเชื่อมต่อกับรูท แต่อนุญาตการนำทางโดยตรงไปยังที่เก็บข้อมูลของไคลเอ็นต์หากทราบชื่อที่เก็บข้อมูล คอนโซล Amazon S3 ไม่ทำงานเลย

หวังว่านี่จะช่วยจัดการ S3 IAM ได้ตามที่คุณต้องการ


1
นอกจากนี้สำหรับโซลูชัน (1) หากคุณต้องการใช้เว็บโฮสติ้งกับที่เก็บข้อมูลชื่อที่เก็บข้อมูลจะต้องตรงกับชื่อโดเมน
Andy Fusniak

31

ไม่สามารถให้การเข้าถึง S3 Console โดยไม่ListAllMyBucketsได้รับอนุญาต

ในกรณีของฉัน (และอาจเป็นของคุณเช่นกันผู้อ่านในอนาคต) ทางเลือกที่ยอมรับได้คือเปลี่ยนเส้นทางผู้ใช้เมื่อลงชื่อเข้าใช้ไปยังที่เก็บข้อมูลที่คุณต้องการให้พวกเขาเห็นโดยตรง

ในการดำเนินการนี้ให้เพิ่มสิ่งต่อไปนี้ต่อท้าย URL การลงชื่อเข้าใช้ IAM ของคุณ: /s3/?bucket=bucket-name

URL การลงชื่อเข้าใช้แบบเต็ม (แทนที่ชื่อแทนและชื่อที่เก็บข้อมูลของคุณ ):

https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name

นโยบาย IAM (แทนที่ชื่อที่เก็บข้อมูล ):

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket-name",
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างการอนุญาตเฉพาะที่เก็บข้อมูลสำหรับผู้ใช้อ่านบล็อกนี้: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam /


1
นี้ใช้งานได้ดี จะดีที่สุดหากผู้ใช้ไม่สามารถสำรวจนอกมุมมองที่เก็บข้อมูลได้ .... แต่ฉันจะเอาไป ขอบคุณ @BFar
Jamie Popkin

นี่คือคำตอบที่ถูกต้องคำตอบอื่น ๆ ทั้งหมดจะแสดงรายการที่เก็บข้อมูลทั้งหมดซึ่งควรถูกซ่อนไว้ตามคำขอเดิม
Steve Horvath

สิ่งที่ฉันต้องการ ขอบคุณ
dzhg

20

ลองใช้นโยบายนี้ นอกจากนี้ยังคำนึงด้วยว่าไม่มีวิธีใดที่จะให้รายการผู้ใช้เฉพาะที่เก็บข้อมูลที่เลือก คุณสามารถแสดงรายการที่เก็บข้อมูลทั้งหมดหรือไม่ก็ได้

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:PutObjectAcl",
                "s3:ListBucket",
                "s3:GetBucketAcl",
                "s3:PutBucketAcl",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::your_bucket_here/*",
            "Condition": {}
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*",
            "Condition": {}
        }
    ]
}

2
ใช้งานได้ดีมาก! ฉันต้องเปลี่ยนการกระทำเพื่อs3:*ให้มันใช้งานได้สำหรับฉัน ฉันก็มี"Resource": ["arn:aws:s3:::your_bucket_here", "arn:aws:s3:::your_bucket_here/*"]เช่นกัน แต่อาจไม่จำเป็น
Michael Yagudaev

3
s3: * ให้สิทธิ์เข้าถึงเพื่อทำอะไรก็ได้รวมถึงลบที่เก็บข้อมูล แน่ใจนะว่าต้องการอย่างนั้น?
Dave Gregory

10

ฉันตีความคำถามนี้ว่า: "ฉันสามารถอนุญาตให้เข้าถึงที่เก็บข้อมูลหนึ่งที่ที่เก็บข้อมูลอื่น ๆ ไม่สามารถเข้าถึงได้และมองไม่เห็นด้วยเหตุนี้" เนื่องจากการแสดงชื่อที่เก็บข้อมูลที่ไม่มีการอนุญาตให้เข้าถึงยังคงเท่ากับการรั่วไหลของข้อมูล

และคำตอบที่ถูกต้องคือไม่ สิทธิ์ที่จำเป็นคือ ListAllMyBuckets ซึ่งจะอนุญาตให้ผู้ใช้เห็นที่เก็บข้อมูลทั้งหมด การไม่อนุญาตนี้จะทำให้คอนโซลใช้งานไม่ได้


6

มีวิธีที่ยอดเยี่ยมในการอนุญาตให้ผู้ใช้เข้าถึงที่เก็บข้อมูลเฉพาะโดยไม่ต้องมีความรู้เกี่ยวกับที่เก็บข้อมูลอื่น ๆ นโยบายกลุ่มที่เหมือนกับนโยบายด้านล่างนี้จะอนุญาตให้ผู้ใช้เห็นเฉพาะ "ที่เก็บข้อมูล" สิ่งเดียวที่จับได้คือผู้ใช้จะเข้าถึงที่เก็บข้อมูลได้ก็ต่อเมื่อพวกเขาเชื่อมต่อกับปลายทางที่เก็บข้อมูลที่ระบุ สำหรับตัวอย่างด้านล่างนี้จะเป็น bucket-a.s3.amazonaws.com นอกจากนี้ที่เก็บข้อมูลอาจต้องมี "ผู้ใช้ที่ตรวจสอบสิทธิ์" อนุญาตจึงจะเกิดขึ้นได้

{
    "Statement": [
     {
         "Sid": "<EXAMPLE_SID>",
         "Action": [
           "s3:ListBucket",
           "s3:GetBucketLocation"
          ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:s3:::bucket-a"
         ]
     },
     {
      "Sid": "<EXAMPLE_SID>",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucket-a/*"
      ]
     }
   ]
}

วิธีนี้ได้รับการทดสอบกับ Cyberduck บน Mac OS / X และใช้แพ็คเกจ s3cmd

./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2

ฉันยังสามารถดูรายการที่เก็บข้อมูลทั้งหมดได้ ไม่ทำงาน :(
Rishikesh Chandra

5

สับสนว่าทำไมไม่มีการตรวจสอบคำตอบ?

มาแจกแจงคำแถลงนโยบายแต่ละข้อจากโซลูชันข้างต้น:

แถลงนโยบายนี้จากนำไปใช้กับเนื้อหาของถัง แต่ไม่เจ้าชู้ของตัวเอง นี่อาจไม่ใช่สิ่งที่คำถามถามเพราะคุณไม่เห็นสิ่งที่อยู่ในถัง

{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}

นโยบายคำสั่งสองข้อนี้ได้มาจากให้การเข้าถึงที่เก็บข้อมูลแบบอ่านอย่างเดียวที่ ( arn:aws:s3:::your_bucket_here/) แบบอ่านอย่างเดียวแต่ยังคงอนุญาตให้ใช้ CRUD ในเนื้อหาของที่เก็บข้อมูล ( arn:aws:s3:::your_bucket_here/*)

{
  "Effect": "Allow",
  "Action": [
    "s3:ListBucket",
    "s3:GetBucketLocation",
    "s3:ListBucketMultipartUploads"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here",
  "Condition": {}
},
{
  "Effect": "Allow",
  "Action": [
    "s3:AbortMultipartUpload",
    "s3:DeleteObject",
    "s3:DeleteObjectVersion",
    "s3:GetObject",
    "s3:GetObjectAcl",
    "s3:GetObjectVersion",
    "s3:GetObjectVersionAcl",
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectAclVersion"
  ],
  "Resource": "arn:aws:s3:::your_bucket_here/*",
  "Condition": {}
}

อย่างไรก็ตามนโยบายดังกล่าวมีคำสั่งด้านล่างซึ่งช่วยให้ผู้ใช้เห็นที่เก็บข้อมูลทั้งหมดที่จุดสิ้นสุด นี่อาจไม่ใช่สิ่งที่คำถามถามหา

{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}

อย่างไรก็ตามข้างต้นมีประโยชน์มากหากคุณใช้ไคลเอนต์ที่เบราว์เซอร์ร้านค้า S3 หากลูกค้าของคุณเข้าถึงร้านค้าไม่ใช่ที่เก็บข้อมูลโดยตรงดังนั้นคุณต้องเข้าถึงรายการที่เก็บข้อมูลที่ราก


3

อาจเป็นกรณีการใช้งานที่ง่ายที่สุด:

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

1
AWS This policy contains the following error: The policy must contain a valid version string
response

ที่เหมาะสม - ฉันแก้ไขการตอบสนองของฉัน -> <br/> มีเพียงสองค่าที่เป็นไปได้ที่นี่: <br/> * * * * * * * * 2012-10-17 และ2008/10/17 <br/> สามารถดูข้อมูลอ้างอิงเพิ่มเติมได้ที่นี่: <br/> docs.aws.amazon.com/IAM/latest/UserGuide/…
jjanczyszyn

มีความคิดเกี่ยวกับ(listing included)ความหมายในการแสดงเฉพาะที่เก็บข้อมูลที่ผู้ใช้สามารถเข้าไปได้หรือไม่? จนถึงตอนนี้ (และตามคำตอบอื่น ๆ ทั้งหมด) ดูเหมือนว่า AWS จะไม่ยอมให้คุณทำเช่นนั้น
MaximeBernard

3

มีวิธีง่ายๆหรือวิธีแก้ปัญหานี้โดยใช้ AWS Organisations องค์กร AWS ช่วยให้คุณมีบัญชีผู้ใช้หลายบัญชี บัญชีหลักของคุณสามารถมีบัญชี AWS ได้หลายบัญชี (ย่อย) และมีการเพิ่มบริการใดบ้าง (s3 / EC2 / *) ในบัญชี AWS ใดก็ตามที่จะมองเห็นได้เฉพาะทรัพยากรเหล่านั้นเท่านั้น

โปรดอ้างอิงhttps://aws.amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/ https://aws.amazon.com/organizations/

องค์กรในหน้าบัญชีของฉัน


3

ฉันพบโซลูชันนี้:
AWS FLOW:
การไหลของ AWS

นโยบายที่เก็บข้อมูล:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*", #Role ID
            "111111111111" #AccountID
          ]
        }
      }
    }
  ]
}

นโยบาย IAM:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*",  #Role ID
            "AIDAEXAMPLEID",  #UserID
            "111111111111"  #AccountID
          ]
        }
      }
    }
  ]
}

aws iam get-user-user-name USER-NAME --profile = ExampleProfile

aws iam get-role --role-name ROLE-NAME --profile = ExampleProfile

ที่มา: https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/

ป.ล. โปรดใช้นโยบายที่เก็บข้อมูลอย่างระมัดระวังคุณสามารถอยู่ได้โดยไม่ต้องมีสิทธิ์


2

ตามที่ได้กล่าวไว้ข้างต้นแล้วจึงไม่สามารถแสดงรายการที่เก็บข้อมูลเพียงรายการเดียวบนคอนโซล แต่ถ้าการเข้าถึงของ S3 ที่เก็บข้อมูลแนบกับ IAM IAM จะเข้าถึงที่เก็บข้อมูลได้โดยตรงหากมี URL ไปยังที่เก็บข้อมูล URL ที่เก็บข้อมูล S3 จะเป็นดังนี้:

https://s3.console.aws.amazon.com/s3/buckets/BucketName

โดยที่ BucketName คือชื่อของที่เก็บข้อมูลที่ IAM สามารถเข้าถึงได้


1
ฉันคิดว่านี่เป็นทางออกเดียวที่เป็นไปได้ในปี 2018 ด้วย
Saurabh

1

ฉันจัดการเพื่อทำงานต่อไปนี้ หมายความว่ารายชื่อที่เก็บข้อมูลอื่นได้รับข้อความปฏิเสธการเข้าถึง แต่ก็ยังสามารถเห็นที่เก็บข้อมูลที่ฉันต้องการหากฉันเชื่อมต่อกับชื่อที่เก็บข้อมูลที่ตั้งไว้เป็นเส้นทาง

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

ฉันใช้ Cyberduck เพื่อทดสอบการเชื่อมต่อนี้


1

แม้ว่าจะไม่สามารถ จำกัดs3:ListAllMyBucketsการดำเนินการเฉพาะที่เก็บข้อมูลบางส่วนได้ แต่สำหรับวิธีแก้ปัญหาคุณสามารถส่ง URL คอนโซลสำหรับที่เก็บข้อมูลเฉพาะเช่น

  • https://s3.console.aws.amazon.com/s3/buckets/BUCKET_NAME/

ที่มา: การจำกัด รายการบัคเก็ต S3 จากคอนโซล S3

ในการดำเนินการดังกล่าวคุณจะต้องระบุเอกสารนโยบายต่อไปนี้สำหรับผู้ใช้หรือกลุ่มที่กำหนด:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1",
                "arn:aws:s3:::my-bucket-2"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket-1/*",
                "arn:aws:s3:::my-bucket-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

ที่เก็บข้อมูลของคุณให้สิทธิ์อ่านและเขียนได้ที่ไหนmy-bucket-1และอยู่ที่ไหนmy-bucket-2

ที่เกี่ยวข้อง:


1

ลองใช้นโยบายนี้ ผู้ใช้ไม่สามารถแสดงรายการที่เก็บข้อมูลได้พวกเขาต้องใช้ลิงก์โดยตรงไปยังที่เก็บข้อมูลที่อนุญาต

ตัวอย่างเช่น s3.console.aws.amazon.com/s3/buckets/bucketname/?region=us-east-1&tab=overview

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname"
      ]
    },
    {
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::bucketname*"
      ]
    },

  ],
  "Version": "2012-10-17"
}

1

คล้ายกับที่คนอื่นอธิบายไว้ข้างต้น:

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

อย่างไรก็ตามนี่คือชิ้นส่วนที่หายไป แม้ว่าจะไม่สามารถเข้าถึงที่เก็บข้อมูลผ่าน S3-> Home แต่ก็เป็นไปได้ที่จะเข้าถึงเฉพาะที่เก็บข้อมูลที่ต้องการผ่านลิงก์โดยตรง

https://s3.console.aws.amazon.com/s3/buckets/yourawsbucket/

คุณสามารถค้นหาข้อมูลเพิ่มเติมได้ในโพสต์ต่อไปนี้:

https://aws.amazon.com/premiumsupport/knowledge-center/s3-console-access-certain-bucket/


0

วิธีแก้ปัญหาได้ผลสำหรับฉัน ฉันต้องการนโยบายเพื่อให้สิทธิ์การเข้าถึงแก่ผู้ใช้เฉพาะmy_iam_userในที่เก็บข้อมูลเฉพาะmy-s3-bucketถังของฉัน

นโยบายนี้อนุญาตให้ผู้ใช้ของฉันแสดงรายการลบรับ e วางไฟล์ในที่เก็บข้อมูล s3 ที่ระบุ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket"
        },
        {
            "Sid": "AddDeleteFiles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/my_iam_user"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-s3-bucket/*"
        }
    ]
}

0

ฉันแค่เพิ่มความต้องการที่คล้ายกันแก้ไขได้โดยสิ่งนี้:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:Get*",
            "s3:Put*",
            "s3:DeleteObject",
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket-name",
            "arn:aws:s3:::my-bucket-name/*"
        ]
    }
  ]
}

0

ฉันใช้สิ่งต่อไปนี้เพื่อซ่อนเนื้อหาของที่เก็บข้อมูลจากผู้ใช้รายอื่น สิ่งนี้ไม่เพียงช่วยในการซ่อนที่เก็บข้อมูลอื่น ๆ (อย่าใช้ ListAllMyBuckets) แต่ยังรวมถึงโฟลเดอร์ในที่เก็บข้อมูลเดียวกันเมื่อคุณสร้างที่เก็บข้อมูลเดียว แต่ต้องการให้มีโฟลเดอร์ย่อยในการกำหนดสิทธิ์ที่เหมาะสมให้กับผู้ใช้ IAM / โฟลเดอร์ย่อย

นโยบายต่อไปนี้ใช้กับ IAM Group และผู้ใช้ทั้งหมดอยู่ในกลุ่มนี้ คุณต้องใช้aws:useridและสร้างโฟลเดอร์ย่อยที่มีชื่อเดียวกันในที่เก็บข้อมูล

UserID สามารถรับได้: aws iam get-user --user-name "user_name_for_folder_access":

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

0

วิธีแก้ปัญหาง่ายๆที่ดีที่เราคิดขึ้นมาคือการบล็อกผู้ใช้เพื่อเข้าสู่ไดเรกทอรีราก ดังนั้นพวกเขาจึงต้องเข้าสู่ระบบโดยกำหนดเส้นทางระยะไกลไปยังโฟลเดอร์ที่ต้องการ

 {
"Statement": [
    {
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::folder-name*",
        "Condition": {}
    }
]
}

0

ไม่ขณะนี้ยังไม่สามารถ จำกัด ผู้ใช้ในการดูที่เก็บข้อมูลที่เลือกภายใต้รูทหรือที่อื่นได้ ตอนนี้คุณมีเพียง 3 ตัวเลือกเท่านั้น

ฉันเลือกที่จะขอให้ลูกค้าใช้ชื่อที่เก็บข้อมูลอย่างชัดเจน



-1

สิ่งนี้เหมาะสำหรับฉัน ผู้ใช้สามารถอัปโหลดดาวน์โหลดและรับรายชื่อไฟล์ แต่จะไม่สามารถดูไฟล์จากที่เก็บข้อมูลอื่นได้

 {    

"Statement": [    

{
    "Effect": "Allow",
    "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:PutObjectAcl",
        "s3:ListBucket",
        "s3:GetBucketAcl",
        "s3:PutBucketAcl",
        "s3:GetBucketLocation"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",
    "Condition": {}
},
{
    "Effect": "Allow",
    "Action": "s3:ListAllMyBuckets",
    "Resource": "*",
    "Condition": {}
},
{
    "Effect": "Deny",
    "Action": [
        "s3:DeleteBucket",
        "s3:DeleteBucketPolicy",
        "s3:DeleteBucketWebsite",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion"
    ],
    "Resource": "arn:aws:s3:::mybucketname/*",    

    "Condition": {}    

}
]
}      

-2

เพิ่มDenyอนุประโยคสำหรับที่เก็บข้อมูลที่คุณไม่ต้องการเข้าถึง โปรดจำไว้ว่าอาจยังคงอยู่ในรายการ แต่คุณจะไม่สามารถเข้าถึงเนื้อหาภายในได้

{
    "เวอร์ชัน": "2012-10-17",
    "คำให้การ": [
        {
            "Effect": "อนุญาต",
            "การกระทำ": "s3: *",
            "ทรัพยากร": "*"
        }
        {
            "Effect": "ปฏิเสธ",
            "การกระทำ": "s3: *",
            "ทรัพยากร": [
                "ARN: AWS: s3 ::: ถังชื่อ"
                "ARN: AWS: s3 ::: ถังชื่อ / *"
            ]
        }
    ]
}

1
คุณควรให้สิทธิ์การเข้าถึงทรัพยากรอย่างชัดเจน เมื่อคุณเริ่มต้นให้สิทธิ์การเข้าถึงทรัพยากรทั้งหมดคุณสามารถละเว้นทรัพยากรที่คุณต้องการให้เป็นส่วนตัวโดยไม่ได้ตั้งใจ นอกจากนี้การให้สิทธิ์เข้าถึงการกระทำ S3 ทั้งหมดหมายความว่าผู้ใช้สามารถทำให้ทรัพยากรเป็นสาธารณะหรือตั้งค่าการโฮสต์แบบคงที่หรือทำสิ่งที่เป็นอันตรายอื่น ๆ
Ondrej Galbavý
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.