ubuntu: izinkan pengguna menjalankan skrip dengan izin root

9

Saya memiliki ubuntu 8.04 dan saya ingin menulis skrip bash yang berjalan seperti rootyang dapat dijalankan setiap pengguna.

Saya sendiri bisa melakukan sudo.

Bagaimana aku melakukan itu?

KLARIFIKASI : Saya tidak ingin melakukannya dengan sudo, karena pengguna harus mengetikkan kata sandi mereka. Saya hanya ingin mereka menjalankan script sebagai root, mungkin sesuatu setuid, tidak tahu.

flybywire
sumber

Jawaban:

23

Jika ini adalah biner normal, Anda dapat mengaturuid dengan menjalankan

# chmod u+s /path/to/binary

Sayangnya, skrip tidak dapat disetuid. (Yah, Anda bisa, tapi itu diabaikan). Alasan untuk ini adalah bahwa baris pertama dari skrip memberitahu OS apa penerjemah untuk menjalankan skrip di bawah. Misalnya jika Anda memiliki skrip dengan:

#!/bin/bash

Anda benar-benar berakhir berlari

/bin/bash /path/to/script

Tentunya, Anda membutuhkan penerjemah untuk menjadi setuid, yang kemudian berarti semua skrip akan menjadi setuid. Ini akan menjadi buruk.

Anda dapat melakukan ini dengan sudo dengan meletakkan yang berikut ini di file / etc / sudoers Anda dengan menjalankan visudo.

ALL ALL=NOPASSWD: /path/to/script

Dan sekarang setiap pengguna dapat berjalan

$ sudo /path/to/script

Ini memungkinkan mereka untuk menjalankan skrip tanpa mengetik kata sandi mereka.

Ada alternatif yang tidak memerlukan sudo dalam perintah, yang mengharuskan membuat biner setuided kecil yang mengeksekusi skrip Anda, tetapi setiap biner setuid tambahan menambah potensi masalah keamanan.

David Pashley
sumber
Saya pikir ini adalah jawaban yang saya cari. Tidak bisakah saya mengatur skrip bash, hanya biner? (Tentu saja, saya akan mengambil langkah-langkah untuk membuatnya tidak dapat diedit)
flybywire
Tidak, Anda tidak dapat membuat setuid skrip.
wfaulk
wfaulk: Dulu Anda bisa, tetapi kebanyakan distro Linux terbaru tidak memperbolehkannya lagi. Anda dapat menggunakan alat seperti shc untuk 'mengkompilasi' skrip, dan kemudian membuatnya setuid.
Kyle Brandt
wfaulk: Tentu saja, itu akan pergi keluar dari cara Anda untuk melakukan sesuatu yang sengaja dinonaktifkan, sehingga mungkin ide yang buruk :-)
Kyle Brandt
Ganti istilah ALLdengan nama pengguna untuk memungkinkan hanya satu sudoer yang dapat dijalankan tanpa memasukkan kata sandi.
hdave
3

Saya perlu menyisipkan baris itu DI AKHIR / etc / sudoers: ALL ALL = NOPASSWD: <filename> Rupanya, %admin ALL=(ALL) ALLpenggantian yang kemudian membutuhkan kata sandi untuk pengguna admin.

Tidak ada masalah keamanan yang memungkinkan skrip dijalankan sebagai root selama skrip melakukan tindakan yang ditentukan dengan baik, tidak berbahaya, diizinkan dan, jika nilai untuk parameter apa pun tidak dapat menyebabkan skrip tersebut berperilaku salah.

Tapi ada gotcha ...

Selalu gunakan path lengkap dalam nama perintah dan file. Jika Anda menulis sesuatu seperti echo Hello world!di myrootscript, seseorang mungkin menulis ~/bin/echo scriptdan myrootscriptakan mengeksekusi sebagai root apa pun yang ada di dalamnya.

/bin/echo "Hoping this will keep you safe" :-)

André
sumber
jika mungkin bagi pengguna non-root pada mesin untuk mengedit skrip itu maka mungkin bagi pengguna tersebut untuk mengambil alih mesin. Jika pengguna yang sama memiliki kata sandi yang lemah maka tidak ada yang menjaga mesin Anda dari kompromi total.
hdave
2

Secara default, anggota wheelgrup diizinkan untuk sudoperintah apa pun sebagai root. Ini mungkin cara Anda menggunakan sudosampai saat ini.

Untuk mengizinkan pengguna lain, Anda harus membuat sudoersaturan. Sebagai contoh:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Akan memungkinkan pengguna mickey.mouseuntuk menjalankan perintah /usr/local/bin/test.shsebagai roottanpa memerlukan password yang cepat tambahan.

Anda harus membaca dokumen ini untuk informasi lebih lanjut.

Dan Carley
sumber
Debian / Ubuntu menggunakan grup admin daripada roda. Itu mungkin nama yang sedikit lebih akurat.
David Pashley
Panggil aku kuno, tapi ...;)
Dan Carley
1
kuno: P
David Pashley
0

Gunakan chmod +s <filename>untuk melihat bit suid. Ini berarti bahwa ketika file dieksekusi, itu berjalan dengan izin dari pemilik file (jadi chown ke root untuk membuatnya berjalan seperti itu).

Namun, ini bisa SANGAT berbahaya dengan sesuatu seperti skrip bash, karena pengguna menemukan cara untuk mengubahnya, mereka dapat dengan mudah mendapatkan shell root. Pastikan itu tidak dapat ditulis oleh siapa pun kecuali root.

Linux tidak memungkinkan Anda untuk mengatur cair pada skrip, untuk melakukan ini Anda harus mengkompilasinya sebagai sebuah program. Sebagai gantinya, Anda dapat menggunakan file sudoers (/ etc / sudoers), dan menambahkan baris seperti ini.

<username> ALL = NOPASSWD: /path/to/script

Dentrasi
sumber
0

Alternatif lain: Anda dapat melakukan pembungkus setuid C kecil di sekitar skrip itu

  • memeriksa batasan yang mungkin ingin Anda terapkan (daftar pengguna, waktu, beban sistem, ...)
  • eksekusi log / audit jika diinginkan
  • eksekutif skrip

Jenis suka subset Anda sendiri dari beberapa kemampuan sudo.

mpez0
sumber