Bisakah saya membuat file hanya dapat diakses oleh skrip, dan bukan pengguna?

11

Saya memiliki pengguna dengan akses terbatas pada sistem (yaitu, dia bukan sudoer); sebut saja dia Bob .

Saya memiliki skrip atau biner yang saya, administrator sistem, percayai, dan tidak akan memiliki masalah menjalankannya sebagai root; sebut saja skripnya get-todays-passphrase.sh. Tugas skrip ini adalah membaca data dari file "pribadi" (dimiliki oleh pengguna / grup selain Bob, atau bahkan root) yang berada di /srv/daily-passphrases, dan hanya menampilkan baris tertentu dari file: baris yang sesuai dengan tanggal hari ini .

Pengguna seperti Bob tidak diizinkan untuk mengetahui frasa sandi besok, meskipun terdaftar dalam file. Karena alasan ini, file /srv/daily-passphrasesdilindungi oleh izin Unix, sehingga pengguna non-root seperti Bob tidak diizinkan untuk mengakses file secara langsung. Namun, mereka diizinkan menjalankan get-todays-passphrase.shskrip kapan saja, yang mengembalikan data "yang difilter".


Untuk meringkas (versi TL; DR ):

  1. Bob tidak dapat membaca file yang dilindungi
  2. Script dapat membaca file yang dilindungi
  3. Setiap saat, Bob dapat menjalankan skrip yang dapat membaca file

Apakah mungkin untuk melakukan ini dalam izin file Unix? Atau jika Bob memulai skrip, apakah skrip akan selalu ditakdirkan untuk dijalankan dengan izin yang sama dengan Bob?

IQAndreas
sumber

Jawaban:

13

Ini sebenarnya umum dan cukup mudah. sudomemungkinkan Anda membatasi aplikasi tertentu yang dapat dipanggil pengguna. Dengan kata lain, Anda tidak harus memberi mereka semua root atau tidak sama sekali; Anda dapat memberi mereka sudoizin untuk menjalankan perintah tertentu . Ini persis seperti yang Anda inginkan, dan merupakan praktik yang sangat umum untuk hal-hal seperti memungkinkan pengguna untuk mendorong repositori Git melalui SSH dan sejenisnya.

Untuk melakukan ini, yang harus Anda lakukan adalah menambahkan garis /etc/sudoersyang terlihat seperti

bob ALL=(root) NOPASSWD: /path/to/command/you/trust

(Bagian NOPASSWD:tidak diperlukan, tetapi sangat umum dalam situasi ini.) Pada titik itu, bobdapat meminta /path/to/command/you/trustmelalui sudo, tetapi tidak ada yang lain.

Yang mengatakan, memberi seseorang root — apa yang kita lakukan di sini — mungkin tidak seperti yang Anda inginkan. Khususnya, jika ada cacat apa pun dalam skrip Anda, Anda berisiko membiarkan kotak Anda di-root. Karena itu, Anda dapat memilih untuk membuat pengguna yang secara khusus memiliki file khusus — katakanlah, specialuser— lalu chownfile tersebut kepada mereka, dan /etc/sudoersbuatlah bobmenjadi pengguna khusus itu. Dalam hal ini, garis yang Anda tambahkan sudoershanyalah

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust
Benjamin Pollack
sumber
7
Saya sarankan untuk tidak menggunakan cara "root" - buat pengguna / grup khusus untuk tujuan ini.
guntbert
Poin bagus; Saya akan mengirim jawabannya.
Benjamin Pollack
7

Kata pengantar:

Seperti yang telah ditunjukkan dalam komentar dan untuk alasan yang dijelaskan dalam jawaban ini kernel linux mengabaikan bit setuid / setguid saat menangani skrip. Saya tidak akan menduplikasi jawaban Benjamin tetapi sebaliknya akan mengganti skrip dengan executabe untuk membuat jawaban saya benar.


Jawaban singkat: gunakan setgid

Langkah-langkah terperinci:

  1. Buat grup baru (mis. Readpass)
  2. Jadikan grup itu pemilik file frasa sandi sudo chown :readpass thatfile
  3. Jadikan file hanya dapat dibaca oleh grupnya sudo chmod g=r,o= thatfile
  4. Buat readpass sgid yang dapat dieksekusi :sudo chmod g+s thatfile

Dengan cara itu executable Anda akan berjalan dengan izin dari grup pemilik dan dengan demikian dapat membaca file.

Guntbert
sumber
2
Setgid dan setuid tidak mudah digunakan pada skrip, bukan?
muru
1
Anda tidak dapat membuat skrip setgid di Linux: bit setgid akan diabaikan. Sebagai gantinya, tambahkan aturan sudo yang memungkinkan bob berjalan thatfiledengan grup readpass.
Gilles 'SANGAT berhenti menjadi jahat'