Izinkan grup non-sudo mengontrol pekerjaan pemula

11

Saya mencoba mengatur pekerjaan pemula untuk dijalankan pada startup sistem, dan itu juga dapat dimulai / dihentikan oleh anggota grup selain sudo. Dengan versi sebelumnya, saya menggunakan update-rc.ddan skrip disimpan /etc/init.d/untuk mendapatkan ini bekerja dengan menambahkan %Group ALL = NOPASSWD: /etc/init.d/scriptnameke file sudoers saya, tetapi saya sepertinya tidak bisa mendapatkan yang setara bekerja untuk pemula.

Saya mencoba menambahkan %Group ALL = NOPASSWD: /sbin/initctl start jobnameke file sudoers, tetapi mencoba menjalankan perintah start jobnamemenghasilkan kesalahan ini:

start: Rejected send message, 1 matched rules; type="method_call", sender=":1.21" (uid=1000 pid=5148 comm="start jobname " interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")

Sejauh yang saya tahu, itu adalah keluhan tentang bagaimana akun pengguna saya tidak diberi kekuatan untuk mengirim pesan 'Mulai' dalam file konfigurasi D-Bus untuk Pemula. Saya belum dapat menemukan informasi tentang cara mengedit file itu untuk memberikan izin grup untuk mengakses layanan tertentu - apakah ada opsi seperti itu? Apakah ada cara untuk mengedit file Sudoers sehingga saya dapat menjalankan pekerjaan tanpa mengedit file konfigurasi? Apakah saya lebih baik hanya bertahan dengan versi sebelumnya?

Sudut O'Saxon
sumber

Jawaban:

7

Anda dapat mulai dengan mencari tahu di mana konfigurasi D-Bus khusus untuk pemula ini disimpan. Lihat destination="com.ubuntu.Upstart"cuplikan itu dari pesan kesalahan? Sekarang cobalah untuk menangkapnya di folder dengan file konfigurasi D-Bus:

vhost07:~ $ grep -r "com.ubuntu.Upstart" /etc/dbus-1
/etc/dbus-1/system.d/Upstart.conf:    <allow own="com.ubuntu.Upstart" />
[...skipped...]

Bahwa Upstart.confberkas memiliki beberapa contoh kebijakan. Saya kira Anda bisa mencoba mencari tahu format kebijakan dari mereka. Kemudian cobalah untuk mengizinkan pengguna spesifik Anda hanya tindakan yang diperlukan. Misalnya, seperti pada:

<policy user="pope_benedict">
  <allow send_destination="com.ubuntu.Upstart"
         send_interface="com.ubuntu.Upstart0_6.Job"
         send_member="Start"/>
</policy>

Ini harus memungkinkan pope_benedictpengguna untuk memulai pekerjaan itu.

Perhatikan bahwa nilai untuk atribut kebijakan 'izinkan' tercantum dalam pesan kesalahan asli Anda.

Iuliu Pascaru
sumber
1
Oh, dan jangan lupa untuk me-restart D-Bus setelah ini! :)
Iuliu Pascaru
Saya menemukan ini agak membingungkan, tetapi ini membantu: blog.arkency.com/2014/07/…
Mike Campbell
7

Saya pribadi menggunakan baris berikut di file /etc/sudoers.d/jobname_myuser:

myuser ALL = (root) NOPASSWD: /sbin/start jobname, /sbin/stop jobname, /sbin/restart jobname, /sbin/status jobname

seperti yang dijelaskan di sini: /server//a/390723/68608

Szymon Jeż
sumber
2

Opsi semacam itu tidak ada di sudo.

Perbedaan antara skrip Sysv dan file konfigurasi Pemula adalah hanya: Skrip Sysv adalah skrip, dapat dieksekusi dengan haknya sendiri dan Anda dapat memberi tahu sudo untuk mengizinkan beberapa grup untuk mengeksekusi mereka. Di sisi lain, file konfigurasi Pemula hanyalah file konfigurasi, bukan file yang dapat dieksekusi, jadi eksekusi start(symlink to initctl) adalah hal yang dimungkinkan oleh sudo. Masalah Anda di sini adalah memungkinkan orang untuk menjalankan initctlAnda mengizinkan mereka untuk initctlsegalanya.

Solusi itu sederhana jika kekhawatiran Anda hanya dalam satu pekerjaan. Buat skrip, katakan /usr/bin/jobname.shdengan

#!/bin/sh
initctl $1 jobname

lalu chmod 755 /usr/bin/jobname.shdan akhirnya tambahkan file executable itu ke file sudoers Anda:

%Group ALL = NOPASSWD: /usr/bin/jobname.sh

Dengan cara ini, semua orang dapat menelepon jobname.sh startatau jobname.sh stopmengontrol pekerjaan tertentu ini. Anda mungkin ingin menambahkan beberapa pemeriksaan untuk hanya mengizinkan startdan stopparameter dll.

Tuminoid
sumber
Dengan kata lain, masalah saya bukanlah bahwa sistem menyangkal anggota grup kemampuan untuk berjalan initctl, tetapi Upstart menolak sinyal yang dikirim oleh pengguna / grup yang tidak secara eksplisit diberi entri kebijakan Izinkan di Upstart.conf? Dan tidak ada cara untuk memberikan rincian lebih dari pengaturan semua pekerjaan-atau-tidak ada dalam file konfigurasi?
Angle O'Saxon
Initctl dalam kasus Anda berjalan dengan baik bahkan tanpa perubahan sudoers, Pemula baru saja menolak pesan dari itu jika Anda tidak secara khusus mengizinkannya untuk pengguna non-root. Lihat dua jawaban lainnya. Anda dapat mendefinisikan kebijakan dbus berdasarkan per-pekerjaan (lihat com.ubuntu.Upstart0_6.<JOB>bagian) di Upstart.conf. Tergantung pada kebutuhan Anda, mungkin lebih mudah untuk membuat skrip seperti ini daripada menulis kebijakan dbus dan memulai ulang dbus dll. Kebijakan Dbus jelas merupakan hal yang "benar" untuk dilakukan, tetapi tergantung pada suatu kasus, skrip sederhana mungkin menjadi jauh dengan sedikit kesulitan.
Tuminoid
Mengedit kebijakan DBus untuk digunakan com.ubuntu.Upstart0_6.jobnamesebagai send_interfacemenghasilkan pesan kesalahan yang sama seperti sebelumnya. Jika saya benar menebak bahwa output kesalahan berisi informasi sinyal, sepertinya antarmuka atau tujuan tidak mencerminkan layanan pemula yang merujuk sinyal. Saya pikir informasi layanan hanyalah argumen dalam pesan panggilan metode D-Bus, dan saya tidak yakin saya bisa mengedit kebijakan D-Bus untuk pemula untuk membuat keputusan berdasarkan nilai argumen.
Angle O'Saxon
Sebuah skrip yang Anda sarankan berfungsi dengan baik untuk saya, dengan satu peringatan: Saya sudah perlu menjalankannya sudo jobname.sh start, sehingga Upstart melihat permintaan datang dari pengguna. rootSaya berupaya untuk mencoba melakukan ini cara yang "benar" (sehingga menjauh dari skrip Sys-V di tempat pertama), jadi saya ingin ini bekerja melalui kebijakan D-Bus atau opsi konfigurasi Pemula lainnya, tetapi jika saya tidak bisa Agar berhasil, saya akan menerima jawaban ini.
Angle O'Saxon
1
Saya juga akan mengutip "$1". Dengan [ "$1" = "start" -o "$1" = "stop" ]pengujian Anda, saya yakin $1ekspansi skrip berjalan aman tetapi tidak dikutip karena root adalah kebiasaan yang tidak sehat (kecuali jika pemisahan kata sengaja diinginkan) ...
Beni Cherniavsky-Paskin
0

Seperti yang ditunjukkan di atas, dbus daemon memiliki file konfigurasi yang mengkhususkannya untuk aplikasi tertentu.

ls /etc/dbus-1/system.d/
avahi-dbus.conf
bluetooth.conf
...
Upstart.conf
wpa_supplicant.con

File konfigurasi juga menetapkan batas sumber daya, parameter keamanan, dan sebagainya.

Untuk detailnya lihat dbus-daemon-1 (1) - halaman manual Linux

Untuk mengizinkan grup memulai / menghentikan Pekerjaan pemula, tambahkan kebijakan berikut ke /etc/dbus-1/system.d/Upstart.conf

  <policy group="YourGroupName">
    <allow send_destination="com.ubuntu.Upstart"
       send_interface="com.ubuntu.Upstart0_6.Job"
       send_type="method_call" send_member="Start" />
    <allow send_destination="com.ubuntu.Upstart"
       send_interface="com.ubuntu.Upstart0_6.Job"
       send_type="method_call" send_member="Stop" />
  </policy>

Anda harus mempertimbangkan implikasi keamanan dari kebijakan tersebut sebelum mengubah kebijakan default. Anggota YourGroupName akan dapat memulai / menghentikan semua pekerjaan pemula.

Goran Miskovic
sumber
Tetapi apakah ada cara untuk membatasi pekerjaan yang dapat mereka kontrol? Atau apakah itu tidak mungkin karena D-Bus tidak memperhatikan konten pesan?
Angle O'Saxon
Saya mencoba menambahkan kebijakan itu ke Upstart.conf (mengganti nama grup dengan nama grup saya yang sebenarnya), memulai kembali D-Bus, dan mendapatkan start: You do not have permission to modify job: jobnameketika saya mencoba memulai layanan.
Angle O'Saxon
BAIK. Itu artinya kebijakan itu berhasil diterapkan. Tampaknya yourjob.conf ada di / etc / init. Pekerjaan pengguna harus dalam ~ / .it. Apakah masuk akal dalam use case Anda untuk menempatkan yourjob.conf di ~ / .init?
Goran Miskovic
Sehubungan dengan pertanyaan pertama Anda: Kebijakan menentukan antarmuka dan anggota mana yang dapat diakses. Itu mendefinisikan konten / argumen mana yang dapat dikirim / diteruskan. Kebijakan pembatasan saat ini telah dikurangi di hulu. Lihat tidak bisa mendapatkan pemula untuk menjalankan pekerjaan pengguna
Goran Miskovic