newrole -r role_r -t domain_t
(there is usually only a single domain allowed for a given role, the -t
parameter can thus often be left out). This command authenticates you by asking you to type your password. This feature forbids programs to automatically switch roles. Such changes can only happen if they are explicitly allowed in the SELinux policy.
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-default
secara otomatis akan menginstal paket-paket yang diperlukan untuk mengkonfigurasi sistem SELinux.
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 -l
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
dapat digunakan untuk memeriksa opsi-opsi itu (getsebool boolean
menampilkan salah satu pilihan, dan getsebool -a
untuk semua). Perintah setsebool boolean nilai
mengubah nilai saat ini dari opsi boolean. Opsi -P
membuat perubahan permanen, itu berarti bahwa nilai baru menjadi default dan akan dipelihara antar reboot. Contoh di bawah menghibahkan server web akses ke direktori home (ini berguna ketika pengguna memiliki website pribadi dalam ~/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"> ## Domain allowed to transition. ## </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"> ## Domain allowed to read the log files. ## </param> # interface(`myapp_read_log',` gen_require(` type myapp_log_t; ') logging_search_logs($1) allow $1 myapp_log_t:file r_file_perms; ')
example.te
:
policy_module(myapp,1.0.0)######################################## # # 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 is an interface provided by the reference policy. It indicates that files labeled with the given type are log files which ought to benefit from the associated rules (for example, granting rights to logrotate so that it can manipulate them).
| |
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.
The following web page provides a relatively exhaustive list of object classes, and permissions that can be granted.
|
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 | The device hosting the target object is a tmpfs (an in-memory filesystem). For a real disk, you could see the partition hosting the object (for example, “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 }
. This process can be automated, and it is exactly what the audit2allow
command (of the policycoreutils package) offers. This approach is only useful if the various objects are already correctly labeled according to what must be confined. In any case, you will have to carefully review the generated rules and validate them according to your knowledge of the application. Effectively, this approach tends to grant more rights than are really required. The proper solution is often to create new types and to grant rights on those types only. It also happens that a denied operation isn't fatal to the application, in which case it might be better to just add a “dontaudit
” rule to avoid the log entry despite the effective denial.
example.if
, example.fc
, and example.te
) match your expectations for the new rules, rename them to myapp.extension
and run make NAME=devel
to generate a module in the myapp.pp
file (you can immediately load it with semodule -i myapp.pp
). If several modules are defined, make
will create all the corresponding .pp
files.