Pemecahan Masalah yang Terkait dengan SELinux
Jika Anda berencana mengaktifkan SELinux pada sistem yang sebelumnya dinonaktifkan atau menjalankan layanan dengan konfigurasi non-standar, Anda mungkin perlu memecahkan masalah pada situasi yang berpotensi diblokir oleh SELinux. Perhatikan bahwa dalam banyak kasus, penolakan oleh SELinux merupakan tanda adanya kesalahan konfigurasi.
Mengidentifikasi penolakan SELinux
Ikuti hanya langkah-langkah yang diperlukan dari prosedur ini; dalam banyak kasus, Anda hanya perlu melakukan langkah 1.
Prosedur
-
Ketika skenario Anda diblokir oleh SELinux, file
/var/log/audit/audit.logadalah tempat pertama untuk memeriksa informasi lebih lanjut tentang penolakan tersebut. Untuk menelusuri log Audit, gunakan alatausearch. Karena keputusan SELinux, seperti mengizinkan atau menolak akses, disimpan dalam cache yang disebut Access Vector Cache (AVC), gunakan nilaiAVCdanUSER_AVCuntuk parameter jenis pesan, misalnya:# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent
Jika tidak ada hasil yang cocok, periksa apakah Audit daemon sedang berjalan. Jika tidak, ulangi skenario yang ditolak setelah Anda memulai auditd dan periksa log Audit kembali.
-
Jika auditd sedang berjalan, tetapi tidak ada hasil pada keluaran ausearch, periksa pesan yang disediakan oleh systemd Journal:
# journalctl -t setroubleshoot
-
Jika SELinux aktif dan Audit daemon tidak berjalan di sistem Anda, cari pesan SELinux tertentu dalam keluaran perintah dmesg:
# dmesg | grep -i -e type=1300 -e type=1400
-
Bahkan setelah tiga pemeriksaan sebelumnya, masih mungkin Anda belum menemukan apa pun. Dalam kasus seperti ini, penolakan AVC mungkin disembunyikan karena adanya aturan
dontaudit.Untuk menonaktifkan aturan
dontauditsecara sementara agar semua penolakan dapat dicatat:# semodule -DB
Setelah menjalankan kembali skenario yang ditolak dan menemukan pesan penolakan menggunakan langkah-langkah sebelumnya, jalankan perintah berikut untuk mengaktifkan kembali aturan
dontauditdalam kebijakan:# semodule -B
-
Jika Anda telah menerapkan keempat langkah sebelumnya dan masalah masih belum teridentifikasi, pertimbangkan apakah SELinux benar-benar memblokir skenario Anda:
-
Beralihlah ke mode permissive:
# setenforce 0 $ getenforce Permissive
-
Ulangi skenario Anda.
-
Jika masalah tetap terjadi, berarti ada faktor lain selain SELinux yang memblokir skenario Anda.
Menganalisis pesan penolakan SELinux
Setelah mengidentifikasi bahwa SELinux memblokir skenario Anda, Anda mungkin perlu menganalisis penyebab utamanya sebelum memilih cara perbaikannya.
Prasyarat
-
Paket
policycoreutils-python-utilsdansetroubleshoot-servertelah terinstal di sistem Anda.
Prosedur
-
Tampilkan lebih banyak detail tentang penolakan yang tercatat menggunakan perintah
sealert, misalnya:$ sealert -l "*" SELinux is preventing /usr/bin/passwd from write access on the file /root/test. ***** Plugin leaks (86.2 confidence) suggests ***************************** If you want to ignore passwd trying to write access the test file, because you believe it should not need this access. Then you should report this as a bug. You can generate a local policy module to dontaudit this access. Do # ausearch -x /usr/bin/passwd --raw | audit2allow -D -M my-passwd # semodule -X 300 -i my-passwd.pp ***** Plugin catchall (14.7 confidence) suggests ************************** ... Raw Audit Messages type=AVC msg=audit(1553609555.619:127): avc: denied { write } for pid=4097 comm="passwd" path="/root/test" dev="dm-0" ino=17142697 scontext=unconfined_u:unconfined_r:passwd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file permissive=0 .. Hash: passwd,passwd_t,admin_home_t,file,write -
Jika keluaran dari langkah sebelumnya tidak memberikan saran yang jelas:
-
Aktifkan audit jalur penuh (full-path auditing) untuk melihat jalur lengkap ke objek yang diakses dan menampilkan field tambahan dalam entri Audit Linux:
# auditctl -w /etc/shadow -p w -k shadow-write
-
Hapus cache
setroubleshoot:# rm -f /var/lib/setroubleshoot/setroubleshoot.xml
-
Reproduksi kembali masalahnya.
-
Ulangi langkah 1.
Setelah proses selesai, nonaktifkan audit jalur penuh:
# auditctl -W /etc/shadow -p w -k shadow-write
-
-
Jika
sealerthanya menampilkan sarancatchallatau menyarankan untuk menambahkan aturan baru menggunakan alataudit2allow, cocokkan masalah Anda dengan contoh yang tercantum dan dijelaskan dalam bagian Penolakan SELinux dalam log Audit.
Sumber daya tambahan
-
Halaman manual
sealert(8)
Memperbaiki penolakan SELinux yang telah dianalisis
Dalam sebagian besar kasus, saran yang diberikan oleh alat sealert sudah memberikan panduan yang tepat tentang cara memperbaiki masalah terkait kebijakan SELinux. Lihat bagian Menganalisis pesan penolakan SELinux untuk informasi tentang cara menggunakan sealert dalam menganalisis penolakan SELinux.
Berhati-hatilah ketika alat menyarankan penggunaan alat audit2allow untuk melakukan perubahan konfigurasi. Anda tidak boleh menggunakan audit2allow untuk membuat modul kebijakan lokal sebagai langkah pertama saat menemukan penolakan SELinux. Pemecahan masalah sebaiknya dimulai dengan memeriksa apakah ada masalah pelabelan. Kasus kedua yang paling umum adalah perubahan konfigurasi proses yang belum Anda informasikan ke SELinux.
Masalah Pelabelan
Penyebab umum masalah pelabelan adalah penggunaan direktori non-standar untuk suatu layanan. Misalnya, alih-alih menggunakan /var/www/html/ untuk situs web, seorang administrator mungkin ingin menggunakan /srv/myweb/. Pada Red Hat Enterprise Linux, direktori /srv diberi label dengan tipe var_t. File dan direktori yang dibuat di bawah /srv akan mewarisi tipe ini. Selain itu, objek baru yang dibuat di direktori tingkat atas seperti /myserver dapat diberi label dengan tipe default_t. SELinux mencegah Apache HTTP Server (httpd) mengakses kedua tipe ini. Untuk mengizinkan akses, SELinux harus mengetahui bahwa file di /srv/myweb/ harus dapat diakses oleh httpd:
# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
Perintah semanage ini menambahkan konteks untuk direktori /srv/myweb/ beserta semua file dan direktori di bawahnya ke dalam konfigurasi konteks file SELinux. Utilitas semanage tidak mengubah konteks tersebut. Sebagai root, gunakan utilitas restorecon untuk menerapkan perubahan:
# restorecon -R -v /srv/myweb
Konteks yang Salah
Utilitas matchpathcon memeriksa konteks jalur file dan membandingkannya dengan label bawaan untuk jalur tersebut. Contoh berikut menunjukkan penggunaan matchpathcon pada direktori yang berisi file dengan label yang salah:
$ matchpathcon -V /var/www/html/* /var/www/html/index.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0 /var/www/html/page1.html has context unconfined_u:object_r:user_home_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
Dalam contoh ini, file index.html dan page1.html diberi label dengan tipe user_home_t. Tipe ini digunakan untuk file di direktori home pengguna. Penggunaan perintah mv untuk memindahkan file dari direktori home dapat menyebabkan file diberi label dengan tipe user_home_t. Tipe ini tidak boleh digunakan di luar direktori home. Gunakan utilitas restorecon untuk memulihkan file tersebut ke tipe yang benar:
# restorecon -v /var/www/html/index.html restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0
Untuk memulihkan konteks semua file di bawah suatu direktori, gunakan opsi -R:
# restorecon -R -v /var/www/html/ restorecon reset /var/www/html/page1.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /var/www/html/index.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
Aplikasi terbatasi yang dikonfigurasi dengan cara non-standar
Layanan dapat dijalankan dengan berbagai cara. Untuk mengakomodasi hal ini, Anda perlu menentukan bagaimana layanan dijalankan. Hal ini dapat dilakukan melalui boolean SELinux, yang memungkinkan bagian tertentu dari kebijakan SELinux diubah saat runtime. Ini memungkinkan perubahan seperti memberi izin layanan untuk mengakses volume NFS tanpa memuat ulang atau mengompilasi ulang kebijakan SELinux. Selain itu, menjalankan layanan pada nomor port non-standar memerlukan pembaruan konfigurasi kebijakan menggunakan perintah semanage.
Sebagai contoh, untuk memungkinkan Apache HTTP Server berkomunikasi dengan MariaDB, aktifkan boolean httpd_can_network_connect_db:
# setsebool -P httpd_can_network_connect_db on
Perhatikan bahwa opsi -P membuat pengaturan ini tetap berlaku setelah sistem di-boot ulang.
Jika akses ditolak untuk layanan tertentu, gunakan utilitas getsebool dan grep untuk melihat apakah ada boolean yang tersedia untuk mengizinkan akses. Misalnya, gunakan perintah getsebool -a | grep ftp untuk mencari boolean yang terkait dengan FTP:
$ getsebool -a | grep ftp ftpd_anon_write --> off ftpd_full_access --> off ftpd_use_cifs --> off ftpd_use_nfs --> off ftpd_connect_db --> off httpd_enable_ftp_server --> off tftp_anon_write --> off
Untuk mendapatkan daftar boolean dan mengetahui apakah boolean tersebut diaktifkan atau dinonaktifkan, gunakan perintah getsebool -a. Untuk mendapatkan daftar boolean beserta artinya, serta status aktif atau nonaktifnya, instal paket selinux-policy-devel dan gunakan perintah semanage boolean -l sebagai root.
Nomor port
Bergantung pada konfigurasi kebijakan, layanan hanya diizinkan untuk berjalan pada nomor port tertentu. Mencoba mengubah port tempat layanan berjalan tanpa memperbarui kebijakan dapat menyebabkan layanan gagal dijalankan. Misalnya, jalankan perintah semanage port -l | grep http sebagai root untuk menampilkan daftar port yang terkait dengan http:
# semanage port -l | grep http http_cache_port_t tcp 3128, 8080, 8118 http_cache_port_t udp 3130 http_port_t tcp 80, 443, 488, 8008, 8009, 8443 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989
Tipe port http_port_t menentukan port yang dapat digunakan Apache HTTP Server untuk mendengarkan koneksi, yaitu port TCP 80, 443, 488, 8008, 8009, dan 8443. Jika administrator mengonfigurasi httpd.conf agar httpd mendengarkan pada port 9876 (Listen 9876), tetapi kebijakan tidak diperbarui untuk mencerminkan hal ini, maka perintah berikut akan gagal:
# systemctl start httpd.service Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. # systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: failed (Result: exit-code) since Thu 2013-08-15 09:57:05 CEST; 59s ago Process: 16874 ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop (code=exited, status=0/SUCCESS) Process: 16870 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
Pesan penolakan SELinux yang serupa dengan berikut ini akan dicatat dalam /var/log/audit/audit.log:
type=AVC msg=audit(1225948455.061:294): avc: denied { name_bind } for pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket
Untuk mengizinkan httpd mendengarkan port yang tidak tercantum dalam tipe port http_port_t, gunakan perintah semanage port untuk menetapkan label berbeda pada port tersebut:
# semanage port -a -t http_port_t -p tcp 9876
Opsi -a `menambahkan entri baru; opsi `-t menentukan tipe; dan opsi -p menentukan protokol. Argumen terakhir adalah nomor port yang ingin ditambahkan.
Kasus khusus, aplikasi yang berkembang atau rusak, dan sistem yang terkompromi
Aplikasi mungkin mengandung bug yang menyebabkan SELinux menolak akses. Selain itu, aturan SELinux terus berkembang – SELinux mungkin belum pernah melihat aplikasi dijalankan dengan cara tertentu, sehingga dapat menolak akses meskipun aplikasi tersebut berfungsi sebagaimana mestinya. Misalnya, jika versi baru PostgreSQL dirilis, versi tersebut mungkin melakukan tindakan yang belum diperhitungkan oleh kebijakan yang ada, sehingga menyebabkan penolakan akses meskipun akses seharusnya diizinkan.
Untuk situasi seperti ini, setelah akses ditolak, gunakan utilitas audit2allow untuk membuat modul kebijakan kustom guna mengizinkan akses tersebut. Anda dapat melaporkan aturan yang hilang dalam kebijakan SELinux melalui Red Hat Bugzilla. Untuk Red Hat Enterprise Linux 8, buat laporan bug terhadap produk Red Hat Enterprise Linux 8 dan pilih komponen selinux-policy. Sertakan keluaran perintah audit2allow -w -a dan audit2allow -a dalam laporan bug tersebut.
Jika suatu aplikasi meminta hak istimewa keamanan yang signifikan, hal ini bisa menjadi tanda bahwa aplikasi tersebut telah terkompromi. Gunakan alat deteksi intrusi untuk memeriksa perilaku mencurigakan seperti itu.
Mesin Solusi (Solution Engine) di Red Hat Customer Portal juga dapat memberikan panduan dalam bentuk artikel yang berisi kemungkinan solusi untuk masalah yang sama atau serupa dengan yang Anda alami. Pilih produk dan versi yang relevan, lalu gunakan kata kunci yang terkait dengan SELinux, seperti selinux atau avc, bersama dengan nama layanan atau aplikasi yang diblokir, misalnya: selinux samba.
Penolakan SELinux dalam log audit
Sistem Audit Linux secara default menyimpan entri log di file /var/log/audit/audit.log.
Untuk menampilkan hanya catatan yang terkait dengan SELinux, gunakan perintah ausearch dengan parameter jenis pesan diatur ke AVC dan AVC_USER minimal, misalnya:
# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR
Sebuah entri penolakan SELinux dalam file log Audit dapat terlihat seperti berikut ini:
type=AVC msg=audit(1395177286.929:1638): avc: denied { read } for pid=6591 comm="httpd" name="webpages" dev="0:37" ino=2112 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:nfs_t:s0 tclass=dir
Bagian-bagian paling penting dari entri ini adalah:
-
avc: denied- tindakan yang dilakukan oleh SELinux dan dicatat dalam Access Vector Cache (AVC). -
{ read }- tindakan yang ditolak. -
pid=6591- pengenal proses dari subjek yang mencoba melakukan tindakan yang ditolak. -
comm="httpd"- nama perintah yang digunakan untuk memanggil proses yang dianalisis. -
httpd_t- tipe SELinux dari proses tersebut. -
nfs_t- tipe SELinux dari objek yang dipengaruhi oleh tindakan proses. -
tclass=dir- kelas objek target.
Entri log sebelumnya dapat diterjemahkan menjadi:
SELinux menolak proses httpd dengan PID 6591 dan tipe httpd_t untuk membaca direktori dengan tipe nfs_t.
Pesan penolakan SELinux berikut terjadi ketika Apache HTTP Server mencoba mengakses direktori yang diberi label dengan tipe untuk paket Samba:
type=AVC msg=audit(1226874073.147:96): avc: denied { getattr } for pid=2465 comm="httpd" path="/var/www/html/file1" dev=dm-0 ino=284133 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
-
{ getattr }- entrigetattrmenunjukkan bahwa proses sumber mencoba membaca informasi status file target. Hal ini terjadi sebelum proses membaca file. SELinux menolak tindakan ini karena proses mencoba mengakses file yang tidak memiliki label yang sesuai. Hak akses yang sering muncul antara laingetattr,read, danwrite. -
path="/var/www/html/file1"- jalur ke objek (target) yang coba diakses oleh proses. -
scontext="unconfined_u:system_r:httpd_t:s0"- konteks SELinux dari proses (sumber) yang mencoba melakukan tindakan yang ditolak. Dalam kasus ini, konteks tersebut adalah konteks SELinux dari Apache HTTP Server yang berjalan dengan tipehttpd_t. -
tcontext="unconfined_u:object_r:samba_share_t:s0"- konteks SELinux dari objek (target) yang coba diakses oleh proses. Dalam kasus ini, konteks tersebut adalah konteks SELinux darifile1.
Penolakan SELinux ini dapat diterjemahkan menjadi:
SELinux menolak proses httpd dengan PID 2465 untuk mengakses file /var/www/html/file1 yang memiliki tipe samba_share_t, yang tidak dapat diakses oleh proses yang berjalan di domain httpd_t kecuali jika dikonfigurasi sebaliknya.
Sumber daya tambahan
-
Halaman manual
auditd(8)danausearch(8)
Want to help? Learn how to contribute to Fedora Docs ›