Bagaimana saya mengizinkan pengguna non-root untuk mengontrol layanan systemd dengan instance?


12

Saya perlu mengizinkan pengguna dalam dbagrup untuk mengontrol database@layanan. Jawaban untuk pertanyaan terkait ini adalah dengan hanya mencantumkan semua systemctl"kata kerja" yang ingin saya izinkan dalam sudoersfile, namun, itu tidak berlaku untuk kasus saya karena saya tidak tahu sebelumnya apa basis data yang mungkin ada dalam sistem. Misalnya, jika saya daftar

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

itu tidak mencakup contoh yang mungkin ada di masa depan, dan dba tidak akan bisa

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

Ngomong-ngomong, aku berpikir lebih dalam hal pengemasan daripada mengotak-atik sistem tertentu.

Perhatikan bahwa, seperti yang ditunjukkan dalam jawaban yang luar biasa untuk pertanyaan terkait lainnya , menggunakan sudo gumpalan untuk ini pada akhirnya tidak aman:

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

memang memungkinkan

$ sudo systemctl start database@awsesomeapp unrelatedservice

Saya curiga menggunakan sudotidak akan menyelesaikan masalah saya (meskipun saya harap saya salah). Apakah ada cara lain untuk memungkinkan pengguna non-root untuk mengontrol systemdlayanan?

Untuk apa nilainya, saya perlu melakukan ini dalam sistem CentOS 7, dan sistem RHEL7 di masa depan. Saya juga akan tertarik dengan solusi yang bekerja di Arch Linux.

Jawaban:


1

File Sudoers tidak akan berfungsi seperti itu, atau begitulah menurut saya. File Sudoers dimaksudkan untuk memberikan akses perintah tertentu, bukan untuk menentukan argumen yang dapat pergi dengan perintah itu.

Buat skrip yang berjalan sebagai root dan jalankan ini:

/usr/bin/systemctl start database@

Buat skrip mengambil argumen seperti aplikasiawaw lain sehingga mengeksekusi ini:

Script mengeksekusi: / usr / bin / systemctl start database @ anotherawsesomeapp

Berikan izin kepada pengguna Anda untuk menjalankan file script.sh dengan / etc / sudoers.

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

Pengguna dapat menjalankannya seperti ini:

sh script.sh anotherawsesomeapp

Contoh:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi

1
Seperti-apakah ini memiliki masalah yang sama dengan yang sudoers. Anda perlu mengutip variabel atau akan dibagi pada spasi.
Kyrias

Ini tidak akan berhasil; setuid tidak dihormati untuk skrip shell (di Linux).
Martijn

Yang dilakukannya hanyalah menggunakan sudo untuk menjalankan skrip. Ini tidak berbeda dari yang sama dengan skrip 'hello world'. Jika root dapat menjalankan skrip, itu akan berhasil.
Baazigar 3-15

0

Solusi yang diusulkan berdasarkanSUID

Anda dapat membuat skrip yang menyebut systemctl dengan sudo. Jadikan skrip dimiliki oleh root. Berikan SUIDizin untuk me-root dan membaca serta mengeksekusi izin ke grup administrator basis data (dba).
Berhati-hatilah untuk tidak memberikan izin tertulis kepada grup atau orang lain karena dengan begitu mereka dapat mengubah skrip dan membuatnya menjalankan apa pun yang diawali dengan sudo! Pastikan juga skripnya tahan input peluru.

$ cat >> start_database.sh
sudo / usr / bin / systemctl mulai database @ $ 1
(Ctrl + D)

Skrip ini dapat diperbaiki dengan memeriksa apakah argumen tersebut benar-benar disertakan dan mencetak pesan Penggunaan: jika tidak ..., juga karena itu adalah skrip SUIDyang akan cocok untuk diperiksa; untuk menghindari injeksi perintah lain yang mengikuti argumen. Atau bahkan lebih baik pastikan untuk mengizinkan sebagai masukan hanya satu dari string terkait aplikasi yang Anda sebutkan!
Maka Anda harus memastikan izin untuk skrip ini benar-benar berikut ini:

$ sudo chown root: dba start_database.sh
$ sudo chmod ux, gw, o-rwx start_database.sh
$ sudo chmod u + s, g + rx start_database.sh

Kemudian untuk memverifikasi izin yang benar:

$ ls -la
.
.
.
-rwSr-x --- 1 root dba 35 Agustus 2 19:11 start_database.sh
.
.
.

Jadi, untuk rekap:

1. owner of the script is root
file can be read and executed by the dba group members
2. no-one else will be able to even readitu.
4. SUIDakan memungkinkan pengguna yang mengeksekusi skrip menjadi root selama skrip dieksekusi.
5. Jadi sudo tidak akan berhenti untuk kata sandi.

Bagaimanapun, dalam sistem dengan banyak pengguna, berhati - hatilahSUID karena dapat meninggalkan ruang untuk penyalahgunaan izin.


Anda kehilangan shebang di skrip Anda dan bahkan kemudian, SUIDtidak akan berfungsi untuk skrip secara default.
Jan Tojnar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.