Izin file Linux

Halo semuanya. Kami secara aktif bergabung dengan pekerjaan dan pada bulan Januari kami sedang mempersiapkan banyak peluncuran yang kuat. Di antara yang lain, satu set telah diumumkan untuk aliran baru kursus Administrator Linux yang disukai semua orang. Untuk mengantisipasi peluncuran, kami biasanya membagikan terjemahan materi yang bermanfaat.




Izin file menawarkan alternatif yang aman untuk executable SUID, tetapi mereka mungkin tampak sedikit membingungkan pada awalnya.

Kita semua tahu bahwa binari SUID adalah solusi keamanan yang buruk . Untungnya, jika aplikasi Anda memerlukan beberapa hak istimewa terbatas, ada cara yang lebih efisien yang disebut izin file .

Saya akan menghemat waktu Anda jika Anda ingin menghindari pembacaan rinci artikel di atas: pada dasarnya, izin file memungkinkan proses yang berjalan sebagai root dan, oleh karena itu, memiliki hak untuk melakukan sesuatu, untuk menyimpan fitur-fitur tertentu yang dibatasi oleh daftar ini ketika mereka setel ulang hak istimewa dan jalankan sebagai pengguna yang tidak memiliki hak. Ini berarti bahwa jika seorang penyerang berhasil mengkompromikan suatu proses dengan meluap buffer atau eksploitasi lainnya, ia tidak akan dapat mengambil keuntungan dari apa pun selain hak minimum minimum tertentu yang benar-benar dibutuhkan oleh proses tersebut.

Izin sangat bagus untuk layanan yang biasanya selalu dijalankan sebagai root, tetapi bagaimana dengan utilitas baris perintah? Untungnya, ini juga didukung asalkan Anda memiliki utilitas yang benar diinstal. Jika Anda menggunakan Ubuntu, misalnya, Anda akan memerlukan paket libcap2-bin . Anda juga perlu menjalankan kernel non-archaic (mulai dari versi 2.6.24 ).

Fungsi-fungsi ini memungkinkan Anda untuk mengaitkan izin dengan file yang dapat dieksekusi mirip dengan pengaturan bit SUID, tetapi hanya untuk serangkaian izin tertentu. Utilitas setcap digunakan untuk menambah dan menghapus izin dari file.

Langkah pertama adalah memilih izin yang Anda butuhkan. Untuk artikel ini, saya berasumsi bahwa ada alat diagnostik jaringan yang disebut tracewalk yang harus dapat menggunakan soket mentah . Ini biasanya mengharuskan aplikasi dijalankan sebagai root, tetapi ketika melihat daftar, ternyata hanya izin CAP_NET_RAW yang CAP_NET_RAW .

Dengan asumsi Anda berada di direktori tempat biner tracewalk berada, Anda dapat menambahkan izin ini sebagai berikut:

 sudo setcap cap_net_raw=eip tracewalk 

Untuk saat ini, abaikan suffix =eip untuk mendapatkan izin, saya akan membicarakannya dalam beberapa detik. Harap dicatat bahwa nama izin adalah huruf kecil. Sekarang Anda dapat memeriksa apakah Anda telah mengkonfigurasi izin dengan benar dengan:

 setcap -v cap_new_raw=eip tracewalk 

Atau Anda dapat mendaftar semua izin yang ditetapkan untuk file yang dapat dieksekusi ini:

 getcap tracewalk 

Untuk referensi, Anda juga dapat menghapus semua izin dari yang dapat dieksekusi menggunakan:

 setcap -r tracewalk 

Pada titik ini, Anda harus dapat menjalankan executable sebagai pengguna yang tidak terjangkau, dan ia harus dapat bekerja dengan soket mentah, tetapi tidak memiliki hak istimewa lain yang dimiliki oleh pengguna root.

Jadi apa arti akhiran aneh =eip ? Ini akan membutuhkan sedikit pemahaman tentang sifat izin. Setiap proses memiliki tiga set izin - efektif, dapat diwariskan dan diizinkan (efektif, dapat diwariskan dan diizinkan) :

  • Izin yang efektif adalah izin yang menentukan proses apa yang sebenarnya dapat dilakukan. Misalnya, tidak dapat menangani soket mentah jika CAP_NET_RAW tidak dalam set efisien.
  • Izin yang diizinkan adalah izin yang diizinkan dimiliki proses jika memintanya melalui panggilan yang sesuai. Mereka tidak mengizinkan suatu proses untuk benar-benar melakukan apa pun kecuali itu secara khusus ditulis untuk meminta izin yang ditentukan. Ini memungkinkan Anda untuk menulis proses untuk menambahkan izin penting ke set efektif hanya untuk periode ketika mereka benar-benar diperlukan.
  • Izin yang dapat diwarisi adalah izin yang dapat diwarisi dalam koleksi proses anak yang tersedia. Selama operasi fork() atau clone() , proses anak selalu diberikan salinan izin dari proses induk, karena pada saat itu masih menjalankan file executable yang sama. Set yang diwarisi digunakan ketika exec() (atau yang setara) dipanggil untuk mengganti executable dengan yang lain. Pada titik ini, set proses yang tersedia disamarkan oleh set yang diwarisi untuk mendapatkan set yang tersedia yang akan digunakan untuk proses baru.

Dengan demikian, utilitas setcap memungkinkan kita untuk menambahkan izin dari ketiga set ini secara independen untuk file yang dapat dieksekusi yang diberikan. Perhatikan bahwa makna grup ditafsirkan sedikit berbeda untuk izin file:

  • Izin file yang tersedia adalah yang selalu tersedia untuk dieksekusi, bahkan jika proses induk yang memanggilnya tidak memilikinya. Mereka dulu disebut izin "paksa".
  • Izin file yang diwarisi menentukan topeng tambahan yang juga dapat digunakan untuk menghapus izin dari set proses panggilan. Mereka digunakan di samping set yang diwariskan dari proses panggilan, jadi izin hanya diwarisi jika ada di kedua set.
  • Izin file yang efektif sebenarnya hanya satu bit, bukan satu set, dan jika itu diinstal, itu berarti seluruh set yang tersedia juga disalin ke set efektif dari proses baru. Ini dapat digunakan untuk menambahkan izin ke proses yang tidak secara khusus ditulis untuk meminta mereka. Karena ini hanya satu bit, jika Anda mengaturnya untuk izin apa pun, itu harus ditetapkan untuk semua izin. Anda dapat menganggapnya sebagai bit warisan karena digunakan untuk memungkinkan izin untuk aplikasi yang tidak mendukungnya.

Saat menentukan izin melalui setcap tiga huruf e , i dan p merujuk ke set yang efisien, diwariskan, dan dapat diakses , masing-masing. Jadi, spesifikasi sebelumnya:

 sudo setcap cap_net_raw=eip tracewalk 

... menunjukkan bahwa izin CAP_NET_RAW harus ditambahkan ke set yang tersedia dan diwarisi dan bahwa bit efektif juga harus ditetapkan. Ini akan mengganti semua izin yang ditetapkan sebelumnya dalam file. Untuk mengatur beberapa izin sekaligus, gunakan daftar yang dipisahkan koma:

 sudo setcap cap_net_admin,cap_net_raw=eip tracewalk 

Panduan perizinan membahas semua ini secara lebih rinci, tetapi mudah-mudahan posting ini sedikit menggambarkan kejadian tersebut. Masih menyebutkan beberapa peringatan dan trik.

Pertama, kemampuan file tidak berfungsi dengan symlink - Anda harus menerapkannya ke biner itu sendiri (yaitu, ke target symlink).

Kedua, mereka tidak bekerja dengan skrip yang ditafsirkan. Misalnya, jika Anda memiliki skrip Python yang ingin Anda beri izin, Anda harus menugaskannya untuk juru bahasa Python itu sendiri. Jelas, ini merupakan masalah keamanan potensial, karena dengan demikian semua skrip yang dieksekusi dengan penerjemah ini akan memiliki izin yang ditentukan, meskipun ini masih jauh lebih baik daripada melakukan SUID. Solusi yang paling umum, tampaknya, adalah menulis file yang dapat dieksekusi terpisah dalam C atau analog yang dapat melakukan operasi yang diperlukan dan menyebutnya dari skrip. Ini mirip dengan pendekatan yang digunakan oleh Wireshark, yang menggunakan file biner /usr/bin/dumpcap untuk melakukan operasi istimewa:

 $ getcap /usr/bin/dumpcap /usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip 

Ketiga, izin file dinonaktifkan jika Anda menggunakan LD_LIBRARY_PATH lingkungan LD_LIBRARY_PATH untuk alasan keamanan yang jelas (1) . Hal yang sama berlaku untuk LD_PRELOAD , sejauh yang saya tahu.

1. Karena penyerang jelas dapat mengganti salah satu pustaka standar dan menggunakan LD_LIBRARY_PATH untuk memaksa pustaka untuk dipanggil dalam preferensi atas sistem, dan oleh karena itu memiliki kode arbitrer sendiri dieksekusi dengan hak istimewa yang sama dengan aplikasi panggilan.


Itu saja. Rincian program kursus dapat ditemukan di webinar, yang akan diadakan pada 24 Januari.

Source: https://habr.com/ru/post/id483934/


All Articles