SElinux概述:
SElinux(Security-enhanced Linux)是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,selinux称为内核级加强型防火墙;selinux的目的在于明确的指明某个进程可以访问那些资源(文件,网络端口等);传统linux中的文件,由用户、组、权限控制访问,而在selinux中的对象,由存在inde表的扩展属性域的安全元素所控制其访问。其主要作用就是最大限度地减小系统中服务进程可访问的资源。
1.selinux的状态的设定
(1)selinux的三种状态:
Enforcing #强制模式,selinux已启动
permissive #警告模式,selinux已启动,有提示警告信息,但不会禁止
Disabled #关闭模式,关闭selinux
(2)selinux的状态的修改:
临时性修改:
setenforce 0 #设置selinux的状态为permissive
setenforce 1 #设置selinux的状态为Enforcing
注意:此方法只能实现 permissive 状态 和 Enforcing 状态之间的转换
即当selinux的状态为 Disabled 时,用此方法不能更改为 permissive 状态或 Enforcing状态
永久性修改:
通过修改配置文件来更改selinux的状态
具体操作步骤如下
getenforce #查看selinux的状态
vim /etc/sysconfig/selinux #编辑配置文件,将Disabled改为Enforcing
reboot #必须重启,否则不生效
getenforce #查看selinux的状态是否更改成功
2.selinux安全上下文的管理
ls -Z filename #查看某个文件的安全上下文
chcon -t public_content_t filename #更改某个文件的安全上下文的类型为public_content_t
semanage fcontext -a -t public_content_t '/westos(/.*)?' #-a 添加;-t 类型;(/ 本身内容;.* 所有隐藏文件;)
配置环境:
做实验之前,最好先重置虚拟机,以保持纯净的实验环境
注意:重置虚拟机后需要设定ip以及配置yum源
getenforce #查看selinux的状态是否为Enforcing
##如果不是,则需要将selinux的状态永久性设定为Enforcing
yum install lftp #安装lftp服务
yum install vsftpd lftp -y #安装ftp服务
systemctl start vsftpd #开启ftp服务
systemctl enable vsftpd #开机自启动
systemctl stop firewalld #关闭火墙
systemctl disable firewalld #开机自动关闭
(1)临时性更改
实验:
touch /mnt/westos3
mv /mnt/westos3 /var/ftp/ #移动文件
ls /var/ftp/ #查看文件
lftp 172.25.254.230
ls #查看不到外来文件westos3
**************
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
quit
cd /var/ftp
touch file1
lftp 172.25.254.230
ls #可以查看到file1
****************
-rw-r--r-- 1 0 0 0 May 12 02:03 file1
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
quit
##说明连接lftp时 ls查看的是默认目录/var/ftp里的内容,并且它只能查看到该在该默认目录中建立的文件,
即无法查看到外来文件
ls -Z #查看所有文件的安全上下文
****************
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 file1
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 pub
-rw-r--r--. root root unconfined_u:object_r:mnt_t:s0 westos3
semanage fcontext -l | grep /var/ftp #内核记录过的安全上下文
****************
/var/ftp(/.*)? all files system_u:object_r:public_content_t:s0
........
ls
chcon -t public_content_t westos3 #更改westos3文件的安全上下文的类型为public_content_t
ls -Z westos3 -d #查看westos3的安全上下文的类型是否更改成功
*********************
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westos3
lftp 172.25.254.230
ls #可查看到westos3
********************
-rw-r--r-- 1 0 0 0 May 12 02:03 file1
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
-rw-r--r-- 1 0 0 0 May 12 02:02 westos3
quit
mkdir /westos
touch /westos/westosfile
lftp 172.25.254.230
ls #查看不到,默认只能查看到/var/ftp
quit
vim /etc/vsftpd/vsftpd.conf
#########
添加 anon_root=/westos #更改lftp的默认目录为/westos
systemctl restart vsftpd
lftp 172.25.254.230
ls
quit
setenforce 0 #警告
lftp 172.25.254.230
ls
******************
-rw-r--r-- 1 0 0 0 May 12 02:24 westosfile
quit
ls -Z /westos -d #查看westos的安全上下文的类型
*****************
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /westos
chcon -t public_content_t /westos -R #修改westos的安全上下文的类型
ls -Z /westos -d #查看
*****************
drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 /westos
测试:
vim /etc/sysconfig/selinux ##相当于重启selinux
#############
SELINUX=disabled #将selinux的状态改为disabled
reboot
vim /etc/sysconfig/selinux
############
SELINUX=enforcing #将selinux的状态改为enforcing
reboot
ls -Z /westos/ -d #查看
******************
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /westos/
#/westos的安全上下文的类型还原为idefault_t
##说明chcon -t public_content_t westos3 只是临时性更改安全上下文的类型
(2)永久性更改
实验:
ls -Zd /westos/ ##对比一下/westos/ 和 /var/ftp/
****************
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /westos/
ls -Zd /var/ftp/
****************
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /var/ftp/
semanage fcontext -l | grep /var/ftp #有(/.*)?
******************
/var/ftp(/.*)? all files system_u:object_r:public_content_t:s0
semanage fcontext -l | grep /westos/ #没有(/.*)?
semanage fcontext -a -t public_content_t '/westos(/.*)?' 将 public_content_t 添加到 /westos 及 其子文件中
semanage fcontext -l | grep /westos #查看是否更改成功
##有(/.*)? 说明添加成功
********************
/westos(/.*)? all files system_u:object_r:public_content_t:s0
restorecon -FvvR /westos/ #必须刷新,否则不生效
ls -Z /westos/ -d #查看是否更改成功
*******************
drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 /westos/
测试:
lftp 172.25.254.230
ls
*****************
-rw-r--r-- 1 0 0 0 May 12 01:59 westosfile
quit
touch /.autorelabel #建立/.autorelabel文件,相当于重启selinux
reboot
ls -Zd /westos/ #再次查看
***************
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /westos/
#/westos的安全上下文的类型任为public_content_t
##说明semanage fcontext -a -t public_content_t '/westos(/.*)?'
是永久性更改安全上下文的类型
3.管理linux布尔值
setenforce 0 #有警告,但操作不会被阻止
setenforce 1 #禁止,操作会被阻止
getsebool -a |grep ftp #查看目前系统上面的所有布尔值条款
setsebool -P ftp_home_dir on #打开ftp的布尔值
实验:
将setenforce的值更改为1时,上传也会成功但不安全,所以选择更改布尔值
useradd westos
passwd westos
touch /etc/group
lftp 172.25.254.230 -u westos
ls
put /etc/group #上传失败
***************
put: Access failed: 553 Could not create file. (group)
quit
getsebool -a |grep ftp #查看目前系统上面的所有布尔值条款
**************
ftp_home_dir --> off
setsebool -P ftp_home_dir on #打开ftp的布尔值
getsebool -a |grep ftp #再次查看
**************
ftp_home_dir --> on
测试:
lftp 172.25.254.230 -u westos
put /etc/group #上传成功
ls
***************
-rw-r--r-- 1 1001 1001 878 May 12 03:54 group
quit
4.selinux日志的管理
/var/log/audit/audit.log #记录selinux的日志,
##会说明错误,但不会提供解决方法,且阅读复杂
/var/log/messages #记录selinux的日志,
##可以详细的记录错误,并且可提供解决方法
具体操作步骤如下:
vim /etc/vsftpd/vsftpd.conf #恢复ftp默认目录为/var/ftp/
###########
删除 anon_root=/westos
systemctl restart vsftpd #重启ftp服务
touch /mnt/westos1
mv /mnt/westos1 /var/ftp/
> /var/log/audit.log #清空日志
> /var/log/messages
cat /var/log/messages
ls -Z /var/ftp/westos1
在firefox浏览器中输入ftp://172.25.254.230 ##测试出现问题,看不到刚建立的wetos1文件,因为它的安全上下文与/var/ftp不一致
cat /var/log/audit/audit.log ##可查看到selinux的日志
cat /var/log/messages ##可查看到解决方案
##此解决方案来自 setroubleshoot-server-3.2.17-2.el7.x86_64
*************
Then execute:
restorecon -v '$FIX_TARGET_PATH'
restorecon -v /var/ftp/* #修改文件为能访问的默认标签
ls -Z /var/ftp/westos1 #可以看到westos1的安全上下文已经被修改
此时在firefox浏览器中输入ftp://172.25.254.230测试,便可查看到刚才建立的westos1文件
yum remove setroubleshoot-server-3.2.17-2.el7.x86_64 #卸载
touch /mnt/file2
mv /mnt/file2/var/ftp
> /var/log/messages #清空日志
> /var/log/audit/audit.log
cat /var/log/messages
在firfox里测试出现问题,看不到刚建立的file2文件
cat /var/log/audit/audit.log #记录selinux的日志
cat /var/log/messages #此时看不到解决方案
yum install setroubleshoot-server-3.2.17-2.e17.x86_64
cat /var/log/messages #又可查看到解决方案
##说明此解决方案来自 setroubleshoot-server-3.2.17-2.el7.x86_64软件
5.修改进程访问的端口号
semanage port -l | grep 服务名称 #查看某个服务的端口
semanage port -a -t 类型 -p 协议 端口号 #添加某个端口号为指定服务的访问端口
例如:semanage port -l | grep http #查看http服务的端口
semanage port -a -t http_port_t -p tcp 6666 #添加6666为http_port_t服务的访问端口
实验:
yum install httpd #安装阿帕启
#如果安装不了,则是yum源有问题,需要重新配置虚拟机的yum
vim /etc/httpd/conf/httpd.conf
############
42 修改为 Listen 6666
systemctl restart httpd ##会报错
**************
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
getenforce #查看selinux的状态
setenforce 0 #警告
systemctl restart httpd #重启成功
semanage port -l | grep http #查看http的端口
******************
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
semanage port -a -t http_port_t -p tcp 6666 #添加 6666为http_port_t服务的访问端口
测试:
semanage port -l | grep http #查看是否添加成功
******************
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 6666, 80, 81, 443, 488, 8008, 8009, 8443, 9000 #添加成功
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
setenforce 1 #强制
systemctl restart httpd #重启成功
##说明 selinux 会影响服务所使用的资源