博主第一次写文章,记得多多支持啊
本教程用openSUSE leap 15.1,服务器配置为例
认真研究了SUSE GUIDE,SELinux adminDOC和CSDN各位大佬的博客,结合实际操作总结的
在开始之前,先来了解几个SELinux的概念:
用户(user)
注意SELinux的用户不等同与Linux用户,并且SELinux用户以后缀_u结尾
角色(Roles)
角色是由策略(Public)定义的,就是角色决定了用那个策略
很多文章都没写到SELinux的策略是模块化的,关于这个待会再讨论
后缀_r
类型(Types)
SELinux是类型强制的,类型是决定进程能否访问这个文件
后缀_t(后缀不就是开头字母吗?
上下文(Contexts)
格式是这样的,用来标记进程和文件,分别是用户,角色,类型,范围
user:role:type:range
文件类型(Object Classes)
每个文件类型都对应一套策略,策略决定了进程对这类文件的访问权限
这类,访问权限有4种,创建(create),读取(read),写入(write),删除(unlink,在这里不是连接的意思)
规则(Rules)
allow user_t user_home_t:file {create read write unlink};
这么理解,user_t类型对user_home_t类型有创建,读取,写入,删除权限
这个是策略的构成语句
接下来,我们开始安装SELinux,我用的系统是openSUSE leap 15.1
Ubuntu系统可以参考Installing SELinux
http://download.opensuse.org/repositories/security:/SELinux/openSUSE_Leap_15.1/
restorecon -Rp /
,这样开机就不用等那么长时间了关于软件包在哪里,博主刚开始也找了好久,在tty下,zypper只能查看不能安装,
在有上角的Fliter下拉菜单,选择patterns,在列表中找到C/C++ Development,然后把这些软件全部安装重启之后用sestatus -v查看SELinux状态
然后发现输出一大堆东西,开心
接下来开始正式的教程
先来了解一下SELinux结构,其实很简单,没有网上说的那么复杂
SELinux对于权限的管理就是进程->策略->文件
进程和文件都有一个安全上下文,假如这个上下文对上了,这个进程就通过了SELinux这一层管理,但不一定成功,还有DAC,就是那些rwx权限(ps:“那通过了MAC和DAC后,我这个文件为啥还是不能访问?” “你看看这文件在哪里” “?” …)
之前说过,安全上下文由4部分组成,因为SELinux是类型强制的,所以第3个字段类型对应就可以访问(这里不讨论MSL),第4个字段是MSL下才使用
接下来说一些基本的操作:
显示用户安全上下文:id -Z
显示文件安全上下文:ls -Z
显示进程安全上下文:ps -Z
总结起来一句话:加个Z
更改文件上下文分两种情况
1:临时,重启后就没了
chcon
这个指令这么用:参数后面跟标签,要修改的文件路径写最后面
要改哪个标签,参数就用那个标签的后缀
比如$ chcon -t user_home_t /tmp/myfile
2:永久的
semanage fcontext
用法和chcon一样,要在开头加一个-a参数,增加一个上下文
比如# semanage fcontext -a -t user_home_t /var/cache/myfile
还有一个是重新设置上下文
restorecon
后面跟路径,假如是文件夹,加一个-R
比如# restorecon /var/cache/myfile
更改用户的上下文:
newrole
用法和chcon一样,改的是当前用户上下文
更改程序上下文:(当一个进程启动的时候,并且这个方法是临时的)
runcon [完整的上下文] [程序的绝对路径]
比如:runcon system_u:system_r:crond_t:s0:c0.c255 /bin/bash
讲完了基本操作,来讲讲日志文件
假如发生了SELinux阻止了进程对文件的操作,只要SELinux状态不是disable,就会有日志产生
因为日志文件可读性差,所以不要尝试作死用cat
SELinux日志记录依赖于auditd这个服务,既然是由它创建,自然由它来分析了
默认日志文件在/var/log/audit/audit.log
先检查这个服务,这里用ps -ef | grep auditd
然后用audit2allow -w -a
注意这将读取默认日志文件,假如放在别处了,要指定路径
接下来一段一段来分析日志:(好多字段…enjoy.jpg)
type=AVC
这是一行log开始的标记,没啥具体意义
msg=audit(1348173901.309:300)
这是时间标记,用date -d [第一串数字]来查看具体时间
date -d @1348173901
注意,这个时间标记是这台电脑特有的,复制到其他电脑会显示
date: 无效的日期"1348173901"
avc: denied { append }
被SELinux阻止的文件操作,花括号中的是具体行为,比如write,getattr,read等等
for pid=1316
进程的PID,但进程的PID与具体进程又不是强行绑定的,所以容易过期
comm=“rsyslogd”
PID所对应的命令,这个可是好东西
name=“smartmontools”
进程的名称,也是好东西
dev=sda6 ino=582296
所涉及到文件的位置,第一个是分区,第二个是inode
但各位,光有inode可不行啊,天知道那是哪一个文件,所以这会在我下一篇博文里提到
scontext=system_u:system_r:syslogd_t
进程的安全上下文 (应该是这么理解的,原文是这样the source context, which is the context of the initiator of the action)
tclass=file
对象的类型,不一定总是文件
接下来,我们来玩一些高级的:(interesting)
(我们离实践还差那么一点点,就那么一点点)
之前说过规则(public)是模块化的,一个规则对应的模块在/var/lib/selinux/[规则名]/目录(注意:在老的版本下,该目录在/usr/selinux/具体的看SELinux GUIDE)下
可以用semodule -l查看
SUSE的具体模块在active/modules下,不同的发行版会有些区别
当然SELinux官方说,要把这些模块编译起来,然后打包…
这里,我们有一个简单的方法,毕竟我们不是开发者
我们首先看到这些模块的名称,想不想我们平常用的程序
每个程序都有一些功能,具体的策略就是按照每个程序所对应的功能整理好的
so,我们要做的事情就很简单了,就是设置一下这个功能在SELinux中状态好了
这里以FTP服务为例:
1.首先,我们要找一下这个功能:
sudo semanage boolean -l | grep ftp
2.然后打开/关闭它
sudo setsebool allow_ftpd_anon_write off
3.买个保险:
sudo semanage boolean -l|grep ftpd_anon
4.日常操作:(重启服务)
service ftpd reboot
5.这里有个官方通知
要重新检查一下这个功能是否打开,因为这个操作不是立刻就写进规则的,你或许会看到它又关掉了(what?
6.然后把它写进文件(假如你不想反悔的话
sudo setsebool -P allow_ftpd_anon_write
还有一个端口配置的问题,SELinux也会对端口做出限制
用semanage port -l查看
用semanage port -a -t [端口名称] -p [协议类型] [端口号]
注意,-a是增加,-m是修改,-d是删除
最后,我们来看看SELinux的全局配置文件(配置文件分3类,另外两类配置文件与module有关,不是admin教程的内容,应该是development的内容)
/etc/selinux/config
selinux参数
SELINUX=enforcing|permissive|disabled //selinux模式
SELINUXTYPE=policy_name 规则的目录名称,就是/etc/selinux/目录下的存放规则的文件夹名称
SELOCALDEFS=0|1 0启用规则库管理
REQUIREUSERS=0|1 是否将linux用户名作为SELinux user名称,就是控制getseuserbyname这个功能是否启动,0启动,1不启动
AUTORELABEL=0|1 是否重置root目录下的selinux 文件上下文,这是root登录shell必须的,0启动,1禁用
/etc/selinux/semanage.conf
selinux配置semanage和semodule这两个命令
/etc/selinux/restorecond.conf and restorecond-user.conf
记录的是进程创建的文件可能会出现错误的上下文的路径
比如说一个程序安装时会向硬盘写入文件,假如这些文件的安全上下文是根据规则配置的,那就无法使用了,需要重新配置上下文
/etc/sestatus.conf
当运行sestatus-v时要显示那些文件或进程的上下文
/etc/selinux/newrole_pam.conf
/etc/security/sepermit.conf
与PAM有关,在研究PAM模块时再来看这个文件
假如有什么不妥的地方,记得私信我啊