Search
Write a publication
Pull to refresh

Linksys SPA Provisioning или облегчаем себе жизнь при массовой настройке IP-телефонов.

Предисловие


После недавнего «падения» сервера с Asterisk и его восстановления в логах обнаружил тысячи вот таких строк:
....
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"10/1/65"<sip:10/1/65@95.160.34.175>' failed for '184.82.7.52' - No matching peer found
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"11/1/65"<sip:11/1/65@95.160.34.175>' failed for '184.82.7.52' - No matching peer found
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"1346"<sip:1346@95.160.34.175>' failed for '184.82.7.52' - No matching peer found
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"1347"<sip:1347@95.160.34.175>' failed for '184.82.7.52' - No matching peer found
....

В секунду ~70 запросов с «левых» ip-адресов. Явный брутфорс стал для меня неприятным сюрпризом, который заставил задуматься о смене простых паролей для sip-клиентов на более сложные. Смена пароля в конфигах Asteriska дело нескольких минут, смена пароля в web-интерфейсе ip-телефона Linksys SPA922 — минута. Но когда этих телефонов около сотни это становится проблемой.

После недолгого гугления нашел информацию о Linksys SPA Provisioning. Что нам это дает? По умолчанию ip-телефоны, поддерживающие provisioning, при загрузке ищут в сети tftp-сервер с конфигурационными файлами вида spa$PSN.cfg и spa$MA.cfg, где $PSN — это модель (в моем случае $PSN=922), а $MA — MAC-адрес телефона. Файл spa$PSN.cfg может содержать как общий конфиг телефона, так и включать пути к другим файлам с конфигурацией. Файл spa$MA.cfg содержит индивидуальную данные телефона, как правило это логин/пароль. Это именно то, что нам нужно для массовой смены паролей. Приступим.

Настройка


ОС — Ubuntu 10.04 Server.

Устанавливаем tftp-сервер:

$ sudo apt-get install atftp atftpd

Правим настройки:

$ sudo mcedit /etc/default/atftpd
USE_INETD=true
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /srv/tftp"


меняем на

USE_INETD=false
OPTIONS="--daemon --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 --logfile=/var/log/atftp.log /var/tftp"


Выполняем команду:

$ sudo invoke-rc.d atftpd start

Создаем папку и меняем права:

$ sudo mkdir /var/tftp
$ sudo chmod -R 777 /var/tftp
$ sudo chown -R nobody /var/tftp


Создаем файл для ведения логов:

$ sudo touch /var/log/atftp.log

Перезапускаем tftp-сервер:

$ sudo /etc/init.d/atftpd restart

Примечание: у меня после этого сервер не запустился, в логах увидел ошибку atftpd: can't bind port :69/udp.
69 порт, по-умолчанию используемый tftp, занят.
Освободим его:

$ sudo /etc/init.d/openbsd-inetd stop
$ sudo invoke-rc.d atftpd restart


Проверяем:

$ ps -e | grep atftp
886 ? 00:00:02 atftpd


Настраиваем DHCP-сервер, всего лишь добавляем строчку:

$ sudo mcedit /etc/dhcp3/dhcpd.conf
....
subnet 192.168.0.0 netmask 255.255.255.0 {
....
option tftp-server-name "192.168.1.200";
....;
}


Перезапускаем:

$ sudo /etc/init.d/dhcpd restart

Создаем главный конфигурационный файл с таким содержимым:

$ sudo mcedit /var/tftp/sip922.cfg
<flat-profile>
<Profile_Rule ua="na">/linksys/spa.cfg</Profile_Rule>
<Profile_Rule_B ua="na">/linksys/spa$MA.cfg</Profile_Rule_B>
<Resync_Periodic ua="na">30</Resync_Periodic>
</flat-profile>


Создаем папку для всех остальных файлов:

$ sudo mkdir /var/tftp/linksys
$ sudo chmod -R 777 /var/tftp/linksys
$ sudo chown -R nobody /var/tftp/linksys


Раз уж делаем глобальное обновление, то скачаем заодно и новую прошивку для телефонов:

$ cd /var/tftp/linksys
$ wget http://download.cisco.com/swc/esd/03/282414121/anon/SPA942_6.1.5a.zip
$ 7z x SPA942_6.1.5a.zip


Создаем конфигурационный файл c глобальными настройками для ip-телефонов:

$ sudo mcedit /var/tftp/linksys/spa4all.cfg
<flat-profile>
<Upgrade_Rule>/linksys/spa942-6-1-5a.bin</Upgrade_Rule>
<Upgrade_Enable>Yes</Upgrade_Enable>
<Resync_Periodic ua="na">3600</Resync_Periodic>
<Voice_Mail_Number ua="na">8500#</Voice_Mail_Number>
<Primary_NTP_Server ua="na">time.etg.local</Primary_NTP_Server>
<Time_Zone ua="na">GMT+04:00</Time_Zone>
<Time_Format ua="na">24hr</Time_Format>
<Date_Format ua="na">day/month</Date_Format>
<Select_Logo ua="na">None</Select_Logo>
<Select_Background_Picture ua="na">None</Select_Background_Picture>
<BMP_Picture_Download_URL ua="na"></BMP_Picture_Download_URL>
<Text_Logo ua="na">ETech</Text_Logo>
<Screen_Saver_Enable ua="na">No</Screen_Saver_Enable>
<Screen_Saver_Wait ua="na">300</Screen_Saver_Wait>
<Screen_Saver_Icon ua="na">Phone</Screen_Saver_Icon>
</flat-profile>


Для создания файлов с индивидуальными для каждого телефона настройками я воспользовался скриптом, найденным на просторах интернета. Спасибо автору этой статьи. Скрипт немного переделал под себя:

$ cat /var/tftp/createprov.sh
#!/bin/bash

first=flat-profile
second=GPP_A
third=Display_Name_1_
forth=User_ID_1_
fifth=Password_1_
sixth=Proxy_1_
general='ua="na"'

#Sample File to parse
#IpAddress Mac_Address Sip Server Last First Name Username Password
#192.168.4.1 00065B8C1E2C 192.168.4.1 Tsakalos Stratis 314 314
#192.168.4.5 00065B8C1E2D 192.168.4.1 Test User 255 255

while read line

do
input[$i]=$line;
i=$(( $i + 1 ))

ip_address=`echo $line|cut -d';' -f1`
mac_address=`echo $line|cut -d';' -f2 | tr "[:upper:]" "[:lower:]"`
proxy=`echo $line|cut -d';' -f3`
display=`echo $line|cut -d';' -f4`
number=`echo $line|cut -d';' -f5`
password=`echo $line|cut -d';' -f6`

echo "<$first>" > linksys/spa$mac_address.cfg
echo "<$second>$ip_address</$second>" >> linksys/spa$mac_address.cfg
echo "<$sixth $general>$proxy</$seventh>" >> linksys/spa$mac_address.cfg
echo "<$third $general>$display</$forth>" >> linksys/spa$mac_address.cfg
echo "<$forth $general>$number</$fifth>" >> linksys/spa$mac_address.cfg
echo "<$fifth $general>$password</$sixth>" >> linksys/spa$mac_address.cfg
echo "</$first>" >> linksys/spa$mac_address.cfg
done < sipusers.csv


Этот скрипт берет данные из файла sipusers.csv и создает конфиги вида spa000e08de401a.cfg для каждого телефона.
Теперь необходимо собрать MAC-адреса телефонов с привязкой к номеру.
Делаем скрипт исполняемым:

$ chmod +x /var/tftp/createprov.sh

Конфигурацию телефона можно посмотреть по адресу phone_ip_address/admin/spacfg.xml. Там можно увидеть и MAC-адрес и номер телефона, но бегать по айпишникам очень скучно, поэтому запустим пару команд:

$ cd /var/tftp/linksys/
$ wget --tries=1 http://192.168.0.{1..254}/admin/spacfg.xml


Этой командой мы скачали конфиги всех зарегистрированных в сети телефонов.
Получился список файлов:

$ ls -l /var/tftp/linksys/
итого 1268
-rw-r--r-- 1 nobody nogroup 780 2011-04-14 14:12 spa4all.cfg
-rw-r--r-- 1 root root 248 2011-04-13 18:32 spa000e08de401a.cfg
-rw-r--r-- 1 root root 250 2011-04-13 18:32 spa000e08de401b.cfg
-rw-r--r-- 1 root root 236 2011-04-13 18:32 spa000e08de401c.cfg
-rw-r--r-- 1 root root 244 2011-04-13 18:32 spa000e08de401d.cfg
-rw-r--r-- 1 root root 244 2011-04-13 18:32 spa000e08de401e.cfg
....


$ egrep 'MAC_Address|<User_ID_1' spacfg.xml* >> MAC.txt

Этой командой сделали выборку по MAC-адресу и номеру телефона:

$ cat /var/tftp/linksys/MAC
spacfg.xml:<MAC_Address group="Info/Product_Information">000E08DE401A</MAC_Address>
spacfg.xml:<User_ID_1_ group="Ext_1/Subscriber_Information">101</User_ID_1_>
spacfg.xml.1:<MAC_Address group="Info/Product_Information">000E08DE401B</MAC_Address>
spacfg.xml.1:<User_ID_1_ group="Ext_1/Subscriber_Information">102</User_ID_1_>
spacfg.xml.10:<MAC_Address group="Info/Product_Information">000E08DE401C</MAC_Address>
spacfg.xml.10:<User_ID_1_ group="Ext_1/Subscriber_Information">103</User_ID_1_>
spacfg.xml.11:<MAC_Address group="Info/Product_Information">000E08DE401D</MAC_Address>
spacfg.xml.11:<User_ID_1_ group="Ext_1/Subscriber_Information">104</User_ID_1_>
spacfg.xml.12:<MAC_Address group="Info/Product_Information">000E08DE4001E</MAC_Address>
....


После нехитрых манипуляций в LibreOffice Calc файл MAC.txt привели к такому виду (создали новый файл sipusers.csv):

$ cat /var/tftp/sipusers.csv
192.168.1.200;000e08de401a;192.168.1.200;Maksim Petrov;101;CJIO}I{HbIu'napoJIb
192.168.1.200;000e08de401b;192.168.1.200;Nikolay Veselov;102;CJIO}I{HbIu'napoJIb
192.168.1.200;000e08de401c;192.168.1.200;Galina Fedorova;103;CJIO}I{HbIu'napoJIb
192.168.1.200;000e08de401d;192.168.1.200;Ludmila Sokolova;104;CJIO}I{HbIu'napoJIb
192.168.1.200;000e08de401e;192.168.1.200;Chiya Chiyo;105;CJI0}I{HbIu'napoJIb
....


Что есть что понятно из примечания в скрипте createprov.sh:
#Sample File to parse
#IpAddress Mac_Address Sip Server Last First Name Username Password
#192.168.4.1 00065B8C1E2C 192.168.4.1 Tsakalos Stratis 314 314
#192.168.4.5 00065B8C1E2D 192.168.4.1 Test User 255 255


Запускаем createprov.sh на выполнение:

$ ./createprov.sh

Смотрим результат:

$ ls -l /var/tftp/
итого 20
-rwxr-xr-x 1 nobody nogroup 1413 2011-04-13 18:32 createprov.sh
drwxrwxrwx 3 nobody nogroup 4096 2011-04-14 14:12 linksys
-rw-r--r-- 1 root root 5454 2011-04-13 18:04 sipusers.csv
-rw-r--r-- 1 nobody nogroup 240 2011-04-13 10:50 spa922.cfg

$ ls -l /var/tftp/linksys/
итого 1268
-rwxrwxrwx 1 nobody nogroup 814 2010-01-15 10:47 logo.bmp
-rw-r--r-- 1 nobody nogroup 780 2011-04-14 14:12 spa4all.cfg
-rw-r--r-- 1 root root 12835 2011-04-13 17:18 MAC.txt
-rw-r--r-- 1 root root 248 2011-04-13 18:32 spa000e08de401a.cfg
-rw-r--r-- 1 root root 250 2011-04-13 18:32 spa000e08de401b.cfg
-rw-r--r-- 1 root root 236 2011-04-13 18:32 spa000e08de401c.cfg
-rw-r--r-- 1 root root 244 2011-04-13 18:32 spa000e08de401d.cfg
-rw-r--r-- 1 root root 244 2011-04-13 18:32 spa000e08de401e.cfg
....


Спасибо за внимание. Возможно это кому-то облегчит жизнь.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.