SELinux(Security Enhanced Linux)是美国国家安全局2000年发布的一种高级MAC(Mandatory Access Control,强制访问控制)机制,用来预防恶意入侵。SELinux在DAC(Discretionary Access Control,自主访问控制)的基础上实现了强制访问控制,比如读、写和执行权限。

SElinux有三种模式,分别是Enforcing, permissive, disabled。

1. Enforcing,强制模式。该模式下会基于policy规则拒绝某些访问。

2. Permissive宽容模式。

3. Disabled,该模式下会关闭SELinux。

修改模式的默认配置文件为/etc/selinux/config。

改变SELinux模式

setenforce 1 设置SELinux 成为enforcing模式

setenforce 0 设置SELinux 成为permissive模式

运行$ getenforce可以看到当前运行模式:

$ getenforce

运行下面的命令切换到Permissive 模式

$ setenforce 0

运行下面命令从permissive模式切换到enforcing模式

$ setenforce 1

如果想要关闭SELinux,可以通过配置文件修改。

$ vi /etc/selinux/config
SELINUX=disabled

配置Selinux

每个文件或进程用SELinux上下文环境上下文环境中含有SELinux用户、角色、类型等额外的信息。如果第一次开启SELinux,需要配置上下文环境和标签。配置修复label和上下文环境的过程叫做relabeling。在relabeling时,首先要切换到permissive模式。

$ vi /etc/selinux/config
SELINUX=permissive

模式切换到permissive时,会在目录/directory下创建一个隐藏的名为autorelabel的文件。

$ touch /.autorelabel

重启机器

$ init 6

注:选择用permissive模式而不是enforcing模式的原因是,enforcing模式下进行relabeling可能会造成系统奔溃。

Relabeling完成且系统重启后,可以更改到enforcing模式,并运行

$ setenforce 1

这样就成功地配置并开启SELinux了。

监控日志

为了确保SELinux的正常运行,需要对日志进行监控。SELinux的日志文件保存在/var/log/audit/audit.log,日志文件中有很多条记录,但是检查错误信息时不需要阅读全部日志,有一个简单的工具是audit2why,运行下面的命令

$ audit2why < /var/log/audit/audit.log

输出文件就是错误信息。如果没有错误,那么就不会有输出。

设定Selinux策略

SELinux策略是指导SELinux安全引擎的规则集。策略定义了特殊上下文环境下的规则集,下面是改变策略来允许对拒绝的服务的访问。

1. Booleans

Booleans允许运行时对策略进行改变而不需要写策略。这允许在不重新加载或者编译SELinux策略的同时,实现变化。

例1:

如果想要通过FTP分享用户home目录的读写权限,我们已经分享了该目录,但是尝试访问时看不到该目录。这是因为SELinux策略阻止了FTP守护进程在用户Home目录进行读写。我们需要对SELinux策略进行改变,这样FTP就可以访问home目录了。我们利用Booleans来完成这个功能。

$ semanage boolean –l

该命令会生成一系列可用的Booleans和对应的实时状态和描述。可以通过grep命令找出关于ftp的结果:

$ semanage boolean –l | grep ftp
ftp_home_dir        -> off      允许ftp在用户目录下进行读写状态

则是off的状态,我们用setsebool来开启

$ setsebool ftp_home_dir on

现在ftp守护进程就可以访问用户的Home目录了。

getsebool -a也可以获取可用的Booleans列表,但是不会显示Boolean的描述。

2. Labelling &Context

这是在服务器上实施SElinux策略的最常用方法。每个文件、文件夹、进程、端口都被SELinux context标记。

对于文件和文件夹,标签是以文件系统的扩展属性存储的,可以通过下面的命令进行查看

$ ls –Z /etc/httpd

对于进程和端口,kernel负责管理标签,同样地,可以通过下面的命令查看对应的标签:

$ ps –auxZ | grephttpd (for process)
$ netstat –anpZ | grephttpd (for port)

例2:

我们有一个web服务器,文件目录是/home/dan/html而不是默认的/var/www/html,这样SELinux就会认为违反了策略,这样就不能访问web页面。这是因为还没有设定与html文件相关的安全上下文环境。可以用下面的命令来检查html文件的默认安全上下文环境;

$ ls –lz /var/www/html
 -rw-r—r—. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/

上面就是我们得到的html文件的安全上下文环境httpd_sys_content_t。同时需要设定当前目录 安全上下文环境为–rw-r—r—. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/。

另一个检查文件或者目录的安全上下文环境的命令为:

$ semanage fcontext -l | grep ‘/var/www’

当我们找到正确的安全上下文环境时,semanage命令同样可以用来改变安全上下文环境。可以用下面的semanage命令来改变/home/dan/html的安全上下文环境:

$ semanage fcontext -a -t httpd_sys_content_t ‘/home/dan/html(/.*)?’
$ semanage fcontext -l | grep ‘/home/dan/html’
/home/dan/html(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
$ restorecon -Rv /home/dan/html

一旦semange操作改变了安全上下文环境,restorecon就会加载文件和目录的默认上下文环境。Web服务器就可以从/home/dan/html文件夹读取文件,同时,文件的安全上下文环境就变成http_sys_content_t了。

3. 创建本地策略

如果上面的访问不能生效,而且audit.log中出现错误消息。当这种情况出现的话,我们需要创建本地策略来解决那些错误信息。同时,可以用上面提到的audit2why查看错误信息。当获取错误后,就可以创建本地策略(Local policy)来解决这些错误。比如,我们获取了httpd或smbd错误,我们可以用grep查找错误信息,并创建安全策略。

$ grep httpd_t /var/log/audit/audit.log | audit2allow -M http_policy (for apache)
$ grep smbd_t /var/log/audit/audit.log | audit2allow -M smb_policy (for samba)

下面的http_policy和smb_policy是本地策略的名字。现在我们必须加载那些创建的本地策略到当前SELinux策略中,可以用semodule命令完成这个功能。

$ semodule –I http_policy.pp
$ semodule –I smb_policy.pp

这样本地策略就加载了,audit.log中也就不会有错误信息了。

SELinux初学者指南的更多相关文章

  1. Java多线程初学者指南系列教程

    转自:http://developer.51cto.com/art/200911/162925.htm 51cto 本系列来自NokiaGuy的“真的有外星人吗”博客,系列名称为<Java多线程 ...

  2. NHibernate初学者指南系列文章导航

    NHibernate初学者指南系列文章导航   前面的话 经过三个多周的时间,终于将这个系列完成了,谢谢大家的关注和支持,有很多不足之处还望大家包涵. 本系列参考的书籍为NHibernate 3 Be ...

  3. 【系列】Java多线程初学者指南(1):线程简介

    原文地址:http://www.blogjava.net/nokiaguy/archive/2009/nokiaguy/archive/2009/03/archive/2009/03/19/26075 ...

  4. 【翻译】nginx初学者指南

    nginx初学者指南 本文翻译自nginx官方网站:http://nginx.org/en/docs/beginners_guide.html#control 该指南会对nginx做一个简要的介绍,同 ...

  5. FreeBSD上编写x86 Shellcode初学者指南

    FreeBSD上编写x86 Shellcode初学者指南 来源 https://www.4hou.com/binary/14375.html 介绍 本教程的目的是帮助你熟悉如何在FreeBSD操作系统 ...

  6. 《SQL初学者指南》——第1章 关系型数据库和SQL

    第1章 关系型数据库和SQL SQL初学者指南在本章中,我们将介绍一些背景知识,以便于你能够很快地上手,能在后续的章节中编写SQL语句.本章有两个主题.首先是对本书所涉及到的数据库做一个概述,并且介绍 ...

  7. Python编程初学者指南|百度网盘免费下载|Python新手入门资料

    Python编程初学者指南|百度网盘免费下载 提取码:9ozx 目录  · · · · · · 第1章 启程:Game Over程序1.1 剖析Game Over程序1.2 Python简介1.2.1 ...

  8. 《Python编程初学者指南》高清PDF版|百度网盘免费下载|Python基础

    <Python编程初学者指南>|百度网盘免费下载| 提取码:03b1 内容简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python可以用于很多的领域,从科学计 ...

  9. Python编程初学者指南PDF高清电子书免费下载|百度云盘

    百度云盘:Python编程初学者指南PDF高清电子书免费下载 提取码:bftd 内容简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python可以用于很多的领域,从科学计算 ...

随机推荐

  1. pipenv

    一. 1. 使用pip安装pipenv及其相关依赖 pip install pipenv 2. 将目录更改为包含你的Python项目的文件夹,并启动Pipenv cd my_project pipen ...

  2. DZ拿shell总结

    今天碰到一个dz的站,好久没拿了 ,拿下shell觉得应该总结一下 Uc_server默认密码 其实有了UC_SERVER就是有了网站的全部权限了,有了UC_SERVER你可以重置管理员密码 可以进后 ...

  3. 翻译-QPKG开发工具快速开始指南

    QPKG开发工具快速开始指南 指导你编译你自己的QPKG软件包 目录 什么是QDK 下载QDK 安装QDK 编译你自己的QPKG软件包 搭建QPKG编译环境 配置QPKG 定制QPKG程序 向QPKG ...

  4. Xpath提取一个标签里的所有文本

    content = etree.HTML(text) h = content.xpath('//h1') h1 = h[0].xpath('string(.)').strip()

  5. 面经:C++篇(持续更新)

    一. 左值和右值 L-value中的L指的是Location,表示可寻址.Avalue (computer science)that has an address. R-value中的R指的是Read ...

  6. 数论——算数基本定理 - HDU 4497 GCD and LCM

    GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  7. jquery mobile changepage的三种传参方法介绍

    本来觉得changePage 那么多option,传几个参数应该没问题结果翻遍国内外网站,基本方法只有三种 1,显性传参,就是利用url这个地址把参数带上,然后到changepage后的新页面,用函数 ...

  8. 【luogu P2827 蚯蚓】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...

  9. 关于iPad上模态显示视图中的UITextField,UITextView在输入完成后无法回收键盘的问题解决。

    在iPad开发过程中遇到一个问题,UITextField 存在由UIModalPresentationFormSheet 弹出的带导航条的视图控制器中时,调用 resignFirstResponder ...

  10. Java I/O系列(二)ByteArrayInputStream与ByteArrayOutputStream源码分析及理解

    1. ByteArrayInputStream 定义 继承了InputStream,数据源是内置的byte数组buf,那read ()方法的使命(读取一个个字节出来),在ByteArrayInputS ...