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

 

Вместо введения

Задолго до того, как идея Docker зародилась в головах его создателей, появился проект LXC (LinuX Containers). Он был основан на все тех же технологиях разделения пространств имен (Linux Namespaces) и точно так же позволял создать минималистичное замкнутое на себя окружение исполнения (песочницу, контейнер) для запуска сервисов или небезопасных приложений. Однако LXC не был столь дружелюбным к новым пользователям и не обладал фишками Docker вроде слоеной файловой системы, возможности быстро выкачать и запустить уже готовое приложение и конфигами для автоматической сборки окружений.

Намного раньше во FreeBSD появилась технология jail, позволяющая создавать песочницы, подобные chroot, но с акцентом на более глубокий уровень изоляции. Долгое время jail была гордостью FreeBSD и даже послужила прообразом для технологии Solaris Zones. Однако сегодня она уже не может обеспечить тот уровень гибкости и управления ресурсами, которые предлагают LXC и Docker, так что в целом jail оказалась на обочине истории. Сегодня песочницы в Linux можно создавать множеством разных способов. Это и уже упомянутые LXC и Docker с их пространствами имен, это механизм seccomp, используемый Chrome для изоляции вкладок и плагинов, это технологии SELinux/AppArmor, позволяющие тонко регулировать доступ приложения к чему бы то ни было. В этой статье мы познакомимся с самыми удобными для обычного пользователя инструментами, которые лучше всего подходят для решения повседневных задач, таких как:

  • запуск не вызывающего доверия приложения, способного навредить системе;
  • изоляция браузера, email-клиента и других приложений, чтобы их взлом не привел к утечке данных;
  • запуск «одноразовых» приложений, которые не должны оставлять следов в системе.
 

Mbox

Начнем с одной из самых простых песочниц. Mbox — не совсем стандартный инструмент изоляции, он не урезает полномочия запущенного приложения, не выполняет виртуализацию сетевого стека и не имеет каких-либо настроек. Единственная задача Mbox — сделать так, чтобы приложение не смогло ничего записать в файловую систему. Для этого он создает специальную виртуальную ФС, на которую перенаправляет все запросы ввода/вывода. В результате под управлением Mbox приложение работает как ни в чем не бывало, однако в ходе его работы ты получаешь возможность применить или отвергнуть те или иные изменения виртуальной файловой системы к файловой системе реальной.

Лучше всего эту концепцию демонстрирует пример с официальной страницы Mbox:

$ mbox -- wget google.com
...
Network Summary:
 > [11279] -> 173.194.43.51:80
 > [11279] Create socket(PF_INET,...)
 > [11279] -> a00::2607:f8b0:4006:803:0
...
Sandbox Root:
 > /tmp/sandbox-11275
 >  N:/tmp/index.html
[c]ommit, [i]gnore, [d]iff, [l]ist, [s]hell, [q]uit ?>

В данном случае под управлением Mbox запускается Wget. Mbox заботливо сообщает нам, что Wget обращается к адресу 173.194.43.51 и порту 80, и записывает файл index.html, который мы можем применить к основной системе (для этого нужно нажать «c»), игнорировать (i), просмотреть diff, выполнить другие операции или вообще завершить приложение. Проверить, как это все работает, можно, просто установив уже готовый пакет Mbox. В Debian/Ubuntu это делается так:

$ wget http://pdos.csail.mit.edu/mbox/mbox-latest-amd64.deb
$ sudo dpkg -i mbox-latest-amd64.deb

В Arch Linux Mbox доступен в AUR, поэтому установить его еще проще:

$ yaourt -S mbox-git

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

[fs]
allow: .
hide: ~

Чтобы запустить приложение с определенным профилем, достаточно указать его через опцию -p:

$ mbox -p profile.prof -- wget google.com

Еще одна полезная опция — -n. Она полностью запрещает приложению доступ в интернет.

Как работает Mbox
Как работает Mbox

Производительность приложения в Mbox в среднем на 12–13% ниже обычной
Производительность приложения в Mbox в среднем на 12–13% ниже обычной

 

Firejail

Само собой разумеется, простой запрет на доступ к файлам — это слишком мало для создания по-настоящему изолированных песочниц. Вредоносный код или взломщик могут вообще ничего не прописывать в систему, а просто унести с собой твой Bitcoin-кошелек и базу паролей KeePass или использовать уязвимость приложения для получения прав root и выхода из песочницы. К тому же Mbox не дружит с графическим софтом и в целом не годится для запуска комплексных приложений, которые могут записывать на диск множество временных файлов и постоянно обновляют свои базы данных.

К счастью, у нас есть Firejail, гораздо более гибкий и мощный инструмент изоляции, который не просто контролирует доступ к ФС, а полностью отрезает приложение от основной системы с помощью механизма Linux Namespaces. Запущенное в песочнице Firejail приложение имеет доступ только к заранее определенным файлам и функциям системы. Например, можно запретить приложению доступ ко всем файлам, кроме собственных конфигов, открыть некоторые файлы только на чтение или только на запись, запретить поднимать свои привилегии до root, запретить подключаться к определенным портам, запретить небезопасные системные вызовы, такие как execv.

Ограничения приложения задаются в профиле, который может насчитывать десятки строк типа noroot, seccomp, whitelist ~/.mozilla. Однако лично тебя никто не заставляет их писать — Firejail уже включает в себя профили для 95 различных приложений. Все, что остается сделать, — просто установить инструмент и запустить программу:

$ wget http://sourceforge.net/projects/firejail/files/firejail/firejail_0.9.40_1_amd64.deb
$ sudo dpkg -i firejail_0.9.40_1_amd64.deb
$ firejail firefox

Все, теперь Firefox работает в изолированной песочнице и имеет доступ только к своему собственному каталогу, нескольким связанным конфигам (KeePass, например) и не имеет доступа к опасным системным вызовам и портам за исключением 80, 443 и 53.

Запускаем Firefox в песочнице
Запускаем Firefox в песочнице

Более того, ты можешь запустить Firefox в полностью стерильном окружении без доступа к конфигам и файлам основной системы:

$ firejail --private --dns=8.8.8.8 firefox -no-remote

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

Ты можешь создать сразу несколько таких песочниц и использовать их для захода на разные сайты (здесь USER — это твое имя пользователя):

$ firejail --private=/home/USER/work firefox -no-remote &
$ firejail --private=/home/USER/bank firefox -no-remote &
$ firejail --private=/home/USER/other firefox -no-remote &

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

В случае необходимости ты можешь даже ограничить ширину канала для запущенного в песочнице приложения. Например, следующая команда ограничит ширину входящего канала до 80 Кбайт/с, а ширину исходящего — до 20:

$ firejail --name=browser --net=eth0 firefox &
$ firejail --bandwidth=browser set eth0 80 20

Все профили приложений Firejail хранит в каталоге /etc/firejail. Если тебе нужно создать профиль для приложения, не поддерживаемого Firejail, просто скопируй профиль похожего по функциональности приложения и измени его. Формат профиля интуитивно понятен. Правда, для фильтрации системных вызовов придется выяснить, какие из них использует приложение, а затем добавить в профиль. Как это сделать, описано в официальной документации.

Часть профиля firefox
Часть профиля firefox
 

Sandbox

Если среди 95 профилей Firejail нет нужных тебе приложений, а идея писать профили самому не слишком тебя радует, то Sandbox — это твой выбор. Данный вид песочницы технически сильно отличается от двух уже описанных инструментов (он использует правила SELinux вместо seccomp и Namespaces), но в плане функциональности представляет собой нечто среднее.

Как и Mbox, Sandbox полностью отрезает приложение от внешнего мира, позволяя читать только stdin (то есть на вход запущенного в песочнице приложения можно передать данные другого приложения), а писать только в stdout (выводить данные на экран или перенаправлять другому приложению). Все остальное, включая доступ к файловой системе, сигналам, другим процессам и сети, запрещено. Простейший пример использования:

$ cat /etc/passwd | sandbox cut -d: -f1 > /tmp/users

Данная команда читает файл /etc/passwd, извлекает из него имена пользователей и записывает их в файл /tmp/users. Пользы от нее никакой, но она отлично демонстрирует принципы работы Sandbox. В песочнице запускается только команда cut, а сам файл /etc/passwd передается ей с помощью внешней команды. Вывод, с другой стороны, реализуется с помощью обычного перенаправления stdout.

Сообщение SELinux при попытке «свернуть» Vim с помощью Ctrl-Z
Сообщение SELinux при попытке «свернуть» Vim с помощью Ctrl-Z

Красота Sandbox в том, что с его помощью довольно легко расширить доступные приложению возможности. Например, ты можешь создать для него временные домашний каталог и каталог /tmp, передав команде всего один флаг:

$ sandbox -M mc

После завершения работы программы эти каталоги будут уничтожены, что весьма удобно при запуске не вызывающего доверия софта. Но что, если домашний каталог нужно сохранять между запусками (ну, допустим, для того, чтобы протестировать софт, работающий с множеством файлов)? Для этого достаточно создать каталог, который станет домашним для песочницы, и добавить еще одну опцию:

$ mkdir sandbox_home
$ sandbox -M -H sandbox_home mc

Теперь у mc есть свой собственный домашний каталог, куда он может сохранять конфиги и откуда может читать файлы. Также Sandbox позволяет запускать графический софт (с помощью виртуального X-сервера Xephyr). Для этого достаточно передать еще один флаг:

$ sandbox -X -M -H sandbox_home gvim

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

$ sandbox -X -H sandbox_home -t sandbox_web_t firefox

Причем, как ты уже должен был понять, ты можешь использовать разные домашние каталоги для запуска разных сессий браузера или использовать «одноразовый» домашний каталог для походов по злачным местам. Еще один полезный флаг, о котором стоит упомянуть, — -w, с его помощью можно указать размер окна для графического софта. Он тебе определенно пригодится, так как динамически менять размер окна нельзя (это техническое ограничение Xephyr).

В целом Sandbox — очень удобный инструмент, единственная проблема которого — поддержка в дистрибутивах. Фактически прямо из коробки Sandbox работает только в Fedora, основанных на нем RHEL/CentOS и, возможно, в других дистрибутивах с активированным по умолчанию SELinux.

 

Выводы

Запустить софт в песочнице довольно просто, и для этого можно использовать множество инструментов. В этой статье мы рассмотрели три из них.

  • Mbox отличается крайней простотой и идеален, когда необходимо контролировать то, к каким файлам приложение должно получить доступ.
  • Firejail подходит для создания сложных конфигураций и запуска почти сотни различных приложений, но не очень удобен, если нужного приложения нет в списке поддерживаемых.
  • Sandbox — прекрасный инструмент для запуска любых типов софта, но доступен только пользователям Fedora и основанных на нем дистрибутивов.

Какой из этих инструментов выбрать — решай сам. А в следующей статье мы окунемся с тобой в тонкости реализации песочниц и создадим ее собственными руками.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    4 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии