Suatu aplikasi yang sangat besar membutuhkan, pada satu waktu tertentu, untuk melakukan sejumlah kecil penulisan ke file yang memerlukan izin root. Ini bukan benar-benar file tetapi antarmuka perangkat keras yang terkena Linux sebagai file.
Untuk menghindari memberikan hak akses root ke seluruh aplikasi, saya menulis skrip bash yang melakukan tugas-tugas penting. Misalnya, skrip berikut akan mengaktifkan port 17 dari antarmuka perangkat keras sebagai output:
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
Namun, seperti suid
yang dinonaktifkan untuk skrip bash di sistem saya, saya bertanya-tanya apa cara terbaik untuk mencapai ini.
Gunakan beberapa solusi yang disajikan di sini
Panggil skrip dengan
sudo
dari aplikasi utama, dan edit daftar sudoers sesuai, untuk menghindari memerlukan kata sandi saat memanggil skrip. Saya sedikit tidak nyaman untuk memberikan hak istimewa sudoecho
.Cukup tulis program C, dengan
fprintf
, dan atur ke suid root. Hardcode string dan nama file dan pastikan hanya root yang bisa mengeditnya. Atau baca string dari file teks, juga pastikan tidak ada yang bisa mengedit file.Beberapa solusi lain yang tidak terpikir oleh saya dan lebih aman atau lebih sederhana daripada yang disajikan di atas?
sumber
Jawaban:
Anda tidak perlu memberikan
sudo
akses keecho
. Sebenarnya, itu tidak ada gunanya karena, misalnya dengansudo echo foo > bar
, pengalihan dilakukan sebagai pengguna asli, bukan sebagai root.Panggil skrip kecil dengan
sudo
, memungkinkanNOPASSWD:
akses ke HANYA skrip itu (dan skrip sejenis lainnya) oleh pengguna yang membutuhkan akses ke skrip tersebut.Ini selalu merupakan cara terbaik / teraman untuk digunakan
sudo
. Isolasikan sejumlah kecil perintah yang memerlukan hak akses root ke skrip terpisah mereka sendiri dan izinkan pengguna yang tidak tepercaya atau sebagian tepercaya hanya menjalankan skrip itu sebagai root.sudo
Script yang kecil sebaiknya tidak mengambil argumen (atau input) dari pengguna (mis. Program lain mana pun yang dipanggil harus memiliki opsi dan kode yang sulit) atau harus dengan sangat hati-hati memvalidasi argumen / input yang harus dibuat. terima dari pengguna.Jadilah paranoid dalam validasi - daripada mencari hal-hal yang 'diketahui buruk' untuk dikecualikan, hanya izinkan hal-hal yang 'diketahui baik' dan batalkan segala ketidaksesuaian atau kesalahan atau apa pun yang bahkan mencurigakan.
Validasi harus dilakukan sedini mungkin dalam skrip (sebaiknya sebelum melakukan apa pun sebagai root).
Saya benar - benar harus menyebutkan ini ketika saya pertama kali menulis jawaban ini, tetapi jika skrip Anda adalah skrip shell, HARUS mengutip semua variabel dengan benar. Berhati-hatilah untuk mengutip variabel yang berisi input yang disediakan oleh pengguna dengan cara apa pun , tetapi jangan menganggap beberapa variabel aman, KUTIPAN SEMUA .
Itu termasuk variabel lingkungan berpotensi dikendalikan oleh pengguna (misalnya
"$PATH"
,"$HOME"
,"$USER"
dll Dan pasti termasuk"$QUERY_STRING"
dan"HTTP_USER_AGENT"
dll dalam naskah CGI). Bahkan, kutip saja semuanya. Jika Anda harus membuat baris perintah dengan banyak argumen, gunakan array untuk membuat daftar argumen dan kutip itu -"${myarray[@]}"
.Sudahkah saya mengatakan "mengutip semuanya" cukup sering? ingat itu. lakukan.
sumber
Periksa pemilik pada file gpio:
Kemungkinan besar, Anda akan mengetahui bahwa mereka dimiliki oleh grup
gpio
:Dalam hal ini, Anda cukup menambahkan pengguna Anda ke
gpio
grup untuk memberikan akses tanpa sudo:Anda harus keluar dan masuk kembali setelah itu agar perubahan berlaku.
sumber
/sys/class/gpio/
gpio, tetapi bahkan setelah menambahkan diri saya ke grup itu, saya masih mendapatkan "izin ditolak" setiap kali saya mencoba menulis apa pun di sana./sys/class/gpio/
sebenarnya hanya symlinks ke/sys/devices/platform/soc/<some temporary name>/gpio
tempat pemilik dan grup adalah root.chgrp gpio /sys/devices/platform/soc/*/gpio
? Mungkin sesuatu seperti itu bisa dimasukkan ke dalam file startup.chgrp gpio `readlink -f /sys/class/gpio/gpio18`/*
Salah satu solusi untuk ini (digunakan terutama pada desktop Linux tetapi juga berlaku dalam kasus lain) adalah menggunakan D-Bus untuk mengaktifkan layanan kecil yang berjalan sebagai root dan polkit untuk melakukan otorisasi. Ini pada dasarnya untuk apa polkit dirancang ; dari dokumentasi pengantar :
Alih-alih menjalankan program pembantu Anda, program besar yang tidak terjangkau akan mengirim permintaan ke bus. Helper Anda dapat berjalan saat daemon dimulai saat boot sistem, atau, lebih baik, diaktifkan sesuai kebutuhan oleh systemd . Kemudian, pembantu itu akan menggunakan polkit untuk memverifikasi bahwa permintaan datang dari tempat yang resmi. (Atau, dalam hal ini, jika itu terasa berlebihan, Anda dapat menggunakan beberapa mekanisme otentikasi / otorisasi hard-coded lainnya.)
Saya menemukan artikel dasar yang bagus tentang berkomunikasi melalui D-Bus , dan sementara saya belum mengujinya, ini tampaknya menjadi contoh dasar menambahkan polkit ke dalam campuran .
Dalam pendekatan ini, tidak ada yang perlu ditandai setuid.
sumber
Salah satu cara untuk melakukan ini adalah membuat program setuid-root yang ditulis dalam C yang hanya melakukan apa yang dibutuhkan dan tidak lebih. Dalam kasus Anda, itu tidak harus melihat input pengguna sama sekali.
Tidak ada cara untuk menumbangkan ini melalui variabel lingkungan atau apa pun, karena yang dilakukannya hanyalah membuat panggilan sistem pasangan.
Kelemahan: Anda harus memeriksa nilai balik dari setiap panggilan sistem.
Terbalik: pengecekan kesalahan sangat mudah: jika ada kesalahan sama sekali, adil
perror
dan bail out: keluar dengan status tidak nol. Jika ada kesalahan, selidiki denganstrace
. Anda tidak perlu program ini sendiri untuk memberikan pesan kesalahan yang sangat bagus.sumber
sudo
sehingga tidak perlu setuid. Kebetulan, itu<fcntl.h>
untukopen()
.Memberkati tee alih-alih gema untuk sudo adalah salah satu cara umum mendekati situasi di mana Anda perlu membatasi perm root. Redirect ke / dev / null adalah untuk menghentikan output yang bocor - tee melakukan apa yang Anda inginkan.
sumber
tee
untuk dijalankansudo
, Anda mengizinkan file APA SAJA untuk ditimpa atau ditambahkan ke (termasuk, misalnya,/etc/passwd
- tambahkan saja uid = 0 akun baru). Anda juga dapat mengizinkan semua perintah untuk dijalankansudo
(BTW/etc/sudoers
termasuk dalam set 'file APA PUN sehingga dapat ditimpasudo tee
)tee
dapat menulis, seperti yang dijelaskan dalam jawaban ini pada pertanyaan terpisah. Pastikan Anda membaca komentar juga, karena beberapa orang memiliki masalah dengan sintaks asli yang digunakan dan menyarankan perbaikan untuk masalah itu.tee
atau apa pun untuk beroperasi pada banyak file dengansudo
.Anda dapat membuat skrip yang melakukan tugas yang Anda inginkan. Kemudian, buat akun pengguna baru yang hanya bisa masuk dengan memasok kunci yang digunakan oleh OpenSSH.
Catatan: Siapa saja dapat menjalankan skrip itu jika memiliki file kunci, jadi pastikan file kunci OpenSSH tidak dapat dibaca oleh siapa pun yang ingin Anda hindari melakukan tugas tersebut.
Dalam konfigurasi OpenSSH (dalam file Authorized_key), sebelum menentukan kunci, tentukan perintah (diikuti oleh spasi), seperti yang dijelaskan dalam teks "contoh" ini:
command="myscript" keydata optionalComment
Opsi konfigurasi ini dapat membatasi kunci OpenSSH untuk hanya menjalankan perintah tertentu. Sekarang Anda telah memberikan sudo pemberian izin, tetapi konfigurasi OpenSSH adalah bagian dari solusi yang benar-benar digunakan untuk membatasi / membatasi apa yang dapat dilakukan pengguna, sehingga pengguna tidak menjalankan perintah lain. Ini juga tidak memiliki berkas konfigurasi "sudo" yang rumit, jadi jika Anda menggunakan OpenBSD atau jika "doas" ("do as") OpenBSD mulai menjadi lebih populer (dengan versi mendatang dari sistem operasi apa pun yang Anda gunakan) , Anda tidak perlu ditantang oleh banyak kerumitan dalam konfigurasi sudo.
sumber