Подключение к изолированным системным средам с использованием Waypipe

Правильный настрой
Правильный настрой 1200x1000
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

Установка иконок для Waypipe окон в KDE 1523x810 waypipe-set-icon.png
Установка иконок для Waypipe окон в KDE

Добавим немного ‘вижуала’ и удобств

Каждое приложение, в зависимости от его класса можно настроить используя или стили оформления рабочей среды, или, как в случае с лисой - темами оформления (конечно же только By Firefox).

Я использую скрытую боковую панель с часто используемыми приложениями для сети.

Боковая панель KDE 1920x1080 desktop_side_panel.png
Боковая панель KDE

Все окна получают корректно установленные иконки.

Иконки окон для Waypipe 1920x1080 desktop_apps_waypipe.png
Иконки окон для Waypipe

Логически и визуально всё просто:

  • Красный - повседневный серфинг сети, 95% сайтов.
  • Синий - разработка, только собственные доверенные сайты / API.
  • Зелёный - банкинг, персональная информация.

Если какому-либо сайту не подходит лиса, а такое встречается, то есть соответствующий Chromium / Google Chrome.

Настроим совместимость для X11 приложений

Legacy X11 App Support 1523x810 x11_legacy_apps.png
Legacy X11 App Support

Не только веб-серфинг

Выше приводились примеры использования браузеров из разных изолированных виртуальных машин с подключением к wayland посредством waypipe.
Аналогично, можно запускать разнообразные редаткторы / IDE, специализированные приложения, настраивать уникальные среды взаимодействия определённых версий операционных систем и софта.
Иметь это отдельно от хоста и вашего пользователя. А так же отдельно от других проектов.
И получать вполне удобный доступ к использованию.


Направление тренда

И буквально на днях состоялся релиз Fedora Hummingbird.

Основные цели проекта:

  • Сведение количества CVE, присутствующих в каждом поставляемом образе контейнера, к нулю и поддержание этого значения непрерывно.


Хоть быстрая доставка обновлений пакетов, например Python, Go, Node.js, Rust, Ruby, OpenJDK, PostgreSQL, nginx, важна, это всё равно не решает проблемы неправильной организации и отделения сред разработки от чувствительных пользовательских данных.
В этом смысле QubesOS остаётся эталоном параноидальной системы. Как по мне.