Selinux (Security Enhanced Linux)
SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个【用户】、【进程】、【应用】和【文件】的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查
操作系统有两类访问控制:自主访问控制(DAC)和强制访问控制(MAC)。标准Linux安全是一种DAC,SELinux为Linux增加了一个灵活的和可配置的的MAC。
工作模式 # 决定SELinux机制的启动与否
enforcing ===>强制模式,SELinux已经启动
permissive===>宽容模式,SELinux已经启动,但不会禁止,只是会提出警告信息
disabled ===>关闭模式,关闭SELinux
工作类型(SELinux type) # 表示SELinux具体的安全性策略
strict ===>每个进程都受限制(仅在centos5)
targeted===>默认类型为targeted,主要限制网络服务
minimum ===>简化版的targetd,限制部分网络服务(centos7)
mls ===>多级安全限制,较为严格
安全上下文(security context):是主要修改的地方,进程必须和文件的安全上下文对应(不是必须一样)才能对其进行访问
安全上下文是 SELinux 的核心。
安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。
一个「进程安全上下文」一般对应多个「文件安全上下文」。
只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。
文件安全上下文由文件创建的位置和创建文件的进程所决定。而且系统有一套默认值,用户也可以对默认值进行设定。
需要注意的是,单纯的移动文件操作并不会改变文件的安全上下文
ls -Z 文件名 # 查看文件的安全上下文
ps -eZ # 查看进程的安全上下文
安全上下文的结构及含义
安全上下文有四个字段,分别用冒号隔开。如:unconfined_u:object_r:admin_home:s0
修改一个文件的context值
[root@localhost ~]# chcon -t admin_home /tmp/1
[root@localhost ~]# ll -Z /tmp/1
-rw-r–r–. root root unconfined_u:object_r:admin_home:s0 /tmp/1
[root@localhost ~]# ll -Z /tmp/1
-rw-r–r–. root root unconfined_u:object_r:admin_home:s0 /tmp/1
[root@localhost ~]# chcon -t user_tmp_t 1
恢复一个文件的context值
[root@localhost ~]# restorecon -v 1
restorecon reset /root/1 context unconfined_u:object_r:user_tmp_t:s0->unconfined_u:object_r:admin_home_t:s0
[root@localhost ~]# ll -Z /tmp/1
-rw-r–r–. root root unconfined_u:object_r:admin_home:s0 /tmp/1
案例一:
使用httpd服务演示context值得设定
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-08-13 01:48:12 EDT; 1h 54min ago
Docs: man:firewalld(1)
默认路径
[root@localhost ~]echo this is today > /var/www/html/index.html
[root@localhost ~]# mkdir -p /www/80
[[root@localhost ~] echo welcome to 80 > /www/80/index.html
[root@localhost ~]# vim /etc/httpd/conf.d/vhost.conf
[root@localhost ~]# systemctl restart httpd.service
[root@localhost ~]# firewall-cmd –permanent –add-service=http
success
[root@localhost ~]# firewall-cmd –reload
Success
通过浏览器进行访问,发现只能访问默认页,无法访问我们自定义的页面,这时需要修改自定义目录的context值,如下:
[root@localhost ~]# chcon –reference /var/www/html/ /www
或
[root@localhost ~]# chcon -t httpd_sys_content_t /www/ -R
案例二:
使用web服务端口的改变来演示端口的设定
创建一个8888端口的web服务目录和默认页面
[root@localhost ~]# mkdir -p /www/8888
[root@localhost ~]# echo welcom to 8888 >/www/8888/index.html
[root@localhost ~]# vim /etc/httpd/conf.d/vhost.conf
添加该自定义端口为服务端口
[root@localhost ~]# semanage port -a -t http_port_t -p tcp 8888
[root@localhost ~]# systemctl restart httpd.service
案例三
使用ftp服务演示布尔值的设定
开启vsftp服务,配置为本地用户允许读写家目录,不允许遍历其他目录
[root@localhost ~]firewall-cmd –permanent –add-service=ftp
[root@localhost ~]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
[root@localhost ~]Vim /etc/vsftpd/chroot_list
redhat
[root@localhost ~]systemctl restart vsftpd
[root@localhost ~]# getsebool -a | grep ftp
ftpd_anon_write –> off
ftpd_connect_all_unreserved –> off
ftpd_connect_db –> off
ftpd_full_access –> on
ftpd_use_cifs –> off
ftpd_use_fusefs –> off
ftpd_use_nfs –> off
ftpd_use_passive_mode –> off
httpd_can_connect_ftp –> off
httpd_enable_ftp_server –> off
tftp_anon_write –> off
tftp_home_dir –> on
[root@localhost ~]# setsebool -P ftpd_full_access=on
Tom用户
使用图形界面切换级别
安装
[root@localhost ~]yum install - y policycoreutils-gui
执行
[root@localhost ~]# system-config-selinux