Asterisk的phoneprov模块可以安全使用吗?

我使用由Ubuntu Server 16.04打包的Asterisk 13.1.0来运行纯VoIP电话系统。 Asterisk有一个模块 – phoneprov – 允许它模板化特定线路的configuration文件,并从内置的HTTP服务器提供服务。 我想用它来configuration我的Polycom IP电话,但我无法弄清楚如何安全地进行操作。 更复杂的事情,我已经使用内置HTTP服务器的SIP通过WebSockets。

据我所知, phoneprov模块根本没有authentication或授权机制。 这似乎只是服务任何人谁问的文件。 由于生成的configuration文件包含注册为一条线路所需的所有凭证,因此任何可以向内置HTTP服务器发出HTTP请求的人都可以通过phoneprov注册为任何行。 这似乎太明显的安全问题存在于软件中,像Asterisk那样高调地存在,在文档中甚至在互联网上甚至(据我所知)都可以窥探它。 我在这里错过了什么?

TLS相互authentication

至less在我看来,理想的方式是通过TLS客户端证书来validation硬件IP电话的供应。 几乎所有的主要制造商都会在他们的手机上发布一个由私人CA签署的客户端证书,该证书通过MAC地址来识别手机。 由于configuration文件也是由MAC地址提供的,因此将证书中的MAC与URL中的MAC进行匹配并以此方式控制访问是非常简单的。

这就是我的基于nginx的configuration服务器(它处理除了线路凭证以外的所有configuration)。 但是,Asterisk不支持TLS客户端身份validation。 它有一个TCP和TLS套接字侦听器的通用实现,并且通过阅读源代码证实它不支持请求客户端证书。

更正 :Asterisk的tcpctls系统确实支持客户端证书validation,但是它只能validation客户端证书是否有效,并且(可选)它的commonName匹配客户端的主机名。 虽然可以为Asterisk HTTP服务器启用该选项,但对保护phoneprov没有多大帮助,因为该模块不使用主机名(或其他任何名称)进行授权。 它也会通过WebSocket破坏SIP。

HTTP身份validation

如果无法使用TLS身份validation,则使用HTTP基本身份validation来保护对configuration文件的访问是有意义的。 访问configuration服务器的证书本身必须以某种方式进行configuration,但总比没有好。

不幸的是,我已经通过阅读源码来确认,虽然Asterisk的HTTP服务器支持HTTP基本authentication,但是phoneprov模块并没有使用该function。

通过反向代理validation

如果Asterisk无法对自身的请求进行身份validation,那么我希望在请求连接到Asterisk之前使用像nginx这样的反向代理来处理身份validation。 这对我来说尤其方便,因为我已经configuration了nginx来authenticationconfiguration客户端。 不幸的是,这种方法有两个主要问题:

首先,Asterisk不支持X-Forwarded-For头部或者在逆向代理之后使用的任何其他方式发现真正的客户端IP地址。 我已经通过检查源代码来确认这一点。 使用反向代理时,Asterisk中的所有请求将显示为127.0.0.1 。 这不会是phoneprov ,但是基于WebSockets的SIP实现位于同一台服务器上,而不正确的客户端IP地址会导致严重的SIP问题。 没有办法将SIP over WebSockets服务器与phoneprov服务器分开,并且phoneprov服务器不能暴露于Internet或反向代理服务器毫无意义。

其次,即使客户端IP问题不成问题,也很难保证对Asterisk HTTP服务器的本地访问,因为它只支持在TCP套接字上侦听。 在使用反向代理进行身份validation时,需要保护代理和后端之间的连接,以防止攻击者绕过代理。 当代理和后端在同一台计算机上时,通常使用UNIX域套接字进行连接,以便使用文件系统权限进行保护。 这种方法对于Asterisk来说是不可能的,而且很难确保TCP套接字(即使是绑定到127.0.0.1 TCP套接字)被未​​经授权的本地进程(如受到威胁的PHP应用程序)访问。

完全避免使用HTTP

phoneprov模块也支持将其生成的文件导出到文件系统。 做到这一点是可以接受的,然后通过另一个可以像我现有的nginxconfiguration服务器那样对客户端进行authentication的web服务器来提供服务,虽然由于需要在更改时重新生成而不太方便。 但是,如果文件不能通过Asterisk HTTP服务器未经身份validation访问,则该方法仅提供安全性。

不幸的是,根据我对源代码的阅读,似乎没有任何方法可以阻止phoneprov通过HTTP提供文件,而完全禁用Asterisk HTTP服务器,这是我无法做到的,因为我需要SIP通过WebSockets。

TL; DR

我想使用Asterisk的phoneprov模块来configuration我的硬件电话,但我找不到任何方法来保护对其生成的configuration文件的访问。 这显然是不可接受的,因为这些文件包含SIP凭证。 有什么我在这里失踪? 有没有人在生产中使用phoneprov ? 他们如何保护它?