一、SElinux简介
- SELinux是Security-Enhanced Linux的缩写,意思是安全强化的linux
- SELinux 主要由美国国家安全局(NSA)开发,当初开发的目的是为了避免资源的误用·
- 传统的访问控制在我们开启权限后,系统进程可以直接访问当我们对权限设置不严谨时,这种访问方式就是系统的安全漏洞
在开启SElinux后
- 会对进程本身部署安全上下文
- 会对文件部署安全上下文
- 会对服务使用端口进行限制
- 会对程序本身的不安全功能做限制
二、SElinux的工作原理
1.SElinux的工作方法
- SELinux是通过MAC的方式来控制管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源
- 主体(subject):就是进程
- 目标(object):被主体访问的资源,可以是文件、目录、端口等。
- 策略(policy):由于进程与文件数量庞大,因此SELinux会依据某些服务来制定基本的访问安全策略
- targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略
- strict:完整的SELinux限制,限制方面较为严格。
2.SElinux的安全上下文
安全上下文(security context):
- 主体能不能访问目标除了策略指定外,主体与目标的安全上下文必须一致才能够顺利访问。
- 最终文件的成功访问还是与文件系统的rwx权限设置有关
- 安全上下文的查看
[root@nfs-server ftp]# ls -Z
unconfined_u:object_r:public_content_t:s0 file
system_u:object_r:public_content_t:s0 pub
[root@nfs-server ftp]# ps axZ | grep vsftpd
system_u:system_r:ftpd_t:s0-s0:c0.c1023 1467 ? Ss 0:00 /usr/sbin/vsftpd /etc/vsftp/vsftpd.conf
Note:
安全上下文用冒号分为四个字段:Identify:role:type:
- 身份标识(ldentify):相当于账号方面的身份标识,主要有以下三种常见的类型:
- root:表示root的账号身份
- system_u:表示程序方面的标识,通常就是进程
- unconfined_u:代表的是一般用户账号相关的身份
- 角色(role):通过角色字段,可知道这个数据是属于程序、文件资源还是代表用户。一般角色有:
- object_r:代表的是文件或目录等文件资源
- system_r:代表的是进程
- 类型(type):在默认的targeted策略中,Identify与role字段基本上是不重要的,重要的在于这个类型字段。而类型字段在文件与进程的定义不太相同,分别是:
- type :在文件资源上面称为类型
- domain:在主体程序中则称为域
- domain需要与type搭配,则该程序才能够顺利读取文件资源
- 代表灵敏度,一般用s0、s1、s2来命名,数字代表灵敏度的分级。数值越大、灵敏度越高
三、对于SElinux的管理及优化
1.SElinux的工作模式
SElinux有三种工作模式:
- enforcing:强制模式,开始限制domain/type。
- permissive:宽容模式,仅会有警告信息并不会实际限制domain/type的访问。
- disabled:关闭,SELinux并没有实际运行。
2.对于SElinux状态管理
a.查看SElinux当前状态
[root@30 ~]# getenforce
Enforcing
b.临时更改SElinux的工作模式
[root@30 ~]# setenforce 0|1 #只有在SElinux激活模式下才可以使用,不能用来开启或者关闭SElinus
Note
0 表示宽容模式
1 表示强制模式
c.永久更改SElinux状态
[root@30 ~]# grubby --update-kernel ALL --args selinux=0
[root@30 ~]# grubby --update-kernel ALL --remove-args selinux
#永久更改SElinux的状态需要在更改后重启系统才能生效
d.重启SElinux
系统在开启SElinux后,重启系统SElinux的所有内容不会有任何变化,如果需要刷新SElinux需要执行以下操作:
[root@30 ~]#touch /.autorelable
3.管理文件的安全上下文
a.临时更改文件的安全上下文
chcon [-R] [-ttype] [-u user] [-r role] 文件
-R:连同该目录下的子目录也同时修改:
-t:后面接安全上下文的类型字段;
-u:后面接身份识别:
-r:后面接角色
chcon [-R] --reference=模板 目标文件 #将文件的安全上下文按照范例文件修改
b.永久修改安全上下文
semanager fcontext [-a|-d] [-t type] [-s user] [-r range] 文件
-l:列出所有记录-a:添加记录-m:修改记录-d:删除记录
-t:添加的类型
-p:指定添加的端口是tcp或udp协议的,port子命令下使用
-e:目标路径参考原路径的上下文类型,fcontext子命令下使用
-s:后面接身份识别
-r:后面接角色
Note
系统将每个目录的默认SElinux type类型记录在/etc/selinux/targeted/contexts/目录内
用semanage这个命令的功能来查询:
semanage {login|user|port|interface|fcontext|translation} -l
在使用semanage更改完毕后必须要刷新否则不生效
c.刷新安全上下文
restorecon [-Rv] 文件或目录
-R:连同子目录一起修改
-v:将过程显示到屏幕上
[root@nfs-server mnt]# semanage fcontxt -l | grep /var/ftp
semanage: error: argument subcommand: invalid choice: 'fcontxt' (choose from 'import', 'export', 'login', 'user', 'port', 'ibpkey', 'ibendport', 'interface', 'module', 'node', 'fcontext', 'boolean', 'permissive', 'dontaudit')
[root@nfs-server mnt]# semanage fcontext -l | grep /var/ftp
/var/ftp(/.*)? all files system_u:object_r:public_content_t:s0
/var/ftp/bin(/.*)? all files system_u:object_r:bin_t:s0
/var/ftp/etc(/.*)? all files system_u:object_r:etc_t:s0
/var/ftp/lib(/.*)? all files system_u:object_r:lib_t:s0
/var/ftp/lib/ld[^/]*\.so(\.[^/]*)* regular file system_u:object_r:ld_so_t:s0
[root@nfs-server mnt]# semanage fcontext -a -t public_content_t '/mnt/senfile(/.*)?'
[root@nfs-server mnt]#
[root@nfs-server mnt]# semanage fcontext -l | grep senfile
/mnt/senfile(/.*)? all files system_u:object_r:public_content_t:s0
[root@nfs-server mnt]# ls -Z /mnt/senfile
unconfined_u:object_r:public_content_t:s0 /mnt/senfile
[root@nfs-server mnt]# restorecon -RvvF /mnt/senfile
Relabeled /mnt/senfile from unconfined_u:object_r:public_content_t:s0 to system_u:object_r:public_content_t:s0
[root@nfs-server mnt]#
4.selinux对linux服务的影响
a.服务功能的影响
查看sebool值:
[root@nfs-server ~]#getsebool -a | grep 服务名称
修改sebool值:
[root@nfs-server ~]#setsebool -P <bool类型> <0|1>
-P:表示永久生效
0:表示功能关闭
1:表示功能开启
具体操作步骤:
[root@nfs-server ~]# dnf install vsftpd -y
[root@nfs-server ~]# vim /etc/vsftpd/vsftpd.conf
[root@nfs-server ~]# systemctl enable --now vsftpd
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
[root@nfs-server ~]# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
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 --> off
[root@nfs-server ~]# setsebool -P ftpd_anon_write on
[root@nfs-server ~]# getsebool -a | grep ftp
ftpd_anon_write --> on
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
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 --> off
b.服务的端口影响
查看服务被允许使用的端口:
[root@nfs-server ~]# semanage port -l | grep 服务
根据需求更改被允许使用的端口:
[root@nfs-server ~]# semanage port -a -t 服务下面的端口 -p 服务 xx(端口号)
[root@nfs-server ~]# 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 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
[root@nfs-server ~]# semanage port -a -t http_port_t -p tcp 6868
[root@nfs-server ~]# 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 6868, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989