跳到主要内容

Diameter 安全性

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

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

架构概述

处理顺序

入站 Diameter 请求按以下顺序通过安全模块。任何阶段被拒绝的消息不会转发到后续阶段。

顺序模块方向目的
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 过滤保护家庭用户免受来自互联的消息攻击。受保护的命令码上的消息会检查用户身份(User-Name AVP 中的 IMSI,AVP 701 中的 MSISDN)。如果身份与家庭用户前缀匹配,则拒绝该消息 — 家庭用户的合法流量应来自家庭网络内部,而不是来自外部对等方。

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

# 顶层:定义家庭用户前缀
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,
# 最大合理速度(以 km/h 为单位)(FS.19 第 3.3.7.2 节)
max_velocity_kmh: 1200,
# 同一 IMSI 来自不同领域的 ULR 之间的最小秒数
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最大合理速度(以 km/h 为单位)。保留用于未来的地理距离计算。
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_hostapplication_idcommand_codeapplication_namecommand_namereason


拓扑隐藏

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

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

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

特性

特性FS.19 参考描述
Route-Record 剥离第 2.4 节移除所有揭示内部路由路径和节点主机名的 Route-Record AVP(282)
Origin-Host 重写第 3.4 节在答复消息中用 DRA 自身的身份(或自定义值)替换 Origin-Host AVP
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在转发到外部对等方之前,从消息中移除所有 Route-Record AVP(代码 282)。
rewrite_origin_host映射见下文控制答复消息中的 Origin-Host 重写。
rewrite_origin_realm映射见下文控制答复消息中的 Origin-Realm 重写。
external_peers:all 或 列表:all被视为外部的对等方。拓扑隐藏仅应用于目标为这些对等方的消息。对于互联部署使用 :all。使用主机名列表进行选择性应用。

重写参数(适用于 rewrite_origin_hostrewrite_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_ratelimit
[: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 节