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. 第十四个目标 (fzu)

    http://acm.fzu.edu.cn/contest/problem.php?cid=151&sortid=8 Problem Description 目暮警官.妃英里.阿笠博士等人接连 ...

  2. CentOS 网络设置修改 2

    一.CentOS 修改IP地址 修改对应网卡的IP地址的配置文件# vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改以下内容 DEVICE=eth0 #描 ...

  3. kepware http接口 c语言 python

    读取某变量的值(http.client import http.client conn = http.client.HTTPConnection("127,0,0,1") head ...

  4. 关于jdbc连接MySQL数据问题

    1.解压MySQL后配置环境变量 MYSQL_HOME:D:\win7\Program Files(x86)\mysql-5.6.21-win32(mysql根目录) 添加path:%MYSQL_HO ...

  5. hdu 4961 数论?

    http://acm.hdu.edu.cn/showproblem.php?pid=4961 给定ai数组; 构造bi, k=max(j | 0<j<i,a j%ai=0), bi=ak; ...

  6. Winform相关

    (1)C# WinForm程序退出的方法 1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Applica ...

  7. Spring Framework 4.3.22.RELEASE Reference文档目录

    <Spring Framework Reference Documentation 4.3.22.RELEASE> https://docs.spring.io/spring/docs/4 ...

  8. [JavaScript] iframe更改了src后,父页面history.back只能后退iframe而不能使自己后退解决办法

    浏览器的机制如此,在iframe导航变化后手动点击浏览器的后退按钮也依然只是后退iframe中的导航. 有一种解决方案是不要修改iframe.src,而是删除旧iframe元素,新建一个iframe元 ...

  9. iOS-贝塞尔连续曲线

    一个曲线 UIColor *color = [UIColor redColor]; [color set]; UIBezierPath *path = [UIBezierPath bezierPath ...

  10. 原子操作--sync/atomic的用法

    golang 通过sync/atomic库来支持cpu和操作系统级别的原子操作.但是对要操作类型有如下要求 int32, int64,uint32, uint64,uintptr,unsafe包中的P ...