SELinux:Secure Enhanced Linux,是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Courporation)开发的LInux的一个强制控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后继承在内核中。

访问控制类别:

DAC:Discretionary Access Control 自由访问控制

MAC:Mandatory Access Control 强制访问控制

DAC和MAC的特点:

DAC环境下进程是无束缚的

MAC环境下策略的规则决定控制的严格程度

MAC环境下进程可以被限定的

策略被用来定义被限定的进程能够使用那些资源(文件和端口)

默认情况下,没有被明确允许的行为将被拒绝

SElinux安全上下文工作类型:

strict:centos5,每个进程都受到selinux的控制

targeted:用来保护常见的网络服务,仅有限进程受到 selinux控制,

只监控容易被入侵的进程,rhel4只保护13个服务,rhel5保护88个服务

minimum:centos7,修改过的targeted,只对选择的网络服务。

mls:提供MLS(多级安全)机制的安全性

minimum和mls稳定信不足,未加以应用

为什么会用SElinux

传统的 Linux中一切皆文件,由用户、组、权限控制访问。而在SELinux中一切皆对象(object),由存放在inde表的扩展属性域的安全元素所控制其访问。

安全上下文基本格式说明

所有的文件和端口资源和进程都具备安全标签:安全上下文(security context)组成元素:

user:role:type:sesitivity:category,如

user_u:object_r:tmp_t:s0:c0

实际上下文存放在文件系统中,进程、文件、已经用户等都有相应的安全上下文:

例子:

#查看指定文件的安全上下文
ls  -Z

#查看进程的安全上下文件
ps  Z

#查看用户安全上下文

期望(默认)上下文:

存放在二进制的SELinux策略库(映射目录和期望安全上下文)中:

使用命令

semanage  fcontext  -l   #
可以查看所有默认策略

SELinux策略:

对象(object):所有可以读取的对象,包括文件、目录和进程,端口等

主体:进程称为主体(subject)

SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签。domain标签能够执行的操作由安全策略里定义。

当一个subject试图访问一个object,Kernel中的策略执行服务器将检查AVC(访问矢量缓存Access Vector Cache),在AVC中,subject和object的权限被缓存(cached),查找“应用+文件”的安全环境。然后根据查询结果运行或拒绝访问。

安全策略:定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一项对象是允许还是拒绝的,并且定义了那种行为是运行或拒绝。

设置SELinux模式及开关使用命令:getnforce status setenforce

getenforce:#获取selinux的当前状态

sestatus:  #查看selinux完整状态

setenforce  0|1#开启或关闭

0:设置为permissive

1:设置为enforcing

配置文件:

/boot/grub/grub.conf在对应的kernel内核参数后面追加

selinux=1 (启用)   selinux=0(禁用)

/etc/sysconfig/selinux

/etc/selinux/config

SELINUX变量有3中参数:

SELINUX={disabled|enforcing|permissive}

基本使用实例:

#关闭当前selinux功能

[root@localhost ~]# setenforce 0

#查看当前selinux状态

[root@localhost ~]# getenforce 
Permissive

#启用当前selinux功能

[root@localhost ~]# setenforce 1

#再次查看当前selinux功能

[root@localhost ~]# getenforce

解析:这里的设置都是立即生效,使用此命令只能开启或关闭,并不能禁用 selinux。

#查看目前系统完整的selinux状态

[root@localhost ~]# sestatus

解析:因为selinux是需要内核或内核模块来支持的,那么也就需要对应的配置文件来提供读取,这里说明了其主配置目录为/etc/selinux,而当前状态为enabled启用状态,也就是说selinux还是可以通过命令来设置是否开启。而当前模式表示其selinux的具体管理方式。

enforcing: 表示完全安装selinux规则在处理。

permissive:表示只是根据selinux规则来进行警告,而不进行权限处理,但会记录。

修改文件的SELinux标签的命令:chcon  restorecon

chcon 命令

chcon - change file SELinux security context

更改文件的selinux安全上下文件

选项与用法:

chcon [option]...  CONTXT  /path/to/file...  #直接对指定的文件写完整的安全上下文字段

chcon [option]...  [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...  #根据上下文类型更改

chcon [option]...  --reference=RFILE  FILE....  #参考RFILE的上下文修改FILE的上下文

-R :如果是目录,将同时递归设置该目录下所有文件

restorecon 命令

restorecon - restore file(s) default SELinux security contexts.

恢复文件或目录默认的SELinux安全上下文

选项与用法:

restorencon  [option]  /path/to/somewhere

-R:递归恢复处理

SELinux规则管理工具命令:semanage

semanage - SELinux Policy Management tool

semange 命令  注:此命令来自policycoreutils-python  RPM包

默认安全文件规则的查询和修改:semanage  

semanage  命令

semanage fcontext [-S store] -{a|d|m|l|n|D} [-frstN] file_spec

用法与实例:

查询信息

#查看默认所有安全上下文列表

semanage fcontext  -l

#添加安全上下文

semanage fcontext -a -t httpd_sys_content_t ‘/testdir(/.*)?’

#删除安全上下文

semanage fcontext -d -t httpd_sys_content_t ‘/testdir(/,*)?’

端口标签的设置

#查询端口标签

semanage port -l

#添加端口

semanage port -a -t port_label -p tcp|udp POST 例如:

semanage port -a -t http_port_t -p tcp 9527

#删除端口

semanage port -d -t port_label -p tcp|udp POST 例如:

semanage port -d -t http_port -t -p tcp 9527

#修改现有端口为新标签

semanage port -m -t port_label -p tcp|udp POST 例如:

semanage port -m -t http_port_t -p tcp 9527

布尔值规则命令:getsebool  setsebool

SELinux布尔值设置

查看bool命令:

getsebool  [-a]  [boolean]

semanage boolean  -l

semanage boolean  -l  -C  #查看修改过的布尔值

设置bool值命令:

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

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

SELinux日志管理:setrublesshhoot 命令

yum  install  setrublesshooot*  (重启后生效)

setrub会将错误信息写入/var/log/message,使用下面方式查看:

grep  ‘setroubleshoot’  /var/log/messages

sealert  -l  UUID

查看安全时间日志说明

sealert  -a  /var/log/audit/audit.log

扫描并分析日志

获取SELinux的相关帮助信息

yum -y install selinux-policy-devel  #centos7下

yum -y install selinux-policy-doc   #centos6下

mandb | makewhatis  #更新man文档数据库

man  -k  _selinux   #列出selinux关键字相关文档

实战案例:

1、启用SELinx策略并安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,使网站可访问。

#使用yum原安装本地ISO镜像中httpd即可

[root@mzf ~]# yum install httpd -y

#修改配置主配置文件,将DocumentRoot 对应的路径和Direcotry标标签目录改为/webbsite

[root@mzf ~]# vim /etc/httpd/conf/httpd.conf

注意:这两项都要修改,才会完整生效。

#查看修改后的结果

[root@mzf ~]# grep ‘[[:space:]]*DocumentRoot.*\".*\"‘ /etc/httpd/conf/httpd.conf 
DocumentRoot "/website"

#新建/website目录并给其目录添加文件标签规则

[root@mzf ~]# [ ! -d ‘/website‘ ] && mkdir /website

#查看原首页目录/var/www/html 的文件规则类型

[root@mzf ~]# ls -dZ /var/www/html/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

#新建index.html文件内容如下

[root@mzf website]# cat index.html 
<html>
<head>
<title>Welcome to Website directry!!!</title>
</head>
<body><div><ul>
 <li>Welcome to Website directry!!!</li>
</ul></div></body>
</html>

#查看原有的/var/www目录下的默认规则

[root@mzf website]# semanage fcontext -l | grep --exclude=‘.*?‘ ‘/var/www(/.*)?‘
/var/www(/.*)?          all files          system_u:object_r:httpd_sys_content_t:s0

#给/website及其下文件设置文件规则类型,3种方法

(1)执行设置特定值,使用chcon命令

[root@mzf website]# chcon -t httpd_sys_content_t -R /website/

(2)参考/var/www/html目录的规则来设定

[root@mzf website]# chcon -R --reference=‘/var/www/html/‘ /website/

(3)执行给目录添加规则,然后对目录进行递归默认规则还原

[root@mzf website]# semanage fcontext -l | grep -F ‘/var/www(/.*)?‘ | cut -d‘:‘ -f3
httpd_sys_content_t
[root@mzf website]# semanage fcontext -a -t httpd_sys_content_t ‘/website(/.*)?‘
[root@mzf website]# semanage fcontext -l | grep -F ‘/website(/.*)?‘ | cut -d‘:‘ -f3
httpd_sys_content_t
[root@mzf website]# restorecon -R /website/
[root@mzf website]# ls -aZ --ignore=‘..‘ /website
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html

解析:上述三种方法中,前两种如果执行了restorecon还原默认,而默认selinux规则里没有预设,那么会还原其它的默认值,而第三者方法采用直接在selinux规则中对此目录添加预设规则,这样无论怎么修改,只要使用restorecon就可以还原回来。

#启用selinux功能

[root@mzf website]# setenforce  1

#重启httpd服务

[root@mzf website]# service httpd restart

#使用另一条主机使用links工具访问其主页

[root@mageedu ~]# links http://192.168.20.136

解析:显示出/website新建的index.html文件内容表示成功。

2、修改上述网站的http端口为9527,增加SELinux端口标签,使网站可访问

#修改httpd服务配置文件中Listen监听端口

[root@mzf ~]# sed -i ‘s/^\([[:space:]]*Listen\)[[:space:]]\+[0-9]\+/\1 9527/‘ /etc/httpd/conf/httpd.conf 
[root@mzf ~]# sed -n ‘/^[[:space:]]*Listen[[:space:]]\+[0-9]\+/p‘ /etc/httpd/conf/httpd.conf 
Listen 9527

#因为上面已经重启了服务,这次使用发送SIGHUP信号来重新调用httpd服务

[root@mzf ~]# pkill -SIGHUP ‘httpd‘

#查看原来的httpd默认监听端口80的端口标签类型

[root@mzf ~]# semanage port -l | grep ‘\<80\>‘
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

#添加9527端口进入此标签类型

[root@mzf ~]# semanage port -a -t http_port_t -p tcp 9527

#查看9527端口是否在此列表

[root@mzf ~]# semanage port -l | grep ‘\<9527\>‘
http_port_t                    tcp      9527, 80, 81, 443, 488, 8008, 8009, 8443, 9000

#修改一下/website/index.html的内容

[root@mzf ~]# cat /website/index.html 
<html>
<head>
<title>Welcome to Website directry!!!</title>
</head>
<body><div><ul>
 <li>This is next two!!!</li>
</ul></div></body>
</html>

#使用其它主机通过links统计进行访问9527端口

[root@mageedu ~]# links http://192.168.20.136:9527

解析:这里显示和上面修改的body标签里的内容一样,说明已经生效。

3、启用相关的SElinux布尔值,使上述网站的用户student的家目录可通过http访问

#添加httpd.conf文件的用户目录访问配置

说明:找到<If Modulemod_userdir.c>标签在里面注释掉UserDir disabled此行,然后添加一个UserDir public_html行,表示在使用用户加目录下有个此文件会被访问。

#在student 用户家目录新建public_html目录

[root@mzf ~]# cd /home/student/
[root@mzf student]# mkdir -m 711  public_html

#拷贝/website/index.html到此目录下并修改

[root@mzf student]# cp /website/index.html ./public_html/

#修改index.html文件的li标签里的内容,随便改,为了区别显示

[root@mzf student]# grep ‘<li.*/li>‘ ./public_html/index.html 
 <li>This is stuent home</li>

#重新给httpd发送SIG信号

[root@mzf student]# killall -HUP -r ‘httpd‘

#再次访问links

解析:这是因为没有开启相关的httpd用户家目录布尔值导致的,于是修改其boolean值。

#查看httpd的用户目录读取,off为关闭,及提供此功能

[root@mzf student]# getsebool -a | grep ‘http.*user‘
httpd_read_user_content --> off

#修改为on,表示启用访问用户家目录

[root@mzf student]# setsebool httpd_read_user_content on

#再次访问

解析:这就成功了,在目录本身对其它人有相应的执行权限以外,还是要添加一个boolean。

 

Linux之SElinux安全上下文件(1)的更多相关文章

  1. Windows Linux 之间rsync同步CODE文件

    Windows Linux 之间rsync同步CODE文件 一.环境Windows:OS:Microsoft Windows Web Server 2008 SP1IP:192.168.88.197 ...

  2. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

  3. Linux下selinux简单梳理

    在linux环境下执行某些程序时,偶尔会遇到来一个关于selinux的强制模式不可执行的情况,这种情况下需要关闭selinux或者将enforcing改为permissive模式后才能进行执行.sel ...

  4. Linux中/proc目录下文件详解(转贴)

      转载:http://www.sudu.cn/info/index.php?op=article&id=302529   Linux中/proc目录下文件详解(一) 声明:可以自由转载本文, ...

  5. Linux学习-SELinux 初探

    什么是 SELinux 什么是 SELinux 呢?其实他是『 Security Enhanced Linux 』的缩写,字面上的意义就是安全强化的 Linux 之意! 当初设计的目标:避免资源的误用 ...

  6. linux初学者-SElinux篇

    linux初学者-SElinux篇 SElinux是强制访问控制(MAC)安全系统,是linux历史上最杰出的新安全系统.对于linux安全模块来说,SElinux的功能是最全面的,测试也是最充分的, ...

  7. Linux CentOS安装搭建FTP文件服务

    本文环境:centos7,IP=192.168.1.11 1.安装vsftpd和默认配置启动 1.1 安装vsftpd yum install -y vsftpd 1.2 启动vsftpd syste ...

  8. Linux之SElinux服务详解

    SElinux -> Linux安全访问策略 -> 强制性 (security安全) 是Linux操作系统的一个额外的强制性的安全访问规则.用于确定哪个进程可以访问哪些文件.目录和端口的一 ...

  9. linux几种快速清空文件内容的方法

    linux几种快速清空文件内容的方法 几种快速清空文件内容的方法: $ : > filename #其中的 : 是一个占位符, 不产生任何输出. $ > filename $ echo & ...

随机推荐

  1. Java 时间、字符串

    Date类     类似C#的DateTime类   String类     类似C#的Srting类.大多方法相同,其中valueOF()是C#中实例版本的toString()   StringBu ...

  2. SSM_CRUD新手练习(2)配置文件

    配置之前现需要引入依赖的jar包: *Spring *SpringMvc *Mybatis *数据库连接池,驱动包 *其他(jstl,Servlet ,Junit..) 1.poxm.xml < ...

  3. noip第25课作业

    1.   求一个有向图所有顶点入度的和 输入有向图的顶点个数,边数以及各顶点之间的关联情况,要求求出这个有向图的所有顶点入度的总和. [输入格式] 第1行:2个空格分开的整数n(2<=n< ...

  4. 三种初步简易的方法求解数值问题 of C++

    1. “二分法解方程” 在二分法中,从区间[a,b]开始,用函数值f(a)与f(b)拥有相反的符号.如果f在这个区间连续,则f的图像至少在x=a,x=b之间穿越x轴一次,因此方程f(x)=0在[a,b ...

  5. spark图解

    导语 spark 已经成为广告.报表以及推荐系统等大数据计算场景中首选系统,因效率高,易用以及通用性越来越得到大家的青睐,我自己最近半年在接触spark以及spark streaming之后,对spa ...

  6. ASP.NET Web API 框架研究 Controller创建过程与消息处理管道

    现在我们从代码角度来看下,从消息处理管道末尾是怎么创建出Controller实例的.消息处理管道末端是一个叫HttpRoutingDispatcher的处理器,其内部完成路由后 ,会把消息派送给其内部 ...

  7. linux命令 find的应用

    1.列出当前目录及子目录下所有文件和文件夹 2.在 /home目录下查找以 “.txt”结尾的文件名 3.在当前目录下查找所有以“.txt”结尾的文件 4基于目录深度搜索(向下最大深度限制为3) 5. ...

  8. [ASE][Daily Scrum]11.11

    各位1111快乐,不知道大家的卡上还剩多少钱啊~~~ TCP server目前遇到一点小瓶颈,不过server的两个人承诺说明天就可以搞定,给他们加油!~! 今天的plan~ View Shilin ...

  9. datetime & time

    python有两个和时间相关的模块,datetime和time datetime datetime模块下有四个类 date     日期相关的 time          时间相关的 datetime ...

  10. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...