我正在使用 Ubuntu Server 16.04 打包的 Asterisk 13.1.0 来运行纯 VoIP 电话系统。Asterisk 有一个模块 – phoneprov
– 允许它为特定线路模板化配置文件并从其内置 HTTP 服务器提供这些文件。我想用它来配置我的 Polycom IP 电话,但我不知道如何安全地做到这一点。让事情变得更加复杂的是,我已经在使用内置 HTTP 服务器进行 SIP over WebSockets 通信了。
据我所知,该phoneprov
模块根本没有身份验证或授权机制。它似乎只是向任何询问的人提供任何文件。由于生成的配置文件包含注册为线路所需的所有凭据,因此任何能够向内置 HTTP 服务器发出 HTTP 请求的人都可以注册为通过配置的任何线路phoneprov
。这似乎是一个太明显的安全问题,存在于像 Asterisk 这样备受瞩目的软件中,文档中甚至(据我所知)在整个互联网上都对此只字未提。我这里遗漏了什么吗?
TLS 相互认证
至少在我看来,对硬件 IP 电话进行身份验证以进行配置的理想方式是通过 TLS 客户端证书。几乎所有主要制造商的手机都附带由私人 CA 签名的客户端证书,该证书通过手机的 MAC 地址识别手机。由于配置文件也是通过 MAC 地址提供的,因此将证书中的 MAC 与 URL 中的 MAC 进行匹配并以此方式控制访问非常简单。
这就是我的基于 nginx 的配置服务器(它处理除线路凭证之外的所有配置)所做的。但是,Asterisk 永远不支持任何 TLS 客户端身份验证。它有一个用于 TCP 和 TLS 的套接字侦听器的通用实现,我通过阅读源代码确认它不支持请求客户端证书。
更正:Asterisk 的tcpctls
系统确实支持客户端证书验证,但它只能验证客户端证书是否有效以及(可选)其是否commonName
与客户端的主机名匹配。虽然该选项能为 Asterisk HTTP 服务器启用,但它对安全性没有多大帮助,phoneprov
因为该模块不使用主机名(或其他任何内容)进行授权。它还会破坏 WebSockets 上的 SIP。
HTTP 身份验证
如果无法使用 TLS 身份验证,则使用 HTTP 基本身份验证来保护对配置文件的访问是有意义的。访问配置服务器的凭据本身必须以某种方式进行配置,但这总比没有好。
不幸的是,通过阅读源代码我确认,虽然 Asterisk 的 HTTP 服务器支持 HTTP Basic 身份验证,但该phoneprov
模块并未使用该功能。
通过反向代理进行身份验证
如果 Asterisk 无法自行验证请求,我希望使用 nginx 之类的反向代理在请求到达 Asterisk 之前处理身份验证。这对我来说特别方便,因为我已经配置了 nginx 来验证配置客户端。不幸的是,这种方法有两个主要问题:
首先,当在反向代理后面使用时,Asterisk 不支持X-Forwarded-For
标头或任何其他发现真实客户端 IP 地址的方法。我已通过检查源代码证实了这一点。127.0.0.1
当使用反向代理时,Asterisk 中的所有请求都将显示为来自。这对 来说不是世界末日phoneprov
,但 SIP over WebSockets 实现位于同一台服务器上,而错误的客户端 IP 地址会给 SIP 带来严重问题。无法将 SIP over WebSockets 服务器与服务器分开phoneprov
,并且phoneprov
服务器不能暴露在互联网上,否则反向代理就毫无意义了。
其次,即使客户端 IP 问题不是问题,也很难确保对 Asterisk HTTP 服务器的本地访问安全,因为它仅支持侦听 TCP 套接字。使用反向代理进行身份验证时,需要确保代理与后端之间的连接安全,以防止攻击者绕过代理。当代理和后端位于同一台机器上时,通常使用 UNIX 域套接字进行连接,以便可以使用文件系统权限进行保护。这种方法在 Asterisk 中无法实现,而且很难确保 TCP 套接字(即使是绑定到的套接字127.0.0.1
)免受未经授权的本地进程(例如受感染的 PHP 应用程序)的访问。
彻底避免 HTTP
该phoneprov
模块还支持将其生成的文件导出到文件系统。这样做是可以接受的,然后通过另一个可以对客户端进行身份验证的 Web 服务器(如我现有的 nginx 配置服务器)来提供这些文件,尽管由于需要在更改时重新生成文件,因此不太方便。但是,这种方法仅在文件无法通过 Asterisk HTTP 服务器未经身份验证访问时才提供安全性。
不幸的是,根据我对源代码的阅读,似乎没有任何方法可以阻止phoneprov
通过 HTTP 提供其文件,除非完全禁用 Asterisk HTTP 服务器,而我无法做到这一点,因为我需要它通过 WebSockets 进行 SIP。
总结
我想使用 Asterisk 的phoneprov
模块来配置我的硬件电话,但我找不到任何方法来保护对其生成的配置文件的访问。这显然是不可接受的,因为这些文件包含 SIP 凭证。我这里是不是漏掉了什么?有人phoneprov
在生产中使用吗?他们是如何保护它的?