centos selinux学习记录
SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。
强制访问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力。所以它不是网络防火墙或 ACL 的替代品,在用途上也不重复。
举例来说,系统上的 Apache 被发现存在一个漏洞,使得某远程用户可以访问系统上的敏感文件(比如/etc/passwd
来获得系统已存在用户),而修复该安全漏洞的 Apache 更新补丁尚未释出。此时 SELinux 可以起到弥补该漏洞的缓和方案。因为 /etc/passwd 不具有 Apache 的访问标签,所以 Apache 对于 /etc/passwd
的访问会被 SELinux 阻止。
相比其他强制性访问控制系统,SELinux 有如下优势:
- 控制策略是可查询而非程序不可见的。
- 可以热更改策略而无需重启或者停止服务。
- 可以从进程初始化、继承和程序执行三个方面通过策略进行控制。
- 控制范围覆盖文件系统、目录、文件、文件启动描述符、端口、消息接口和网络接口。
selinux有三种状态
enforcing 在强制模式下的SELinux将强制执行在Linux系统上的政策,并确保用户和进程的任何未经授权的访问尝试将被拒绝。 访问拒绝也写入相关的日志文件
permissive 许可模式类似于半启用状态。 SELinux不会在允许模式下应用其策略,因此不会拒绝任何访问。 但是,任何策略违规仍然记录在审核日志中。 这是一个伟大的方式来测试SELinux之前强制它。
disabled 禁用模式是不言自明的 – 系统将不会运行增强的安全性。
获取selinux的状态
sestatus
设置selinux状态
setenforce 0 将selinux设置为permissive
setenforce 1将selinux设置为enforcing
需要说明的是如果是disabled是无法使用setenforce的,因为是禁用状态。
可以修改selinux为disabled,但是不安全
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=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
设置完需要重启才能生效
selinux策略
selinux是控制程序是否能够读取档案资源
查看安全性本文(secruity context)
ls -Z查看当前目录下的安全性本文
[root@www ~]# ls -Z
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 bin
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog
# 上述下划线的部分,就是安全性本文的內容!
分别是identify身份识别,role角色,type类型
常见的身份识别
root 表示root账号身份
system_u 表示系统程序方面的识别,通常就是程序
user_u 代表某个一般使用者账号相关身份
角色
object_r 代表档案或目录等档案资源
system_r 代表程序
类型
type
domain
修改安全性本文
chcon
恢复安全性本文
restorecon
主要有seinfo命令、sesearch命令、getsebool命令、setsebool命令、semanage命令。
seinfo和sesearch都是用来查询的
使用seinfo命令可以查询SELinux的策略提供多少相关规则,如果查到的相关类型或者布尔值,想要知道详细规则时,使用sesearch命令查询。
getsebool
getsebool命令是用来查询SElinux策略内各项规则的布尔值
setsebool
setsebool命令是用来修改SElinux策略内各项规则的布尔值
semanage
semanage命令是用来查询与修改SELinux默认目录的安全上下文
[root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l
[root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec
選項與參數:
fcontext :主要用在安全性本文方面的用途, -l 為查詢的意思;
-a :增加的意思,你可以增加一些目錄的預設安全性本文類型設定;
-m :修改的意思;
-d :刪除的意思。
sestatus用来查看当前的selinux状态
排除 SELinux 疑难
你终有一天会被 SELinux 阻止你存取所需的东西,而且要解决这个问题。SELinux 拒绝某个档案、进程或资源被存取的基要原因有数个:
- 一个被错误标签的档案。
- 一个进程在错误的 SELinux 安全性脉络下运行。
- 政策出错。某个进程要存取一个在编写政策时意料不到的档案,并产生错误信息。
- 一个入侵的企图。
头三个情况我们可以处理,而发出警报及通告正正是第四个情况的预期表现。
日志档是排除任何疑难的关键,而 SELinux 亦不例外。SELinux 预设会透过 Linux 审计系统 auditd 将日志写在 /var/log/audit/audit.log 内,而该务服预设为启用的。假若 auditd 长驻程式并未运行,信息将会被写进 /var/log/messages。SELinux 的日志都以 AVC 这个关键字作标签,让 grep 等程式可轻易地把它们从其它信息中过滤出来。
由 CentOS 5 起,你可以用 SELinux 排除疑难工具协助你分析日志档,将它们转换为供人阅读的格式。这个工具包含一个以可读格式显示信息及解决方案的图像介面、一个桌面通报图示、与及一个长驻进程,setroubleshootd,它负责查阅新的 SELinux AVC 警告并传送至通报图示。不运行 X 伺服器的用户可设置以电邮通报。SELinux 排除疑难工具是由 setroubleshoot 套件所提供的。这个工具可以从 X 视窗图像管理员的「系统」选单或从指令行启动:
sealert -b
不运行 X 伺服器的人可以透过指令行产生供人阅读的报告:
sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt
总结一下
selinux是用来对进程权限进行限制的。限制某些进程只能读取某些文件。
一般我们如果通过setenforce 0吧selinux设置为警告模式之后,程序正常运行了。那就说明是selinux在捣乱。通常的做法是直接disable禁用掉selinux,但是这样不安全。
总结下一些简单的解决方案
一般来说都是因为权限的问题,很可能是进程没有权限读取文件。
以apache为例
我们检视 Apache 的主页,/var/www/html/index.html 的 SELinux 安全性脉络来看看它们如何运作:
$ ls -Z /var/www/html/index.html -rw-r--r-- username username system_u:object_r:httpd_sys_content_t /var/www/html/index.html
/var/www/html/index.html 类别是httpd_sys_content_t
现在来看看apache进程的selinux安全性脉络
$ ps axZ | grep httpd
system_u:system_r:httpd_t 3234 ? Ss 0:00 /usr/sbin/httpd
从类别栏我们看出 Apache 在 httpd_t 这个类别区域内运行
最后,让我们看看位于我们的主目录内的一个档案的安全性脉络:
$ ls -Z /home/username/myfile.txt
-rw-r--r-- username username user_u:object_r:user_home_t /home/username/myfile.txt
它的类别是 user_home_t,这是位于每个户主目录内的档案的预设类别。
唯有相似的类别才可互相存取,因此以 httpd_t 运行的 Apache 可以读取拥有 httpd_sys_content_t 类别的 /var/www/html/index.html。由于 Apache 在 httpd_t 这个区域内运行但不属 username 这个用户,纵使 /home/username/myfile.txt 可供任何人读取,Apache 却无法存取该档案,因为它的 SELinux 安全性脉络并不是 httpd_t 类别。倘若 Apache 被人占用,又假设它仍未取得更改 SELinux 标签至另一个脉络的 root 权限,它将会无法启动 httpd_t 区域外的进程(藉此防止权限升级),或存取与 httpd_t 区域不相关的档案。
所以如果要让httpd能读取myfile.txt文件
可以使用semanage命令
semanage -a -t httpd_sys_content_t /home/username/myfile.txt
将myfile.txt的安全性文本改为httpd_sys_content_t,这样就可以了。
restorecon 这个指令可以用来还原为档案预设的安全性脉络
restorecon -v /var/www/html/index.html
一般修改安全性文本就可以解决问题了,但是如果不行的话可以查看selinux的日志,里面会提示你应该怎么做。如何查看日志上面已经提到了
cat /var/log/messages
参考自https://wiki.centos.org/zh/HowTos/SELinux
centos selinux学习记录的更多相关文章
- SElinux学习记录
1.SELinux:是一种基于域类型模型的强制访问控制安全系统,由NSA编写设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SE Linux补丁 查看Selinux: ps -Z #查看S ...
- CentOS 7学习笔记(二)之Nginx安装
说明: 1.这篇学习记录的目的是如何在CentOS 7上面安装Nginx,包括两种安装方式,yum源安装和源代码编译安装: 2.CentOS 7初学者,某些观点带有猜测之意,文中不足之处,还请批评指正 ...
- CentOS 7 学习(一) 配置LAMP和Nginx
CentOS 7 学习(一) 配置LAMP和Nginx CentOS是RedHat Linux企业版的代码编译版本,属于比较通用的服务器Linux版本,据说Ubuntu Server更通用,呵呵,不过 ...
- ansible 学习记录
Ansible 的重新学习记录 这里我的Ansible的宿主机是centos 7.2系统,这里我通过yum 安装Ansible 1.配置epel源 sudo yum -y install epel-r ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
随机推荐
- locust===官方说明文档,关于tasks
安装: >>> pip install locust locust在官方simple_code中如下: from locust import HttpLocust, TaskSet ...
- python实战===石头剪刀布,简单模型
#石头剪刀布 import random import time win_list = [("石头","剪刀"),("布","石头 ...
- 利用git把本地项目传到github+将github中已有项目从本地上传更新
利用git把本地项目传到github中 1.打开git bash命令行,进入到要上传的项目中,比如Spring项目,在此目录下执行git init 的命令,会发下在当前目录中多了一个.git的文件夹( ...
- 《Java编程思想》笔记 第十八章 Java I/O 系统
1 File 类 File是一个 文件和目录路径名 的抽象表示,通过File可以查看文件的各种信息,也可以增加删除文件. File构造器接受一个路径字符串并把它与实际文件目录映射起来,也能接受父子 ...
- python 判断质数还是合数
while 1: s = input('请输入一个数:') s = int(s) if s == 2: print('质数') else: if s == 0 or s == 1: print('都不 ...
- Jquery实现全选和取消全选的方法
<input type="checkbox" id="all" />全选<br /> <input type="chec ...
- php发送http请求的两种常用方法
第一种:使用CURL,直接上代码,开箱即用: <?php // return file_get_contents("http://thinkphp.com/index/index/cr ...
- C# axWindowsMediaPlayer制作播放器
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- centos opera 卸载
/usr/local/bin/uninstall-opera
- CF 276C Little Girl and Maximum Sum【贪心+差分】
C. Little Girl and Maximum Sum time limit per test2 seconds memory limit per test256 megabytes input ...