selinux 初始化

 詳細看一下selinux_initialize()函數:


static void selinux_initialize(bool in_kernel_domain) {     // 區分內核態和用戶態
    Timer t;      //使用Timer計時,計算selinux初始化耗時

    selinux_callback cb;
    cb.func_log = selinux_klog_callback;              // 用於打印Log的回調函數
    selinux_set_callback(SELINUX_CB_LOG, cb);
    cb.func_audit = audit_callback;                    // 用於檢查權限的回調函數
    selinux_set_callback(SELINUX_CB_AUDIT, cb);

    if (in_kernel_domain) {        // 內核態處理流程,第一階段in_kernel_domain爲true  
        INFO("Loading SELinux policy...\n");        // 該行log打印不出,INFO級別 
        // 用於加載sepolicy文件。該函數最終將sepolicy文件傳遞給kernel,這樣kernel就有了安全策略配置文件
        if (selinux_android_load_policy() < 0) {
            ERROR("failed to load policy: %s\n", strerror(errno));
            security_failure();
        }

        bool kernel_enforcing = (security_getenforce() == 1);      // 內核中讀取的信息
        bool is_enforcing = selinux_is_enforcing();                // 命令行中得到的信息
        if (kernel_enforcing != is_enforcing) {
        // 用於設置selinux的工作模式。selinux有兩種工作模式:
            // 1、”permissive”,所有的操作都被允許(即沒有MAC),但是如果違反權限的話,會記錄日誌
            // 2、”enforcing”,所有操作都會進行權限檢查。在一般的終端中,應該工作於enforing模式
            if (security_setenforce(is_enforcing)) {        //設置selinux的模式,是開還是關
                ERROR("security_setenforce(%s) failed: %s\n",
                      is_enforcing ? "true" : "false", strerror(errno));
                security_failure();    // 將重啓進入recovery mode
            }
        }

        if (write_file("/sys/fs/selinux/checkreqprot", "0") == -1) {
            security_failure();
        }

        NOTICE("(Initializing SELinux %s took %.2fs.)\n",
               is_enforcing ? "enforcing" : "non-enforcing", t.duration());   //輸出selinux的模式,與初始化耗時
    } else { 
        selinux_init_all_handles(); //如果啓動第二階段,調用該函數   
    } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章