linux系统---selinux

SELINUX
1.基本 SELINUX 安全性概念


SELINUX ( 安全增强型 Linux ) 是可保护你系统安全性的额外机制, 在某种程度上 , 它可以被看作是与标准权限系统并行的权限系统。在常规模式中 , 以用户身份运行进程 , 并且系统上的文件和其他资源都设置了权限 ( 控制哪些用户对哪些文件具有哪些访问权 SELINUX 的另一个不同之处在于 , 若要访问文件 ,你必须具有普通访问权限和 SELINUX 访问权限。因此 , 即使以超级用户身份root 运行进程 , 根据进程以及文件或资源的 SELinux 安全性上下文可能拒绝访问文件或资源限 ) 标签。

2.selinux 安全上下文访问规则

WEB 服务器HTTPD 进程设置了 SELINUX 上下文system_u:system_r:httpd_t 标签。该上下文的重要部分是第三个用冒号分隔的字段 SELINUX 类型 : httpd_t系统上的文件和资源也设置了 SELINUX 上下文标签 , 并且重要的部分是 SELINUX 类型。例如 , /var/www/html 中的文件具有类型 httpd_sys_content_t 。 /tmp 和 /var/tmp 中的文件通常具有类型 tmp_t。


Seliux 策略具有允许以 httpd_t 身份运行的进程访问标记为httpd_sys_content_t 的文件的规则。没有规则允许这些进程访问标记有 tmp_t 的文件 , 因此将拒绝这些访问 , 即使常规文件权限指出应该允许这些访问SELINUX 模式



3.显示及更改selinux模式



setenforce(set(设置)和enforce(执行)的连写)是linux的selinux防火墙配置命令
setenforce 0表示关闭防火墙


getenforce(查看selinux的状态)
gentenforce0|1 0表示permission##警告模式 1表示enforcing##强制模式

4.临时修改文件的安全上下文


##临时修改文件的安全上下文将通过一个文件的移动会改变安全上下文的格式的实验来进行演示 ##由于建立一个文件不会改变安全上下文,而移动一个文件则会改变安全上下文的格式,导致无法在lftp下访问,而通过修改 这个文件的安全上下文格式会使得我们看见这个文件
实验: 4.1.systemctl start vsftpd(打开vsftp)


4.2 systemctl stop firewalld(关闭防火墙) linux系统---selinux
文章图片
4.3 rm -fr /var/ftp/*(删除掉ftp下的有文件)
4.4touch /mnt/westos (在/mnt/下建立一个westos)
4.5 mv /mnt/westos /var/ftp/(移动这个wetos 到/var/ftp下)


4.6lftp 172.25.254.235 (链接lftp 发现并没有这个移动过来的文件) linux系统---selinux
文章图片
4.7cd /var/ftp/
4.8touch file1 (建立一个file1文件)
4.9 ls (可以清楚的看见两个文件)
4.10 ll (查看文件的属性和权限)
4.11 lftp 172.25.254.235(登录发现有file1文件) linux系统---selinux
文章图片
4.12 ls -Z(查看这两个文件的安全上下文,发现安全上下文的格式不一样)
linux系统---selinux
文章图片


4.13semanage fcontext -l |grep /var/ftp/ (查看这个目录下许可的安全上下文) linux系统---selinux
文章图片



4.14chcon -t public_content_t westos(修改westos的安全上下文) linux系统---selinux
文章图片
4.15 ls -Z (查看安全上下文)


4.16lftp 172.25.254.235 4.17 ls linux系统---selinux
文章图片
##以上修改安全上下文为临时修改,在selinux重新配置后会还原

5,永久修改安全上下文
semanage 命令————永久性定制安全上下文 。


restorecon 是 policycoreutil 软件包的一部分,semanage是 policycoreutil-python 软件包的一部分,semanage fcontext 可用于显示或修改 restorecon 用来设置默认文件上下文的规则,semanage fcontext 使用扩展正则表达式来指定路径和文件名。fcontext 规则中最常用的扩展正则表达式是—— (/.*)? , 表示随意地匹配 / 后跟任何数量的字符semanage fcontext 将递归地与在表达式前面列出的目录以及该目录中的所有内容相匹配。


实验:
##本实验分为两个部分, 第一个部分证明了
chcon -t public_content_t /westos(修改westos的安全上下文)为临时修改,重新配置后失效

第二个部分证明了 semanage fcontext -a -t public_content_t '/westos(/.*)?' (将/westos目录和目录下的所有文件。隐藏文件都加入安全上下文)为永久修改上下文

第一部分:
mkdir /westos (建立一个/westos目录,这个目录是用来作为用户的默认家目录) touch /westos/westofile(在这个目录中建立一个westofile文件)
vim /etc/vsftpd/vsftpd.conf (打开配置文件,设置一个加目录) linux系统---selinux
文章图片


systemctl restart vsftpd.service (刷新) linux系统---selinux
文章图片


setenforce 0(警告,可以查看但是会生成警告)
lftp 172.25.254.235 linux系统---selinux
文章图片


ls -Zd /westos (查看这个目录的安全上下文) chcon -t public_content /westos -R (修改这个目录的安全上下文格式)

ls -Z /westos(查看这个安全上下文的格式) linux系统---selinux
文章图片



vim /etc/sysconfig/selinux (打开修改为disabled) linux系统---selinux
文章图片


reboot(重启)
vim /etc/sysconfig/selinux(打开修改为enforcing) linux系统---selinux
文章图片


reboot(重启)
ls -Z /westos(查看安全上下文格式,发现还原成没改之前的格式) linux系统---selinux
文章图片


ls -Zd /westos/ linux系统---selinux
文章图片


ls -Zd /var/ftp/(可以清楚的看到/var/ftp这个目录的安全上下文) linux系统---selinux
文章图片



semanage fcontext -l | grep /var/ftp (过滤这个文件的安全上下文,可以发现格式为正确的)
semanage fcontext -l | grep /westos (这个什么都没有) linux系统---selinux
文章图片

##以上实验证明了修改 chcon -t public_content_t westos(修改westos的安全上下文)为临时修改

第二部分: semanage fcontext -a -t public_content_t '/westos(/.*)?' (将/westos目录和 目录下的所有文件。隐藏文件都加入安全上下文)

ls -Zd /westos
restorecon -FvvR /westos/(重置)ls -Zd /westos (查看格式仍为正确的格式) linux系统---selinux
文章图片



##永久修改上下文可行


6.管理 SELinux 布尔值
SELinux 布尔值是更改 SELinux 策略行为的开关。 SELinux 布尔值是可以启用或禁用的规则。安全管理员可以使 SELinux 布尔值来调整策略 , 以有选择地进行调整许多软件包都具有 man page *_selinux(8), 其中详细说明了所使用的一些布尔值 ; man -k ‘_selinux’ 可以轻松地找到这些手册getsebool 用于显示布尔值 , setsebool 用于修改布尔值setsebool -P 修改 SELinux 策略 , 以永久保留修改。


semanage boolean -l 将显示布尔值是否永久。


setenforce 1 (强制模式) setsebool##当seinux在强制时,setsebool就相当于一个开关,默认情况下是关闭的(主要是为了防止不安全的某些功能))




实验:

##这个实验是在selinux强制模式下进行的,默认student用户可写情况下进行的
getsebool -a |grep ftp (查看setsebool开关里的命令项的开关情况)
linux系统---selinux
文章图片


lftp 172.25.254.235 -u student (登录student用户,进行上传命令,发现失败,是因为在强制模式下selinux阻止文件上传) linux系统---selinux
文章图片


setsebool -P ftp_home_dir on(永久开启上传)
getsebool -a |grep ftp(再次查看这些功能项的开关情况)
linux系统---selinux
文章图片

lftp 172.25.254.235 -u student(当打开这个开关之后,再次登录lftp发现可以上传)
ftp student@172.25.254.235:~> lslftp student@172.25.254.235:~> put /etc/passwd
2005 bytes transferr(上传成功)
linux系统---selinux
文章图片


7.监控 SELinux 冲突

必须安装 setroubleshoot-server 软件包 , 才能将 SELinux消息发送至 /var/log/messages , setroubleshoot-server 侦听 /var/log/audit/audit.log 中的审核信息并将简短摘要发送至 /var/log/messages,摘要包括 SELinux 冲突的唯一标识符 ( UUIDs ), 可用于收集更多信息。 Sealert -l UUID 用于生成特定事件的报告。 Sealert -a /var/log/audit/audit.log 用于在该文件中生成所有事件的报告。





实验:
安装setrouble软件 清空日志 >/var/log/messages
清空日志查看方法
>/var/log/audit/audit.log

建立一个文件/westosfile将这个文件移动到/var/ftp中


linux系统---selinux
文章图片

发现这个文件并不存在于ftp中

linux系统---selinux
文章图片





cat /var/log/ messages (查看解决方法) restorecon -v '$FIX_TARGET_PATH'


*****Plugin catchall (7.64 confidence) suggests**************************

If you believe that vsftpd should be allowed getattr access on thefile by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep vsftpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp


May 12 01:59:46 localhost dbus-daemon: string index out of range
restorecon -v /var/ftp/*(执行命令)
restorecon reset /var/ftp/westosfile context unconfined_u:object_r:mnt_t:s0->unconfined_u:object_r:public_content_t:s0

linux系统---selinux
文章图片

再次刷新页面 linux系统---selinux
文章图片






7.修改端口




安装阿帕奇 linux系统---selinux
文章图片



[root@localhost yum.repos.d]# vim /etc/httpd/conf/httpd.conf (打开配置文件修改端口为6666) linux系统---selinux
文章图片


[root@localhost yum.repos.d]# systemctl restart httpd(刷新httpd失败,是因为端口里边没有6666这个) Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. linux系统---selinux
文章图片

[root@localhost ~]# semanage port -l | grep http(列出httd允许的端口)
http_cache_port_ttcp8080, 8118, 8123, 10001-10010
http_cache_port_tudp3130
http_port_ttcp80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_ttcp5988


pegasus_https_port_ttcp5989 linux系统---selinux
文章图片


[root@localhost ~]# semanage port -a -t http_port_t -p tcp 6666 (给 http_port_t 加上一个6666的端口) [root@localhost ~]# semanage port -l | grep http(列出httpd允许的端口)
http_cache_port_ttcp8080, 8118, 8123, 10001-10010
http_cache_port_tudp3130
http_port_ttcp6666, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_ttcp5988


pegasus_https_port_ttcp5989 linux系统---selinux
文章图片
[root@localhost ~]# systemctl restart httpd(刷新成功,端口修改成功)


【linux系统---selinux】

    推荐阅读