Linksys SPA Provisioning или облегчаем себе жизнь при массовой настройке IP-телефонов
Предисловие
После недавнего «падения» сервера с Asterisk и его восстановления в логах обнаружил тысячи вот таких строк:
....
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"10/1/65"
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"11/1/65"
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"1346"
[Apr 5 22:28:15] NOTICE[1170] chan_sip.c: Registration from '"1347"
....
В секунду ~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
Создаем папку для всех остальных файлов:
$ sudo mkdir /var/tftp/linksys
$ sudo chmod -R 777 /var/tftp/linksys
$ sudo chown -R nobody /var/tftp/linksys
Раз уж делаем глобальное обновление, то скачаем заодно и новую прошивку для телефонов:
$ cd /var/tftp/linksys
$ wget 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
Для создания файлов с индивидуальными для каждого телефона настройками я воспользовался скриптом, найденным на просторах интернета. Спасибо автору этой статьи. Скрипт немного переделал под себя:
$ 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 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|
Этой командой сделали выборку по MAC-адресу и номеру телефона:
$ cat /var/tftp/linksys/MAC
spacfg.xml:
spacfg.xml:
spacfg.xml.1:
spacfg.xml.1:
spacfg.xml.10:
spacfg.xml.10:
spacfg.xml.11:
spacfg.xml.11:
spacfg.xml.12:
....
После нехитрых манипуляций в 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
....
Спасибо за внимание. Возможно это кому-то облегчит жизнь.