背景:有一天ftp访问某服务器,能看到文件夹就是无法上传文件,最终网上搜索是因为selinux,关闭selinux后可以访问了。(当然可能是其他原因,比如test用户不能操作root用户的文件夹,这个场景除外)
查看SELinux状态
1、/usr/sbin/sestatus -v
SELinux status: enabled
#SELinux status返回enabled为开启状态
2、getenforce
##可以用这个命令检查
关闭和打开SELinux
1、临时关闭(不用重启机器),重启机器后恢复。设置SELinux 成为permissive模式,表示SELinux已经启动,但参数不生效,只是会提出警告信息。
setenforce 0
2、临时打开(不用重启机器),重启机器后恢复。设置SELinux 成为enforcing模式,表示SELinux已经启动,且参数生效。
setenforce 1
3、永久性修改,改完配置文件要重启机器
修改/etc/selinux/config 文件,将SELINUX=enforcing改为SELINUX=disabled,重启机器即可。
反之则为打开。
简单认识下这个牛逼的selinux
为什么说selinux牛逼呢?关闭selinux后可以访问ftp上传文件了,这个问题折腾我好久。不能好了伤疤忘了疼,是能访问了,但是为啥呢?selinux是何方神圣?
系统资源通过进程来读取更改的,为了保证系统资源的安全,传统的Linux使用用户、文件权限的概念来限制资源的访问,通过对比进程的发起用户和文件权限以此来保证系统资源的安全,这是一种自由访问控制方式(DAC);但是随着系统资源安全性要求提高,出现了在Linux下的一种安全强化机制(SELinux),该机制为进程和文件加入了除权限之外更多的限制来增强访问条件,这种方式为强制访问控制(MAC)。这两种方式最直观的对比就是,采用传统DAC,root可以访问任何文件,而在MAC下,就算是root,也只能访问设定允许的文件。
1) 3种工作模式决定SELinux机制的开和关
enforcing =>强制模式,SELinux已经启动且参数生效
permissive=>宽容模式,SELinux已经启动,但参数不生效,只是会提出警告信息
disabled=>关闭模式,关闭SELinux
2) 4种工作类型(SELinux type) 表示SELinux具体的安全性策略
strict ==>每个进程都受限制(仅在centos5)
targeted==>默认类型为targeted,主要限制网络服务
minimum==>简化版的targetd,限制部分网络服务(centos7)
mls ==>多级安全限制,较为严格
SELinux下存在不同的规则,SELinux根据不同的工作类型对这些规则打开或关闭(on|off <布尔值1|0>),然后通过规则的开启与关闭来限制不同进程对文件的读取。
getsebool -a 或者 sestatus -b # 查看当前工作类型下各个规则的开启与否
setsebool -P 规则名称 [0|1] # 修改当前工作类型下指定规则的开启关闭,-P表示同时修改文件使永久生效。
3) 安全上下文(security context)
进程必须和文件的安全上下文对应(不是必须一样)才能对其进行访问。
ls -Z 文件名 # 查看文件的安全上下文
ps -eZ # 查看进程的安全上下文
安全上下文存在于进程与文件中,context随进程一起存入内存中,文件的context存放在其对应的inode中,因此进程在访问文件时,要先读取inode,再判断是否能够访问该文件。
context有5个字段,以:为分割符,分别为user:role:type:sensitivity:category
user为身份识别,unconfined_u不受限的用户或文件,system_u受限的进程或文件
role为文件、进程、用户object_r文件,system_r进程和用户
type为数据类型,何种类型进程访问何种文件
sensitivity安全级别,s0最低,只有在msl下才有意义。
category为划分的不同分类,当它不存在了
chcon命令修改安全上下文security context,格式chcon 选项 目标文件
chcon # 修改文件的context,-R选项可以递归修改目录,-v选项可以显示context的修改前后的结果
chcon -t # 修改文件的context的type字段
chcon -u # 修改文件的context的user字段
chcon -r # 修改role字段
chcon -l # 修改安全级别
chcon -h # 针对软链接文件的修改,不加-h则会修改软链接对应的原文件
semanage修改进程访问的端口号,实际上修改安全上下文的,用semanage工具。
查询某个服务的context type字段,语法:semanage port -l |grep 服务名
添加某个端口为指定服务的访问端口,语法:semanage port -a -t type -p 协议 端口号(不要与常用端口重复)
SElinux的日志
SELinux阻止的进程的日志记录一般存放在/var/log/audit/audit.log文件中。
参考资料