天天看點

Selinux安全上下文詳解

SELinux介紹

    DAC:自由通路控制

    MAC:  強制通路控制

           DAC環境下程序是無束縛的

            MAC環境下政策的規則決定控制的嚴格程度

            MAC環境下程序可以被限制

            政策被用來定義被限制的程序能夠使用哪些資源(檔案和端口)

            預設情況下,沒有被明确允許的行為将被拒絕

Selinux安全上下文詳解

  • Selinux政策

    對象(object):所有可以讀取的對象,包括檔案、目錄和程序、端口等

    主體:程序稱為主體(subject)

    Selinux中所有的檔案都賦予一個type的檔案類型标簽,對于所有的程序也賦予格子衣domain的标簽。domain标簽能夠執行的操作由安全政策裡定義

    當一個subject試圖通路一個object,Kernel中的政策執行伺服器将檢查AVC(通路矢量緩存Access Vector Cache),在AVC中,subject和object的權限被緩存,查找“應用+檔案”的安全環境。然後根據查詢結果允許或拒絕通路

    安全政策:定義主體讀取對象的規則類資料庫,規則中記錄了哪個類型的主體使用哪個方法讀取哪一個對象是允許還是拒絕,并且定義了哪種行為是允許或拒絕

  • Selinux安全上下文

    傳統Linux,一切接檔案,由使用者,組,權限控制通路

    在Selinux中,一切皆對象(object),由存放在inode的擴充屬性域的安全元素所控制其通路

    所有檔案和端口資源和程序都具備安全标簽:安全上下文(security context)

    安全上下文有五個元素組成:

        user:role:type:sensitivity:category

        user_u:object_r:tmp_t:s0:c0

    實際上下文:存放在檔案系統中,ls -Z;ps -Z可以檢視詳細資訊

    期望(預設)上下文:存放在二進制的SElinux政策庫(映射目錄和期望安全上下文)

        semanage  fcontext  -l

  • 五個安全元素

    User:訓示登入系統的使用者類型,如root,user_u,system_u,多數本地程序都屬于自由(unconfined)程序

    Role:定義檔案,程序和使用者的用途:檔案:object_r,程序和使用者:system_r

    Type:指定資料類型,規則中定義何種程序類型通路何種檔案Target政策基于type實作,多服務公用:public_conten_t

    Sensitivity:限制通路的需要,由組織定義的分層安全級别,如unclassified,secret,top,secret,一個對象有且隻要一個sensitivity,分0-15級,s0最低,Target政策預設使用s0

    Category:對于特定組織劃分不分層的分類,如FBI Secret,NSA secret,一個對象可以有多個catagroy,c0-c1-23共1024個分類,Target政策不适用category

  • Selinux配置檔案

    Selinux配置檔案(configuration)或政策檔案(policy)位于/etc/目錄下

    /etc/sysconfig/selinux是一個符号連結,真正的配置檔案為:/etc/selinux/config

  • Selinux常用工具

    chcon指令修改檔案安全上下文

        chcon [options] CONTEXT files

        說明:

            CONTEXT為要設定的安全上下文

            files對象(檔案)

            options

                -f: 強迫修改

                -R:遞歸修改對象的安全上下文

                -r ROLE:修改安全上下文角色的配置

                -t TYPE:修改安全上下文類型的配置

                -u USER:修改安全上下文使用者的配置

在我們的實際生産環境中跟檔案權限最相關的是位于第三字段的資料類型,下面我們就用具體的示例來講解一下修改檔案的type類型導緻檔案權限的變更

我們通過更改/var/log/messages檔案的安全上下文類型來做一下示範

首先檢視messages檔案的原有标簽

ls -Z   /var/log/messages

Selinux安全上下文詳解

現将message更改成default_t類型

Selinux安全上下文詳解

因為我們更改了messages檔案的安全上下文所有導緻此檔案與/var/log目錄上下文标簽不比對是以所有日志都将無法寫入此檔案

更改回原來的标簽類型

chcon -t var_log_t  /var/log/messages

還可以使用第二種方法直接恢複

首先查詢selinux政策的資料庫種messages對應的标簽類型,然後使用restorecon後面跟/var/log/message直接恢複即可

semanage fcontext   -l  |  grep /var/log/message

Selinux安全上下文詳解

注意:此指令要求Selinux的政策資料庫中必須曾經記錄過此檔案的标簽

假設此時我們需要自己建立一個網頁檔案,那麼該怎樣設定它的檔案标簽呢?

首先建立一個目錄/data

在目錄中任意建立幾個檔案a.txt,b.txt

我們使用ls -Z  /data檢視會發現新建立的檔案的标簽預設為default_t

這裡我們可以知道自己手動常見的檔案因為selinux安全測錄==政策資料庫中沒有記載,是以一律為defaults_t标簽類型

Selinux安全上下文詳解

檢視一下在/httpd服務的主目錄下的檔案标簽類型為httpd_sys_content_t,此類型标簽代表了使用者可以從主目錄進入通路的标簽類型

防火牆政策放行httpd服務之後用浏覽器通路

Selinux安全上下文詳解

浏覽器可以正常通路登入

Selinux安全上下文詳解

那麼如果我們自己從新在/data目錄下定義一個網頁會怎樣?

首先修改httpd的配置檔案

Selinux安全上下文詳解

在/data目錄下建立一個名為test2.html的網頁檔案

并添加内容test2 page!!!

将DocumentRoot主目錄定義到/data下,并通過浏覽器重新通路

Selinux安全上下文詳解

此時我們檢視一下手動建立的test2.html檔案它的标簽為default_t類型

此類型的标簽導緻我們通路失敗

Selinux安全上下文詳解

然後我們修改test2.html的檔案類型标簽,之後重新開機服務并重新通路

chcon -t  httpd_sys_content_t  test2.html

Selinux安全上下文詳解

備注:我們在為自己建立的檔案設定标簽時,首先的知道此類型的檔案需要打上哪種标簽,可以到selinux的安全政策庫中查詢一下。

當然我們如果每次都手動設定每個檔案會比較麻煩,是以我們可以直接将/data父目錄設定成httpd類型的标簽,并将此目錄加到selinux的安全政策庫中

使用如下指令:

Selinux安全上下文詳解

這樣以後所有在/data目錄下建立的檔案都會自動打上http_sys_content_t标簽類型

接下來說一下端口的定義:

  • Selinux端口标簽

檢視端口标簽

    semanage port -l

添加端口

    semanage port -a -t port_label -p tcp|upd PORT

    semanage port -a -t http_port_t -p tcp  8998

删除端口

    semanage port -d  -t port_lable -p tcp|udp  PORT

    semanage port -d -t http_port_t -p tcp 8998

修改現有端口為新标簽

    semanage port -m -t port_label -p  tcp|upd PORT

    semanage port -m -t http_port_t -p tcp 8998  

我們檢視一下系統中httpd服務支援的端口

使用semanage port -a -t http_port_t -p tcp 8998

可以看到httpd服務支援的幾個端口

Selinux安全上下文詳解

然後我們手動将8998端口定義到httpd服務支援的端口中,并修改httpd服務的配置檔案讓它監聽在8998端口上,重新開機服務之後,使用浏覽器通路網站

Selinux安全上下文詳解

可以看到網站監聽在新的端口上,并且能夠正常通路。

Selinux安全上下文詳解

最後我們在來說一下Selinux的布爾值

SELinux布爾值

布爾值規則

    getsebool

    setsebool

檢視bool指令

    getsebool [-a] [boolean]

    semanage boolean -l

    semanage boolean -l -C :檢視修改過的布爾值

設定bool值指令

    setsebool [-P] boolean value(on ,off)

    setsebool [-P] Boolean value(0,1)

例如檢視一下ftp服務目前所有生效的布爾型值

Selinux安全上下文詳解

如果希望ftp支援匿名上傳可以将第一項ftpd_anon_write -->off改為on

setsebool ftpd_anon_write=1

備注:此指令更改的隻是記憶體中的資料,隻起到臨時生效的作用

想讓更改永久生效則使用 -P 選項

Selinux安全上下文詳解

繼續閱讀