Selinux 的全称是Security Enhance Linux,就是安全加强的Linux。在Selinux之前root账号能够任意的访问所有文档和服务在selinux中,访问控制属性叫做安全上下文,所有客体(文件、进程间通讯通道、套接字、网络主机等)都有与其关联的安全上下文,安全上下文分为以下4个部分:
user(身份识别):role(角色):type(类型):sensitivity(限制访问的需要)其中type(类型)最重要:指定数据类型,规则中定义何种进程类型访问何种文件,基本上,一个主进程能不能读取到这个文件资源与类型字段有关
semanage 是 SELinux的一个管理工具,可用来查询和修改目录的安全上下文,semanage命令不仅能够像传统chcon命令那样—设置文件、目录的策略,还可以管理网络端口、消息接口
经常用到的几个参数及其功能如下所示:
-l 参数用于查询
-a 参数用于添加
-m 参数用于修改
-d 参数用于删除
-t 安全上下文类型
下载安装semanage工具
$ yum list | grep policycoreutils-python-utils
policycoreutils-python-utils.noarch 2.9-16.el8 @base
$ yum -y install policycoreutils-python-utils
查看安全上下文
查看某个目录的安全上下文
$ semanage fcontext -l | grep "/var/www"
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 # 安全上下文类型为 httpd_sys_content_t
/var/www(/.*)?/logs(/.*)? all files system_u:object_r:httpd_log_t:s0 # 安全上下文类型为 httpd_log_t
在该目录下创建文件,并查看其安全上下文与上面查看的目录的上下文类型一样
$ cd /var/www
$ touch test
$ ls -lZ
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 5月 23 23:06 test
$ mkdir logs
$ ls -lZ
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_sys_content_t:s0 6 5月 23 23:33 logs
$ restorecon logs/ # 恢复SELinux文件属性即恢复文件的安全上下文
$ ls -lZ
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_log_t:s0 6 5月 23 23:33 logs
创建一个新目录并为其设置安全上下文:
$ mkdir wb1
$ ls -Zl |grep wb1
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 6 5月 23 23:51 wb1 # 安全上下文类型为缺省的
$ semanage fcontext -l | grep /we1 # 此时也查看不到安全上下文
$ semanage fcontext -a -t httpd_sys_content_t '/wb1(/.*)?' # 给目录添加安全上下文类型(永久生效)
$ restorecon -Rv wb1/
$ cd /wb1/
$ touch test
$ ls -lZ
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 5月 23 23:59 test
示例: 修改 httpd 默认服务目录时 、需要设置新目录的安全上下文
创建存放网页的新目录,并修改httpd配置文件
$ mkdir -p /web4/www/html
$ echo 'httpd test' > web4/www/html/index1.html
$ vim /etc/httpd/conf/httpd.conf
DocumentRoot "/web4/www/html"
AllowOverride None
# Allow open access:
Require all granted
$ ls -Zl
drwxr-xr-x. 3 root root system_u:object_r:default_t:s0 17 5月 24 23:08 web4
$ systemctl restart httpd
访问 http 页面时,没有显示网页内容
修改目录的安全上下文类型
$ semanage fcontext -a -t httpd_sys_content_t '/web4(/.*)?'
$ restorecon -Rv web4/
成功访问到网页内容
临时修改安全上下文 chcon -t
$ chcon -t samba_share_t a
$ ls -lZ
-rw-r--r--. 1 root root unconfined_u:object_r:samba_share_t:s0 0 5月 24 00:21 a
示例:将 httpd 的 端口更改为 83
修改端口后无法启动 httpd 如下
$ vim /etc/httpd/conf/httpd.conf
Listen 83
$ systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.
配置selinux允许开放83端口
$ semanage port -a -t http_port_t -p tcp 83
$ semanage port -l | grep http_port_t # 查看当前放行的端口
http_port_t tcp 83, 82, 80, 81, 443, 488, 8008, 8009, 8443, 9000
$ systemctl restart httpd
重启成功,httpd已监听在83端口
$ netstat -ntlp
tcp6 0 0 :::83 :::* LISTEN 81601/httpd
selinux 的三种状态:
enforcing 是强制模式系统——它受selinux保护,就是违反了策略你就无法继续操作下去。
permissive 是提示模式系统不会受到selinux保护,只是收到警告信息——permissive就是selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你违反的内容记录下来(警告信息)
disabled 禁用selinux——关闭selinux
临时开启 selinux:
$ setenforce 0
$ getenforce
Permissive
$ setenforce 1
$ getenforce
Enforcing
$ tail /var/log/audit/audit.log 查看日志
永久开启:
$ vim /etc/selinux/config # 下次重启前生效
SELINUX=permissive
关闭selinux 需要修改配置文件:
$ ls -l # 开启selinux时
-rw-------. 1 root root 1328 5月 6 23:38 anaconda-ks.cfg
关闭selinux
$ vim /etc/selinux/config
SELINUX=disabled
$ getenforce
Disabled
$ setenforce 1
setenforce: SELinux is disabled
selinux 布尔值
$ semanage boolean -l # 查看
$ setsebool -P samba_create_home_dirs on # 打开
$ setsebool -P samba_create_home_dirs off # 关闭