CentOS 7 - Direktori yang dibuat melalui VSFTPD tidak mewarisi konteks SELinux

8

Perusahaan kami memiliki server web dengan CentOS 7 dan pelanggan kami mengelola situs web mereka melalui FTP (vsftpd). SELinux dalam mode menegakkan.

Masalahnya adalah bahwa data yang dibuat / unggah melalui VSFTPD tidak mewarisi konteks SELinux yang sesuai. Biarkan saya jelaskan.

Misalnya, untuk situs WordPress yang dimiliki server, di luar kotak, sudah ada beberapa aturan yang dapat dilihat menggunakan semanage fcontext -l |grep '/var/www', yaitu:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0

Jadi, ketika saya menyalin situs WordPress katakanlah dari server lain ke direktori /var/www/html/oleh SSH, folder wp-content/dan wp-content/uploads/memiliki httpd_sys_rw_content_tkonteks keamanan yang tepat . NAMUN, ketika folder-folder itu dibuat melalui FTP, konteksnya adalah httpd_sys_content_t(no rw ). Ini berarti bahwa situs yang diunggah pelanggan kami ke server tidak dapat menulis ke direktori itu bahkan jika mereka memberikan izin menulis kepada pengguna / grup apache, sehingga admin WordPress tidak berfungsi. Jadi, ketika mereka mengunggah situs, mereka harus meminta dukungan dari kami untuk memperbaikinya, yang merupakan buang waktu bagi semua yang terlibat.

Katakanlah pelanggan mengunggah situs mereka ke dalam httpdocs, jika melalui SSH saya melakukan mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -frmasalah terpecahkan, jadi tidak ada yang salah dengan datanya.

Saya juga bisa lakukan restorecon -Rv httpdocs/untuk memperbaiki masalah ini.

Jadi, pertanyaannya adalah: Bagaimana saya bisa membuat direktori dibuat / diunggah melalui VSFTPD mewarisi konteks SELinux yang tepat sama seperti mereka diwarisi ketika direktori dibuat / diunggah melalui SSH?

Juan Pablo Barrios
sumber
Demi keamanan, sama sekali tidak mendukung FTP sama sekali. Pertimbangkan menyingkirkannya dan menginstruksikan pelanggan tentang cara mengkonfigurasi klien transfer file mereka untuk menggunakan SFTP sebagai gantinya ... yang juga akan menyingkirkan masalah ini.
Michael Hampton
Terima kasih Michael. Saya setuju dengan Anda tetapi dalam kasus kami, kami tidak menggunakan "ftp.domain.com" untuk pelanggan kami dan kami juga tidak mengekspos alamat IP publik server (server berada di belakang proxy NginX), sehingga keamanan FTP tidak menjadi masalah. untuk kita. Hanya mereka yang kami kirimi alamat FTP untuk dapat menemukan alamat IP server untuk terhubung melalui FTP.
Juan Pablo Barrios

Jawaban:

6

Ada perbedaan antara pelabelan default yang terjadi saat runtime dan kebijakan pasca pelabelan berbasis ekspresi reguler yang berlaku di server.

Apa yang Anda perhatikan di sini:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files         system_u:object_r:httpd_sys_rw_content_t:s0

Apakah kebijakan pelabelan posting.

Apa yang Anda diskusikan dalam masalah Anda sebenarnya terkait dengan kebijakan runtime.

Ketika sebuah entri dibuat dalam direktori menggunakan SELinux aturan yang mengatur label apa file atau direktori akhirnya tidak ditentukan oleh ekspresi reguler yang Anda kutip tetapi aturan lain sebagai berikut (saya percaya ini adalah urutan yang benar tetapi mungkin telah melewatkan sesuatu) .

  1. Ada type_transitionaturan bernama eksplisit .
  2. Ada type_transitionaturan eksplisit tanpa nama .
  3. Mewarisi konteks yang sama dengan direktori induk.
  4. Terapkan default_context.

Jadi, ketika saya menyalin situs WordPress katakanlah dari server lain ke direktori di / var / www / html / oleh SSH, folder wp-content / dan wp-content / uploads / memiliki konteks keamanan httpd_sys_rw_content_t yang tepat.

Jadi, ya itu memang melakukan ini, tetapi tidak untuk alasan yang Anda pikirkan. Tentu bukan karena kebijakan pelabelan posting.

Ini terjadi karena type_transitionaturan bernama tertentu ada yang menyediakan perilaku ini.

$ sesearch -C -T -s unconfined_t -t httpd_sys_content_t -c dir

Found 4 named file transition filename_trans:
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "wp-content"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "smarty"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "uploads"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "upgrade"; 

Ini pada dasarnya mengatakan.

  • Jika Anda unconfined_t dan
  • Jika Anda melakukan tindakan dalam jenis target httpd_sys_content_t dan
  • Jika kelas entri baru adalah direktori dan
  • Jika nama entri baru adalah "unggahan" maka
  • Tipe baru adalah httpd_sys_rw_content_t

Alasan ini bekerja untuk SSHD adalah karena setelah Anda masuk Anda diberikan konteks sumber unconfined_tyang aturan ini berlaku.

Ini tidak berfungsi untuk layanan FTP karena konteks sumber dari layanan ini kemungkinan besar ftpd_ttidak memiliki aturan yang cocok.

Dengan demikian, Anda perlu memodifikasi kebijakan untuk mengubah perilaku SELinux untuk juga menghormati aturan file yang disebutkan yang Anda lihat di entri lain untuk FTP juga.

Di Fedora 23 setidaknya, ada antarmuka untuk mengizinkan ini, modul kebijakan seperti ini akan melakukannya.

policy_module(local_ftpd, 7.2.0)

require {
  type ftpd_t;
}

apache_filetrans_named_content(ftpd_t)

Anda dapat memuat ini dengan memastikan bahwa selinux-policy-develpaket diinstal dan dijalankan make -f /usr/share/selinux/devel/Makefile load.

Matthew Ife
sumber
1
Hai Matthew, itu berhasil !! Terima kasih atas bantuan Anda karena saya sudah gila dengan ini. Saya tidak yakin apa hubungannya dengan modul policy yang Anda tulis karena saya tidak pernah mengkustomisasi SELinux, jadi saya sedikit googled dan berikut ini yang saya lakukan: Saya membuat file local_ftpd.tedengan modul policy Anda, lalu saya lakukan make -f /usr/share/selinux/devel/Makefile local_ftpd.ppkemudian semodule -i local_ftpd.pp. Apakah ini ok? Sekarang file yang dibuat melalui FTP mewarisi konteks yang diinginkan. Terima kasih lagi!
Juan Pablo Barrios