Selepas penurunan keistimewaan: fail OpenVPN mana yang masih berfungsi?
Deskriptor yang dibuka sebelum penurunan terus berfungsi; laluan yang dibuka semula kemudiannya tidak. Tentukan mana antara tiga fail masa jalan yang perlu dibuka semula oleh konfigurasi anda.
Masa hidup yang panjang hanya membuktikan bahawa permulaan berjaya dengan keistimewaan yang dimiliki daemon pada saat itu. Kegagalan yang penting di sini datang kemudian: klien baharu menyambung, senarai pembatalan diganti, skrip bantuan perlu menulis fail. Setiap satunya ialah pembukaan baharu yang dilakukan oleh akaun tanpa keistimewaan, dengan soalan kebenarannya sendiri dan mesej ralatnya sendiri. Tiga keputusan memisahkan konfigurasi yang terus berfungsi daripada yang gagal pada peristiwa seterusnya.
Asingkan apa yang dimuatkan awal daripada apa yang dibuka kemudian
Deskriptor ialah pemegang pada penerangan fail terbuka, dan mod akses ditetapkan semasa penerangan itu dicipta. Menukar pengguna proses kemudiannya tidak menutup pemegang itu, sebab itulah fail kunci yang dibaca sebagai root terus berfungsi selepas penurunan. Modnya juga tidak berubah: pemegang yang dibuka untuk membaca tidak menjadi boleh ditulis, dan pemegang yang boleh ditulis tidak ditarik balik hanya kerana akaun kehilangan haknya pada laluan itu. Dua fakta ini menjelaskan sebahagian besar tingkah laku mengejutkan dalam laporan ini.
Separuh lagi ialah memori. Daemon boleh menghuraikan sijil, menyimpan bahan yang dihuraikan dan menutup fail; yang kekal digunakan ialah data, bukan fail terbuka. Jadi trafik yang berterusan tidak membuktikan sama ada deskriptor terbuka atau nama laluan boleh dicapai. Ia hanya membuktikan bahawa bahan yang diperlukan untuk sesi semasa diperoleh lebih awal.
Pembukaan kemudian ialah transaksi lain. Ia berjalan di bawah kelayakan semasa, konteks keselamatan semasa dan pandangan lekap semasa, jadi laluan yang boleh dibaca semasa permulaan boleh ditolak pada sambungan seterusnya. Putaran menambah perangkap: menulis fail baharu pada nama laluan yang sama membiarkan deskriptor sedia ada terikat pada objek lama, jadi muat semula boleh kelihatan berjaya sedangkan daemon masih menggunakan kandungan sebelumnya. Bandingkan inode yang dipegang proses dengan yang ada pada cakera sebelum mempercayai putaran berkuat kuasa.
Namakan tiga bacaan masa jalan dan bila setiap satu berlaku
Tiga sumber biasanya dibuka jauh selepas pengawalan, dan ia gagal pada saat yang berbeza. Fail konfigurasi khusus klien dibaca apabila klien itu menyambung, jadi ia boleh rosak untuk seorang pengguna sedangkan yang lain meneruskan. Data pembatalan dirujuk semasa pengesahan rakan dan sekali lagi apabila fail diganti. Direktori sementara hanya disentuh apabila skrip atau pemalam menulis sesuatu.
Tiada satu pun daripada ketiga-tiganya tergolong dalam laluan permulaan, sebab itulah pelayan yang sihat selama berminggu-minggu boleh gagal pada sambungan seterusnya. Kategori ini juga menamakan pemilik pembetulan: dua yang pertama ialah kebenaran membaca pada konfigurasi di bawah akaun daemon, dan yang ketiga ialah lokasi boleh tulis dengan tujuan sempit.
| Path reopened later | What triggers the open | First sign when it fails |
|---|---|---|
| Client configuration file | A connection for that client identity | One client rejected while others connect |
| Revocation data | Peer authentication, including after replacement | Revoked and valid peers both refused |
| Script or plugin temporary directory | A helper needs to create a file | The helper exits with a path error |
persist-key menjawab soalan yang lebih sempit daripada anggapan kebanyakan orang. Ia mengekalkan fail kunci terbuka sepanjang set semula SIGUSR1 dan ping-restart yang didokumenkan, dan ia tidak melakukan apa-apa untuk fail CCD, data pembatalan, fail boleh laku pembantu atau permulaan semula proses sepenuhnya. Semuanya masih mengikut laluan pembukaan sendiri, di bawah mana-mana akaun yang berjalan pada masa itu.
Sahkan akaun dan pandangan yang benar-benar dimilikinya
Tanya daemon yang berjalan akaun mana yang digunakan daripada mempercayai fail unit, kemudian bandingkan jawapan dengan apa yang ditetapkan unit. Ketidakseragaman ialah perkara pertama yang perlu diselesaikan, kerana setiap pemeriksaan kebenaran berikutnya berjalan sebagai siapa proses itu sebenarnya. Kemudian telusuri laluan komponen demi komponen; penelusuran dinilai pada setiap peringkat, jadi fail yang boleh dibaca di dalam direktori yang tidak boleh ditelusuri kekal tidak boleh dibaca. Mod fail akhir ialah soalan terakhir, bukan yang pertama.
Ruang nama dan kotak pasir perkhidmatan menambah sempadan yang tidak dijelaskan oleh pemilikan dan bit mod. Laluan yang kelihatan dalam shell anda mungkin tiada atau hanya baca di dalam chroot, ruang nama lekap atau unit yang menyembunyikan direktori rumah. Modul keselamatan menambah satu lagi lapisan, jadi fail yang kelihatan boleh dibaca masih boleh ditolak apabila dibuka.
ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/aliceBacaan yang berjaya dalam shell pentadbir tidak menguji satu pun daripada syarat gabungan itu. Jalankan pemeriksaan sebagai akaun daemon, dengan ruang nama dan kotak pasir yang sama, atau terima bahawa hasilnya menerangkan shell anda dan bukan pelayan. Perintah ketiga ialah versi murah ujian itu: ia mencetak mod setiap komponen dan gagal pada komponen pertama yang tidak dapat ditembusi akaun daemon.
Beri penulisan masa jalan direktori sendiri
Membaca hanyalah separuh senarai. Skrip pembantu mungkin perlu mencipta fail status, pemalam mungkin perlu menulis keadaan di sebelah konfigurasinya, dan penulisan itu tidak dilindungi oleh menjadikan pokok konfigurasi boleh ditulis. Beri direktori tertentu kebenaran menulis yang diperlukan fungsinya, dengan pemilik dan mod yang boleh anda jelaskan. Utamakan akses hanya baca untuk semua yang hanya dibaca.
Pisahkan kebenaran kunci persendirian daripada fail dasar. Kunci yang perlu dibaca semula selepas set semula mempunyai keperluan berbeza daripada fail klien yang dibaca pada setiap sambungan, dan satu mod longgar untuk kedua-duanya memberi lebih banyak akses daripada yang diminta masalah. Akaun daemon khusus dengan pemilikan sempit lebih mudah diaudit daripada kumpulan luas. Apabila kunci mesti bertahan melalui set semula, persist-key ia menghapuskan bacaan semula dan bukannya meluaskan direktori.
Putuskan daripada peristiwa yang boleh anda hasilkan semula
Terowong hidup membuktikan satu laluan melalui kod. Peristiwa yang memerlukan fail itu ialah satu-satunya ujian yang meliputi pembukaan yang anda pedulikan, sama ada sambungan klien baharu, fail pembatalan yang diganti, set semula lembut yang dibenarkan atau permulaan semula yang dirancang. Pilih peristiwa itu, jalankannya, dan simpan ralat pertama dan bukan yang terakhir.
Untuk set semula lembut, satu isyarat dan log unit menunjukkan sama ada kunci dibaca semula. Hantar isyarat itu, kemudian baca baris terakhir yang ditulis unit:
systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pagerJangan membuat kesimpulan bahawa daemon yang terjejas tidak lagi boleh mengubah fail hanya kerana keistimewaan diturunkan. Apa yang masih boleh dilakukannya bergantung pada kelayakan yang tinggal, keupayaannya, direktori yang boleh ditulisnya dan mana-mana deskriptor boleh tulis yang masih dipegangnya. Pengurangan keistimewaan menyempitkan kuasa, dan senarai pembukaan masa jalan menunjukkan sejauh mana. Tuliskan sempadan itu di sebelah konfigurasi supaya orang seterusnya tidak perlu menemuinya semula.