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