Izin File di Linux

Halo semua. Kami secara aktif mulai bekerja dan telah mempersiapkan banyak peluncuran hebat di bulan Januari. Antara lain, pendaftaran telah diumumkan untuk aliran baru kursus favorit semua orang. "Pengelola Linux". Untuk mengantisipasi peluncurannya, kami biasanya membagikan terjemahan materi yang bermanfaat.

Izin File di Linux

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


Kita semua tahu biner itu SUID adalah keputusan yang buruk dari sudut pandang keamanan. Untungnya, jika aplikasi Anda memerlukan hak istimewa terbatas, ada cara yang lebih efisien yang disebut izin berkas.

Saya akan menghemat waktu Anda jika Anda ingin menghindari membaca artikel di atas secara mendetail: Pada dasarnya, izin file mengizinkan proses yang berjalan sebagai root dan oleh karena itu diizinkan melakukan sesuatu untuk mempertahankan kemampuan tertentu, terbatas daftar iniketika mereka kehilangan hak istimewa dan dijalankan oleh pengguna yang tidak memiliki hak istimewa. Ini berarti bahwa jika penyerang berhasil menyusupi suatu proses menggunakan buffer overflow atau eksploitasi lainnya, mereka tidak akan dapat memanfaatkan apa pun selain hak istimewa minimal tertentu yang sebenarnya dibutuhkan oleh proses tersebut.

Izin sangat bagus untuk layanan yang biasanya selalu berjalan sebagai root, tapi bagaimana dengan utilitas baris perintah? Untungnya, ini juga didukung asalkan Anda menginstal utilitas yang tepat. Jika Anda menggunakan Ubuntu, misalnya Anda memerlukan paketnya libcap2-bin. Anda juga perlu menjalankan kernel non-kuno (dari versi 2.6.24).

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

Langkah pertama adalah memilih izin yang Anda perlukan. Demi artikel ini, saya berasumsi ada alat diagnostik jaringan yang disebut tracewalk, yang seharusnya bisa digunakan soket mentah. Ini biasanya mengharuskan aplikasi dijalankan sebagai root, tetapi saat dilihat daftar ternyata hanya diperlukan izin saja CAP_NET_RAW.

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

sudo setcap cap_net_raw=eip tracewalk

Abaikan akhiran untuk saat ini =eip untuk resolusi, saya akan membicarakannya dalam beberapa detik. Perhatikan bahwa nama izin menggunakan huruf kecil. Anda sekarang dapat memeriksa apakah Anda telah mengonfigurasi izin dengan benar dengan:

setcap -v cap_new_raw=eip tracewalk

Atau Anda dapat membuat daftar semua izin yang ditetapkan untuk executable tertentu:

getcap tracewalk

Sebagai referensi, Anda juga dapat menghapus semua izin dari file yang dapat dieksekusi dengan:

setcap -r tracewalk

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

Jadi apa arti akhiran aneh ini? =eip? Hal ini memerlukan pemahaman tentang sifat izin. Setiap proses memiliki tiga set izin - efektif, dapat diwariskan dan diperbolehkan:

  • Efektif Izin adalah izin yang menentukan apa yang sebenarnya dapat dilakukan suatu proses. Misalnya, ia tidak dapat menangani soket mentah jika CAP_NET_RAW tidak dalam set efektif.
  • Tersedia izin adalah izin yang boleh dimiliki suatu proses jika diminta menggunakan panggilan yang sesuai. Mereka mencegah suatu proses untuk benar-benar melakukan apa pun kecuali proses tersebut secara khusus ditulis untuk meminta izin tersebut. Hal ini memungkinkan proses ditulis untuk menambahkan izin penting ke kumpulan efektif hanya untuk periode ketika izin tersebut benar-benar diperlukan.
  • Warisan izin adalah izin yang dapat diwarisi dalam kumpulan proses anak yang dihasilkan yang dapat diakses. Selama operasi fork() или clone() proses anak selalu diberikan salinan izin proses induk karena proses tersebut masih menjalankan executable yang sama pada saat itu. Himpunan yang dapat diwariskan digunakan ketika exec() (atau yang setara) dipanggil untuk mengganti file yang dapat dieksekusi dengan yang lain. Pada titik ini, himpunan proses yang tersedia ditutupi oleh himpunan yang dapat diwariskan untuk mendapatkan himpunan yang dapat diakses yang akan digunakan untuk proses baru.

Jadi utilitasnya setcap memungkinkan kita untuk menambahkan izin dari ketiga set ini secara independen untuk executable tertentu. Perhatikan bahwa arti grup ditafsirkan sedikit berbeda untuk izin file:

  • Tersedia izin file adalah izin yang selalu tersedia untuk file yang dapat dieksekusi, meskipun proses induk yang memanggilnya tidak memilikinya. Izin ini biasa disebut izin “paksa”.
  • Diwarisi izin file menentukan masker tambahan yang juga dapat digunakan untuk menghapus izin dari set proses pemanggilan. Mereka berlaku sebagai tambahan pada rangkaian warisan proses pemanggilan, sehingga izin hanya diwariskan jika izin tersebut ada pada kedua rangkaian tersebut.
  • Efektif izin file sebenarnya hanya satu bit, bukan satu set, dan jika disetel, itu berarti seluruh set yang tersedia juga disalin ke dalam set efektif proses baru. Ini dapat digunakan untuk menambahkan izin ke proses yang tidak ditulis secara khusus untuk memintanya. Karena ini satu bit, jika Anda menyetelnya untuk izin apa pun, itu harus disetel untuk semua izin. Anda dapat menganggapnya sebagai bit warisan karena digunakan untuk mengizinkan izin digunakan oleh aplikasi yang tidak mendukungnya.

Saat menentukan izin melalui setcap tiga huruf e, i и p berhubungan dengan efektif, dapat diwariskan, dan dapat diakses set masing-masing. Nah, spesifikasi sebelumnya:

sudo setcap cap_net_raw=eip tracewalk

...menunjukkan bahwa resolusinya CAP_NET_RAW harus ditambahkan ke set yang tersedia dan dapat diwariskan dan bit efektif juga harus disetel. Ini akan mengesampingkan izin yang ditetapkan sebelumnya pada file. Untuk menyetel beberapa izin sekaligus, gunakan daftar yang dipisahkan koma:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Panduan Izin membahas semua ini secara lebih rinci, tapi semoga postingan ini sedikit mengungkap apa yang terjadi. Hanya ada beberapa peringatan dan trik yang perlu disebutkan.

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

Kedua, mereka tidak bekerja dengan skrip yang ditafsirkan. Misalnya, jika Anda memiliki skrip Python yang ingin Anda beri izin, Anda harus menetapkannya ke juru bahasa Python itu sendiri. Jelas ini merupakan potensi masalah keamanan karena semua skrip yang dijalankan dengan penerjemah tersebut akan memiliki izin yang ditentukan, meskipun ini masih jauh lebih baik daripada menjadikannya SUID. Solusi paling umum tampaknya adalah menulis executable terpisah dalam C atau setara yang dapat melakukan operasi yang diperlukan dan memanggilnya dari skrip. Hal ini mirip dengan pendekatan yang digunakan Wireshark yang menggunakan 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 variabel lingkungan LD_LIBRARY_PATH untuk alasan keamanan yang jelas(1). Hal yang sama berlaku untuk LD_PRELOAD, sejauh yang aku tahu.

1. Karena penyerang jelas dapat mengganti salah satu perpustakaan standar dan menggunakannya LD_LIBRARY_PATHuntuk memaksa perpustakaannya dipanggil sebagai preferensi terhadap perpustakaan sistem, dan oleh karena itu kode arbitrernya sendiri dieksekusi dengan hak istimewa yang sama dengan aplikasi pemanggil.

Itu saja. Rincian lebih lanjut tentang program kursus dapat ditemukan di webinar yang akan berlangsung pada 24 Januari.

Sumber: www.habr.com

Tambah komentar