注:本文图片来自鸟哥私房菜基础篇第四版截图,
在centOS7.x中经常遇到给足权限,但是进程依旧提示权限不够的问题,前几天用rsyslog管理远程日志的时候就是这样,后来发现在cenOS7.x后系统还有一个selinux的进程在对进程读取文件的过程做权限监管,selinux是什么呢?
[百度百科解释:]SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。
SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制(MAC)系统。对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。 [1]
selinux采用控制主体[subject,可以理解为进程]是否能操作目标[object,可以理解为文件],是否能够操作控制的依据就是这两者间的策略,但是由于进程与文件数量庞大,因此selinux会依据某些服务来定制基本的存取安全性策略,这些策略内还会有详细的规则(rule)来指定不同的服务开放某些资源是否可以读取。centos7中只提供了3中策略:
targeted:针对网络服务较多,针对本机限制较少,预设的策略
minimum:由targeted修订而来,针对选着的进程来保护
mls:完整的selinux限制,限制方面非常严格
除了主体与目标的策略外,还要保证两者之间的安全性文本一致。
进程的安全性文本在内存中,而文件的则保存到了inode中了, 所以进程读取文件时需要先获取文件的inode。
查看文件安全性文本:
[root@localhost log]
drwxr-xr-x. 2 unconfined_u:object_r:home_root_t:s0 root root 6 5月 30 16:51 ../log/
安全性文本为: unconfined_u:object_r:home_root_t:s0
分别是:Identify:role:type
身份:角色:类型
身份识别:相当于账号方面的身份识别,主要的身份识别有:
unconfined_u:不受限的用户,也就是, 该文件来自不受限的进程产生,一般来时,我们使用登录账号获取bash后,预设的bash环境是不受限selinux管制的,因为bash并不是什么特别的网络服务,所有这个不受selinux管制,所有它产生的文件也是unconfied_u
system_u:系统用户,大部分就是系统自己产生的文件
角色:透过角色字段,我们可以知道这个资源是属于进程,文件还是代表使用者,一般角色有:
object_r:代表文件或目录等文件资源
system_r:代表进程,一般使用者也会被指定为system_r
类型:其实比对安全性文本,最重要的就是类型,其他两个基本不重要。type在进程中叫domain,在文件中叫Type
进程中的domain需要和文件中的Type搭配才能进行文件的读取
进程安全文本查询:
[root@localhost log]
system_u:system_r:syslogd_t:s0 22048 ? 00:00:02 rsyslogd
安全文本:system_u:system_r:syslogd_t:s0
selinux的三种模式:如上图描述
Disabled:关闭,不会进行检查
Permissive:警告模式:表示检查,但是如果出现不匹配只是警告
enforcing:强制:检查匹配,默认
查看模式:
[root@localhost log]
Enforcing
默认强制模式
查看selinux状态:
sestatus [-vb]
-v:检查列于/etc/sestatus.conf内的文件与进程的安全性文本内容
-b:将目前策略的规则boolean列出,
[root@localhost log]
setsebool setserial setsid
[root@localhost log]
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
模式调整:
setenforce [0|1]
0宽容模式
1强制模式
查看系统规则是启用:
[root@localhost log]
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files
....
练习:将系统日志更换到/home/log/message中
1.查看进程安全性文本
[root@localhost log]
system_u:system_r:syslogd_t:s0 25015 ? 00:00:00 rsyslogd
知道domain : syslogd_t
2.查看/home/log安全性文本
[root@localhost log]
drwxr-xr-x. root root unconfined_u:object_r:user_home_dir_t:s0 /home/log/
知道了Type: user_home_dir_t
3.查看主体syslogd_t 是否能与目标 user_home_dir_t 匹配
[root@localhost log]
allow syslogd_t user_home_dir_t : dir { getattr search open } ;
allow syslogd_t user_home_dir_t : lnk_file { read getattr } ;
从中知道是能进行匹配的, 但是只能读取文件, 不能写文件, 还是不能解决我们的问题
4.这个时候需要找到syslogd_t能匹配运行写文件的目标Type, 可以使用sesearch -A -s syslogd_t | grep write查询的方式,也可以直接使用/var/log/message的Type,这里直接使用/var/log/message的Type
5.更改Type
[root@localhost log]
正在更改"/home/log/" 的安全环境
6.验证:
[root@localhost log]
drwxr-xr-x. 2 unconfined_u:object_r:var_log_t:s0 root root 6 5月 30 19:15 /home/log/
[root@localhost log]
[root@localhost log]
[root@localhost log]
[root@localhost log]
message