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

posted @ 2017-09-11 10:31  菲菲菲菲菲常新的新手  阅读(371)  评论(0编辑  收藏  举报