SElinux
SElinux简介
SELinux是Security-Enhanced Linux的缩写,意思是安全强化的linux
SELinux 主要由美国国家安全局(NSA)开发,当初开发的目的是为了避免资源的误用
传统的访问控制在我们开启权限后,系统进程可以直接访问
当我们对权限设置不严谨时,这种访问方式就是系统的安全漏洞
在开启SElinux后
会对进程本身部署安全上下文
会对文件部署安全上下文
会对服务使用端口进行限制
会对程序本身的不安全功能做限制
SElinux工作原理
SElinux工作方式
SELinux是通过MAC的方式来控制管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源
主体(subject):就是进程
目标(object):被主体访问的资源,可以是文件、目录、端口等。
策略(policy):由于进程与文件数量庞大,因此SELinux会依据某些服务来制定基本的访问安全策略
targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略;
strict:完整的SELinux限制,限制方面较为严格。
SElinux安全上下文
安全上下文(security context):
主体能不能访问目标除了策略指定外,主体与目标的安全上下文必须一致才能够顺利访问。
最终文件的成功访问还是与文件系统的rwx权限设置有关
查看是否开启SElinux
已开启的主机:
[root@localhost ~]# getenforce
Disabled
[root@localhost ~]# grubby --update-kernel ALL --args selinux=1
[root@localhost ~]# reboot [root@localhost ~]# dnf install vsftpd -y
[root@localhost ~]# systemctl start vsftpd.service
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
[root@localhost ~]# systemctl restart vsftpd.service
[root@localhost ~]# chmod 777 /var/ftp/pub/
[root@localhost ~]# ps axZ |grep vsftpd
system_u:system_r:ftpd_t:s0-s0:c0.c1023 1924 ? Ss 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1965 pts/0 S+ 0:00 grep --color=auto vsftpd
[root@localhost ~]# touch /mnt/leefile
[root@localhost ~]# ls -Z /mnt/
unconfined_u:object_r:default_t:s0 file1 unconfined_u:object_r:default_t:s0 file3 unconfined_u:object_r:default_t:s0 file5
unconfined_u:object_r:default_t:s0 file2 unconfined_u:object_r:default_t:s0 file4 unconfined_u:object_r:mnt_t:s0 leefile
对文件的影响:
[root@localhost ~]# mv /mnt/leefile /var/ftp/
[root@localhost ~]# cd /var/ftp/
[root@localhost ftp]# ls
leefile pub
[root@localhost ftp]# curl ftp://172.25.254.129
drwxrwxrwx 2 0 0 6 May 09 2023 pub[root@localhost ftp]# lftp 172.25.254.129
lftp 172.25.254.129:~> ls
drwxrwxrwx 2 0 0 6 May 09 2023 pub
lftp 172.25.254.129:/> cd pub/
lftp 172.25.254.129:/pub> ls
lftp 172.25.254.129:/pub> put /etc/passwd
put: /etc/passwd: Access failed: 553 Could not create file. (passwd)
lftp 172.25.254.129:/pub> ls[root@localhost ftp]# 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@localhost ftp]# vim /etc/ssh/sshd_config
[root@localhost ftp]# systemctl restart sshd
Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xeu sshd.service" for details.
未开启的主机:
[root@localhost ~]# getenforce
Disabled
[root@localhost ~]# dnf install vsftpd -y
[root@localhost ~]# systemctl start vsftpd.service
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
[root@localhost ~]# systemctl restart vsftpd.service
[root@localhost ~]# chmod 777 /var/ftp/pub/
[root@localhost ~]# ps axZ |grep vsftpd
- 1805 ? Ss 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
- 1832 pts/0 S+ 0:00 grep --color=auto vsftpd
[root@localhost ~]# touch /mnt/leefile
[root@localhost ~]# ls =Z /mnt/
ls: cannot access '=Z': No such file or directory
/mnt/:
hgfs leefile
对文件的影响:
[root@localhost ~]# mv /mnt/leefile /var/ftp/
root@localhost ~]# cd /var/ftp/
[root@localhost ftp]# ls
leefile pub
[root@localhost ftp]# lftp 172.25.254.133
lftp 172.25.254.133:~> ls
-rw-r--r-- 1 0 0 0 Dec 11 09:21 leefile
drwxrwxrwx 2 0 0 6 May 09 2023 pub
lftp 172.25.254.133:/> quit
[root@localhost ftp]# curl ftp://172.25.254.133
-rw-r--r-- 1 0 0 0 Dec 11 09:21 leefile
drwxrwxrwx 2 0 0 6 May 09 2023 pub[root@localhost ftp]# lftp 172.25.254.133
lftp 172.25.254.133:~> ls
-rw-r--r-- 1 0 0 0 Dec 11 09:21 leefile
drwxrwxrwx 2 0 0 6 May 09 2023 pub
lftp 172.25.254.133:/> cd pub/
lftp 172.25.254.133:/pub> put /etc/passwd
2199 bytes transferred
lftp 172.25.254.133:/pub> ls
-rw------- 1 14 50 2199 Dec 11 09:42 passwd[root@localhost ftp]# getsebool -a |grep ftp
getsebool: SELinux is disabled
对端口的影响:
[root@localhost ftp]# systemctl restart sshd
安全上下文的查看
文件的安全上下文
[root@localhost ~]# ls -Zsystem_u:object_r:admin_home_t:s0 anaconda-ks.cfg
unconfined_u:object_r:admin_home_t:s0 at_job.sh进程的安全上下文
[root@localhost ~]# ps axZ |grep vsftpd
system_u:system_r:ftpd_t:s0-s0:c0.c1023 1924 ? Ss 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2341 pts/0 S+ 0:00 grep --color=auto vsftpd
安全上下文用冒号分为四个字段:Identify:role:type:
身份标识(Identify):相当于账号方面的身份标识,主要有以下三种常见的类型:
root: 表示root的账号身份;
system_u: 表示程序方面的标识,通常就是进程;
unconfined_u:代表的是一般用户账号相关的身份。
角色(role):通过角色字段,可知道这个数据是属于程序、文件资源还是代表用户。一般角色有:
object_r: 代表的是文件或目录等文件资源;
system_r: 代表的是进程。
类型(type):在默认的targeted策略中,Identify与role字段基本上是不重要的,重要的在于这个类型字段。而类型字段在文件与进程的定义不太相同,分别是:
type: 在文件资源上面称为类型。
domain: 在主体程序中则称为域
domain需要与type搭配,则该程序才能够顺利读取文件资源。
代表灵敏度,一般用s0、s1、s2来命名,数字代表灵敏度的分级。数值越大、灵敏度越高
对于SElinux的管理及优化
SElinux工作模式
SElinux有三种工作模式:
enforcing:强制模式,开始限制domain/type。
permissive:宽容模式,仅会有警告信息并不会实际限制domain/type的访问。
disabled:关闭,SELinux并没有实际运行。
对于SElinux状态管理
1.查看SElinux当前状态查看
[root@localhost ~]# getenforce
Enforcing
2.临时更改SElinux的工作模式
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# setenforce 1
[root@localhost ~]# getenforce
Enforcing
3.永久更改SElinux状态,永久更改SElinux的状态需要在更改后重启系统才能生效
在RHEL9之前的版本中通过文件来永久更改SElinux的状态
[root@localhost ~]# vim /etc/selinux/config SELINUX=enforcing|permissive|disabled
在RHEL9中需要通过修改内核启动参数来永久更改SElinux的状态
[root@localhost ~]# grubby --update-kernel ALL --args selinux=0
[root@localhost ~]# grubby --update-kernel ALL --remove-args selinux
4.重启SElinux
系统在开启SElinux后,重启系统SElinux的所有内容不会有任何变化如果需要刷新SElinux
[root@localhost ~]# touch /.autorelabel