Menyimpan dan melayani file dengan aman untuk banyak klien

8

Kami sedang mengerjakan aplikasi web, tempat (di antara fitur lainnya) pengguna kami dapat mengunggah file mereka. Namun kami tidak dapat menyimpan file-file ini di VPS kami karena ruang penyimpanan terbatas, jadi kami memutuskan untuk menggunakan S3.

Masalah utama adalah kita harus memastikan pengguna hanya dapat mengakses data mereka sendiri. Jadi kami menyimpan daftar file dalam database kami, dan daftar pengguna yang memiliki akses ke sana. Server kami dapat dengan mudah memutuskan apakah pengguna memiliki, atau tidak, akses ke file. Tetapi bagaimana sebenarnya melayani file untuk pengguna?

Ada beberapa kemungkinan yang telah saya pertimbangkan, namun tidak satu pun dari mereka yang tampaknya menjadi yang terbaik.

1. Menghasilkan (kedaluwarsa) url yang ditandatangani dengan PHP

Ini adalah pendekatan yang sangat sederhana, juga cepat tetapi menghasilkan url yang sangat jelek dan panjang.

Begini cara melakukannya .

2. URL yang dikaburkan

Ini berarti, bahwa kita menyimpan file publik untuk membaca pada S3, tapi semua file yang disimpan dalam hard menebak bernama folder seperti: 24fa0b8ef0ebb6e99c64be8092d3ede20000. Namun, mungkin ini bukan cara yang paling aman untuk dilakukan. Bahkan jika Anda tidak pernah dapat menebak nama folder, setelah Anda mengetahuinya (karena Anda benar-benar memiliki akses ke sana), Anda dapat membagikan tautan itu kepada siapa saja (dengan orang yang tidak berwenang).

3. Unduh file melalui server kami

Ini berarti bahwa file-file tersebut tidak dilayani secara langsung oleh S3, tetapi server kami terlebih dahulu membacanya dengan aman dan menyajikannya. Kami benar-benar tidak menginginkan ini :)

4. Memeriksa pengarah

The Redup URL solusi dapat ditingkatkan dengan "memastikan" permintaan berasal dari server kami (Anda dapat mengatur S3 untuk memeriksa pengarah). Namun ini akan menjadi solusi yang sangat tidak bisa diandalkan, karena tidak semua browser mengirim data pengarah, dan itu juga bisa dipalsukan.

Apa cara yang baik untuk melayani file dari Amazon S3 dengan aman untuk klien yang berbeda?

Tamás Pap
sumber
1
Mengapa Anda peduli dengan URL yang jelek / panjang? Anda tidak membuat pengguna mengetiknya, bukan?
ceejayoz
Saya benar-benar percaya bahwa url adalah bagian dari pengalaman pengguna, dan kami tidak ingin mereka terlalu lama dan jelek :)
Tamás Pap
2
Keamanan dan stabilitas seharusnya menghasilkan URL yang cantik dalam hal ini, menurut saya. Ini bukan tautan permanen ke posting blog.
ceejayoz

Jawaban:

12

Ini benar-benar berbatasan dengan "Do my system architecture" untuk Anda, tetapi keempat ide Anda adalah studi kasus yang menarik dalam keamanan variabel, jadi mari kita jalankan opsi Anda dan lihat bagaimana harganya:


4. Memeriksa pengarah

Perujuk disediakan oleh klien. Mempercayai data autentikasi / otorisasi yang disediakan klien cukup banyak mengosongkan keamanan (saya hanya bisa mengklaim telah dikirim dari tempat Anda mengharapkan saya berasal).
Putusan: ide TERRIBAD - sepele untuk memotong.


3. Unduh file melalui server kami

Bukan ide yang buruk, selama Anda bersedia menghabiskan bandwidth untuk mewujudkannya, dan server Anda dapat diandalkan.
Berasumsi bahwa Anda telah menyelesaikan masalah keamanan untuk server / aplikasi normal Anda, ini adalah opsi yang paling aman yang Anda sajikan.
Putusan: Solusi yang bagus. Sangat aman, tetapi mungkin suboptimal jika bandwidth merupakan faktor.


2. URL yang dikaburkan

Keamanan Melalui Ketidakjelasan ? Betulkah? Tidak.
Aku bahkan tidak akan menganalisisnya. Tidak, tidak.
Putusan: Jika # 4 adalah TERRIBAD ini adalah TERRIWORSE karena orang-orang bahkan tidak perlu melalui upaya menempa header referer. Tebak string dan menangkan hadiah semua data!


1. Menghasilkan (kedaluwarsa) url yang ditandatangani dengan PHP

Opsi ini memiliki hasil menghisap yang cukup rendah.
Siapa pun dapat mengklik URL dan mengambil data, yang merupakan keamanan tidak-tidak, tetapi Anda mengurangi ini dengan membuat tautan kedaluwarsa (selama umur tautan cukup singkat, jendela kerentanan kecil).
URL yang kedaluwarsa mungkin mengganggu beberapa pengguna yang ingin bertahan pada tautan unduhan untuk waktu yang lama, atau yang tidak mendapatkan tautan tepat waktu - itu sedikit dari Pengalaman Pengguna yang menghisap, tetapi mungkin layak untuk dilakukan. .
Putusan : Tidak sebagus # 3, tetapi jika bandwidth menjadi perhatian utama tentu lebih baik dari # 4 atau # 2.


Apa yang akan saya lakukan?

Dengan opsi-opsi ini, saya akan menggunakan # 3 - Lewati file melalui server front-end Anda sendiri, dan otentikasi seperti yang biasanya dilakukan aplikasi Anda. Dengan asumsi keamanan normal Anda cukup baik, ini adalah opsi terbaik dari sudut pandang keamanan.
Ya, ini berarti lebih banyak penggunaan bandwidth di server Anda, dan lebih banyak sumber daya bermain perantara - tetapi Anda selalu dapat menagih sedikit lebih banyak untuk itu.

voretaq7
sumber
Ini adalah analisis yang sangat membantu, dan saya sangat berterima kasih karenanya. Manfaat besar lain dari # 3 adalah bahwa - karena url ke file tidak pernah berubah - kita bisa sangat menggunakan cache browser. Sekali lagi terima kasih atas waktunya.
Tamás Pap
@TamasPap yang merupakan keuntungan # 3 untuk memastikan - seberapa besar keuntungan tergantung pada seberapa agresif Anda dapat mengkonfigurasi caching (dan seberapa sering orang mengakses file-file ini dari mesin "baru").
voretaq7
4

Gunakan kueri Amazon S3 yang telah ditandatangani untuk melayani objek S3 langsung ke pengguna setelah melakukan validasi pengguna apa pun yang Anda inginkan. Metode ini menciptakan URL terbatas waktu yang dapat digunakan untuk mengarahkan ulang pengguna.

Michael Hampton
sumber
0

Ada cara lain juga.

Anda dapat mengarahkan AWS CloudFront ke Bucket S3 Anda dan menggunakan Cookie yang Ditandatangani untuk menayangkan konten dengan aman bagi pengguna akhir Anda.

Pengguna akhir harus masuk ke server Anda untuk mendapatkan Cookie yang Ditandatangani yang kemudian akan dikirim ke CDN saat mengakses file apa pun.

prcoder
sumber