Назад | Перейти на главную страницу

Можно ли безопасно использовать модуль phoneprov от Asterisk?

Я использую Asterisk 13.1.0 в пакете Ubuntu Server 16.04 для запуска телефонной системы, работающей исключительно на VoIP. У Asterisk есть модуль - phoneprov - что позволяет ему создавать шаблоны файлов конфигурации для определенных строк и обслуживать их со своего встроенного HTTP-сервера. Я хотел бы использовать его для настройки своих IP-телефонов Polycom, но не могу понять, как это сделать безопасно. Еще больше усложняя ситуацию, я уже использую встроенный HTTP-сервер для SIP через WebSockets.

Насколько я могу судить, phoneprov модуль вообще не имеет механизмов аутентификации или авторизации. Кажется, он просто обслуживает любой файл любому, кто его спросит. Поскольку сгенерированные файлы конфигурации содержат все учетные данные, необходимые для регистрации в виде строки, любой, кто может делать HTTP-запросы к встроенному HTTP-серверу, может зарегистрироваться как любая строка, предоставленная через phoneprov. Это кажется слишком очевидной проблемой безопасности, чтобы существовать в программном обеспечении, столь известном, как Asterisk, о котором не упоминалось ни в документации, ни даже (насколько я могу судить) в Интернете в целом. Я что-то упустил?

Взаимная аутентификация TLS

Идеальный способ, по крайней мере, на мой взгляд, аутентифицировать аппаратные IP-телефоны для обеспечения - это использовать сертификаты клиентов TLS. Почти все основные производители поставляют свои телефоны с сертификатом клиента, подписанным частным центром сертификации, который идентифицирует телефон по его MAC-адресу. Поскольку файлы конфигурации также обслуживаются по MAC-адресу, довольно просто сопоставить MAC из сертификата с MAC в URL-адресе и управлять доступом таким образом.

Это то, что делает мой сервер подготовки на основе nginx (который обрабатывает всю конфигурацию, кроме учетных данных линии). Однако Asterisk никогда не поддерживает аутентификацию клиента TLS. Он имеет одну распространенную реализацию прослушивателя сокетов для TCP и TLS, и я подтвердил, читая исходный код, что он не поддерживает запрос клиентских сертификатов.

Исправление: Asterisk's tcpctls система поддерживает проверку сертификата клиента, но может только проверить, что сертификат клиента действителен и (необязательно), что его commonName совпадает с именем хоста клиента. Хотя этот вариант жестяная банка быть включенным для HTTP-сервера Asterisk, это не очень помогает с защитой phoneprov поскольку этот модуль не использует имя хоста (или что-либо еще) для авторизации. Это также нарушило бы SIP через WebSockets.

HTTP-аутентификация

При отсутствии возможности использовать аутентификацию TLS имеет смысл использовать базовую аутентификацию HTTP для безопасного доступа к файлам конфигурации. Учетные данные для доступа к серверу инициализации должны быть каким-то образом подготовлены, но это лучше, чем ничего.

К сожалению, прочитав исходный код, я подтвердил, что, хотя HTTP-сервер Asterisk поддерживает базовую аутентификацию HTTP, phoneprov модуль не использует эту возможность.

Аутентификация через обратный прокси

Если Asterisk не может аутентифицировать запросы для себя, я хочу использовать обратный прокси, например nginx, для обработки аутентификации еще до того, как запрос попадет в Asterisk. Это было бы особенно удобно в моем случае, поскольку у меня уже есть nginx, настроенный для аутентификации клиентов инициализации. К сожалению, у такого подхода есть две основные проблемы:

Во-первых, Asterisk не поддерживает X-Forwarded-For заголовок или любые другие средства обнаружения реального IP-адреса клиента при использовании за обратным прокси. Я подтвердил это, изучив исходный код. Все запросы в Asterisk будут отправляться 127.0.0.1 когда используется обратный прокси. Это не будет концом света для phoneprov, но реализация SIP через WebSockets находится на том же сервере, и неправильные IP-адреса клиентов вызывают серьезные проблемы для SIP. Невозможно отделить сервер SIP через WebSockets от phoneprov сервер, а phoneprov сервер не может быть подключен к Интернету, или обратный прокси бессмыслен.

Во-вторых, даже если проблема с IP-адресом клиента не является проблемой, сложно обеспечить локальный доступ к HTTP-серверу Asterisk, поскольку он поддерживает только прослушивание сокетов TCP. При использовании обратного прокси для аутентификации соединение между прокси и серверной частью должно быть защищено, чтобы злоумышленники не могли обойти прокси. Когда прокси и серверная часть находятся на одном компьютере, для этого соединения обычно используются сокеты домена UNIX, чтобы его можно было защитить с помощью разрешений файловой системы. Такой подход невозможен с Asterisk, и очень сложно защитить сокеты TCP, даже те, которые привязаны к 127.0.0.1, от доступа неавторизованных локальных процессов, таких как скомпрометированное приложение PHP.

Избегайте HTTP полностью

В phoneprov модуль также поддерживает экспорт созданных файлов в файловую систему. Было бы приемлемо сделать это, а затем обслуживать их через другой веб-сервер, который может аутентифицировать клиентов, таких как мой существующий сервер подготовки nginx, хотя и менее удобно, учитывая необходимость регенерировать их при изменении. Однако такой подход обеспечивает безопасность только в том случае, если файлы также недоступны без аутентификации через HTTP-сервер Asterisk.

К сожалению, исходя из моего чтения исходного кода, похоже, нет никакого способа предотвратить phoneprov от обслуживания своих файлов через HTTP, за исключением полного отключения HTTP-сервера Asterisk, чего я не могу сделать, потому что он мне нужен для SIP через WebSockets.

TL; DR

Я хочу использовать Asterisk phoneprov модуль для подготовки моих аппаратных телефонов, но я не могу найти способ защитить доступ к его созданным файлам конфигурации. Это явно неприемлемо, поскольку эти файлы содержат учетные данные SIP. Что-то мне здесь не хватает? Кто-нибудь использует phoneprov в производстве? Как они это защищают?