Beri OpenVPN CAP_NET_ADMIN tanpa memberinya root
Unit yang bermula sebagai pengguna tanpa keistimewaan masih memerlukan set keupayaan yang betul. Periksa unit, proses hidup dan sempadan exec, dalam susunan itu.
Perkhidmatan bermula, log mengeluh bahawa ia tidak dapat membuka peranti tun, dan laluan tidak pernah muncul. Jalankan capsh --print dalam shell anda dan cap_net_admin ada di situ, yang menjadikan kegagalan kelihatan mustahil. Yang berbeza antara shell anda dan unit ialah peralihan keistimewaan, bukan kesediaan kernel memberikan keupayaan itu. Lalui empat pemeriksaan di bawah mengikut urutan dan berhenti pada yang pertama yang menjelaskan jurang itu.
Asingkan keupayaan yang hilang daripada peranti tersembunyi
Dua kegagalan kelihatan sama daripada baris log. Proses tanpa CAP_NET_ADMIN tidak boleh mencipta atau mengkonfigurasi antara muka terowong, dan proses yang kotak pasirnya menyembunyikan /dev/net/tun tidak boleh membukanya sejak awal. Menambah keupayaan tidak akan membaiki kes kedua.
Periksa sama ada peranti wujud di dalam ruang nama perkhidmatan sebelum anda mengedit apa-apa. PrivateDevices=yes ialah baris pengukuhan biasa yang membuang nod tun sepenuhnya, dan ProtectSystem yang menyekat boleh menjadikan laluan konfigurasi baca-sahaja dengan cara yang terbaca seperti ralat kebenaran. Kedua-duanya menghasilkan baris log yang menyebut terowong, sebab itulah keupayaan dipersalahkan. Sahkan nod hadir dan boleh dibuka dahulu, kemudian teruskan.
Ketahui set keupayaan mana yang anda lihat
Linux menyimpan set dibenarkan, berkesan, boleh diwarisi, mengehadkan dan ambien, dan set ambien itulah yang bertahan selepas exec oleh pengguna bukan root. Keupayaan fail pada binari boleh menyerahkan hak dibenarkan dan berkesan semasa exec, tetapi hanya selagi tiada apa dalam rantaian menyekat pemindahan itu.
Di sinilah sudo mengelirukan orang. Arahan yang dijalankan melalui sudo -u memulakan peralihan keistimewaan baharu dan set ambien hilang, jadi pemeriksaan sama yang berjaya sebagai root gagal di situ. Pengurus perkhidmatan ialah satu lagi peralihan, dan ia tidak memberikan apa-apa ambien melainkan unit menyatakannya.
Berikan keupayaan dalam unit, bukan dalam pembalut
Bahagian perkhidmatan minimum untuk terowong yang perlu mencipta peranti dan memasang laluan kelihatan seperti ini.
[Unit]
Description=OpenVPN client, office profile
After=network-online.target
[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.confAmbientCapabilities meletakkan hak ke dalam set ambien sebelum proses bermula, dan CapabilityBoundingSet menghalang proses daripada memegang apa-apa di luar senarai itu. NoNewPrivileges=yes menyekat pemerolehan keistimewaan melalui setuid atau keupayaan fail, manakala keupayaan yang diberikan unit secara jelas masih terpakai. Tambah CAP_NET_BIND_SERVICE hanya apabila perkhidmatan mesti mengikat port rendah, dan jangan sekali-kali menambah CAP_SYS_ADMIN hanya kerana satu benang forum berbuat demikian.
Jika unit membalut binari dalam sudo, buang pembalut itu. systemd sudah menggunakan User=, dan lapisan tambahan itulah sebab paling mungkin set ambien kosong.
Sahkan terhadap proses hidup, bukan fail unit
Baca apa yang sebenarnya digunakan oleh pengurus, kemudian baca proses yang dijanakannya.
unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/statusJika unit menyenaraikan keupayaan dan CapEff masih tidak memilikinya, sesuatu drop-in mengatasi tetapan itu atau langkah ExecStartPre mengubah persekitaran. Cari nama unit dalam direktori drop-in sebelum anda menganggap fail utama berwibawa, kerana fail yang lebih lewat menang secara senyap. Jika unit dan proses kedua-duanya menunjukkan keupayaan itu dan terowong masih gagal, kembalilah kepada pemeriksaan peranti dan laluan daripada meluaskan set mengehadkan itu. Meluaskannya menyembunyikan punca sebenar dan meninggalkan perkhidmatan lebih berkeistimewaan daripada sebelumnya.
Utamakan melepaskan keistimewaan selepas permulaan
OpenVPN boleh bermula dengan keistimewaan dan kemudian turun ke akaun tanpa keistimewaan melalui pilihan user dan group miliknya sendiri, dengan persist-key dan persist-tun mengekalkan terowong boleh digunakan selepas itu. Susunan itu menyempitkan tetingkap proses memegang hak, dan ia selalunya lebih sesuai daripada memulakan seluruh daemon tanpa keistimewaan dengan keupayaan kekal.
Apa pun model yang anda pilih, mulakan semula unit dan ulangi pemeriksaan selepas but semula, kerana perkhidmatan yang berfungsi daripada shell root interaktif tetapi gagal semasa but biasanya perbezaan keupayaan, peranti atau kebenaran fail. Catat tetapan unit di sebelah output keupayaan proses supaya penyemak seterusnya dapat melihat sama ada kemas kini pakej atau drop-in telah menggerakkan sempadan itu.