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.
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?
Jawaban:
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
hadiahsemua 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.
sumber
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.
sumber
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.
sumber