Банк-клиент и паранойя, дружба навек

Posted: 2011-09-02 in IT, Security
Метки:

Рано или поздно каждый сталкивается с необходимостью работы с банковскими счетами через интернет. Странное дело, но почему-то очень многие админы не достаточно осознают всю критичность систем ДБО и редко придают должное значение необходимым мерам. Причем как на работе (характерный пример — банк-клиент, установленный на первую попавшуюся машину с виндой, даже без её аудита), так и дома. При этом как-то очень мало кто задумывается, что даже однократно полученный трояном доступ к данным чреват для физического лица потерей всех денег со счета, а для фирмы — потерей всех текущих средств или очень значительной их части. …

Поэтому я расскажу о том, как я решил для себя эту проблему так, чтобы и пользоваться было более-менее удобно, и чтобы паранойя не слишком сильно мучила.
Для начала вспомним пару очевидных вещей.
1). Программы бывают уязвимы. Чем сложнее — тем выше риск уязвимости. Меньше программ — меньше риск.
2). Если атака может быть придумана — её придумают. Даже новейшая версия программы может быть уязвима.
3). Даже банковские программисты могут ошибаться.
4). Их ошибка обязательно будет найдена и использована в злых целях.
То есть с одной стороны — требуется удобство (а это работа на одной машине и куча программ), с другой — нужна безопасность (а это минимум программ и максимально возможная изоляция приложений).
Один из вариантов — отдельная физическая машина. Проблема в том, что а) это тупо неудобно, даже нетбук занимает порядочно места на столе б) число машин = числу банк-клиентов, поскольку их друг от друга тоже надо изолировать (никогда не знаешь, что намутили местные кодеры).
Поэтому наш выбор — виртуальные машины. Идея — та же самая, что и при построении тестового стенда для вирусов, только тут изоляция будет еще более жесткой. Итак, нам понадобится:
1). Одна физическая машина с чистой операционной системой, на которой не стоит никакого говна.
2). Система управления виртуальными машинами
3). Заведомо чистые образы систем для виртуалок.
Поскольку банк-клиенты (в том числе интернет-банки) могут сохранять временные файлы с чувствительной информацией, я решил активно использовать криптоконтейнеры для размещения виртуальных машин, с которых будет идти доступ к системам ДБО. Я создал на своей системе криптоконтейнер (DM-Crypt) весом 8 Гб, внутри которого разместил каталоги двух виртуальных машин — собственно машину с ДБО и мини-шлюз. Мини-шлюз нужен на тот случай, если вы неаккуратно измените что-либо в настройках внешней системы или виртуалки с ДБО — мини-шлюз не пропустит лишний траффик.
1). Шлюз. Ставится максимально обрезанная система, но обязательно с новыми версиями компонентов. Я использовал Fedora 15.1 в самом минимальном варианте, удалив оттуда кучу всего. У вас в итоге должна быть система, стартующая в консоль, и вывод netstat которой не содержит никаких записей о TCP и UDP соединениях или сокетах. Система должна быть легко обновляемой, поскольку обновления очень важны.
У шлюза два интерфейса — к физической машине (режим — сетевой мост, p2p1, 192.168.7.115/24) и к виртуалке с ДБО (режим — внутренняя сеть, 192.168.24.1/30) Шлюз по умолчанию и DNS — адрес физической рабочей станции, 192.168.7.1 .
2). Машина с ДБО. Мне повезло — у меня интернет-банк, работающий в любом браузере. Поэтому я поставил ту же Fedora 15.1, но уже с LXDE и Firefox-ом. Поскольку тут уже есть расшифрованные банковские данные, и машину может потребоваться переносить, я применил второй слой шифрования — корень и домашний каталог были размещены в Luks-контейнере, так что запуск такой системы потребует ввод пароля. Естественно весь софт обновить. В системе нужно удалить все, что не имеет отношения к банк-клиенту — плееры, игры, почтовые и IM-клиенты и прочее. Естественно, никаких вайнов.
Сетевой интерфейс ровно один — к внутренней сети, 192.168.24.2/30 . DNS — адрес рабочей станции, шлюз — адрес интерфейса мини-шлюза (192.168.24.1)
3). Все обновить, соединить, настроить, снять снапшоты (для машины с ДБО — в выключенном состоянии !!!)
Должно получиться примерно следующее непотребство:

Если у вас банк-клиент, работающий только под виндовс, то машину с ДБО надо ставить на виндовс. Естественно, это должен быть чистый/оригинальный образ голой виндовс с сайта Microsoft. Взлом допустим только вводом серийника (набрать вручную!!!). Никаких зверосборок, активаторов.exe и прочей непроверенной нечисти не должно быть и близко. Вообще на этих виртуалках не должно запускаться никаких непроверенных приложений. Естественно, обновить секурити
-патчами до упора, отключить все лишнее. Для обеих виртуальных машин делается минимальный набор эмулируемого оборудования — только загрузочные тома дисков, сеть и минимум памяти. Никаких USB, звука, общих папок и гостевых дополнений быть не должно. Все ненужные сервисы отключаются. При правильной настройке запущенный на шлюзе tcpdump должен показывать полный штиль в сети между мини-шлюзом и машиной с ДБО. Никаких открытых сетевых портов. Пароли суперпользователя — символов 15 минимум. SSH выключить, только локальное управление.

В моем случае единственным нужным сервисом был файервол, настройки которого для обеих машин привожу ниже:
Для машины с ДБО (на которой запускается браузер с интернет-банком):

#!/bin/sh

DNS='192.168.7.1/32';  # свой DNS на физической машине
BANK_NET='11.2.3.0/25,69.58.183.140/32';  # сеть банка
   # + адрес службы проверки сертификата, выясняется по логам.
BANK_PORTS='80,443';  # порты системы ДБО
CLIENT='192.168.24.2/32';   # адрес виртуалки с ДБО

echo 'Clear tables';
echo '  -F (filter,nat,mangle)';
iptables -F
iptables -t nat -F
iptables -t mangle -F
echo '  -X (filter,nat,mangle)';
iptables -X
iptables -t nat -X
iptables -t mangle -X
echo '  -F (INPUT,FORWARD,OUTPUT)';
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
echo 'Set DROP Policies';
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

iptables -A INPUT -s $BANK_NET,$DNS -d $CLIENT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s $CLIENT -d $DNS -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s $CLIENT -d $BANK_NET -p tcp -m multiport --dports $BANK_PORTS -j ACCEPT

iptables -A INPUT -j LOG --log-prefix  "INPUT : "
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT: "

Для мини-шлюза:

#!/bin/sh

EXTFACE="p2p1";
  # интерфейс мини-шлюза, соединенный с физической машиной.

CLIENT="192.168.24.2/32";
BANK_NET='11.2.3.0/25,69.58.183.140/32';
BANK_PORTS='80,443';
DNS="192.168.7.1/32";

echo 'Clear tables & chains';
echo '   -F (filter,nat,mangle)';
iptables -F
iptables -t nat -F
iptables -t mangle -F
echo '   -X (filter,nat,mangle)';
iptables -X
iptables -t nat -X
iptables -t mangle -X
echo '   -F (INPUT, FORWARD, OUTPUT)';
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT

echo 'Setup default policies'
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

echo 'Forward'
iptables -A FORWARD -s $DNS,$BANK_NET -d $CLIENT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s $CLIENT -d $DNS -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -s $CLIENT -d $BANK_NET -p tcp -m multiport --dports $BANK_PORTS -j ACCEPT

echo '   LOG';
iptables -A FORWARD -j LOG --log-prefix "Trap_Forward_001: "

echo 'NAT';
iptables -t nat -A POSTROUTING -o $EXTFACE -j MASQUERADE

Если все сделано правильно, то после этого с машин для работы с ДБО не должны ходить даже пинги. Разрешать прохождение траффика до серверов обновлений можно постоянно, а можно только на время обновлений. Естественно, в процессе обновлений никаких процедур в ДБО проводить не стоит. На всякий случай =).

Напоследок имеет смысл оформить виртуалку с ДБО так, чтобы её окно нельзя было ни с чем спутать.

Должно получиться примерно следующее:

Единственное неудобство — потребуется сделать несколько дополнительных действий и ввести 5-6 разных паролей, прежде чем вы доберетесь до своего счёта. Плюсы — никаких лишний процессов рядом с ДБО, логгирование любой подозрительной сетевой активности от ДБО и запущенный в соседней виртуалке банковский троян вряд ли вам повредит.

Конечно, схема не идеальна. Можно ещё дополнительно ограничить возможность резолвинга не относящихся к делу имен (чтобы нельзя было сделать DNS-туннелирование из ВМ), запустить виртуалки от имени другого пользователя, поставить системы на самосборных ядрах и так далее. Но это уже изыски на будущее, чтобы дальнейшим обострениям паранойи было куда развиваться.

Всего хорошего и приятной работы.
Конструктивные предложения приветствуются.

- комментарии
  1. KarmanR:

    5-6 паролей для бухгалтера смерть! ну или на бумажке запишут))) двух паролей на виртуалку и на ЭЦП более чем, ИМХО.Особо радует возможность спонтанного изменения ip:port сервера банка. Но тут уж ничего не поделать( А как интересно выгрузку из 1с делать для начисления зарплаты, если нету usb и глубокая изоляция?Для домашнего счета… нууу не знаю. Только если зарплатной карточкой "руководить", где заначка лежит). Но с какими целями не понятно.Обычно деньги снимаю в банкомате, а необходимые суммы для интернет покупок забрасываю на qiwi в терминалах. Больше 3 тысяч в электронных деньгах хранить не приходилось ни разу. Плюс сейчас в qiwi есть смс подтверждение платежа.

  2. gregzakharov:

    Originally posted by Karman:

    5-6 паролей для бухгалтера смерть!

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

  3. anonymous:

    Анонимно writes:одинЦе имеет "защиту", которая требует USB для ключей.Можно отдельную физическую тачку выделить, чтоб тамничего, кроме 1С не было.

  4. Aminux:

    5-6 паролей для бухгалтера смерть!

    Не, бухгалтеру не смерть, чего ей будет-то ? А вот банковский счет — да, после слабозащищенной машины может сесть на жесткую диету.

    Особо радует возможность спонтанного изменения ip:port сервера банка.

    Это очень редко вносимое изменение, раз в три года можно и поправить.

    А как интересно выгрузку из 1с делать для начисления зарплаты, если нету usb и глубокая изоляция?

    Решиться сделать изоляцию чуть менее глубокой — разрешить соединяться с локально поднятым на хостовой или гостевой системе ftp|smb|http-сервером, но не далее. Там есть варианты.Технически вообщем-то вещь простая, только несколько неудобная в обращении. У меня задача и цель — не проебать деньги. Если для этого надо выучить 6 паролей — да не вопрос. Деньги-то мои.При чем тут USB-хасп ? Речь о глубокой изоляции 1С не шла. Для 1С это слишком монструозное решение, она такой нежности не заслуживает. 😀

  5. KarmanR:

    А что на счет смс подтверждения?Каждая операция со счётом требует одноразового пароля присланного по смс. Для интернет денег самое то)

  6. Aminux:

    А что на счет смс подтверждения?Каждая операция со счётом требует одноразового пароля присланного по смс. Для интернет денег самое то)

    Если троян контролирует вашу систему с ДБО и может менять отображаемые элементы, атрибуты платежа и патчить память запущенных процессов (а именно так они и работают), то догадайтесь с трёх раз, ЧЕЙ именно платёж (и с какими реально переданными в банк атрибутами) вы подтвердите своей SMS. 😀 😀 😀