Lưu trữ và phục vụ các tệp một cách an toàn cho nhiều khách hàng


8

Chúng tôi đang làm việc trên một ứng dụng web, trong đó (trong số các tính năng khác) người dùng của chúng tôi có thể tải lên các tệp của họ. Tuy nhiên, chúng tôi không thể lưu trữ các tệp này trên VPS của mình vì dung lượng lưu trữ bị hạn chế, vì vậy chúng tôi đã quyết định sử dụng S3.

Vấn đề chính là chúng tôi phải đảm bảo người dùng chỉ có thể truy cập dữ liệu của riêng họ. Vì vậy, chúng tôi giữ danh sách các tệp trong cơ sở dữ liệu của chúng tôi và danh sách người dùng có quyền truy cập vào chúng. Máy chủ của chúng tôi có thể dễ dàng quyết định xem người dùng có quyền truy cập vào tệp hay không. Nhưng làm thế nào để thực sự phục vụ các tập tin cho người dùng?

Có một số khả năng tôi đã xem xét, tuy nhiên không có khả năng nào trong số chúng thực sự là tốt nhất.

1. Tạo (hết hạn) các url đã ký với PHP

Đây là một cách tiếp cận thực sự đơn giản, nó cũng nhanh nhưng kết quả là các url rất rất xấu xí và dài.

Đây là cách để làm điều đó .

2. URL bị che khuất

Điều này có nghĩa là, chúng tôi giữ các tệp công khai để đọc trên S3, nhưng tất cả các tệp được lưu trữ trong các thư mục có tên khó đoán như : 24fa0b8ef0ebb6e99c64be8092d3ede20000. Tuy nhiên, có lẽ đây không phải là cách an toàn nhất để đi. Ngay cả khi bạn không bao giờ có thể đoán tên thư mục, sau khi bạn biết nó (vì bạn thực sự có quyền truy cập vào nó), bạn có thể chia sẻ liên kết đó với bất kỳ ai (với bất kỳ người nào không được ủy quyền).

3. Tải tập tin qua máy chủ của chúng tôi

Điều này có nghĩa là các tệp không được S3 phục vụ trực tiếp, nhưng trước tiên máy chủ của chúng tôi sẽ đọc nó một cách an toàn và phục vụ nó. Chúng tôi thực sự không muốn điều này :)

4. Kiểm tra người giới thiệu

Các bị xáo trộn URL giải pháp có thể được cải thiện bằng "đảm bảo" yêu cầu đến từ máy chủ của chúng tôi (bạn có thể thiết lập S3 để kiểm tra tham chiếu). Tuy nhiên đây sẽ là một giải pháp rất không đáng tin cậy, bởi vì không phải tất cả các trình duyệt đều gửi dữ liệu giới thiệu và nó cũng có thể bị làm giả.

Cách tốt để phục vụ các tệp từ Amazon S3 an toàn cho các khách hàng khác nhau là gì?


1
Tại sao bạn quan tâm đến URL xấu / dài? Bạn không làm cho người dùng gõ nó, phải không?
ceejayoz

Tôi thực sự tin rằng các url là một phần của trải nghiệm người dùng và chúng tôi không muốn chúng quá dài và xấu xí :)
Tamás Pap

2
Bảo mật và ổn định sẽ chiếm ưu thế trong các URL đẹp trong trường hợp này, tôi nói. Đây không phải là permalinks cho bài viết trên blog.
ceejayoz

Câu trả lời:


12

Điều này thực sự giáp với "Làm kiến ​​trúc hệ thống của tôi" cho bạn, nhưng bốn ý tưởng của bạn là những nghiên cứu tình huống thú vị về bảo mật biến đổi, vì vậy hãy chạy các tùy chọn của bạn và xem giá vé của chúng như thế nào:


4. Kiểm tra người giới thiệu

Người giới thiệu được cung cấp bởi khách hàng. Tin tưởng vào dữ liệu xác thực / ủy quyền do khách hàng cung cấp khá nhiều bảo mật khoảng trống (tôi chỉ có thể tuyên bố đã được gửi từ nơi bạn mong đợi tôi đến từ đó). Phán
quyết: Ý tưởng TERRIBAD - tầm thường để bỏ qua.


3. Tải tập tin qua máy chủ của chúng tôi

Một ý tưởng không tồi, miễn là bạn sẵn sàng dành băng thông để thực hiện và máy chủ của bạn đáng tin cậy.
Giả định rằng bạn đã giải quyết vấn đề bảo mật cho máy chủ / ứng dụng thông thường của mình, đây là cách an toàn nhất trong số các tùy chọn bạn đã trình bày.
Bản án: Giải pháp tốt. Rất an toàn, nhưng có thể không tối ưu nếu băng thông là một yếu tố.


2. URL bị che khuất

An ninh thông qua che khuất ? Có thật không? Không.
Tôi thậm chí sẽ không phân tích nó. Không. Phán
quyết: Nếu # 4 là TERRIBAD thì đây là TERRIWORSE vì mọi người thậm chí không phải trải qua nỗ lực giả mạo tiêu đề người giới thiệu. Đoán chuỗi và giành giải thưởng tất cả các dữ liệu!


1. Tạo (hết hạn) các url đã ký với PHP

Tùy chọn này có thương số hút khá thấp.
Bất cứ ai cũng có thể nhấp vào URL và đánh cắp dữ liệu, đây là một bảo mật không có, nhưng bạn giảm thiểu điều này bằng cách làm cho liên kết hết hạn (miễn là thời gian liên kết đủ ngắn, cửa sổ lỗ hổng nhỏ).
URL hết hạn có thể gây bất tiện cho một số người dùng muốn truy cập liên kết tải xuống trong một thời gian dài hoặc không nhận được liên kết kịp thời - đó là một chút kinh nghiệm của người dùng, nhưng nó có thể đáng giá .
Phán quyết : Không tốt bằng # 3, nhưng nếu băng thông là mối quan tâm chính thì chắc chắn tốt hơn # 4 hoặc # 2.


Tôi sẽ làm gì?

Đưa ra các tùy chọn này, tôi sẽ đi với số 3 - Chuyển các tệp qua máy chủ ngoại vi của riêng bạn và xác thực cách ứng dụng của bạn thường làm. Giả sử bảo mật thông thường của bạn là khá tốt, đây là lựa chọn tốt nhất từ ​​quan điểm bảo mật.
Vâng, điều này có nghĩa là sử dụng nhiều băng thông hơn trên máy chủ của bạn và nhiều tài nguyên hơn khi chơi trung gian - nhưng bạn luôn có thể sạc thêm một chút cho việc đó.


Đây là một phân tích thực sự hữu ích và tôi rất biết ơn vì điều đó. Một lợi ích lớn khác của # 3 là - vì url của tệp không bao giờ thay đổi - chúng tôi có thể sử dụng rất nhiều bộ nhớ đệm trình duyệt. Cảm ơn bạn một lần nữa cho bạn thời gian.
Tamás Pap

@TamasPap là một lợi thế của # 3 để chắc chắn - lợi thế lớn như thế nào phụ thuộc vào mức độ mạnh mẽ của bạn có thể định cấu hình bộ đệm (và tần suất mọi người truy cập các tệp này từ các máy "mới").
voretaq7


0

Có một cách khác là tốt.

Bạn có thể trỏ AWS CloudFront vào Nhóm S3 của mình và sử dụng Cookies đã ký để phân phát nội dung một cách an toàn cho người dùng cuối của bạn.

Người dùng cuối cần đăng nhập vào máy chủ của bạn để nhận Cookies đã ký sau đó sẽ được gửi tới CDN trong khi truy cập bất kỳ tệp nào.

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.