Saya bermain-main dengan PowerShell minggu ini dan menemukan bahwa Anda harus menandatangani skrip Anda agar dapat dijalankan. Apakah ada fungsi aman serupa di Linux yang berhubungan dengan mencegah skrip bash agar tidak dijalankan?
Satu-satunya fungsi yang mirip dengan ini, yang saya ketahui adalah SSH yang membutuhkan kunci tertentu.
noexec
pada partisi read-only pada perangkat blok bertanda dm-verity.Jawaban:
Jika Anda mengunci kemampuan pengguna untuk menjalankan skrip,
sudo
maka Anda dapat menggunakandigest
fungsinya.Anda dapat menentukan hash dari skrip / executable
sudoers
yang akan diverifikasi olehsudo
sebelum dieksekusi. Jadi meskipun tidak sama dengan penandatanganan, itu memberi Anda jaminan dasar bahwa skrip setidaknya tidak dimodifikasi tanpa sudoers juga sedang dimodifikasi.http://www.sudo.ws/man/1.8.13/sudoers.man.html
sumber
Iya dan tidak.
Distribusi perangkat lunak Linux bekerja agak berbeda dari distribusi perangkat lunak Windows. Di dunia Linux (tidak tertanam), metode utama untuk mendistribusikan perangkat lunak adalah melalui distribusi (Ubuntu, Debian, RHEL, Fedora, Arch, dll.). Semua distribusi utama telah menandatangani paket mereka secara sistematis selama sekitar satu dekade.
Ketika perangkat lunak didistribusikan secara independen, tergantung pada vendor untuk memutuskan bagaimana mereka akan mengirimkan perangkat lunak mereka. Vendor yang baik menyediakan sumber paket yang kompatibel dengan distribusi utama (tidak ada mekanisme distribusi terpadu untuk semua Linux: distribusi perangkat lunak adalah salah satu poin utama diferensiasi antara distribusi) dan yang ditandatangani dengan kunci vendor. Distribusi Linux jarang bertindak sebagai otoritas penandatanganan untuk vendor pihak ketiga (Canonical melakukan ini dengan mitra Ubuntu, tetapi itu mencakup sangat sedikit vendor), dan saya pikir semua distribusi utama menggunakan web kepercayaan PGP daripada infrastruktur kunci publik TLS, jadi terserah kepada pengguna untuk mengetahui apakah mereka ingin mempercayai kunci.
Tidak ada mekanisme khusus yang memilih paket perangkat lunak yang terdiri dari satu skrip dari paket perangkat lunak yang terdiri dari executable asli, file data, atau beberapa file. Verifikasi tanda tangan juga tidak dibangun pada penerjemah skrip umum, karena memverifikasi paket perangkat lunak adalah masalah yang sepenuhnya ortogonal dari menjalankan skrip.
Saya pikir Windows memberi anotasi file dengan asalnya, dan memerlukan konfirmasi pengguna untuk menjalankan file yang asalnya "diunduh" daripada "lokal". Linux tidak memiliki mekanisme yang sama. Hal yang paling dekat adalah izin eksekusi: file yang diunduh tidak memiliki izin eksekusi, pengguna harus mengaktifkannya secara eksplisit (
chmod +x
pada baris perintah, atau tindakan yang sepadan dalam manajer file).sumber
Linux tidak menyediakan kemampuan untuk membatasi pelaksanaan skrip bash berdasarkan tanda tangan digital.
Ada beberapa pekerjaan tentang otentikasi executable biner. Lihat https://lwn.net/Articles/488906/ untuk info.
sumber
Dalam satu kata, "tidak".
Linux tidak benar-benar membedakan antara executable dan skrip; yang
#!
di awal adalah cara untuk memberitahu kernel apa program untuk menjalankan untuk mengevaluasi masukan tapi itu bukan satu-satunya cara script dapat dieksekusi.Jadi, misalnya, jika saya punya skrip
Maka saya bisa menjalankan ini dengan perintah
Itu akan menyebabkan kernel mencoba dan menjalankannya, mengenali
#!
dan kemudian menjalankannya secara efektif/bin/sh x
.Namun saya juga bisa menjalankan salah satu varian ini:
atau bahkan
Jadi, bahkan jika kernel mencoba untuk menerapkan penandatanganan pada
exec
layer kita dapat memotong ini dengan hanya menjalankan interpreter dengan script sebagai parameter.Ini berarti bahwa kode penandatanganan harus berada dalam juru bahasa itu sendiri. Dan apa yang akan menghentikan pengguna untuk mengkompilasi salinan shell mereka sendiri tanpa menandatangani kode penegakan?
Solusi standar untuk ini bukan menggunakan penandatanganan, tetapi untuk menggunakan Kontrol Akses Wajib (MAC), seperti
SELinux
. Dengan sistem MAC, Anda dapat menentukan dengan tepat apa yang diizinkan dijalankan oleh setiap pengguna dan lapisan transisi. Jadi, misalnya, Anda dapat mengatakan "pengguna normal dapat menjalankan apa pun kecuali server web dan proses CGI hanya dapat mengakses hal-hal dari/var/httpd
direktori; semuanya ditolak".sumber
This means that signing code would have to be in the interpreter itself. And what would stop a user from compiling their own copy of a shell without the signing enforcement code?
Tidak memungkinkan terlaksananya setiap executable unsigned akan melakukannya, Jika pengguna tidak memiliki kunci penandatanganan. Sudah ada berbagai proyek * nix untuk ini.Distro Linux biasanya memiliki gnupg . Kedengarannya bagi saya seperti yang Anda inginkan adalah bash wrapper sederhana yang memeriksa tanda tangan gpg terpisah terhadap skrip argumen dan hanya menghasilkan menjalankan skrip jika cek berhasil:
sumber
Pertanyaan balasan yang langsung muncul di benak Anda adalah "Mengapa Anda ingin mencegah pengguna menjalankan program yang mereka tulis? " Ada beberapa kemungkinan:
* Ini mungkin menjadi semakin tidak benar karena semakin banyak orang mulai menggunakan Linux
sumber
Alasan sistem berevolusi secara berbeda adalah karena Linux memiliki atribut file 'exec' dan Windows menggunakan ekstensi file untuk menentukan eksekusi.
Jadi di Windows mudah untuk menipu pengguna agar mengunduh file dengan ekstensi ".exe", ".bat", ".scr", yang akan disembunyikan secara default . Mengklik dua kali file itu akan memberi Anda eksekusi kode arbiter. Oleh karena itu mekanisme besar pelacakan asal dan penandatanganan dieksekusi / skrip dibangun untuk mengurangi risiko ini.
Di Linux, Anda mungkin bisa mendapatkan file ke pengguna, tetapi Anda tidak bisa dengan mudah memaksa bit 'exec' untuk diatur. Selain itu, dimungkinkan untuk membuat seluruh filesystem 'noexec'.
Anda dapat menjalankan skrip secara eksplisit dengan memohon penerjemah. Anda bahkan dapat membuat skrip shell saat runtime dan menyalurkannya ke "sh", atau menjalankan "sh -c".
sumber
Secara khusus, banyak program pengarsipan tidak mempertahankan bit eksekusi pada file yang terkandung. Ini membuatnya tidak mungkin untuk menjalankan executable yang sewenang-wenang. Hampir saja.
Intinya adalah, apa yang dijelaskan dalam jawaban lain bahwa kurangnya bit eksekusi tidak mencegah Anda melewati skrip tersebut secara langsung
bash
. Meskipun dapat diperdebatkan bahwa sebagian besar skrip tersebut adalahbash
skrip, shebang dapat menentukan program apa saja sebagai penerjemah. Ini berarti bahwa itu tergantung pada pengguna untuk menjalankan juru bahasa yang sesuai jika mereka memutuskan untuk mengabaikan semantik yang dapat dieksekusi.Walaupun ini tidak banyak, ini cukup banyak mencakup pencegahan menjalankan executable yang tidak tepercaya di * nixes hanya dengan kernel dan shell .
Seperti yang saya sebutkan di salah satu komentar, ada satu lapisan perlindungan lainnya -
SeLinux
- yang melacak asal file berdasarkan seperangkat aturan. Suatu pengaturanSeLinux
tidak akan misalnya mengizinkan root untuk menjalankan yang dapat dieksekusi dengan bit yang dapat dieksekusi yang diunduh dari internet, bahkan jika Anda menyalin dan memindahkan file tersebut. Seseorang dapat menambahkan aturan bahwa file seperti itu hanya dapat dijalankan melalui biner lain yang akan memeriksa tanda tangan, tidak seperti apa yang Anda sebutkan dalam pertanyaan Anda.Jadi, pada akhirnya ini masalah konfigurasi alat yang umumnya diinstal sebelumnya, dan jawabannya adalah ya .
sumber
tar
tidak mempertahankan bit eksekusi.tar -p
sumber-p, --preserve-permissions, --same-permissions
berarti mengekstrak informasi tentang izin file (default untuk superuser)touch permtest; chmod +x permtest; tar cf permtest.tar.gz permtest; rm permtest; tar xf permtest.tar.gz; ls -l permtest
- ini dapat dieksekusi di sini, dan saya bukan root.