第七章:selinux
1、selinux的说明
seLinux可以通过强制访问控制(MAC)限制程序、文件的权限
MAC可以理解为进程和文件之间的特殊权限关系
MAC可以针对特定的进程与特定的文件资源来进行权限的控制。
开启时的功能:
(1)限制程序使用文件 如:nginx /www
(2)限制程序使用端口 如:sshd 2222
2、selinux的工作原理
SELinux是通过MAC的方式来控制管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源。
主体(subject):就是进程
目标(object):被主体访问的资源,可以是文件、目录、端口等。
策略(policy):
-
targeted:针对网络服务限制较多,针对本机限制较少,是默认的策略;
-
strict:完整的SELinux限制,限制方面较为严格。
安全上下文(security context):主体能不能访问目标除了策略指定外,主体与目标的安全上下文必须一致才能够顺利访问。(相当于标签作用)
#查看文件的安全上下文
[root@localhost ~]# ls -Z
-rw-------. root root (system_u:object_r:admin_home_t:s0)安全上下文 anaconda-ks.cfg
drwxr-xr-x. root root (unconfined_u:object_r:admin_home_t:s0) home
主要看第三个字段:类型
安全上下文用冒号分为四个字段:
Identify:role:type:s(0-3)
身份标识:角色:类型:灵敏度
#查看安全上下文:
[root@client ~]# ll -Zd /usr/sbin/nginx
-rwxr-xr-x. 1 root root system_u:object_r:httpd_exec_t:s0 1329200 Jul 16 07:22 /usr/sbin/nginx
[root@client ~]# ll -Zd /usr/share/nginx/html/
drwxr-xr-x. 3 root root system_u:object_r:httpd_sys_content_t:s0 160 Oct 26 19:01 /usr/share/nginx/html/
#/usr/sbin/nginx属于httpd_exec_t类型,/usr/share/nginx/html/则属于httpd_sys_content_t类型。
#查看nginx进程:
[root@client ~]# ps -Zaux |grep nginx
system_u:system_r:httpd_t:s0 root 3005 0.0 0.1 10860 1848 ? Ss 20:54 0:00 nginx: master process /usr/sbin/nginx
system_u:system_r:httpd_t:s0 nginx 3006 0.0 0.3 14892 5672 ? S 20:54 0:00 nginx: worker process
system_u:system_r:httpd_t:s0 nginx 3007 0.0 0.3 14892 5672 ? S 20:54 0:00 nginx: worker process
#可以看到第三字段是httpd_t域
访问过程:
(1)首先,触发具有httpd_exec_t这个类型的/usr/sbin/httpd这个可执行文件;
(2)该文件的类型会让这个文件所造成的主体进程具有httpd这个域,我们的策略已经针对这个域制定了许多规则,其中包括这个域可以读取的目标资源类型;
(3)由于httpd domain被设置为可读取httpd_sys_content_t这个类型的目标文件,因此httpd进程就能够读取在/usr/share/nginx/html/目录下面的文件了;
(4)最终能否读到/usr/share/nginx/html/目录下面的数据,还要看rwx是否符合linux权限的规范。
#修改安全上下文:
[root@client conf.d]# chcon -t httpd_sys_content_t /www/https/index.html
#递归修改
[root@client conf.d]# chcon -Rt httpd_sys_content_t /www/
3、selinux的启动、关闭与查看
(1)seLinux三种模式
-
enforcing:强制模式
-
permissive:宽容模式,只警告,不限制
-
disabled:关闭,SELinux并没有实际运行
#查看目前的模式
[root@localhost ~]# getenforce
Enforcing
#查看目前的selinux使用的策略
[root@localhost ~]# sestatus
SELinux status: enabled # 状态开启
SELinuxfs mount: /sys/fs/selinux #selinux的相关文件数据挂载点
SELinux root directory: /etc/selinux
Loaded policy name: targeted #目前的策略
Current mode: enforcing #模式
Mode from config file: enforcing #文件模式
Policy MLS status: enabled #灵敏度
#查看selinux的策略:
[root@localhost ~]# vim /etc/selinux/config
SELINUX=enforcing 状态
SELINUXTYPE=targeted 策略
(2)修改安全上下文
chcon [-R] [-t type] [-u user] [-r role] 文件
-R:连同该目录下的子目录也同时修改;
-t:后面接安全上下文的类型字段;
-u:后面接身份识别;
-r:后面接角色
#将文件的安全上下文按照范例文件修改
chcon [-R] --reference=范例文件 文件
例如:
#修改安全上下文:
[root@client conf.d]# chcon -t httpd_sys_content_t /www/https/index.html
#递归修改
[root@client conf.d]# chcon -Rt httpd_sys_content_t /www/
#修复安全上下文
restorecon [-Rv] 文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上
如:
[root@client https]# restorecon -v index.html
Relabeled /www/https/index.html from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
restorecon知道每个目录记载的默认selinux type类型,因为系统将每个目录的默认selinux type类型记录在/etc/selinux/targeted/contexts/目录内。但是该目录内有很多不同的数据,所以我们可以用semanage这个命令的功能来查询与修改。
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
-l为查询;
-a:增加一些目录的默认安全上下文的设置;
-m:修改;
-d:删除。
如:
[root@client https]# semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"
[root@client https]# restorecon -Rv /www/
#重启还是生效
4、selinux对linux服务的影响
(1)实验一:使用httpd服务演示安全上下文值的设定
[root@client conf.d]# cat https.conf
server {
listen 192.168.59.124:443 ssl;
root /www/https;
ssl_certificate /etc/pki/tls/certs/https.crt;
ssl_certificate_key /etc/pki/tls/certs/https.key;
location / {
}
}
#开启selinux
[root@client conf.d]# setenforce 1
[root@client conf.d]# getenforce
Enforcing
#开始显示访问失败
[root@client conf.d]# curl https://192.168.59.124:443 -k
<html>
<head><title>403 Forbidden</title></head>
#修改安全上下文
[root@client conf.d]# chcon -t httpd_sys_content_t /www/https/index.html
[root@client conf.d]# ll /www/https/ -Z
total 4
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 6 Oct 24 19:13 index.html
#成功访问
[root@client conf.d]# curl https://192.168.59.124:443 -k
https
(2)实验二:使用web服务端口的改变来演示端口的设定
[root@client conf.d]# cat testport.conf
server {
listen 192.168.59.123:80;
server_name _;
root /www/port/80;
location / {
}
}
server {
listen 192.168.59.123:10000;
root /www/port/10000;
location / {
}
}
[root@client conf.d]# ll /www/port/ -Zd
drwxr-xr-x. 4 root root unconfined_u:object_r:httpd_sys_content_t:s0 29 Oct 24 15:52 /www/port/
#服务重启失败,查看日志
[root@client conf.d]# tail -f /var/log/messages
#添加10000端口为服务端口:
[root@client conf.d]# semanage port -a -t http_port_t -p tcp 10000
[root@client conf.d]# semanage port -l |grep 10000
http_port_t tcp 10000, 80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@client conf.d]# systemctl restart nginx
[root@client conf.d]# curl 192.168.59.123:10000
the port is 10000
#添加2222端口为ssh端口
[root@client conf.d]# semanage port -a -t ssh_port_t -p tcp 2222
[root@client conf.d]# semanage port -l |grep 2222
ssh_port_t tcp 2222, 22
[root@client conf.d]# systemctl restart sshd
第八章:防火墙
防火墙是为了防止安全风险从一个区域蔓延到另一个区域的设备,具有隔离功能。简单理解为是筛选和过滤流量,对需要的流量进行放行,对不需要或者有威胁的流量进行拒绝。
硬件防火墙:在专用硬件级别实现部分功能的防火墙
软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
防火墙的工具:iptables、firewallld
不同的内核版本使用的设置防火墙策略的软件不一样,红帽7系统之前是iptables,之后是firewallld
1、iptables(静态防火墙)
防火墙以从上到下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为,如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。
防火墙的策略规则处理(行为)有两种方式:放行、阻止。
注意:当防火墙默认策略为拒绝时,要写一条允许规则;而防火墙默认策略为允许时,要写一条拒绝规则。
iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:
在进行路由选择前处理数据包,用于目标地址转换(PREROUmTING);
处理流入的数据包(INPUT);
处理流出的数据包(OUTPUT);
处理转发的数据包(FORWARD);
在进行路由选择后处理数据包,用于源地址转换(POSTROUTING)。
准备工作:
[root@localhost ~]# yum install iptables-nft-services -y
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl start iptables
语法格式:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
如:iptables -A INPUT -s A -d B --dport 80 -p tcp -j REJECT
#清空所有的规则表,清空之后客户端可以访问ssh和http服务
[root@server ~]# iptables -F
参数说明:
实验:
(1)实验一:搭建web服务,设置任何人能够通过80端口访问
#添加规则:-I头部插入;-p指定协议类型;-j指定目标
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
#查看规则:-L列出链上面的所有规则
[root@localhost ~]# iptables -L --line-numbers
#删除规则:-D删除
[root@localhost ~]# iptables -D INPUT 1
(2)禁止所有人ssh远程登录该服务器
#添加规则:
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j REJECT
#删除规则:
[root@localhost Desktop]# iptables -D INPUT 1
(3)禁止某个主机地址ssh远程登录该服务器,允许该主机访问服务器的web服务。服务器地址为192.168.59.143
拒绝192.168.59.143通过ssh远程连接服务器:-s指定源地址
[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.59.143 --dport 22 -j REJECT
允许192.168.59.143访问服务器的web服务:
[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.59.143 --dport 80 -j ACCEPT
2、firewalld(动态防火墙)
为了防止只修改一条规则也要进行所有规则的重新载入的模式,就出现了firewalld动态防火墙,可以实现任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新即可,它具备对 IPv4 和 IPv6防火墙设置的支持
firewalld增加了区域,将规则存放在区域中。
firewalld中常见的区域名称(默认为public)以及相应的策略规则:
在RHEL7中,firewalld服务是默认的防火墙配置管理工具,他拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。firewall-config(图形化工具)和firewall-cmd(命令行工具)可直接编辑xml文件
#查看9个区域
[root@localhost ~]# ll /usr/lib/firewalld/zones/
总用量 40
-rw-r--r--. 1 root root 312 8月 5 2022 block.xml
-rw-r--r--. 1 root root 306 8月 5 2022 dmz.xml
-rw-r--r--. 1 root root 304 8月 5 2022 drop.xml
-rw-r--r--. 1 root root 317 8月 5 2022 external.xml
-rw-r--r--. 1 root root 410 8月 5 2022 home.xml
-rw-r--r--. 1 root root 425 8月 5 2022 internal.xml
-rw-r--r--. 1 root root 729 8月 26 2022 nm-shared.xml
-rw-r--r--. 1 root root 356 8月 5 2022 public.xml
-rw-r--r--. 1 root root 175 8月 5 2022 trusted.xml
-rw-r--r--. 1 root root 352 8月 5 2022 work.xml
#xml:标签
#前提
[root@localhost ~]# systemctl stop iptables
[root@localhost ~]# systemctl status iptables.service
[root@localhost ~]# systemctl start firewalld
[root@localhost ~]# systemctl status firewalld.service
#命令行工具
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client ssh 默认允许访问
ports: 端口
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#查看是否安装工具
[root@localhost ~]# rpm -qa | grep firewall
python3-firewall-1.3.4-7.el9.noarch
firewalld-filesystem-1.3.4-7.el9.noarch
firewalld-1.3.4-7.el9.noarch
firewall-config-1.3.4-7.el9.noarch
# 图形化工具
[root@localhost ~]# firewall-config
firewall-cmd命令的参数说明如下:
配置
[root@localhost ~]# systemctl stop iptables
[root@localhost ~]# systemctl restart firewalld
#查看帮助
[root@localhost ~]# firewall-cmd --help
#查看所有的规则
[root@localhost ~]# firewall-cmd --list-all
#添加服务器/端口
[root@localhost ~]# firewall-cmd --add-service=http
[root@localhost ~]# firewall-cmd --add-port=80/tcp
#查看服务(ntp)
[root@localhost ~]# firewall-cmd --get-services |grep ntp
#永久生效,再重载/重启
[root@localhost ~]# firewall-cmd --permanent --add-service=http
[root@localhost ~]# firewall-cmd --reload
或者reboot
实验一:设置任何人能够通过80端口访问
[root@localhost ~]# firewall-cmd --add-port=80/tcp
实验二:禁止所有人ssh远程登录该服务器
[root@localhost ~]# firewall-cmd --remove-service=ssh
实验三:禁止某个主机地址ssh远程登录该服务器,允许该主机访问服务器的web服务。服务器地址为192.168.59.142
#查看格式
[root@localhost ~]# man firewalld.richlanguage
匹配EXAMPLES的第三条
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.59.142/32" service name="ssh" reject'
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.59.142/32" service name="http" accept'
#配置端口转发(在192.168.59.0网段的主机访问该服务器的10000端口将被转发到20000端口)
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.59.0/24" forward-port to-addr="192.168.59.143" to-port="20000" protocol="tcp" port="10000"'
如果访问服务访问不通,排错:
1、查看监听端口(没有监听,服务没有运行)
2、在服务端用命令进行测试
3、客户端ping一下服务端
4、测试该ip的端口能否访问