Saya membuat beberapa layanan systemd yang pada dasarnya berfungsi:
lokasi:
/etc/systemd/system/multi-user.target.wants/publicapi.service
kandungan:
[Unit]
Description=public api startup script
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop
[Install]
WantedBy=multi-user.target
Ketika saya mencoba me-restart layanan sebagai pengguna techops di baris perintah, saya mendapatkan output berikut:
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'publicapi.service'.
Multiple identities can be used for authentication:
1. Myself,,, (defaultuser)
2. ,,, (techops)
Choose identity to authenticate as (1-2):
Saya ingin hanya Techops yang dapat me-restart layanan dan saya ingin prompt ini tidak muncul ketika sedang login sebagai Techops. Bagaimana saya bisa melakukan itu?
Saya membaca bahwa ada pendekatan berbeda dengan polkit-1 atau sudoers, tapi saya tidak yakin.
[UPDATE] 2019-01-27 4:40 pm
Terima kasih atas jawaban komprehensif ini untuk Thomas dan Perlduck. Ini membantu saya meningkatkan pengetahuan saya tentang systemd.
Menurut pendekatan untuk memulai layanan tanpa kata sandi, dan saya ingin meminta maaf bahwa saya tidak cukup menekankan masalah sebenarnya:
Sebenarnya, yang paling penting bagi saya adalah bahwa tidak ada pengguna selain techops yang harus menghentikan atau memulai layanan. Tetapi setidaknya dengan dua pendekatan pertama saya masih bisa menjalankan service publicapi stop
dan saya mendapatkan prompt ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
lagi. Ketika saya memilih pengguna default dan mengetahui kata sandi, saya bisa menghentikan semua layanan. Saya ingin menolak pengguna ini melakukan hal itu, meskipun ia memiliki kata sandi . Info latar belakang penting untuk lebih memahami mengapa ini adalah bagian yang lebih penting bagi saya:
Pengguna default adalah satu-satunya pengguna yang terkena ssh tetapi pengguna ini tidak dapat melakukan hal lain (kecuali mengubah ke pengguna lain jika Anda memiliki kata sandi dari pengguna lain ini) . Tetapi saat ini, ia dapat memulai atau menghentikan layanan, tetapi pengguna ini tidak boleh melakukan ini.
Jika seseorang mendapatkan kata sandi pengguna default dan masuk melalui ssh, maka dia bisa menghentikan semua layanan saat ini. Inilah yang saya maksudkan dengan "Saya ingin hanya techops yang dapat memulai kembali layanan". Maaf, saya tidak tepat pada pertanyaan awal saya. Saya pikir sudoing pengguna techops mungkin akan memotong masalah ini, tetapi tidak. Masalahnya bukan menjalankan perintah tanpa kata sandi. (Saya bisa dengan mudah melakukan itu sebagai pengguna Techops ketika saya baru saja menjalankan /home/techops/publicapi start
). Masalahnya sendiri adalah untuk mengunci pengguna default dari memulai layanan ini.
Dan saya berharap ada solusi yang bisa melakukannya.
Saya mulai dengan pendekatan Thomas. Pendekatan dengan sudo berfungsi ketika saya tidak ingin dimintai kata sandi untuk pengguna techops ketika saya menjalankan perintah seperti yang dijelaskan, misalnya
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
Pendekatan kedua belum bekerja untuk saya. Saya tidak dapat memulai layanan tanpa prompt kata sandi ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
dan saya berhenti dapat login sebagai pengguna default ketika saya memiliki kata sandi pengguna ini.
Dengan pendekatan ketiga, layanan ini bahkan tidak mulai saat proses boot lagi jadi saya tidak yakin apakah pendekatan ini yang tepat untuk saya. Saya bahkan tidak bisa melakukannya dengan systemctl enable publicapi.service
yang membawa saya ke kesalahan berikut:
Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.
Kesalahan tidak terjadi ketika saya memindahkan semua layanan kembali ke / etc / systemd / system / dan jalankan systemctl enable publicapi.service
. Kemudian layanan mulai lagi saat boot.
Semua pendekatan ini akan sedikit banyak membantu untuk mem-bypass prompt kata sandi untuk pengguna techops tetapi ketika saya menjalankan service publicapi stop
atau systemctl stop publicapi
dengan pengguna default, saya dapat menghentikan layanan jika saya memiliki kata sandi. Tetapi target saya adalah untuk mengunci pengguna default dari memulai atau menghentikan layanan sama sekali.
sumber
systemctl --user ...
sebagai penggunatechops
bukan sebagai root. Baik saran saya maupun salah satu dari @PerlDuck memberikan setiapsudo
hak Anda defaultuser tetapi hanya untuk techops pengguna./etc/sudoers
file Anda jika ada referensi untuk pengguna itu.Jawaban:
Untuk mencapai itu pengguna
techops
dapat mengontrol layananpublicapi.service
tanpa memberikan kata sandi, Anda memiliki berbagai kemungkinan. Yang mana yang cocok untuk Anda tidak dapat dijawab karena Anda harus memilih sendiri.sudo
Pendekatan klasik mungkin yang paling banyak digunakan, karena sudah ada sejak lama. Anda harus membuat mis. File sebagai berikut.Perhatikan bahwa direktori drop-in
/etc/sudoers.d
hanya aktif ketika#includedir /etc/sudoers.d
diatur/etc/sudoers
. Tapi itu harusnya terjadi jika Anda menggunakan distribusi Ubuntu modern. Sepertiroot
mengeksekusi:Sekarang Anda harus dapat menjalankan
systemctl
perintah sebagai penggunatechops
tanpa memberikan kata sandi dengan menambahkan terlebih dahulusudo
ke perintah.Metode kedua adalah menggunakan PolKit (diganti namanya dari PolicyKit ) untuk memungkinkan pengguna
techops
mengontrolsystemd
layanan. Bergantung pada versipolit
, Anda dapat memberi pengguna normal kontrol atas unit sistemd.Untuk memeriksa versi polkit , jalankan
pkaction --version
.dengan polkit versi 0.106 dan lebih tinggi , Anda dapat memungkinkan pengguna untuk mengontrol unit systemd tertentu.
Untuk melakukannya, Anda bisa membuat aturan sebagai
root
:dengan polkit versi 0.105 dan lebih rendah : Anda dapat memungkinkan pengguna untuk mengontrol unit systemd. Sayangnya ini mencakup semua unit systemd dan Anda mungkin tidak ingin melakukan ini. Tidak yakin apakah ada cara untuk membatasi akses ke unit systemd tertentu dengan versi 0.105 atau lebih rendah, tapi mungkin orang lain bisa mengklarifikasi.
Untuk mengaktifkan ini, Anda dapat membuat file sebagai
root
:Dalam kedua kasus, Anda dapat menjalankan
systemctl [start|stop|restart] publicapi.service
sebagai penggunatechops
tanpa memberikan kata sandi. Dalam kasus terakhir (polkit <= 0,105) penggunatechops
dapat mengontrol unit systemd apa pun.Opsi ketiga adalah menjadikan layanan tersebut layanan pengguna, yang tidak perlu
sudo
ataupolkit
konfigurasi. Ini menempatkan semuanya di bawah kendali pengguna dan hanya berfungsi jika layanan Anda yang sebenarnya yang dimulai dengan/home/techops/publicapi start
dapat berjalan tanparoot
hak istimewa.Pertama, Anda harus mengaktifkan berlama-lama untuk pengguna
techops
. Ini diperlukan untuk memulai layanan pengguna saat boot. Sepertiroot
mengeksekusi:Selanjutnya Anda harus memindahkan
systemd
file unit ketechops
direktori pengguna. Sebagai penggunatechops
jalankan perintah sebagai berikut.Perhatikan bahwa
WantedBy
harusdefault.target
karena tidak adamulti-user.target
dalam konteks pengguna.Sekarang muat ulang konfigurasi dan aktifkan layanan. Sekali lagi saat pengguna
techops
menjalankan perintah.Secara umum Anda harus menempatkan unit systemd Anda di
/etc/systemd/system/
tidak langsung dalam/etc/systemd/system/multi-user.target.wants
. Ketika Anda mengeksekusisystemctl enable publicapi.service
tautan simbolik akan dibuatetc/systemd/system/multi-user.target.wants
atau target apa pun yang ditentukan untuk unit itu.Seperti yang telah disebutkan, jika layanan / proses itu sendiri dapat dijalankan tanpa hak root, Anda harus mempertimbangkan
User=techops
untuk menambahkan ke file unit Anda untuk menjalankan proses dengan akun pengguna yang tidak diistimewakan.sumber
.pkla
tidak berfungsi. Ini perlu[section]
entri. Jawaban yang diperbarui.Pertama-tama, Anda tidak meletakkan file unit dalam direktori
/etc/systemd/system/multi-user.target.wants
. Direktori ini dikelola olehsystemd
dansystemctl
perintah. Masukkan file unit/etc/systemd/system
sebagai gantinya dan kemudian aktifkan denganIni akan membuat symlink di bawah ini
multi-user.target.wants
(atau di mana pun,systemctl
lebih tahu) untuk menghormati garisdi unit.
Selanjutnya, buat
sudoers
file di bawah ini/etc/sudoers.d
:dengan konten berikut:
Jangan gunakan editor reguler (mis.
sudo vim /etc/sudoers.d/techops
) Untuk mengedit file itu karena jika Anda memasukkan kesalahan sintaksis di dalamnya, Anda tidak akan dapat menjalankannyasudo
lagi.visudo
di sisi lain memeriksa sintaksis dari file sebelum meninggalkan editor.Sekarang pengguna
techops
dapat berlaridan dua lainnya tanpa memberikan kata sandi. Perhatikan bahwa Anda harus mengetik perintah dan parameter persis seperti yang diberikan dalam
sudoers
file (kecuali untuk/bin/systemctl
bagian yang dapat disingkat menjadi adilsystemctl
).Misalnya,
sudo /bin/systemctl start publicapi
(tanpa.service
) akan meminta kata sandi.sumber