主机基本安全防护措施 —— SELinux 管理原则
< 一 > SELinux 简介:
SELinux使用委任式访问控制(Mandatory Access Control , MAC),它可以针对特定的程序与特定的文件资源来进行权限管理。
工作模式:
- 主体 (Subject) —— SELinux主要管理的就是程序 ;
- 目标 (Object) —— 主体程序访问的目标资源一般就是文件系统 ;
- 策略 (Policy)—— 依据某些服务来指定基本的访问安全策略,策略中有详细的规则 (Rule)来指定不同服务开放某些资源的访问与否;
- 安全环境 (Security Context)—— 主体与目标的安全环境必须一致才能够顺利访问目标 ;
重点:主体如何取得目标资源的访问权限
- 主体程序必须要通过SELinux策略内的规则放行后,才能与目标资源进行环境安全对比,若失败则无法访问目标;
- 若对比成功则开始访问目标;
- 最终能否访问目标还是与文件系统的rwx权限设置有关;
< 二 > 安全环境 (Security Context)
ls -Z 命令 ,查看文件的安全环境
ls -dZ 命令 ,查看,目录的安全环境
ps auxZ 命令 , 查看进程的安全环境
输出中,安全环境主要用冒号分为三个字段 Identify (身份识别) : role(角色) :type (类型)
Identify (身份识别) :相当于账号方面的身份识别
- root , 表示 root 的账号身份
- system_u , 表示系统程序方面的识别,通常就是程序
- user_u , 表示一般账号用户相关的身份
role(角色) :
- object_r ,代表文件或目录等文件资源
- system_r ,代表程序
type (类型) : Domain 需要与 Type 搭配,程序才能顺利读地取文件资源 !!
- Type , 在文件资源(Object)中成为类型(Type)
- Domain ,在主体程序 (Subject)中称为域 (Domain)
selinux 对文件的影响:
当selinux开启时,内核会对每个文件及每个开启的程序进行标签加载,标签内记录程序和文件的安全上下文(context)
对于程序功能的影响:
当selinux开启会对程序的功能加载开关,并设定此开关的状态为关闭,当需要此功能时需要手动开启功能开关 sebool
< 三 > SELinux 的启动 、关闭与查看
1 )getenforce 命令,查看 SELinux 当前启动模式
- disabled : 关闭,SELinix 并没有运行
- enforcing: 强制模式 ,代表 SELinix 运行中,且已经正确的开始限制 Domain / Type 了
- permissive : 宽容模式 ,代表 SELinix 运行中,不过仅有警告信息并不会实际限制 Domain / Type 的访问
2 )vim /etc/selinux/config , 通过修改 SELinix 的配置文件,来改变策略以及启动模式,修改后必须重新启动 !!
3 )setendorce [0 | 1] 命令,让 SELinux 模式在 enforcing 与 permissive 之间切换
- 0 : 转换成 permissive 宽容模式
- 1 : 转换成 enforcing 强制模式
注意:setendorce 无法在 disabled 的模式下面进行模式的切换 !!
< 四 > SELinux Type (类型字段)的修改
1 ) chcon 命令 —— (临时),在 selinux 重启后会恢复
- -R : 连同该目下的子目录也同时修改
- -t [ type ] : 后接安全性环境的类型字段
- -u [ user ] : 后接身份识别
- -r [ role ] : 后接角色
- -- reference=范例文件
2 ) semanage 命令 —— (永久) ,查询与修改 /etc/selinux/targeted/contexts
semanage fcontext -l —— 查询安全性环境列表 (fcontext # 主要用在安全性环境方面 ; -l # 查询)
semanage fcontext -{a|m|d} file_spec
- -a : 增加的意思 ,可以增加一些目录的默认安全性环境类型设置
- -m 修改的意思
- -d 删除的意思
示例
- semanage fcontext -a -t public_content_t '/westosdir(/.*)?' # (/.)? 连同目录下的子目录也同时设定 指定安全性环境的类型
- semanage fcontext -a -t public_content_t /westosdir1 # 只修改目标文件目录
- semanage fcontext -l | grep '/westosdir'
- restorecon -RvF /westosdir # restorecon 命令 ,恢复成默认 selinux type
- restorecon -RvF /westosdir1 # -R :连同子目录一起修改 ;-F : 连同子目录文件一起修改 ;-v : 过程显示到屏幕
- touch /.autorelabel # 重新启动后,初始化 selinux type
- reboot
SELinux 的端口(seport)设置
semanage port -l | grep ** # 查询服务的端口
semanage port -a -t ssh_port_t -p tcp # 添加服务类型的端口
实验测试
- vim /etc/ssh/sshd_config # 修改 sshd 配置文件,修改服务端口由默认 022 变更为 1111
- setenforce 0 # selinux 设置 为宽容模式
- systemctl restart sshd # 重启 sshd 服务 (在selinux 为强制模式时无法 重启!)
- semanage port -l | grep ssh
ssh_port_t tcp 22
- semanage port -a -t ssh_port_t -p tcp 1111 # 修改 selinux type 安全性环境类型的设置 ,ssh_port_t 类型添加 1111端口
ssh_port_t tcp 1111, 22
< 五 > SELinux 策略内的规则布尔值(sebool)修订
布尔值的查询与修改
- getsebool -a # 查询系统内所有的布尔值设置情况
- setsebool [ -p ] 布尔值=[0 | 1] # 修改布尔值配置文件,设置布尔值状态,off = 0 ; on = 1 ;
< 六 > SELinux 日志文件记录所需的服务
setroubleshoot : 将错误信息写入 /var/log/messages # troubleshoot(错误客服)
setroubleshoot这个服务会将关于 SELinux 的错误信息与克服方法记录到 /var/log/messages 与 /var/log/setroubleshoot/*中
setroubleshoot服务所需软件
- setroubleshoot
- setroubleshoot-server
备注:两者已经整合在 auditd 当中,安装好 setroubleshoot-server,需要重新启动 auditd
- systemctl restart auditd
实验测试
- semanage port -l | grep ssh
ssh_port_t tcp 1111, 22
- semanage port -d -t ssh_port_t -p tcp 1111
- > /var/log/audit/audit.log
- > /var/log/messages
- cat /var/log/audit/audit.log
- cat /var/log/messages