SE-Linux安全策略实验文档
前言
实训文档:实训二_实验文档https://gitee.com/zhongjiacheng/TrainDocument
操作系统安全设计一般有自主访问控制DAC和强制访问控制MAC。
自主访问控制DAC在Linux中的实现有:9位权限码和访问控制列表ACL(见前实训)。
强制访问控制MAC在Linux中的实现就是SE-Linux,它是美国国家安全局NSA对强制访问控制的实现。
SE Linux通过一个安全上下文来标记每一个主体、客体。在SE Linux中,将安全上下文的信息存放在了文件系统的扩展属性中。可以通过ls --context/-Z filename
查看安全上下文。也可以通过getfattr
查看文件系统的扩展属性。安全上下文在拓展属性中的存储格式是“security.selinux = user:role:type[level[: category]] “。
SE Linux一般在Centos和red hat中使用。
系统基本命令
sestatus
查看系统selinux状态信息。
seinfo
查看更详细的se信息。
配置文件路径:/etc/selinux/config
开机启动配置路径:/boot/grub/menu.lst kernel后是否有selinux=0(默认关闭)
getenforce
和setenforce
可以获得状态、切换enforcing和permissive状态。
chcon
修改安全上下文
restorecon
恢复默认安全上下文
子任务1、网络服务启动与观察
使用ps -aux -Z | grep http
查看http进程的相关安全上下文情况。

发现都是一样的。
未定义的user、程序常见system_r的role、httpd_t:s0 的type。
子任务2:重新设置SE Linux安全上下文
这个子任务我们在用户主目录下创建一个index2.html的页面,然后移动到/var/www/html目录下,再次使用浏览器尝试打开,却发现没有权限。
我们使用audit2why < /var/log/audit/audit.log
查看错误信息。
(新版本中该审计环境需要安装setroubleshoot 、 setroubleshoot-server,拥有auditd审计服务进程环境,使用chkconfig auditd on
开启它)

可以看到,打印出了错误问题是type的原因。并且推荐使用audit2allow获得
解决方案。
我们尝试获得解决方案audit2allow <(-a) /var/log/audit/audit.log

结果很简单,它推荐我们增加一个规则,允许httpd_t类型(type)对admin_homt_t类型(type)拥有getattr权限,即可解决这个问题。
这里由于还不会增加规则,所以先尝试修改index2.html的类型(type)解决问题。
chcon -t httpd_sys_content_t /var/www/html/index2.html
或者使用restorecon -Rv(递归并显示处理信息) /var/www/html/
将目录下所有文件安全上下文设置为目录预设的安全上下文值。

再次尝试成功打开页面。

SE策略修改
子任务1、SELinux对vsftpd服务相关策略
安装ftp服务yun -y install vsftpd
安装ftp客户端yum -y install ftp
启动vsftpd服务/etc/init.d/vsftpd start
尝试访问本机的ftp服务ftp localhost
发现无权限访问,查看审计日志找出解决方案audit2why < /vat/log/audit/audit.log | grep ftp

可以看到解决方案:1、设置布尔值允许ftp服务登录本地用户和对所有文件的读写操作。2、允许ftp在用户的家目录读写文件。
并且给出了解决问题的指令setsebool -P allow ftpd full access 1
和setsebool -P ftp home dir 1
。
尝试解决后,再次登录试验,发现成功!

子任务2、使用semanage更改apache的监听端口,并将SELinux的审计日志进行记录和分析
semanage port -l | grep http
查看所有http端口信息。

将apache的监听端口号从80改成82(/etc/httpd/conf/httpd.conf)
重启apache服务/etc/init.d/httpd restart
发现报错

原因是没有权限绑定82号端口。
看一下审计日志的是否记录报错内容。audit2why < /var/log/audit/audit.log

使用semange命令允许http82端口的监听:semanage port -a -t http_port_t -p tcp 82
使用semanage port -l
查看是否成功。

可以看到增加了82端口监听的支持。
重启apache,测试是否成功。

成功(解决了一个不影响apache使用的服务器名字的异常报错,方法:在/etc/hosts中增加主机名bogon)
子任务3、防止入侵者执行未授权的CGI或Perl脚本来获取系统的控制
首先切换到student普通用户,在家目录下创建一个perl脚本。脚本内容是很简单的打印HelloWorld。
然后chmod a+x hello.pl
,给ugo增加可执行权限。
查看一下安全上下文信息ls -Z hello.pl

配置apache配置文件,使其允许运行CGI脚本。
<Directory />
Options FollowSymLinks ExecCGI
AllowOverride None
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks ExecCGI
</>
AddHandler cgi-script .cgi .pl
拷贝perl脚本到/var/www/html目录下。重启apache服务,使用浏览器打开(注意端口前面你已经修改成82了)

成功运行。
但是apache配置允许运行脚本,就可以没有任何保护策略的随意运行是非常危险的。为了防止这一漏洞对系统造成伤害,就需要设置httpd也就是apache的httpd_unified策略布尔值,将其设置为0关闭状态。
查询当前httpd_unified策略布尔值:getsebool -a | grep httpd_unified
修改策略布尔值setsebool -P(立即生效) httpd_unified=0

此时再次尝试浏览器访问此脚本,发现就会被禁止这个请求。

一旦关闭了这一策略,就需要给可信脚本的安全上下文设置一个httpd_sys_script_exec_t的类型。
设置命令:chcon -v(显示操作信息) --type=httpd_sys_script_exec_t(指定安全上下文类型) hello.pl
这样,我们就可以控制脚本在服务器上的安全运行啦。设置好后,我们再次尝试浏览此脚本,成功运行!
SELinux策略定制
使用到的命令:audit2allow
、checkmodule
、semodule_package
、semodule
子任务1、使用SELinux图形化工具system-config-selinux来为命令”rwho“定制新的SELinux策略,并介绍所产生的te文件中具体内容信息。
system-config-selinux -> 策略模块 -> 新建 -> 标注你的init守护进程 -> 策略名称、可执行程序位置/usr/bin/XXX -> 选择应用程序通用特征(写入syslog、发送审计消息) -> 生成四个文件

子任务2、使用audit2allow为apache定制新的策略,允许apache使用任何端口进行绑定
首先和前面实训一样,修改apache的配置文件端口号监听为85,然后重启服务。由于我们前面semanage也证明过,85端口号不被策略允许,所以会报错端口绑定失败,并且在审计日志被记录。
1、使用audit2allow分析刚才的审计日志内容,自动生成解决策略port.te
cat /var/log/audit/audit.log | audit2allow -m port > port.te
2、使用checkmodule工具通过策略文件生成策略模块
checkmodule -m -M -o port.mod port.te
3、使用semodule_package工具通过策略模块生成策略模块包
semodule_package -o port.pp -m port.mod
4、使用semodule工具把策略模块包加载到内核中
semodule -i port.pp
5、使用图形化策略管理工具system-config-selinux查看刚刚增加的port策略

6、再次重启apache服务,发现已经成功!

子任务3、使用audit2allow为apache定制新的策略,不允许apache绑定监听除默认的端口以外的任意端口,例如82,但是审计系统对此不进行审计。
任务3相比任务2简单来说是仍然不允许使用其他端口,但是不进行审计。回溯任务2的策略,我们允许了http所有端口的使用,其实只需要在这个te策略文件中将关键词allow改为dontaudit(不审计)即可。
在进行任务3之前,我们需要先利用命令semodule --remove port
把任务2加载的策略模块包卸载。
下面的步骤与任务2相同。任务3的策略模块名我起名叫unaudit_invalidport。并且为了后面测试结果清晰,将apache的监听端口改成了非法的但前面实验没用过的81。
加载好策略模块包后,再次重启apache发现端口绑定失败,查看审计日志,发现并没有81号端口的http报错,成功!
