系统安全评级:D(安全性最低) < C1 < C2 < B1 < B2 < B3 < A1(安全性最高)。
Linux 安全性与 Windows 在不开启防御措施时一致,系统安全评级为 C2 级别。创造者:美国国家安全局(National Security Agency,简写为 NSA)。
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。
SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。
SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。
如果可以熟练掌握 SELinux 并正确运用,我觉得整个系统基本上可以到达"坚不可摧"的地步了(请永远记住没有绝对的安全)。掌握 SELinux 的基本概念以及简单的配置方法是每个 Linux 系统管理员的必修课。
SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制 (MAC)系统。对于目前可用的 Linux 安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。
大部分使用 SELinux 的人使用的都是 SELinux 就绪的发行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian 或 Gentoo。它们都是在内核中启用 SELinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 SELinux 的功能。
SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。
众所周知,标准的UNIX安全模型是"任意的访问控制"DAC。就是说,任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他!
而MAC情况下的安全策略完全控制着对所有资源的访问。这是MAC和DAC本质的区别。
SELinux提供了比传统的UNIX权限更好的访问控制。
Linux 的安全性
《关于UNIX的安全》“首先要面对的事实是,UNIX的开发者并没有考虑安全问题,单单这一点就会引发大量的漏洞。”——Dennis Ritchie。
Linux 的护城河
iptables;SELinux;ACL;Tcp Wrappers(简单防火墙)。
SELinux 评价:现今为止人类能够找到的最安全的软件之一,当然配置也较为复杂。

有这么一套规则体系,当主体访问客体的时候必须要经过规则库,并且是实现防篡改,无旁路,可验证的特性。
在传统的操作系统下,使用的任意访问控制,只要满足 rwx 权限对应的关系就可以做对应的事情,即满足 r 可读,w 可写,x 可执行。当开启了强制访问控制,当权限即使是 777 也不行,需要经过规则库的判断,判断主体和客体之间是否有关系。
特性: 提高了 Linux 系统内部的安全等级,对于进程和用户只赋予最小权限,并且防止了权限升级, 即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响
SELinux 原理

PROCESS TYPES 进程类型;OBJECT TYPES 对象类型;
SELinux 原理 - 类型强制

顾名思义,当DOG要吃 CAT_CHOW 这个时候 KERNEL 内核就会将其拒绝。反之,CAT 要吃 DOG_CHOW 的时候KERNEL 内核就会将其拒绝。也就是主体 和 客体之间是存在一定的联系的。
SELinux 原理 - MCS 多类型强制

小总结:
Linux 的安全性不比 Windows 高,Linux 的提高安全性工具:IPtables,TCP wrappers,ACL,SElinux。SElinux 则是通过主体,客体,规则库进行匹配。
SELinux 是一套基于令牌的访问控制。SELinux 中的主体要想访问客体,必须要使用令牌,令牌匹配成功时候才能允许访问,而令牌匹配不成功那么就不允许访问。在 SELinux 中令牌,是叫做安全上下文。
所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的。在SELinux中, 访问控制属性叫做安全上下文。所有客体(文件、进程间通讯通道、套接字、网络主机等,资源)和主体(进程,要求资源)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文:
用户:角色:类型
# 只要在传统Linux里只要类型一致即可,用户和角色是可以不考虑的
开启SELinux 功能
$ vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# enforce - SELinux安全策略强制执行。
# permissive - SELinux prints warnings instead of enforcing.
# permissive - SELinux打印警告而不是强制。
# disabled - No SELinux policy is loaded.
# disabled — 没有加载SELinux策略。
#开启SELinux功能
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# 有针对性的进程受到保护。
# minimum - Modification of targeted policy. Only selected processes are protected.
# 修改有针对性的策略。只有选定的进程受到保护。
# mls - Multi Level Security protection.
# 多级安全保护。
#SELinux的类型
SELINUXTYPE=targeted
$ getenforce
Enforcing
#临时的关闭和开启SELinux功能
$ setenforce 0 #关闭
$ setenforce 1 #开启
#开启Httpd服务
$ yum install -y httpd && systemctl enable --now httpd
#编写一个网站并进行访问
$ echo "This is the apache server" > /var/www/html/index.html
$ curl 127.0.0.1
This is the apache server
主机通过浏览器访问

$ mkdir -pv /www
$ vim /etc/httpd/conf/httpd.conf
#修改为新的目录
DocumentRoot "/www"
#修改为新的目录
<Directory "/www">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
#重启服务
$ systemctl restart httpd
$ echo "This is Server 123" > /www/index.html
$ chmod -R 777 /www/
$ ls -l /www/
total 4
-rwxrwxrwx. 1 root root 19 Sep 4 14:34 index.html
主机通过浏览器访问

将Apache Server 的SELinux 功能关闭
setenforce 0

将Apache Server 的SELinux 功能开启并查看SELinux
#原ApacheServer的网页目录
$ ls -lZ /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
#用户:角色:类型:系统分配的等级(不需要管理员管理)
$ ls -lZ /www/
-rwxrwxrwx. root root unconfined_u:object_r:default_t:s0 index.html
#发现类型是不一致的
#修改类型
chcon [-R] [-t type] [-u user] [-r role] 文件
-R :连同该目录下的次目录也同时修改;
-t :后面接安全性本文的类型字段!
-u :后面接身份识别,例如 system_u;
-r :后面接角色,例如 system_r;
范例:
# -R:递归
$ chcon -t httpd_sys_content_t -R /www/
$ ls -lZ /www/
-rwxrwxrwx. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
$ setenforce 1
$ getenforce
Enforcing
## 在SELinux 用户,角色,类型中管理员需要在应用程序的官方说明文档中有展现
## 或者在 SELinux 官方文档中查找。
客户端可以正常访问

在大部分环境(生产环境)中都不会开启 SELinux 的强制访问控制功能。
当开启 SELinux 功能的环境中,当网站需要上传文件,那么就会出现上传文件的SELinux类型和系统的SELinux类型不匹配,从而造成不能使用的情况。或许有管理员会想写一个定时任务跑脚本递归该目录下的文件,修改其SELinux的类型,但这样会严重损耗机器的资源性能。所以在环境中一般不会开启该功能。
restorecon 还原成原有的 SELinux type
格式:restorecon [-Rv] 档案或目录
-R :连同次目录一起修改;
-v :将过程显示到屏幕上
范例:
$ 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
客户端再次通过浏览器访问

Managing Boole(管理 SElinux 布尔值):SELinux 给管理员提供SELinux 布尔值 特殊权限的开关,精确控制 SElinux 对某个服务的某个选项的保护,就可以达到某种权限的控制,比如 samba 服务。
getsebool -a
# 命令列出系统中可用的 SELinux 布尔值。
setsebool
# 命令用来改变 SELinux 布尔值
范例:
$ getsebool -a | head
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files --> off
$ getsebool -a | wc -l
316
## 查看Samba 的布尔值
$ getsebool -a | grep samba
bacula_use_samba --> off
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_load_libgfapi --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
tmpreaper_use_samba --> off
use_samba_home_dirs --> off
virt_use_samba --> off
#10.0.0.101作为Samba服务器
#安装 samba 软件
yum install -y samba
#创建系统用户
useradd zhangsan && useradd lisi
echo "123456" | passwd --stdin zhangsan &> /dev/null
echo "123456" | passwd --stdin lisi &> /dev/null
#将系统用户转变为Samba用户
#echo -e "123456\n123456" | pdbedit -a zhangsan
#echo -e "123456\n123456" | pdbedit -a lisi
pdbedit -a zhangsan
pdbedit -a lisi
#创建目录
mkdir -pv /samba ; chmod -R 777 /samba
#修改配置文件
$ vim /etc/samba/smb.conf
[pulic]
comment = Share Stuff
path = /samba
public = yes
writable = yes
#开启服务,并拷贝一些文件
systemctl enable --now smb
# service smb start && chkconfig smb on
cp -a /var/log/*.log /samba/
#10.0.0.102作为Samba客户端
#安装 samba 软件
$ yum install -y samba samba-client
$ smbclient -U zhangsan -L 10.0.0.101
Enter SAMBA\zhangsan's' password:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
pulic Disk Share Stuff
IPC$ IPC IPC Service (Samba 4.10.16)
zhangsan Disk Home Directories
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
#登录查看,发现没有文件(可能是SELinux功能在工作)
$ smbclient -U zhangsan //10.0.0.101/pulic
Enter SAMBA\zhangsan's' password:
Try "help" to get a list of possible commands.
smb: \> ls
NT_STATUS_ACCESS_DENIED listing \*
#关闭10.0.0.101机器的SELinux后,再次登录查看
$ smbclient -U zhangsan //10.0.0.101/pulic
Enter SAMBA\zhangsan's' password:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sun Sep 4 15:02:06 2022
.. D 0 Sun Sep 4 14:57:50 2022
boot.log N 24559 Sun Sep 4 14:25:26 2022
vmware-network.1.log N 715 Thu Sep 1 00:36:32 2022
vmware-network.2.log N 719 Thu Aug 11 20:23:56 2022
vmware-network.3.log N 719 Wed Dec 15 19:56:58 2021
vmware-network.4.log N 715 Fri Dec 3 22:20:38 2021
vmware-network.5.log N 715 Thu Dec 2 21:19:42 2021
vmware-network.6.log N 715 Thu Dec 2 20:29:51 2021
vmware-network.7.log N 719 Sun Jul 11 22:50:02 2021
vmware-network.log N 715 Thu Sep 1 20:34:51 2022
vmware-vmsvc-root.log N 1719806 Sun Sep 4 15:01:48 2022
vmware-vmtoolsd-root.log N 1740 Sun Sep 4 14:25:18 2022
wpa_supplicant.log N 360 Sun Sep 4 14:25:33 2022
Xorg.0.log N 30346 Sun Sep 4 14:25:33 2022
Xorg.9.log N 22030 Sun Jul 11 22:50:18 2021
yum.log N 1763 Sun Sep 4 14:53:14 2022
104806400 blocks of size 1024. 100481984 blocks available
将10.0.0.101机器的SELinux开启,然后在修改其类型
$ ls -lZ /samba/ | head -n 1
-rw-------. root root system_u:object_r:plymouthd_var_log_t:s0 boot.log
$ chcon -R -t samba_share_t /samba/
$ setenforce 1
#10.0.0.102机器就可以正常的访问下载文件了
$ smbclient -U zhangsan //10.0.0.101/pulic
Enter SAMBA\zhangsan's' password:
Try "help" to get a list of possible commands.
smb: \> get yum.log
getting file \yum.log of size 1763 as yum.log (573.9 KiloBytes/sec) (average 573.9 KiloBytes/sec)
smb: \> exit
$ ls -l yum.log
-rw-r--r--. 1 root root 1763 Sep 4 15:10 yum.log
需求:两个用户到自己的家里只能读(下载)不能上传
#传统方式就是将家目录的权限进行更改,这样就带来另一个问题,需求是只想 Samba 中这样实现,在真正的系统中,依旧是可以进行基本的读写操作的。
#SELinux 布尔值
#查看SELinux布尔值
$ 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_load_libgfapi --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
tmpreaper_use_samba --> off
use_samba_home_dirs --> off
virt_use_samba --> off
#在该需求则执行
$ setsebool -P samba_export_all_ro on
$ getsebool -a | grep samba_export_all_ro
samba_export_all_ro --> on
#开启家目录是否能访问的控制
# setsebool –p samba_enable_home_dirs=1
测试
# 10.0.0.101执行
$ echo "Hello SELinux" > /home/zhangsan/smb.txt
# 10.0.0.102执行下载
$ smbclient -U zhangsan //10.0.0.101/zhangsan
Enter SAMBA\zhangsan's' password:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sun Sep 4 15:20:22 2022
.. D 0 Sun Sep 4 14:54:56 2022
.mozilla DH 0 Sun Jul 11 22:38:51 2021
.bash_logout H 18 Wed Apr 1 10:17:30 2020
.bash_profile H 193 Wed Apr 1 10:17:30 2020
.bashrc H 231 Wed Apr 1 10:17:30 2020
smb.txt N 14 Sun Sep 4 15:20:22 2022
104806400 blocks of size 1024. 100480468 blocks available
smb: \> get smb.txt
getting file \smb.txt of size 14 as smb.txt (2.7 KiloBytes/sec) (average 2.7 KiloBytes/sec)
smb: \> exit
$ ls -l smb.txt
-rw-r--r--. 1 root root 14 Sep 4 15:21 smb.txt
# 10.0.0.102进行上传
$ smbclient -U zhangsan //10.0.0.101/zhangsan
Enter SAMBA\zhangsan's' password:
Try "help" to get a list of possible commands.
smb: \> put yum.log
NT_STATUS_ACCESS_DENIED opening remote file \yum.log