GNU/Linux >> Belajar Linux >  >> Linux

Pemecahan masalah dan jebakan SELinux

Anda tidak bisa membiarkan kegagalan mendefinisikan Anda. Anda harus membiarkan kegagalan Anda mengajari Anda Barack Obama

Salah satu pertempuran hebat, terutama dengan penyedia solusi pihak ketiga, adalah menjaga keamanan server kami. Dalam banyak kasus, tantangannya adalah permintaan untuk menonaktifkan SELinux agar aplikasi dapat berjalan dengan lancar. Untungnya, itu semakin jarang terjadi.

Dalam sebagian besar kasus ini, analisis sudah cukup untuk menemukan pemecahan masalah atau solusi yang tepat.

SELinux adalah sistem pelabelan , yang memberi tahu kita bahwa setiap file, direktori, atau objek dalam sistem memiliki Label . yang sesuai . Kebijakan mengontrol interaksi antara elemen-elemen ini. Kernel memberlakukan aturan ini.

Dua konsep yang paling penting adalah Pelabelan (file, proses, port, dll.) dan Jenis Penegakan (yang memisahkan proses satu sama lain menurut jenisnya).

Format yang digunakan oleh label adalah:user:role:type:level (opsional).

Untuk mengetahui konfigurasi saat ini, jalankan getenforce dan sestatus perintah:

# getenforce
Enforcing
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      32

Praktik terbaik memberi tahu kami bahwa ketika kami menguji aplikasi pihak ketiga yang baru, kami harus mengonfigurasi SELinux untuk sementara dalam mode permisif untuk menentukan kebijakan atau boolean mana (string sederhana yang mengubah perilaku) yang diperlukan. Jalankan perintah:

# setenforce 0

Melihat melalui log, Anda dapat mengetahui apa yang dibutuhkan SELinux agar aplikasi berfungsi dengan baik.

Apa yang SELinux coba sampaikan kepada saya?

Hanya ada empat penyebab utama kesalahan yang menghasilkan peringatan di SELinux:

  1. Pelabelan.
  2. SELinux perlu tahu.
  3. Kebijakan SELinux dan/atau aplikasi mungkin memiliki bug.
  4. Informasi Anda mungkin disusupi.

Kasus terakhir adalah karena modifikasi yang dibuat untuk menyerang kerentanan atau menghindari pelacakan aktivitas, meskipun dalam kedua kasus, penting untuk meninjau peringatan ini; untuk alasan praktis, untuk saat ini, kami tidak akan menanganinya sampai kemungkinan pengeposan di masa mendatang.

Pelabelan

Masalah pelabelan :File di /srv/myweb tidak diberi label dengan benar dan tidak dapat diakses.

SELinux memberikan label untuk setiap elemen yang terlibat dalam layanan yang sama:

  • File biner:/usr/sbin/httpd → httpd_exec_t
  • File konfigurasi:/etc/httpd → httpd_config_t
  • File log:/var/log/httpd → httpd_log_t
  • Direktori Konten:/var/www/html → httpd_sys_content_t
  • Skrip Startup:/usr/lib/systemd/system/httpd.service → httpd_unit_file_t
  • Proses:/usr/sbin/httpd → httpd_t
  • Port:80/tcp, 443/tcp → httpd_t dan httpd_port_t

Di server web, proses berjalan di httpd_t konteks hanya dapat berinteraksi dengan objek dengan httpd_something_t label .

Solusi :Memberi label pada file dengan benar.

Jika Anda tahu label yang benar, jalankan :

# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'

Jika Anda mengetahui file dengan label yang setara, jalankan:

# semanage fcontext -a -e /srv/myweb /var/www

Pulihkan konteks default file, untuk kedua kasus:

# restorecon -vR /srv/myweb

Masalah pelabelan :Jika file dipindahkan, alih-alih disalin, file tersebut tetap memiliki label aslinya.

$ mv index.html /var/www/html/

Solusi :Melabeli file dengan benar.

Ubah konteks ke label yang benar:

# chcon -t httpd_system_content_t /var/www/html/index.html

Mengubah konteks dengan label referensi:

# chcon --reference /var/www/html/ /var/www/html/index.html

Pulihkan konteks default file, untuk kedua kasus:

# restorecon -vR /var/www/html/

[ Anda mungkin juga menyukai: Mengakses dokumentasi kebijakan SELinux ]

SELinux perlu tahu

Penyesuaian layanan :Server web akan mendengarkan permintaan pada port 8585.

Untuk menambahkan port yang diinginkan ke konteks, jalankan:

# semanage port -a -t http_port_t -p tcp 8585

Menambahkan fitur ke layanan :Server web akan dapat mengirim email.

Untuk mengaktifkan fungsi pengiriman email, aktifkan boolean, dengan menjalankan:

# setsebool -P httpd_can_sendmail 1

-P flag membuat perubahan permanen di boolean.

Untuk mendapatkan semua boolean, jalankan:

# getsebool -a

Untuk memeriksa status boolean, jalankan:

# semanage boolean -l

Pemecahan masalah kebijakan

Beberapa layanan tidak memiliki kebijakan khusus yang dibuat berisi izin yang memadai yang diperlukan untuk bekerja dengan SELinux. Untuk menentukan izin ini, Anda perlu menyetel mode permisif dan memeriksa log untuk kesalahan akses.

Layanan tidak berfungsi :wicd digunakan sebagai pengganti layanan NetworkManager untuk menangani koneksi nirkabel.

Memeriksa audit.log file untuk akses yang ditolak:

# grep denied audit.log | cut -d{ -f2 | sort -n | uniq -u
 create } for  pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
 create } for  pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
 ioctl } for  pid=2670 comm="wicd" path="socket:[52681]" dev="sockfs" ino=52681 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
 ioctl } for  pid=2670 comm="wicd" path="socket:[52684]" dev="sockfs" ino=52684 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
 setattr } for  pid=2214 comm="wicd" name="dhclient.conf.template" dev="dm-0" ino=437068 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=file permissive=0

Perhatikan bahwa beberapa elemen yang terlibat dalam konteks NetworkManager_t dan dst_t memerlukan hak dan akses ke berbagai file dan pembuatan soket.

Buat jenis penegakan (.te) file dengan izin yang diperlukan untuk kebijakan:

# vi my_wicd.te
module my_wicd 1.0;
 
require {
        type NetworkManager_t;
        type etc_t;
        class ipx_socket create;
        class ax25_socket { create ioctl };
        class appletalk_socket { create ioctl };
        class file setattr;
}
 
#============= NetworkManager_t ==============
allow NetworkManager_t etc_t:file setattr;
allow NetworkManager_t self:appletalk_socket { create ioctl };
allow NetworkManager_t self:ax25_socket { create ioctl };
allow NetworkManager_t self:ipx_socket create;

Untuk mengkompilasi kebijakan, instal paket selinux-policy-devel dan buat paket kebijakan:

# make -f /usr/share/selinux/devel/Makefile my_wicd.pp

Untuk mengaktifkan modul yang baru dibuat, jalankan:

# semodule -i my_wicd.pp

Pesan kesalahan kebijakan :Mencoba mengakses situs web saya, saya menemukan kesalahan SELinux di log.

Salah satu perangkap umum dalam memecahkan masalah pesan kesalahan SELinux adalah membuat kebijakan sesuai dengan semua pesan kesalahan yang ditemukan. Dalam kebanyakan kasus, jika setroubleshoot paket diinstal, peringatan yang sama akan memberi kita semua opsi solusi yang mungkin, dari yang terbaik hingga yang paling sedikit.

Untuk meninjau setroubleshoot peringatan yang dihasilkan hari ini, jalankan:

# journalctl -t setroubleshoot --since today
Dec 08 13:08:33 lab.example.com setroubleshoot[12013]: failed to retrieve rpm info for /var/www/html/index.html
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages run: sealert -l 011df984-4eb6-4079-98ab-cba173c4342e
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html.
                                                               
 *****  Plugin restorecon (99.5 confidence) suggests   ************************
                                                               
 If you want to fix the label
 /var/www/html/index.html default label should be httpd_sys_content_t.
 Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory, in which case try to change the following command accordingly.
 Do
 # /sbin/restorecon -v /var/www/html/index.html
                                                               
 *****  Plugin catchall (1.49 confidence) suggests   **************************
                                                               
 If you believe that httpd should be allowed getattr access on the index.html file by default.
 Then you should report this as a bug.
 You can generate a local policy module to allow this access.
 Do
 allow this access for now by executing:
 # ausearch -c 'httpd' --raw | audit2allow -M my-httpd
 # semodule -X 300 -i my-httpd.pp

Dalam hal ini, solusi terbaik yang mungkin adalah dengan memperbaiki label file.

[ Tingkatkan keterampilan Anda mengelola dan menggunakan SELinux dengan panduan bermanfaat ini. ] 

Menutup

SELinux mungkin sulit untuk dipecahkan, tetapi dengan menerapkan konsep yang disebutkan di sini dan memahami komponen layanan, Anda dapat menangani tantangan apa pun yang dihadapinya.

Ingat:


Linux
  1. Cara membaca dan mengoreksi pesan penolakan SELinux

  2. Memecahkan Masalah Pekerjaan Cron

  3. Pthreads Dan Vfork?

  1. AlmaLinux 9 beta sekarang tersedia dan memperkenalkan beberapa peningkatan

  2. Cara:MTR – Memahami dan Mengatasi Masalah Konektivitas Jaringan

  3. Cloud Backup—Pemecahan masalah dasar pada Windows Server 2012, 2016, dan 2019

  1. Pemecahan Masalah Jaringan Linux Dan Debugging?

  2. Apa itu Pengguna SELinux dan bagaimana Memetakan Pengguna Linux ke Pengguna SELinux

  3. Pemecahan masalah galat dan batas waktu gateway:502, 504