2013-04-12 30 views
11

Tôi đang tạo ứng dụng sử dụng Dịch vụ mã bảo mật của Amazon để tạo người dùng tạm thời truy cập thư mục con trên thùng S3. Người dùng được tạo bởi người dùng IAM có quyền truy cập đọc/ghi đầy đủ vào nhóm (cũng như các quyền cần thiết để tạo người dùng).Chính sách S3 dựa trên tiền tố Amazon không hoạt động (AWS, IAM, STS, Ruby)

Tôi có việc tạo người dùng hoạt động hoàn hảo cùng với hết hạn phiên và hơn thế nữa, nhưng tôi gặp sự cố khi có chính sách phù hợp để cho phép danh sách khóa dựa trên tiền tố. Các điều khoản mà tôi muốn người dùng cuối có bao gồm: đối tượng

  1. đọc được trong một số tiền tố được xác định
  2. Write đối tượng với cùng tiền tố được xác định
  3. Liệt kê tất cả các đối tượng cư trú tại các tiền tố được xác định

Tôi đã quản lý để đọc và viết hoạt động nhưng bằng cách nào đó, bất kể tôi thử truy cập danh sách nào không hoạt động đúng cách. Đây là mã Ruby mà tôi đang sử dụng khi tôi ở gần nhất:

AWS::STS::Policy.new do |policy| 
    policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"], 
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*" 
) 

    policy.allow(
    actions: ["s3:*"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
).where(:s3_prefix).like("#{folder_path}/*") 
end 

Nếu tôi nhớ lại, điều này cho phép tôi đọc và viết nhưng không liệt kê. Vì tôi vẫn đang phát triển, tôi đã thay đổi mã này:

AWS::STS::Policy.new do |policy| 
    # FIXME: This is way too permissive, but it's not working to be more specific. 
    policy.allow(
    actions: ["s3:*"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
) 
end 

Điều này làm việc tốt 100% với vấn đề rõ ràng là không có gì bị ràng buộc vào tiền tố cho phép người dùng điều khiển công việc của nhau.

Tôi đang làm gì sai trong chính sách của mình?

Trả lời

7

Bạn có thể tìm thấy bài viết quan tâm này, vì nó thảo luận cụ thể về việc tạo chính sách để hạn chế người dùng vào tiền tố trong Nhóm S3.

Credential Management for Mobile Applications

Bạn sẽ rất có thể chỉ cần tham khảo chính sách thứ hai.

{ 
     "Statement": 
     [ 
      { 
       "Effect":"Allow", 
       "Action":["s3:PutObject","s3:GetObject","s3:DeleteObject"], 
       "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__/__USERNAME__/*" 
      }, 
      { 
       "Effect":"Allow", 
       "Action":"s3:ListBucket", 
       "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__", 
       "Condition":{"StringLike":{"s3:prefix":"__USERNAME__/"}} 
      }, 
      { 
       "Effect":"Deny", 
       "Action":["sts:*", "iam:*", "sdb:*"], 
       "Resource":"*" 
      } 
     ] 
} 

Với 2 câu đầu tiên là những gì bạn muốn được quan tâm nhất.

Hope this helps.

7

Mở rộng trên Bob Kinney của referenced article and fragments (+1), tôi muốn giải thích những gì tôi xem xét các nguyên nhân có thể có của vấn đề của bạn, mà thực sự là không liên quan đến việc sử dụng AWS Security Token Service (STS), nhưng liên quan đến một vài sự tinh tế thường xuyên gặp phải với Amazon S3 IAM policies nói chung:

các Example Policies for Amazon S3 bìa khác nhau trường hợp sử dụng tương tự hoặc liên quan đến bạn - đặc biệt là trường hợp sử dụng của bạn rõ ràng bao gồm Ví dụ 2: cho phép một nhóm để có một thư mục được chia sẻ trong Amazon S3 - bạn đã thực hiện một cách hiệu quả mà trong lần đầu tiên chính sách của đoạn đầu tiên đã có (modulo GetObjectVersion, DeleteObjectVersion, chỉ phù hợp khi sử dụng Object Versioning).

Những gì còn thiếu tại là ListBucket - xin lưu ý sự tinh tế sau đây:

  • này thuộc về Operations on Buckets, ví dụ:Các hoạt động bạn có thể thực hiện trên Amazon S3các thùng, trong khi ví dụ: GetObject thuộc về Operations on Objects, ví dụ: hoạt động bạn có thể thực hiện trên Amazon S3 đối tượng (hơn nữa có Operations on the Service, hiện chỉ ListAllMyBuckets, đó là khả năng không áp dụng đối với trường hợp sử dụng của bạn).
  • Thông số prefixGiới hạn phản hồi cho các khóa bắt đầu bằng tiền tố được chỉ định. Bạn có thể sử dụng tiền tố để tách một nhóm thành các nhóm khóa khác nhau theo cách tương tự như cách hệ thống tệp sử dụng thư mục., ngụ ý rằng tiền tố không thể chứa thông số ký tự đại diện, hoặc thay vì * chỉ được coi là một phần của tên, hãy xem What characters are allowed in a bucket or object name?.
    • Đây là một khía cạnh của việc mô phỏng thư mục/thư mục mà nhiều người dùng gặp phải lúc đầu, vì S3 thực sự là kiến ​​trúc lưu trữ phẳng bao gồm thùng và chỉ đối tượng/khóa (xem câu trả lời của tôi cho How to specify an object expiration prefix that doesn't match the directory? để biết thêm chi tiết về điều đó).

Nhiều trường hợp sử dụng do đó giống như bạn yêu cầu hai mảnh chính sách rõ ràng để giải quyết riêng đối tượng và các hoạt động liên quan đến xô, phù hợp bạn có thể sẽ cần một cái gì đó như sau:

AWS::STS::Policy.new do |policy| 
    policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"], 
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*" 
) 

    policy.allow(
    actions: ["s3:ListBucket"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
).where(:s3_prefix).like("#{folder_path}/") 
end 
Các vấn đề liên quan