将文件或子目录从一个目录复制到另一个目录的默认行为是,复制的对象不会维护其 SELinux 类型(域),这与移动的对象相反。复制的对象继承父域安全上下文。是否可以编写重复命令“cp --preserve=context”行为的 SELinux 策略?换句话说,当一个对象从一个目录复制到另一个目录时,它可以保留前一个父目录的 SELinux 类型(域)。例如,如果目录结构如下所示
[root@localhost user_test_three]# ls -Zd /tmp/test_dir/test1
drwxrwxrwx. root root system_u:object_r:seuser_object_test_one_t:s0 test1
[root@localhost user_test_three]# ls -Zd /tmp/test_dir/test2
drwxrwxrwx. root root system_u:object_r:seuser_object_test_two_t:s0 test2
[root@localhost user_test_three]# ls -Z /tmp/test_dir/test1 /tmp/test_dir/test2
/tmp/test_dir/test1:
-rw-rw-r--. user_test_four user_test_four seuser_test_four_u:object_r:seuser_object_test_one_t:s0 user_one_test1_file1
/tmp/test_dir/test2:
-rw-rw-r--. user_test_four user_test_four seuser_test_four_u:object_r:seuser_object_test_two_t:s0 user_one_test2_file1
复制文件后“用户_one_test2_file1“来自目录”/tmp/test_dir/test2/“进入目录”/tmp/test_dir/test1/“ 目录的内容应该如下所示
[root@localhost user_test_three]# ls -Z /tmp/test_dir/test1 /tmp/test_dir/test2
/tmp/test_dir/test1:
-rw-rw-r--. user_test_four user_test_four seuser_test_four_u:object_r:seuser_object_test_one_t:s0 user_one_test1_file1
-rw-rw-r--. user_test_four user_test_four seuser_test_four_u:object_r:seuser_object_test_two_t:s0 user_one_test2_file1
/tmp/test_dir/test2:
-rw-rw-r--. user_test_four user_test_four seuser_test_four_u:object_r:seuser_object_test_two_t:s0 user_one_test2_file1
目前 TE 文件看起来是这样的
policy_module(user_test_threeLB, 1.0.0)
require
{
type fs_t;
type unconfined_t;
class file
{
getattr setattr read write rename
};
class dir
{
getattr setattr read write open rename remove_name add_name
create
};
class filesystem
{
associate
};
role object_r;
}
type seuser_object_test_one_t;
type seuser_object_test_two_t;
type seuser_object_test_four_t;
role object_r types
{
seuser_object_test_one_t seuser_object_test_two_t
seuser_object_test_four_t
};
allow seuser_object_test_one_t fs_t: filesystem
{
associate
};
allow seuser_object_test_two_t fs_t: filesystem
{
associate
};
allow seuser_object_test_four_t fs_t: filesystem
{
associate
};
allow unconfined_t seuser_object_test_one_t: file
{
append create getattr setattr open read write rename unlink
};
allow unconfined_t seuser_object_test_two_t: file
{
append create getattr setattr open read write rename unlink
};
allow unconfined_t seuser_object_test_four_t: file
{
append create getattr setattr open read write rename unlink
};
allow unconfined_t seuser_object_test_one_t: dir
{
getattr setattr read write open rename remove_name add_name create
search rmdir
};
allow unconfined_t seuser_object_test_two_t: dir
{
getattr setattr read write open rename remove_name add_name create
search rmdir
};
allow unconfined_t seuser_object_test_four_t: dir
{
getattr setattr read write open rename remove_name add_name create
search rmdir
};
userdom_unpriv_user_template(seuser_test_one)
userdom_unpriv_user_template(seuser_test_two)
userdom_unpriv_user_template(seuser_test_four)
role seuser_test_one_r types
{
seuser_object_test_one_t
};
role seuser_test_two_r types
{
seuser_object_test_two_t
};
role seuser_test_four_r types
{
seuser_object_test_four_t seuser_object_test_three_t
seuser_object_test_two_t seuser_object_test_one_t
};
allow seuser_test_one_t seuser_object_test_one_t: dir
{
add_name create getattr setattr open read remove_name rename rmdir
search write
};
allow seuser_test_one_t seuser_object_test_one_t: file
{
append create getattr setattr open rename read write
};
allow seuser_test_two_t seuser_object_test_two_t: dir
{
add_name create getattr setattr open read remove_name rename rmdir
search write
};
allow seuser_test_two_t seuser_object_test_two_t: file
{
append create getattr setattr open rename read write
};
allow seuser_test_four_t seuser_object_test_one_t: dir
{
add_name create getattr setattr open read remove_name rename rmdir
search write
};
allow seuser_test_four_t seuser_object_test_one_t: file
{
append create getattr setattr open rename read write
};
allow seuser_test_four_t seuser_object_test_two_t: dir
{
add_name create getattr setattr open read remove_name rename rmdir
search write
};
allow seuser_test_four_t seuser_object_test_two_t: file
{
append create getattr setattr open rename read write
};
allow seuser_test_four_t seuser_object_test_four_t: dir
{
add_name create getattr open read remove_name rename rmdir search
write
};
allow seuser_test_four_t seuser_object_test_four_t: file
{
append create getattr open rename read setattr write
};
gen_user(seuser_test_one_u, user, seuser_test_one_r, s0)
gen_user(seuser_test_two_u, user, seuser_test_two_r, s0)
gen_user(seuser_test_four_u, user, seuser_test_four_r, s0)
我尝试使用以这种方式编写的“约束”宏 constrain dir_file_class_set { create relabelto relabelfrom } ( u1 == u2 or t1 == can_change_object_identity );但这导致政策编制过程中出现错误。使用 neverallow 宏也没有帮助(当然)。在我的 TE neverallow 指令中看起来像这样
neverallow seuser_test_four_t seuser_object_test_four_t: dir
{
relabelfrom relabelto
};
neverallow seuser_test_four_t seuser_object_test_four_t: file
{
relabelfrom relabelto
};
在我的研究中我广泛使用selinuxproject.org和这个教程。
问题再次是,是否可以以重复命令“cp --preserve=context”的行为的方式编写 SELinux 策略?换句话说,当一个对象从一个目录复制到另一个目录时,它会保留前一个父目录的类型。这个问题:如何从一个目录复制 SELinux 上下文并将其应用到另一个目录?有点不同,因为我的仅涉及策略,即 TE 文件而不是工具。