it-swarm-id.com

Mengamankan Cookie Sesi

Saat mencari metode untuk membuat cookie sesi aman saya menemukan publikasi ini: Protokol Cookie Aman . Itu mengusulkan rumus berikut untuk cookie sesi:

cookie = user | expiration | data_k | mac

dimana

  • | Menunjukkan penggabungan.
  • user adalah nama pengguna klien.
  • expiration adalah waktu kedaluwarsa cookie.
  • data_k Adalah data terenkripsi yang dikaitkan dengan klien (seperti ID sesi atau informasi keranjang belanja) yang dienkripsi menggunakan kunci k.
    • k berasal dari kunci server pribadi sk; k = HMAC(user | expiration, sk).
    • data_k Dapat dienkripsi menggunakan AES menggunakan kunci k.
  • mac adalah HMAC cookie untuk memverifikasi keaslian cookie; mac = HMAC(user | expiration | data | session-key, k).
    • data adalah data tidak terenkripsi yang terkait dengan klien.
    • session-key Adalah kunci sesi SSL.
  • HMAC adalah HMAC-MD5 atau HMAC-SHA1.

Menurut koran itu, ia memberikan kerahasiaan cookie, dan mencegah terhadap serangan replay dan volume. Bagi saya (menjadi amatir dalam keamanan/kriptografi) ini terlihat cukup bagus. Seberapa baik metode ini untuk cookie sesi atau cookie secara umum?

35
user369450

Ya, ini terlihat seperti skema yang cukup bagus untuk melindungi cookie.

Skema lain yang lebih baru di area ini adalah SCS: Secure Cookie Sessions for HTTP , yang merupakan skema yang solid, dipikirkan dengan sangat baik. Saya sarankan membaca diskusi keamanan dokumen itu untuk mendapatkan pemahaman yang baik tentang apa ancaman keamanan mungkin.

Untuk membantu memahami tujuan dan peran skema cookie yang Anda sebutkan, izinkan saya mencadangkan dan memberikan beberapa konteks. Sudah umum bahwa aplikasi web perlu mempertahankan status sesi: mis., Beberapa status yang masa pakainya terbatas pada sesi saat ini, dan itu terikat pada sesi saat ini. Ada dua cara untuk mempertahankan status sesi:

  1. Menyimpan status sesi di server. Server web memberi makan cookie sesi browser: cookie yang satu-satunya tujuannya adalah untuk menahan bit-string yang besar dan tidak dapat diakses yang berfungsi sebagai pengidentifikasi sesi. Server menyimpan tabel pencarian, dengan satu entri per sesi terbuka, yang memetakan dari pengidentifikasi sesi ke semua status sesi yang terkait dengan sesi ini. Ini memudahkan kode aplikasi web untuk mengambil dan memperbarui status sesi yang terkait dengan permintaan HTTP/HTTPS tertentu. Sebagian besar kerangka kerja aplikasi web menyediakan dukungan bawaan untuk menyimpan status sesi di sisi server.

    Ini adalah cara paling aman untuk menyimpan status sesi. Karena keadaan sesi disimpan di server, klien tidak memiliki akses langsung ke sana. Oleh karena itu, tidak ada cara bagi penyerang untuk membaca atau merusak status sesi (atau memutar ulang nilai-nilai lama). Memang diperlukan beberapa pekerjaan tambahan untuk menjaga status sesi disinkronkan di semua server, jika aplikasi web Anda didistribusikan di beberapa node komputasi back-end.

  2. Simpan status sesi pada klien. Pendekatan lain adalah dengan menempatkan status sesi dalam cookie dan mengirim cookie ke browser. Sekarang setiap permintaan berikutnya dari browser akan menyertakan status sesi. Jika aplikasi web ingin mengubah status sesi, itu dapat mengirim cookie yang diperbarui ke browser.

    Jika dilakukan secara naif, ini adalah lubang keamanan besar, karena memungkinkan klien jahat untuk melihat dan mengubah status sesi. Yang pertama adalah masalah jika ada data rahasia yang termasuk dalam status sesi. Yang terakhir adalah masalah jika server mempercayai atau bergantung pada status sesi dengan cara apa pun (misalnya, pertimbangkan jika status sesi menyertakan nama pengguna pengguna yang masuk, dan sedikit menunjukkan apakah pengguna itu adalah administrator atau tidak; maka klien jahat dapat mem-bypass mekanisme otentikasi aplikasi web).

    Proposal yang Anda sebutkan, dan skema SCS, dimaksudkan untuk bertahan melawan risiko ini sebaik mungkin. Mereka dapat melakukannya dengan cara yang sebagian besar berhasil. Namun, mereka tidak dapat mencegah klien jahat menghapus cookie (dan dengan demikian menghapus status sesi). Selain itu, mereka tidak dapat mencegah klien jahat memutar ulang nilai cookie yang lebih lama (dan dengan demikian mengatur ulang status sesi ke nilai yang lebih lama), jika versi yang lebih lama berasal dari dalam sesi yang sama. Oleh karena itu, pengembang aplikasi web harus mewaspadai risiko ini dan berhati-hati dengan nilai apa yang disimpan dalam status sesi.

Karena alasan ini, menyimpan status sesi dalam cookie sedikit lebih berisiko daripada menyimpannya di server, bahkan jika Anda menggunakan salah satu skema kriptografi ini untuk melindungi cookie. (Namun, jika Anda akan menyimpan status sesi dalam cookie, saya sarankan Anda menggunakan salah satu dari dua skema ini untuk melindungi nilai-nilai dalam cookie. )

Mengapa ada orang yang menyimpan status sesi dalam cookie, mengingat hal itu dapat dengan mudah disimpan di sisi server? Sebagian besar waktu, tidak ada alasan untuk itu. Namun, dalam beberapa kasus luar biasa - seperti server HTTP yang sangat terbatas dalam jumlah penyimpanan yang dimilikinya, atau dalam aplikasi web seimbang yang didistribusikan di beberapa mesin tanpa dukungan yang baik untuk keadaan sesi yang disinkronkan - mungkin ada Alasan yang dapat dibenarkan untuk mempertimbangkan menyimpan status sesi dalam cookie, dan kemudian menggunakan salah satu skema ini adalah ide yang bagus.

P.S. Topik terkait: jika Anda menggunakan ASP.NET View State , pastikan Anda mengkonfigurasinya untuk dienkripsi dan dikonfirmasi: yaitu, konfigurasikan ViewStateEncryptionMode ke Always dan EnableViewStateMac hingga true; jika Anda menggunakan beberapa node server, buat kunci kriptografi yang kuat dan konfigurasikan machineKey setiap server untuk menggunakan kunci it . Akhirnya, pastikan Anda memiliki versi terbaru kerangka kerja ASP.NET; versi lama memiliki kelemahan keamanan seriusdalam crypto ViewState .

30
D.W.

Masalah apa yang Anda sedang coba pecahkan?

Ada dua hal yang dapat saya pikirkan:

  1. Anda ingin mengatur sesi pengguna yang aman. Dalam hal ini, Anda kemungkinan besar bahkan tidak perlu membuat cookie sesi Anda sendiri - mereka dapat dihasilkan melalui sesi SSL dengan server Anda dan umumnya aman untuk kebutuhan situs web apa pun. Pastikan situs mengimplementasikan SSL dengan benar, dan Anda menggunakan metode pembuatan sesi yang terkenal seperti dapat ditemukan dalam bahasa umum seperti PHP atau ASP.
  2. Anda ingin menyimpan data aman di cookie untuk pengambilan nanti. Ini jauh lebih sulit untuk dibuat aman, karena banyak masalah dengan cookie. Lebih baik menyimpan sisi server, dan mengaitkan data dengan pengguna menggunakan metode lain. Jika Anda harus melakukan ini, metode yang Anda gambarkan terlihat cukup bagus secara keseluruhan, meskipun saya tidak jelas bagaimana mencegah serangan replay, atau serangan lain seperti manusia di tengah-tengah seperti yang dilakukan SSL.

Jangan ragu untuk menghubungi saya secara langsung jika Anda ingin membahas lebih lanjut.

4
Charlie B

Bagian dari metode yang mereka usulkan adalah menggunakan kunci sesi SSL sebagai bagian dari muatan terenkripsi - tetapi ini hanya berlangsung selama sesi SSL - yaitu, Anda tidak dapat menggunakan metode ini untuk cookie yang dimaksudkan untuk menjangkau lebih dari satu sesi browser. Ini juga tidak sepele; untuk mendapatkan kunci sesi SSL, terutama dari terminasi SSL di tempat lain selain di server http.

Dalam praktiknya, ini jauh lebih mudah untuk menggunakan nilai acak untuk cookie sebagai pegangan untuk data yang disimpan di server. Ini dapat dikaitkan dengan hal-hal seperti hash dari agen pengguna browser dan netname (tidak alamat IP) dari klien. Dan/atau, jika Anda harus, kunci sesi SSL di server. Tidak perlu mengenkripsi semua data ini dan Dorong keluar ke klien.

2
symcbean

Ini adalah implementasi yang masuk akal karena memecahkan masalah:

  • Non-repudiation (memverifikasi nilai tidak berubah)
  • Kerahasiaan (bahwa konten yang dienkripsi tidak dapat dibaca)

Namun, informasi pengguna agak lemah dan jika tidak dimasukkan dalam informasi terenkripsi untuk perbandingan nanti dapat dikompromikan.

Masalah terbesar dengan cookie atau data yang dapat diakses klien adalah bahwa klien (peretas) dapat memodifikasi atau menyalinnya. Pembajakan sesi mudah dilakukan meskipun SSL (seperti yang sebelumnya dikomentari sudah mencukupi - yang sebenarnya tidak). Berbagai bentuk malware, man-in-the-middle, man-in-the-browser dan serangan lainnya dapat menangkap cookie sesi, menyalinnya ke komputer lain dan sekarang mereka dapat 'memiliki' sesi itu. Untuk sistem card-on-file seperti Amazon ini bisa bermasalah.

Untuk menutup loop pada proposal ini, identifikasi klien harus cukup unik dan kemudian diikat ke data di bagian terenkripsi untuk mencegah komputer lain mencuri cookie sesi. Selain itu, komponen-komponen dalam proposal tampak masuk akal.

0
Darrell Teague