SELinux admin教程(openSUSE SELinux)

SELinux初级(管理员)教程

博主第一次写文章,记得多多支持啊
本教程用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

  1. yast2中打开software manage
  2. 安装C/C++ Development 软件组,(这里估计有人会找不到,别急,往下看)
  3. 安装包含selinux字样的所有软件包
  4. 切回yast2,在system->boot loader->kernel parameters
  5. 添加内核参数:security=selinux selinux=1 enforcing=0
  6. 添加软件源http://download.opensuse.org/repositories/security:/SELinux/openSUSE_Leap_15.1/
  7. 安装SELinux的规则包,SUSE官方推荐安装selinux-policy-minimum
  8. 初始化默认的文件上下文restorecon -Rp /,这样开机就不用等那么长时间了
  9. 修改/etc/selinux/config中SELINUX=字段,改为permissive(宽容模式),可以改为enforcing,这里是为了防止重启时出现问题,还有,这里不要用setenforce亲测没用
    10.reboot!

关于软件包在哪里,博主刚开始也找了好久,在tty下,zypper只能查看不能安装,
在有上角的Fliter下拉菜单,选择patterns,在列表中找到C/C++ Development,然后把这些软件全部安装SELinux admin教程(openSUSE SELinux)_第1张图片重启之后用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)
SELinux admin教程(openSUSE SELinux)_第2张图片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查看
SELinux admin教程(openSUSE SELinux)_第3张图片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模块时再来看这个文件

假如有什么不妥的地方,记得私信我啊

你可能感兴趣的:(linux,linux,SELinux,openSUSE)