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