Linux的SELinux


1、什麼是SELinux?
html

    SELinux(Security-Enhanced Linux) 是美國國家安全局(NSA=The National Security Agency)和 SCC(Secure Computing Corporation)開發的 Linux的一個強制訪問控制的安全模塊。2000年以GNU GPL發佈,Linux內核2.6版本後集成在內核中 node

    DAC:Discretionary Access Control自由訪問控制 python

    MAC:Mandatory Access Control 強制訪問控制linux

        DAC環境下進程是無束縛的 數據庫

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

        MAC環境下進程能夠被限制的 vim

        策略被用來定義被限制的進程可以使用那些資源(文件和端口) centos

        默認狀況下,沒有被明確容許的行爲將被拒絕瀏覽器

    簡單來講,selinux它給一些特定程序作了一個沙箱,它將文件打上了一個安全標籤,這些標籤屬於不一樣的類,也只能執行特定的操做,也就是規定了某個應用程序設定了你能夠訪問那些文件或目錄,是工做在內核中的MAC 的一個實現,目的在於明確的指明某個進程能夠訪問哪些資源(文件、網絡端口等)。緩存


2、SELinux的工做類型 

    SELinux有四種工做類型: 

        – strict: centos5,每一個進程都受到selinux的控制 

        – targeted: 用來保護常見的網絡服務,僅有限進程受到selinux控制,只監 控容易被***的進程,centos4只保護13個服務,centos5保護88個服務 

        – minimum:centos7,修改的targeted,只對選擇的網絡服務 

        – mls:提供MLS(多級安全)機制的安全性 

    targeted爲默認類型,minimum和mls穩定性不足,未加以應用,strict已再也不使用


3、SELinux的運行機制

image.png

    如同所示,subject試圖訪問一個object,Kernel中的策略執行服務器將檢查AVC (Access Vector Cache), 在AVC中,subject和object的權限被緩存(cached)。若是基於AVC中的數據不能作出決定,則請求安全服務器,安全服務器在一個矩陣中查找「應用+文件」的安全環境。而後根據查詢結果容許或拒絕訪問,拒絕消息細節位於/var/log/messages中。

    對象(object):全部能夠讀取的對象,包括文件、目錄和進程,端口等 

    主體:進程稱爲主體(subject) 

    安全策略:定義主體讀取對象的規則數據庫,規則中記錄了哪一個類型的主體使用哪一個方法讀取哪個對象是容許仍是拒絕的,而且定義了哪一種行爲是充許或拒絕


4、SELinux安全上下文

    傳統Linux,一切皆文件,由用戶,組,權限控制訪問 

    在SELinux中,一切皆對象(object),由存放在inode的擴展屬性域的安全元素所控制其訪問 

    全部文件和端口資源和進程都具有安全標籤:安全上下文(security context) 

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

        User:指示登陸系統的用戶類型,如root,user_u,system_u,多數本地進程都屬於自由(unconfined)進程 

        Role:定義文件,進程和用戶的用途,文件:object_r,進程和用戶:system_r 

        Type:指定數據類型,規則中定義何種進程類型訪問何種文件Target策略基於 type實現,多服務共用:public_content_t 

        Sensitivity:限制訪問的須要,由組織定義的分層安全級別,如unclassified, secret,top,secret, 一個對象有且只有一個sensitivity,分0-15級,s0 最低,Target策略默認使用s0

        Category:對於特定組織劃分不分層的分類,如FBI Secret,NSA secret, 一 個對象能夠有多個categroy, c0-c1023共1024個分類, Target 策略不使用 category,通常查看的時候不顯示這個元素

[root@localhost(cyn) ~]$ ps -Z          #查看進程安全上下文
LABEL                              PID TTY          TIME CMD
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1887 pts/0 00:00:02 bash
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 13495 pts/0 00:00:00 ps
[root@localhost(cyn) ~]$ ls -Z         #查看文件的安全上下文
-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 initial-setup-ks.cfg
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 magedu.repo
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 passwd

    指望(默認)上下文:存放在二進制的SELinux策略庫(映射目錄和指望安全上下文)中 

[root@centos6(cyn) ~]$ yum install policycoreutils-python   #centos7默認安裝,7如下的須要自行安裝

[root@localhost(cyn) ~]$ semanage fcontext -l|grep '/tmp/'  # 查看列出全部已設定的指望值
/tmp/.*                                            all files          <<None>>
/usr/tmp/.*                                        all files          <<None>>
/var/tmp/.*                                        all files          <<None>>
/var/tmp/abrt(/.*)?                                all files          system_u:object_r:abrt_var_cache_t:s0 
/tmp/\.X11-unix(/.*)?                              all files          system_u:object_r:user_tmp_t:s0 
/tmp/\.ICE-unix(/.*)?                              all files          system_u:object_r:user_tmp_t:s0 
/tmp/brltty\.log.*                                 regular file       system_u:object_r:brltty_log_t:s0 
/tmp/\.font-unix(/.*)?                             all files          system_u:object_r:user_fonts_t:s0 
/tmp/lost\+found/.*                                all files          <<None>>
/var/tmp/lost\+found/.*                            all files          <<None>>
                    ...


5、SELinux的設置

    1.SELinux的狀態

[root@localhost(cyn) ~]$ getenforce    #查看狀態
Enforcing
[root@localhost(cyn) ~]$ setenforce 0    #設置狀態
[root@localhost(cyn) ~]$ getenforce 
Permissive
[root@localhost(cyn) /]$ sestatus      #查看當前selinux的狀態
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

    enforcing: 強制,每一個受限的進程都必然受限 

    permissive: 容許,每一個受限的進程違規操做不會被禁止,但會被記錄於審計日誌 

    disabled: 禁用 

    要是想禁用selinux,可根據配置文件設置,以下

bash-4$ vim /boot/grub/grub.conf    #系統啓動加載內核karnel的時候編輯grun.conf文件
                                    #不寫selinux=0,系統則默認爲開啓,值爲1
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/vg_centos6-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
        root (hd0,0)        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/mapper/vg_centos6-lv_root rhgb quiet selinux=0
        initrd /initramfs-2.6.32-696.el6.x86_64.img  
        
[root@localhost(cyn) /]$ vim /etc/selinux/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                         #修改selinux開啓關閉,enforcing|disabled 
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

    2. SELinux的安全標籤

        a. 安全上下文恢復

[root@localhost(cyn) ~]$ ls -Z         
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 magedu.repo
[root@localhost(cyn) ~]$ cd /zuoye/
[root@localhost(cyn) zuoye]$ ls -Z magedu.repo 
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 magedu.repo
[root@localhost(cyn) zuoye]$ restorecon magedu.repo 
[root@localhost(cyn) zuoye]$ ls -Z magedu.repo 
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 magedu.repo

    用mv命令複製一個文件的時候會保留selinux,而後能夠利用restorcon恢復文件默認的安全上下文,支持-R

        b . 安全上下文的操做

[root@centos6(cyn) html]$ semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'     #增長
[root@centos6(cyn) html]$ semanage fcontext -d -t httpd_sys_rw_content_t '/var/www(/.*)?'     #刪除
[root@centos6(cyn) html]$ chcon -t public_content_rw_t /var/www                               #修改


6、SELinux的布爾值    

    布爾型規則:

        getsebool

        setsebool

    查看bool命令:

        getsebool [-a] [boolean]

        semanage  boolean  –l

        semanage  boolean  -l –C 查看修改過的布爾值

    設置bool值命令:

       setsebool  [-P] boolean value

       setsebool  [-P] Boolean=value


7、SELinux日誌管理

    yum  install setroubleshoot(重啓生效) 

    grep setroubleshoot /var/log/messages   將錯誤的信息寫入/var/log/message 

    sealert -l UUID 查看安全事件日誌說明 

    sealert -a /var/log/audit/audit.log 掃描並分析日誌


8、實例

    1.配置vsftpd,實現匿名上傳

[root@centos6(cyn) ~]$ yum -y install vsftpd          #安裝服務
[root@centos6(cyn) ~]$ vim /etc/vsftpd/vsftpd.conf   #修改配置文件

# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anon_upload_enable=YES                                      #能夠上傳
anon_mkdir_write_enable=YES                                 #開啓寫操做
[root@centos6(cyn) ~]$ service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]
[root@centos6(cyn) ~]$ setfacl -m u:ftp:rwx /var/ftppub/
[root@centos6(cyn) ~]$ chcon -t public_content_rw_t /var/ftp/pub    #修改上下文的type 
[root@centos6(cyn) ~]$ setsebool -P allow_ftpd_anon_write on        #設置布爾值
[root@centos6(cyn) ~]$  lftp ip#進入客戶端開始匿名上傳

    2.配置httpd開啓用戶家目錄的訪問

[root@centos6(cyn) ~]$ yum -y install httpd
[root@centos6(cyn) ~]$ vim /etc/httpd/conf/httpd.conf

#
# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.2/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>
# for a discussion of each configuration directive.
#
#
# Do NOT simply read the instructions in here without understanding
# what they do.  They're here only as hints or reminders.  If you are unsure
# consult the online docs. You have been warned.  
#  UserDir disabled                              #這一行註釋
UserDir public_html
[root@centos6(cyn) ~]$ service httpd restart               #從新啓動服務,配置生效
[root@centos6(cyn) ~]$ useradd testhttpd                     #建立用戶
[root@centos6(cyn) ~]$ mkdir /home/testhttpd/public_html
[root@centos6(cyn) ~]$ echo "testhttpd home" > /home/testhttpd/public_html/index.html
[root@centos6(cyn) ~]$ setfacl -m u:apache:x /home/testhttpd /   #設置指望值
[root@centos6(cyn) ~]$ setsebool -P httpd_enable_homedirs=1     #selinux的布爾值永久生效
                       瀏覽器輸入IP便可生效

    

    其餘的能夠查看幫助文檔

[root@centos6(cyn) ~]$  yum –y install selinux-policy-devel
[root@centos6(cyn) ~]$  yum –y install selinux-policy-doc
[root@centos6(cyn) ~]$  mandb | makewhatis 
[root@centos6(cyn) ~]$  man -k _selinux
相關文章
相關標籤/搜索