あるディレクトリから別のディレクトリにファイルをコピーするときにファイルのSELinuxラベルを維持する

あるディレクトリから別のディレクトリにファイルをコピーするときにファイルのSELinuxラベルを維持する

あるディレクトリから別のディレクトリにファイルまたはサブディレクトリをコピーする場合のデフォルトの動作は、移動されたオブジェクトとは異なり、コピーされたオブジェクトが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

ファイルをコピーした後user_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)

このように書かれた "constraint"マクロ constrain dir_file_class_set { create relabelto relabelfrom }( u1 == u2 または 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ファイルのみを含むので、少し異なります。

関連情報