Layanan mulai, log mengeluh tidak dapat membuka perangkat tun, dan rute tidak pernah muncul. Jalankan capsh --print di shell Anda dan cap_net_admin ada di sana, sehingga kegagalan tampak mustahil. Yang berbeda antara shell Anda dan unit adalah transisi hak istimewa, bukan kesediaan kernel memberikan kapabilitas. Lakukan empat pemeriksaan di bawah ini secara berurutan dan berhenti pada yang pertama yang menjelaskan kesenjangan.

Pisahkan kapabilitas yang hilang dari perangkat yang tersembunyi

Dua kegagalan terlihat sama dari baris log. Proses tanpa CAP_NET_ADMIN tidak dapat membuat atau mengonfigurasi antarmuka tunnel, dan proses yang sandbox-nya menyembunyikan /dev/net/tun tidak dapat membukanya sejak awal. Menambah kapabilitas tidak akan memperbaiki kasus kedua.

Periksa apakah perangkat ada di dalam namespace layanan sebelum Anda mengubah apa pun. PrivateDevices=yes adalah baris pengerasan umum yang menghapus node tun sepenuhnya, dan ProtectSystem yang membatasi dapat membuat jalur konfigurasi hanya-baca dengan cara yang terbaca seperti kesalahan izin. Keduanya menghasilkan baris log yang menyebut tunnel, itulah sebabnya kapabilitas disalahkan. Pastikan node ada dan dapat dibuka dulu, lalu lanjutkan.

Ketahui set kapabilitas mana yang Anda lihat

Linux menyimpan set yang diizinkan, efektif, dapat diwariskan, pembatas, dan ambient, dan set ambient-lah yang bertahan dari exec oleh pengguna non-root. Kapabilitas berkas pada biner dapat menyerahkan hak yang diizinkan dan efektif saat exec, tetapi hanya selama tidak ada yang memblokir transfer itu di rantai.

Di sinilah sudo menyesatkan orang. Perintah yang dijalankan melalui sudo -u memulai transisi hak istimewa baru dan set ambient hilang, sehingga pemeriksaan yang sama yang berhasil sebagai root gagal di sana. Manajer layanan adalah transisi lain lagi, dan ia tidak memberikan apa pun yang ambient kecuali unit mengatakannya.

Berikan kapabilitas di unit, bukan di pembungkus

Bagian layanan minimal untuk tunnel yang perlu membuat perangkat dan memasang rute terlihat 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.conf

AmbientCapabilities menaruh hak ke dalam set ambient sebelum proses mulai, dan CapabilityBoundingSet mencegah proses memegang apa pun di luar daftar itu. NoNewPrivileges=yes memblokir perolehan hak istimewa melalui setuid atau kapabilitas berkas, sementara kapabilitas yang diberikan unit secara eksplisit tetap berlaku. Tambahkan CAP_NET_BIND_SERVICE hanya ketika layanan harus mengikat port rendah, dan jangan pernah menambahkan CAP_SYS_ADMIN hanya karena sebuah utas forum melakukannya.

Jika unit membungkus biner dalam sudo, hapus pembungkusnya. systemd sudah menerapkan User=, dan lapisan tambahan itulah alasan paling mungkin set ambient kosong.

Verifikasi terhadap proses yang hidup, bukan berkas unit

Baca apa yang sebenarnya diterapkan manajer, lalu baca proses yang dijalankannya.

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")/status

Jika unit mencantumkan kapabilitas dan CapEff masih tidak memilikinya, ada drop-in yang menimpa pengaturan atau langkah ExecStartPre mengubah lingkungan. Cari nama unit di direktori drop-in sebelum Anda menganggap berkas utama berwenang, karena berkas yang lebih akhir menang secara diam-diam. Jika unit dan proses sama-sama menunjukkan kapabilitas dan tunnel tetap gagal, kembalilah ke pemeriksaan perangkat dan jalur alih-alih memperlebar set pembatas. Memperlebarnya menyembunyikan penyebab sebenarnya dan meninggalkan layanan lebih berhak istimewa daripada sebelumnya.

Lebih baik melepaskan hak istimewa setelah mulai

OpenVPN dapat mulai dengan hak istimewa lalu turun ke akun tanpa hak istimewa melalui opsi user dan group miliknya sendiri, dengan persist-key dan persist-tun menjaga tunnel tetap dapat digunakan setelahnya. Susunan itu mempersempit jendela saat proses memegang hak, dan sering kali lebih cocok daripada memulai seluruh daemon tanpa hak istimewa dengan kapabilitas permanen.

Model mana pun yang Anda pilih, mulai ulang unit dan ulangi pemeriksaan setelah reboot, karena layanan yang berfungsi dari shell root interaktif dan gagal saat boot biasanya merupakan perbedaan kapabilitas, perangkat, atau izin berkas. Catat pengaturan unit di samping keluaran kapabilitas proses agar peninjau berikutnya dapat melihat apakah pembaruan paket atau drop-in menggeser batas.

Artikel terkait