SELinux入门和基本配置
SElinux的概念:
SELinux[Security Enhanced Linux (安全强化 Linux)],是工作在内核中的MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。强制访问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力。所以它不是网络防火墙或 ACL 的替代品,在用途上也不重复。
DAC和MAC的联系和区别:
一般系统上采用的DAC的环境,selinux则是MAC(强制访问控制)
DAC环境下进程是无束缚的
MAC环境下策略的规则决定控制的严格程度
MAC环境下进程可以被限制的
策略被用来定义被限制的进程能够使用那些资源(文件和端口)
默认情况下,没有被明确允许的行为将被拒绝
对于selinux的通俗理解:
selinux,它给一些特定程序(这些程序也在不断增加)做了一个沙箱,它将文件打上了一个安全标签,这些标签属于不同的类,也只能执行特定的操作,也就是规定了某个应用程序设定了你可以访问那些文件或目录。
subject operation object
主体:进程称为主体(subject)
对象(object):所有可以读取的对象,包括文件、目录和进程,端口等,
SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签。Domain标签能够执行的 操作由安全策略里定义。当一个subject试图访问一个object,Kernel中的策略执行服务器将检查AVC (访问矢量缓存Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached),查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问
安全策略:定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一个对象是允许还是拒绝的,并且定义了哪种行为是充许或拒绝
了解和配置 SELinux
1. 获取当前 SELinux 运行状态
getenforce
可能返回结果有三种:Enforcing、Permissive 和 Disabled。Disabled 代表 SELinux 被禁用,Permissive 代表仅记录安全警告但不阻止可疑行为,Enforcing 代表记录警告且阻止可疑行为。
2. 改变 SELinux 运行状态
setenforce [ 1 | 0 ]
切换disabled状态或者从disabled状态切换至别的状态都需要重启。而enforceing和Permissive两种状态间切换不需要重启
重启时会为整个文件系统重新创建安全标签(touch /.autorelabel && reboot)。
只要grub中或者配置文件中有一个设置了disabled ,那么seLinux就是不启动的。
若是想要永久变更系统 SELinux 运行环境,可以通过更改配置文件 /etc/sysconfig/selinux实现。
3. SELinux 运行策略
strict: CentOS5,每个进程都受到selinux的控制
targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,rhel4只保护13个服务,rhel5保护88个服务
minimum:centos7,修改过的targeted,只对选择的网络服务
mls:提供MLS(多级安全)机制的安全性
minimum和mls稳定性不足,未加以应用
一般都是默认采用targeted,不用修改
4. 安全标签
a.查看程序的安全标签
#ps auxZ | grep lldpad
system_u:system_r:initrc_t:s0 root 1000 8.9 0.0 3040 668 ? Ss 21:01 6:08 /usr/sbin/lldpad -d
b.查看文件的安全标签:有.就是有安全标签
#ls -Z /usr/lib/xulrunner-2/libmozjs.so
-rwxr-xr-x. root root system_u:object_r:lib_t:s0 /usr/lib/xulrunner-2/libmozjs.so
安全标签有多个选项,我们只需要关注第三个type就行。
Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务共用:public_content_t
给文件重新打安全标签:
chcon [-t TYPE] FILE...
chcon[OPTION]... --reference=RFILE FILE...
-R:递归打标;
恢复目录或文件默认的安全上下文:
restorecon[-R] /path/to/somewhere
5.安全上下文
semanage来自policycoreutils-Python包,centos 6上默认没安装
查看默认的安全上下文
semanage fcontext –l
添加安全上下文
semanage fcontext -a –t httpd_sys_content_t‘/testdir(/.*)?’
restorecon –Rv /testdir
删除安全上下文
semanage fcontext -d –t httpd_sys_content_t‘/testdir(/.*)?’
6.端口
查看端口标签
semanage port –l
添加端口
semanage port -a -t port_label-p tcp|udpPORT
semanage port -a -t http_port_t -p tcp 9527
删除端口
semanage port -d -t port_label-p tcp|udpPORT
semanage port -d -t http_port_t -p tcp 9527
修改
semanage port -m -t port_label-p tcp|udpPORT
semanage port -m -t http_port_t-p tcp9527
7.布尔规则
布尔型规则:
getsebool
setsebool
查看bool命令:
getsebool [-a] [boolean]
semanage boolean –l
semanage boolean -l –C 查看修改过的布尔值
设置bool值命令:
setsebool [-P] booleanvalue
setsebool [-P] Boolean=value
8.日志
yum install setroublesshoot*(重启生效)
将错误的信息写入/var/log/message
grep setroubleshoot/var/log/messages
sealert-l UUID
查看安全事件日志说明
sealert-a /var/log/audit/audit.log
扫描并分析日志
Apache SELinux 配置实例
1、安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,设置http_sys_content_t到/website及目录下所有文件,使网站可访问
[root@~]# mkdir /website
[root@~]# ll -Z /website -d
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /websit
[root@~]# ll -Z /var/www/html/
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
[root@~]# chcon --reference=/var/www/html /website
[root@~]#ll -Z /website/
-rwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
[root@~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/website"
[root@~]# service httpd restart
[root@~]#echo "test website" > /website/index.html
测试:
在浏览器上输入地址,可以正常访问到
2、修改网站端口为9527,增加SELinux端口标签,使网站可访问
[root@~]# semanage port -l | grep "http_port_t"
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@~]# semanage port -a -t http_port_t -p tcp 9527
[root@~]# semanage port -l | grep "http_port_t"
http_port_t tcp 9527,80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@~]#vim /etc/httpd/conf/httpd.conf
Listen 9527
测试:
3、启用SELinux布尔值,使用户student的家目录可通过http访问
[root@~]#vim /etc/httpd/conf/httpd.conf
修改为:
# UserDir disabled
UserDir public_html
[root@~]# chmod 711 /home/jay
[root@~]#mkdir /home/jay/public_html
[root@~]#echo "jay home" > /home/jay/public_html/index.html
查看布尔规则:
[root@~]# semanage boolean -l | grep "homedir"
httpd_enable_homedirs (off , off) Allow httpd to read home directories
修改布尔规则:
[root@~]# setsebool -P httpd_enable_homedirs on
测试: