Pemula: memungkinkan pengguna normal untuk berhenti dan memulai layanan khusus saya

16

Saya sudah mendapatkan aplikasi server web saya mulai saat boot menggunakan pemula. Ini adalah skrip pemula:

# web app node upstart file at /etc/init/webapp.conf

description "web application"

start on started mongodb
stop on runlevel [06]

respawn
respawn limit 10 100

env NODE_ENV=production

pre-start script
    ulimit -n 2048
end script

exec start-stop-daemon --start -c mainuser --exec /usr/bin/make -- -C /home/mainuser/app start-prod

Ini berfungsi dengan sempurna di server Ubuntu 10,04 LTS dan saya sangat senang karenanya.

Namun, saya memiliki skrip shell penempatan yang masuk menggunakan SSH sebagai mainuser(ini bukan sudoer) dan kemudian akan memperbarui direktori kerja ke versi penyebaran terbaru.

Masalahnya di sini adalah bahwa layanan perlu di-restart sehingga aplikasi memuat file sumber baru. Namun, mainusermendapat ...

mainuser@Saturn101:~$ stop webapp
-bash: stop: command not found

... ketika mencoba menghentikannya. Saya harus menjalankan sudo stop webapp, tetapi pengguna ini tidak dapat melakukan ini karena ia bukan sudoer. Untuk alasan keamanan saya tidak ingin dia menjadi sudoer juga, ditambah saya tidak ingin memasukkan kata sandi sudo.

Jadi, bagaimana cara saya mainusermenjalankan stop webappdan menjalankan start webapp?

Tom
sumber
1
Masalah keamanan apa yang Anda khawatirkan dengan menambahkan pengguna ke sudoers? Anda dapat menulis aturan yang memungkinkan pengguna hanya perintah tertentu dan tidak lebih, juga Anda dapat menyertakan opsi nopasswd untuk menjauhkan prompt kata sandi. Adapun kesalahan spesifik yang Anda dapatkan, itu karena start / stop ada di / sbin, yang biasanya bukan bagian dari jalur pengguna normal. Jadi Anda bisa melakukan "/ sbin / stop", atau menambahkan sbin ke path. Ini dapat berfungsi selama tidak ada item lain dalam skrip start / stop yang membutuhkan root.
Derek Pressnall
@DerekPressnall, terima kasih, tetapi ketika saya menjalankan /sbin/stop webappsaya mengerti stop: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory. Bagaimana saya mengizinkan mainuserhanya menjalankan perintah ini?
Tom
Kesalahan adalah hasil dari pengguna ini tidak memiliki hak admin.
Tom

Jawaban:

31

sudo sangat bisa dikonfigurasi, Anda dapat mengizinkan pengguna ini untuk menjalankan serangkaian perintah terbatas tanpa meminta kata sandi. Baris berikut dalam /etc/sudoersharus melakukan apa yang Anda inginkan:

mainuser ALL = (root) NOPASSWD: /sbin/start webapp, /sbin/stop webapp
Mgorven
sumber
1
Luar biasa, terima kasih banyak. Apakah Anda benar-benar mempelajari semua ini man sudoers? Saya merasa cukup sulit untuk menguraikan.
Tom
1
Tidak, saya pernah melakukan ini sebelumnya. Ini bukan halaman manual termudah untuk menguraikan :-)
mgorven
Gagal dengan Unable to connect to system bus. Lebih lanjut: Izinkan grup non-sudo mengontrol pekerjaan
Pemula