selinux简介

  selinux(Security-Enhanced Linux)是一个内核中实践的强制访问控制(MAC)安全性机制,目的在于明确的指明某个进程可以访问哪些类型的资源。开启selinux后,内核在执行系统调用前会询问 SELinux 是否获得了执行操作的授权


一、DAC(自主式访问控制)的缺陷

  DAC(自主式访问控制,linux的标准访问控制方式)是根据程序的拥有者/属组与文件资源的 rwx 权限来决定有无存取的能力,它的缺点就是不能识别拥有者和程序之间的区别。如果程序拥有者被授权访问,则程序被授权访问。比如,httpd进程的用户身份是apache,apache用户对/etc/passwd具有读权限,这样,如果某个恶意用户劫持了httpd进程,意即取得了apache用户的权限,就能读取/etc/passwd获知系统上已存在的用户。如果恶意用户劫持的进程具有root用户的权限,那就更可怕了。


二、selinux的运行机制

wKioL1bO82ribfSeAAEgBU9j7Q4885.png

  selinux遵从最小权限理念,使用MAC强制访问控制)实现访问控制,MAC可以针对特定的程序与特定的文件资源来进行权限的控管,控制的主体是程序而不再是用户,目标则是该程序能否访问的文件资源。

  1、selinux中的有关概念

    主体(subject):程序

    目标(object):资源。可以是files、directories、processes、special files or various types(块设备文件、字符设备、FIFO、socket)、filesystems、links、file descriptors

    策略(policy):

       由于程序与文件数量太过庞大,selinux会依据某些服务制订基本的访问安全策略。这些策略内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的访问与否。

       策略模型:

         strict:完整的 SELinux 限制,限制很严格

         targeted:针对网络服务限制较多,针对本机限制较少,默认策略

       selinux能够把程序的某些敏感功能做成布尔型规则,方便用户控制

    安全性标签

       selinux会给每个进程和文件资源打上一层安全性标签

         identity:role:type  如示例中的 system_u:object_r:httpd_sys_content_t:s0

[root@node1 ~]# ls -dZ /var/www/html   #开启selinux后,可查看安全性程序和资源的安全性标签
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
[root@node1 ~]# ps auxZ | grep 'httpd'
...
unconfined_u:system_r:httpd_t:s0 apache   2069  0.0  0.2 175708  2464 ?        S    19:33   0:00 /usr/sbin/httpd
...
[root@node1 ~]# ls -Z /etc/passwd
-rw-r--r--. root root system_u:object_r:etc_t:s0       /etc/passwd

         ①identity:身份识别

         ②role:角色,由此段可知该数据是程序还是文件资源;

            object_r:表示文件资源

            system_r:表示程序

         ③type:类型,此段最重要。

            在文件资源上称为类型(type)

            在程序上称为域(domain)

          主体(程序)能否访问目标(文件)取就决于双方的安全性标签中的type是否匹配例如示例中,httpd进程的域httpd_t与/var/www/html的类型httpd_sys_content_t是匹配的,而与/etc/passwd文件所属的类型etc_t不匹配,所有,虽然apache用户具有对passwd的读取权限,httpd进程仍无法读取该文件。

 2、selinux的组件:内核级代码、selinux的共享库、策略、工具程序


   注意:selinux所使用的MAC访问控制机制并不是取代标准的DAC访问控制机制,而是与其结合使用。故程序只有同时通过二者的检验,才能访问资源

          

三、selinux的配置

  1、getenforce:查看selinux是否开启   

     disabled:禁用

     permissive:警告,不会实际拒绝违反策略的行为,但会作记录

     enforcing:强制,表示selinux运行

  2、启用SELlinux的方法:

   ①修改配置文件/etc/selinux/config(或/etc/sysconfig/selinux)

     如果由enforcing或permissive改成disabled,或由disabled改成另外两种模式,必须重启系统

   ②setenforce 0|1  #让SELinux模式在permissive和enforcing之间切换的方法,0表示permissive,1表示enforcing

  3、sestatus:显示selinux的状态

    选项:

      -v:显示/etc/sestatus文件中的程序与文件的安全性标签内容

      -b:显示当前策略的规则的布尔值

  4、ls -Z /path/to/somefile:查看安全性标签

  5、chcon:修改对象的安全性标签

    用法:chcon [option]... 程序/资源

    选项:

       -t TYPE:修改类型

       -R:递归修改

       --reference=参考文件:参考指定文件修改

    例如:chcon -R -t httpd_sys_content_t /web/htdocs

  6、restorecon:恢复文件的默认安全性标签

      -R:递归处理

  7、getsebool [-a] [布尔条款]:查询布尔规则的布尔值

      例如 getsebool -a | grep 'ftp'

    setsebool [-P] 布林条款=[0|1]:设置布尔规则的布尔值

      -P:直接写入策略库

      例如 setbool allow_ftpd_anon_write 1

         setbool allow_ftpd_full_access 1

[root@node1 ~]# getenforce
Disabled
[root@node1 ~]# 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
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@node1 ~]# shutdown -r now   #要启用selinux需要重启系统
...
[root@node1 ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted
[root@node1 ~]# getsebool -a | grep 'ftp'   #查看与ftp服务相关的布尔规则
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_fusefs --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_use_cifs --> off
tftp_use_nfs --> off
#若要允许匿名用户上传文件至ftp服务器,需开启如下两项
[root@node1 ~]# setbool allow_ftpd_anon_write 1
[root@node1 ~]# setbool allow_ftpd_full_access 1
[root@node1 ~]# ls -dZ /var/www/html   #查看指定目录的安全性标签
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

[root@node1 ~]# mkdir -p /web/htdocs
[root@node1 ~]# cd /web/htdocs
[root@node1 htdocs]# vim /web/htdocs/index.html

hello,how are you ?
[root@node1 htdocs]# ls -dZ ./
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 ./
[root@node1 htdocs]# ls -Z index.html 
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html
[root@node1 htdocs]# vim /etc/httpd/conf/httpd.conf
...
DocumentRoot "/web/htdocs"   #修改httpd的站点根目录
...
<Directory "/web/htdocs">
...
[root@node1 htdocs]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bac
[root@node1 htdocs]# service httpd reload
Reloading httpd:

  显示无法访问,因httpd进程的域httpd_t对类型default_t没有访问权限

wKiom1bPHYjB6m11AACj_2c9sTU619.png 

[root@node1 htdocs]# tail -1 /var/log/httpd/error_log 
[Thu Feb 25 23:23:07 2016] [error] [client 192.168.30.1] (13)Permission denied: access to /index.html denied
[root@node1 htdocs]# chcon -R --reference=/var/www/html ./   #修改新站点根目录及其下所有文件的安全性标签
[root@node1 htdocs]# ls -dZ ./
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 ./
[root@node1 htdocs]# ls -Z index.html 
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html

wKiom1bPHgDBoJHpAAFCAVuYQQg647.png     


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章