Підключення до ізольованих системних середовищ із використанням 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 залишається зразком параноїдальної системи. Як на мене.


Оригінальний пост на SecOps.it Blog Підключення до ізольованих системних середовищ із використанням Waypipe