Подключение к изолированным системным средам с использованием Waypipe
aluminium-tin-foil-hat_exw.jpg
Продолжая предыдущие скучные опусы на тему изоляции окружений, самое время вспомнить про wayland.
Конечно же, это не призыв к действию, а просто примеры и размышления.
Сам я придерживаюсь философии, где центр системы это пользователь, и он в праве настраивать всё так, как он считает нужным, а не так как это навязывается общими тенденциями, или как это реализовано в конкретном дистрибутиве, вместе с этим понимая и принимая все риски и последствия этих действий.
Как говорится, “If you know what you are doing”.
И прежде чем приступить, опять стоит написать, что:
- Да, я понимаю, что это всё очень поверхностно.
- Да, никакие подключения к локальной графической оболочке не допустимы для чего-то опасного, и надо использовать vnc или virt-viewer/spice.
- Непривилегированный LXC надо заменить на Xen / KVM
- И да, я знаю, что из KVM изоляции тоже можно выйти.
- И про Flatpak я тоже знаю.
- И, наконец, да, я знаю о Qubes OS и её архитектуре, можно сказать, с момента её появления, а это 2010 год.
И, несколько упрощая и адаптируя идеи QubesOS под свои повседневные задачи, я предпочитаю в основном использовать или других локальных пользователей, или достаточно легковесные окружения LXC.
И да, в них я запускаю не что-то потенциально опасное, а то, что многие из вас используют непосредственно под своим аккаунтом в системе, например:
- Firefox для повседневного использования и просмотра “чего попало”.
- Несколько проектов использующих пакеты из PyPI, RubyGems.
- Отдельно то, что я собираю из исходников с того же GitHub.
- Сторонние программы element-desktop, Telegram, Zoom.
Что это даёт?
- Смягчения последствий типовых и распространённых атак.
- Возможность настройки индивидуальной среды для каждого набора определённых программ, с отлаженным взаимодействием друг с другом.
- Отсутствие контаминации как системной среды, так и пользовательского окружения.
Вам банально не надо держать все эти директории с бесконечными конфигами в~/.config, или пакетами в~/.local. - Более нативную поддержку специфичного софта, если ему нужна Ubuntu, CentOS или Fedora.
Настройка .desktop файлов для удобного запуска из среды KDE
Ранее, длительное время, я использовал сетевую прозрачность X, но поддержка wayland уже достаточно хорошая и на него можно переходить, концептуально не теряя, и более того улучшая безопасность.
nano /usr/share/applications/firefox.untrusted.desktop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [Desktop Entry] Exec=/usr/bin/waypipe --title-prefix '[web-untrusted] ' ssh web-untrusted@10.1.1.249 /usr/local/bin/ff.sh Name=Untrusted Web Name[it]=Web-Siti non attendibili Name[uk]=Недовірена мережа Name[ru]=Недоверенные сайты GenericName=Untrusted Web GenericName[it]=Web-Siti non attendibili GenericName[uk]=Недовірена мережа GenericName[ru]=Недоверенные сайты Comment=Firefox Browser for untrusted sites Comment[it]=Browser Firefox per siti non attendibili Comment[uk]=Браузер для недовірених веб-сайтів Comment[ru]=Браузер для недоверенных сайтов Icon=/opt/firefox/ff_icons/red/default64.png MimeType= StartupNotify=true Terminal=false TerminalOptions= Type=Application X-DBUS-ServiceName= X-DBUS-StartupType=none X-KDE-SubstituteUID=false X-KDE-Username= |
nano /usr/share/applications/firefox.trusted.desktop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [Desktop Entry] Exec=/usr/bin/waypipe --title-prefix '[trusted-firefox] ' ssh trusted-firefox@10.1.1.245 /usr/local/bin/ff.sh Name=Trusted Web Name[it]=Siti affidabili Name[uk]=Довірені сайти Name[ru]=Доверенные сайты GenericName=Trusted Web GenericName[it]=Web-Siti affidabili GenericName[uk]=Довірені сайти GenericName[ru]=Доверенные сайты Comment=Firefox Browser for Trusted sites Comment[it]=Browser Firefox per siti affidabili Comment[uk]=Браузер для довірених веб-сайтів Comment[ru]=Браузер для доверенных сайтов Icon=/opt/firefox/ff_icons/green/default64.png MimeType= StartupNotify=true Terminal=false TerminalOptions= Type=Application X-DBUS-ServiceName= X-DBUS-StartupType=none X-KDE-SubstituteUID=false X-KDE-Username= |
nano /usr/share/applications/chromium.trusted.desktop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [Desktop Entry] Exec=/usr/bin/waypipe --title-prefix '[trusted-chromium] ' ssh trusted-chromium@10.1.1.245 /usr/local/bin/waypipe-run-chromium.sh Name=Chromium - Trusted sites Name[it]=Chromium - Siti affidabili Name[uk]=Chromium - Довірені сайти Name[ru]=Chromium - Доверенные сайты GenericName=Chromium - Trusted sites GenericName[it]=Chromium - Siti affidabili GenericName[uk]=Chromium - Довірені сайти GenericName[ru]=Chromium - Доверенные сайты Comment=Chromium Browser for Trusted sites Comment[it]=Browser Chromium per siti affidabili Comment[uk]=Браузер Chromium для довірених веб-сайтів Comment[ru]=Браузер Chromium для доверенных сайтов Icon=/opt/chromium_green.png MimeType= StartupNotify=true Terminal=false TerminalOptions= Type=Application X-DBUS-ServiceName= X-DBUS-StartupType=none X-KDE-SubstituteUID=false X-KDE-Username= |
Немного рутины
Здесь я намеренно не хочу детально всё описывать, приведу только комманды и подсказки.
Как вы уже поняли, в примере используются две LXC-виртуалки и три пользователя.
Виртуалки между собой не контактируют, как и пользователи.
Я предпочитаю использовать не просто одного пользователя, скажем, на доверенные задачи, но по одному пользователю на отдельное приложение.
Если, конечно, это не приводит к чрезмерному усложнению файлооборота между разными сущностями.
Далее, вы должны провести подготовительную работу.
Развернуть нужное вам количество LXC/KVM, настроить в них:
- Нужный софт
- Прокинуть нужное оборудование, например GPU, для ускорения hw-отрисовки в firefox
Да, дополнительное оборудование и его драйвера это ещё одна поверхность атаки ¯\_(⊙︿⊙)_/¯ - Настроить iptables/nft, sshd_config, поднять маршрутизацию и сеть
Генерируем ключи ed25519 для ssh
1 2 3 | ssh-keygen -t ed25519 -f /home/awesome/.ssh/web-untrusted.ed25519 -C "web-untrusted@untrusted-lxc" ssh-keygen -t ed25519 -f /home/awesome/.ssh/trusted-firefox.ed25519 -C "trusted-firefox@trusted-lxc" ssh-keygen -t ed25519 -f /home/awesome/.ssh/trusted-chromium.ed25519 -C "trusted-chromium@trusted-lxc" |
Настроим ssh для вашего пользователя
nano /home/awesome/.ssh/config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Host 10.1.1.249 User web-untrusted Port 22 PreferredAuthentications publickey IdentityFile /home/awesome/.ssh/web-untrusted.ed25519 Host 10.1.1.245 User trusted-firefox Port 22 PreferredAuthentications publickey IdentityFile /home/awesome/.ssh/trusted-firefox.ed25519 Host 10.1.1.245 User trusted-chromium Port 22 PreferredAuthentications publickey IdentityFile /home/awesome/.ssh/trusted-chromium.ed25519 |
Убедитесь, что в /etc/ssh/sshd_config виртуалок есть такие строки:
1 2 3 | PasswordAuthentication no AllowTcpForwarding yes # (default) AllowUsers web-untrusted@10.1.1.1 # 10.1.1.1 - assumed to be your host |
Сами скрипты /usr/local/bin/ff.sh запуска firefox достаточно примитивны.
1 2 3 | #!/bin/bash /usr/lib/firefox-esr/firefox-esr --ProfileManager > /dev/null exit 0 |
Скрипт /usr/local/bin/waypipe-run-chromium.sh запуска chromium через waypipe немного сложнее.
1 2 3 | #!/bin/bash /usr/bin/chromium --enable-features=UseOzonePlatform --ozone-platform=wayland > /dev/null exit 0 |
Ещё надо бы вспомнить про звук
Он настроен для пользователей в виртуальных машинах в файле
/home/trusted-chromium/.pulse/client.conf
1 | default-server = 10.1.1.1
|
На хосте соответственно
/home/awesome/.config/pipewire/pipewire-pulse.conf.d/50-network.conf
1 2 3 | context.exec = [ { path = "pactl" args = "load-module module-native-protocol-tcp listen='0.0.0.0' auth-ip-acl='127.0.0.1;10.1.1.245;10.1.1.249'" } ] |
Далее firewall, авторизация и всё такое, что мне лень описывать.
Каждому приложению - свою иконку
Помимо самой настройки wayland, достаточно много времени мне пришлось потратить на поиски способов установки определённых иконок на конкретные окна.
Вот одно из решений.
Это пример для /usr/share/applications/firefox.untrusted.desktop
Добавим немного ‘вижуала’ и удобств
Каждое приложение, в зависимости от его класса можно настроить используя или стили оформления рабочей среды, или, как в случае с лисой - темами оформления (конечно же только By Firefox).
Я использую скрытую боковую панель с часто используемыми приложениями для сети.
Все окна получают корректно установленные иконки.
Логически и визуально всё просто:
- Красный - повседневный серфинг сети, 95% сайтов.
- Синий - разработка, только собственные доверенные сайты / API.
- Зелёный - банкинг, персональная информация.
Если какому-либо сайту не подходит лиса, а такое встречается, то есть соответствующий Chromium / Google Chrome.
Настроим совместимость для X11 приложений
Не только веб-серфинг
Выше приводились примеры использования браузеров из разных изолированных виртуальных машин с подключением к wayland посредством waypipe.
Аналогично, можно запускать разнообразные редаткторы / IDE, специализированные приложения, настраивать уникальные среды взаимодействия определённых версий операционных систем и софта.
Иметь это отдельно от хоста и вашего пользователя. А так же отдельно от других проектов.
И получать вполне удобный доступ к использованию.
Направление тренда
И буквально на днях состоялся релиз Fedora Hummingbird.
Основные цели проекта:
- Сведение количества CVE, присутствующих в каждом поставляемом образе контейнера, к нулю и поддержание этого значения непрерывно.
Хоть быстрая доставка обновлений пакетов, например Python, Go, Node.js, Rust, Ruby, OpenJDK, PostgreSQL, nginx, важна, это всё равно не решает проблемы неправильной организации и отделения сред разработки от чувствительных пользовательских данных.
В этом смысле QubesOS остаётся эталоном параноидальной системы. Как по мне.
Оригинальный пост на SecOps.it Blog • Подключение к изолированным системным средам с использованием Waypipe