Memberi akses seperangkat perintah ke pengguna non-root tanpa sudo


13

Saya ingin memberikan akses non-sudo ke pengguna non-root di komputer saya, ada pengguna dns-manager, satu-satunya perannya adalah menjalankan semua perintah BIND (rndc, dnssec-keygen) dll.

Sekarang setiap kali dia harus menjalankan perintah, dia mengetik,

sudo rndc reload

Apakah ada cara saya bisa menghilangkan sudo ini, tetapi hanya pada seperangkat perintah tertentu (dan hanya untuk dns-manager)?


5
Kontrol akses diskresioner seperti ini untuk apa sudo. Apa keberatan bisnis Anda terhadap penggunaannya sudountuk ini?
MadHatter

1
@peterh Saya ulangi pertanyaan saya: kontrol akses diskresioner (yaitu, delegasi sysadm parsial) adalah peran sudo. Apa keberatannya?
MadHatter

3
Bagaimana kalau tanpa kata sandi sudo? Atau sudo dengan kata sandi untuk menjalankan alat manajemen DNS , yang kemudian dapat beroperasi dengan namedhak istimewa kelompok atau pengguna, atau hak istimewa root, sesuai kebutuhan.
MadHatter

4
@peterh "alasan bagus untuk melakukannya dengan cara ini" adalah bagian yang hilang. Biasanya pertanyaan seperti ini ternyata adalah masalah XY yang tersamar, dan saya menemukan bahwa memahami masalah mendasar adalah kunci untuk menjawabnya secara penuh dan profesional.
MadHatter

2
@ Peterh, saya pikir kita sepakat satu sama lain. Saya juga ingin melihat OP meningkatkan pertanyaannya; menggali ke dalamnya bekerja dengan baik bagi saya sebagai cara untuk membantu penulis berpikir di luar kotak yang ia bangun di sekitar dirinya. Dia mungkin punya alasan bagus untuk menghindar sudo. Dalam mencoba mengungkapkannya kepada kita, dia dapat menjernihkan kebingungan kita, atau kebingungannya sendiri - atau keduanya!
MadHatter

Jawaban:


31

Jika saya memahami komentar Anda dengan benar, masalah di sini adalah bahwa perintah akan dikeluarkan melalui koneksi yang tidak memiliki kemampuan untuk memasukkan kata sandi yang sudo default untuk meminta. Juga, dalam banyak distribusi OS, sudo akan default untuk memerlukan TTY - yang mungkin tidak dimiliki oleh program ini.

Namun, sudo dapat memiliki struktur izin yang sangat halus, memungkinkan untuk memungkinkan satu atau lebih pengguna untuk mengeluarkan satu perintah tertentu tanpa kata sandi dan TTY. Di bawah ini, saya akan menunjukkan tiga cara untuk mengkonfigurasi ini untuk kebutuhan Anda. Apa pun yang Anda pilih, pengguna sekarang dapat mengeluarkan perintah sudo rndc reloadtanpa harus memasukkan kata sandi.

(Juga, ini mungkin tidak perlu, tapi ... harap ingat untuk membuat salinan cadangan file sudoers Anda sebelum mengeditnya, untuk menyimpan shell di tempat Anda root terbuka jika Anda perlu kembali ke cadangan, dan untuk mengedit menggunakan visudoalih-alih sudo vi /etc/sudoers. Mudah-mudahan tindakan pencegahan ini tidak perlu, tapi ... lebih baik memilikinya dan tidak membutuhkannya daripada sebaliknya!)

1. Jika Anda tidak ingin meminta TTY untuk permintaan apa pun

Cara termudah untuk menyingkirkan persyaratan TTY (jika ada) adalah memastikan bahwa baris yang dimulai dengan Defaultsdi /etc/sudoerstidak mengandung kata requiretty- sebaliknya, seharusnya berisi !requiretty. Namun, jika Anda melakukan ini, itu berarti bahwa tidak ada perintah sudo yang membutuhkan tty!

Anda juga perlu menambahkan baris

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. Jika Anda ingin meminta TTY untuk semua pengguna kecuali yang ini

Ini dapat dilakukan dengan menetapkan default untuk pengguna yang satu ini, seperti ini:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. Jika Anda ingin mengirim kembali TTY untuk semua perintah kecuali perintah yang satu ini oleh pengguna yang satu ini

Ini sedikit lebih rumit, karena sintaks dari file sudoers. Anda harus membuat alias alias untuk perintah, dan kemudian menetapkan default untuk alias perintah itu, seperti:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD

Tentu saja, ini dapat dikombinasikan dengan skrip wrapper yang memanggil perintah menggunakan sudo, jika karena alasan tertentu Anda tidak dapat menggunakan sudo secara langsung bahkan ketika itu tanpa kata sandi.
Jenny D

4

Iya. sudo dapat dikonfigurasi dengan sangat fleksibel. Meski begitu, saya harus menyebutkan: jenis-jenis solusi ini tidak boleh dianggap sangat aman, dan mereka hanya boleh digunakan dalam lingkungan kerja sama di mana kontrol lain berada di tempat (dengan demikian, Anda dapat memberikan hak istimewa yang ditingkatkan ini kepada bawahan setia Anda, tetapi seharusnya tidak melakukannya untuk pelanggan yang Anda tahu hanya dari internet).

Konfigurasi sudo ada di /etc/sudoers di sebagian besar sistem. Anda dapat mengetahui sintaksnya dengan Googling atau dengan man sudoperintah.

Anda tidak boleh mengedit file ini secara langsung; hal itu dapat menyebabkan kondisi perlombaan keamanan. Sebagai gantinya, gunakanvisudo perintah (yang merupakan pembungkus $EDITORvariabel lingkungan Anda ).


Setelah Anda mengkonfigurasi sudo, Anda dapat dengan mudah membungkus ini di sekitar perintah yang terlihat. Ini sangat sederhana:

  1. Buat direktori untuk daftar skrip sudo wrapper Anda (fe /usr/local/dnsadmin/bin )
  2. Buat skrip wrapper untuk perintah yang Anda inginkan agar dapat digunakan tanpa sudo. Ini akan menjadi perintah yang sangat sederhana, misalnya, /usr/local/dnsadmin/bin/rndcakan menjadi:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. Dapatkan direktori ini ke PATHvariabel lingkungan mereka (mis. Oleh sistem-lebar atau lokal mereka .profile).


Karena penasaran - mengapa Anda menggunakan execskrip shell daripada hanya memanggil perintah secara langsung? (Saya tidak mengatakan itu salah, saya hanya ingin tahu mengapa Anda melakukannya sehingga saya bisa belajar sesuatu)
Jenny D

2
Saya sudah selesai dengan bit sudo tanpa kata sandi, ide skrip wrapper sangat bagus.
Anss

2
@ JennyD :-) Karena stabilitas dan kinerja. Dalam hal ini exec, perintah yang dipanggil akan diganti di tempat shell. Shell akan pergi. Tanpa exec, shell akan memulai perintah itu, dan kemudian menunggu terminasi, dan kemudian keluar. Yang kedua, exec-less berarti beberapa proses kerja sama, yang tidak dibutuhkan. Tetapi tidak ada perbedaan besar, tanpa eksekutif akan bekerja dengan baik dengan itu.
peterh

@ JennyD Permohonan saya :-)
peterh - Reinstate Monica

@Snowbody Terima kasih banyak atas lectoring! Ini adalah kehormatan yang sangat besar.
peterh

2

Meskipun ini bukan solusi umum dalam kasus spesifik rndcAnda tidak perlu sudosama sekali.

rndcdapat berkomunikasi dengan namedproses apa pun baik melalui soket lokal atau port jarak jauh, menggunakan kunci rahasia untuk mengotentikasi dirinya sendiri. Secara default (atau setidaknya, untuk debian, yang merupakan distro yang saya gunakan) file ini dapat ditemukan di /etc/bind/rndc.keydan biasanya hanya dapat dibaca oleh pengguna binddan grupbind .

Siapa pun yang memiliki akses baca ke file kunci itu (atau salinannya yang identik) dapat digunakan rndcuntuk mengontrol server BIND, sehingga solusi termudah dalam kasus khusus ini adalah menambahkan pengguna ke bindgrup.

Sejumlah daemon umum yang mengejutkan memiliki pengaturan serupa (saya pribadi masih mencari tahu kemungkinan powerdns dalam hal itu, tetapi sejauh ini terlihat menjanjikan). Jika Anda tidak ingin melakukannya, sudoAnda harus memeriksa apakah yang ingin Anda capai adalah mungkin berdasarkan kasus per kasus.


-1

Anda tidak ingin menggunakan sudo untuk memberikan root untuk beberapa perintah. Sebagai gantinya Anda dapat chmod 4750 program tertentu [yang dapat membungkus perintah], untuk meningkatkan hak-hak pengguna normal untuk mengeksekusi itu sebagai root.

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.