selinux讲解
Selinux讲解
1、selinux的概述
Selinux的历史
- Linux安全性与windows在不开启防御措施的时候是一样的;
- 同样是C2级别的安全防护
- 安全级别评定:
- D–>C1–>C2–>B1–>B2–>B3–>A1
- D级,最低安全性
- C1级,主存取控制
- C2级,较完善的自主存取控制(DAC)
- B1级,强制存取控制(MAC)
- B2级,良好的结构化设计、形式化安全模型
- B3级,全面的访问控制、可信恢复
- A1级,形式化认证
- D–>C1–>C2–>B1–>B2–>B3–>A1
selinux的实现模型:
Selinux创造者:美国国家安全局(NationalSecurityAgency,简写为NSA)
- 主题:一个进程访问一个文件
- 相当于这个进程就是主题
- 客体:被进程访问的文件
- 规则体系:
- 强制访问规则
- 要求:防篡改、无旁路、可验证
Selinux在Linux中的地位变化
- 需要手动加载的一个外部模块
- 直接写到内核的一个模块
- 成为一部分Linux发行版本的内核中的一部分
- 特性:
- 提高了 Linux 系统内部的安全等级,对于进程和用户只赋予最小权限,并且防止了权限升级即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响
selinux的原理理解
- 类型强制访问控制:
- 主体和客体是存在一定的联系的
- 例如–>猫吃猫粮,狗吃狗粮–>不能互吃
- 多类型强制
- 如果规则库允许上面的例子是可以互吃的;
2、安全上下文介绍
安全上下文的定义
- 所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的;
- 在SELiux中访问控制属性叫做安全上下文;
- 所有客体(文件、进程间通讯通道、套接字、网络主机等》和主体(进程》都有与其关联的安全上下文;
- 一个安全上下文由三部分组成:
- 用户;
- 角色;
- 类型标识符;
- 安全上下文的格式:用户:角色:类型
chcon命令
- 作用:配置安全上下文的命令
- 语法:chcon +选项 【-t 类型】 【-u 用户】 【-r 角色】+文件
- 选项:
- -R:连同该目录下的此目录也同时修改
- -t:指定安全性文本的类型字段
- -u:指定身份识别–>system_u
- -r:后面跟的是角色–>system_r
restorecon命令
- 作用:还原成原有的selinux type
- 语法: restorecon +【RV】 文件或者目录
- 选项:
- -R:连同此目录一起修改(递归修改)
- -v:显示过程;
setenforce命令
- 作用:设置selinux的开关
- 语法:selinux 0|1
- 0:代表关闭
- 1:代表开启
getenforce命令
- 作用:查看selinux的状态
- 语法:selinux
实验演示selinux
#永久修改selinux关闭的文件
[root@node1 ~]# vim /etc/selinux/config #这里就注意一个选项
SELINUX=enforcing#三种模式-->enforcing:打开模式-->permissive:可以调试的模式-->disabled:关闭模式
#selinux的开通与关闭和配置文件有关系-->如果打开了selinux的话,开机会明显变慢;#如果disabled的状态,命令是无法调用内核的selinux模块的;#安装一个httpd服务
[root@node1 ~]# echo 11111 > /var/www/html/index.html#然后修改主页
[root@node1 ~]# echo 11111 > /var/www/html/index.html#然后启动
[root@node1 ~]# service httpd start#开启selinux
[root@node1 ~]# setenforce 1
#这时候可以直接访问-->可以访问到自己看到的页面
http://192.168.75.11/#然后把httpd服务的默认页面修改到/www#创建一个/www-->创建默认页面
[root@node1 ~]# mkdir /www
[root@node1 ~]# echo 222222222 >/www/index.html
[root@node1 ~]# chmod 777 /www/index.html #直接关闭iptables
[root@node1 ~]# service iptables stop
#以上的配置足以说面正常的安全防护都已经全部开了-->为了看selinux的效果#然后直接修改httpd的配置文件-->直接让默认页面去到-->/www/index.html
[root@node1 ~]# vim /etc/httpd/conf/httpd.conf
................292 DocumentRoot "/www" #修改了默认路径.......317 <Directory "/www">
#重启-->然后访问
[root@node1 ~]# service httpd restart#访问会直接跳转到apache的默认页面
http://192.168.75.11/#从这里可以说明-->防火墙关了、权限关了;-->但是任然看不到就是selinux的问题#查看文件的角色和类型-->很明显不相同
[root@node1 ~]# ll -Z /var/www/html/index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
[root@node1 ~]# ll -Z /www/index.html
-rwxrwxrwx. root root unconfined_u:object_r:default_t:s0 /www/index.html#修改文件的用户角色类型
[root@node1 ~]# chcon -t httpd_sys_content_t -R /www/#再次访问-->访问成功了#关闭selinux-->还原文件
[root@node1 ~]# setenforce 0
[root@node1 ~]# restorecon -Rv /www/
restorecon reset /www context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:default_t:s0
restorecon reset /www/index.html context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:default_t:s0
3、selinux的布尔值
Managing Boole(管理Selinux布尔值):
- Selinux布尔值就相当于一个开关;精确控制SElinux对某个服务的某个选项的保护;
#查看selinux对服务的文件的布尔值
[root@localhost ~]# getsebool -a | grep samba
samba_create_home_dirs --> off
samba_domain_controller --> off
samba_enable_home_dirs --> off
samba_export_all_ro --> off
samba_export_all_rw --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
use_samba_home_dirs --> off
virt_use_samba --> off
getsebool -a
- 作用:命令列出系统中可用的Selinux布尔值
- 语法:getsebool+选项
- 选项:
- -a:查看全部
setsebool命令 :
- 作用:用于改变selinux的布尔值
- 语法:sesebool+选项
#开启samba家目录是否能访问的控制#安装samba
[root@node1 ~]# yum -y install samba#创建两个用户
[root@node1 ~]# useradd zhangsan
useradd: user 'zhangsan' already exists
[root@node1 ~]# echo 123456 | passwd --stdin zhangsan
[root@node1 ~]# useradd lisi
useradd: user 'lisi' already exists
[root@node1 ~]# echo 123456 | passwd --stdin lisi
Changing password for user lisi.
passwd: all authentication tokens updated successfully.#把这两个用户转换到samba用户
[root@node1 ~]# pdbedit -a zhangsan
new password:
retype new password:
[root@node1 ~]# pdbedit -a lisi#创建samba的共享目录
[root@node1 ~]# mkdir /samba
[root@node1 ~]# chmod 777 /samba/#修改samba的配置文件
[root@node1 ~]# vim /etc/samba/smb.conf#指定认证的等级security = userpassdb backend = tdbsam#在末行添加共享规则
[public]
comment = Public Stuff
path = /samba
public = yes
writable = yes#启动samba-->创建文件
[root@node1 ~]# service smb start
Starting SMB services: [ OK ]
[root@node1 ~]# touch /samba/{1..5}.txt
[root@node1 ~]# chmod 777 -R /samba/*
#开启selinux
[root@node1 ~]# setenforce 1#这里使用-->另外一台主机登陆samba
[root@node2 ~]# smbclient -U zhangsan //192.168.75.11/public
Enter zhangsan's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]#这里查看发现没有文件
smb: \\> ls
NT_STATUS_ACCESS_DENIED listing \\*#如果想看的话还是得修改samba的文件类型修改
[root@node1 ~]# ll -Z /samba/
-rwxrwxrwx. root root unconfined_u:object_r:default_t:s0 1.txt
..........#直接开启
[root@node1 ~]# chcon -t samba_share_t -R /samba/#再次访问就成功了
[root@node2 ~]# smbclient -U zhangsan //192.168.75.11/public
Enter zhangsan's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \\> ls. D 0 Tue Feb 7 04:53:23 2023.. DR 0 Tue Feb 7 04:48:30 2023#查看selinux的布尔值
[root@node1 ~]# getsebool -a | grep samba
samba_create_home_dirs --> off
samba_domain_controller --> off
samba_enable_home_dirs --> off
samba_export_all_ro --> off
samba_export_all_rw --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
use_samba_home_dirs --> off
virt_use_samba --> off#这里可以实现上传和下载隔离需求
#设置布尔值:
[root@node1 ~]# setsebool -P samba_export_all_ro on