SELINUX和防火墙
SELINUX
简介:
SELinux通过对进程和文件的访问进行精细的控制和限制,可以在系统级别上实现强制访问控制,即使是root用户也无法绕过这种控制。它基于策略规则来确定哪些进程可以访问哪些文件,从而有效地减少了系统遭受恶意攻击的风险。
SELinux采用了一种称为类型强制访问控制(TE)的安全模型,根据对象的安全类型以及主体的角色和类型来进行授权访问决策。这意味着即使是同一用户在不同角色下执行不同类型的任务时,也会受到不同的权限限制。
另外,SELinux还提供了一套工具和技术来管理策略和规则,以及帮助系统管理员对系统进行审计和监控。通过适当地配置和调整SELinux,可以确保系统在遭受安全威胁时能够保持稳定和安全。总的来说,SELinux是一种值得在Linux系统中使用的高级安全功能,可提供更强大的保护机制来保护系统免受攻击和数据泄露
selinux的工作原理
查看文件的安全上下文:
[root@localhost ~]# ls -Z
system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
[root@localhost ~]# ll -Zd /usr/sbin/httpd /var/www/html/
-rwxr-xr-x. 1 root root system_u:object_r:httpd_exec_t:s0 589560 8月 12 21:20 /usr/sbin/httpd
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 6 8月 12 21:20 /var/www/html/以上两个文件的角色字段都是 object_r ,代表都是文件, /usr/sbin/httpd 属于 httpd_exec_t 类型, /var/www/html/ 则属于 httpd_sys_content_t 类型。
访问过程:
( 1 )首先,触发具有 httpd_exec_t 这个类型的 /usr/sbin/httpd 这个可执行文件;( 2 )该文件的类型会让这个文件所造成的主体进程具有 httpd 这个域,我们的策略已经针对这个域制定了许多规则,其中包括这个域可以读取的目标资源类型;( 3 )由于 httpd domain 被设置为可读取 httpd_sys_content_t 这个类型的目标文件,因此 httpd 进程就能够读取在 /var/www/html/ 目录下面的文件了;( 4 )最终能否读到 /var/www/html/ 目录下面的数据,还要看 rwx 是否符合 linux 权限的规范
selinux的启动、关闭与查看:
SELinux三种模式
enforcing :强制模式,代表 SELinux 正在运行中,开始限制 domain/type 。permissive :宽容模式,代表 SELinux 正在运行中,不过仅会有警告信息并不会实际限制domain/type 的访问。disabled :关闭, SELinux 并没有实际运行
查看目前的模式
[root@localhost ~]# getenforce
Enforcing
查看目前的selinux使用的策略
[root@localhost ~]# sestatus
SELinux status: enabled # 是否启用selinux
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
Policy deny_unknown status: allowed
Max kernel policy version: 31
#查看selinux的策略:
[root@localhost ~]# vim /etc/selinux/config
改变策略之后需要重新启动;
如果由enforcing或permissive改成disabled,或由disabled改为其它两个,也必须要重新启
动。
将selinux模式在enforcing和permissive之间切换的方法为:
setenforce 0 转换成permissive宽容模式
setenforce 1转换成enforcing强制模式
修改安全上下文:
临时修改,使用restorecon命令后会修改回默认的selinux type类型
chcon [-R] [-t type] [-u user] [-r role] 文件-R :连同该目录下的子目录也同时修改;-t :后面接安全上下文的类型字段;-u :后面接身份识别;-r :后面接角色chcon [-R] --reference = 范例文件 文件 将文件的安全上下文按照范例文件修改
restorecon [-Rv] 文件或目录-R :连同子目录一起修改;-v :将过程显示到屏幕上restorecon 怎么会知道每个目录记载的默认 selinux type 类型呢?因为系统将每个目录的默认selinux type 类型记录在 /etc/selinux/targeted/contexts/ 目录内。但是该目录内有很多不同的数据,所以我们可以用 semanage 这个命令的功能来查询与修改。semanage { login|user|port|interface|fcontext|translation } -lsemanage fcontext - {a|d|m} [-frst] file_spec-l 为查询;-a :增加一些目录的默认安全上下文的设置;-m :修改;-d :删除
selinux对linux服务的影响:
实验一:使用web服务演示安全上下文值的设定
[root@localhost ~]# setenforce 1
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# cat /etc/nginx/conf.d/test_ip.conf
server {
listen 192.168.58.100:80;
root /www/ip/100;
location / {
}
}
server {
listen 192.168.58.200:80;
root /www/ip/200;
location / {
}
}
[root@localhost ~]# mkdir -pv /www/ip/{100,200}
[root@localhost ~]# echo this is 100 > /www/ip/100/index.html
[root@localhost ~]# echo this is 200 > /www/ip/200/index.html
[root@localhost ~]# 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服务重启失败需要设置义目录的安全上下文的值:客户端测试:(失败)需要设置selinux状态:[root@localhost ~]# curl 192.168.58.100
curl: (7) Failed to connect to 192.168.58.100 port 80: 拒绝连接
[root@localhost ~]# chcon -t httpd_sys_content_t /www/ -R
[root@localhost ~]# setenforce 0[root@localhost ~]# chcon -t httpd_sys_content_t /www/ -R
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.58.100
this is 100
[root@localhost ~]# cat /etc/nginx/conf.d/test_port.conf
server {
listen 192.168.58.6:80;
root /www/port/80;
location / {
}
}
server {
listen 192.168.58.6:10000;
root /www/port/10000;
location / {
}
}
[root@localhost ~]# mkdir -pv /www/port/{80,10000}
[root@localhost ~]# echo the port is 80 > /www/port/80/index.html
[root@localhost ~]# echo the port is 10000 > /www/port/10000/index.html
[root@localhost ~]# systemctl restart nginx
重启失败[root@server ~]# systemctl restart nginx.service
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.
[root@localhost ~]# semanage port -a -t http_port_t -p tcp 10000
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.58.6:10000
the port is 10000测试成功
防火墙
什么是防火墙:
iptables:
简单的说:iptables是Linux系统内嵌的一个包过滤防火墙工具,它允许用户控制进出网络的数据包流量。Iptables提供了一个命令行界面,可以设置规则来决定哪些数据包应该被允许通过,哪些应该被阻断。这个规则集包括了诸如状态跟踪、协议过滤、端口过滤等高级功能。
防火墙会从以上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:一种是 “ 通 ” (即放行),一种是 “ 堵 ” (即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。iptables 服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:在进行路由选择前处理数据包,用于目标地址转换( PREROUTING );处理流入的数据包( INPUT );处理流出的数据包( OUTPUT );处理转发的数据包( FORWARD );在进行路由选择后处理数据包,用于源地址转换( POSTROUTING )
准备工作:
[root@localhost ~]# yum install iptables -y 下载软件包
[root@localhost ~]# systemctl stop firewalld 停止防火墙
[root@localhost ~]# systemctl start iptables 启用IP tables
[root@server ~]# iptables -F #清空所有的规则表,清空之后客户端可以访问ssh和http服务
iptables 命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功, iptables 就会根据策略规则所预设的动作来处理这些流量。
语法格式: iptables -t 表名 <-A/I/D/R> 规则链名 [ 规则号 ] <-i/o 网卡名 > -p 协议名 <-s源 IP/ 源子网 > --sport 源端口 <-d 目标 IP/ 目标子网 > --dport 目标端口 -j 动作
参数说明-t对指定的表进行操作, table 必须是 raw , nat , filter , mangle 中的一个。默认是 filter 表。-p指定要匹配的数据包协议类型-s--source address[/mask][,...] :把指定的一个或者一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时, address 是一个地址,比如: 192.168.1.1 ;当 mask 指定时,可以表示一组范围内的地址,比如: 192.168.1.0/255.255.255.0-d--destination address[/mask][,...] :地址格式同上,但这里指定地址为目的地址,按此进行过滤-i--in-interface name :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT , FORWARD , PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似, "!" 表示取反-o--out-interface name :指定数据包出去的网络接口。只对 OUTPUT , FORWARD ,POSTROUTING 三个链起作用-L--list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规 则-A--append chain rule-specification :在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定-I--insert chain [rulenum] rule-specification :在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是 1 ,则在链的头部插入。这也是默认的情况,如果没有指定规则号-D--delete chain rule-specification -D, --delete chain rulenum :在指定的链 chain 中删除一个或多个指定规则-RnumReplays 替换 / 修改第几条规则-P--policy chain target :为指定的链 chain 设置策略 target 。注意,只有内置的链才允许有策略,用户自定义的是不允许的-F--flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则-N--new-chain chain 用指定的名字创建一个新的链-X--delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链-E--rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响-Z--zero [chain] :把指定链,或者表中的所有链上的所有计数器清零-j--jump target < 指定目标 > :即满足某条件时该执行什么样的动作。 target 可以是内置的目标,比如 ACCEPT ,也可以是用户自定义的链-h显示帮助信息
实验:
实验一:搭建 web 服务,设置任何人能够通过 80 端口访问。[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT 相当于一条允许策略
[root@localhost ~]# iptables -L --line-numbers 查看策略表
[root@localhost ~]# iptables -D INPUT 1 删除第一条
实验二:禁止所有人 ssh 远程登录该服务器设置并删除[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j REJECT
[root@localhost ~]# iptables -D INPUT 1
实验三:禁止某个主机地址 ssh 远程登录该服务器,允许该主机访问服务器的 web 服务。服务器地址为 192.168.58.100拒绝 172.24.8.129 通过 ssh 远程连接服务器:[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.58.100 --dport 22 -j REJECT
测试完成后删除:iptables -D INPUT 1允许 172.24.8.129 访问服务器的 web 服务:[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.58.100 --dport 80 -j ACCEPT
firewalld:
firewalld 介绍iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新即可 , 它具备对 IPv4 和 IPv6 防火墙设置的支持。相比于传统的防火墙管理工具, firewalld 支持动态更新技术并加入了区域的概念。区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以选择不同的集合,从而实现防火墙策略之间的快速切换。
区域默认规则策略阻塞区域( block )拒绝流入的流量,除非与流出的流量相关工作区域( work )拒绝流入的流量,除非与流出的流量相关家庭区域( home )拒绝流入的流量,除非与流出的流量相关公共区域( public )不相信网络上的任何计算机,只有选择接受传入的网络连接。隔离区域( DMZ )隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。信任区域( trusted )允许所有的数据包。丢弃区域( drop )拒绝流入的流量,除非与流出的流量相关内部区域( internal )等同于 home 区域外部区域( external )拒绝流入的流量,除非与流出的流量有关;而如果流量与 ssh 服务相关,则允许流量
安装 firewalld 服务的软件:[root@localhost ~]# rpm -qa | grep firewall
firewalld-filesystem-1.1.1-3.el9.noarch
python3-firewall-1.1.1-3.el9.noarch
firewalld-1.1.1-3.el9.noarch
[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 --permanent --add-service= 服务名使用 firewalld 配置的防火墙策略默认为当前生效,会随着系统的重启而失效。如果想让策略一直存在,就需要使用永久模式了,即在使用 firewall-cmd 命令设置防火墙策略时添加 --permanent 参数,这样配置的防火墙策略就可以永久生效了,最后想要使用这种方式设置的策略生效,只能重启或者输入命令:firewall-cmd --reload