SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。
SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个【用户】、【进程】、【应用】和【文件】的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查。
1.对内核对象和服务的访问控制
2.对进程初始化,继承和程序执行的访问控制
3.对文件系统,目录,文件和打开文件描述的访问控制
4.对端口,信息和网络接口的访问控制
在linux里所有的文件和进程都有一个值,这个值被称为安全值,当我满足或者匹配到这个安全值,那么才能进行访问。(http默认目录是在/var/www/html当我将这个默认的访问目录更改时你默认创建的 目录对应性另一个安全值,而我们默认访问的就是第一种安全值所以如果开启了selinux则不能访问更改后目录的东西)-------安全子系统
服务---selinux ---tcp_warpper --iptable/firewalld---硬件里
selinux级别
enforcing: 强制(一定会生效)违反策略的行动都会被禁止
permissive: 允许,警告
disable: 禁用类似于没有selinux功能的系统
级别切换
禁用<-->强制:下次启动生效
禁用<-->警告:下次启动生效
强制<-->警告:即时生效
在将selinux的模式改为强制访问模式后重启会特别慢的原因……selinux在操作系统的安全体制结构上进行扩张,增强对进程模块文件打上了一些安全标记
SELINUX配置文件
/etc/selinux/config
#查看级别
[root@web ~]# getenforce
#使用命令行切换级别
setenforce 0
setenforce 1
#修改级别
#直接编辑/etc/selinux/config
SELINUX=enforcing
#修改完成后重启才能生效
#查看selinux状态
[root@web ~]# sestatus
#查看selinux值
[root@web ~]# ll -Z
#查看context值的变化
[root@web ~]# touch 1
[root@web ~]# cp 1 /tmp
[root@web ~]# ll -Z /tmp
#该文件的context值会随着目录的作用和环境的不同而发生改变,该值会继承上一级目录的context值
system_u:object_r:admin_home_t:s0
这条语句通过:划分成了四段,第一段 system_u 代表的是用户,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home 表示的是类型,最后一段 s0 是跟MLS、MCS相关的东西,暂时不需要管
①system_u指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。
②object_robject_r一般为文件目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。
③admin_home文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限。
Touch /.autorelabel 系统当中默认启用了selinux,去读取一个去止文件,而这个文件里是否由内容他都要去读,读完之后它会给这些系统默认的文件设置安全值
#修改context值,所以如果没有这一步你么系统也跨不出这一步所以系统就不会正常启动
chcon -t context值的类型 文件名
[root@web ~]# chcon -t user_tmp_t 1
#改变目录的值需要加上-R选项,表示递归
chcon -t context值 directory -R
#恢复一个文件的context值
restorecon -v filename
[@web ~]# restorecon -v 1
[root@localhost ~]#
[root@localhost ~]# mkdir /test
[root@localhost ~]# touch file
[root@localhost ~]# ll -Z file
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 file
[root@localhost ~]# cp file /test
[root@localhost ~]# ll -Z /test
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 file
[root@localhost ~]# chcon -t admin_home_t /test/file
[root@localhost ~]# ll -Z /test/file
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /test/file
[root@localhost ~]# restorecon -v /test/file
restorecon reset /test/file context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:default_t:s0
[root@localhost ~]# ll -Z /test/file
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 /test/file
[root@localhost ~]#
#查看进程的context值
[root@web ~]# ps -Z
[root@localhost ~]# semanage port -l | grep "\b80\b"
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
案例一:
使用httpd服务演示context值得设定
如下:
#确保防火墙开启
[root@web ~]# systemctl status firewalld
#确保SELINUX开启
[root@web ~]# getenforce
[root@localhost ~]# sestatus
#创建web服务内容目录
[root@web ~]# mkdir -p /www/80
[root@web ~]# echo 'welcome to 80!!!' > /www/80/index.html
#修改主服务配置文件以下选项:
[root@web ~]# vi /etc/httpd/conf/httpd.conf
ServerName 192.168.40.131:80
#添加虚拟主机配置文件,并按如下进行配置
[root@web ~]# vi /etc/httpd/conf.d/vhosts.conf
<Directory "/www">
AllowOverride None
Require all granted
</Directory>
<VirtualHost 192.168.221.146:80>
DocumentRoot "/www/80"
</VirtualHost>
#如果在重启服务时,日志提示DNS解析失败时,按如下办法解决:
[root@web ~]# vi /etc/hosts
192.168.40.131 web
#如果有布尔值的提示,请输入以下命令进行处理
[root@web ~]# setsebool -P httpd_can_network_relay 1
#在防火墙中添加web服务的放行规则
[root@web ~]# firewall-cmd --permanent --add-service=http
[root@web ~]# firewall-cmd --reload
#通过浏览器进行访问,发现只能访问默认页,无法访问我们自定义的页面
#这时需要修改自定义目录的context值,如下:
[root@web ~]# chcon -t httpd_sys_content_t /www/ -R
#chcon --reference /var/www/html /www 或者根据参照目录进行更改
#无需重启http服务,即可通过浏览器进行正常访问
案例二:
使用web服务端口的改变来演示端口的设定
如下
#创建一个8888端口的web服务目录和默认页面
[root@web ~]# mkdir -p /www/8888
[root@web ~]# echo 'welcome to 8888!!!' > /www/8888/index.html
#在上个案例的页面中添加如下内容:
LISTEN 8888
<VirtualHost 192.168.40.131:8888>
DocumentRoot "/www/8888"
</VirtualHost>
#保存退出后,重启服务。
[root@web ~]# systemctl restart httpd
#tail -f /var/log/massge
#查看端口状态
lsof -i:8080
netstat -lntp | grep 8080
#然后通过浏览器查看该web页面是否能正常访问
#正常情况下,应该无法访问,首先,我们在防火墙添加允许该端口的策略
[root@web ~]# firewall-cmd --permanent --add-port=8080/tcp
[root@web ~]# firewall-cmd --reload
#添加该自定义端口为服务端口
[root@web ~]# semanage port -a -t http_port_t -p tcp 8888
#再通过浏览器进行查看该web服务,即可正常查看
布尔值
当你配置一个服务现在selinux也是开启的,所以你这个服务的有些功能是用不了的,而bool值相当于是一个开关,你把这个功能开关按上就好了
#查看布尔值
[root@web ~]# getsebool -a
#查看ftp相关的布尔值
[root@web ~]# getsebool -a | grep ftp
#设置布尔值
setsebool -P ftp_home_dir on
案例:
使用ftp服务演示布尔值的设定
开启vsftp服务,配置为本地用户允许读写家目录,不允许遍历其他目录
配置如下:
#添加防火墙允许策略
[root@web ~]# firewall-cmd --permanent --add-service=ftp
[root@web ~]# firewall-cmd --reload
[禁止匿名用户]
anonymous_enable=no
[禁止遍历]
#首先开启chroot选项
allow_writeable_chroot=YES
#打开chroot选项
chroot_list_enable=YES
#指定打开谁的CHROOT
chroot_list_file=/etc/vsftpd/chroot_list
#确保以下选项参数无误
local_enable=YES
write_enable=YES
Vim /etc/vsftpd/chroot_list
redhat
#修改布尔值打开/home目录的权限
[root@localhost haha]# getsebool -a | grep ftp_home_dir
ftp_home_dir --> off
[root@localhost haha]# setsebool -P ftp_home_dir on
#使用图形界面切换级别
安装policycoreutils-gui
执行system-config-selinux