Area admin SaaS di balik VPN: alamat mana yang bisa dipercaya?
Origin melihat alamat keluar gateway VPN Anda, bukan alamat tunnel laptop. Percayai hanya header proxy yang dikonfigurasi, lalu kunci setiap operasi admin.
Halaman SaaS publik bisa tetap terbuka untuk semua orang sementara operasi admin di baliknya menolak siapa pun di luar VPN. Mekanisme yang memungkinkan hal itu bukan menu tersembunyi atau halaman login terpisah; itu adalah pemeriksaan jalur jaringan yang mengantarkan permintaan. Jika bukti alamat salah, pemeriksaan itu entah mengunci admin sungguhan atau menerima siapa pun yang bisa mengetik header. Mulailah dari apa yang benar-benar diterima origin.
Apa yang benar-benar diterima origin setelah tunnel
Ketika browser mencapai situs publik melalui VPN yang juga membawa lalu lintas internet, gateway menerjemahkan koneksi sebelum keluar. SaaS melihat alamat keluar publik gateway, biasanya satu alamat atau rentang kecil, dan tidak pernah melihat alamat tunnel laptop. Itulah sebabnya memasukkan 10.90.0.42 ke daftar izin gagal, dan itulah sebabnya memasukkan seluruh RFC 1918 gagal lebih keras: yang kedua menerima setiap jaringan privat yang bisa menjangkau Anda. Satu-satunya alamat yang layak dijadikan syarat adalah alamat yang benar-benar dimiliki organisasi Anda di titik keluar.
curl -s https://ifconfig.me
dig +short admin.example.com
Tunnel terpisah merusak asumsi itu secara diam-diam. Jika VPN hanya membawa rute kantor privat, permintaan ke nama host admin publik keluar melalui ISP lokal dan origin melihat alamat residensial. Ikon VPN yang terhubung tidak membuktikan apa pun tentang tujuan tertentu ini, jadi ujilah tujuan, bukan tunnel.
Berhenti dan perbaiki perutean sebelum menulis kebijakan apa pun jika alamat keluar berbeda per pengguna. Syarat yang hanya cocok untuk sebagian admin lebih buruk daripada tanpa syarat, karena menyembunyikan masalah sampai terjadi insiden.
Percayai hanya proxy yang menulis ulang alamat
Sebagian besar situs publik berada di belakang CDN atau proxy terbalik, jadi alamat soket origin milik frontend itu, bukan milik pengunjung. Frontend biasanya meneruskan alamat asli dalam sebuah header, dan header itu dikendalikan penyerang kecuali origin hanya menerimanya dari proxy yang dikenal. Konfigurasikan daftar sumber tepercaya secara eksplisit dan buat origin tak terjangkau dari tempat lain mana pun. Tanpa paruh kedua itu, penyerang melewati proxy dan mengirim header secara langsung.
set_real_ip_from 192.0.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
curl -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin
Alasan yang sama berlaku untuk protokol PROXY: protokol itu tepercaya hanya ketika listener terikat ke antarmuka yang bisa dijangkau proxy dan tidak ada yang lain. Konteks alamat yang hilang harus menggagalkan pemeriksaan terlindungi, bukan jatuh ke izin default. Header yang tidak ada bukan bukti jalur tepercaya.
Lampirkan syarat ke setiap operasi terlindungi
Letakkan pemeriksaan di batas otorisasi yang dilalui setiap operasi terlindungi, bukan di halaman yang merender menu. Grup rute, middleware, atau lapisan kebijakan semuanya berfungsi; salinan per handler tidak, karena handler yang ditambahkan orang kuartal depan tidak akan memilikinya.
user = requireAuthenticatedSession()
requirePermission(user, "admin")
requireVpnEgress(verifiedClientAddress(request))
performProtectedOperation(user, request)
Batas yang sama harus mencakup JSON API, ekspor, URL unduhan bertanda tangan, dan jabat tangan WebSocket, karena tidak satu pun memerlukan halaman HTML diminta lebih dulu. Tautan unduhan yang dibuat saat VPN aktif tetap berlaku sesudahnya kecuali endpoint unduhan memeriksa ulang. Sesi berumur panjang juga memerlukan aturan evaluasi ulang, atau satu permintaan terautentikasi menjadi pengecualian permanen. Penolakan default adalah satu-satunya pengaturan yang bertahan terhadap pergantian staf.
Cache bersama adalah jalan lain di sekitar pemeriksaan. Cache yang sudah menyimpan respons terlindungi dapat menyajikannya tanpa menghubungi origin, jadi tandai respons admin sebagai privat dan jauhkan dari penyimpanan bersama. Jika cache harus menyajikannya, pemeriksaan akses harus berjalan sebelum penyajian, yang biasanya berarti cache itu sama sekali tidak boleh berupa cache bersama.
Uji bypass yang baru saja Anda tutup
Latih matriksnya, bukan jalur bahagianya: admin melalui VPN, admin yang sama tanpa VPN, non-admin melaluinya, dan header alamat palsu. Tambahkan permintaan langsung ke origin dan permintaan dengan respons di-cache, karena keduanya yang sepenuhnya melewati frontend.
curl -sI https://admin.example.com/export.csv
curl -s -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin
curl -s https://admin.example.com/api/me -o /dev/null -w '%{http_code}\n'
Setiap permintaan harus mengembalikan status yang dijanjikan kebijakan, dan log harus mencatat bukti alamat mana yang dipakai. Cakup IPv6 secara terpisah, karena origin dual-stack bisa melihat keluarga sumber yang berbeda dari yang Anda uji. Jaga operasi pelanggan biasa tetap berjalan di luar VPN, atau perubahan akan dibatalkan saat pelanggan mengeluh pertama kali. Tulis hasil yang diharapkan untuk setiap baris sebelum menjalankannya, agar kelulusan yang mengejutkan terlihat.
Alamat keluar membuktikan jalur jaringan yang diizinkan, bukan orang dan bukan perangkat terkelola. Pertahankan sebagai satu syarat di samping autentikasi dan izin, dan area admin tetap sempit tanpa mengubah seluruh produk menjadi layanan khusus VPN. Pemisahan itu adalah desainnya, bukan batasannya.