← Semua tulisan

Satu login, enam sistem

Enam sistem internal, enam kali login berbeda setiap hari. Hari ini saya menutup celah itu — dan menemukan satu bug keamanan lama yang sudah lebih dulu hidup diam-diam di salah satu sistemnya.

aiteknologioperasionalkeamanan

Sejak enam sistem itu berjalan, ada satu kebiasaan kecil yang mulai mengganggu: setiap pindah dari satu sistem ke sistem lain, saya login lagi. Portal direksi, sistem aset, penggajian, KPI, event, pelacakan barang bergaransi — enam akun, enam kali masuk, berkali-kali sehari.

Bukan masalah besar. Tapi masalah kecil yang berulang setiap hari punya cara sendiri membuat Anda akhirnya berhenti membuka sistem yang seharusnya Anda buka.

Kenapa tidak langsung digabung saja

Godaan pertama adalah membuat satu halaman login pusat, lalu semua sistem mengarah ke sana. Saya tidak memilih itu.

Alasannya sederhana: enam sistem itu punya cara kerja login yang berbeda-beda di baliknya — ada yang menyimpan sesi di cookie, ada yang di token, ada yang malah menyimpan tokennya di peramban. Memaksa semuanya lewat satu pintu berarti membongkar enam mekanisme yang sudah berjalan dengan baik, demi kenyamanan yang sebenarnya bisa dicapai dengan cara yang lebih hati-hati.

Yang saya bangun sebagai gantinya: satu layanan kecil baru, saya beri nama Identitas, yang tugasnya cuma satu — menerbitkan semacam “bukti sudah login” begitu Anda berhasil masuk ke salah satu sistem. Sistem lain, kalau melihat bukti itu masih sah, akan mempercayainya dan langsung membuka tanpa tanya password lagi. Setiap sistem tetap punya pintu masuknya sendiri, cuma sekarang saling percaya satu sama lain.

Satu keputusan lagi yang saya pegang sejak awal: layanan Identitas ini tidak punya alamat publik sama sekali. Dia cuma bisa dihubungi dari dalam server sendiri, oleh sistem-sistem yang memang sudah dipercaya — bukan dari internet.

Uji coba dulu, baru semuanya

Ingatan saya masih segar dari tulisan sebelumnya soal “rilis bertahap”. Jadi bukan langsung enam sekaligus — dua sistem dulu, ASP dan Portal, sebelum saya percaya diri melanjutkan ke sisanya.

Di tengah membangun dua yang pertama itulah saya sengaja menguji sesuatu yang jarang saya lakukan serius: memalsukan buktinya sendiri. Bukan cuma mencoba jalur yang benar, tapi sengaja merusak bukti loginnya — menambah beberapa karakter acak di ujungnya — untuk melihat apakah sistemnya cukup pintar menolak.

Tidak. Dia menerimanya.

Penyebabnya kecil dan mudah luput: cara memeriksa tanda tangan digital pada bukti itu ternyata berhenti membaca di karakter pertama yang tidak dikenalnya, bukan menolak seluruh string. Efeknya, bukti yang dirusak dengan cara tertentu tetap dianggap sah. Bukan celah yang bisa dipakai orang berpura-pura jadi orang lain — tetap butuh kunci rahasia yang tidak dia punya — tapi tetap sebuah kesalahan yang seharusnya tidak ada.

Yang membuat saya berhenti sejenak: pola pemeriksaan yang salah itu saya contek dari sistem KPI yang sudah jalan sejak Agustus lalu. Artinya kesalahan yang sama sudah hidup di produksi selama lebih dari seminggu, tanpa saya sadari, sampai saya mencoba membangun sesuatu yang baru dan mengujinya dengan cara yang sedikit lebih jahat dari biasanya.

Sudah saya perbaiki di keduanya. Tapi pelajarannya bukan soal bug-nya — soal kebiasaan mencobanya.

Satu lagi yang lolos, dan ketahuan dari pemakaian saya sendiri

Setelah dua sistem pertama jalan dan teruji, saya lanjutkan ke sisanya: penggajian, lalu sistem aset dan event (yang ternyata paling berbeda arsitekturnya, dan salah satunya punya sejarah insiden server yang membuat saya harus mencari jalan memutar), lalu terakhir sistem KPI.

Yang tidak lolos dari pengujian saya sendiri adalah sesuatu yang lebih sederhana: keluar. Setelah Portal jalan, saya coba klik “keluar” — dan beberapa detik kemudian sistem itu membuka diri sendiri lagi, seolah saya tidak pernah keluar.

Penyebabnya masuk akal begitu ditelusuri: “keluar” cuma menghapus bukti login di sistem itu sendiri, tapi bukti bersama antar-sistemnya masih hidup. Begitu halaman dimuat ulang, sistem itu melihat bukti bersama itu masih sah, dan membukakan pintu lagi sendiri — persis seperti dia dirancang untuk lakukan.

Diperbaiki dalam hitungan menit setelah saya laporkan. Tapi ini pengingat yang bagus: sebagian bug tidak akan pernah ketahuan dari pengujian di meja kerja, cuma dari benar-benar memakainya.

Yang masih saya tanggung

Beberapa hal saya putuskan sadar, bukan karena sempurna, tapi karena cukup untuk sekarang.

Keluar dari satu sistem cuma mencabut satu bukti bersama itu, bukan sesi yang sudah lebih dulu terbentuk di sistem lain. Kalau Anda sudah lebih dulu masuk ke lima sistem, keluar dari satu tidak otomatis mengeluarkan Anda dari empat lainnya. Cukup untuk sekarang, tapi bukan yang paling ketat yang bisa dibangun.

Ganti password tidak langsung mematikan bukti bersama yang sudah beredar. Kalau ada perangkat lain yang masih menyimpannya, dia tetap bisa membuka pintu sampai bukti itu sendiri kedaluwarsa — saya batasi dua jam, sengaja saya perpendek dari rencana awal delapan jam begitu saya sadari konsekuensi ini.

Tidak satu pun dari dua hal ini membuka akses baru yang tidak seharusnya ada. Tapi keduanya mengubah cara berpikir soal “keluar” dan “ganti password” — dari jaminan seketika, jadi jaminan dalam jendela waktu tertentu. Saya catat, belum saya tutup sepenuhnya.


Enam sistem, satu malam, dan dua bug yang tidak akan ketahuan kalau saya cuma percaya bahwa kodenya “kelihatan benar”. Kalau ada satu hal yang saya bawa pulang dari ini: bagian paling berharga bukan sistem barunya, tapi kebiasaan mencurigai pekerjaan sendiri sebelum orang lain yang menemukannya duluan.