一.selinux简介
SELinux是Security-Enhanced Linux的缩写,意思是安全强化的linux
SELinux 主要由美国国家安全局(NSA)开发,当初开发的目的是为了避免资源的误用传统的访问控制在我们开启权限后,系统进程可以直接访问当我们对权限设置不严谨时,这种访问方式就是系统的安全漏洞
在开启SElinux后:
1.会对进程本身部署安全上下文
2.会对文件部署安全上下文
3,会对服务使用端口进行限制
4.会对程序本身的不安全功能做限制
二.selinux的工作原理
2.1.selinux的工作方式
ELinux 是通过 MAC 的方式来控制管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源。
主体( subject ):就是进程
目标( object ):被主体访问的资源,可以是文件、目录、端口等。
策略( policy ):由于进程与文件数量庞大,因此 SELinux 会依据某些服务来制定基本的访问安全策略。
这些策略内还会有详细的规则( rule )来指定不同的服务开放某些资源的访问与否。目前主要的策略有:
targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略;
strict:完整的SELinux限制,限制方面较为严格。
2.2.selinux的安全上下文
文件的
[root@server ~]# ls -Z
unconfined_u:object_r:admin_home_t:s0 公共 unconfined_u:object_r:admin_home_t:s0 音乐
unconfined_u:object_r:admin_home_t:s0 模板 unconfined_u:object_r:admin_home_t:s0 桌面
unconfined_u:object_r:admin_home_t:s0 视频 system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
unconfined_u:object_r:admin_home_t:s0 图片 ? timinglee.org.zone
unconfined_u:object_r:admin_home_t:s0 文档 ? zzh.conf
unconfined_u:object_r:admin_home_t:s0 下载
进程的
[root@server ~]# ps axZ | grep vsftpd
system_u:system_r:ftpd_t:s0-s0:c0.c1023 1063 ? Ss 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2958 pts/1 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搭配,则该程序才能够顺利读取文件资源。
最后一个字段是和MLS和MCS相关的东西,代表灵敏度,一般用s0、s1、s2来命名,数字代表灵敏度的分级。数值越大、灵敏度越高。
三.对于selinux的管理及优化
3.1.SELinux三种模式
enforcing:强制模式,代表SELinux正在运行中,开始限制domain/type。
permissive:宽容模式,代表SELinux正在运行中,不过仅会有警告信息并不会实际限制 domain/type的访问。
disabled:关闭,SELinux并没有实际运行。
3.1.1查看状态
[root@server ~]# getenforce
Enforcing
3.2.2开启与关闭服务
[root@server ~]# grubby --update-kernel ALL --args selinux=1 #开启selinux服务
[root@server ~]# grubby --update-kernel ALL --args selinux=0 #关闭selinux服务
3.2.管理上下安全文
3.2.1/临时
1.创建文件查看安全上下文
[root@server ~]# touch /mnt/file
[root@server ~]# ls
公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda-ks.cfg timinglee.org.zone zzh.conf
[root@server ~]# cd /mnt
[root@server mnt]# ls
file
[root@server mnt]# ls -Z
unconfined_u:object_r:mnt_t:s0 file
2.临时修改的命令可以看到修改成成功了
[root@server mnt]# chcon -t public_content_t file
[root@server mnt]# ls -Z
unconfined_u:object_r:public_content_t:s0 file
3.创建文件,这个文件是selinux重启的标识文件,当此文件存在时。selinux在系统重启后会重新初始化
[root@server ~]# touch /.autorelabel
4.重启计算机,然后查看文件可以看到文件的安全上下文再次被修改了
3.2.2.永久
先查看file文件
[root@server ~]# cd /mnt
[root@server mnt]# ls
file
[root@server mnt]# ls -Z
unconfined_u:object_r:default_t:s0 file
修改文件的安全上下文
[root@server mnt]# semanage fcontext -a -t public_content_t '/mnt/file(/.*)?'
[root@server mnt]# restorecon -RvvF /mnt/file
Relabeled /mnt/file from unconfined_u:object_r:default_t:s0 to system_u:object_r:public_content_t:s0
[root@server mnt]# ls -Z
system_u:object_r:public_content_t:s0 file
重启,查看发现文件没有被更改安全上下文了
[root@server mnt]# reboot #重启计算机
[root@server ~]# cd /mnt
[root@server mnt]# ls -Z
system_u:object_r:public_content_t:s0 file
3.3.selinux对linux服务的影响
以下都是在selinux状态为enforcing状态下进行
3.3.1.服务的功能影响
在系统selinux开启后会添加新的功能开关,,我们把这个开关叫做sebool;
查看sebool值
[root@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@server ~]# setsebool -P ftpd_anon_write on
[root@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
先给目录赋权
[root@server ~]# chmod 777 /var/ftp/pub/
使用ftp上传文件功能,可以发现文件上传成功了
[root@server ~]# lftp 192.168.94.222
lftp 192.168.94.222:~> cd pub/
cd 成功, 当前目录=/pub
lftp 192.168.94.222:/pub> put /etc/inittab
490 bytes transferred
lftp 192.168.94.222:/pub> quit
3.3.2.服务的端口影响
在系统开启selinux后会规定服务的端口使用
查看服务被允许的端口
nginx端口修改后启用不了
[root@server ~]# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
使用查看命令可以看到nginx服务对应的端口并没有6868
[root@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@server ~]# semanage port -a -t http_port_t -p tcp 6868
[root@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
这是查看selinux的状态时enforcing的
[root@server ~]# getenforce
Enforcing
这是重新启动nginx服务就可以启动成功了
[root@server ~]# systemctl restart nginx
[root@server ~]#