newrole -r role_r -t domain_t
(biasanya ada hanya satu domain yang diperbolehkan untuk peran yang diberikan, sehingga parameter -t
seringkali dapat ditinggalkan). Perintah ini mengotentikasi Anda dengan meminta Anda untuk mengetik kata sandi. Fitur ini melarang program untuk secara otomatis beralih peran. Perubahan tersebut hanya dapat terjadi jika mereka secara eksplisit diizinkan dalam kebijakan SELinux.
ssh
diberi label dengan ssh_exec_t
, dan ketika program dimulai, secara otomatis beralih ke domain ssh_t
). Mekanisme transisi otomatis domain ini menjadikannya mungkin untuk memberikan hanya hak yang diperlukan oleh setiap program. Ini adalah prinsip dasar SELinux.
apt install selinux-basics selinux-policy-defaulti auditd
command will automatically install the packages required to configure an SELinux system.
unconfined
(manajemen modul dirinci lebih lanjut dalam bagian ini).
fixfiles relabel
.
selinux=1 security=selinux
. Parameter audit=1
memungkinkan log SELinux yang mencatat semua operasi yang ditolak. Akhirnya, parameter enforcing=1
membawa aturan ke aplikasi: tanpa itu SELinux bekerja dalam pengaturan mode permisif dimana tindakan yang ditolak dicatat tapi masih dijalankan. Anda justru harus memodifikasi berkas konfigurasi bootloader GRUB untuk menambahkan parameter yang diinginkan. Salah satu cara mudah untuk melakukan ini adalah untuk mengubah variabel GRUB_CMDLINE_LINUX
dalam /etc/default/grub
dan menjalankan update-grub
. SELinux akan aktif setelah reboot.
selinux-activate
mengotomatiskan operasi itu dan memaksa pelabelan pada boot berikutnya (yang menghindari berkas baru tanpa label diciptakan sementara SELinux masih belum aktif dan sementara pelabelan terjadi).
semodule
. Lebih jauh, Anda harus mampu mendefinisikan peran yang setiap pengguna dapat mendukungnya, dan ini dapat dilakukan dengan perintah semanage
.
/etc/selinux/default/
. Tidak seperti berkas konfigurasi lain yang dapat Anda temukan di /etc/
, semua berkas yang tidak boleh diubah dengan tangan. Anda harus menggunakan program-program yang dirancang untuk tujuan ini.
/usr/share/selinux/default/
. Untuk mengaktifkan salah satu modul ini dalam konfigurasi saat ini, Anda harus menggunakan semodule -i module.pp.bz2
. Ekstensi pp.bz2 singkatan dari policy package (paket kebijakan, dikompresi dengan bzip2).
semodule -r modul
. Akhirnya, perintah semodule -l
menampilkan daftar modul yang saat ini diinstal. Itu juga mengeluarkan nomor versi mereka. Modul dapat diaktifkan secara selektif dengan semodule -e
dan dinonaktifkan dengan semodule -d
.
#
semodule -i /usr/share/selinux/default/abrt.pp.bz2
libsemanage.semanage_direct_install_info: abrt module will be disabled after install as there is a disabled instance of this module present in the system. #
semodule -l
accountsd acct [...]
#
semodule -e abrt
#
semodule -d accountsd
#
semodule -l
abrt acct [...]
#
semodule -r abrt
libsemanage.semanage_direct_remove_key: abrt module at priority 100 is now active.
semodule
seketika memuat konfigurasi baru kecuali jika Anda menggunakan opsi -n
. Perlu dicatat bahwa program bertindak secara default pada konfigurasi saat ini (yang ditunjukkan oleh variabel SELINUXTYPE
di /etc/selinux/config
), tetapi Anda dapat memodifikasi yang lain dengan menyatakan opsi -s
.
semanage
.
-a
to add, -d
to delete, -m
to modify, -l
to list, and -t
to indicate a type (or domain).
semanage login -l
daftar pemetaan saat ini antara pengidentifikasi pengguna dan identitas SELinux. Pengguna yang tidak memiliki entri eksplisit mendapatkan identitas yang ditunjukkan dalam entri __default__
. Perintah semanage login -a -s user_u pengguna
akan mengasosiasikan identitas user_u kepada pengguna tertentu. Akhirnya, semanage login -d pengguna
menghapus entri pemetaan yang ditetapkan ke pengguna ini.
#
semanage login -a -s user_u rhertzog
#
semanage login -l
Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * rhertzog user_u s0 * root unconfined_u s0-s0:c0.c1023 * #
semanage login -d rhertzog
semanage user -l
menampilkan daftar pemetaan antara identitas pengguna SELinux dan peran yang diperbolehkan. Menambahkan identitas baru memerlukan untuk mendefinisikan peran yang sesuai dan awalan pelabelan yang digunakan untuk menetapkan suatu tipe ke berkas pribadi (/home/pengguna/*
). Awalan harus dipilih di antara user
, staff
, dan sysadm
. Awalan "staff
" menghasilkan berkas-berkas bertipe "staff_home_dir_t
". Menciptakan identitas pengguna baru SELinux dilakukan dengan semanage user -a -R peran -P awalan identitas
. Akhirnya, Anda dapat menghapus identitas pengguna SELinux dengan semanage user -d identitas
.
#
semanage user -a -R 'staff_r user_r' -P staff test_u
#
semanage user -l
Labeling MLS/ MLS/ SELinux User Prefix MCS Level MCS Range SELinux Roles root sysadm s0 s0-s0:c0.c1023 staff_r sysadm_r system_r staff_u staff s0 s0-s0:c0.c1023 staff_r sysadm_r sysadm_u sysadm s0 s0-s0:c0.c1023 sysadm_r system_u user s0 s0-s0:c0.c1023 system_r test_u staff s0 s0 staff_r user_r unconfined_u unconfined s0 s0-s0:c0.c1023 system_r unconfined_r user_u user s0 s0 user_r #
semanage user -d test_u
/srv/www/
, Anda bisa menjalankan semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?"
diikuti oleh restorecon -R /srv/www/
. Perintah awal mendaftarkan aturan pelabelan baru dan yang kedua mereset tipe berkas menurut aturan pelabelan saat ini.
semanage port -m -t http_port_t -p tcp 8080
.
getsebool
utility can be used to inspect those options (getsebool boolean
displays one option, and getsebool -a
them all). The setsebool boolean value
command changes the current value of a Boolean option. The -P
option makes the change permanent, it means that the new value becomes the default and will be kept across reboots. The example below grants web servers an access to home directories (this is useful when users have personal websites in ~/public_html/
).
#
getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off #
setsebool -P httpd_enable_homedirs on
#
getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on
/usr/share/doc/selinux-policy-doc/html/
) dan berkas sampel yang dapat digunakan sebagai template untuk membuat modul baru. Pasang berkas tersebut dan pelajari lebih dekat:
$
cp /usr/share/doc/selinux-policy-doc/Makefile.example Makefile
$
cp /usr/share/doc/selinux-policy-doc/example.fc ./
$
cp /usr/share/doc/selinux-policy-doc/example.if ./
$
cp /usr/share/doc/selinux-policy-doc/example.te ./
.te
adalah yang paling penting. Itu mendefinisikan aturan-aturan. Berkas .fc
mendefinisikan "file contexts (konteks berkas)", itu adalah jenis yang ditetapkan ke berkas yang terkait dengan modul ini. Data di dalam berkas .fc
digunakan selama langkah pelabelan berkas. Terakhir, berkas .if
mendefinisikan antarmuka modul: ini adalah satu set "fungsi umum" yang modul lain dapat gunakan untuk berinteraksi secara benar dengan modul yang Anda buat.
myapp_domtrans
") mengendalikan siapa yang dapat menjalankan aplikasi. Yang kedua ("myapp_read_log
") menghibahkan hak baca pada berkas log aplikasi.
.te
yang valid. Anda harus menyatakan semua tipe yang Anda gunakan (dengan makro gen_require
), dan menggunakan direktif standar untuk memberikan hak. Namun, perlu diketahui bahwa Anda dapat menggunakan antarmuka yang disediakan oleh modul lain. Bagian berikutnya akan memberikan penjelasan lebih lanjut tentang bagaimana untuk mengekspresikan hak tersebut.
Contoh 14.3. Berkas example.if
## <summary>Myapp example policy</summary> ## <desc> ## <p> ## More descriptive text about myapp. The desc ## tag can also use p, ul, and ol ## html tags for formatting. ## </p> ## <p> ## This policy supports the following myapp features: ## <ul> ## <li>Feature A</li> ## <li>Feature B</li> ## <li>Feature C</li> ## </ul> ## </p> ## </desc> # ######################################## ## <summary> ## Execute a domain transition to run myapp. ## </summary> ## <param name="domain"> ## <summary> ## Domain allowed to transition. ## </summary> ## </param> # interface(`myapp_domtrans',` gen_require(` type myapp_t, myapp_exec_t; ') domtrans_pattern($1,myapp_exec_t,myapp_t) ') ######################################## ## <summary> ## Read myapp log files. ## </summary> ## <param name="domain"> ## <summary> ## Domain allowed to read the log files. ## </summary> ## </param> # interface(`myapp_read_log',` gen_require(` type myapp_log_t; ') logging_search_logs($1) allow $1 myapp_log_t:file read_file_perms; ')
example.te
:
policy_module(example,1.0.0) # a non-base module name must match the file name ######################################## # # Declarations # type myapp_t; type myapp_exec_t; domain_type(myapp_t) domain_entry_file(myapp_t, myapp_exec_t) type myapp_log_t; logging_log_file(myapp_log_t) type myapp_tmp_t; files_tmp_file(myapp_tmp_t) ######################################## # # Myapp local policy # allow myapp_t myapp_log_t:file { read_file_perms append_file_perms }; allow myapp_t myapp_tmp_t:file manage_file_perms; files_tmp_filetrans(myapp_t,myapp_tmp_t,file)
Modul harus diidentifikasi oleh nama dan nomor versinya. Direktif ini diperlukan.
| |
Jika modul memperkenalkan tipe baru, itu harus menyatakan mereka dengan direktif seperti ini. Jangan ragu untuk menciptakan tipe sebanyak yang diperlukan daripada memberikan terlalu banyak hak yang tidak berguna.
| |
Antarmuka tersebut mendefinisikan tipe myapp_t sebagai domain proses yang harus digunakan oleh setiap executable yang dilabeli dengan myapp_exec_t . Secara implisit, ini menambah atribut exec_type pada objek tersebut, yang pada gilirannya memungkinkan modul lain untuk memberikan hak untuk mengeksekusi program-program tersebut: sebagai contoh, modul userdomain memungkinkan proses dengan domain user_t , staff_t , dan sysadm_t untuk mengeksekusi mereka. Domain aplikasi terbatas yang lain tidak akan memiliki hak untuk mengeksekusi mereka, kecuali aturan memberi mereka hak-hak yang sama (ini adalah kasus, misalnya, dari dpkg dengan domainnya dpkg_t ).
| |
logging_log_file adalah antarmuka yang disediakan oleh kebijakan referensi. Itu menunjukkan bahwa berkas yang dilabeli dengan tipe yang diberikan adalah berkas log yang seharusnya mendapatkan keuntungan dari aturan terkait (misalnya memberikan hak kepada logrotate sehingga dapat memanipulasi mereka).
| |
Direktif allow adalah petunjuk dasar yang digunakan untuk mengesahkan suatu operasi. Parameter pertama adalah domain proses yang diperbolehkan untuk mengeksekusi operasi. Yang kedua mendefinisikan objek dimana proses dari domain sebelumnya dapat memanipulasi. Parameter ini berbentuk "tipe:kelas" dimana tipe adalah tipe SELinux dan kelas menggambarkan sifat objek (berkas, direktori, soket, fifo, dll). Parameter terakhir menjelaskan hak akses (operasi yang diizinkan).
Izin didefinisikan sebagai serangkaian operasi yang diperbolehkan dan mengikuti template ini: { operasi1 operasi2 } . Namun, Anda juga dapat menggunakan makro yang mewakili izin yang paling berguna. /usr/share/selinux/devel/include/support/obj_perm_sets.spt memuat daftar mereka.
Halaman web berikut menyediakan daftar relatif lengkap dari kelas objek, dan izin yang dapat diberikan.
|
avc: denied { read write } for pid=1876 comm="syslogd" name="xconsole" dev=tmpfs ino=5510 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:device_t:s0 tclass=fifo_file permissive=1
Tabel 14.1. Analisis jejak SELinux
Pesan | Deskripsi |
---|---|
avc: denied | Operasi telah ditolak. |
{ read write } | Operasi ini memerlukan izin read dan write . |
pid=1876 | Proses dengan PID 1876 menjalankan operasi (atau mencoba untuk menjalankannya). |
comm="syslogd" | Proses adalah instance dari program syslogd . |
name="xconsole" | Objek target dinamai xconsole . Kadang-kadang Anda dapat juga memiliki variabel "path" — dengan path lengkap — sebagai pengganti. |
dev=tmpfs | Perangkat yang mewadahi objek target ini adalah tmpfs (suatu sistem berkas di memori). Untuk disk sungguhan, Anda bisa melihat partisi yang mewadahi objek (misalnya: "sda3"). |
ino=5510 | Objek diidentifikasi oleh nomor inode 5510. |
scontext=system_u:system_r:syslogd_t:s0 | Ini adalah konteks keamanan dari proses yang menjalankan operasi. |
tcontext=system_u:object_r:device_t:s0 | Ini adalah konteks keamanan objek target. |
tclass=fifo_file | Objek target adalah suatu berkas FIFO. |
allow syslogd_t device_t:fifo_file { read write }
. Proses ini dapat diotomatiskan, dan itu persis apa yang ditawarkan oleh perintah audit2allow
(dari paket policycoreutils). Pendekatan ini hanya berguna jika berbagai objek sudah benar dilabeli menurut apa harus dibatasi. Dalam hal apapun, Anda harus hati-hati meninjau aturan yang dihasilkan dan memvalidasi mereka menurut pengetahuan Anda tentang aplikasi. Secara efektif, pendekatan ini cenderung untuk memberikan hak lebih daripada yang benar-benar diperlukan. Solusi yang tepat seringkali adalah dengan menciptakan tipe baru dan memberikan hak hanya pada tipe tersebut. Terjadi juga bahwa operasi yang ditolak tidak fatal ke aplikasi, dalam hal itu mungkin lebih baik untuk hanya menambahkan aturan "dontaudit
" untuk menghindari entri log meskipun ada penyangkalan efektif.
example.if
, example.fc
, dan example.te
) sesuai harapan Anda untuk aturan baru, ubah nama mereka menjadi myapp.extension
dan jalankan make NAME=devel
untuk menghasilkan suatu modul dalam berkas myapp.pp
(Anda dapat seketika memuatnya dengan semodule -i myapp.pp
). Jika beberapa modul yang didefinisikan, make
akan membuat semua berkas .pp
yang sesuai.