一、工作原理
SELinux是通过MAC (强制访问控制) 的方式来控制管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源。
主体(
subject
):就是进程
目标(
object
):被主体访问的资源,可以是文件、目录、端口等。
策略(
policy
):由于进程与文件数量庞大,因此
SELinux
会依据某些服务来制定基本的访问安全策略。
这些策略内还会有详细的规则(
rule
)来指定不同的服务开放某些资源的访问与否。目前主要的策略有:
targeted
:针对网络服务限制较多,针对本机限制较少,是默认的策略;
strict
:完整的
SELinux
限制,限制方面较为严格。
安全上下文(
security context
):对文件的访问限制,确保文件资源只能被所属的服务器访问。
最终文件的成功访问还是与文件系统的
rwx
权限设置有关 。
格式: user : role : type [ :level ]
查看上下文
[root@server ~]# ls -Zsystem_u:object_r:admin_home_t:s0 anaconda-ks.cfg[root@server ~]# ll -Z
总用量 4
-rw-------. 1 root root system_u:object_r:admin_home_t:s0 994 11月 2 17:32 anaconda-ks.cfg
分析 system_u:object_r:admin_home_t:s0 用冒号分为四个字段:身份标识( Identify ):相当于账号方面的身份标识,主要有以下三种常见的类型:root :表示 root 的账号身份;system_u :表示程序方面的标识,通常就是进程;unconfined_u :代表的是一般用户账号相关的身份。角色( role ):通过角色字段,可知道这个数据是属于程序、文件资源还是代表用户。一般角色有:object_r :代表的是文件或目录等文件资源;system_r :代表的是进程。类型( type ):在默认的 targeted 策略中, Identify 与 role 字段基本上是不重要的,重要的在于这个类型字段。而类型字段在文件与进程的定义不太相同,分别是:type :在文件资源上面称为类型。domain :在主体程序中则称为域。domain 需要与 type 搭配,则该程序才能够顺利读取文件资源。灵敏度:一般用 s0 、 s1 、 s2 来命名,数字代表灵敏度的分级。数值越大、灵敏度越高。
二、selinux的配置
1.三种配置模式
enforcing :强制模式,启用 SELinux ,将拦截服务的不合法请求permissive :宽容模式,启用 SELinux ,遇到服务越权访问时,只发出警告而不强制拦截disabled :关闭模式, SELinux 没有运行
原理图:
三种模式的切换:
临时关闭
[root@server ~]# setenforce 0 # 临时关闭selinux,转为宽容模式,重启系统失效
[root@server ~] # getenforcePermissive[root@server ~] # setenforce 1 # 临时开启 selinux ,转为强制模式,重启失效[root@server ~] # getenforceEnforcing永久关闭[root@server ~] # vim /etc/selinux/configSELINUX = disabled[root@server ~] # reboot
注意:
enforcing与permissive之间切换时,需要重启系统
enforcing、permissive与disabled之间切换时,必须重启系统才会生效
2.修改安全上下文
chcon命令
方法一:
chcon [-R] [-t type] [-u user] [-r role] 文件名-R :递归修改,当前目录及目录下的所有文件都同时设置-t :后面接安全上下文件的类型字段(重要)-u :后面接身份标识-r :后面接角色-v :显示变动结果方法二:chcon -R --reference = 范例文件 文件名
restorecon命令
让文件的 SELinux 类型恢复为默认的 SELinux 类型默认的 SELinux 类型与 semanage 命令有关,其参考 semanage 命令所查询的默认 SELinux 类型restorecon [-Rv] 文件或目录-R :连同子目录一起修改;-v :将过程显示到屏幕上
semanage命令
用于管理 SELinux 的策略 ,查询/修改/增加/删除文件的默认SELinux安全上下文 , 管理网络端口、消息接口等
格式:
semanage 选项 参数 文件选项: login|user|port|interface|==fcontext==|translation|boolean ,注意: fcontext查询默认安全上下文 ( 重要 )-l : 查询;-a : 添加-m : 修改-d : 删除-D : 全部删除-t : 类型-r : 角色-s : 用户-f : 文件
添加8888端口为服务端口:

3.综合实验
(1)在enforing模式下,nginx修改资源目录,并实现页面正常访问
客户端测试:
(2)在enforing 模式下,nginx的端口号被修改,并是实现页面正常访问
客户端测试:
删除6666端口:
(3)在enforing 模式下,演示ssh端口号修改的selinux设定
测试: