Amazon Cloudfront với S3. Truy cập bị từ chối


91

Chúng tôi đang cố gắng phân phối các thùng S3 qua Cloudfront nhưng vì một số lý do, phản hồi duy nhất là tài liệu XML của AccessDenied như sau:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>89F25EB47DDA64D5</RequestId>
    <HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

Đây là cài đặt chúng tôi đang sử dụng:

Cài đặt phân phối Cài đặt gốc

Và đây là chính sách cho xô

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *********"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::x***-logos/*"
        }
    ]
}

Cài đặt hành vi bộ nhớ cache - imgur.com/JBZqrRm
Jordan Adams

Đảm bảo Cloudfront có thể đọc từ nhóm S3.
Nathan C

Làm thế nào tôi có thể kích hoạt hoặc kiểm tra điều này?
Jordan Adams

Cài đặt gốc, tùy chọn cuối cùng. Xem ảnh chụp màn hình của bạn. :)
Nathan C

Tôi nghĩ rằng tôi đã thử điều này sớm hơn và nó không hoạt động nhưng tôi đã thay đổi nó một lần nữa và nó đang trong quá trình phân phối. Tôi sẽ thêm chính sách của nhóm vào bài viết của mình :)
Jordan Adams

Câu trả lời:


91

Nếu bạn đang truy cập vào bản phân phối CloudFront của mình, bạn cần đặt một đối tượng gốc mặc định: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Để chỉ định một đối tượng gốc mặc định bằng bảng điều khiển CloudFront:

  • Đăng nhập vào Bảng điều khiển quản lý AWS và mở bảng điều khiển Amazon CloudFront tại https://console.aws.amazon.com/cloudfront/ .

  • Trong danh sách phân phối ở khung trên cùng, chọn phân phối để cập nhật.

  • Trong ngăn Chi tiết phân phối , trên tab Chung , bấm Chỉnh sửa .

  • Trong hộp thoại Chỉnh sửa phân phối , trong trường Đối tượng gốc mặc định , nhập tên tệp của đối tượng gốc mặc định.

    Chỉ nhập tên đối tượng, ví dụ , index.html. Không thêm a / trước tên đối tượng.

  • Để lưu các thay đổi của bạn, nhấp Có, Chỉnh sửa .


Trong trường hợp của tôi, cài đặt này chưa giải quyết được vấn đề. Tôi vẫn nhận được lỗi Truy cập từ chối
KurioZ7

53

Tôi cũng gặp vấn đề tương tự và trong khi câu trả lời của Kousha giải quyết vấn đề cho index.html trong đường dẫn gốc, thì vấn đề của tôi cũng là với các thư mục con khi tôi sử dụng các thư mục kết hợp với index.html để có được "các url đẹp" (ví dụ .com / cái gì đó / chứ không phải là "xấu xí" example.com/s Something.html)

Một phần cũng là lỗi của Amazon, bởi vì khi bạn thiết lập phân phối CloudFront, nó sẽ cung cấp cho bạn các nhóm S3 để chọn, nhưng nếu bạn chọn một trong số đó, nó sẽ sử dụng URL xô thay vì URL lưu trữ trang web tĩnh làm phụ trợ.

Vì vậy, để khắc phục vấn đề:

  • Cho phép lưu trữ trang web tĩnh cho nhóm
  • Đặt tài liệu Index (và có lẽ là Lỗi ) một cách thích hợp
  • Sao chép URL điểm cuối - bạn có thể tìm thấy nó bên cạnh các cài đặt ở trên - Nó sẽ trông giống như: <buck.name> .s3-website- <aws-area> .amazonaws.com
  • Sử dụng URL đó làm nguồn gốc Phân phối CloudFront của bạn. (Điều này cũng sẽ làm cho cài đặt Đối tượng gốc mặc định CF không cần thiết, nhưng dù sao cũng không hại khi đặt nó)

Câu trả lời hoàn hảo kể từ ngày bình luận này.
Sai Ramachandran

Đó là nó cho tôi là tốt. Tôi đã có một trang web khác hoạt động và nghĩ rằng tôi đã cấu hình trang web mới giống hệt nhau. Vì vậy, dễ dàng bỏ qua điều này.
Günther Eberl

Bạn cũng cần thêm các quyền GetObject và ListObjects công khai vào nhóm.
Georges

8

Tôi gặp vấn đề tương tự như @Cezz, mặc dù giải pháp không hoạt động trong trường hợp của tôi.

Ngay khi lưu trữ trang web tĩnh được bật cho nhóm, điều đó có nghĩa là người dùng có thể truy cập nội dung thông qua URL Cloudfront hoặc URL S3, điều không phải lúc nào cũng mong muốn. Ví dụ: trong trường hợp của tôi, bản phân phối Cloudfront được bật SSL và người dùng sẽ không thể truy cập nó qua kết nối không có SSL.

Giải pháp tôi tìm thấy là:

  • giữ cho lưu trữ trang web tĩnh bị vô hiệu hóa trên nhóm S3
  • giữ nguồn gốc phân phối Cloudfront dưới dạng ID S3
  • đặt "Hạn chế quyền truy cập nhóm" thành "Có" (và để dễ dàng, cho phép CloudFront tự động cập nhật chính sách nhóm)
  • trên "Trang lỗi", tạo phản hồi tùy chỉnh và mã lỗi bản đồ "403: Bị cấm" đến trang phản hồi mong muốn, ví dụ /index.html, với mã phản hồi là 200

Lưu ý rằng trong trường hợp của tôi, tôi đang phục vụ một ứng dụng javascript duy nhất trong đó tất cả các đường dẫn được giải quyết bởi index.html. Nếu bạn có đường dẫn phân giải đến các đối tượng khác nhau trong nhóm S3 của mình, điều này sẽ không hoạt động.


1
Cảm ơn câu trả lời của bạn. Cái này làm việc cho tôi Tôi đã có vấn đề tương tự như bạn. Tôi không muốn mọi người truy cập vào nhóm S3 của mình, vì vậy tôi cần hạn chế quyền truy cập vào Nguồn gốc S3, chỉ hoạt động khi bạn điền vào nguồn gốc theo đề xuất của tính năng tự động hoàn tất trong Cloudfront. Mặc dù một mặt lưu ý, bạn không phải vô hiệu hóa lưu trữ trang web tĩnh. Chỉ cần loại bỏ chính sách xô cho phép truy cập công cộng là đủ.
Torsten

Điều này thực sự hữu ích, thông báo bị cấm xuất phát từ S3 mà tôi không nhận ra lúc đầu, vì vậy bạn phải nắm bắt điều đó với một trang lỗi tùy chỉnh để SPA của bạn hoạt động.
Ivan

4

Trong trường hợp của tôi, tôi đã sử dụng nhiều nguồn gốc với các Hành vi "Mẫu đường dẫn" cùng với Đường dẫn gốc trong nhóm S3 của mình:

Thiết lập xấu:

Hành vi của CloudFront: /images/*->My-S3-origin

My-S3-origin: Origin Path: /images

Tệp S3: /images/my-image.jpg

NHẬN Yêu cầu: /images/my-image.jpg -> 403

Điều đang xảy ra là toàn bộ yêu cầu GET của CloudFront được gửi đến nguồn gốc: được /image/my-image.jpgtiền tố bởi Origin Path: /imagesvì vậy, yêu cầu vào S3 trông giống như /images/images/my-image.jpgkhông tồn tại.

Giải pháp

xóa đường dẫn gốc.

Điều này cho phép tôi truy cập nhóm với danh tính truy cập nguồn gốc và quyền hạn nhóm và quyền hạn tệp riêng lẻ bị hạn chế.


1

Trong trường hợp của tôi, tôi đã cấu hình sai lộ 53. Tôi đã tạo một Bí danh trên miền của mình nhưng chỉ nó vào Nhóm S3 thay vì phân phối CloudFront.

Ngoài ra tôi bỏ qua các đối tượng gốc mặc định. Bảng điều khiển thực sự có thể được cải thiện nếu họ thêm một chút thông tin vào văn bản dấu chấm hỏi về hậu quả tiềm ẩn của việc bỏ qua nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.