Приветствую читателей Habr! Меня зовут Александр. Я работаю в команде продукта ОС Astra Linux в группе компаний «Астра». Ключевые направления моей работы: основа рабочего стола Fly — менеджер окон fly-wm, механизмы мандатного управления доступом (МРД) внутри X сервера, демон графического логина fly-dm и ещё ряд программ. Эта статья может быть интересна разработчикам механизмов защиты на уровне графической части ОС, разработчикам решений в области рабочих столов и администраторам, настраивающим рабочие места пользователей в защищённых системах с МРД.

В защищённой операционной системе Astra Linux Special Edition могут одновременно выполняться программы с разными метками конфиденциальности. Привычный для пользователя рабочего стола обмен данными через буфер обмена (clipboard) между такими программами по умолчанию невозможен из-за принятых мер МРД. В частности, при необходимости работать с меткой конфиденциальности, отличающейся от метки текущей сессии, надо открывать отдельную сессию с отдельным Х сервером. Так же можно разрешить использовать специальный механизм (sumac), позволяющий запустить графическую программу с более высокой меткой конфиденциальности из текущей сессии, но при этом программа будет работать со своим отдельным вложенным Х сервером Xephyr.

В обоих случаях общего буфера обмена для копирования и вставки (copy and paste) не будет. Отсюда возникает неудобство для пользователя, состоящее в невозможности копирования и вставки данных между программами с разными метками конфиденциальности, даже если это не нарушает правил МРД. Подробнее про МРД можно прочитать в статье https://habr.com/ru/company/astralinux/blog/670060/

Для устранения указанного неудобства был разработан механизм межсессионного межуровневого обмена данными. Этот механизм «буфер обмена между сессиями» с одной стороны прозрачен для пользователя, то есть выглядит как привычное для всех рабочих столов копирование и вставка через буфер обмена (clipboard). С другой стороны, этот механизм работает на уровне пользователя и следует правилам МРД.

Для организации буфера обмена между сессиями (как обычными, так и во вложенном Х сервере Xephyr) используются 2 механизма:

  • xfixes расширение X сервера для асинхронного мониторинга буфера обмена сессии;

  • inotify механизм ядра для асинхронного мониторинга файловой системы.

Каждый менеджер окон (он же менеджер буферов обмена) в каждой сессии подписывается на получение уведомлений об изменении буфера обмена своей графической сессии. Затем, по мере изменений в буфере обмена, он получает уведомления и сохраняет содержимое буфера обмена в файле $HOME/.fly/clipboard. Таким образом, изменения буфера обмена постоянно отображаются в файле $HOME/.fly/clipboard.

С другой стороны, каждый менеджер окон (он же менеджер буферов обмена) в каждой сессии ищет файлы типа $HOME/.fly/clipboard всех других сессий. Для этого он просматривает каталоги в $HOME/mac/.... Эти каталоги и файлы в них будут доступны для чтения, только если правила МРД позволяют, а именно: разрешается читать информацию с такого же или менее высокого уровня конфиденциальности. Таким образом правила МРД в файловой системе контролируют доступность буферов обмена других сессий пользователя. Найдя подходящие файлы, менеджер устанавливает на них мониторинг изменений. Если подходящих каталогов или файлов в данный момент ещё не существует, менеджер устанавливает мониторинг на их родительские каталоги, чтоб асинхронно получать уведомления об их появлении и тут же ставить на них мониторинг. Как только менеджеру приходит событие, что файл буфера обмена иной сессии изменился, то буфер обмена сессии получает новое содержимое из файла (буфера обмена) другой сессии.
Следовательно, текущий буфер обмена сессии получает новое содержимое либо в результате действий пользователя (обычное copy) либо автоматически из последнего обновившегося файла буфера обмена иной сессии, что тоже делается пользователем (как правило, тем же самым).

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

"...начиная с версии 1.5 (релиз «Смоленск») появилась возможность копирования и вставки (copy and paste) между программами с различными метками конфиденциальности, даже если эти программы выполняются в разных сессиях. При этом, так как весь процесс происходит через файлы, допустимость копирования и вставки автоматически контролируется на уровне файловой системы. Для включения этой возможности надо в домашнем каталоге пользователя в файлах .fly/theme/*.themerc задать UseClipboardManagerMAC=true. Обратите внимание, что для разных меток конфиденциальности имеются разные домашние каталоги и настраивать надо во всех из них. То есть пользователю надо войти в систему всеми нужными уровнями конфиденциальности и выполнить рекомендацию выше.  При использовании механизма sumac надо  задать UseClipboardManagerMAC=true в файле /usr/share/fly-wm/theme/default.themerc.fly-mini".

Однако можно включить механизм сразу для всех вновь создаваемых пользователей. Для этого необходимо сразу после установки операционной системы во всех /usr/share/fly-wm/theme/themerc задать UseClipboardManagerMAC=true. После чего для всех вновь создаваемых пользователей механизм будет работать автоматически без предварительных входов и правок.

В работе механизма нет проблем с большинством текстовых типов. Но с некоторыми mime-типами (Star Embed Source, x-openoffice-link) могут быть проблемы, и по умолчанию они исключены из использования параметром ClipboardManagerTypesBlacklist — расширяемым списком mime-типов. Одним из исключенных типов является x-kde-passwordManagerHint, так как он сопровождает копируемые пароли некоторых менеджеров паролей, а такую информацию хранить в буфере обмена небезопасно.

Данный механизм позволяет без проблем копировать и вставлять текстовую информацию, такую как, например, текст или URL файлов и каталогов. Так, находясь в сессии с нулевым уровнем конфиденциальности, пользователь может скопировать информацию привычным образом: ctrl+c или ctrl+insert или через контекстное меню с пунктом «Копировать». Затем, переключившись в сессию с более высоким уровнем конфиденциальности, сразу же вставить эту информацию: сtrl+v или shift+insert, а также через контекстное меню с пунктом «Вставить». Обратное действие не будет доступно в силу правил МРД. Причём содержимое буфера обмена (это файл) не стирается после выхода из программы, где выполнялось копирование, даже при выходе из сессии.

В результате, с одной стороны, мы получаем типичный clipboard manager — широко известный тип программ, с другой стороны — оригинальный clipboard manager за счёт его расширения по части работы между сессиями, причём сессиями с разными метками конфиденциальности. При этом копирование информации возможно только по правилам МРД: с равного уровня конфиденциальности или ниже. Решение облегчает работу пользователя рабочего стола в системах с МРД.

Буду рад ответить на вопросы по теме этой статьи

Комментарии (4)


  1. AndreyAf
    25.11.2022 16:38

    Файлами тоже неплохо, а почему не воспользовались сессионной шиной dbus для передачи? там как раз есть и сигналы и методы.


    1. a-smirnov
      25.11.2022 16:58

      > сессионной шиной dbus для передачи

      Сессионной? Буфер сделан как межcессионный, более того сессии могут быть на разных уровнях конфиденциальности. Если системную шину использовать, то сложнее все в плане мандатной политики. Да и файлы остаются и после выхода из сессий.


      1. AndreyAf
        25.11.2022 17:08
        +1

        Ну да именно сессионной - всё в контексте пользователя, адрес /run/user/xxx/bus или $HOME/.dbus/session-bus/xxx в зависимости от того какой брокер. То что разные display это не влияет. Файлик то у вас так же в $HOME ;)


        1. a-smirnov
          25.11.2022 17:26
          +2

          ааа, в принципе, наверное можно было было бы искать и мониторить не файлы с буферами, а $HOME/.dbus/session-bus/xxx и пробовать подключаться к dbus демонам других сессий и делать какой-то протокол, но сложнее и труднее это для реализации, не пришло в голову.