Первое разочарование от Google App Engine

Логотип Google App Engine

Как я уже писал, Google App Engine представляет собой очень интересную платформу для разработки веб-приложений на Python или Java. Однако совсем недавно Google в одностороннем порядке и без каких-либо уведомлений стал блокировать доступ к платформе googleappengine из некоторых стран. Причем, часть IP адресов были взяты просто от балды, и вместе с Ираном и Северной Кореей в список запрещенных стран попали и многие IP адреса из Германии. Просьба ко всем, кто хостит свои приложения на Google App Engine, отписаться здесь в случае обнаружения блокирования доступа к приложению из “правильной” страны, из которой у вас есть свои посетители.

Голосовые звонки с сайта

Для многих компаний очень важную роль играет обратная связь с клиентами. Компании даже готовы сами оплачивать звонки от клиентов, арендуя номера бесплатного дозвона 8-800-…. Но подобные звонки оплачиваются за счет компании, что делает затраты на связь непредсказуемыми.

Недавно мы разработали одну очень интересную фишку, которая позволит подобным компаниям существенно сократить затраты на связь. Вот небольшая демонстрация того, как это работает:

1. Зебра телеком, кнопка справа с изображением зебры и телефона. Если на нее нажать и разрешить Flash-приложению доступ к микрофону, звонок пойдет в службу техподдержки Зебры.

2. Ростелеком, кнопка справа (Позвоните в справочную службу Ростелеком прямо сейчас). Здесь добавлена возможность посылать сигналы DTMF во время разговора, т.е. можно набрать добавочный номер сотрудника и позвонить ему.

3. Ну и совсем уж маленькая демка для тех, кто хочет оставить голосовое сообщение мне. Если там нажать на кнопку Call, вы дозвонитесь до нашей АТС, где автоответчик предложит вам оставить мне сообщение. Специально оставил все на английском, чтобы вы смогли представить себе возможности нашей кнопки – все можно перерисовать, перевести на любой язык и настроить конкретно под пожелания клиента.

Как это работает. На вашем сайте размещается наше Flash-приложение, которое инициирует звонок и отвечает за передачу голоса. Звонок отправляется на нашу ATC, с которой он может быть направлен куда угодно – на городской номер, на SIP номер, на голосовую почту или на вашу АТС. Система очень гибкая и легко настраивается, от вас лишь требуется указать, куда отправить звонок с сайта.

Звонки на SIP номера, зарегистрированные у нас, будут для вас бесплатными (мы будем брать только фиксированную ежемесячную абонентскую плату за сервис, а сами звонки оплачиваться не будут). Приземление же звонка на городской или мобильный номер будет стоить дополнительных денег, и это обсуждается отдельно.

Если у вас возникнет желание проверить качество передачи голоса, оставьте мне голосовое сообщение и сообщите, куда переслать записанный файл – все сделаем в лучше виде. Если у Вас возникли вопросы, пишите мне или оставьте комментарий к этому сообщению.

Как защитить Asterisk от подбора паролей.

Решил я как-то раз поднять SIP-сервер для своих нужд. Выход во внешние сети был не нужен, поднял я этот сервис только для своих. Не успел его поднять, как доблестные тайваньские хакеры дружно начали брутфорсить логины и пароли на мой астериск. Причем делали это внаглую в многопоточном режиме, цифры подставляли методом научного перебора:

[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"0"' failed for '210.240.176.51' - No matching peer found 
[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"1"' failed for '210.240.176.51' - No matching peer found
[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"test"' failed for '210.240.176.51' - No matching peer found
[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"2"' failed for '210.240.176.51' - No matching peer found
[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"3"' failed for '210.240.176.51' - No matching peer found
[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"4"' failed for '210.240.176.51' - No matching peer found
[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"5"' failed for '210.240.176.51' - No matching peer found
[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"6"' failed for '210.240.176.51' - No matching peer found
[Jan 13 09:45:12] NOTICE[15489] chan_sip.c: Registration from '"7"' failed for '210.240.176.51' - No matching peer found
....

С такими темпами они могут вычислить реально существующие внутренние номера телефонов и перейти ко второму этапу – подбору паролей. Чтобы не выдавать проклятым буржуином государственных секретов информацию о существующих номерах, надо в sip.conf в секцию [general] добавить всего одну строчку:

alwaysauthreject = yes

Тогда астериск при неуспешной авторизации будет давать им отбивку 401 Unauthorized, и они не будут знать, верный ли логин был введен. Такая настройка осложнит им жизнь, но полностью от них не избавит.

Вторая вещь, которую следует сделать, это анализировать логи астериска на предмет наличия неверной аутентификации. И в случае обнаружения попыток подбора пароля отправлять подозрительные айпишника в бан.

Для Linux есть подходящее решение, связанное с установкой и настройкой fail2ban, которое построено на iptables. Мне же это решение не подошло, потому что мой Астериск крутится на хостинге с FreeBSD, а там используется ipfw вместо до боли знакомого iptables. Путем долгих экспериментов пришел к тому, что не стоит добавлять все вражеские айпишники в общую очередь в баню. Список правил на пару сотен айпи прилично нагружает VDS, что не есть гуд.

Но ipfw оказался намного лучше, чем казалось на первый взгляд. У него предусмотрен механизм обработки тысяч правил обработки IP адресов, если их загнать в так называемые таблицы ipfw:

Если в firewall.conf добавить одну единственную строчку:

add reject ip from table(15) to me

то все айпишники, оказавшиеся в таблице 15 будут забанены. Причем уже не так уж и важно, сколько их там будет сотня или тысяча, скорость обработки таких списков остается очень высокой, и это намного лучше, чем их обрабатывать обычными правилами вроде таких:

add reject ip from 1.2.3.0/24 to me
add reject ip from 175.12.135.0/24 to me

Правила добавляются в таблицу в любой момент времени, и моментально начинают свою работу. Погуглив немного, я нашел готовый скрипт для FreeBSD, который всех неудачно авторизовавшихся загоняет в бан на сутки. Его можно аккуратно допилить, немного ужесточить правила и все будет работать на отлично.

У таблиц ipfw есть один недостаток, они работают только с IPv4. А так как переход на IPv6 не за горами, то работоспособность чудо-скрипта в ближайшем будущем останется под вопросом.