Theory and practice use containers instead of VMs

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Приветствую всех: дамы, господа, друзья и недруги. Сегодня пофантазируем /поговорим о использовании контейнеров вместо VM для работы. А так же раздуем за систему мечты.

Подготовлено: ValeraSnowdrop
Специально для: xss.is

Уведомление
Важно отметить что я не являюсь экспертом в вопросе что я поднимаю и могу ошибаться в своих суждениях. Просьба к читающим: при нахождении какой либо ошибки/несостыковки/глупости оставьте комментарий под этой темой или напишите мне в PM. Давайте учиться вместе. Спасибо.

Терминология
Итак для начала определимся с терминами что будут использованы в статье. Часть терминов может считаться не общепризнанными но все равно будут использованы в рамках этой статьи.

Система для работы (System for work)
Набор программного обеспечения которое позволяет эффективно выполнять возложенные не нее обязательства в рамках набора требований. Для удобства использования этот термин может быть использован для описания хост системы и набора кубов вместе.

Хост система (host system)
Физическое устройство на котором находится программное обеспечение. В качестве примера можно привести laptop/desktop.

Куб (qube)
Один и более виртуальных машин или контейнеров изолированных от хост системы. Каждый куб выполняет свой набор задач и может отличаться от других кубов. Тут важно отметить что это именно набор из контейнеров.

Так например container-A (с ПО: браузер и firewall) и container-B (tor для container-A) могут вместе образовывать куб (назовем его person1).

Контейнер (container)
Контейнер в общем понимании. Можно использовать в том же виде, что используется в контексте docker'а.

Виртуальная машина (VM)
Виртуальная машина в общем понимании. Можно использовать в том же виде, что используется в контексте qemu/virutalbox/vmware.

Образ (image)
Образ операционной системы в общем понимании. Может использоваться и как (образ для VM) и как (образ для контейнера).

Теория
Теперь перейдем к основным требованиям и проблемам что я пытаюсь решить в рамках этой статьи.

Проблемы
  1. Производительность. Как вы уже знаете использование VM это очень дорого в плане ресурсов компьютера. На средненьком ноутбуке за 400-500$ дай бог поднять хотя бы одну VM не говоря уже об использовании нескольких. Даже при условии что у вас действительно мощный компьютер задержку ввода никто не отменял, из-за чего падает удобство работы с такой системой, она становится неотзывчивой.
  2. Переносимость. Так же есть проблемы с переносом данных с такой системы. Так например чтобы получить какие либо данные с VM на хост нужно их скопировать, что само по себе является дублированием данных, так еще и при больших объемах может занимать значительное время.
  3. Переиспользование. Вы можете обменяться VM образом с другим человеком и он получит копию системы со всеми вашими конфигами (если вы не очистили их заранее), включая директорию /home, хотелось бы избежать такого поведения по умолчанию. Так же можем представить случай создания новой VM на основе старой. В таком случае вам прийдется удалять софт который не нужен в новой VM в ручном режиме и чистить от конфигов образ, либо тратить около 20 минут на установку новой голой системы, без учета времени скачивания .iso образа и ее настройки. Учитывая все эти проблемы не удивительно что мы не видим образов которыми люди делятся на форуме не опасаясь утечки данных.
  4. Изоляция. Как вы можете предположить изоляция в случае работы с docker ниже по сравнению с VM. Тем самым вы подвергаете себя большему риску при использовании контейнеров. Попробуем снизить этот вектор атаки в рамках статьи

Требования
  1. Высокая скорость работы. Желательно на около-любом железе. Отсутствие каких либо задержек при работе с кубом.
  2. Возможность создания бекапов и переноса блоков информации. Тут важно подметить что важна возможность переноса именно блоков данных, а не всех данных сразу. Зачастую вам не нужны в бекапе системные папки и прочий шлак установленный вместе с пакетами.
  3. Возможность поделится конфигом вашей системы с другим человеком. Переиспользование вашего куба для создания нового на его основе.
  4. Открытость. Возможность управления такой системой. Возможность отключения некоторых компонентов системы.
  5. Использование средств анонимности vpn/tor/proxy для всей системы, либо как прокси для отдельных приложений. А так же возможность использования их вместе. Тобишь создание цепочек.
  6. Изоляция личностей созданных в рамках системы (под личностями вполне конкретно можно понимать набор виртуальных личностей). Программные средства призванные защитить смешение/пересечение этих личностей.
  7. Достаточный уровень безопасности. Чтобы взломанный контейнер не мог значительно повлиять на хост. Желательно чтобы не мог оказать вообще никакого влияния.

Практика

Архив

Итак если я все сделал правильно, то на руках у вас будет архив с таким содержимым (исключая папки @nonroot и root они появятся после первого запуска):
1716020260868.png


Мне нужно объяснить происходящее здесь.
  • Все *.sh скрипты в директории scripts отвечают за управление этим чудом (кубом)
  • В Dockerfile и docker-compose.yml происходит настройка куба
  • Директории начинающиеся на @, то есть root и @nonroot это volume docker'a в которых содержится 2 домашних папки пользователя root и nonroot соответственно.
  • Директория _deps отвечает за софт который необходим для создания контейнера, его использование описано в Dockerfile
  • Файл info.txt содержит пояснение для X11

Перед запуском

Зависимости

Список необходимых пакетов установленных в системе (linux):
  • docker
  • docker-compose
  • xorg-xhost (только при использовании X11)

X11
Перед началом работ нам нужно изменить несколько файлов, чтобы запустить контейнер, а именно docker-compose.yml и scripts/run.sh, в зависимости от используемой хост системы вам нужна поддержка X11 либо Wayland. По умолчанию влючен именно Wayland, если вы используете X11 то необходимо в файле docker-compose.yml изменить эти строки:
1716020282402.png



Для работы в X11 так же нужно включить поддержку X11Forwarding, как это сделать вы можете почитать в info.txt. Необходимо изменить эти строки в /etc/ssh/sshd_config
Bash: Скопировать в буфер обмена
Код:
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
$ echo change this lines:
$ sudo vim /etc/ssh/sshd_config

X11Forwarding   yes
X11UseLocalhost no
Подробнее можете узнать тут: https://www.baeldung.com/linux/docker-container-gui-applications

Так же вам нужно убрать коммент в файле scripts/run.sh
1716020369420.png



Важно отметить что при работе X11 вы будете видеть input-lag в 50-80мс на глаз. Так же нужно сказать что я давно не проверял и не могу сейчас проверить работу в X11. И гайд может вовсе не работать с X11 даже после того, что я описал выше.

Wayland
Работает по умолчанию, нет необходимости в дополнительных действиях. Важно отметить что я проверил работу только в DE: gnome(wayland session) и hyprland. Работает без ошибок.

Автозапуск
Контейнер при запуске будет запускать файл /deps/autostart.sh который копируется при установке из _deps/autostart.sh, Давайте взглянем на него:
1716020401721.png

По умолчанию в контейнере будет запущен ufw/gufw firewall который не даст ликнутся вашему ip. на 22/23 строчках установлен killswitch, тут вы можете указать ip куда может обращаться ваш контейнер.

В контейнере по умолчанию так же установлен nekoray который я использую для тунелирования трафика всей системы. Его запуск объявлен на 27 строке.

Hardering
Допил/настройка под вас делается через Dockerfile и docker-compose.yml. Как с ними работать я расписывать не буду, для этого есть dockументация docker, куда я вас направляю. С файлами в папке _deps вы так же можете ознакомиться самостоятельно.

Стартуем
Запускаем scripts/run.sh и если вы все выполнили правильно, у вас должна начаться установка образа archlinux и всего что вы понаписали в Dockerfile. После 10 минут томления у вас должно открыться подобное окно:
1716020482806.png



Выбираем Xray и подрубаем сюда ваш vpn, как пользоваться nekoray думаю не нужно описывать. Или стоит?

После этого я обычно запускаю ./scripts/app.sh xfce4-terminal
1716020513957.png



А из него уже стартую любое нужное мне ПО.

Вот например librewolf
1716020527290.png


Остановить эту чудо-машину можно через ./scripts/stop.sh

Я проверил работу этого ПО (все работает):
  • thunar
  • telegram-desktop
  • firefox
  • librewolf
  • xfce4-terminal
  • xfce4-about
  • xeyes
  • nekoray
  • chromium (нужны доп флаги для работы в wayland: chromium --enable-features=UseOzonePlatform --ozone-platform=wayland --force-dark-mode --enable-features=WebUIDarkMode)
Подозреваю что с большинством современного ПО проблем не будет, но могут возникнуть сложности при использовании специфичного.

Заключение
В заключение приведу набор плюсов и минусов такого подхода.
Плюсы:
  • высокая скорость работы
  • переносимость
  • расширяемость
  • отзывчивость
Минусы:
  • требуется больше времени для установки ПО, иногда нужен перезапуск
  • не все ПО может работать из коробки, без донастройки
  • необходимо наличие специфичных технических знаний

Отдельное спасибо ребятам из этого топика: https://xss.is/threads/113716/
 
Сверху Снизу