跳到主要内容

Diameter 安全

OmniDRA 提供了一整套全面的 Diameter 安全模块。它们与 GSMA FS.19(Diameter 互联安全,v10.0)和 GSMA FS.21(互联信令安全建议,v12.0)保持一致。这些模块保护网络免受 Diameter 互联接口上的信令级攻击。

您可以独立配置每个模块。您可以启用或禁用每个模块,而不会影响其他模块。每个模块都会发出自己的遥测事件以进行监控和警报。

架构概述​

处理顺序​

入站 Diameter 请求按以下顺序通过安全模块。如果某个阶段拒绝消息,DRA 将不会将其转发到后续阶段。

顺序模块方向目的
1速率限制器入站体积洪水保护
2Diameter 防火墙入站FS.19 协议和内容过滤
3AVP 清理器入站AVP 验证和剥离
4路由引擎-标准 Diameter 路由
5拓扑隐藏出站网络拓扑隐蔽

操作​

所有安全模块在检测到违规时支持可配置的操作。您可以按模块和按类别为 Diameter 防火墙配置操作。

操作行为Diameter 结果
{:error, 3002}以 Diameter 错误答复响应DIAMETER_UNABLE_TO_DELIVER
{:error, 3004}以 Diameter 错误答复响应DIAMETER_TOO_BUSY
{:error, 3007}以 Diameter 错误答复响应DIAMETER_APPLICATION_UNSUPPORTED
:drop丢弃消息不发送响应
:log_only记录违规但允许消息通过消息继续

Diameter 防火墙​

Diameter 防火墙实现了 GSMA FS.19 第 3.3 节 中定义的四个过滤层。它还实现了 FS.21 第 7 节 中的协议无关数据包分类。防火墙按顺序评估每一层消息。在任何一层发生违规时,进一步处理将停止。

低层格式过滤​

GSMA 参考: FS.19 第 3.3.4 节,FS.21 第 7.3.1 节

低层过滤检测协议级违规和基本的反欺骗尝试。它不需要理解上层应用语义。此层在消息到达更深层检查之前捕获格式错误的消息。

执行的检查:

检查FS.19 参考描述
AVP 重复第 3.3.4 节,4.8.1检测必须最多出现一次的 AVP 的重复实例(例如 Origin-Host, Origin-Realm)。防止 AVP 重复规避攻击。
Session-Id 排序第 3.3.4 节确认 Session-Id(AVP 263)是消息中的第一个 AVP,符合 RFC 6733 第 8.8 节。
答复中的 Destination-Host第 3.3.4 节拒绝包含 Destination-Host AVP 的答复消息。这是一个协议违规,可能表明过滤规避。
强制 AVP 验证第 3.3.5 节确认每个命令代码所需的 AVP 存在。例如,ULR 必须包含 User-Name 和 Visited-PLMN-Id,符合 3GPP TS 29.272 第 7.2.3 节。
low_layer: %{
enabled: true,
action: {:error, 3002},
# AVP 代码,不能出现多于一次(FS.19 第 3.3.4 节)
# 264 = Origin-Host, 296 = Origin-Realm, 283 = Destination-Realm, 293 = Destination-Host
single_instance_avps: [264, 296, 283, 293],
# Session-Id 必须是第一个 AVP(RFC 6733 第 8.8 节)
enforce_session_id_first: true,
# 答复消息不能包含 Destination-Host(FS.19 第 3.3.4 节)
reject_destination_host_in_answers: true,
# 每个命令代码的强制 AVP(3GPP TS 29.272)
# 1 = User-Name (IMSI), 1407 = Visited-PLMN-Id, 264 = Origin-Host, 296 = Origin-Realm
mandatory_avps: %{
316 => [1, 1407, 264, 296],
318 => [1, 1407, 264, 296]
}
}

类别 1 - 接口未授权数据包过滤​

GSMA 参考: FS.19 第 3.3.5 节,FS.21 第 7.2.1 节

类别 1 过滤仅接受每个互联接口上授权的 Diameter 应用程序 ID 和命令代码。这防止外部访问仅限内部的接口。例如,它阻止通过 S6a 接口的 Sh 命令。它还强制漫游合作伙伴仅发送其漫游协议覆盖的消息类型。

白名单方法遵循 FS.19 的建议:阻止所有 Diameter 消息,除非该接口需要的消息。

您可以全局配置白名单,这适用于所有对等方,或按对等方配置。每个对等方的白名单允许不同的漫游合作伙伴拥有不同的允许消息集。

category_1: %{
enabled: true,
action: {:error, 3007},
whitelists: %{
# 每个对等方的白名单 - 限制此合作伙伴仅限 ULR 和 AIR(FS.19 第 3.3.5 节)
"restricted-partner.roaming.com" => %{
16_777_251 => [316, 318]
},
# 默认白名单 - 所有其他对等方允许的标准 S6a 命令
all: %{
# S6a/S6d (FS.19 第 3.3.5 节,表 2)
16_777_251 => [316, 317, 318, 319, 320, 321, 323],
# S13 - ME 身份检查 (FS.19 第 3.3.5 节)
16_777_252 => [324],
# S6c - 通过 HSS 的 SMS (FS.19 第 3.3.5.1 节)
16_777_312 => [8388647, 8388648],
# SGd - 通过 MME 的 SMS (FS.19 第 3.3.5.2 节)
16_777_313 => [8388645, 8388646]
}
}
}

常见 S6a/S6d 白名单:

命令代码名称方向参考
316更新位置请求/答复MME → HSS3GPP TS 29.272 §7.2.3
317取消位置请求/答复HSS → MME3GPP TS 29.272 §7.2.7
318身份验证信息请求/答复MME → HSS3GPP TS 29.272 §7.2.5
319插入用户数据请求/答复HSS → MME3GPP TS 29.272 §7.2.9
320删除用户数据请求/答复HSS → MME3GPP TS 29.272 §7.2.11
321清除 UE 请求/答复MME → HSS3GPP TS 29.272 §7.2.13
323通知请求/答复MME → HSS3GPP TS 29.272 §7.2.15

漫游互联的常见应用程序 ID(FS.19 第 3.3.5 节):

应用程序 ID接口参考
16777251S6a/S6d3GPP TS 29.272
16777252S133GPP TS 29.272
16777312S6c3GPP TS 29.338
16777313SGd3GPP TS 29.338
16777255SLg3GPP TS 29.172
16777267S93GPP TS 29.215

类别 2 - 家庭网络数据包过滤​

GSMA 参考: FS.19 第 3.3.6 节,FS.21 第 7.2.2 节

类别 2 过滤保护家庭用户免受来自互联的针对他们的消息。防火墙检查受保护命令代码的消息以获取用户身份(IMSI 在 User-Name AVP 中,MSISDN 在 AVP 701 中)。如果身份与家庭用户前缀匹配,防火墙将拒绝该消息。家庭用户的合法流量来自家庭网络内部,而不是来自外部对等方。

这防止了外部实体发送位置更新、用户数据请求或身份验证查询,针对运营商自己的用户的攻击。

# 顶层:定义家庭用户前缀
home_imsi_prefixes: ["31338", "31339"],
home_msisdn_prefixes: ["+1313"],

category_2: %{
enabled: true,
action: {:error, 3002},
# S6a 命��代码,携带用户身份(FS.19 第 3.3.6 节,表 12)
protected_command_codes: [316, 317, 318, 319, 320, 321, 323]
}

类别 3 - 合理网络数据包过滤​

GSMA 参考: FS.19 第 3.3.7 节,FS.21 第 7.2.3 节

类别 3 过滤检测不合理的位置变化。它跟踪每个用户(IMSI)的最后一次看到的网络。当来自与上一个不同的访问网络的更新位置请求到达时,防火墙将经过的时间与可配置的阈值进行比较。发生的领域变化如果比物理上可能的速度快,则表明潜在攻击,例如伪造的位置更新。

该模块在 ETS 表中维护状态感知的每个 IMSI 跟踪。它会自动清理过期条目。它定期删除超过 24 小时的条目。

执行的检查:

检查FS.19 参考描述
先前位置检查第 3.3.7.1 节比较当前 ULR 的 Origin-Realm 与该 IMSI 的最后一次看到的 Origin-Realm
速度/时间检查第 3.3.7.2 节标记在可配置的最小时间窗口内发生的领域变化
category_3: %{
enabled: true,
# 开始时使用 log_only 观察模式,然后再强制执行(FS.19 第 3.3.7 节)
action: :log_only,
# 最大合理速度(公里/小时)(FS.19 第 3.3.7.2 节)
max_velocity_kmh: 1200,
# 同一 IMSI 从不同领域更新之间的最小秒数
min_time_between_updates_seconds: 2
}

配置​

在顶层启用 Diameter 防火墙。独立配置每个过滤层。将每个类别部分中的配置片段组合在单个 module_diameter_firewall 键下:

config :dra,
module_diameter_firewall: %{
enabled: true,
home_imsi_prefixes: ["31338", "31339"],
home_msisdn_prefixes: ["+1313"],
low_layer: %{ ... }, # 请参见上面的低层格式过滤
category_1: %{ ... }, # 请参见上面的类别 1
category_2: %{ ... }, # 请参见上面的类别 2
category_3: %{ ... } # 请参见上面的类别 3
}

顶层参数​

参数类型必需默认描述
enabled布尔是false启用或禁用整个 Diameter 防火墙模块。当为 false 时,所有消息均可通过而不进行检查。
children列表否[]DRA 主管在启用模块时启动的进程。对于防火墙,将其设置为 [DRA.Router.Modules.DiameterFirewall.LocationTracker]。类别 3 状态感知(速度)跟踪需要它。
home_imsi_prefixes列表否[]识别家庭用户的 IMSI 前缀字符串列表。类别 2 过滤使用它。示例:["31338", "31339"]。
home_msisdn_prefixes列表否[]识别家庭用户的 MSISDN 前缀字符串列表。类别 2 过滤使用它。示例:["+1313"]。

低层参数​

参数类型必需默认描述
enabled布尔否true启用或禁用低层格式过滤。
action操作否{:error, 3002}当防火墙检测到低层违规时采取的操作。
single_instance_avps列表否[264, 296, 283, 293]消息中不能出现多于一次的 AVP 代码。默认覆盖 Origin-Host (264)、Origin-Realm (296)、Destination-Realm (283) 和 Destination-Host (293)。
enforce_session_id_first布尔否true拒绝 Session-Id 不是第一个 AVP 的消息。
reject_destination_host_in_answers布尔否true拒绝包含 Destination-Host AVP 的答复消息。
mandatory_avps映射否%{}命令代码到所需 AVP 代码列表的映射。示例:%{316 => [1, 1407, 264, 296]} 要求 ULR 消息中包含 User-Name、Visited-PLMN-Id、Origin-Host 和 Origin-Realm。

类别 1 参数​

参数类型必需默认描述
enabled布尔否true启用或禁用类别 1 过滤。
action操作否{:error, 3007}当防火墙检测到类别 1 违规时采取的操作。默认响应 DIAMETER_APPLICATION_UNSUPPORTED。
whitelists映射是-对等主机名(或 :all)到允许的应用程序 ID / 命令代码组合的映射。:all 键提供默认白名单。特定对等方条目优先。

类别 2 参数​

参数类型必需默认描述
enabled布尔否true启用或禁用类别 2 过滤。
action操作否{:error, 3002}当消息从互联针对家庭用户时采取的操作。
protected_command_codes列表否[]触发家庭用户身份检查的命令代码。通常是携带用户身份的 S6a 命令代码。

类别 3 参数​

参数类型必需默认描述
enabled布尔否false启用或禁用类��� 3 过滤。它需要 LocationTracker 进程。主管在启用模块时自动启动此进程。
action操作否:log_only当位置合理性检查失败时采取的操作。开始时使用 :log_only 以调整阈值,然后再强制执行。
max_velocity_kmh整数否1200最大合理速度(公里/小时)。保留用于未来的地理距离计算。
min_time_between_updates_seconds整数否2同一 IMSI 从不同领域更新之间的最小时间(秒)。防火墙标记比此速度更快的领域变化。

遥测事件​

事件描述
[:diameter, :firewall, :low_layer, :block]防火墙检测到并阻止了低层格式违规
[:diameter, :firewall, :category_1, :block]防火墙检测到并阻止了类别 1 违规
[:diameter, :firewall, :category_2, :block]防火墙检测到并阻止了类别 2 违规
[:diameter, :firewall, :category_3, :block]防火墙检测到并阻止了类别 3 违规
[:diameter, :firewall, :pass, :count]消息通过了所有防火墙检查

所有事件都包括以下元数据:origin_host、application_id、command_code、application_name、command_name 和 reason。


拓扑隐藏​

GSMA 参考: FS.19 第 2.4 节,第 3.4 节;FS.21 第 3.6 节

拓扑隐藏模块防止将内部网络拓扑暴露给外部对等方。当 Diameter 消息穿越多个内部节点时,它们会累积 Route-Record AVP。它们还携带 Origin-Host/Origin-Realm 值,这些值揭示了内部主机名、网络结构和节点计数。攻击者可以利用这些信息来映射内部网络以进行针对性攻击。

拓扑隐藏在 出站路径 上操作。它在 DRA 做出路由决策后运行,并在将消息转发到目标对等方之前运行。

特性​

特性FS.19 参考描述
Route-Record 剥离第 2.4 节移除所有揭示内部路由路径和节点主机名的 Route-Record AVP(282)
Origin-Host 重写第 3.4 节在答复消息中将 Origin-Host AVP 替换为 DRA 自身的身份(或自定义值)
Origin-Realm 重写第 3.4 节可选地替换 Origin-Realm AVP 以隐藏内部领域结构
每个对等方控制-有选择性地应用拓扑隐藏,仅对外部对等方或所有对等方
module_topology_hiding: %{
enabled: true,
# 剥离揭示内部路径的 Route-Record AVP(FS.19 第 2.4 节)
strip_route_records: true,
# 在答复中重写 Origin-Host 以隐藏内部节点名称(FS.19 第 3.4 节)
rewrite_origin_host: %{enabled: true, replacement: :self},
# 可选地隐藏内部领域结构
rewrite_origin_realm: %{enabled: false, replacement: :self},
# 应用于所有外部对等方,或列出特定主机名
external_peers: :all
}

参数​

参数类型必需默认描述
enabled布尔是false启用或禁用拓扑隐藏模块。
strip_route_records布尔否true在 DRA 将消息转发到外部对等方之前,从消息中删除所有 Route-Record AVP(代码 282)。
rewrite_origin_host映射否见下文控制答复消息中的 Origin-Host 重写。
rewrite_origin_realm映射否见下文控制答复消息中的 Origin-Realm 重写。
external_peers:all 或 列表否:all模块视为外部的对等��。模块仅对这些对等方的目标消息应用拓扑隐藏。对于互联部署,使用 :all。使用主机名列表进行选择性应用。

重写参数(适用于 rewrite_origin_host 和 rewrite_origin_realm):

参数类型必需默认描述
enabled布尔否varies启用此 AVP 的重写。默认情况下,Origin-Host 为 true,Origin-Realm 为 false。
replacement:self 或 字符串否:self替换值。:self 使用 DRA 的身份(来自 diameter 配置的 host.realm)。模块按原样使用字符串值。

遥测事件​

事件描述
[:diameter, :topology_hiding, :route_record, :stripped]模块移除了 Route-Record AVP。测量包括剥离的 AVP 数量。
[:diameter, :topology_hiding, :origin_host, :rewritten]模块重写了 Origin-Host AVP
[:diameter, :topology_hiding, :origin_realm, :rewritten]模块重写了 Origin-Realm AVP

速率限制器​

GSMA 参考: FS.19 第 3.4 节(可用性 / DoS 保护)

速率限制器对每个对等方实施消息速率限制。它保护免受体积攻击和消息洪水。它作为管道中的第一个安全检查,在任何消息解析或内容检查之前运行。这尽早减轻了过载。

速率限制器通过滑动窗口计数器跟踪每个对等方的速率限制。每个对等方都有一个独立的计数器,每秒重置一次。

module_rate_limiter: %{
enabled: true,
# 所有对等方的默认限制(FS.19 第 3.4 节)
default_max_requests_per_second: 1000,
default_action: {:error, 3004},
# 每个对等方的覆盖
peer_limits: %{
"high-volume-partner.roaming.com" => %{max_requests_per_second: 5000, action: {:error, 3004}},
"restricted-peer.roaming.com" => %{max_requests_per_second: 100, action: :drop}
}
}

参数​

参数类型必需默认描述
enabled布尔是false启用或禁用速率限制器模块。
children列表否[]DRA 主管在启用时启动的进程。将其设置为 [DRA.Router.Modules.RateLimiter],以便每个对等方的速率计数器进程运行。
default_max_requests_per_second整数否1000来自任何单个对等方的默认最大请求数。
default_action操作否{:error, 3004}当对等方超过其速率限制时的默认操作。{:error, 3004} 响应 DIAMETER_TOO_BUSY。
peer_limits映射否%{}对等主机名到覆盖配置的映射。未列出的对等方使用默认值。

每个对等方覆盖参数:

参数类型必需默认描述
max_requests_per_second整数否继承默认值此特定对等方的最大请求数。
action操作否继承默认值当此对等方超过其速率限制时的操作。

遥测事件​

事件描述
[:diameter, :rate_limiter, :throttled]模块对消息进行了速率限制。测量包括 current_rate 和 limit。
[:diameter, :rate_limiter, :allowed]消息在速率限制内。

AVP 清理器​

GSMA 参考: FS.19 第 3.3.4 节,4.8.1,4.8.2;FS.21 第 3.6 节

AVP 清理器在互联边界验证和清理 Diameter AVP。它解决了 FS.21 第 3.6 节的建议。这些建议处理在 FS.19 过滤类别级别以下操作的协议级操控攻击。

特性​

特性GSMA 参考描述
未知供应商 AVP 剥离FS.21 第 3.6 节移除来自非白名单供应商的 AVP。防止注入可能触发后端节点意外行为的专有 AVP。
分组 AVP 嵌套深度FS.21 第 3.6 节强制分组 AVP 的最大嵌套深度。防止使用深度嵌套 AVP 结构的堆栈溢出攻击。
module_avp_sanitizer: %{
enabled: true,
action: {:error, 3002},
# 仅允许标准供应商 AVP 在互联上(FS.21 第 3.6 节)
# 0 = IETF, 10415 = 3GPP, 13019 = ETSI, 5535 = 3GPP2
allowed_vendor_ids: [0, 10415, 13019, 5535],
strip_unknown_vendor_avps: true,
# 防止通过深度嵌套的分组 AVP 导致堆栈溢出(FS.21 第 3.6 节)
max_avp_nesting_depth: 10
}

参数​

参数类型必需默认描述
enabled布尔是false启用或禁用 AVP 清理器模块。
action操作否{:error, 3002}当模块检测到嵌套深度违规时采取的操作。供应商剥离会移除违规的 AVP,而不会阻止消息。
allowed_vendor_ids列表否[0, 10415, 13019, 5535]允许在互联上的供应商 ID 列表。模块会剥离来自其他供应商的 AVP。
strip_unknown_vendor_avps布尔否true启用剥离不在 allowed_vendor_ids 列表中的供应商的 AVP。
max_avp_nesting_depth整数否10允许的分组 AVP 嵌套的最大深度。配置的 action 适用于超过此深度的消息。

常见供应商 ID:

供应商 ID组织备注
0IETF在 RFC 中定义的标准 Diameter AVP
104153GPP所有 3GPP 定义的 AVP(S6a、Gx、Rx 等)
13019ETSIETSI 定义的 AVP
55353GPP23GPP2 定义的 AVP(CDMA 互通)

遥测事件​

事件描述
[:diameter, :avp_sanitizer, :unknown_vendor, :stripped]模块剥离了一个或多个来自未知供应商的 AVP
[:diameter, :avp_sanitizer, :nesting_depth, :violation]消息超过了最大 AVP 嵌套深度
[:diameter, :avp_sanitizer, :pass, :count]消息通过了所有清理检查

部署建议​

推荐启用顺序​

当您首次部署安全模块时,逐个启用它们。这可以避免对实时流量的干扰:

  1. 速率限制器 - 从宽松的限制开始,监控流量模式。在了解基线速率后收紧限制。
  2. AVP 清理器 - 误报风险低。启用剥离和嵌套检查。
  3. Diameter 防火墙(类别 1) - 根据漫游协议定义白名单。从已知良好的应用程序 ID / 命令代码组合开始。
  4. Diameter 防火墙(低层) - 启用协议一致性检查。
  5. Diameter 防火墙(类别 2) - 配置家庭 IMSI/MSISDN 前缀。
  6. 拓扑隐藏 - 首先启用 Route-Record 剥离,然后重写 Origin-Host。
  7. Diameter 防火墙(类别 3) - 启用它并使用 :log_only 操作。在强制执行之前观察位置模式。

深度防御​

这些模块实现了 FS.19 第 3.4 节中的 深度防御 原则。每一层针对不同类型的攻击:

攻击类别主要防御次要防御
体积型 DoS速率限制器Diameter 防火墙(所有类别)
接口滥用类别 1AVP 清理器
家庭用户针对类别 2类别 1(接口限制)
位置欺骗类别 3类别 2(家庭用户检查)
拓扑发现拓扑隐藏-
AVP 注入AVP 清理器低层过滤
协议规避(AVP 重复)低层过滤AVP 清理器

GSMA 文档交叉引用​

模块 / 特性FS.19 v10.0FS.21 v12.0
低层格式过滤第 3.3.4 节第 7.3.1 节
类别 1 过滤第 3.3.5 节,附录 B.3.3第 7.2.1 节
类别 2 过滤第 3.3.6 节,附录 B.3.4第 7.2.2 节,第 16 节
类别 3 过��第 3.3.7 节,附录 B.3.5第 7.2.3 节
拓扑隐藏第 2.4 节,第 3.4 节第 3.6 节
速率限制第 3.4 节-
AVP 清理第 4.8.1 节,4.8.2 节第 3.6 节
深度防御第 3.4 节第 3.15 节
过滤类别(协议无关)附录 A第 7 节