我将部署一个 Docker Swarm(3 个节点:1 个管理器“前端”,2 个工作器“后端和数据库”),并为 VPC 设置安全组。我计划从一开始就拒绝所有入站/出站连接。
拒绝所有入站连接的目标
简而言之,入站防火墙规则保护网络免受来自互联网或其他网络段的传入流量(即不允许的连接、恶意软件和拒绝服务(DoS)攻击)的侵害。
拒绝所有出站连接的目标
阻止出站流量通常有助于限制攻击者在破坏网络上的系统后可以采取的操作。
当前的安全组规则
入站:
1. protocol tcp | port 22 | auth object ip address | description ssh
2. protocol tcp | port 80 | auth object 0.0.0.0/0 | description http
3. protocol tcp | port 443 | auth object 0.0.0.0/0 | description https
出站:
1. protocol udp | port 53 | auth object 0.0.0.0/0 | description dns lookup
2. protocol tcp | port 465 | auth object 0.0.0.0/0 | description smtp server
3. protocol tcp | port 587 | auth object 0.0.0.0/0 | description smtp relay service
4. protocol tcp | port 993 | auth object 0.0.0.0/0 | description imap server
我突然想到了这个问题,因为其中一个节点使用 CentOS,并依赖 chronyd(作为网络时间协议客户端),它使用协议 udp | 端口 123 与 NTP 服务器通信。我决定将其添加到出站安全组规则中:
出站:
- 协议 udp | 端口 123 | 身份验证对象 0.0.0.0/0 | 描述 NTP 服务器
netstat 输出
我用来$ sudo netstat -antupc
监控连接,我获得了服务SYN_SENT
的状态AliYunDun
和服务aliyun-service
的空白状态chronyd
。
tcp 0 1 private ip address:34484 100.100.103.52:80 SYN_SENT 1912/AliYunDun
tcp 0 1 private ip address:47530 100.100.80.165:80 SYN_SENT 928/aliyun-service
udp6 0 0 ::1:323 :::* 666/chronyd
您应该为入站和出站连接保留哪个端口确保其他 Linux 服务正常运行?
答案1
也许我会被一些更有经验的人批评,但在我看来,对出站流量进行全面封锁有点没用。我会在一两段话中再谈这个问题。
首先:针对出站流量的本地规则是无用的,因为如果攻击者控制了您的服务器,他们就可以完美地关闭这些规则。
有两件事可以产生影响:例如,可以配置边界防火墙,使其只允许来自指定邮件服务器的出站邮件,或只允许来自/到批准地址的出站 DNS 查询。这可能会对您的安全性产生一定的影响。
另一种大大提高安全性的方法是在您的环境中的服务器之间应用微分段。这通常是通过在服务之间放置某种防火墙来实现的。首先,您将在一段时间内监控机器之间的网络流量。一旦您分析了环境中的正常情况,您将创建策略以允许这些必要的服务,并阻止其他所有服务。VMware NSX 等商业产品具有内置工具来帮助您完成此过程,但它们并不便宜。
在当今时代,除非您拥有大量资源,否则很难识别从您的计算机到互联网的恶意出站流量。无论是系统更新还是恶意软件呼叫控制中心,它通常都会被视为 https 流量,因为它就是这样,而老式的地址和端口防火墙对于解析标头或解密和分析数据包内容毫无用处。