Saya perlu cara untuk melacak dan membatasi sesi web ke aplikasi web. "Sesi" secara longgar didefinisikan sebagai satu-satunya pengguna yang menelusuri halaman aplikasi web tersebut. Saya pikir itu dapat diterjemahkan ke:
- sebuah sesi didefinisikan sebagai tuple
<clientIP,vHost>
sebagai alternatif<clientIP,serverIP,serverPort>
atau<cookie,vHost>
, tergantung pada layer dan data yang tersedia - sesi dimulai setelah pengguna mengirim data otentikasi ke URI login yang ditentukan
- sesi berakhir setelah pengguna menekan URI logout yang ditentukan
- sesi berakhir jika batas waktu yang ditentukan telah kedaluwarsa setelah klien meminta objek terakhir
Setelah batas sesi yang ditentukan telah tercapai, pengguna berikutnya harus diarahkan ke halaman kesalahan khusus. Saya juga membutuhkan cara untuk melacak jumlah sesi saat ini untuk keperluan pemantauan dan kemampuan untuk memasukkan daftar putih server pemantauan (yang mengeluarkan permintaan ke webapp secara berkala) dan membebaskannya dari batas.
Apa yang bisa saya kerjakan:
- RadWare AppDirector di mana aplikasi web memiliki layanan sendiri yang ditentukan dan berjalan dalam mode proxy terbalik
- Apache 2.2
- SLES 11 SP2
Saya lebih suka tidak melibatkan server proxy tambahan, meskipun akan mempertimbangkannya jika tidak ada pilihan lain yang tersisa.
Alasan di balik semua ini adalah bahwa aplikasi web tersebut dengan mudah kelebihan beban dan mulai menolak permintaan secara tidak menentu, mengecewakan pengguna yang bekerja yang (biasanya) kehilangan data entri formulir dalam proses. Dengan menetapkan batas di mana kondisi kelebihan muatan lebih kecil kemungkinannya, kami berharap dapat menciptakan kondisi kegagalan yang terdefinisi dengan baik di mana pengguna akan diminta untuk kembali nanti jika beban cenderung meningkat.
Sunting : aplikasi web adalah implementasi 3-tier dengan tier pertama (lapisan presentasi, diimplementasikan sebagai kode CGI dalam Apache vHost) yang agak sederhana dan tampaknya terbatas pada penanganan kesalahan dasar dan meminta penyeimbangan muatan di antara server aplikasi. Itu tidak memaksakan beban signifikan pada server web yang dijalankan - ini sebabnya kami menjalankannya dalam mode failover belaka (tanpa penyeimbangan beban) di pertanian AppDirector, yang seharusnya menyederhanakan banyak hal.
Segala sesuatu di luar titik ini pada dasarnya adalah kotak hitam bagi kami - pada tingkat data kami memiliki database MSSQL, tetapi hampir tidak mungkin untuk mendapatkan informasi yang berarti tentang struktur tabel dari vendor. Server aplikasi adalah sumber tertutup, vendor telah menggunakan kerangka kerja yang agak komprehensif untuk implementasi, tetapi tampaknya tidak dapat menjawab pertanyaan terkait operasi yang bahkan lebih kompleks.
sumber
Jawaban:
Masalah yang akhirnya Anda coba selesaikan adalah dengan kapasitas aplikasi - dan di situlah Anda harus menyelesaikan masalahnya. Tidak satu pun dari komponen yang Anda sebutkan berhubungan dengan manajemen sesi untuk aplikasi HTTP.
Ada beberapa trik yang dapat Anda terapkan dengan modul terbaru di iptables atau menggunakan fail2ban dengan cara yang berlawanan dengan tujuan dirancangnya - tetapi keduanya membutuhkan pemahaman yang sangat terperinci tentang alat dan domain masalah. Anda bisa menerapkan kontrol akses di tingkat komponen ini tetapi didorong oleh informasi negara yang dipublikasikan dari aplikasi pada jumlah sesi.
Dengan asumsi, untuk saat ini, bahwa aplikasi tersebut adalah kotak hitam tanpa ruang lingkup untuk modifikasi / instrumentasi (yang sangat tidak mungkin) Anda dapat memperoleh informasi ini dari log apache Anda dengan memasukkan cookie sesi - filter atau ekor log untuk mempertahankan daftar cookie aktif - dan hapus entri dari daftar ketika mereka bertepatan dengan URL logout atau belum terlihat untuk TTL.
sumber
Ini bukan apa yang Anda minta, tapi saya sudah melakukan yang berikut dengan penyeimbang beban F5:
Karena situs web itu terkadang berada di bawah beban berat (pacuan kuda), itu membantu.
sumber
Masalah ini dapat diatasi baik dengan menggunakan RadWare AppDirector, dan (untuk kelengkapan) kemungkinan juga dengan menggunakan Apache mod_security sesuai temuan bagus Anda di komentar di bawah ini.
Untuk solusi AppDirector, saya percaya dimungkinkan untuk membuat dua pemetaan pertanian ke server backend yang sama. Peternakan ini dapat memiliki kriteria dan kondisi operasi berbeda yang diterapkan padanya. Satu tambak akan menjadi "default" dan yang lain akan menjawab URI: yang Anda definisikan sebagai "sesi". Yang terakhir akan mendapatkan batasan jumlah sesi yang diterimanya di load balancer.
Saya mulai sekarang akan mengganti istilah "sesi" Anda dengan "masuk" karena dua alasan:
Dimungkinkan juga untuk menampilkan halaman maaf jika peternakan "login" telah mencapai batas koneksi yang dipilih.
Sebelum membahas caranya, saya harus menyatakan dengan jelas bahwa saya tidak memiliki pengalaman pengoperasian produk AppDirector, tetapi mengelola penyeimbang muatan yang sedikit bersaing dan sedikit lebih maju setiap hari. Produk yang saya gunakan dapat melakukan skenario ini langsung. Saya telah menemukan informasi melalui Panduan Pengguna AppDirector dan dokumentasi online apa yang tersedia yang menunjukkan bahwa hal yang sama berlaku untuk AppDirector. Meskipun konsepnya serupa, terminologinya berbeda. Saya hanya melakukan tindakan ketika-dalam-roma sehubungan dengan kata-kata, berharap untuk membuatnya benar tanpa terlalu jelas bodoh.
Penghalang jalan terbesar adalah mendapatkan akses ke manual, yang tidak tersedia kecuali satu adalah pelanggan aktif. Melalui beberapa googling dimungkinkan untuk menemukan versi lama yang saya harap tidak terlalu ketinggalan zaman, saya juga menemukan beberapa artikel berbasis pengetahuan dan tautan ini: Radware AppDirector - Configuration: Basic Application .
Berikut adalah konsep solusi, sebagaimana ditafsirkan terutama melalui Panduan Pengguna:
Entri klien ke load balancer dilakukan melalui VIP yang digunakan untuk menghubungkan sesi "default" dan "sesi login". Ini dicapai melalui kebijakan L4 sesuai hal. 99 dalam Panduan Pengguna:
Kebijakan L4 dapat dikaitkan dengan kebijakan L7 yang digunakan untuk memilih pertanian yang cocok. Proses kebijakan L7 dijelaskan demikian dalam Panduan Pengguna hal.104:
Metode yang tersedia untuk mendefinisikan perilaku L7 diuraikan pada hal.106, di mana Anda bisa memilih metode yang cocok untuk memilih perutean ke Peternakan "masuk" daripada ke Pertanian "default":
Seperti yang terlihat di tautan Aplikasi Dasar , misalnya seseorang dapat membuat kebijakan L7 yang mengevaluasi pola URI untuk perutean ke berbagai peternakan. Pola URI yang dibuat '^ / login? = True' dan '^ / login' dapat dialihkan ke peternakan "login" Anda. Pola yang dibuat '^ / logout' (dan semua URI lainnya: s) juga dapat dialihkan ke tambak "default".
Ladang didefinisikan oleh Panduan Pengguna hal.121 dengan demikian: "Ladang AppDirector adalah sekelompok server jaringan yang menyediakan layanan yang sama [...] Server yang menyediakan beberapa layanan dapat digunakan di banyak tambak."
Server selanjutnya dibedakan dengan memisahkan definisi server backend menjadi dua lapisan, lapisan objek 'Fisik Server' yang mewakili alamat ip server dan lapisan objek 'Server Pertanian' yang mewakili layanan yang berjalan pada satu atau lebih Server Fisik .
Sesi yang membatasi pada sebuah tambak dapat sesuai dengan 'Panduan Pengguna AppDirector' dilakukan per setiap objek Server Tambak yang didefinisikan untuk tambak (serta melalui cara lain) di samping per objek Server Fisik. Ini dijelaskan antara tempat-tempat lain pada hal.137:
Tabel Klien dan 'Mode Biasa' -nya didefinisikan pada hal.153:
Dalam tangkapan layar jendela definisi server pada halaman Aplikasi Dasar , kotak batas koneksi server terlihat tepat di samping kotak batas bandwidth.
Jadi sedikit tergantung pada konfigurasi tetapi untuk keperluan jawaban ini, 'koneksi' sebagaimana didefinisikan melalui Tabel Klien dan 'sesi' seperti yang didefinisikan oleh Anda pada dasarnya menjadi hal yang sama. Dan batas untuk efek itu dapat dikenakan per objek server di sebuah peternakan.
Karena AppDirector membedakan antara server fisik dan server pertanian, dimungkinkan untuk menetapkan dua pemetaan server pertanian ke objek server fisik Apache Anda, yang memiliki batas koneksi rendah.
Namun, Apache juga perlu menjawab panggilan dari kedua objek server pertanian, misalnya melalui dipanggil pada dua port atau alamat ip yang terpisah - satu digunakan oleh masing-masing (server pertanian / server pertanian) kombo. Pertanyaannya kemudian, apakah Anda dapat menentukan dua titik masuk server aplikasi? yaitu apakah Anda dapat melengkapi aplikasi front end Apache Anda (/ vhost?) untuk menjawab pada dua port atau alamat IP (satu per farm)? Ini melalui sedikit tebakan karena saya tidak ingin menghabiskan terlalu banyak waktu dengan manual, tapi saya yakin Anda bisa menyelesaikan ini dengan cukup elegan ketika benar-benar melihat AppDirector GUI dan Apache.
Pengaturan batas koneksi memiliki sedikit kekhasan. Dari Server Fisik, Batas Koneksi hal.140:
Karena itu Anda perlu menetapkan Batas Koneksi yang sangat tinggi (dengan margin lebar hingga jumlah maksimum yang dimungkinkan melalui basis pengguna Anda) untuk server pertanian "default" yang tidak dibatasi, dan menetapkan Batas Koneksi untuk server pertanian "masuk" sebagai serendah yang Anda harus. Definisi server fisik perlu memiliki jumlah keduanya sebagai Batas Koneksi, sebagai prasyarat untuk mengaktifkan batas sesi yang diinginkan.
Anda juga memiliki persyaratan ini dalam pertanyaan Anda:
Ini disebut 'No HTTP Service Page' di Panduan Pengguna, hal.134:
Untuk bagian pemantauan, saya belum melakukan penelitian menyeluruh tetapi inilah yang saya pikirkan:
AppDirector tampaknya memiliki MIB. Mungkin rasa sakit untuk menemukan OID yang tepat seperti biasanya, tetapi Anda mungkin dapat menggunakannya untuk alat pilihan Anda.
Yang satu ini membutuhkan pemikiran kreatif. Dengan asumsi AppDirector tidak menyertakan template untuk ini langsung, bagaimana tentang:
sumber
Jika AppDirector tidak dapat membantu Anda, inilah pendekatan lain yang akan membutuhkan sedikit pengkodean. Saya akan mengatasi masalah sebagai berikut:
Membuat grafik jumlah sesi menjadi sesederhana seperti menggambarkan panjang rantai iptables. Server pemantauan bisa saja selalu masuk daftar putih.
sumber