Semuanya berfungsi sehingga pelari binaan memerlukan soket hos yang sama yang digunakan oleh tetamu VPN, dan ketika itu tiada siapa dapat menjelaskan mengapa sesuatu kerja boleh membaca kunci get laluan. Semuanya dipasang pada satu mesin kerana ia muat, dan setiap tetamu diberi akses luas kerana itulah cara terpantas untuk menjadikannya berfungsi. Hasilnya ialah hos yang sempadan kepercayaannya ialah kabel kuasa. Memisahkan peranan memerlukan kurang kerja daripada yang didengari, dan ia bermula dengan menamakan peranan itu.

Tiga peranan yang kini berkongsi segala-galanya

Kemasukan VPN, satu set perkhidmatan peribadi dan pelari binaan mahukan perkara yang berbeza. Yang pertama memerlukan port awam dan rangkaian sempit di sisi peribadi. Yang kedua memerlukan storan berterusan dan rahsia aplikasi. Yang ketiga melaksanakan kod yang ditulis oleh orang lain.

Memberi akses yang sama kepada ketiga-tiganya itulah yang menjadikan gejala itu mengelirukan, kerana kemudian mana-mana daripada mereka boleh menjejaskan yang lain. Kerja binaan yang boleh mencapai soket hypervisor ialah kerja yang boleh menghentikan VPN. Tetamu perkhidmatan dengan laluan ke rangkaian pengurusan boleh mengubah konfigurasi suis. Keistimewaan ialah masalahnya, dan senarai proses hanyalah tempat ia kelihatan. Menamakan peranan terlebih dahulu memberi setiap keistimewaan tempat untuk hidup.

Lakaran di bawah ialah titik permulaan untuk pemisahan itu, bukan janji ketersediaan tinggi. Anggap ia sebagai hipotesis untuk disahkan, bukan reka bentuk yang siap.

Pisahkan tiga peranan, bukan tiga proses

Tiga tetamu pada satu hos memberikan tiga set keistimewaan dan tiga kedudukan rangkaian. Ia tidak memberikan tiga domain kegagalan, dan reka bentuk patut menyatakannya dengan lantang.

Pemisahan hanya membantu jika kompromi dalam satu tetamu tidak memberikan keistimewaan kepada yang lain secara automatik, dan itu tetapan hypervisor, bukan konvensyen penamaan. Menamakan VM sebagai get laluan tidak menghalang tetamu lain daripada mencapai hos. Baca konfigurasi suis maya dan bukan nama hos, kemudian sahkan setiap tetamu berada di tempat yang anda sangka.

host
├─ vpn-gw      10.60.10.2/24   public 51820/udp only
├─ services    10.60.0.10/24   no route to the management network
└─ ci-runner   10.60.20.2/24   outbound only, no host socket

Tuliskan topologi dan kemudian sahkan dengan alat yang memilikinya. Tetamu yang muncul pada jambatan yang salah ialah penemuan, bukan perincian. Betulkan rangkaian sebelum menukar sebarang konfigurasi perkhidmatan.

Biarkan tetamu VPN membuka hanya pintu yang dimilikinya

Terbitkan port terowong pada penghala dan tiada yang lain. Port pentadbiran tetamu tergolong dalam laluan pengurusan, bukan internet, dan antara muka hypervisor sendiri juga tergolong di sana.

Rangkaian di sisi peribadi patut mencapai perkhidmatan yang diperlukan pengguna jauh dan berhenti di situ. Pengesahan aplikasi kekal dihidupkan, kerana terowong ialah pengangkutan dan bukan log masuk. Kekalkan jadual penghalaan tetamu VPN cukup kecil untuk dijelaskan dalam satu ayat. Jika anda tidak dapat menjelaskannya sesederhana itu, sempadan itu sudah kabur.

virsh net-list --all
virsh net-dumpxml lab-private
sudo nft list ruleset | grep -n -E '51820|10.60'

Apa-apa yang mendengar pada hos dan tidak diperlukan untuk pengurusan tidak sepatutnya mendengar sama sekali. Ini termasuk API hypervisor, yang mudah dibiarkan terdedah pada antara muka awam.

Kerja binaan memerlukan jenis sempadan yang berbeza

Kerja CI menjalankan arahan yang dikawal repositori, jadi kepercayaannya bergantung kepada siapa yang boleh menolak kod. Pelaksana shell menjalankan arahan itu sebagai pengguna pelari pada hos, dan itulah sempadan terluas yang tersedia.

Pelaksana kontena lebih sempit, dan kontena berkeistimewaan bukan salah satu yang sempit. Kekalkan pelari dalam tetamunya sendiri dengan skop rangkaiannya sendiri, dan berikan hanya akses artifak dan penggunaan yang diperlukan oleh kerja itu. Pekerja sekali guna mengurangkan keadaan yang disimpan; ia tidak mengurangkan kebolehcapaian atau pendedahan rahsia. Kedua-duanya masih memerlukan had yang jelas.

Tetamu perkhidmatan memiliki data, jadi pelan sandaran itulah yang mesti berfungsi. Kekalkan repositori, muat naik dan pangkalan data dalam jadual yang sama. Uji pemulihan dan bukan membaca status kerja.

Rancang untuk kegagalan yang dikongsi ketiga-tiganya

Satu hos ialah satu domain kegagalan. But semula membuang terowong dan setiap perkhidmatan peribadi pada saat yang sama, dan ketika itulah jalan masuk paling penting.

Kekalkan akses konsol yang tidak bergantung pada tetamu VPN, sama ada konsol fizikal, antara muka pengurusan luar jalur atau konsol penyedia. Syot kilat yang disimpan pada cakera yang sama bukan salinan bebas, dan sandaran yang berjalan di dalam tetamu yang dilindunginya juga bukan. Kemudian uji permulaan sejuk sebagai urutan dan bukan senarai semak: hos, rangkaian maya, laluan terowong dan satu aplikasi bernama di bawah akaun biasa.

virsh list --all
systemctl is-active libvirtd
curl -sS -m 5 -o /dev/null -w '%{http_code}\n' https://10.60.0.10/
ss -ltnp | grep -E ':51820|:443'

Urutan permulaan proses tidak membuktikan apa-apa tentang laluan dan DNS, jadi uji laluan dan bukan keadaan unit. Laluan itulah yang benar-benar diperlukan oleh pengguna jauh.

Artikel berkaitan