Linux32 - Блог



LINUX32

Свобода выбирать


ArchLinux
Блог >> 2017 >> Март


09.03.2017

Безопасный онлайн-банк в Linux




Добрый день.

Однажды мне довелось увидеть как работает один антивирус в одной известной ОС (речь идет о Касперском в Windows 8.1, не сочтите за рекламу) с требующими особой безопасности (на его взгляд) страницами в интернете. Например, при открытии какой-либо страницы, подразумевающей операции с финансами, антивирус выдает всплывающее окно с предложением открыть эту страницу в безопасном браузере. При согласии с этим предложением открывается новое, отдельное окно браузера с открытой в нем, упомянутой ранее ссылкой. Для пущей красоты это окно имеет отличный от остальных окон ОС цвет тени (Касперский может себе это позволить). В этом окне браузер, насколько я понял, использует отдельный профиль, так как ни закладок, ни истории посещений в нем нет. Как нет и никаких установленных расширений (здесь речь идет о браузере Firefox, но, думаю, при использовании любого другого браузера картина была бы схожей). Посмотрел я на это дело и..., мне понравилось! Новый, отдельный профиль для критичных к безопасности страниц, минимум или отсутствие расширений, среди которых вполне могут оказаться скрытые кейлоггеры и прочие подобные "заразы", даже "цветные" тени мне пришлись по душе - выделяют важное окно. Поэтому я подумал, что подобное нужно срочно организовать в Linux-based ОС (за исключением только цветных окон, будем серьезнее).

Такую конструкцию самое то применять со всякого рода онлайн-банками, особенно в свете появляющихся практически каждую неделю новостей о очередном способе мошенничества в банковском секторе. Или для организации расширенного управления доступом локальных пользователей компьютера. Каждый, думаю, найдет применение "для себя".

Не знаю как точно это реализовано у Касперского (возьмем организацию безопасного онлайн банка), но в линуксе я это вижу так: создается отдельный пользователь для осуществления операций с банком, этому пользователю запрещается доступ к любому интернет-сайту, за исключением сайтов из белого списка (домена/ов необходимого банка), создается новый, отдельный профиль браузера для доступа к этим сайтам и, для удобства, создается .desktop файл для запуска этого профиля браузера от имени специально созданного пользователя из-под обычного пользователя. Кроме того, доступ к сайтам из "белого списка" нового пользователя блокируется для всех остальных пользователей, чтобы все операции с банком проводились только из аккаунта специального пользователя. Если иначе, то безопасности все это не добавит.

Итак, начнем.

Нового пользователя (например bank) создаем командой:

# useradd -m -s /usr/bin/nologin bank


Пароль ему задавать не будем, чтобы быстрее в дальнейшем запускать браузер из-под него. В свою очередь, так как не задаем пароль, то с помощью /usr/bin/nologin запрещаем новому пользователю логин в системе чтобы не снижать уровень безопасности.

Чтобы запретить пользователю доступ ко всему, кроме "белых" сайтов воспользуемся встроенным в ядро линукс фаерволом netfilter, более известного по утилите им управляющей - iptables. Настройка iptables далеко нетривиальна, но все же ее знание очень много раз может пригодиться в будущем, да и просто поднимает на порядок ваше понимание процесса работы ядра linux с сетевыми пакетами. Для начала создадим в папке /etc/iptables рабочую директорию, например bank-online.d:

# mkdir /etc/iptables/bank-online.d


Далее создаем в рабочей директории файл whitelist и заносим в него "разрешенные" домены (по одному в каждую строку). Например:

#echo linux32.ru >> /etc/iptables/bank-online.d/whitelist


Если строка будет закомментирована, скрипт ее проигнорирует.

Теперь в эту же папку скопируйте вот этот скрипт made-rules.sh:

#!/bin/bash

# определение переменных
user=bank # имя пользователя
chain=BANK # названние новой цепочки правил таблицы filter
rules_name=iptables.rules # имя файла правил iptebles

# переход в рабочую папку
cd /etc/iptables/bank-online.d

# ввод начальной части (политик по умолчанию) файла $rules_name
echo "*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]" > ../$rules_name

# добавить новую цепочку $chain
echo ":$chain - [0:0]" >> ../$rules_name

# разрешить ответный входящий трафик
echo "-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT" >> ../$rules_name

# разрешить входящий на петлевой интерфейс трафик
echo "-A INPUT -i lo -j ACCEPT" >> ../$rules_name

# # разрешить входящий tcp трафик на порт
# echo "-A INPUT -p tcp --dport номер_порта -j ACCEPT" >> ../$rules_name

# перенаправить весь исходящий трафик пользователя $user в новую цепочку $chain
echo "-A OUTPUT -m owner --uid-owner $user -j $chain" >> ../$rules_name

# разрешить пользовтелю $user исходящий на dns-сервер трафик
echo "-A $chain -p udp --dport 53 -j ACCEPT" >> ../$rules_name

# определение IP-адресов доменов из белого списка, разрешение исходящего трафика на эти домены для пользователя $user и запрет исходящего трафика на эти домены для всех остальных пользователей
for i in `cat whitelist | grep -v "^#"`; do
for ip in `nslookup $i | grep Address | grep -v 192.168 | grep -v :[a-zA-Z0-9] | awk '{print $2}'`; do
echo "-A $chain -d $ip -j ACCEPT" >> ../$rules_name
echo "-A OUTPUT -d $ip -j REJECT" >> ../$rules_name
done
done

# запрещение пользователю $user всего остального исходящего трафика
echo "-A $chain -j REJECT" >> ../$rules_name

# ввод завершающей строки
echo "COMMIT
" >> ../$rules_name


Этот скрипт будет генерировать файл /etc/iptables/iptables.rules, из которого iptables считывает правила при старте. Скрипт достаточно комментирован, но на всякий случай вкратце остановлюсь на некоторых моментах.

В первой части задаются необходимые переменные: имя нашего специального пользователя, имя новой цепочки правил, имя выходного файла (iptables.rules) и наличие или отсутствие роутера. Тут все должно быть понятно кроме цепочки правил: мы создаем новую цепочку правил (BANK) и перенаправляем в нее весь исходящий трафик пользователя bank. Сделано это для более логичного и понятного управления трафиком отдельно взятого пользователя.

В следующей части в файл правил iptables.rules записываются политики по умолчанию:

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]


Они означают что по умолчанию любой входящий и транзитный трафик на локальный компьютер будет заблокирован. Любой исходящий трафик разрешен.

Далее остановлюсь на этой строке:

echo "-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT" >> ../$rules_name


Она разрешает входящий трафик, инициированный только как ответ на исходящий, то есть извне ваш компьютер будет недоступен пока вы сами не захотите открыть какой-нибудь сайт. Эта строка вместе с блоком, задающим политики по умолчанию, значительно, на мой взгляд, увеличивает вашу безопасность в сети.

Следующей строкой разрешим входящий трафик на петлевой (loopback) интерфейс, так как он необходим некоторым программам и сервисам для их правильной работы:

echo "-A INPUT -i lo -j ACCEPT" >> ../$rules_name


Если необходимо обеспечить работу приложения, слушающего определенный порт, то этот порт необходимо открыть для внешних подключений. Узнать какие порты "слушаются" в данный момент можно командой netstat -l. Далее, узнав номер необходимого порта добавляем его в скрипт до завершающего COMMIT:

echo "-A INPUT -p tcp --dport номер_порта -j ACCEPT" >> ../$rules_name


В скрипте эта часть закомментирована, так как выходит за рамки данной статьи, но кому необходимо - можно воспользоваться.

Важный момент: в части где мы запрещаем пользователю bank весь исходящий трафик, кроме доменов из белого списка необходимо вместо DROP написать REJECT. Тоже самое для запрета доступа к этим доменам остальных пользователей:

echo "-A OUTPUT -d $ip -j REJECT" >> ../$rules_name
...
echo "-A $chain -j REJECT" >> ../$rules_name


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

Оставшаяся часть скрипта понятна по своим комментариям, далее его описывать не буду.

Делаем скрипт исполняемым:

# chmod +x /etc/iptables/bank-online.d/made-rules.sh


и запускаем его:

# /etc/iptables/bank-online.d/made-rules.sh


чтобы сгенерировать правила для iptables. Теперь чтобы запустить фаервол с этими правилами и добавить его в автозагрузку достаточно всего лишь ввести:

# systemctl start iptables
# systemctl enable iptables


Таким образом при изменении белого списка нужно будет запустить скрипт made-rules.sh и перезапустить системд сервис iptables для обновления правил.

Если после добавления в белый список какого-либо сайта он всеже не открывается, то с помощью утилиты tcpdump (ее необходимо предварительно установить) следующей командой можно посмотреть к каким еще сайтам обращается наш целевой сайт во время открытия:

# tcpdump -i eth0 host адрес_целевого_сайта


И добавить эти сайты в белый список. После этого сайт должен открываться.

Синтаксис приведенной команды прост: ключ -i указывает на используемый сетевой интерфейс (в данном случае eth0), ключ host - на адрес целевого сайта.

Вместо tcpdump можно просто обратить внимание на статусную строку браузера. У Firefox, например, она находится внизу окна. В ней отображаются сайты к которым идет обращение в данный момент. Просто добавляйте по-очереди все эти сайты в белый список и нужный сайт откроется.

Теперь перейдем к запуску браузера с онлайн банком из-под обычного пользователя. Для этого воспользуемся утилитой sudo. Пакет sudo у вас должен быть установлен. Если вдруг нет, установите. Запуск приложения от имени другого пользователя возможен благодаря ключу -u и указанию нужного пользователя. Также запуск любого X-приложения от имени другого пользователя требует передачи ему прав доступа к вашему запущенному X-серверу. Достигается это с помощью команды xhost. То есть две команды в таком порядке:

$ xhost +
$ sudo -u bank firefox


Запустят браузер firefox (в этом примере) от пользователя bank. Так как мы не назначили пароль пользователю bank, то его пароль не запрашивается, но запрашивается пароль вашего обычного пользователя (из которого запустили эту команду). Чтобы этого избежать создадим файл bank-online с приведенными выше двумя командами, например в папке /home/user/.local/bin:

#!/bin/bash
xhost +
sudo -u bank firefox


Сделаем его исполняемым:

$ chmod +x /home/user/.local/bin/bank-online


Где user - имя вашего обычного пользователя. И в файл /etc/sudoers добавим такую строку:

# echo "user HOST_NAME= NOPASSWD: /home/user/.local/bin/bank-online" >> /etc/sudoers


user - опять же ваш пользователь, HOST_NAME - имя вашего компьютера (обратите внимание на знак = после HOST_NAME, он должен присутствовать).

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

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

$ sudo -i -u bank lxappearance


Завершающим аккордом будет создание .desktop файла для быстрого запуска онлайн банка. Тут вдаваться в подробности уже не буду, большинство DE предлагают интуитивно понятный инструментарий для создания desktop файлов. Тем у кого нет DE можно по-старинке сделать его вручную в текстовом редакторе (у кого нет DE лучше меня знают как его сделать). Но все это уже украшательства (вспоминая про цветные тени).

На этом настройка завершена. Хоть статья и получилась объемной, но она затрагивает много важных и полезных возможностей linux-систем (iptables, sudo) знать которые как минимум полезно.

Читайте, делитесь мнениями в комментариях. Возможно кто-нибудь применит эту статью как основу по созданию какого-либо другого сервиса, взять хотя бы тоже управление доступом (если ваш компьютер еще и роутер по-совместительству). Для этих целей есть конечно специализированные утилиты (Squid например), но его еще нужно отдельно устанавливать и настраивать, а iptables есть в каждом linux по-умолчанию.

Статья


Ваш комментарий:

Имя:
E-mail:
Код с картинки:
Комментарий: