1 SELinux介绍
SELinux: Secure Enhanced Linux 是由美国安全局(NSA=The National Security Agency)和SCC
(Secure Computer Corporation)开发的linux的墙纸访问控制的安全模板,在Linux内核2.6版本以后集成于内核
DAC:Discretionary Access Control 自由访问控制
MAC: Mandatory Access Control 强制访问控制
DAC 环境进程是束缚的
MAC 环境下策略的规则决定空中的严格程度
MAC环境下进程可以被限制
策略被用来定义被约束的进程能够使用哪些资源(文件和端口)
默认情况下,没有明确允许的行为将被拒绝
SELinux的四种工作类型
strict: CentOS5,每个进程都受到selinux的控制
targeted: 用来保护监控常用的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,centos4只保护13个服务,centos5 保护88服务
minimum: centos7,修改的targeted,支队选择的网络服务提供selinux
mls:提供MSL(多级安全)机制的安全性
targeted为默认的类型,minimum和mls稳定性不足,未加以应用,strict已不再使用
User: 指示登录系统的用户类型, 如root,user_u,system_u,多数本地进程都属于自由(unconfined )进程
Role: 定义文件,进程和用户的用途:文件:object_r ,进程和用户:system_r
Type: 指定数据类型,规则中定义何种进程类型访问何种文件
Target 策略基于type 实现, 多服务共用:public_content_t
Sensitivity: 限制访问的需要,由组织定义的分层安全级别,
如 如unclassified, secret,top,secret, 一个对象有且只有一个sensitivity, 分0-15 级,s0 最低,Target 策略默认使用s0
Category :对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 个对象可以有多个categroy, , c0-c1023共 共1024, 个分类, Target 策略不使用category
SELinux策略
对象:所有可以读取的对象,包括文件,目录,进程,端口
主体:进程称为主体(subject)
SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签,domain标签能够执行的操作由安全策略里定义
当一个subject试图访问一个object,kernel中的策略执行服务将检查AVL(访问矢量缓存 Access Vector Cacahe) 在AVC中,subject和object的权限被缓存,查找"应用+文件" 的安全环境,然后根据查询结果允许或拒绝访问
安全策略:定义主体读取对象的规则数据库,规则中记录了哪个类型使用哪个方法读取那个对象是允许还是拒绝的,并且定义了哪中行为是允许或拒绝
SELinux的配置文件
/etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive #定义SElinux的工作状态
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted# 定义SELinux的工作模式
同时也可以设置电脑启动是否开启selinux
编辑/boot/grub/grub.conf 下对应的启动上添加 selinux=0
2 SELinux 的使用
查看selinux的文件或进程
ls -Z ,ps -Z
相关命令
getenforce 获取当前selinux的状态
setenforce 临时设置selinux的状态 0 表示permissive 1 表示enforcing
修改SELinux的安全标签
chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE... 一某个文件的sellinux为标准
进行打标
-R 递归
restorecon [-R] file 将重新打标的文件恢复到数据库中的设定的值
如修改/root/文件的selinux标签
[root@test5(172.18.254.5) ~]#ls -Z install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log
[root@test5(172.18.254.5) ~]#ls -Z anaconda-ks.cfg
-rw-------. root root system_u:object_r:var_run_t:s0 anaconda-ks.cfg
[root@test5(172.18.254.5) ~]#restorecon anaconda-ks.cfg
[root@test5(172.18.254.5) ~]#ls -Z anaconda-ks.cfg
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
默认安全上下文查询和修改(及数据库中的标签)
semanage 工具 来自policycoreutils-python的包
查看所有的安全上下文 semanage fcontext -l
将没有在selinux的数据库中定义的文件或文件夹规则,添加规则
semanage fcontext -a -t httpd_sys_content_t '/root/test(/.*)?'
restorecon -Rv /root/test 将数据库中的标签打到文件上
删除数据库库中的标签
semanage fcontext -d -t httpd_sys_content_t '/root/text(/.*)?'
查看某个文件的selinux在数据库中的设定
semanage fcontext -l | egrep "/root/test"
如
[root@test5(172.18.254.5) ~]#semanage fcontext -a -t httpd_sys_content_t '/root/test(/.*)?'
>> 需要打标,否则不起作用
[root@test5(172.18.254.5) ~]#ls -Z test/
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.file
[root@test5(172.18.254.5) ~]# restorecon -R /root/test
[root@test5(172.18.254.5) ~]#ls -Z test/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 a.file
[root@test5(172.18.254.5) ~]#semanage fcontext -d -t httpd_sys_content_t '/root/test(/.*)?'
[root@test5(172.18.254.5) ~]#ls -Z test/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 a.file
[root@test5(172.18.254.5) ~]# restorecon -R /root/test
[root@test5(172.18.254.5) ~]#ls -Z test/
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.file
Selinux 端口标签
查看端口标签
semanage port -l
#当某个应用更改端口后,需要为他的端口打标,否则会提示错误
添加端口
semanage port -a -t port_label -p tcp|udp PORT
semanage port -a -t port_label -p tcp 8080
删除端口
semanage port -d -t port_label -p tcp|udp PORT
semanege port -d -t port_label -p tcp 8080
修改现有的端口为新标签
semanage port -m -t port_lable -p tcp|udp PORT
SELinux 布尔值
getsebool
setsebool
getsebool -a | grep httpd 查看指定的服务selinux的bool值设置
semanage boolean -l
semanage boolean -l -C 查看修改过的bool值
setsebool -p (不加 -p 只是当前状态,并没有修改数据库中的默认值)