Izinkan perilaku berisiko tertentu dari satu program dengan cara yang aman di SELinux


8

Saya memiliki program yang berjalan di dalam wadah Docker yang memuat file .so yang mengubah perilaku program melalui pengait dan manipulasi memori. Perilaku ini diblokir oleh SELinux dengan pesan berikut di log audit:

type = AVC msg = audit (1548166862.066: 2419): avc: ditolak {execheap} for pid = 11171 comm = "myProgram" scontext = system_u: system_r: container_t: s0: c426, c629 tcontext = system_u: system_r: container_t: s0: c426, c629 tclass = proses permisif = 0

Saya sangat ragu untuk hanya menjalankan ini audit2allowkarena saya tidak ingin membiarkan perilaku khusus ini di tempat lain (karena itu akan sangat berisiko).

  • Bagaimana saya bisa memberi tahu SELinux untuk mengizinkan perilaku spesifik ini dengan cara yang paling aman?
  • Bisakah saya melakukan ini dengan cara yang memungkinkan saya menelurkan lebih banyak wadah Docker yang menjalankan program yang sama di masa depan?

Jawaban:


4

audit2allowkemungkinan menghasilkan aturan untuk memungkinkan execheapuntuk container_tproses jenis. Anda selalu dapat membuat modul terlebih dahulu dan memeriksanya, sebelum Anda memuatnya.

Masalah yang mungkin terjadi adalah, bahwa sekarang semua proses dengan container_ttipe sekarang diizinkan untuk operasi yang sama. Untuk menghindari ini, Anda mungkin perlu membuat jenis khusus Anda sendiri (menggunakan container_tsebagai templat) dan hanya mengizinkan execheapjenis khusus ini.

Posting blog ini oleh Dan Walsh menjelaskan cara menulis kebijakan khusus tersebut. Anda juga dapat menggabungkan ini dengan audit2allowuntuk menghasilkan aturan yang sebenarnya. Langkah-langkah penting adalah:

  1. Buat kebijakan wadah dasar, misalnya container_execheap:

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

    virt_sandbox_domain_templatemakro membuat tipe baru container_execheap_tdan membuat aturan yang diperlukan untuk operasi buruh pelabuhan yang tipe baru dapat digunakan sebagai domain kontainer.

  2. Kompilasi dan muat modul kebijakan (file pengembangan yang diperlukan, termasuk makefile, harus disediakan oleh selinux-policy-develpaket):

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    Tipe baru dapat dikonfigurasikan menjadi domain permisif:

    semanage permissive -a container_execheap_t
    

    Untuk domain permisif, penolakan AVC dicatat tetapi aturan tidak ditegakkan. Dengan cara ini, mudah untuk menghasilkan aturan yang hilang di kemudian hari audit2allow.

  3. Jalankan wadah Anda dalam konteks baru ini, sesuatu seperti docker run ... --security-opt label:type:container_execheap_t ...

  4. Hasilkan kesalahan yang diharapkan. Kemudian jalankan audit2allowuntuk menghasilkan aturan yang memungkinkan operasi untuk container_execheap_t. Anda dapat memperbarui .tefile modul yang sama (ingat untuk menambah nomor versi) dengan aturan baru. Kompilasi dan instal modul yang diperbarui.

  5. Saat tidak ada lagi kesalahan yang terjadi, kembalikan jenis wadah khusus ke dalam mode penegakan semanage -d container_execheap.


Jawaban Anda tampaknya menjadi cara untuk pergi - sayangnya meskipun saya tidak punya pengalaman membuat kebijakan SELinux sendiri. Inilah yang saya buat dengan melihat melalui posting blog yang Anda tautkan dan dokumentasi lainnya. Saya merasa saya tidak melakukannya dengan benar ... bisakah Anda membantu saya dengan mengarahkan saya ke arah yang benar? Apakah kebijakan saya masuk akal sama sekali?
Thomas

Terima kasih, sekarang saya memiliki sesuatu yang tampaknya berfungsi! Inilah yang akhirnya saya lakukan. Namun saya menerima banyak kesalahan tentang duplikat selama waktu kompilasi, saya berasumsi bahwa itu adalah masalah dalam kebijakan yang disertakan dan bukan masalah saya sendiri? Saya juga tidak begitu yakin mengapa string di dalam pernyataan gen_require harus diakhiri dengan 'bukannya `(yang terakhir melemparkan kesalahan). Bagaimanapun, terima kasih lagi untuk bantuannya!
Thomas

Saya pikir aman untuk mengabaikan kesalahan spesifik itu, lihat bugzilla . Mengutip menggunakan `'adalah cara kerjanya dalam bahasa M4 , yang digunakan untuk menulis modul kebijakan referensi. Anda dapat memeriksa (menggunakan ps axZdll.) Bahwa wadah Anda berjalan dalam konteks yang benar jika Anda ingin memeriksa ulang setelah menginstal dan mengkonfigurasi kebijakan khusus Anda.
sebasth
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.