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
$ cat x
#!/bin/sh
echo hello
Maka saya bisa menjalankan ini dengan perintah
$ ./x
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:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
atau bahkan
. ./x
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".