Saya menerapkan unggahan file langsung dari mesin klien ke Amazon S3 melalui REST API hanya menggunakan JavaScript, tanpa kode sisi server. Semua berfungsi dengan baik tetapi satu hal yang mengkhawatirkan saya ...
Ketika saya mengirim permintaan ke Amazon S3 REST API, saya harus menandatangani permintaan dan memasukkan tanda tangan ke Authentication
header. Untuk membuat tanda tangan, saya harus menggunakan kunci rahasia saya. Tetapi semua hal terjadi di sisi klien, jadi, kunci rahasia dapat dengan mudah diungkapkan dari sumber halaman (bahkan jika saya mengaburkan / mengenkripsi sumber saya).
Bagaimana saya bisa menangani ini? Dan apakah itu masalah? Mungkin saya dapat membatasi penggunaan kunci privat khusus hanya untuk panggilan REST API dari Origin CORS spesifik dan hanya pada metode PUT dan POST atau mungkin menghubungkan kunci hanya dengan S3 dan bucket tertentu? Mungkin ada metode otentikasi lain?
Solusi "Serverless" sangat ideal, tetapi saya dapat mempertimbangkan untuk melibatkan beberapa pemrosesan di sisi server, tidak termasuk mengunggah file ke server saya dan kemudian mengirim ke S3.
Jawaban:
Saya pikir yang Anda inginkan adalah Upload Berbasis Browser Menggunakan POST.
Pada dasarnya, Anda memang membutuhkan kode sisi server, tetapi yang dilakukannya hanyalah menghasilkan kebijakan yang ditandatangani. Setelah kode sisi klien memiliki kebijakan yang ditandatangani, ia dapat mengunggah menggunakan POST langsung ke S3 tanpa data melalui server Anda.
Inilah tautan resmi dokumen:
Diagram: http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.html
Kode contoh: http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html
Kebijakan yang ditandatangani akan masuk dalam html Anda dalam bentuk seperti ini:
Perhatikan tindakan FORMULIR mengirimkan file langsung ke S3 - bukan melalui server Anda.
Setiap kali salah satu pengguna Anda ingin mengunggah file, Anda akan membuat
POLICY
danSIGNATURE
di server Anda. Anda mengembalikan halaman ke browser pengguna. Pengguna kemudian dapat mengunggah file langsung ke S3 tanpa melalui server Anda.Saat Anda menandatangani polis, biasanya polis Anda akan kedaluwarsa setelah beberapa menit. Ini memaksa pengguna Anda untuk berbicara dengan server Anda sebelum mengunggah. Ini memungkinkan Anda memantau dan membatasi unggahan jika diinginkan.
Satu-satunya data yang masuk atau dari server Anda adalah URL yang ditandatangani. Kunci rahasia Anda tetap dirahasiakan di server.
sumber
${filename}
nama kunci, jadi untuk contoh di atas,user/eric/${filename}
bukan hanyauser/eric
. Jikauser/eric
folder sudah ada, unggahan akan gagal secara diam-diam (Anda bahkan akan dialihkan ke success_action_redirect) dan konten yang diunggah tidak akan ada di sana. Hanya menghabiskan berjam-jam men-debug pemikiran ini adalah masalah izin.Anda dapat melakukannya dengan AWS S3 Cognito, coba tautan ini di sini:
http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html#Amazon_S3
Coba juga kode ini
Cukup ubah Wilayah, IdentityPoolId, dan nama bucket Anda
sumber
Anda mengatakan Anda menginginkan solusi "tanpa server". Tetapi itu berarti Anda tidak memiliki kemampuan untuk memasukkan kode "Anda" apa pun di loop. (CATATAN: Setelah Anda memberikan kode kepada klien, itu adalah kode "mereka" sekarang.) Mengunci CORS tidak akan membantu: Orang dapat dengan mudah menulis alat yang tidak berbasis web (atau proxy berbasis web) yang menambahkan header CORS yang benar untuk menyalahgunakan sistem Anda.
Masalah besar adalah bahwa Anda tidak dapat membedakan antara pengguna yang berbeda. Anda tidak dapat mengizinkan satu pengguna untuk membuat daftar / mengakses file-nya, tetapi mencegah orang lain melakukannya. Jika Anda mendeteksi penyalahgunaan, tidak ada yang dapat Anda lakukan selain mengubah kunci. (Yang penyerang mungkin bisa dapatkan lagi.)
Taruhan terbaik Anda adalah membuat "pengguna IAM" dengan kunci untuk klien javascript Anda. Hanya berikan akses tulis ke satu ember saja. (tapi idealnya, jangan aktifkan operasi ListBucket, yang akan membuatnya lebih menarik bagi penyerang.)
Jika Anda memiliki server (bahkan mikro instan sederhana dengan harga $ 20 / bulan), Anda bisa menandatangani kunci di server Anda sambil memantau / mencegah penyalahgunaan secara realtime. Tanpa server, yang terbaik yang dapat Anda lakukan adalah memantau penyalahgunaan secara berkala. Inilah yang akan saya lakukan:
1) secara berkala putar kunci untuk pengguna IAM itu: Setiap malam, buat kunci baru untuk pengguna IAM itu, dan ganti kunci yang tertua. Karena ada 2 kunci, setiap kunci akan berlaku selama 2 hari.
2) aktifkan S3 logging, dan unduh log setiap jam. Tetapkan lansiran pada "terlalu banyak unggahan" dan "terlalu banyak unduhan". Anda akan ingin memeriksa ukuran total file dan jumlah file yang diunggah. Dan Anda akan ingin memantau total global, dan juga total alamat per-IP (dengan ambang batas yang lebih rendah).
Pemeriksaan ini dapat dilakukan "tanpa server" karena Anda dapat menjalankannya di desktop. (Yaitu S3 melakukan semua pekerjaan, proses ini hanya ada di sana untuk mengingatkan Anda untuk penyalahgunaan ember S3 Anda sehingga Anda tidak mendapatkan tagihan AWS raksasa di akhir bulan.)
sumber
Menambahkan lebih banyak info ke jawaban yang diterima, Anda dapat merujuk ke blog saya untuk melihat versi kode yang sedang berjalan, menggunakan AWS Signature versi 4.
Akan diringkas di sini:
Segera setelah pengguna memilih file yang akan diunggah, lakukan hal berikut: 1. Melakukan panggilan ke server web untuk memulai layanan untuk menghasilkan params yang diperlukan
Dalam layanan ini, lakukan panggilan ke layanan AWS IAM untuk mendapatkan kredit sementara
Setelah Anda memiliki kredibilitas, buat kebijakan bucket (string 64 dikodekan basis). Kemudian tanda tangani kebijakan ember dengan kunci akses rahasia sementara untuk menghasilkan tanda tangan akhir
kirim parameter yang diperlukan kembali ke UI
Setelah ini diterima, buat objek bentuk html, atur params yang diperlukan dan POST.
Untuk info terperinci, silakan merujuk https://wordpress1763.wordpress.com/2016/10/03/browser-based-upload-aws-signature-version-4/
sumber
Di sinilah Anda salah paham. Alasan utama tanda tangan digital digunakan adalah agar Anda dapat memverifikasi sesuatu sebagai benar tanpa mengungkapkan kunci rahasia Anda. Dalam hal ini tanda tangan digital digunakan untuk mencegah pengguna dari memodifikasi kebijakan yang Anda tetapkan untuk posting bentuk.
Tanda tangan digital seperti yang ada di sini digunakan untuk keamanan di seluruh web. Jika seseorang (NSA?) Benar-benar dapat menghancurkan mereka, mereka akan memiliki target yang jauh lebih besar daripada ember S3 Anda :)
sumber
Saya telah memberikan kode sederhana untuk mengunggah file dari browser Javascript ke AWS S3 dan mendaftar semua file dalam bucket S3.
Langkah:
Untuk mengetahui cara membuat Buat IdentityPoolId http://docs.aws.amazon.com/cognito/latest/developerguide/identity-pools.html
Goto S3's console page dan buka konfigurasi cors dari bucket properties dan tulis kode XML berikut ini.
Buat file HTML yang berisi kode berikut, ubah kredensial, buka file di browser, dan nikmati.
sumber
Jika Anda tidak memiliki kode sisi server, keamanan Anda tergantung pada keamanan akses ke kode JavaScript Anda di sisi klien (yaitu setiap orang yang memiliki kode dapat mengunggah sesuatu).
Jadi saya akan merekomendasikan, untuk hanya membuat ember S3 khusus yang dapat ditulis untuk umum (tetapi tidak dapat dibaca), sehingga Anda tidak memerlukan komponen yang ditandatangani di sisi klien.
Nama bucket (misalnya GUID) akan menjadi satu-satunya pertahanan Anda terhadap unggahan berbahaya (tetapi penyerang potensial tidak dapat menggunakan ember Anda untuk mentransfer data, karena itu hanya ditulis untuknya)
sumber
Inilah cara Anda membuat dokumen kebijakan menggunakan node dan serverless
Objek konfigurasi yang digunakan disimpan di SSM Parameter Store dan terlihat seperti ini
sumber
Jika Anda bersedia menggunakan layanan pihak ke-3, auth0.com mendukung integrasi ini. Layanan auth0 menukar otentikasi layanan SSO pihak ke-3 untuk token sesi sementara AWS akan membatasi izin.
Lihat: https://github.com/auth0-samples/auth0-s3-sample/
dan dokumentasi auth0.
sumber