淺析SELinux

科技小能手發表於2017-11-12

為什麼有的時候我們非要把SELinux=disabled設定成這樣

  1. 什麼是SELinux?(訪問控制體系,實現系統安全性達到軍方級別)

    百度解釋:是美國國家安全域性(NSA)對於強制訪問控制的實現,是 Linux歷史上最傑出的新安全子系統。NSA是在Linux社群的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,程式只能訪問那些在他的任務中所需要檔案。

  2. 怎麼用呢?

    [root@hack1 ~]# cat /etc/redhat-release 

    CentOS release 6.6 (Final)

    [root@hack1 ~]# uname -a

    Linux hack1 2.6.32-504.12.2.el6.i686 #1 SMP Wed Mar 11 19:05:53 UTC 2015 i686 i686 i386 GNU/Linux

    [root@hack1 ~]# 這是我的系統

    [root@hack1 selinux]# ls

    config  restorecond.conf  restorecond_user.conf  semanage.conf  targeted

    [root@hack1 selinux]# pwd

    /etc/selinux

    [root@hack1 selinux]# cat config 

    # This file controls the state of SELinux on the system.

    # SELINUX= can take one of these three values:

    #     enforcing – SELinux security policy is enforced.

    #     permissive – SELinux prints warnings instead of enforcing.

    #     disabled – No SELinux policy is loaded.

    SELINUX=enforcing

    # SELINUXTYPE= can take one of these two values:

    #     targeted – Targeted processes are protected,

    #     mls – Multi Level Security protection.

    SELINUXTYPE=targeted 

    [root@hack1 selinux]#

    現在解釋目錄在/etc/selinux下,配置檔案config

    SELINUX可以有三個引數


    enforcing級別:Linux下selinux所設定的安全策略都會被啟用.所有與selinux安全策略有關的服務或者程式都會被策略阻止.

    permissive級別:Linux下selinux所設定的安全策略都會被啟動,但是所有與selinux安全策略有關的服務或者程式不會被策略組織,但是會收到警告.

    disabled級別:關閉selinux,相當於系統沒有安裝selinux一樣.

  3. 怎麼實現策略呢?

    通過二進位制和content(安全上下文(context secure),含義就是:一個程式到底能訪問哪些檔案取決於發起程式的使用者的許可權和訪問的檔案的許可權設定),至於怎麼通過二進位制和content可以看下面的這個連結http://www.myhack58.com/Article/48/66/2012/36288.htm

  4. 常用的命令

    [root@hack1 selinux]# getsebool -a #檢視系統中所有“開關形式”的規則

    abrt_anon_write –> off

    abrt_handle_event –> off

    allow_console_login –> on

    allow_cvs_read_shadow –> off

    。。。。。。

    [root@hack1 selinux]# getenforce #檢視selinux 的status

    Enforcing

    [root@hack1 selinux]#setenforce 0/1        #設定selinux的status(臨時生效)

    ls -Z                  #檢視檔案的標籤

    [root@hack1 selinux]# ls -Z 可以看出不同的標籤

    -rw-r–r–. root root system_u:object_r:selinux_config_t:s0 config

    -rw-r–r–. root root system_u:object_r:selinux_config_t:s0 restorecond.conf

    -rw-r–r–. root root system_u:object_r:selinux_config_t:s0 restorecond_user.conf

    [root@hack1 selinux]# ls -Z /root

    -rw——-. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg

    -rw-r–r–. root root system_u:object_r:admin_home_t:s0 install.log

    -rw-r–r–. root root system_u:object_r:admin_home_t:s0 install.log.syslog

    [root@hack1 selinux]# ls -Z /home/lxf/

    -rw-rw-r–. lxf lxf unconfined_u:object_r:user_home_t:s0 c.log

    [root@hack1 selinux]# 

    ps auxZ             #檢視程式的標籤(使用者:角色:型別)

    ps auxZ | grep httpd #檢視httpd的標籤
    ls -dZ /var/www/html #檢視此目錄的標籤(連結裡邊的案例就是通過copy不同地方的檔案,不能實現同樣的訪問,原因就來源於selinux

                               #上面程式和目錄被selinux定義的型別相同,所以能被訪問

     chcon  -t             #改檔案型別

                -R             #該目錄型別(遞迴修改)

               –reference

     chcon -R –reference=/var/www/html /www #參照/www更改/var/www/html檔案型別

     chcon -t default_t /www/index.html   #更改檔案型別為default_t

     restorecon -R         #恢復目錄的檔案原有預設屬性

                      -F         #強制恢復

                      -v         #顯示資訊


    restorecon -R -v -F /www              #強制恢復/www目錄的預設屬性

    semanage  fcontext                    #更改檔案安全上下文(永久性更改)
    getsebool -a | grep httpd  #檢視httpd服務能用的“開關”

  5. 如何開啟/關閉這些規則:

     setsebool httpd_enable_cgi=1     #開啟

     setsebool httpd_enable_cgi=1     #關閉

  6. [root@hack1 selinux]# getsebool -a |grep httpd 通過這個應該可以知道為什麼關閉selinux

    allow_httpd_anon_write –> off

    allow_httpd_mod_auth_ntlm_winbind –> off

    allow_httpd_mod_auth_pam –> off

    allow_httpd_sys_script_anon_write –> off

    httpd_builtin_scripting –> on

    httpd_can_check_spam –> off

    httpd_can_network_connect –> off

    httpd_can_network_connect_cobbler –> off

    httpd_can_network_connect_db –> off

    httpd_can_network_memcache –> off

    httpd_can_network_relay –> off

    httpd_can_sendmail –> off

    httpd_dbus_avahi –> on

    httpd_dbus_sssd –> off

    httpd_enable_cgi –> on

    httpd_enable_ftp_server –> off

    httpd_enable_homedirs –> off

    httpd_execmem –> off

    httpd_manage_ipa –> off

    httpd_read_user_content –> off

    httpd_run_preupgrade –> off

    httpd_run_stickshift –> off

    httpd_serve_cobbler_files –> off

    httpd_setrlimit –> off

    httpd_ssi_exec –> off

    httpd_tmp_exec –> off

    httpd_tty_comm –> on

    httpd_unified –> on

    httpd_use_cifs –> off

    httpd_use_fusefs –> off

    httpd_use_gpg –> off

    httpd_use_nfs –> off

    httpd_use_openstack –> off

    httpd_verify_dns –> off

    [root@hack1 selinux]#

  7. 擴充套件閱讀

    SE Linux 可以為你的系統提供較棒的安全防護。 使用者能被分配預先定義好的角色,以便他們不能存取檔案或者訪問他們不擁有的程式。 這可不是簡單的 ” chmod 777″ 同等物操作。 這在角色, 或他所在的安全上下文已經限制接觸的檔案和其他的資源的使用者定義中是不同於一般的 Unix 許可許可權的,除了在一種比較受約束的流行之外。 帶一個使用者的.rhosts 檔案在一個一般的 Unix 系統上申請。 如果他們使它成為任何人可寫入 , 那麼任何能登入的人都可以作危險的操作。 在 SE Linux 之下,你能控制其它使用者是否有能力改變他們的.rhosts檔案, 以及阻止其他的人寫入 , 就算擁有者已經使它成為任何人可寫入。 
    一個通常的疑問是 SE Linux 的許可權設定如何與標準的 Unix 的許可權設定共存。 當你做特定的操作的時候, Unix 許可權首先被檢查。 如果他們允許你的操作 , 那麼然後, SE Linux 將會檢查並且允許或拒絕使用者的使用。 但是如果 Unix 許可不讓你做某事,在那裡的執行的操作被禁止和 SE Linux 檢查沒關係。  另外的一個例子是,如果有一個設定了SUID的可執行檔案,如/usr/bin/passwd 他可以執行命令chmod 666 /etc/shadow,SE Linux 會阻止任何人非法的這樣設定檔案。   
    2.2 術語 
    接下來的術語將在本文當中經常出現, 也是來自SE Linux的基本概念. It is somewhat tricky to define one word without including the other terms so I realise my definitions include things that need defining(譯者注:這句實在不敢亂譯,sorry。不過不耽誤學習;-)) )  
    2.2.1 (身份)identity 
     
    在 SE Linux 中,身份的概念不同於傳統的Unix uid (user id). 它們可以共存於一個系統, 但卻是十分不同的概念。 在SE Linux中的身份是安全上下文的一部分,它會影響哪個域可以進入,也就是本質上的可以被執行。一個SE Linux 的身份(identity)會跟標準的Unix登入名有很相似的文字表示 (大部分情況下它們是這樣), 無論如何,瞭解它們是兩個完全不同的概念是很重要的。 執行su 命令不會改變SE Linux中的身份(identity)。(譯者注:我在紅帽系統中做的實驗卻不是這樣,不過這無所謂,可能紅帽系統的策略設定不同,我目前還沒來得及研究具體是什麼問題,只是猜測。) 
     6









    Getting Started with SE Linux HOWTO:the new SE Linux 
    舉例:  
    一個無特權使用者 faye 執行 id 命令 (在啟動SE Linux的情況下) 可以看到使用者的安全上下文:  
    context=faye:user_r:user_t 
    安全上下文中的身份部分就是 “faye”。 現在, 如果 faye su切換成 root 再執行id, 他將發現安全上下文仍然是: 
    context=faye:user_r:user_t 
    身份保持相同, 跟沒切換到root時一樣。, 不管怎樣,如果faye 身份被允許進入sysadm_r 角色並轉換成了sysadm_r (這裡可以使用newrole -r 命令),再執行id 命令,他將看到:  
    context=faye:sysadm_r:sysadm_t 
    身份欄位保持一樣但是角色和域(第二和第三欄位)的欄位已經變了。這樣保持身份的方式是使用者職責所必需的。身份將影響系統決定哪個角色和域可以被什麼身份所使用,這將對系統安全期決定性的作用。  
    2.2.2 域 
     
    所有程式都在域中執行。域直接決定了程式的訪問。 域基本上是一個程式允許做的操作的列表, 或者說它決定了一個程式可以對哪些型別進行操作。 域就好像一個標準UNIX的uid的概念。 假設一個屬於root使用者的可執行程式被設定了setuid。 在這個系統上的任何使用者,只要可以執行這個程式,它就有可能獲得root的許可權。這是一個很大的安全漏洞。 再有SE Linux的系統上, 如果一個正在執行的程式想要轉換進入特權域執行時,如果這個程式的角色被設定成不允許進入特權與的話, 這個程式就不能執行。  
    常見的例子是sysadm_t是系統管理域, user_t 是無特權使用者域。 Init執行在init_t 域, named 執行在 named_t 域。 
    2.2.3 型別 
     
    型別分配給一個物件並決定誰可以訪問這個物件。 它的定義和域基本相同, 不同就是域是對程式的應用而型別是分配給目錄,檔案,和套接字的。  
    2.2.4 角色 
     
    角色決定了那些域可以使用。 有關哪些與可以被哪些角色使用可以預先定義在策略的配置檔案裡。如果一個策略資料庫中定義了一個角色不可以使用一個域, 它將被拒絕。 
     7








    本文轉自 aklaus 51CTO部落格,原文連結:http://blog.51cto.com/aklaus/1666305