Наверняка хоть раз в жизни тебе приходилось иметь дело с не вызывающими доверия приложениями и скриптами, которые могли навредить системе. Или ты хотел запустить браузер в максимально изолированном окружении, чтобы в случае его взлома твоей системе ничто не угрожало. Сегодня подобные задачи принято решать с помощью вездесущего Docker, однако есть масса гораздо более простых и удобных инструментов для быстрого запуска приложений в песочницах.
Задолго до того, как идея Docker зародилась в головах его создателей, появился проект LXC (LinuX Containers). Он был основан на все тех же технологиях разделения пространств имен (Linux Namespaces) и точно так же позволял создать минималистичное замкнутое на себя окружение исполнения (песочницу, контейнер) для запуска сервисов или небезопасных приложений. Однако LXC не был столь дружелюбным к новым пользователям и не обладал фишками Docker вроде слоеной файловой системы, возможности быстро выкачать и запустить уже готовое приложение и конфигами для автоматической сборки окружений.
[ad name=»Responbl»]
Намного раньше во FreeBSD появилась технология jail, позволяющая создавать песочницы, подобные chroot, но с акцентом на более глубокий уровень изоляции. Долгое время jail была гордостью FreeBSD и даже послужила прообразом для технологии Solaris Zones. Однако сегодня она уже не может обеспечить тот уровень гибкости и управления ресурсами, которые предлагают LXC и Docker, так что в целом jail оказалась на обочине истории. Сегодня песочницы в Linux можно создавать множеством разных способов. Это и уже упомянутые LXC и Docker с их пространствами имен, это механизм seccomp, используемый Chrome для изоляции вкладок и плагинов, это технологии SELinux/ AppArmor, позволяющие тонко регулировать доступ приложения к чему бы то ни было. В этой статье мы познакомимся с самыми удобными для обычного пользователя инструментами, которые лучше всего подходят для решения повседневных задач, таких как:
Начнем с одной из самых простых песочниц. 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. Она полностью запрещает приложению доступ в интернет.
Само собой разумеется, простой запрет на доступ к файлам — это слишком мало для создания по-настоящему изолированных песочниц. Вредоносный код или взломщик могут вообще ничего не прописывать в систему, а просто унести с собой твой 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 в полностью стерильном окружении без доступа к конфигам и файлам основной системы:
$ 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 &
Эти команды запустят три инстанса браузера в отдельных песочницах. Первый ты будешь использовать для работы, второй для онлайн-банкинга, а третий для всего остального, не связанного с первыми двумя. Компрометация одной из песочниц не приведет к компрометации остальных.
[ad name=»Responbl»]
В случае необходимости ты можешь даже ограничить ширину канала для запущенного в песочнице приложения. Например, следующая команда ограничит ширину входящего канала до 80 Кбайт/с, а ширину исходящего — до 20:
$ firejail --name=browser --net=eth0 firefox & $ firejail --bandwidth=browser set eth0 80 20
Все профили приложений Firejail хранит в каталоге /etc/firejail. Если тебе нужно создать профиль для приложения, не поддерживаемого Firejail, просто скопируй профиль похожего по функциональности приложения и измени его. Формат профиля интуитивно понятен. Правда, для фильтрации системных вызовов придется выяснить, какие из них использует приложение, а затем добавить в профиль. Как это сделать, описано в официальной документации.
Если среди 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.
Красота 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 имеет встроенные политики безопасности для запуска браузеров. Все, что нужно сделать, — выполнить такую команду:
Производительность приложения в Mbox в среднем на 12–13% ниже обычной
Запускаем Firefox в песочнице
Часть профиля firefox
$ sandbox -X -H sandbox_home -t sandbox_web_t firefox
Причем, как ты уже должен был понять, ты можешь использовать разные домашние каталоги для запуска разных сессий браузера или использовать «одноразовый» домашний каталог для походов по злачным местам. Еще один полезный флаг, о котором стоит упомянуть, — -w, с его помощью можно указать размер окна для графического софта. Он тебе определенно пригодится, так как динамически менять размер окна нельзя (это техническое ограничение Xephyr).
[ad name=»Responbl»]
В целом Sandbox — очень удобный инструмент, единственная проблема которого — поддержка в дистрибутивах. Фактически прямо из коробки Sandbox работает только в Fedora, основанных на нем RHEL/CentOS и, возможно, в других дистрибутивах с активированным по умолчанию SELinux.
Запустить софт в песочнице довольно просто, и для этого можно использовать множество инструментов. В этой статье мы рассмотрели три из них.
Какой из этих инструментов выбрать — решай сам. А в следующей статье мы окунемся с тобой в тонкости реализации песочниц и создадим ее собственными руками.
Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…
Работа с консолью считается более эффективной, чем работа с графическим интерфейсом по нескольким причинам.Во-первых, ввод…
Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…
С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…
Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…
Elastic Security стремится превзойти противников в инновациях и обеспечить защиту от новейших технологий злоумышленников. В…
View Comments