簡單瞭解selinux

SElinux security Enhanced linux
linux

selinux這個組件將linux上自主訪問策略提高成了強制訪問策略
DAC----->MAC
DAC:自主訪問策略,discretionary access control
MAC:強制訪問策略,mandatory access control
咱們SElinux的發展:
   SElinux最先誕生在1990s美國NSA,用於實現軍事安全的在linux kernel 2.2 2.4的時候是之外掛組件至於linux中的而到了linux kernel 2.6時就直接作進內核,如今已近是內核的組成部分了
windows

從而linux的系統安全性從C2--->B1的躍升,操做系統的安全等級有:C2,C1,B3,B1,A1咱們的以前的linux和windows都是處於C2最低的等級上面,通常咱們常說的***(其實都是被理解錯了,他們是一些在某些領域很專業的人才)都是學習linux或unix的。安全

SElinux的工做:不過子啊講selinux的工做前,我先講講訪問策略。ide

  自主訪問策略:每一個用戶能夠隨意修改文件權限,每一個文件都是有權限的限定的任何一個進程在執行的時候都是以某個用戶的權限來執行的,這個權限就是這個進程的安全上下文。
   例如:一個用戶fedora 能夠執行ls進程,這時的ls進程的安全上下文就是和咱們fedora相關的,原本在執行]#ls /tmp/test.txt這個命令時,redhat早在這個ls命令作了修改,也就是ls命令中添加訪問~/.a.sh。ls就會悄悄的執行~/.a.sh這個可執行文件,這個可執行文件是由redhat建立的,並將~/.a.sh的權限設爲777,ls在執行該文件的時候一看本身的安全上下文可以訪問這個文件,因而就能夠執行.a.sh這個腳本。若是咱們這個腳本中有一些對系統破壞的命令,咱們就慘了。一個進程發起者的身份,權限決定了一個進程能夠訪問那些文件,可是在事實上這個進程發起者可能擁有多餘這個進程應該可以訪問文件的數目,
學習

  強制訪問策略:
  仍是剛纔的例子,咱們能夠限制ls進程,當fedora在執行s /tmp/test.txt文件的時候,ls也就只能執行 /tmp/test.txt這個文件,這是由於,在SElinux的做用下,每個進程在執行的時候都會附加一個sandbox(沙箱),也就是說 ls /tmp/test.txt在運行的時候只能在sandbox中執行,不能跑出去,sandbox中只有/tmp/test.txt這個文件。   
   進程在運行的時候這有點像咱們中學英語中學的主謂賓:
    Subject operation Object
    fedora    ls  /tmp/test.txt
   ,只是在咱們的操做系統中用戶是不能直接操做計算機的,只能經過進程,可是一旦咱們某個進程運行起來就必定是以某個用戶的身份在運行的,也就必定會附有一個針對該用戶的安全上下文 ,而進程可以執行object有:目錄,文件描述符,文件,文件系統,鏈接,管道,其餘進程,還有特殊文件。Subject的只能是處於活動的進程 ,operating有:追加,新建執行一些可執行文件,得到屬性,進行一些IO控制,建立鏈接,給文件加鎖,讀一個文件,重命名一個文件,修改文件,解鎖,等。因此強制的訪問策略對處於可活動的進程能夠執行的operaing 和 object已經定義好了,
 
  這些是怎麼定義的呢?
  咱們執行 ]#ls -Z 能夠查看一個命令在執行時的安全上下文
[root@linux ~]#ls -Z
-rw-------  root root system_u:object_r:user_home_t    anaconda-ks.cfg
-rw-r--r--  root root root:object_r:user_home_t        boot.iso
-rw-r--r--  root root root:object_r:user_home_t        class.cfg
drwxr-xr-x  root root root:object_r:user_home_t        Desktop
-rw-r--r--  root root root:object_r:user_home_t        install.log
-rw-r--r--  root root root:object_r:user_home_t        install.log.syslog
drwxr-xr-x  root root root:object_r:user_home_t        iso
-rw-r--r--  root root root:object_r:user_home_t        memtest.sh
-rw-r--r--  root root system_u:object_r:user_home_t    scsrun.log
  咱們拿第一條爲例,給你們簡單講講
  system_u 是SElinux用戶,這個和咱們的屬主root是不同的 object_r 是角色,不過這個有點像咱們的屬組,權限的集合,可是又不徹底同樣user_home_t 是類型,文件的類型,這是重點,就至關於給咱們的文件打了一個標籤    這個標籤就至關於咱們剛纔提到的沙箱sandbox,咱們的Subject object都是有類型的,一般只有subject和object的類型相同的時候,纔可以運行起來,但這不是絕對的。對於咱們的opera怎麼定義啊,這就要提到咱們的SElinux策略了,這裏的策略就是一些規則的庫,是否可以訪問,以及怎麼訪問,都作了定義。
 
  例子:ls /tmp/test.txt
    ls 的類型是 etc_t,不過對subject來講通常叫作域,其實和類型是一個概念 /tmp/test.txt  的類型是 file_t. 當 ]#ls /tmp/test.txt 一執行 就會先到SElinux策略庫中去查找,這樣的類型之間可以訪問嗎,而且能夠作出那些訪問,因此在ls原本有一層安全上下文 /tmp/test.txt有屬組屬主權限 以外,有附加了一層類型,以及這些類型之間的訪問機制。假設說我SElinux策略規定了ls在訪問/tmp/test.txt時不能訪問別的文件,這樣ls就好像在一個沙箱中運行。 這些定義到底存在什麼地方呢?通常咱們系統的一些默認定義式存在於/etc/selinux/policy.21,這裏存放了什麼域可以訪問什麼類型,以及是怎麼訪問的。不過是一個2進制的文件,這樣是爲了加速訪問的過程。
spa

  selinux 有兩種訪問策略
     strict(嚴格的,每個進程都定義)
     targeted(只對一些關鍵的作出定義,像http ftp nfs等)
 咱們的redhat使用的是target的模型. target策略下,被定義的進程有標籤(域,或類型),沒有被定義的進程叫作未定義類型
   ]#ps auxZ
LABEL                           USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
system_u:system_r:init_t        root         1  0.0  0.1   2072   620 ?        Ss   20:42   0:01 init [3]                  
system_u:system_r:kernel_t      root         2  0.0  0.0      0     0 ?        S<   20:42   0:00 [migration/0]
system_u:system_r:kernel_t      root         3  0.0  0.0      0     0 ?        SN   20:42   0:00 [ksoftirqd/0]
system_u:system_r:kernel_t      root         4  0.0  0.0      0     0 ?        S<   20:42   0:00 [watchdog/0]
system_u:system_r:kernel_t      root         5  0.0  0.0      0     0 ?        S<   20:42   0:00 [events/0]
system_u:system_r:kernel_t      root         6  0.0  0.0      0     0 ?        S<   20:42   0:00 [khelper]
system_u:system_r:kernel_t      root         7  0.0  0.0      0     0 ?        S<   20:42   0:00 [kthread]
system_u:system_r:kernel_t      root        10  0.0  0.0      0     0 ?        S<   20:42   0:00 [kblockd/0]
操作系統

    被定義的進程都是有標籤的 LABEL 這些標籤訂義了各類各樣的類型,這些類型是selinux開發人員指定的,而咱們只要學會用就好了,假如ls /tmp/test.txt,中ls的域(類型)是etc_t 而/tmp/test.txt 是file_t類型,同時在selinux策略中沒有定義這兩種類型可以相互訪問,咱們就只須要將/tmp/test.txt 的類型改成etc_t的就好了。
 
  不過到這裏我還想給你們講一點,仍是上面的ls /tmp/test.txt的例子,在咱們的selinux中定義 域和類型之間的訪問策略,不過還定義了一個boolean類型的變量,這個變量可以決定咱們selinux中不一樣類型、域之間訪問策略的開啓或關閉功能,因此咱們能夠修改boolean值來修改類型之間的訪問策略,不過定義的這些boolean不少
    getsebool -a  來查看全部開啓、關閉的策略
    咱們拿vsftpd來給你們演示
   ]#getsebool -a | grep  ftp
    allow_ftpd_anon_write --> off
    allow_ftpd_full_access --> off
    allow_ftpd_use_cifs --> off
    allow_ftpd_use_nfs --> off
    allow_tftp_anon_write --> off
    ftp_home_dir --> off
    ftpd_connect_db --> off
    ftpd_disable_trans --> off
    ftpd_is_daemon --> on
    httpd_enable_ftp_server --> off
    tftpd_disable_trans --> off
   ]#
 
    ]#getenfroce 查看咱們的selinux的功能是否啓用了,這個值有三個:permissive(記錄你的違反行爲,存放在/var/log/audit/audit.log中,
不過這個文件是個二進制的文件),disabled(禁用),enforcing(強制執行selinux的策略)
    ]#setenforce 1(enforcing)|0(permissive) 不過這樣的修改是臨時性的,要想永久的保留修改,咱們就要修改/etc/selinux/config這個
文件中的值,不過有時候你會看到有些人使修改/etc/sysconfig/selinux這個文件,其實這兩個文件是同樣的。
/etc/selinux/config 中還定義了咱們linux的模式,是strict,仍是target模式。
    其實咱們也能夠經過向內核參數傳遞的方式,來修改咱們的selinux,方法一:在開機的時候,在內核的內一行中寫入selinux=0|1,或在
咱們的/boot/grub/grub.conf文件中內核的那一行中寫入selinux=0|1的方式。
    ]#setsebool allow_ftpd_anon_write on | off | 1 | 0 來修改策略師開啓仍是關閉,不過這種修改也是臨時有效的,若是想要永久有效
咱們就要用 ]#setsebool -p allow_ftpd_anon_write on | off | 1|0
 
因此咱們所selinux管理員的工做基本上就是:指定strict或target的形式,修改文件的標籤,修改一下boolean值,等!
unix

相關文章
相關標籤/搜索