加固Egress流量 - 端口/协议对齐

Port/Protocol Enforcement

攻击者通常使用协议隧道和端口滥用作为规避技术来绕过安全控制。协议隧道涉及在知名端口上运行非标准协议,例如使用端口80运行SSH而非HTTP,以规避仅检查端口号的防火墙规则。同样,攻击者可能通过在非标准端口上运行合法协议来进行端口跳跃,以避免被专注于标准端口监控的安全工具检测。这些技术能够通过允许的端口使用看似合法流量的自定义协议进行数据泄露,或通过滥用受信任的端口和协议建立隐蔽的命令和控制通道。

通过强制执行严格的端口/协议对齐,我们可以确保端口80只能承载HTTP流量,端口443只能承载TLS/HTTPS流量,端口22只能承载SSH流量。这种双向执行创建了强大的安全态势,既能防止在标准端口上滥用协议,也能防止在非标准端口上使用协议。

实施端口/协议执行

接下来,让我们添加规则以强制在标准端口上正确使用协议:

  1. 返回 StatefulRuleGroup 并再次选择 Edit

  2. 添加以下规则以强制正确使用协议:

# 端口80只能用于HTTP流量
drop tcp $HOME_NET any -> any 80 (msg:"Egress Port TCP/80 but not HTTP"; app-layer-protocol:!http; flow:to_server; sid:10000002;)

# 出站HTTP流量必须使用端口80
drop http $HOME_NET any -> any !80 (msg:"Egress HTTP but not port TCP/80"; flow:to_server; sid:10000003;)

# 端口443只能用于TLS流量
drop tcp $HOME_NET any -> any 443 (msg:"Egress Port TCP/443 but not TLS"; app-layer-protocol:!tls; flow:to_server; sid:10000004;)

# 出站TLS流量必须使用端口443
drop tls $HOME_NET any -> any !443 (msg:"Egress TLS but not port TCP/443"; flow:to_server; sid:10000005;)

# 端口22只能用于SSH流量
drop tcp $HOME_NET any -> any 22 (msg:"Egress Port TCP/22 but not SSH"; app-layer-protocol:!ssh; flow:to_server; sid:10000006;)

# 出站SSH流量必须使用端口22
drop ssh $HOME_NET any -> any !22 (msg:"Egress SSH but not port TCP/22"; flow:to_server; sid:10000007;)
  1. 点击 Save

有关这些防火墙规则的说明:

# 端口80只能用于HTTP流量
drop tcp $HOME_NET any -> any 80 (msg:"Egress Port TCP/80 but not HTTP"; app-layer-protocol:!http; flow:to_server; sid:10000002;)
  • 此规则阻止端口80上任何不使用HTTP协议的TCP流量。app-layer-protocol:!http 关键字专门识别不符合HTTP协议模式的流量。这可以防止攻击者将端口80用于非HTTP流量,例如使用自定义协议的命令和控制通道或数据泄露。

# 出站HTTP流量必须使用端口80
drop http $HOME_NET any -> any !80 (msg:"Egress HTTP but not port TCP/80"; flow:to_server; sid:10000003;)
  • 此规则阻止不使用标准端口80的HTTP流量。目标端口字段中的 !80 匹配除80以外的任何端口。这可以防止应用程序使用非标准端口进行HTTP流量,这是一种常见的规避技术,用于绕过仅关注标准端口的安全监控。

# 端口443只能用于TLS流量
drop tcp $HOME_NET any -> any 443 (msg:"Egress Port TCP/443 but not TLS"; app-layer-protocol:!tls; flow:to_server; sid:10000004;)
  • 此规则阻止端口443上任何不使用TLS协议的TCP流量。与端口80规则类似,这可以防止将HTTPS端口滥用于非加密或自定义协议流量,确保只有合法的加密Web流量使用此端口。

# 出站TLS流量必须使用端口443
drop tls $HOME_NET any -> any !443 (msg:"Egress TLS but not port TCP/443"; flow:to_server; sid:10000005;)
  • 此规则阻止不使用标准端口443的TLS/加密流量。这可以防止应用程序在非标准端口上使用TLS来规避安全控制,这种技术通常用于通过防火墙隧道传输被禁止的流量。

# 端口22只能用于SSH流量
drop tcp $HOME_NET any -> any 22 (msg:"Egress Port TCP/22 but not SSH"; app-layer-protocol:!ssh; flow:to_server; sid:10000006;)
  • 此规则阻止端口22上任何不使用SSH协议的TCP流量。这可以防止将SSH端口用于其他类型的流量,确保此端口上只允许合法的SSH连接。

# 出站SSH流量必须使用端口22
drop ssh $HOME_NET any -> any !22 (msg:"Egress SSH but not port TCP/22"; flow:to_server; sid:10000007;)
  • 此规则阻止不使用标准端口22的SSH流量。这可以防止在非标准端口上进行SSH隧道传输,这是一种常用于绕过网络安全控制的技术。

验证

  1. 等待约30秒至1分钟,让规则生效
  2. 返回出站测试脚本URL并再次运行测试
  3. 验证端口/协议规避尝试现在已被阻止