ACL во FreeSWITCH

в 10:33, , рубрики: acl, freeswitch, ip-телефония, Песочница, метки: ,

В данной статье попробую собрать в одной статье выжимки из документации и известные мне сведения об Acces Control List (ACL) во FreeSWITCH.

Итак, конфигурация ACL записывается в файле autoload_configsacl.conf.xml
Тэг configuration имеет имя acl.conf и внутри него тэг списка network-lists:

<configuration name="acl.conf" description="Network Lists">
	<network-lists>
	</network-lists>
</configuration>

В network-lists может быть определен один или несколько именованных списков ACL:

<list name="test" default="deny">
	<node type="allow" cidr="1.2.3.0/24"/>
</list>

Список должен иметь уникальное имя и в атрибуте default определяется действие по умолчанию — deny (запретить) или allow (разрешить).
Обратите внимание, что FreeSWITCH автоматически создает несколько ACL со следующими именами:
rfc1918.auto — RFC 1918
nat.auto — RFC 1918 за исключением вашей локальной сети
localnet.auto — ACL для вашей локальной сети
loopback.auto — ACL для вашей локальной сети

RFC 1918 определяет следующие диапазоны IP адресов для локальных сетей:
10.0.0.0 — 10.255.255.255 — 10.0.0.0/8
172.16.0.0 — 172.31.255.255 — 172.16.0.0/12
192.168.0.0 — 192.168.255.255 — 192.168.0.0/16

В списке определяется один или несколько узлов — node:
<node type=«allow» cidr=«1.2.3.0/24»/>
Атрибут тип узла может быть deny (запретить) или allow (разрешить), он определяет правило для данного узла. Правила применяются от менее специфичных к более специфичным. Правила определенные в узле перекрывают правило, определенное по умолчанию в списке (<list default=«deny»>).
Следующий за типом атрибут может быть одним из следующих:
cidr — указывается диапазон IP адресов в бесклассовой нотации, например: 192.168.0.0/16
domain — указывается домен, может быть указан в виде переменной, например: $${domain}
host — указывается, либо конкретный хост, либо с дополнительным параметром mask диапазон хостов.
Примеры:

<node type="allow" domain="$${domain}"/>
<node type="deny" cidr="192.168.42.0/24"/>
<node type="deny" host="4.3.2.0" mask="255.255.255.0"/>

Итак, в acl.conf.xml просто даются определения именованных списков ACL, т.е. списков с разрешенными или не разрешенными диапазонами IP адресов.
Где их можно использовать?
Как минимум в трех местах: профиле SIP, каталоге (directory) абонентов и в event_socket.
Также ACL можно использовать в диалплане и API.

SIP профиль

Профили SIP располагаются обычно в conf/sip_profiles/
В описании профиля есть несколько параметров, касающихся ACL.

apply-inbound-acl — Разрешить пользователям совершать звонки с определенного ACL/CIDR
apply-register-acl — Разрешить пользователям регистрироваться с определенного ACL/CIDR

В качестве атрибутов могут выступать: именованный список ACL (определенный, например, в autoload_configsacl.conf.xml) или CIDR:

<param name="apply-inbound-acl" value="<acl_list|cidr>"/>
<param name="apply-register-acl" value="<acl_list|cidr>"/>

Таким образом, если у вас в логе появилось такого рода сообщение:
2012-04-05 15:08:46.348105 [DEBUG] sofia.c:7567 IP 82.x.x.x Rejected by acl «domains». Falling back to Digest auth.
То, во-первых, это не ошибка, это отладочное (обратите внимание — DEBUG) сообщение, во-вторых оно говорит о том, что списком ACL с именем «domains» авторизация отклонена и будет осуществляться через пароль (Digest auth).
Запретить такие сообщения можно через параметр <param name=«log-auth-failures» value=«false»/>.

Параметров apply-inbound-acl и apply-register-acl может быть определено несколько. В этом случае все ACL будут проверены и сообщение будет отклонено, если любой из ACL не подойдет (внутри acl_list тестируется как OR, с несколькими параметрами тестируется как AND).
Телефоны с IP адресами в этих ACL будут иметь возможность выполнять звонки (apply-inbound-acl) или регистрироваться (apply-register-acl) без указания пароля (т.е. без получения сообщения «401 Unauthorized»).
Запомните, что списки ACL не блокируют какой-либо трафик. Если вы хотите защитить свой FreeSWITCH, вам необходимо настраивать файрвол. Также, если вы хотите ограничить исходящие звонки, это надо делать средствами диалплана.
Также с параметрами apply-inbound-acl и apply-register-acl тесно связан параметр auth-calls.
Он определяет, будет ли выполняться проверка apply-inbound-acl и apply-register-acl.
<param name=«auth-calls» value="$${internal_auth_calls}"/>
Значение false запрещает использование ACL на этом профиле.
Примечание: В настоящее время auth-calls не работает с регистрацией через прокси. Вы должны будете сделать это внутри вашего скрипта xml_curl каталога или на вашем прокси.
Ещё один параметр:
apply-proxy-acl — использование IP, указанного в X-AUTH-IP заголовка полученного от прокси-сервера для проверки ACL.
Примечание: Вы должны настроить прокси для добавления этого заголовка.
<param name=«apply-proxy-acl» value=«myproxies»/>
Разрешает трафик для отправки FreeSWITCH через один или несколько прокси-серверов.
Прокси-сервер должен добавить заголовок с именем X-AUTH-IP содержащий IP-адрес клиента.
FreeSWITCH доверяет прокси, так как его IP указан в ACL прокси-сервера, и использует значение IP в заголовке, как IP-клиента для аутентификации ACL.
И ещё два, на мой взгляд, страшных, параметра влияют на использование ACL:
accept-blind-auth — если установлен в true, то любая аутентификация принимается без проверки
accept-blind-reg — если установлен в true, то любая регистрация принимается без проверки

Каталог (directory) абонентов

В определении абонента (пользователя) можно указывать CIDR:

<user id="1000" cidr="12.34.56.78/32,20.0.0.0/8">

Также ACL или CIDR можно указывать в параметре auth-acl при определении пользователя:

<include>
	<user id="1000" number-alias="1000">
		<params>
			<param name="password" value="1234"/>
			<param name="vm-password" value="1000"/>
			<param name="auth-acl" value="1.2.3.0/8"/>
		</params>
	<variables>
		<variable name="accountcode" value="1000"/>
		<variable name="user_context" value="default"/>
		<variable name="effective_caller_id_name" value="Extension 1000"/>
		<variable name="effective_caller_id_number" value="1000"/>
	</variables>
	</user>
</include>

Таким образом при включении auth-calls на профиле, абонент будет авторизовываться не по паролю, а по указанному ACL. Хотя, если авторизация по ACL не пройдет, то он всё-таки будет авторизовываться по паролю.

event_socket

Для определения доступа к сокету можно добавлять параметр apply-inbound-acl, в котором указывается именованный список ACL или CIDR:
<param name=«apply-inbound-acl» value="<acl_list|cidr>"/>
Заметьте, что несколько параметров apply-inbound-acl не будут работать. Он должен быть только один (сравните с профилем SIP — там наоборот их может быть несколько).

Приложения (applicatons)

Функция диалплана check_acl позволяет проверить ACL:
check_acl <ip> <acl | cidr> [<hangup_cause>]
Например:

<action application="check_acl" data="${network_addr} foo normal_clearing"/>
<action application="check_acl" data="${network_addr} 1.2.3.0/8 normal_clearing"/>

Это приложение может быть вызвано inline в диаплане.

Команды API

reloadacl перезагружает списки ACL:

reloadacl [<reloadxml>]

Если вы изменили acl.conf.xml, то можете перезагрузить существующий список.

acl проверяет IP адрес на наличие в списке ACL

acl <ip> <list|net>

freeswitch@mybox> acl 192.168.42.42 192.168.42.0/24
freeswitch@mybox> acl 192.168.42.42 list_foo

Для второй строки 'list_foo' ссылка на имя списка, который вы определили в acl.conf.xml.
Используя ACL может быть выполнена маршрутизация приложением acl. Например, если вы хотите пропускать звонки для хостов из списка ACL с именем list_foo:

<extension name="foo-hosts-calls">
	<condition field="${acl(${network_addr} list_foo)}" expression="true"/>
	<condition field="destination_number" expression="(.*)">
		<action application="bridge" data="sofia/default/$1@x.x.x.x:5060"/>
	</condition>
</extension>

Ну вот в общих чертах как-то так.

Автор: Freeswitched

Поделиться

* - обязательные к заполнению поля